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