理解信号和回调机制

在研究 Hello World 的细节之前,我们先来学习一下 GTK 是如何处理信号和回调的。

就像你的操作系统给进程发信号一样('1), 当一个特定的事件发生时,GTK 给主循环发送一个信号。主循环就调用控件的对应处理函数。

当信号被接收以后,主循环再次进入睡眠。

为了告诉 GTK 控件去捕获特定的事件,然后执行相应的代码,我们需要设置一个信号处理器。

这就是 GLib::Instantiatable#signal_connect 方法所完成的事情,这是 Ruby/GLib 库的一部分(不要忘了 GTK 是基于 GLib 构建的)。

GLib::Instantiatable#signal_connect("signal name") do
    # Code to execute when "signal name" is caught.
end

GLib::Instantiatable#signal_connect 需要两个东西:

  • 需要捕获的信号名字
  • 一段信号产生时候需要执行的代码

这段代码可以像下面一样带一个参数:

GLib::Instantiatable#signal_connect("signal name") do |w|
    # ...
end

这个触发信号的控件会被填入参数 w 。

'1 注意 GTK 信号和任何 UNIX 信号无关, GTK 工具是独立于它地下的操作系统的