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