事件
除了上面的信号机制外,X Window Server 的事件也在 GTK 中有所体现。
这里有一个详细的可捕获事件列表:
- event
- button_press_event
- button_release_event
- scroll_event
- motion_notify_event
- delete_event
- destroy_event
- expose_event
- key_press_event
- key_release_event
- enter_notify_event
- leave_notify_event
- configure_event
- focus_in_event
- focus_out_event
- map_event
- unmap_event
- property_notify_event
- selection_clear_event
- selection_notify_event
- proximity_in_event
- proximity_out_event
- visibility_notify_event
- client_event
- no_expost_event
- window_state_event
你可以用之前使用的处理 GTK 信号的方式来处特定的 X11 事件。只需要把信号名字改成上面提到的事件名字。
GLib::Instantiatable#signal_connect("event name") do
# Code to execute upon reception of "event name".
end
这个回调可以接受两个参数:
GLib::Instantiatable#signal_connect("event name") do |w, e|
# ...
end
这里, w 代表这个空间,e 代表这个事件。
GTK 会根据这段代码的返回值来决定这个事件要不要继续传递:
- 如果是 true, GTK 会在这里停止
- 如果是 false, GTK 会继续传播这个事件
同样, GDK 选择和拖放也会触发一些事件,但表现为 GTK 信号:
- selection_received
- selection_get
- drag_begin_event
- drag_end_event
- drag_data_delete
- drag_motion
- drag_drop
- drag_data_get
- drag_data_received