/* GDK - The GIMP Drawing Kit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . */ /* * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ #ifndef __GDK_EVENTS_H__ #define __GDK_EVENTS_H__ #if !defined (__GDK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only can be included directly." #endif #include #include #include #include #include #include G_BEGIN_DECLS #define GDK_TYPE_EVENT (gdk_event_get_type ()) #define GDK_TYPE_EVENT_SEQUENCE (gdk_event_sequence_get_type ()) #define GDK_IS_EVENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GDK_TYPE_EVENT)) #define GDK_EVENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_EVENT, GdkEvent)) #define GDK_IS_EVENT_TYPE(event, type) (gdk_event_get_event_type ((event)) == (type)) /** * GDK_PRIORITY_EVENTS: (value 0) * * This is the priority that events from the X server are given in the main loop. */ #define GDK_PRIORITY_EVENTS (G_PRIORITY_DEFAULT) /** * GDK_PRIORITY_REDRAW: (value 120) * * This is the priority that the idle handler processing surface updates * is given in the main loop. */ #define GDK_PRIORITY_REDRAW (G_PRIORITY_HIGH_IDLE + 20) /** * GDK_EVENT_PROPAGATE: * * Use this macro as the return value for continuing the propagation of * an event handler. */ #define GDK_EVENT_PROPAGATE (FALSE) /** * GDK_EVENT_STOP: * * Use this macro as the return value for stopping the propagation of * an event handler. */ #define GDK_EVENT_STOP (TRUE) /** * GDK_BUTTON_PRIMARY: * * The primary button. This is typically the left mouse button, or the * right button in a left-handed setup. */ #define GDK_BUTTON_PRIMARY (1) /** * GDK_BUTTON_MIDDLE: * * The middle button. */ #define GDK_BUTTON_MIDDLE (2) /** * GDK_BUTTON_SECONDARY: * * The secondary button. This is typically the right mouse button, or the * left button in a left-handed setup. */ #define GDK_BUTTON_SECONDARY (3) typedef struct _GdkEventSequence GdkEventSequence; typedef struct _GdkEvent GdkEvent; #define GDK_TYPE_BUTTON_EVENT (gdk_button_event_get_type()) #define GDK_TYPE_CROSSING_EVENT (gdk_crossing_event_get_type()) #define GDK_TYPE_DELETE_EVENT (gdk_delete_event_get_type()) #define GDK_TYPE_DND_EVENT (gdk_dnd_event_get_type()) #define GDK_TYPE_FOCUS_EVENT (gdk_focus_event_get_type()) #define GDK_TYPE_GRAB_BROKEN_EVENT (gdk_grab_broken_event_get_type()) #define GDK_TYPE_KEY_EVENT (gdk_key_event_get_type()) #define GDK_TYPE_MOTION_EVENT (gdk_motion_event_get_type()) #define GDK_TYPE_PAD_EVENT (gdk_pad_event_get_type()) #define GDK_TYPE_PROXIMITY_EVENT (gdk_proximity_event_get_type()) #define GDK_TYPE_SCROLL_EVENT (gdk_scroll_event_get_type()) #define GDK_TYPE_TOUCH_EVENT (gdk_touch_event_get_type()) #define GDK_TYPE_TOUCHPAD_EVENT (gdk_touchpad_event_get_type()) typedef struct _GdkButtonEvent GdkButtonEvent; typedef struct _GdkCrossingEvent GdkCrossingEvent; typedef struct _GdkDeleteEvent GdkDeleteEvent; typedef struct _GdkDNDEvent GdkDNDEvent; typedef struct _GdkFocusEvent GdkFocusEvent; typedef struct _GdkGrabBrokenEvent GdkGrabBrokenEvent; typedef struct _GdkKeyEvent GdkKeyEvent; typedef struct _GdkMotionEvent GdkMotionEvent; typedef struct _GdkPadEvent GdkPadEvent; typedef struct _GdkProximityEvent GdkProximityEvent; typedef struct _GdkScrollEvent GdkScrollEvent; typedef struct _GdkTouchEvent GdkTouchEvent; typedef struct _GdkTouchpadEvent GdkTouchpadEvent; /** * GdkEventType: * @GDK_DELETE: the window manager has requested that the toplevel surface be * hidden or destroyed, usually when the user clicks on a special icon in the * title bar. * @GDK_MOTION_NOTIFY: the pointer (usually a mouse) has moved. * @GDK_BUTTON_PRESS: a mouse button has been pressed. * @GDK_BUTTON_RELEASE: a mouse button has been released. * @GDK_KEY_PRESS: a key has been pressed. * @GDK_KEY_RELEASE: a key has been released. * @GDK_ENTER_NOTIFY: the pointer has entered the surface. * @GDK_LEAVE_NOTIFY: the pointer has left the surface. * @GDK_FOCUS_CHANGE: the keyboard focus has entered or left the surface. * @GDK_PROXIMITY_IN: an input device has moved into contact with a sensing * surface (e.g. a touchscreen or graphics tablet). * @GDK_PROXIMITY_OUT: an input device has moved out of contact with a sensing * surface. * @GDK_DRAG_ENTER: the mouse has entered the surface while a drag is in progress. * @GDK_DRAG_LEAVE: the mouse has left the surface while a drag is in progress. * @GDK_DRAG_MOTION: the mouse has moved in the surface while a drag is in * progress. * @GDK_DROP_START: a drop operation onto the surface has started. * @GDK_SCROLL: the scroll wheel was turned * @GDK_GRAB_BROKEN: a pointer or keyboard grab was broken. * @GDK_TOUCH_BEGIN: A new touch event sequence has just started. * @GDK_TOUCH_UPDATE: A touch event sequence has been updated. * @GDK_TOUCH_END: A touch event sequence has finished. * @GDK_TOUCH_CANCEL: A touch event sequence has been canceled. * @GDK_TOUCHPAD_SWIPE: A touchpad swipe gesture event, the current state * is determined by its phase field. * @GDK_TOUCHPAD_PINCH: A touchpad pinch gesture event, the current state * is determined by its phase field. * @GDK_PAD_BUTTON_PRESS: A tablet pad button press event. * @GDK_PAD_BUTTON_RELEASE: A tablet pad button release event. * @GDK_PAD_RING: A tablet pad axis event from a "ring". * @GDK_PAD_STRIP: A tablet pad axis event from a "strip". * @GDK_PAD_GROUP_MODE: A tablet pad group mode change. * @GDK_TOUCHPAD_HOLD: A touchpad hold gesture event, the current state * is determined by its phase field. Since: 4.6 * @GDK_EVENT_LAST: marks the end of the GdkEventType enumeration. * * Specifies the type of the event. */ typedef enum { GDK_DELETE, GDK_MOTION_NOTIFY, GDK_BUTTON_PRESS, GDK_BUTTON_RELEASE, GDK_KEY_PRESS, GDK_KEY_RELEASE, GDK_ENTER_NOTIFY, GDK_LEAVE_NOTIFY, GDK_FOCUS_CHANGE, GDK_PROXIMITY_IN, GDK_PROXIMITY_OUT, GDK_DRAG_ENTER, GDK_DRAG_LEAVE, GDK_DRAG_MOTION, GDK_DROP_START, GDK_SCROLL, GDK_GRAB_BROKEN, GDK_TOUCH_BEGIN, GDK_TOUCH_UPDATE, GDK_TOUCH_END, GDK_TOUCH_CANCEL, GDK_TOUCHPAD_SWIPE, GDK_TOUCHPAD_PINCH, GDK_PAD_BUTTON_PRESS, GDK_PAD_BUTTON_RELEASE, GDK_PAD_RING, GDK_PAD_STRIP, GDK_PAD_GROUP_MODE, GDK_TOUCHPAD_HOLD, GDK_EVENT_LAST /* helper variable for decls */ } GdkEventType; /** * GdkTouchpadGesturePhase: * @GDK_TOUCHPAD_GESTURE_PHASE_BEGIN: The gesture has begun. * @GDK_TOUCHPAD_GESTURE_PHASE_UPDATE: The gesture has been updated. * @GDK_TOUCHPAD_GESTURE_PHASE_END: The gesture was finished, changes * should be permanently applied. * @GDK_TOUCHPAD_GESTURE_PHASE_CANCEL: The gesture was cancelled, all * changes should be undone. * * Specifies the current state of a touchpad gesture. * * All gestures are guaranteed to begin with an event with phase * %GDK_TOUCHPAD_GESTURE_PHASE_BEGIN, followed by 0 or several events * with phase %GDK_TOUCHPAD_GESTURE_PHASE_UPDATE. * * A finished gesture may have 2 possible outcomes, an event with phase * %GDK_TOUCHPAD_GESTURE_PHASE_END will be emitted when the gesture is * considered successful, this should be used as the hint to perform any * permanent changes. * Cancelled gestures may be so for a variety of reasons, due to hardware * or the compositor, or due to the gesture recognition layers hinting the * gesture did not finish resolutely (eg. a 3rd finger being added during * a pinch gesture). In these cases, the last event will report the phase * %GDK_TOUCHPAD_GESTURE_PHASE_CANCEL, this should be used as a hint * to undo any visible/permanent changes that were done throughout the * progress of the gesture. */ typedef enum { GDK_TOUCHPAD_GESTURE_PHASE_BEGIN, GDK_TOUCHPAD_GESTURE_PHASE_UPDATE, GDK_TOUCHPAD_GESTURE_PHASE_END, GDK_TOUCHPAD_GESTURE_PHASE_CANCEL } GdkTouchpadGesturePhase; /** * GdkScrollDirection: * @GDK_SCROLL_UP: the surface is scrolled up. * @GDK_SCROLL_DOWN: the surface is scrolled down. * @GDK_SCROLL_LEFT: the surface is scrolled to the left. * @GDK_SCROLL_RIGHT: the surface is scrolled to the right. * @GDK_SCROLL_SMOOTH: the scrolling is determined by the delta values * in scroll events. See gdk_scroll_event_get_deltas() * * Specifies the direction for scroll events. */ typedef enum { GDK_SCROLL_UP, GDK_SCROLL_DOWN, GDK_SCROLL_LEFT, GDK_SCROLL_RIGHT, GDK_SCROLL_SMOOTH } GdkScrollDirection; /** * GdkScrollUnit: * @GDK_SCROLL_UNIT_WHEEL: The delta is in number of wheel clicks. * @GDK_SCROLL_UNIT_SURFACE: The delta is in surface pixels to scroll directly * on screen. * * Specifies the unit of scroll deltas. * * When you get %GDK_SCROLL_UNIT_WHEEL, a delta of 1.0 means 1 wheel detent * click in the south direction, 2.0 means 2 wheel detent clicks in the south * direction... This is the same logic for negative values but in the north * direction. * * If you get %GDK_SCROLL_UNIT_SURFACE, are managing a scrollable view and get a * value of 123, you have to scroll 123 surface logical pixels right if it's * @delta_x or down if it's @delta_y. This is the same logic for negative values * but you have to scroll left instead of right if it's @delta_x and up instead * of down if it's @delta_y. * * 1 surface logical pixel is equal to 1 real screen pixel multiplied by the * final scale factor of your graphical interface (the product of the desktop * scale factor and eventually a custom scale factor in your app). * * Since: 4.8 */ typedef enum { GDK_SCROLL_UNIT_WHEEL, GDK_SCROLL_UNIT_SURFACE } GdkScrollUnit; /** * GdkNotifyType: * @GDK_NOTIFY_ANCESTOR: the surface is entered from an ancestor or * left towards an ancestor. * @GDK_NOTIFY_VIRTUAL: the pointer moves between an ancestor and an * inferior of the surface. * @GDK_NOTIFY_INFERIOR: the surface is entered from an inferior or * left towards an inferior. * @GDK_NOTIFY_NONLINEAR: the surface is entered from or left towards * a surface which is neither an ancestor nor an inferior. * @GDK_NOTIFY_NONLINEAR_VIRTUAL: the pointer moves between two surfaces * which are not ancestors of each other and the surface is part of * the ancestor chain between one of these surfaces and their least * common ancestor. * @GDK_NOTIFY_UNKNOWN: an unknown type of enter/leave event occurred. * * Specifies the kind of crossing for enter and leave events. * * See the X11 protocol specification of LeaveNotify for * full details of crossing event generation. */ typedef enum { GDK_NOTIFY_ANCESTOR = 0, GDK_NOTIFY_VIRTUAL = 1, GDK_NOTIFY_INFERIOR = 2, GDK_NOTIFY_NONLINEAR = 3, GDK_NOTIFY_NONLINEAR_VIRTUAL = 4, GDK_NOTIFY_UNKNOWN = 5 } GdkNotifyType; /** * GdkCrossingMode: * @GDK_CROSSING_NORMAL: crossing because of pointer motion. * @GDK_CROSSING_GRAB: crossing because a grab is activated. * @GDK_CROSSING_UNGRAB: crossing because a grab is deactivated. * @GDK_CROSSING_GTK_GRAB: crossing because a GTK grab is activated. * @GDK_CROSSING_GTK_UNGRAB: crossing because a GTK grab is deactivated. * @GDK_CROSSING_STATE_CHANGED: crossing because a GTK widget changed * state (e.g. sensitivity). * @GDK_CROSSING_TOUCH_BEGIN: crossing because a touch sequence has begun, * this event is synthetic as the pointer might have not left the surface. * @GDK_CROSSING_TOUCH_END: crossing because a touch sequence has ended, * this event is synthetic as the pointer might have not left the surface. * @GDK_CROSSING_DEVICE_SWITCH: crossing because of a device switch (i.e. * a mouse taking control of the pointer after a touch device), this event * is synthetic as the pointer didn’t leave the surface. * * Specifies the crossing mode for enter and leave events. */ typedef enum { GDK_CROSSING_NORMAL, GDK_CROSSING_GRAB, GDK_CROSSING_UNGRAB, GDK_CROSSING_GTK_GRAB, GDK_CROSSING_GTK_UNGRAB, GDK_CROSSING_STATE_CHANGED, GDK_CROSSING_TOUCH_BEGIN, GDK_CROSSING_TOUCH_END, GDK_CROSSING_DEVICE_SWITCH } GdkCrossingMode; GDK_AVAILABLE_IN_ALL GType gdk_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GType gdk_event_sequence_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GdkEvent * gdk_event_ref (GdkEvent *event); GDK_AVAILABLE_IN_ALL void gdk_event_unref (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkEventType gdk_event_get_event_type (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkSurface * gdk_event_get_surface (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkSeat * gdk_event_get_seat (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkDevice * gdk_event_get_device (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkDeviceTool * gdk_event_get_device_tool (GdkEvent *event); GDK_AVAILABLE_IN_ALL guint32 gdk_event_get_time (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkDisplay * gdk_event_get_display (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkEventSequence * gdk_event_get_event_sequence (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkModifierType gdk_event_get_modifier_state (GdkEvent *event); GDK_AVAILABLE_IN_ALL gboolean gdk_event_get_position (GdkEvent *event, double *x, double *y); GDK_AVAILABLE_IN_ALL gboolean gdk_event_get_axes (GdkEvent *event, double **axes, guint *n_axes); GDK_AVAILABLE_IN_ALL gboolean gdk_event_get_axis (GdkEvent *event, GdkAxisUse axis_use, double *value); GDK_AVAILABLE_IN_ALL GdkTimeCoord * gdk_event_get_history (GdkEvent *event, guint *out_n_coords); GDK_AVAILABLE_IN_ALL gboolean gdk_event_get_pointer_emulated (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_button_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL guint gdk_button_event_get_button (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_scroll_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GdkScrollDirection gdk_scroll_event_get_direction (GdkEvent *event); GDK_AVAILABLE_IN_ALL void gdk_scroll_event_get_deltas (GdkEvent *event, double *delta_x, double *delta_y); GDK_AVAILABLE_IN_4_8 GdkScrollUnit gdk_scroll_event_get_unit (GdkEvent *event); GDK_AVAILABLE_IN_ALL gboolean gdk_scroll_event_is_stop (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_key_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL guint gdk_key_event_get_keyval (GdkEvent *event); GDK_AVAILABLE_IN_ALL guint gdk_key_event_get_keycode (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkModifierType gdk_key_event_get_consumed_modifiers (GdkEvent *event); GDK_AVAILABLE_IN_ALL guint gdk_key_event_get_layout (GdkEvent *event); GDK_AVAILABLE_IN_ALL guint gdk_key_event_get_level (GdkEvent *event); GDK_AVAILABLE_IN_ALL gboolean gdk_key_event_is_modifier (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_focus_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL gboolean gdk_focus_event_get_in (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_touch_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL gboolean gdk_touch_event_get_emulating_pointer (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_crossing_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GdkCrossingMode gdk_crossing_event_get_mode (GdkEvent *event); GDK_AVAILABLE_IN_ALL GdkNotifyType gdk_crossing_event_get_detail (GdkEvent *event); GDK_AVAILABLE_IN_ALL gboolean gdk_crossing_event_get_focus (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_touchpad_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GdkTouchpadGesturePhase gdk_touchpad_event_get_gesture_phase (GdkEvent *event); GDK_AVAILABLE_IN_ALL guint gdk_touchpad_event_get_n_fingers (GdkEvent *event); GDK_AVAILABLE_IN_ALL void gdk_touchpad_event_get_deltas (GdkEvent *event, double *dx, double *dy); GDK_AVAILABLE_IN_ALL double gdk_touchpad_event_get_pinch_angle_delta (GdkEvent *event); GDK_AVAILABLE_IN_ALL double gdk_touchpad_event_get_pinch_scale (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_pad_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL guint gdk_pad_event_get_button (GdkEvent *event); GDK_AVAILABLE_IN_ALL void gdk_pad_event_get_axis_value (GdkEvent *event, guint *index, double *value); GDK_AVAILABLE_IN_ALL void gdk_pad_event_get_group_mode (GdkEvent *event, guint *group, guint *mode); GDK_AVAILABLE_IN_ALL GType gdk_dnd_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GdkDrop * gdk_dnd_event_get_drop (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_grab_broken_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GdkSurface * gdk_grab_broken_event_get_grab_surface (GdkEvent *event); GDK_AVAILABLE_IN_ALL gboolean gdk_grab_broken_event_get_implicit (GdkEvent *event); GDK_AVAILABLE_IN_ALL GType gdk_motion_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GType gdk_delete_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GType gdk_proximity_event_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL gboolean gdk_event_triggers_context_menu (GdkEvent *event); GDK_AVAILABLE_IN_ALL gboolean gdk_events_get_distance (GdkEvent *event1, GdkEvent *event2, double *distance); GDK_AVAILABLE_IN_ALL gboolean gdk_events_get_angle (GdkEvent *event1, GdkEvent *event2, double *angle); GDK_AVAILABLE_IN_ALL gboolean gdk_events_get_center (GdkEvent *event1, GdkEvent *event2, double *x, double *y); /** * GdkKeyMatch: * @GDK_KEY_MATCH_NONE: The key event does not match * @GDK_KEY_MATCH_PARTIAL: The key event matches if keyboard state * (specifically, the currently active group) is ignored * @GDK_KEY_MATCH_EXACT: The key event matches * * Describes how well an event matches a given keyval and modifiers. * * `GdkKeyMatch` values are returned by [method@Gdk.KeyEvent.matches]. */ typedef enum { GDK_KEY_MATCH_NONE, GDK_KEY_MATCH_PARTIAL, GDK_KEY_MATCH_EXACT } GdkKeyMatch; GDK_AVAILABLE_IN_ALL GdkKeyMatch gdk_key_event_matches (GdkEvent *event, guint keyval, GdkModifierType modifiers); GDK_AVAILABLE_IN_ALL gboolean gdk_key_event_get_match (GdkEvent *event, guint *keyval, GdkModifierType *modifiers); G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkEvent, gdk_event_unref) G_END_DECLS #endif /* __GDK_EVENTS_H__ */