除有前面描述的信号机制外,还有一套 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语言格式的联合结构,它的类型依赖于上述事件中的哪个事件发生了。为了让我们得知发生了哪个事件,每个可能的类型都有一个 type 成员来反映发生的事件。事件结构的其它部分将依赖于这个事件的类型,类型的可能值有以下情况:

      GDK_NOTHING
      GDK_DELETE
      GDK_DESTROY
      GDK_EXPOSE
      GDK_MOTION_NOTIFY
      GDK_BUTTON_PRESS
      GDK_2BUTTON_PRESS
      GDK_3BUTTON_PRESS
      GDK_BUTTON_RELEASE
      GDK_KEY_PRESS
      GDK_KEY_RELEASE
      GDK_ENTER_NOTIFY
      GDK_LEAVE_NOTIFY
      GDK_FOCUS_CHANGE
      GDK_CONFIGURE
      GDK_MAP
      GDK_UNMAP
      GDK_PROPERTY_NOTIFY
      GDK_SELECTION_CLEAR
      GDK_SELECTION_REQUEST
      GDK_SELECTION_NOTIFY
      GDK_PROXIMITY_IN
      GDK_PROXIMITY_OUT
      GDK_DRAG_ENTER
      GDK_DRAG_LEAVE
      GDK_DRAG_MOTION
      GDK_DRAG_STATUS
      GDK_DROP_START
      GDK_DROP_FINISHED
      GDK_CLIENT_EVENT
      GDK_VISIBILITY_NOTIFY
      GDK_NO_EXPOSE
      GDK_SCROLL
      GDK_WINDOW_STATE
      GDK_SETTING

    所以,连接一个回调函数到这些事件之一,我们会这样用:

    g_signal_connect (G_OBJECT (button),
                        "button_press_event",
                        G_CALLBACK (button_press_callback),
                        NULL);

    这里假定 button 是一个按钮构件。现在,当鼠标位于按钮上并按一下鼠标时,函数 button_press_callback() 会被调用。这个函数应该声明为:

    static gint button_press_callback( GtkWidget      *widget,
                                       GdkEventButton *event,
                                       gpointer        data );

    参数:

    • event
      第二个参数类型声明为 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