下列的数据类型被 GTK+ 传递给事件处理函数。列出每种数据类型同时也列出了使用该类型的信号。

    GdkEvent
    
    drag_end_event
    
    GdkEventType
    
    GdkEventAny
    
    delete_event
    
    destroy_event
    
    map_event
    
    unmap_event
    
    no_expose_event
    
    GdkEventExpose
    
    expose_event
    
    GdkEventNoExpose
    
    GdkEventVisibility
    
    GdkEventMotion
    
    motion_notify_event
    
    GdkEventButton
    
    button_press_event
    
    button_release_event
    
    GdkEventKey
    
    key_press_event
    
    key_release_event
    
    GdkEventCrossing
    
    enter_notify_event
    
    leave_notify_event
    
    GdkEventFocus
    
    focus_in_event
    
    focus_out_event
    
    GdkEventConfigure
    
    configure_event
    
    GdkEventProperty
    
    property_notify_event
    
    GdkEventSelection
    
    selection_clear_event
    
    selection_request_event
    
    selection_notify_event
    
    GdkEventProximity
    
    proximity_in_event
    
    proximity_out_event
    
    GdkEventDragBegin
    
    drag_begin_event
    
    GdkEventDragRequest
    
    drag_request_event
    
    GdkEventDropEnter
    
    drop_enter_event
    
    GdkEventDropLeave
    
    drop_leave_event
    
    GdkEventDropDataAvailable
    
    drop_data_available_event
    
    GdkEventClient
    
    client_event
    
    GdkEventOther
    
    other_event

    数据类型GdkEventType是一个特殊的数据类型,它被其余的数据类型使用,作为一个传递给信号处理函数的数据类型指示器。在下面你会看到,每个事件数据结构有一个该类型的成员。它是如下的枚举值:

    typedef enum
    {
      GDK_NOTHING           = -1,
      GDK_DELETE            = 0,
      GDK_DESTROY           = 1,
      GDK_EXPOSE            = 2,
      GDK_MOTION_NOTIFY     = 3,
      GDK_BUTTON_PRESS      = 4,
      GDK_2BUTTON_PRESS     = 5,
      GDK_3BUTTON_PRESS     = 6,
      GDK_BUTTON_RELEASE    = 7,
      GDK_KEY_PRESS         = 8,
      GDK_KEY_RELEASE       = 9,
      GDK_ENTER_NOTIFY      = 10,
      GDK_LEAVE_NOTIFY      = 11,
      GDK_FOCUS_CHANGE      = 12,
      GDK_CONFIGURE         = 13,
      GDK_MAP               = 14,
      GDK_UNMAP             = 15,
      GDK_PROPERTY_NOTIFY   = 16,
      GDK_SELECTION_CLEAR   = 17,
      GDK_SELECTION_REQUEST = 18,
      GDK_SELECTION_NOTIFY  = 19,
      GDK_PROXIMITY_IN      = 20,
      GDK_PROXIMITY_OUT     = 21,
      GDK_DRAG_BEGIN        = 22,
      GDK_DRAG_REQUEST      = 23,
      GDK_DROP_ENTER        = 24,
      GDK_DROP_LEAVE        = 25,
      GDK_DROP_DATA_AVAIL   = 26,
      GDK_CLIENT_EVENT      = 27,
      GDK_VISIBILITY_NOTIFY = 28,
      GDK_NO_EXPOSE         = 29,
      GDK_OTHER_EVENT       = 9999  /* 不赞成使用,用过虑器代替 */
    } GdkEventType;

    剩下的,与其余事件类型不同的是GdkEvent。它是所有其余数据类型的统一,允许在一个信号处理函数中转换为指定的事件数据类型。

    因此,事件类型有如下定义:

    struct _GdkEventAny
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
    };
    
    struct _GdkEventExpose
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      GdkRectangle area;
      gint count; /* 如果非零,它是跟随事件的数目。*/
    };
    
    struct _GdkEventNoExpose
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      /* XXX: 有人需要X major_code或minor_code域吗?*/
    };
    
    struct _GdkEventVisibility
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      GdkVisibilityState state;
    };
    
    struct _GdkEventMotion
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      guint32 time;
      gdouble x;
      gdouble y;
      gdouble pressure;
      gdouble xtilt;
      gdouble ytilt;
      guint state;
      gint16 is_hint;
      GdkInputSource source;
      guint32 deviceid;
      gdouble x_root, y_root;
    };
    
    struct _GdkEventButton
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      guint32 time;
      gdouble x;
      gdouble y;
      gdouble pressure;
      gdouble xtilt;
      gdouble ytilt;
      guint state;
      guint button;
      GdkInputSource source;
      guint32 deviceid;
      gdouble x_root, y_root;
    };
    
    struct _GdkEventKey
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      guint32 time;
      guint state;
      guint keyval;
      gint length;
      gchar *string;
    };
    
    struct _GdkEventCrossing
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      GdkWindow *subwindow;
      GdkNotifyType detail;
    };
    
    struct _GdkEventFocus
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      gint16 in;
    };
    
    struct _GdkEventConfigure
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      gint16 x, y;
      gint16 width;
      gint16 height;
    };
    
    struct _GdkEventProperty
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      GdkAtom atom;
      guint32 time;
      guint state;
    };
    
    struct _GdkEventSelection
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      GdkAtom selection;
      GdkAtom target;
      GdkAtom property;
      guint32 requestor;
      guint32 time;
    };
    
    /* 这个事件数据类型很少用。它在支持XInput的程序中,用于绘制自己的光标 */
    
    struct _GdkEventProximity
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      guint32 time;
      GdkInputSource source;
      guint32 deviceid;
    };
    
    struct _GdkEventDragRequest
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      guint32 requestor;
      union {
        struct {
          guint protocol_version:4;
          guint sendreply:1;
          guint willaccept:1;
          guint delete_data:1; 
          guint senddata:1;
          guint reserved:22;
        } flags;
        glong allflags;
      } u;
      guint8 isdrop; /* 几个 X 事件能产生这个gdk事件---这让应用程序知道拖放是否真的发生
                        或我们仅仅设置数据 */
    
      GdkPoint drop_coords;
      gchar *data_type;
      guint32 timestamp;
    };
    
    struct _GdkEventDragBegin
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      union {
        struct {
          guint protocol_version:4;
          guint reserved:28;
        } flags;
        glong allflags;
      } u;
    };
    
    struct _GdkEventDropEnter
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      guint32 requestor;
      union {
        struct {
          guint protocol_version:4;
          guint sendreply:1;
          guint extended_typelist:1;
          guint reserved:26;
        } flags;
        glong allflags;
      } u;
    };
    
    struct _GdkEventDropLeave
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      guint32 requestor;
      union {
        struct {
          guint protocol_version:4;
          guint reserved:28;
        } flags;
        glong allflags;
      } u;
    };
    
    struct _GdkEventDropDataAvailable
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      guint32 requestor;
      union {
        struct {
          guint protocol_version:4;
          guint isdrop:1;
          guint reserved:25;
        } flags;
        glong allflags;
      } u;
      gchar *data_type; /* MIME类型 */
      gulong data_numbytes;
      gpointer data;
      guint32 timestamp;
      GdkPoint coords;
    };
    
    struct _GdkEventClient
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      GdkAtom message_type;
      gushort data_format;
      union {
        char b[20];
        short s[10];
        long l[5];
      } data;
    };
    
    struct _GdkEventOther
    {
      GdkEventType type;
      GdkWindow *window;
      gint8 send_event;
      GdkXEvent *xevent;
    };