除有前面描述的信號機制外,還有一套 events 反映 X 事件機制。回呼函式可以與這些事件連接。這些事件是:
- 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_request_event
- selection_notify_event
- proximity_in_event
- proximity_out_event
- visibility_notify_event
- client_event
- no_expose_event
- window_state_event
為了連接一個回呼函式到其中一個事件,你使用函式 g_signal_connect(),像前面介紹的一樣,用上面事件名之一作為 name 參數。事件的回呼函式與信號的回呼函式有一點點不同:
gint callback_func( GtkWidget *widget, GdkEvent *event,gpointer callback_data); |
GdkEvent 是一個 C union結構,它的型別依賴於上述事件中的哪個事件發生了。為了讓我們得知發生了哪個事件,每個可能的型別都有一個 type 成員來反映發生的事件。事件結構的其它部分將依賴於這個事件的型別。型別的可能的值有:
|
g_signal_connect (button, "button_press_event", G_CALLBACK (button_press_callback), NULL);
這裡假定 button 是一個按鈕元件。現在,當滑鼠位於按鈕上並按一下滑鼠時,函數 button_press_callback() 會被呼叫。這個函式應該聲明為:
static gboolean button_press_callback( GtkWidget *widget, GdkEventButton *event, gpointer data );
注意,我們可以把第二個參數型別聲明為 GdkEventButton,因為我們知道哪個型別的事件會發生。
這個函式的傳回值指示這個事件是否應該由 GTK 事件處理機置做進一步的傳播。傳回 TRUE 指示這個事件已經處理了,且不應該做進一步傳播。傳回 FALSE 繼續正常的事件處理。詳見進階事件和信號處理這一章。
GdkEvent 資料型態詳情請參見附錄 GDK 事件型別。
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
1 則留言