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, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 
20 /*
21  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GTK+ Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
25  */
26 
27 #ifndef __GDK_EVENTS_H__
28 #define __GDK_EVENTS_H__
29 
30 #if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
31 #error "Only <gdk/gdk.h> can be included directly."
32 #endif
33 
34 #include <gdk/gdkcolor.h>
35 #include <gdk/gdktypes.h>
36 #include <gdk/gdkdnd.h>
37 #include <gdk/gdkinput.h>
38 
39 G_BEGIN_DECLS
40 
41 #define GDK_TYPE_EVENT          (gdk_event_get_type ())
42 
43 #define GDK_PRIORITY_EVENTS	(G_PRIORITY_DEFAULT)
44 #define GDK_PRIORITY_REDRAW     (G_PRIORITY_HIGH_IDLE + 20)
45 
46 
47 typedef struct _GdkEventAny	    GdkEventAny;
48 typedef struct _GdkEventExpose	    GdkEventExpose;
49 typedef struct _GdkEventNoExpose    GdkEventNoExpose;
50 typedef struct _GdkEventVisibility  GdkEventVisibility;
51 typedef struct _GdkEventMotion	    GdkEventMotion;
52 typedef struct _GdkEventButton	    GdkEventButton;
53 typedef struct _GdkEventScroll      GdkEventScroll;
54 typedef struct _GdkEventKey	    GdkEventKey;
55 typedef struct _GdkEventFocus	    GdkEventFocus;
56 typedef struct _GdkEventCrossing    GdkEventCrossing;
57 typedef struct _GdkEventConfigure   GdkEventConfigure;
58 typedef struct _GdkEventProperty    GdkEventProperty;
59 typedef struct _GdkEventSelection   GdkEventSelection;
60 typedef struct _GdkEventOwnerChange GdkEventOwnerChange;
61 typedef struct _GdkEventProximity   GdkEventProximity;
62 typedef struct _GdkEventClient	    GdkEventClient;
63 typedef struct _GdkEventDND         GdkEventDND;
64 typedef struct _GdkEventWindowState GdkEventWindowState;
65 typedef struct _GdkEventSetting     GdkEventSetting;
66 typedef struct _GdkEventGrabBroken  GdkEventGrabBroken;
67 
68 typedef union  _GdkEvent	    GdkEvent;
69 
70 typedef void (*GdkEventFunc) (GdkEvent *event,
71 			      gpointer	data);
72 
73 /* Event filtering */
74 
75 typedef void GdkXEvent;	  /* Can be cast to window system specific
76 			   * even type, XEvent on X11, MSG on Win32.
77 			   */
78 
79 typedef enum {
80   GDK_FILTER_CONTINUE,	  /* Event not handled, continue processesing */
81   GDK_FILTER_TRANSLATE,	  /* Native event translated into a GDK event and
82                              stored in the "event" structure that was
83                              passed in */
84   GDK_FILTER_REMOVE	  /* Terminate processing, removing event */
85 } GdkFilterReturn;
86 
87 typedef GdkFilterReturn (*GdkFilterFunc) (GdkXEvent *xevent,
88 					  GdkEvent *event,
89 					  gpointer  data);
90 
91 
92 /* Event types.
93  *   Nothing: No event occurred.
94  *   Delete: A window delete event was sent by the window manager.
95  *	     The specified window should be deleted.
96  *   Destroy: A window has been destroyed.
97  *   Expose: Part of a window has been uncovered.
98  *   NoExpose: Same as expose, but no expose event was generated.
99  *   VisibilityNotify: A window has become fully/partially/not obscured.
100  *   MotionNotify: The mouse has moved.
101  *   ButtonPress: A mouse button was pressed.
102  *   ButtonRelease: A mouse button was release.
103  *   KeyPress: A key was pressed.
104  *   KeyRelease: A key was released.
105  *   EnterNotify: A window was entered.
106  *   LeaveNotify: A window was exited.
107  *   FocusChange: The focus window has changed. (The focus window gets
108  *		  keyboard events).
109  *   Resize: A window has been resized.
110  *   Map: A window has been mapped. (It is now visible on the screen).
111  *   Unmap: A window has been unmapped. (It is no longer visible on
112  *	    the screen).
113  *   Scroll: A mouse wheel was scrolled either up or down.
114  */
115 typedef enum
116 {
117   GDK_NOTHING		= -1,
118   GDK_DELETE		= 0,
119   GDK_DESTROY		= 1,
120   GDK_EXPOSE		= 2,
121   GDK_MOTION_NOTIFY	= 3,
122   GDK_BUTTON_PRESS	= 4,
123   GDK_2BUTTON_PRESS	= 5,
124   GDK_3BUTTON_PRESS	= 6,
125   GDK_BUTTON_RELEASE	= 7,
126   GDK_KEY_PRESS		= 8,
127   GDK_KEY_RELEASE	= 9,
128   GDK_ENTER_NOTIFY	= 10,
129   GDK_LEAVE_NOTIFY	= 11,
130   GDK_FOCUS_CHANGE	= 12,
131   GDK_CONFIGURE		= 13,
132   GDK_MAP		= 14,
133   GDK_UNMAP		= 15,
134   GDK_PROPERTY_NOTIFY	= 16,
135   GDK_SELECTION_CLEAR	= 17,
136   GDK_SELECTION_REQUEST = 18,
137   GDK_SELECTION_NOTIFY	= 19,
138   GDK_PROXIMITY_IN	= 20,
139   GDK_PROXIMITY_OUT	= 21,
140   GDK_DRAG_ENTER        = 22,
141   GDK_DRAG_LEAVE        = 23,
142   GDK_DRAG_MOTION       = 24,
143   GDK_DRAG_STATUS       = 25,
144   GDK_DROP_START        = 26,
145   GDK_DROP_FINISHED     = 27,
146   GDK_CLIENT_EVENT	= 28,
147   GDK_VISIBILITY_NOTIFY = 29,
148   GDK_NO_EXPOSE		= 30,
149   GDK_SCROLL            = 31,
150   GDK_WINDOW_STATE      = 32,
151   GDK_SETTING           = 33,
152   GDK_OWNER_CHANGE      = 34,
153   GDK_GRAB_BROKEN       = 35,
154   GDK_DAMAGE            = 36,
155   GDK_EVENT_LAST        /* helper variable for decls */
156 } GdkEventType;
157 
158 /* Event masks. (Used to select what types of events a window
159  *  will receive).
160  */
161 typedef enum
162 {
163   GDK_EXPOSURE_MASK		= 1 << 1,
164   GDK_POINTER_MOTION_MASK	= 1 << 2,
165   GDK_POINTER_MOTION_HINT_MASK	= 1 << 3,
166   GDK_BUTTON_MOTION_MASK	= 1 << 4,
167   GDK_BUTTON1_MOTION_MASK	= 1 << 5,
168   GDK_BUTTON2_MOTION_MASK	= 1 << 6,
169   GDK_BUTTON3_MOTION_MASK	= 1 << 7,
170   GDK_BUTTON_PRESS_MASK		= 1 << 8,
171   GDK_BUTTON_RELEASE_MASK	= 1 << 9,
172   GDK_KEY_PRESS_MASK		= 1 << 10,
173   GDK_KEY_RELEASE_MASK		= 1 << 11,
174   GDK_ENTER_NOTIFY_MASK		= 1 << 12,
175   GDK_LEAVE_NOTIFY_MASK		= 1 << 13,
176   GDK_FOCUS_CHANGE_MASK		= 1 << 14,
177   GDK_STRUCTURE_MASK		= 1 << 15,
178   GDK_PROPERTY_CHANGE_MASK	= 1 << 16,
179   GDK_VISIBILITY_NOTIFY_MASK	= 1 << 17,
180   GDK_PROXIMITY_IN_MASK		= 1 << 18,
181   GDK_PROXIMITY_OUT_MASK	= 1 << 19,
182   GDK_SUBSTRUCTURE_MASK		= 1 << 20,
183   GDK_SCROLL_MASK               = 1 << 21,
184   GDK_ALL_EVENTS_MASK		= 0x3FFFFE
185 } GdkEventMask;
186 
187 typedef enum
188 {
189   GDK_VISIBILITY_UNOBSCURED,
190   GDK_VISIBILITY_PARTIAL,
191   GDK_VISIBILITY_FULLY_OBSCURED
192 } GdkVisibilityState;
193 
194 typedef enum
195 {
196   GDK_SCROLL_UP,
197   GDK_SCROLL_DOWN,
198   GDK_SCROLL_LEFT,
199   GDK_SCROLL_RIGHT
200 } GdkScrollDirection;
201 
202 /* Types of enter/leave notifications.
203  *   Ancestor:
204  *   Virtual:
205  *   Inferior:
206  *   Nonlinear:
207  *   NonlinearVirtual:
208  *   Unknown: An unknown type of enter/leave event occurred.
209  */
210 typedef enum
211 {
212   GDK_NOTIFY_ANCESTOR		= 0,
213   GDK_NOTIFY_VIRTUAL		= 1,
214   GDK_NOTIFY_INFERIOR		= 2,
215   GDK_NOTIFY_NONLINEAR		= 3,
216   GDK_NOTIFY_NONLINEAR_VIRTUAL	= 4,
217   GDK_NOTIFY_UNKNOWN		= 5
218 } GdkNotifyType;
219 
220 /* Enter/leave event modes.
221  *   NotifyNormal
222  *   NotifyGrab
223  *   NotifyUngrab
224  */
225 typedef enum
226 {
227   GDK_CROSSING_NORMAL,
228   GDK_CROSSING_GRAB,
229   GDK_CROSSING_UNGRAB,
230   GDK_CROSSING_GTK_GRAB,
231   GDK_CROSSING_GTK_UNGRAB,
232   GDK_CROSSING_STATE_CHANGED
233 } GdkCrossingMode;
234 
235 typedef enum
236 {
237   GDK_PROPERTY_NEW_VALUE,
238   GDK_PROPERTY_DELETE
239 } GdkPropertyState;
240 
241 typedef enum
242 {
243   GDK_WINDOW_STATE_WITHDRAWN  = 1 << 0,
244   GDK_WINDOW_STATE_ICONIFIED  = 1 << 1,
245   GDK_WINDOW_STATE_MAXIMIZED  = 1 << 2,
246   GDK_WINDOW_STATE_STICKY     = 1 << 3,
247   GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
248   GDK_WINDOW_STATE_ABOVE      = 1 << 5,
249   GDK_WINDOW_STATE_BELOW      = 1 << 6
250 } GdkWindowState;
251 
252 typedef enum
253 {
254   GDK_SETTING_ACTION_NEW,
255   GDK_SETTING_ACTION_CHANGED,
256   GDK_SETTING_ACTION_DELETED
257 } GdkSettingAction;
258 
259 typedef enum
260 {
261   GDK_OWNER_CHANGE_NEW_OWNER,
262   GDK_OWNER_CHANGE_DESTROY,
263   GDK_OWNER_CHANGE_CLOSE
264 } GdkOwnerChange;
265 
266 struct _GdkEventAny
267 {
268   GdkEventType type;
269   GdkWindow *window;
270   gint8 send_event;
271 };
272 
273 struct _GdkEventExpose
274 {
275   GdkEventType type;
276   GdkWindow *window;
277   gint8 send_event;
278   GdkRectangle area;
279   GdkRegion *region;
280   gint count; /* If non-zero, how many more events follow. */
281 };
282 
283 struct _GdkEventNoExpose
284 {
285   GdkEventType type;
286   GdkWindow *window;
287   gint8 send_event;
288 };
289 
290 struct _GdkEventVisibility
291 {
292   GdkEventType type;
293   GdkWindow *window;
294   gint8 send_event;
295   GdkVisibilityState state;
296 };
297 
298 struct _GdkEventMotion
299 {
300   GdkEventType type;
301   GdkWindow *window;
302   gint8 send_event;
303   guint32 time;
304   gdouble x;
305   gdouble y;
306   gdouble *axes;
307   guint state;
308   gint16 is_hint;
309   GdkDevice *device;
310   gdouble x_root, y_root;
311 };
312 
313 struct _GdkEventButton
314 {
315   GdkEventType type;
316   GdkWindow *window;
317   gint8 send_event;
318   guint32 time;
319   gdouble x;
320   gdouble y;
321   gdouble *axes;
322   guint state;
323   guint button;
324   GdkDevice *device;
325   gdouble x_root, y_root;
326 };
327 
328 struct _GdkEventScroll
329 {
330   GdkEventType type;
331   GdkWindow *window;
332   gint8 send_event;
333   guint32 time;
334   gdouble x;
335   gdouble y;
336   guint state;
337   GdkScrollDirection direction;
338   GdkDevice *device;
339   gdouble x_root, y_root;
340 };
341 
342 struct _GdkEventKey
343 {
344   GdkEventType type;
345   GdkWindow *window;
346   gint8 send_event;
347   guint32 time;
348   guint state;
349   guint keyval;
350   gint length;
351   gchar *string;
352   guint16 hardware_keycode;
353   guint8 group;
354   guint is_modifier : 1;
355 };
356 
357 struct _GdkEventCrossing
358 {
359   GdkEventType type;
360   GdkWindow *window;
361   gint8 send_event;
362   GdkWindow *subwindow;
363   guint32 time;
364   gdouble x;
365   gdouble y;
366   gdouble x_root;
367   gdouble y_root;
368   GdkCrossingMode mode;
369   GdkNotifyType detail;
370   gboolean focus;
371   guint state;
372 };
373 
374 struct _GdkEventFocus
375 {
376   GdkEventType type;
377   GdkWindow *window;
378   gint8 send_event;
379   gint16 in;
380 };
381 
382 struct _GdkEventConfigure
383 {
384   GdkEventType type;
385   GdkWindow *window;
386   gint8 send_event;
387   gint x, y;
388   gint width;
389   gint height;
390 };
391 
392 struct _GdkEventProperty
393 {
394   GdkEventType type;
395   GdkWindow *window;
396   gint8 send_event;
397   GdkAtom atom;
398   guint32 time;
399   guint state;
400 };
401 
402 struct _GdkEventSelection
403 {
404   GdkEventType type;
405   GdkWindow *window;
406   gint8 send_event;
407   GdkAtom selection;
408   GdkAtom target;
409   GdkAtom property;
410   guint32 time;
411   GdkNativeWindow requestor;
412 };
413 
414 struct _GdkEventOwnerChange
415 {
416   GdkEventType type;
417   GdkWindow *window;
418   gint8 send_event;
419   GdkNativeWindow owner;
420   GdkOwnerChange reason;
421   GdkAtom selection;
422   guint32 time;
423   guint32 selection_time;
424 };
425 
426 /* This event type will be used pretty rarely. It only is important
427    for XInput aware programs that are drawing their own cursor */
428 
429 struct _GdkEventProximity
430 {
431   GdkEventType type;
432   GdkWindow *window;
433   gint8 send_event;
434   guint32 time;
435   GdkDevice *device;
436 };
437 
438 struct _GdkEventClient
439 {
440   GdkEventType type;
441   GdkWindow *window;
442   gint8 send_event;
443   GdkAtom message_type;
444   gushort data_format;
445   union {
446     char b[20];
447     short s[10];
448     long l[5];
449   } data;
450 };
451 
452 struct _GdkEventSetting
453 {
454   GdkEventType type;
455   GdkWindow *window;
456   gint8 send_event;
457   GdkSettingAction action;
458   char *name;
459 };
460 
461 struct _GdkEventWindowState
462 {
463   GdkEventType type;
464   GdkWindow *window;
465   gint8 send_event;
466   GdkWindowState changed_mask;
467   GdkWindowState new_window_state;
468 };
469 
470 struct _GdkEventGrabBroken {
471   GdkEventType type;
472   GdkWindow *window;
473   gint8 send_event;
474   gboolean keyboard;
475   gboolean implicit;
476   GdkWindow *grab_window;
477 };
478 
479 /* Event types for DND */
480 
481 struct _GdkEventDND {
482   GdkEventType type;
483   GdkWindow *window;
484   gint8 send_event;
485   GdkDragContext *context;
486 
487   guint32 time;
488   gshort x_root, y_root;
489 };
490 
491 union _GdkEvent
492 {
493   GdkEventType		    type;
494   GdkEventAny		    any;
495   GdkEventExpose	    expose;
496   GdkEventNoExpose	    no_expose;
497   GdkEventVisibility	    visibility;
498   GdkEventMotion	    motion;
499   GdkEventButton	    button;
500   GdkEventScroll            scroll;
501   GdkEventKey		    key;
502   GdkEventCrossing	    crossing;
503   GdkEventFocus		    focus_change;
504   GdkEventConfigure	    configure;
505   GdkEventProperty	    property;
506   GdkEventSelection	    selection;
507   GdkEventOwnerChange  	    owner_change;
508   GdkEventProximity	    proximity;
509   GdkEventClient	    client;
510   GdkEventDND               dnd;
511   GdkEventWindowState       window_state;
512   GdkEventSetting           setting;
513   GdkEventGrabBroken        grab_broken;
514 };
515 
516 GType     gdk_event_get_type            (void) G_GNUC_CONST;
517 
518 gboolean  gdk_events_pending	 	(void);
519 GdkEvent* gdk_event_get			(void);
520 
521 GdkEvent* gdk_event_peek                (void);
522 #ifndef GDK_DISABLE_DEPRECATED
523 GdkEvent* gdk_event_get_graphics_expose (GdkWindow 	*window);
524 #endif
525 void      gdk_event_put	 		(const GdkEvent *event);
526 
527 GdkEvent* gdk_event_new                 (GdkEventType    type);
528 GdkEvent* gdk_event_copy     		(const GdkEvent *event);
529 void	  gdk_event_free     		(GdkEvent 	*event);
530 
531 guint32   gdk_event_get_time            (const GdkEvent  *event);
532 gboolean  gdk_event_get_state           (const GdkEvent  *event,
533                                          GdkModifierType *state);
534 gboolean  gdk_event_get_coords		(const GdkEvent  *event,
535 					 gdouble	 *x_win,
536 					 gdouble	 *y_win);
537 gboolean  gdk_event_get_root_coords	(const GdkEvent  *event,
538 					 gdouble	 *x_root,
539 					 gdouble	 *y_root);
540 gboolean  gdk_event_get_axis            (const GdkEvent  *event,
541                                          GdkAxisUse       axis_use,
542                                          gdouble         *value);
543 void      gdk_event_request_motions     (const GdkEventMotion *event);
544 void	  gdk_event_handler_set 	(GdkEventFunc    func,
545 					 gpointer        data,
546 					 GDestroyNotify  notify);
547 
548 void       gdk_event_set_screen         (GdkEvent        *event,
549                                          GdkScreen       *screen);
550 GdkScreen *gdk_event_get_screen         (const GdkEvent  *event);
551 
552 void	  gdk_set_show_events		(gboolean	 show_events);
553 gboolean  gdk_get_show_events		(void);
554 
555 #ifndef GDK_MULTIHEAD_SAFE
556 void gdk_add_client_message_filter (GdkAtom       message_type,
557 				    GdkFilterFunc func,
558 				    gpointer      data);
559 
560 gboolean gdk_setting_get (const gchar *name,
561 			  GValue      *value);
562 #endif /* GDK_MULTIHEAD_SAFE */
563 
564 G_END_DECLS
565 
566 #endif /* __GDK_EVENTS_H__ */
567