言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Gtk イベントから画像出力までの流れ

ついでに Gtk でイベント処理がどう行われているのかもちらっと見てみた。例によって gtk_text_view_scroll_to_mark でブレークして観察すると、gtk_main_do_event が一つずつイベントを処理するようになっている。イベントは親から子へ伝わる。例えばキーボードの場合フォーカスが分かっているので、 gtk_window_propagate_key_event によって GtkWindow -> GtkTextView と来る。そうして gtk_binding_entry_activate でキーバインディングに応じたシグナルが発生する。

マウスイベントの場合はマウス位置によって対象のウィジェットが変わるはずだが、どうやって対象を選ぶのかは Gdk (デバイス依存の描画を司るモジュール)になっていて分からないかった (gdk_window_get_user_data)。

出力に関しては、widget_class->expose_event が呼び出されるという約束になっていて、テキストの場合具体的には gtk_text_view_expose_event が呼ばれる事になる。結論としては、不思議なシグナル関連のコードを除けば入力から出力までごく普通のフレームワークだと言う事が分かった。逆に言うとシグナルの不思議さ加減が際立っていた。ここをちゃんと調べないと分かった事にならないのかな。

今の理解では、シグナルというのは、普通の関数と違って一つの名前でゼロから複数の関数を実行する仕組みの事だ。g_signal_emitv で呼び出される。ソースコードの中ではユーザに見えない部分までありとあらゆる部分にシグナルが使われているけど、どういう利点があるのだろう。