1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 /*
19  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
20  * file for a list of people on the GTK+ Team.  See the ChangeLog
21  * files for a list of changes.  These files are distributed with
22  * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
23  */
24 
25 #ifndef __GDK_EVENTS_H__
26 #define __GDK_EVENTS_H__
27 
28 #if !defined (__GDK_H_INSIDE__) && !defined (GTK_COMPILATION)
29 #error "Only <gdk/gdk.h> can be included directly."
30 #endif
31 
32 #include <gdk/gdkversionmacros.h>
33 #include <gdk/gdktypes.h>
34 #include <gdk/gdkdrag.h>
35 #include <gdk/gdkdevice.h>
36 #include <gdk/gdkdevicetool.h>
37 
38 G_BEGIN_DECLS
39 
40 
41 #define GDK_TYPE_EVENT          (gdk_event_get_type ())
42 #define GDK_TYPE_EVENT_SEQUENCE (gdk_event_sequence_get_type ())
43 
44 #define GDK_IS_EVENT(obj)       (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GDK_TYPE_EVENT))
45 #define GDK_EVENT(obj)          (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_EVENT, GdkEvent))
46 
47 #define GDK_IS_EVENT_TYPE(event, type)  (gdk_event_get_event_type ((event)) == (type))
48 
49 /**
50  * GDK_PRIORITY_EVENTS: (value 0)
51  *
52  * This is the priority that events from the X server are given in the main loop.
53  */
54 #define GDK_PRIORITY_EVENTS	(G_PRIORITY_DEFAULT)
55 
56 /**
57  * GDK_PRIORITY_REDRAW: (value 120)
58  *
59  * This is the priority that the idle handler processing surface updates
60  * is given in the main loop.
61  */
62 #define GDK_PRIORITY_REDRAW     (G_PRIORITY_HIGH_IDLE + 20)
63 
64 /**
65  * GDK_EVENT_PROPAGATE:
66  *
67  * Use this macro as the return value for continuing the propagation of
68  * an event handler.
69  */
70 #define GDK_EVENT_PROPAGATE     (FALSE)
71 
72 /**
73  * GDK_EVENT_STOP:
74  *
75  * Use this macro as the return value for stopping the propagation of
76  * an event handler.
77  */
78 #define GDK_EVENT_STOP          (TRUE)
79 
80 /**
81  * GDK_BUTTON_PRIMARY:
82  *
83  * The primary button. This is typically the left mouse button, or the
84  * right button in a left-handed setup.
85  */
86 #define GDK_BUTTON_PRIMARY      (1)
87 
88 /**
89  * GDK_BUTTON_MIDDLE:
90  *
91  * The middle button.
92  */
93 #define GDK_BUTTON_MIDDLE       (2)
94 
95 /**
96  * GDK_BUTTON_SECONDARY:
97  *
98  * The secondary button. This is typically the right mouse button, or the
99  * left button in a left-handed setup.
100  */
101 #define GDK_BUTTON_SECONDARY    (3)
102 
103 typedef struct _GdkEventSequence        GdkEventSequence;
104 typedef struct _GdkEvent                GdkEvent;
105 
106 #define GDK_TYPE_BUTTON_EVENT (gdk_button_event_get_type())
107 #define GDK_TYPE_CROSSING_EVENT (gdk_crossing_event_get_type())
108 #define GDK_TYPE_DELETE_EVENT (gdk_delete_event_get_type())
109 #define GDK_TYPE_DND_EVENT (gdk_dnd_event_get_type())
110 #define GDK_TYPE_FOCUS_EVENT (gdk_focus_event_get_type())
111 #define GDK_TYPE_GRAB_BROKEN_EVENT (gdk_grab_broken_event_get_type())
112 #define GDK_TYPE_KEY_EVENT (gdk_key_event_get_type())
113 #define GDK_TYPE_MOTION_EVENT (gdk_motion_event_get_type())
114 #define GDK_TYPE_PAD_EVENT (gdk_pad_event_get_type())
115 #define GDK_TYPE_PROXIMITY_EVENT (gdk_proximity_event_get_type())
116 #define GDK_TYPE_SCROLL_EVENT (gdk_scroll_event_get_type())
117 #define GDK_TYPE_TOUCH_EVENT (gdk_touch_event_get_type())
118 #define GDK_TYPE_TOUCHPAD_EVENT (gdk_touchpad_event_get_type())
119 
120 typedef struct _GdkButtonEvent          GdkButtonEvent;
121 typedef struct _GdkCrossingEvent        GdkCrossingEvent;
122 typedef struct _GdkDeleteEvent          GdkDeleteEvent;
123 typedef struct _GdkDNDEvent             GdkDNDEvent;
124 typedef struct _GdkFocusEvent           GdkFocusEvent;
125 typedef struct _GdkGrabBrokenEvent      GdkGrabBrokenEvent;
126 typedef struct _GdkKeyEvent             GdkKeyEvent;
127 typedef struct _GdkMotionEvent          GdkMotionEvent;
128 typedef struct _GdkPadEvent             GdkPadEvent;
129 typedef struct _GdkProximityEvent       GdkProximityEvent;
130 typedef struct _GdkScrollEvent          GdkScrollEvent;
131 typedef struct _GdkTouchEvent           GdkTouchEvent;
132 typedef struct _GdkTouchpadEvent        GdkTouchpadEvent;
133 
134 /**
135  * GdkEventType:
136  * @GDK_DELETE: the window manager has requested that the toplevel surface be
137  *   hidden or destroyed, usually when the user clicks on a special icon in the
138  *   title bar.
139  * @GDK_MOTION_NOTIFY: the pointer (usually a mouse) has moved.
140  * @GDK_BUTTON_PRESS: a mouse button has been pressed.
141  * @GDK_BUTTON_RELEASE: a mouse button has been released.
142  * @GDK_KEY_PRESS: a key has been pressed.
143  * @GDK_KEY_RELEASE: a key has been released.
144  * @GDK_ENTER_NOTIFY: the pointer has entered the surface.
145  * @GDK_LEAVE_NOTIFY: the pointer has left the surface.
146  * @GDK_FOCUS_CHANGE: the keyboard focus has entered or left the surface.
147  * @GDK_PROXIMITY_IN: an input device has moved into contact with a sensing
148  *   surface (e.g. a touchscreen or graphics tablet).
149  * @GDK_PROXIMITY_OUT: an input device has moved out of contact with a sensing
150  *   surface.
151  * @GDK_DRAG_ENTER: the mouse has entered the surface while a drag is in progress.
152  * @GDK_DRAG_LEAVE: the mouse has left the surface while a drag is in progress.
153  * @GDK_DRAG_MOTION: the mouse has moved in the surface while a drag is in
154  *   progress.
155  * @GDK_DROP_START: a drop operation onto the surface has started.
156  * @GDK_SCROLL: the scroll wheel was turned
157  * @GDK_GRAB_BROKEN: a pointer or keyboard grab was broken.
158  * @GDK_TOUCH_BEGIN: A new touch event sequence has just started.
159  * @GDK_TOUCH_UPDATE: A touch event sequence has been updated.
160  * @GDK_TOUCH_END: A touch event sequence has finished.
161  * @GDK_TOUCH_CANCEL: A touch event sequence has been canceled.
162  * @GDK_TOUCHPAD_SWIPE: A touchpad swipe gesture event, the current state
163  *   is determined by its phase field.
164  * @GDK_TOUCHPAD_PINCH: A touchpad pinch gesture event, the current state
165  *   is determined by its phase field.
166  * @GDK_PAD_BUTTON_PRESS: A tablet pad button press event.
167  * @GDK_PAD_BUTTON_RELEASE: A tablet pad button release event.
168  * @GDK_PAD_RING: A tablet pad axis event from a "ring".
169  * @GDK_PAD_STRIP: A tablet pad axis event from a "strip".
170  * @GDK_PAD_GROUP_MODE: A tablet pad group mode change.
171  * @GDK_EVENT_LAST: marks the end of the GdkEventType enumeration.
172  *
173  * Specifies the type of the event.
174  */
175 typedef enum
176 {
177   GDK_DELETE,
178   GDK_MOTION_NOTIFY,
179   GDK_BUTTON_PRESS,
180   GDK_BUTTON_RELEASE,
181   GDK_KEY_PRESS,
182   GDK_KEY_RELEASE,
183   GDK_ENTER_NOTIFY,
184   GDK_LEAVE_NOTIFY,
185   GDK_FOCUS_CHANGE,
186   GDK_PROXIMITY_IN,
187   GDK_PROXIMITY_OUT,
188   GDK_DRAG_ENTER,
189   GDK_DRAG_LEAVE,
190   GDK_DRAG_MOTION,
191   GDK_DROP_START,
192   GDK_SCROLL,
193   GDK_GRAB_BROKEN,
194   GDK_TOUCH_BEGIN,
195   GDK_TOUCH_UPDATE,
196   GDK_TOUCH_END,
197   GDK_TOUCH_CANCEL,
198   GDK_TOUCHPAD_SWIPE,
199   GDK_TOUCHPAD_PINCH,
200   GDK_PAD_BUTTON_PRESS,
201   GDK_PAD_BUTTON_RELEASE,
202   GDK_PAD_RING,
203   GDK_PAD_STRIP,
204   GDK_PAD_GROUP_MODE,
205   GDK_EVENT_LAST        /* helper variable for decls */
206 } GdkEventType;
207 
208 /**
209  * GdkTouchpadGesturePhase:
210  * @GDK_TOUCHPAD_GESTURE_PHASE_BEGIN: The gesture has begun.
211  * @GDK_TOUCHPAD_GESTURE_PHASE_UPDATE: The gesture has been updated.
212  * @GDK_TOUCHPAD_GESTURE_PHASE_END: The gesture was finished, changes
213  *   should be permanently applied.
214  * @GDK_TOUCHPAD_GESTURE_PHASE_CANCEL: The gesture was cancelled, all
215  *   changes should be undone.
216  *
217  * Specifies the current state of a touchpad gesture.
218  *
219  * All gestures are guaranteed to begin with an event with phase
220  * %GDK_TOUCHPAD_GESTURE_PHASE_BEGIN, followed by 0 or several events
221  * with phase %GDK_TOUCHPAD_GESTURE_PHASE_UPDATE.
222  *
223  * A finished gesture may have 2 possible outcomes, an event with phase
224  * %GDK_TOUCHPAD_GESTURE_PHASE_END will be emitted when the gesture is
225  * considered successful, this should be used as the hint to perform any
226  * permanent changes.
227 
228  * Cancelled gestures may be so for a variety of reasons, due to hardware
229  * or the compositor, or due to the gesture recognition layers hinting the
230  * gesture did not finish resolutely (eg. a 3rd finger being added during
231  * a pinch gesture). In these cases, the last event will report the phase
232  * %GDK_TOUCHPAD_GESTURE_PHASE_CANCEL, this should be used as a hint
233  * to undo any visible/permanent changes that were done throughout the
234  * progress of the gesture.
235  */
236 typedef enum
237 {
238   GDK_TOUCHPAD_GESTURE_PHASE_BEGIN,
239   GDK_TOUCHPAD_GESTURE_PHASE_UPDATE,
240   GDK_TOUCHPAD_GESTURE_PHASE_END,
241   GDK_TOUCHPAD_GESTURE_PHASE_CANCEL
242 } GdkTouchpadGesturePhase;
243 
244 /**
245  * GdkScrollDirection:
246  * @GDK_SCROLL_UP: the surface is scrolled up.
247  * @GDK_SCROLL_DOWN: the surface is scrolled down.
248  * @GDK_SCROLL_LEFT: the surface is scrolled to the left.
249  * @GDK_SCROLL_RIGHT: the surface is scrolled to the right.
250  * @GDK_SCROLL_SMOOTH: the scrolling is determined by the delta values
251  *   in scroll events. See gdk_scroll_event_get_deltas()
252  *
253  * Specifies the direction for scroll events.
254  */
255 typedef enum
256 {
257   GDK_SCROLL_UP,
258   GDK_SCROLL_DOWN,
259   GDK_SCROLL_LEFT,
260   GDK_SCROLL_RIGHT,
261   GDK_SCROLL_SMOOTH
262 } GdkScrollDirection;
263 
264 /**
265  * GdkNotifyType:
266  * @GDK_NOTIFY_ANCESTOR: the surface is entered from an ancestor or
267  *   left towards an ancestor.
268  * @GDK_NOTIFY_VIRTUAL: the pointer moves between an ancestor and an
269  *   inferior of the surface.
270  * @GDK_NOTIFY_INFERIOR: the surface is entered from an inferior or
271  *   left towards an inferior.
272  * @GDK_NOTIFY_NONLINEAR: the surface is entered from or left towards
273  *   a surface which is neither an ancestor nor an inferior.
274  * @GDK_NOTIFY_NONLINEAR_VIRTUAL: the pointer moves between two surfaces
275  *   which are not ancestors of each other and the surface is part of
276  *   the ancestor chain between one of these surfaces and their least
277  *   common ancestor.
278  * @GDK_NOTIFY_UNKNOWN: an unknown type of enter/leave event occurred.
279  *
280  * Specifies the kind of crossing for enter and leave events.
281  *
282  * See the X11 protocol specification of LeaveNotify for
283  * full details of crossing event generation.
284  */
285 typedef enum
286 {
287   GDK_NOTIFY_ANCESTOR		= 0,
288   GDK_NOTIFY_VIRTUAL		= 1,
289   GDK_NOTIFY_INFERIOR		= 2,
290   GDK_NOTIFY_NONLINEAR		= 3,
291   GDK_NOTIFY_NONLINEAR_VIRTUAL	= 4,
292   GDK_NOTIFY_UNKNOWN		= 5
293 } GdkNotifyType;
294 
295 /**
296  * GdkCrossingMode:
297  * @GDK_CROSSING_NORMAL: crossing because of pointer motion.
298  * @GDK_CROSSING_GRAB: crossing because a grab is activated.
299  * @GDK_CROSSING_UNGRAB: crossing because a grab is deactivated.
300  * @GDK_CROSSING_GTK_GRAB: crossing because a GTK grab is activated.
301  * @GDK_CROSSING_GTK_UNGRAB: crossing because a GTK grab is deactivated.
302  * @GDK_CROSSING_STATE_CHANGED: crossing because a GTK widget changed
303  *   state (e.g. sensitivity).
304  * @GDK_CROSSING_TOUCH_BEGIN: crossing because a touch sequence has begun,
305  *   this event is synthetic as the pointer might have not left the surface.
306  * @GDK_CROSSING_TOUCH_END: crossing because a touch sequence has ended,
307  *   this event is synthetic as the pointer might have not left the surface.
308  * @GDK_CROSSING_DEVICE_SWITCH: crossing because of a device switch (i.e.
309  *   a mouse taking control of the pointer after a touch device), this event
310  *   is synthetic as the pointer didn’t leave the surface.
311  *
312  * Specifies the crossing mode for enter and leave events.
313  */
314 typedef enum
315 {
316   GDK_CROSSING_NORMAL,
317   GDK_CROSSING_GRAB,
318   GDK_CROSSING_UNGRAB,
319   GDK_CROSSING_GTK_GRAB,
320   GDK_CROSSING_GTK_UNGRAB,
321   GDK_CROSSING_STATE_CHANGED,
322   GDK_CROSSING_TOUCH_BEGIN,
323   GDK_CROSSING_TOUCH_END,
324   GDK_CROSSING_DEVICE_SWITCH
325 } GdkCrossingMode;
326 
327 GDK_AVAILABLE_IN_ALL
328 GType                   gdk_event_get_type              (void) G_GNUC_CONST;
329 GDK_AVAILABLE_IN_ALL
330 GType                   gdk_event_sequence_get_type     (void) G_GNUC_CONST;
331 
332 GDK_AVAILABLE_IN_ALL
333 GdkEvent *              gdk_event_ref                   (GdkEvent *event);
334 GDK_AVAILABLE_IN_ALL
335 void                    gdk_event_unref                 (GdkEvent *event);
336 
337 GDK_AVAILABLE_IN_ALL
338 GdkEventType            gdk_event_get_event_type        (GdkEvent *event);
339 
340 GDK_AVAILABLE_IN_ALL
341 GdkSurface *            gdk_event_get_surface           (GdkEvent *event);
342 
343 GDK_AVAILABLE_IN_ALL
344 GdkSeat *               gdk_event_get_seat              (GdkEvent *event);
345 
346 GDK_AVAILABLE_IN_ALL
347 GdkDevice *             gdk_event_get_device            (GdkEvent *event);
348 
349 GDK_AVAILABLE_IN_ALL
350 GdkDeviceTool *         gdk_event_get_device_tool       (GdkEvent *event);
351 
352 GDK_AVAILABLE_IN_ALL
353 guint32                 gdk_event_get_time              (GdkEvent *event);
354 
355 GDK_AVAILABLE_IN_ALL
356 GdkDisplay *            gdk_event_get_display           (GdkEvent *event);
357 
358 GDK_AVAILABLE_IN_ALL
359 GdkEventSequence *      gdk_event_get_event_sequence    (GdkEvent *event);
360 
361 GDK_AVAILABLE_IN_ALL
362 GdkModifierType         gdk_event_get_modifier_state    (GdkEvent *event);
363 
364 GDK_AVAILABLE_IN_ALL
365 gboolean                gdk_event_get_position          (GdkEvent  *event,
366 					                 double	   *x,
367 					                 double	   *y);
368 GDK_AVAILABLE_IN_ALL
369 gboolean                gdk_event_get_axes              (GdkEvent  *event,
370                                                          double   **axes,
371                                                          guint     *n_axes);
372 GDK_AVAILABLE_IN_ALL
373 gboolean                gdk_event_get_axis              (GdkEvent   *event,
374                                                          GdkAxisUse  axis_use,
375                                                          double     *value);
376 GDK_AVAILABLE_IN_ALL
377 GdkTimeCoord *          gdk_event_get_history           (GdkEvent *event,
378                                                          guint    *out_n_coords);
379 GDK_AVAILABLE_IN_ALL
380 gboolean                gdk_event_get_pointer_emulated (GdkEvent *event);
381 
382 GDK_AVAILABLE_IN_ALL
383 GType                   gdk_button_event_get_type       (void) G_GNUC_CONST;
384 GDK_AVAILABLE_IN_ALL
385 guint                   gdk_button_event_get_button     (GdkEvent *event);
386 GDK_AVAILABLE_IN_ALL
387 GType                   gdk_scroll_event_get_type       (void) G_GNUC_CONST;
388 GDK_AVAILABLE_IN_ALL
389 GdkScrollDirection      gdk_scroll_event_get_direction  (GdkEvent *event);
390 GDK_AVAILABLE_IN_ALL
391 void                    gdk_scroll_event_get_deltas     (GdkEvent *event,
392                                                          double   *delta_x,
393                                                          double   *delta_y);
394 
395 GDK_AVAILABLE_IN_ALL
396 gboolean                gdk_scroll_event_is_stop        (GdkEvent *event);
397 GDK_AVAILABLE_IN_ALL
398 GType                   gdk_key_event_get_type          (void) G_GNUC_CONST;
399 GDK_AVAILABLE_IN_ALL
400 guint                   gdk_key_event_get_keyval        (GdkEvent *event);
401 GDK_AVAILABLE_IN_ALL
402 guint                   gdk_key_event_get_keycode       (GdkEvent *event);
403 GDK_AVAILABLE_IN_ALL
404 GdkModifierType         gdk_key_event_get_consumed_modifiers (GdkEvent *event);
405 GDK_AVAILABLE_IN_ALL
406 guint                   gdk_key_event_get_layout        (GdkEvent *event);
407 GDK_AVAILABLE_IN_ALL
408 guint                   gdk_key_event_get_level         (GdkEvent *event);
409 GDK_AVAILABLE_IN_ALL
410 gboolean                gdk_key_event_is_modifier       (GdkEvent *event);
411 GDK_AVAILABLE_IN_ALL
412 GType                   gdk_focus_event_get_type        (void) G_GNUC_CONST;
413 GDK_AVAILABLE_IN_ALL
414 gboolean                gdk_focus_event_get_in          (GdkEvent *event);
415 GDK_AVAILABLE_IN_ALL
416 GType                   gdk_touch_event_get_type        (void) G_GNUC_CONST;
417 GDK_AVAILABLE_IN_ALL
418 gboolean                gdk_touch_event_get_emulating_pointer (GdkEvent *event);
419 GDK_AVAILABLE_IN_ALL
420 GType                   gdk_crossing_event_get_type     (void) G_GNUC_CONST;
421 GDK_AVAILABLE_IN_ALL
422 GdkCrossingMode         gdk_crossing_event_get_mode     (GdkEvent *event);
423 GDK_AVAILABLE_IN_ALL
424 GdkNotifyType           gdk_crossing_event_get_detail   (GdkEvent *event);
425 GDK_AVAILABLE_IN_ALL
426 gboolean                gdk_crossing_event_get_focus    (GdkEvent *event);
427 GDK_AVAILABLE_IN_ALL
428 GType                   gdk_touchpad_event_get_type     (void) G_GNUC_CONST;
429 GDK_AVAILABLE_IN_ALL
430 GdkTouchpadGesturePhase
431                         gdk_touchpad_event_get_gesture_phase (GdkEvent *event);
432 GDK_AVAILABLE_IN_ALL
433 guint                   gdk_touchpad_event_get_n_fingers     (GdkEvent *event);
434 GDK_AVAILABLE_IN_ALL
435 void                    gdk_touchpad_event_get_deltas        (GdkEvent *event,
436                                                               double   *dx,
437                                                               double   *dy);
438 GDK_AVAILABLE_IN_ALL
439 double                  gdk_touchpad_event_get_pinch_angle_delta (GdkEvent *event);
440 GDK_AVAILABLE_IN_ALL
441 double                  gdk_touchpad_event_get_pinch_scale       (GdkEvent *event);
442 GDK_AVAILABLE_IN_ALL
443 GType                   gdk_pad_event_get_type          (void) G_GNUC_CONST;
444 GDK_AVAILABLE_IN_ALL
445 guint                   gdk_pad_event_get_button        (GdkEvent *event);
446 GDK_AVAILABLE_IN_ALL
447 void                    gdk_pad_event_get_axis_value    (GdkEvent *event,
448                                                          guint    *index,
449                                                          double   *value);
450 GDK_AVAILABLE_IN_ALL
451 void                    gdk_pad_event_get_group_mode    (GdkEvent *event,
452                                                          guint    *group,
453                                                          guint    *mode);
454 GDK_AVAILABLE_IN_ALL
455 GType                   gdk_dnd_event_get_type          (void) G_GNUC_CONST;
456 GDK_AVAILABLE_IN_ALL
457 GdkDrop *               gdk_dnd_event_get_drop          (GdkEvent *event);
458 GDK_AVAILABLE_IN_ALL
459 GType                   gdk_grab_broken_event_get_type  (void) G_GNUC_CONST;
460 GDK_AVAILABLE_IN_ALL
461 GdkSurface *            gdk_grab_broken_event_get_grab_surface (GdkEvent *event);
462 GDK_AVAILABLE_IN_ALL
463 gboolean                gdk_grab_broken_event_get_implicit     (GdkEvent *event);
464 
465 GDK_AVAILABLE_IN_ALL
466 GType                   gdk_motion_event_get_type       (void) G_GNUC_CONST;
467 
468 GDK_AVAILABLE_IN_ALL
469 GType                   gdk_delete_event_get_type       (void) G_GNUC_CONST;
470 GDK_AVAILABLE_IN_ALL
471 GType                   gdk_proximity_event_get_type    (void) G_GNUC_CONST;
472 
473 GDK_AVAILABLE_IN_ALL
474 gboolean                gdk_event_triggers_context_menu (GdkEvent *event);
475 
476 GDK_AVAILABLE_IN_ALL
477 gboolean                gdk_events_get_distance         (GdkEvent *event1,
478                                                          GdkEvent *event2,
479                                                          double   *distance);
480 GDK_AVAILABLE_IN_ALL
481 gboolean                gdk_events_get_angle            (GdkEvent *event1,
482                                                          GdkEvent *event2,
483                                                          double   *angle);
484 GDK_AVAILABLE_IN_ALL
485 gboolean                gdk_events_get_center           (GdkEvent *event1,
486                                                          GdkEvent *event2,
487                                                          double   *x,
488                                                          double   *y);
489 
490 /**
491  * GdkKeyMatch:
492  * @GDK_KEY_MATCH_NONE: The key event does not match
493  * @GDK_KEY_MATCH_PARTIAL: The key event matches if keyboard state
494  *   (specifically, the currently active group) is ignored
495  * @GDK_KEY_MATCH_EXACT: The key event matches
496  *
497  * Describes how well an event matches a given keyval and modifiers.
498  *
499  * `GdkKeyMatch` values are returned by [method@Gdk.KeyEvent.matches].
500  */
501 typedef enum {
502   GDK_KEY_MATCH_NONE,
503   GDK_KEY_MATCH_PARTIAL,
504   GDK_KEY_MATCH_EXACT
505 } GdkKeyMatch;
506 
507 GDK_AVAILABLE_IN_ALL
508 GdkKeyMatch            gdk_key_event_matches (GdkEvent        *event,
509                                               guint            keyval,
510                                               GdkModifierType  modifiers);
511 
512 GDK_AVAILABLE_IN_ALL
513 gboolean               gdk_key_event_get_match (GdkEvent        *event,
514                                                 guint           *keyval,
515                                                 GdkModifierType *modifiers);
516 
517 G_END_DECLS
518 
519 #endif /* __GDK_EVENTS_H__ */
520