信號發射是 GTK 為指定的物件和信號執行所有處理函式的過程。
首先,注意從信號發射傳回的值是最後一個處理函式執行後傳回的值。因為所有事件信號都是 GTK_RUN_LAST 型別,GTK 提供的處理函式將成為預設處理函式,除非你用 gtk_signal_connect_after() 設置連接。
一個事件 (如”button_press_event”) 的處理過程是:
- 從事件發生的元件開始。
- 發出通常的 “event” 信號。如果信號處理函式返回 TRUE 值,停止所有的處理。
- 否則,發出一個指定的,”button_press_event” 信號。如果它傳回 TRUE,停止所有的處理。
- 否則,轉到父元件,重複前兩步。
- 繼續直到某些信號處理函式傳回 TRUE,或者直到達到了最頂層的元件。
上述問題的一些重點是:
- 如果信號有一個預設的處理函式,那麼你的處理函式傳回的值不起作用,除非你用 gtk_signal_connect_after() 設置連接。(譯者註:這是因為預設處理函式最後執行,而信號發射的傳回值取最後一個處理函式的傳回值。)
- 為了阻止預設的信號處理函式運行,你需要用 gtk_signal_connect() 設置連接,並使用 gtk_signal_emit_stop_by_name() – 傳回值之影響信號是否傳播,不影響當前信號的發射。(譯者註:也就是說,gtk_signal_emit_stop_by_name() 才影響信號的發射。停止發射,就使連接到這個信號的其它函式不繼續被呼叫。)
1 則留言