GTK プログラミング!!

このエントリーをはてなブックマークに追加
933login:Penguin:2007/06/27(水) 03:15:48 ID:LSQxDGDV
>>931
GtkCellRendererText の "alignment" と "align-set" だと思う。
試してないけど。
934login:Penguin:2007/06/27(水) 08:12:39 ID:YmGO7LQp
ありがとうございます。
御教授いただいたあたりを勉強してみます
935login:Penguin:2007/07/05(木) 10:15:47 ID:kun0TV+S
詳しい方、ご教授お願いします。

自作のソフトキーボードを作ろうかと考えております。
GTKを使って、ダミーのキーイベントを送信
(例えば、画面上の何かのボタンを押したら、KeyPressのシグナルを発行する)
ようなことはできますでしょうか?
936login:Penguin:2007/07/05(木) 11:37:22 ID:38dWjLx5
>>935
GdkEvent あたりだね、確か…
http://www.gtk.org/tutorial/x2312.html#AEN2393
とか参考になるかな。
でもソフトキーボードとして他のアプリにする場合は、
X なら何だったけ、Xkb 関係だったけ、そういうのをいじった方が速いんじゃないかと思う。
937login:Penguin:2007/07/05(木) 12:09:06 ID:kun0TV+S
>>936

ありがとうございます。
参考にしてみようと思います。

>X なら何だったけ、Xkb 関係だったけ、そういうのをいじった方が速いんじゃないかと思う。
説明が前後しましたが、もともと背景として、DirectFB上でうごかしたいなーというのがあり
GKTでのプログラミングに踏み切りました。

最終的にはIMを使って日本語入力まで行きたいのですが、壁は高そうですね・・・。
938login:Penguin:2007/07/06(金) 01:51:00 ID:Vt7J2m8C
939login:Penguin:2007/07/06(金) 13:34:08 ID:Aq2iplBC
>>938
ありがとうございます。

このソースを参考にしたところ、どうもイベントはXlibのXSendEventで送るっぽいですね。

うーんXに依存しちゃうと、DirectFBで動かない気が・・・。
別の方法を考えるかなぁ・・・。
940login:Penguin:2007/07/06(金) 22:41:29 ID:d5hv1Ayr
そういう部分は下のレイヤで書くべきであって、そこまで
ツールキットにクロスプラットフォームを期待するのは変じゃね?
必要な部分だけ分離して書けばいいじゃん。
まあGTK+以外勉強したくないんですよぼくちゃん!ということかも知れんけど。
941login:Penguin:2007/07/07(土) 01:38:57 ID:UpK3eAgU
gdk_event_send_client_message とか g_signal_emit あたりでできないかな?
942login:Penguin:2007/07/07(土) 08:26:19 ID:ODUs5t+B
software keyboardを、hardware keyboard emulator
(XEventや GdkEvent を発生するもの) って考えると、
使いにくいものになりそうな。

それよりも文字を入力したなら、GtkTextViewとかにひっつけて
必要なときに文字列を入れ替える、とかの方が
contextとかを持ってこられるし、結構楽にできそうな気がする。

もちろん応用によるが。
943login:Penguin:2007/07/10(火) 02:01:16 ID:coxuw40G
ちょっと話がずれるけど、昔悩んでようやく分かったこと。
TextView で Enter を押したら、改行を入れずにこちらの都合の処理をする(例えばメッセンジャーなどでメッセージ送信)。
もちろん
g_signal_connect(G_OBJECT(text_view), "key_press_event",....
するんだけど、IM のことを考えると IM の変換決定を優先させないといけない。
これをするにはコールバック関数で
if (gtk_im_context_filter_keypress(text_view->im_context, event)) {
text_view->need_im_reset = TRUE;
return TRUE;
}
をしないといけない。でないと変換決定される前に自分の処理をしてしまう。
(変換途中の文字が TextView に入力されてない)
ちなみにg_signal_connect_afterだと改行が先に処理されてしまう。
と言う訳で参考までに…。
944943:2007/07/10(火) 02:09:39 ID:coxuw40G
あ、ちなみに IM の種類(あとウィンドウマネージャの種類?)によってはなくても大丈夫なものもあったよ。
FreeBSD + anthy-scim はなくても OK だった。
FreeBSD + canna-kinput2 は必要だった。
Windows XP + IME は必要だった。
945login:Penguin:2007/07/11(水) 01:02:44 ID:ZGF39K7c
みなさんプロファイラってどれを使用していますか?

自分はSystemTap+valgrind+oprofile+PAPI-Cです。
946935:2007/07/11(水) 09:10:38 ID:zmQzup1l
みなさま、さまざまなアドバイスありがとうございます。

どうやら、GObjectもしくはGDKあたりでもイベントの作成はできそうですね。
その辺を中心に調べてみます。
(マニュアルが少ないんですよね・・・。本屋にGTK/GDKの本を買いにいったら絶版って言われました・・・)

942さんがおっしゃっている応用も検討して、CONTEXT回りもちょっと調べてみようと思います。

なかなか前途多難ですね・・・。

ありがとうございました。
947942:2007/07/11(水) 09:49:44 ID:4FYTLsLl
Contextっていっているのは technical termじゃなくて、一般的な文脈 (その GtkTextViewが何を欲しがってるか( JIS-X0208 or 英字 or 数字) とか) って意味だよ。
何を software keyboardの trigger にするつもりかわからないけど、keypress_eventでその triggerは hookできるよねえ、多分。
948login:Penguin:2007/07/17(火) 00:39:35 ID:ggD7PVJi
Gtk-2.12からgladeが取り込まれてGtkBuilderになる
んだってさ。で、問題はいまのgladeファイルと
互換性がなくなるそうだ。まあ、変換スクリプトが
あるらしいけどねえ。。。。
949login:Penguin:2007/07/17(火) 21:49:24 ID:48/g7xwB
libgladeは取り込まれるの?
950login:Penguin:2007/07/19(木) 17:49:54 ID:PTohJ0Ez
じゃなくてまた新しいライブラリになるらすい。
XMLそのまま持つのは気持ち悪いなあ。ふだんはインタプリタで読めるけど
リリース時にはコンパイルできるようにならんかな。もしかして今でもできる?
951login:Penguin:2007/07/20(金) 00:51:08 ID:QknMinfB
ああ、ソースにXML書いて読み込めばいいのか。
952login:Penguin:2007/07/20(金) 13:59:42 ID:aHUZDQEh
薮から棒に質問ですがEcllipseでGTKを使いたいと思ってます。
下のソースで#include <gtk/gtk.h> が上手く行かないので
test.h と言うヘッダを作って下に示すような変更で使おうとしています。
gtk.hの中身
#include <gdk/gdk.h>
#include <gtk/gtkaboutdialog.h>
等をtest.hで
#include <gtk-2.0/gdk/gdk.h>
#include <gtk-2.0/gtk/gtkaboutdialog.h>
に変更

それでも上手く行かないので何か妙案か、あるいはそのままのソースで
コンパイルできる方法を探しています。なおソースは7年前の
ターボlinuxではコンパイルでき、小さな窓が出ました。
「GTKではじめるXプログラミング」竹田 英二著 1999年

長すぎるためソースは分けて投稿します。
953login:Penguin:2007/07/20(金) 14:01:17 ID:aHUZDQEh
<続き>ここより下はソース
#include "test.h"
void hello(GtkWidget *, gpointer);

void hello(GtkWidget *widget, gpointer data)
{
printf("Hello World!\n");
gtk_main_quit();
return;
}

int main (int argc, char *argv[])
GtkWidget *window;
GtkWidget *button;

gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
gtk_widget_show(window);

button = gtk_button_new_with_label("Hello World!");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(hello), NULL);
gtk_container_add(GTK_CONTAINER(window), button);
gtk_widget_show(button);
gtk_main();
return 0;
}
954login:Penguin:2007/07/20(金) 14:31:13 ID:idJMOqjO
べつにソースが悪いわけじゃないでしょ。
コマンドラインでコンパイルはできるの?
自分の予想はEclipseのCコンパイルとリンカのオプションを設定していないだけだと思われ。

ところで、余談なんだけど、最近"gtk_signal_connect"ってあんまり使わないの?
"g_signal_connect"に置き換わったっていううわさをちらほら・・・。
955login:Penguin:2007/07/20(金) 14:51:20 ID:9y1RmEbL
Eclipseは分からんが、CCに渡すINCLUDE_PATHを適切に設定すべし。
956login:Penguin:2007/07/20(金) 15:13:06 ID:PciI18EZ
「うまくいかない」って書いて、エスパーしてもらおうとするやつに答える気にはならん。
いや、だいたいエスパーできるんだけど。

>>956
http://developer.gnome.org/doc/API/2.0/gtk/gtk-Signals.html#id2752575
gtk_signal_connect is deprecated and should not be used in newly-written code. Use g_signal_connect() instead.

その点から言うと、その本は捨てて Gtk2.x の tutorial を読むべきだな。

957login:Penguin:2007/07/20(金) 20:18:00 ID:QknMinfB
>>952
Eclipse+CDTだけど
#include <gtk/gtk.h>
でコンパイルできたし、うまく動いた。

gtkmmのページだけど、CDTの設定はこれで参考にならんか。
http://www.cin.ufpe.br/~cinlug/wiki/index.php/Programando_com_GTKmm_no_Eclipse
958login:Penguin:2007/07/21(土) 02:13:46 ID:7DbMvWwA
gtk_signal_connect はまだ一応使えるよ。
っていうか、俺のコード gtk_signal_connect と g_signal_connect が混在しているし。
>>952
何がうまく行かないのかちゃんと説明しないと。
959login:Penguin:2007/07/21(土) 09:59:35 ID:rQXGvrby
シグナル取り扱いがglibでサポートする枠組みに入ったから、
gtk_signal_connectはそれへのラッパーになった。
960login:Penguin:2007/07/21(土) 12:33:03 ID:E0FaCFcF
すいませんLinuxにおけるVisualC++って
どんなのがあるのでしょうか?
KylixがあるみたいですがC/C++ですと何なんでしょうか
それとDirectXみたいな環境はありますでしょうか?
要するにWindowsに負けるとも劣らないゲーム開発環境って
Linuxにあるのでしょうか?
961login:Penguin:2007/07/21(土) 12:36:45 ID:E0FaCFcF
と思ってたら違うスレを発見してしまいましたので退散します
http://pc11.2ch.net/test/read.cgi/linux/1039282447/l50
962login:Penguin:2007/07/25(水) 01:35:09 ID:IdZVHHSy
GTKで印刷、印刷関連の設定などをおこなう関数や
簡単なサンプルはありますでしょうか。

963login:Penguin:2007/07/25(水) 02:25:15 ID:er03377w
964login:Penguin:2007/07/26(木) 22:50:38 ID:gY6/ctOk
gtk_window_set_geometry_hints()って関数の説明ってどこかに書いてありませんか?
検索したけど見付からず・・・。
965login:Penguin:2007/07/26(木) 23:29:29 ID:f7wwr2jD
966login:Penguin:2007/07/27(金) 00:38:13 ID:iZH3Jn55
967952:2007/07/28(土) 10:45:13 ID:l28gEhCG
お礼が遅くなりましたがレスありがとうございます。

ソースを提示しているのであとはコンパイルできる方が
いるかどうかを知りたかったものですから。
できる方がいれば自分の環境設定が悪いと言う結論になるので
環境設定をどうするかその方向で考えようとしてました。

>>954
>コマンドラインでコンパイルはできるの?
v1.2の頃にあった「gtk-config」が見付からないないので
コマンドラインでコンパイルは現状では難しい状態です。

>>955
>Eclipseは分からんが、CCに渡すINCLUDE_PATHを適切に設定すべし。
それ以外にも問題が有るようでして。

>>956
>その点から言うと、その本は捨てて Gtk2.x の tutorial を読むべきだな。
えぇ確かに。

>>957
ドイツ語も苦手ですが図が参考になり、かなり進展がありました。
まずはgtkmmがインストールしてから再度試行錯誤します。

>>958
>何がうまく行かないのかちゃんと説明しないと。
どのあたりで不都合が生じているのか手探りの状態でしたので、
明確に説明できなくて申し訳ありませんでした。
968login:Penguin:2007/07/28(土) 12:04:43 ID:9yljOsMv
「どのあたりで不具合」を書けなんていってない。
「どういう不具合」かを書くんだ。詳細に。

969login:Penguin:2007/07/28(土) 13:57:09 ID:l28gEhCG
>>968
ファイルが無いとコンパイラ(プリプロッセサ)に言われたヘッダを
インクルードした後にビルドするとコンソールに下のような出力があります。
最初のエラー3個までを示します。××××の部分は伏字としてさせて下さい。

make -k all
Building file: ../××××070727_01.cpp
Invoking: GCC C++ Compiler
g++ -I/usr/include/glib-2.0 -I/usr/include/gtk-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0
-I/usr/include/firefox-1.5.0.12/system_wrappers -I/usr/lib64/gtk-2.0/include
-O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"××××070727_01.d" -MT"××××070727_01.d" -o"××××070727_01.o" "../××××070727_01.cpp"
/usr/include/glib-2.0/glib/gtypes.h:41: error: expected constructor, destructor, or type conversion before ‘typedef’
/usr/include/glib-2.0/glib/gtypes.h:90: error: expected initializer before ‘*’ token
/usr/include/glib-2.0/glib/gtypes.h:396: error: ‘G_END_DECLS’ does not name a type

ちなみに /usr/include/glib-2.0/glib/gtypes.hのLINE41は↓です。
typedef char gchar;

‘typedef’の前にconstructor, destructor, or type conversion
があって当然と言っているようですが、なぜ?と言う思いがあります。
970login:Penguin:2007/07/28(土) 14:04:57 ID:l28gEhCG
連投失礼します。環境を明示してませんでしたので。

「64bit版Fedora core6」でEclipse+CDTです。
971login:Penguin:2007/07/28(土) 14:53:53 ID:6PVkzuMP
>>952
手作業でGTK+のヘッダを入れたりする代わりにpkg-configつかえ。
gtk1.2でいうgtk-configのかわりだ。
あと、GTK本家サイトのAPIドキュメントかdevhelpを常に確認できるようにしとけ。
972login:Penguin:2007/07/28(土) 16:25:03 ID:5YbSo8uc
急がば回れ。
eclipse も cdt も捨てて、チュートリアルの HelloWorld ウィンドウの表示からやれ
973login:Penguin:2007/07/28(土) 17:06:51 ID:l28gEhCG
>>971
えぇ、そうします。

>>972
単にコンソールへの出力であれば既にできていますが
チュートリアルも最初から見てみます。
974名無しさん@そうだ選挙に行こう:2007/07/29(日) 02:02:07 ID:EgyXknh4
親window生成 → vbox(コンテナー)生成 → ボタン生成(vboxに乗っける) → pixmap生成、シグナルハンドラ生成(ボタンに対して)

を作った場合、windowは残してコンテナーのvboxをdestroyすると、↑のpixmapやhandlerは自動的にdestroyされるんでしょうか?
objectが残ってメモリーリークの原因になったりしないでしょうか?
975名無しさん@そうだ選挙に行こう:2007/07/29(日) 06:15:03 ID:e4ZCzUx8
destroyが呼ばれたかどうか確認すりゃいいじゃん。
きっと、974のレスより少ないタイプ数で確認できる。
976login:Penguin:2007/07/31(火) 00:34:59 ID:Vn+dLbOm
>>974
普通は親(vbox)が死ねば、子供もみな殺させる(destroy)はず。
g_object_ref()してれば、生き残るけど。
977login:Penguin:2007/07/31(火) 00:35:42 ID:Vn+dLbOm
>殺させる
殺される、ね。
978login:Penguin:2007/07/31(火) 08:01:49 ID:Vn+dLbOm
ちょっと気がついたけど、pixmap って GdkPixmap のこと?
GdkPixmap を作って GtkImage にしてボタンに乗せるんだったら、
GdkPixmap は destroy されないなあ。
GtkImage は destroy されるけど。
979login:Penguin:2007/08/02(木) 20:09:36 ID:rzbwdMnR
三つのボタンがあって、どのボタンを押したかによってラベルの内容を変えたいとき、
みなさんはどのようなデータをコールバック関数に渡していますか?
少なくとも
・どのボタンが押されたか
・変えたいラベルのポインタ
の二つはコールバック先に渡す必要があると思うのですけれど、その方法が
お聞きしたいです。
私は構造体をつくってその中にラベルへのポインタとボタンのIDを入れているのですが、
もう少しスマートな方法がないかと思ったので。
980login:Penguin:2007/08/02(木) 21:23:52 ID:rwWI2Ob8
どっちか片方でいいんじゃないの?
981login:Penguin:2007/08/03(金) 02:50:59 ID:OKxRun+P
変えたいラベルってのは gchar* じゃなくて GtkLabelのことか。
つまり、文字列を変えたいだけじゃなくて、変える対象も
ボタンによってちがうってことか。

あまり綺麗じゃないが g_object_set_data() で GtkButtonに
そういう情報を結びつけとく手もあるな。
これだと userdataはいらん。

982login:Penguin
>>981
なるほど、そういう方法があったのですね。試してみたいと思います。
あと変えたいラベルはGtkLabelなのですが、変える対象は全て同じラベルです。ひとつのラベル対して
複数のボタンからアクセスが来たとき、ということが言いたかったのですが、この場合は何かうまいやり方
でもあったのでしょうか。グローバル変数でLabelのアドレスを渡しておくのが楽だとは思うのですが、それ以外で。