>>931 GtkCellRendererText の "alignment" と "align-set" だと思う。
試してないけど。
934 :
login:Penguin:2007/06/27(水) 08:12:39 ID:YmGO7LQp
ありがとうございます。
御教授いただいたあたりを勉強してみます
詳しい方、ご教授お願いします。
自作のソフトキーボードを作ろうかと考えております。
GTKを使って、ダミーのキーイベントを送信
(例えば、画面上の何かのボタンを押したら、KeyPressのシグナルを発行する)
ようなことはできますでしょうか?
>>936 ありがとうございます。
参考にしてみようと思います。
>X なら何だったけ、Xkb 関係だったけ、そういうのをいじった方が速いんじゃないかと思う。
説明が前後しましたが、もともと背景として、DirectFB上でうごかしたいなーというのがあり
GKTでのプログラミングに踏み切りました。
最終的にはIMを使って日本語入力まで行きたいのですが、壁は高そうですね・・・。
>>938 ありがとうございます。
このソースを参考にしたところ、どうもイベントはXlibのXSendEventで送るっぽいですね。
うーんXに依存しちゃうと、DirectFBで動かない気が・・・。
別の方法を考えるかなぁ・・・。
そういう部分は下のレイヤで書くべきであって、そこまで
ツールキットにクロスプラットフォームを期待するのは変じゃね?
必要な部分だけ分離して書けばいいじゃん。
まあGTK+以外勉強したくないんですよぼくちゃん!ということかも知れんけど。
gdk_event_send_client_message とか g_signal_emit あたりでできないかな?
software keyboardを、hardware keyboard emulator
(XEventや GdkEvent を発生するもの) って考えると、
使いにくいものになりそうな。
それよりも文字を入力したなら、GtkTextViewとかにひっつけて
必要なときに文字列を入れ替える、とかの方が
contextとかを持ってこられるし、結構楽にできそうな気がする。
もちろん応用によるが。
ちょっと話がずれるけど、昔悩んでようやく分かったこと。
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だと改行が先に処理されてしまう。
と言う訳で参考までに…。
944 :
943:2007/07/10(火) 02:09:39 ID:coxuw40G
あ、ちなみに IM の種類(あとウィンドウマネージャの種類?)によってはなくても大丈夫なものもあったよ。
FreeBSD + anthy-scim はなくても OK だった。
FreeBSD + canna-kinput2 は必要だった。
Windows XP + IME は必要だった。
みなさんプロファイラってどれを使用していますか?
自分はSystemTap+valgrind+oprofile+PAPI-Cです。
946 :
935:2007/07/11(水) 09:10:38 ID:zmQzup1l
みなさま、さまざまなアドバイスありがとうございます。
どうやら、GObjectもしくはGDKあたりでもイベントの作成はできそうですね。
その辺を中心に調べてみます。
(マニュアルが少ないんですよね・・・。本屋にGTK/GDKの本を買いにいったら絶版って言われました・・・)
942さんがおっしゃっている応用も検討して、CONTEXT回りもちょっと調べてみようと思います。
なかなか前途多難ですね・・・。
ありがとうございました。
947 :
942:2007/07/11(水) 09:49:44 ID:4FYTLsLl
Contextっていっているのは technical termじゃなくて、一般的な文脈 (その GtkTextViewが何を欲しがってるか( JIS-X0208 or 英字 or 数字) とか) って意味だよ。
何を software keyboardの trigger にするつもりかわからないけど、keypress_eventでその triggerは hookできるよねえ、多分。
Gtk-2.12からgladeが取り込まれてGtkBuilderになる
んだってさ。で、問題はいまのgladeファイルと
互換性がなくなるそうだ。まあ、変換スクリプトが
あるらしいけどねえ。。。。
libgladeは取り込まれるの?
じゃなくてまた新しいライブラリになるらすい。
XMLそのまま持つのは気持ち悪いなあ。ふだんはインタプリタで読めるけど
リリース時にはコンパイルできるようにならんかな。もしかして今でもできる?
ああ、ソースにXML書いて読み込めばいいのか。
薮から棒に質問ですが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年
長すぎるためソースは分けて投稿します。
<続き>ここより下はソース
#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;
}
べつにソースが悪いわけじゃないでしょ。
コマンドラインでコンパイルはできるの?
自分の予想はEclipseのCコンパイルとリンカのオプションを設定していないだけだと思われ。
ところで、余談なんだけど、最近"gtk_signal_connect"ってあんまり使わないの?
"g_signal_connect"に置き換わったっていううわさをちらほら・・・。
Eclipseは分からんが、CCに渡すINCLUDE_PATHを適切に設定すべし。
gtk_signal_connect はまだ一応使えるよ。
っていうか、俺のコード gtk_signal_connect と g_signal_connect が混在しているし。
>>952 何がうまく行かないのかちゃんと説明しないと。
シグナル取り扱いがglibでサポートする枠組みに入ったから、
gtk_signal_connectはそれへのラッパーになった。
960 :
login:Penguin:2007/07/21(土) 12:33:03 ID:E0FaCFcF
すいませんLinuxにおけるVisualC++って
どんなのがあるのでしょうか?
KylixがあるみたいですがC/C++ですと何なんでしょうか
それとDirectXみたいな環境はありますでしょうか?
要するにWindowsに負けるとも劣らないゲーム開発環境って
Linuxにあるのでしょうか?
961 :
login:Penguin:2007/07/21(土) 12:36:45 ID:E0FaCFcF
GTKで印刷、印刷関連の設定などをおこなう関数や
簡単なサンプルはありますでしょうか。
gtk_window_set_geometry_hints()って関数の説明ってどこかに書いてありませんか?
検索したけど見付からず・・・。
967 :
952: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 >何がうまく行かないのかちゃんと説明しないと。
どのあたりで不都合が生じているのか手探りの状態でしたので、
明確に説明できなくて申し訳ありませんでした。
「どのあたりで不具合」を書けなんていってない。
「どういう不具合」かを書くんだ。詳細に。
>>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
があって当然と言っているようですが、なぜ?と言う思いがあります。
連投失礼します。環境を明示してませんでしたので。
「64bit版Fedora core6」でEclipse+CDTです。
>>952 手作業でGTK+のヘッダを入れたりする代わりにpkg-configつかえ。
gtk1.2でいうgtk-configのかわりだ。
あと、GTK本家サイトのAPIドキュメントかdevhelpを常に確認できるようにしとけ。
急がば回れ。
eclipse も cdt も捨てて、チュートリアルの HelloWorld ウィンドウの表示からやれ
>>971 えぇ、そうします。
>>972 単にコンソールへの出力であれば既にできていますが
チュートリアルも最初から見てみます。
974 :
名無しさん@そうだ選挙に行こう:2007/07/29(日) 02:02:07 ID:EgyXknh4
親window生成 → vbox(コンテナー)生成 → ボタン生成(vboxに乗っける) → pixmap生成、シグナルハンドラ生成(ボタンに対して)
を作った場合、windowは残してコンテナーのvboxをdestroyすると、↑のpixmapやhandlerは自動的にdestroyされるんでしょうか?
objectが残ってメモリーリークの原因になったりしないでしょうか?
destroyが呼ばれたかどうか確認すりゃいいじゃん。
きっと、974のレスより少ないタイプ数で確認できる。
>>974 普通は親(vbox)が死ねば、子供もみな殺させる(destroy)はず。
g_object_ref()してれば、生き残るけど。
>殺させる
殺される、ね。
ちょっと気がついたけど、pixmap って GdkPixmap のこと?
GdkPixmap を作って GtkImage にしてボタンに乗せるんだったら、
GdkPixmap は destroy されないなあ。
GtkImage は destroy されるけど。
三つのボタンがあって、どのボタンを押したかによってラベルの内容を変えたいとき、
みなさんはどのようなデータをコールバック関数に渡していますか?
少なくとも
・どのボタンが押されたか
・変えたいラベルのポインタ
の二つはコールバック先に渡す必要があると思うのですけれど、その方法が
お聞きしたいです。
私は構造体をつくってその中にラベルへのポインタとボタンのIDを入れているのですが、
もう少しスマートな方法がないかと思ったので。
どっちか片方でいいんじゃないの?
変えたいラベルってのは gchar* じゃなくて GtkLabelのことか。
つまり、文字列を変えたいだけじゃなくて、変える対象も
ボタンによってちがうってことか。
あまり綺麗じゃないが g_object_set_data() で GtkButtonに
そういう情報を結びつけとく手もあるな。
これだと userdataはいらん。
>>981 なるほど、そういう方法があったのですね。試してみたいと思います。
あと変えたいラベルはGtkLabelなのですが、変える対象は全て同じラベルです。ひとつのラベル対して
複数のボタンからアクセスが来たとき、ということが言いたかったのですが、この場合は何かうまいやり方
でもあったのでしょうか。グローバル変数でLabelのアドレスを渡しておくのが楽だとは思うのですが、それ以外で。