gtk + programming:回调函数的参数

时间:2014-05-13 15:10:03

标签: c gtk gnome gtk3

以下代码段来自GNOME给出的GTK+ 3教程here

static void
print_hello (GtkWidget *widget,
             gpointer   data)
{
  g_print ("Hello World\n");
}

static gboolean
on_delete_event (GtkWidget *widget,
                 GdkEvent  *event,
                 gpointer   data)
{
  g_print ("delete event occurred\n");
  return TRUE;
}

程序非常简单,只有一个顶层窗口和一个按钮。这就是回调的连接方式:

 g_signal_connect (window, "delete-event", G_CALLBACK (on_delete_event), NULL);
 g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
 g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
 g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);

我的问题是关于我们传递给回调函数的参数。为什么在on_delete_event处理程序中我们传递第二个参数GdkEvent * data?

或者,为什么我们没有将这样的参数传递给第一个回调函数。在这种情况下,GdkEvent参数的用途是什么?

如果问题显示缺乏研究,我很抱歉,但对我而言,教程和the resource on event structures在描述回调时都不够清楚。

1 个答案:

答案 0 :(得分:2)

信号具有不同的签名,就像函数具有不同的签名一样。

在上面的示例中:event类上的GtkWidget信号系列通常与GdkEvent实例相关联,该实例详细说明了从窗口系统收到的事件。

仍然在上面的示例中:clicked信号由GtkButton发出,以响应一系列事件:按下按钮,然后在小部件本身的响应区域内释放按钮(也就是说,如果按下GtkButton小部件上的指针按钮,则将指针移到按钮小部件外部并释放指针按钮,GtkButton小部件将不会发出clicked小部件信号)。因此,没有与之关联的GdkEvent实例。

在尝试理解它们时,通常有助于将GObject信号视为可由特定类型实例调用的命名函数列表。