|
From: Masao M. <mu...@hi...> - 2002-07-03 16:33:20
|
むとうです。
はじめまして。
On Wed, 3 Jul 2002 12:32:37 +0900
Seiya Nishizawa <se...@ku...> wrote:
> 西澤ともうします。
>
> たいへん初歩的な質問で申し訳ないのですが
> Gtk::DrawingArea
> で key_press_eventがとれません。
>
> なにか勘違いをしているのでしょうか。
> すいませんがアドバイスをいただけたらうれしいのですが。
これ、難しいですね。
私もよくわからなかったので調べてみました。
で、結論からするとキーボードのイベントはフォーカスがあたる(CAN_FOCUS)
ウィジェットしか取得できないみたいです。
デフォルトではGtk::Windowなどのトップレベルウィジェットがキーボード
のイベントを受け取れるようですが、トップレベルでないウィジェット
でキーボードのイベントを受け取りたい場合は、フォーカスを受け取れる
ことを明示的に指定し、さらにgrabしないとダメみたいです。
そこで、以下のようにコードを修正しました。
Gtk::Widget#set_flagsとGtk::Widget#grab_focusがキモです。
特にGtk::Widget#grab_focusは親ウィジェットにaddされた後に呼ぶ必要が
あります。
------
require "gtk"
draw_area = Gtk::DrawingArea.new
draw_area.set_flags(Gtk::Widget::CAN_FOCUS)
draw_area.set_events(Gdk::BUTTON_PRESS_MASK|Gdk::KEY_PRESS_MASK)
draw_area.signal_connect("button_press_event"){|w,p|
p w,p
}
draw_area.signal_connect("key_press_event"){|w,p|
p w,p
p Gdk::Keyval.to_name(p.keyval)
}
main_window = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
main_window.add(draw_area)
draw_area.grab_focus
main_window.show_all
main_window.signal_connect("delete_event"){Gtk.main_quit}
main_window.signal_connect("destroy"){Gtk.main_quit}
Gtk.main
--
.:% Masao Mutoh<mu...@hi...>
|