From: "D.Kanda" Date: 1998-12-21T12:05:02+09:00 Subject: [ruby-list:11392] Re: gtk かんだです。 Takehama Hirohisa さんの書かれた、 「[ruby-list:11391] gtk」 からの引用です。 > Ruby/Gtk に関して質問があります。 > > Gtk::Text で、押されたキーのイベントを拾いたくて、 > 質問: > ・signal_connect の最後で、真偽値か整数値を返さないといけないようなのですが、 > これは何の値でしょうか? その signal の処理を続けるかやめるかを指定します。trueだとそこで止めます。 ある signal に複数の handler が登録されている場合はその登録順に渡されます が、さらに子signal方向、親widget 方向へと辿るようです。 Gtk+ のチュートリアルの `20.2 Signal Emission and Propagation' を訳して みると、 GTK_BUTTON_PRESS イベントの扱われ方: ・以下はイベントの起きた widget から始まる。 ・汎用 "event" シグナルを発する。ハンドラが TRUE を返したら処理を止める。 ・特定的な "button_press_event" を発する。TRUE で返ったら処理を止める。 ・親widget へ行き、上の処理を繰り返す。ハンドラが TRUE を返すか、トップ レベルの widget へ到達するまで続ける。 と書かれています。 > ・event 引数は Gdk::gdkEvent であることはわかったのですが、押されたキー > の種類などを取り出すにはどうすればよいでしょうか。 event周りはまだほとんどできていません。ここはホントは GdkEventKey インス タンスを返すべきところで、GdkEventKey は keyval とかいうメソッドが定義され るようです。 # これくらいならすぐにできますが、今ちょっと忙しいので今夜にでも > ・キー入力処理を変えたい場合はどうすればよいでしょうか。 > デフォルトでは Emacs 風のキーバインドになっていますが、それ > を変えたいのです。また、文字の挿入も自分でコントロールしたいです。 これはちょっと手がかかりそう。 処理は key_press_event で行われているようですので、サブクラスでフックし て、処理を記述し、ハンドラからは true で返ればよさそうです。 vi風のモード切り換えは↑のようにやることになるでしょうけれど、例えば WZ 風などといった Ctrl+なんとか を取り換えたいならもうちょっと楽ができそう です。 gtktext には control_key['z'-'a'+1] とかいった配列が用意されていて、これ に関数ポインタを埋め込んでいます。で、実際に ctrl-a とかが押されると、 control_key[0] の関数が呼び出される。だから、この配列に別の関数ポインタを代 入すればそれでキーバインドが変更できることになりますね。ただ、gtkの関数とし て用意はされていないようですので、仕様から考えることになります。 > ・この辺りについて、参考になるドキュメントやサンプルプログラムがあった > ら教えて下さい。 とりあえず、http://www.globe.to/~moka/gtk/ 辺りからたどれる情報が参考に なると思います。 # あとはソース:-P > Text に限らないですがついでに: > > ・ウィジェットの外観を RC を使わずに変えることはできないのでしょうか。 > フォントや色について、です。 > Tk だと confiugre 'bg'=>'blue' のようにできますが、Gtk では???? 僕は RC の方を知らなかったりします(^^; ではどうやっているかというと、Style を直接指定しています。 ------------------------------------------------------------------------- style = Gtk::Widget.get_default_style().copy() [Gtk::STETE_NORMAL, Gtk::STATE_ACTIVE, Gtk::STATE_PRELIGHT, Gtk::STATE_SELECTED, Gtk::STATE_INSENSITIVE].each { |i| style.set_fg(i, 0xFFFF, 0xFFFF, 0) } Gtk::Widget.push_style(style) w = Gtk::Window::new() ... Gtk::Widget.pop_style() ------------------------------------------------------------------------- というような感じ。