信号发射是 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() 才影响信号的发射。停止发射,就使连接到这个信号的其它函数不继续被调用。)