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 | |