1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
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.
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.
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.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team.
26 * GTK+ DirectFB backend
27 * Copyright (C) 2001-2002 convergence integrated media GmbH
28 * Copyright (C) 2002-2004 convergence GmbH
29 * Written by Denis Oliver Kropp <dok@convergence.de> and
30 * Sven Neumann <sven@convergence.de>
35 #include "gdkdirectfb.h"
36 #include "gdkprivate-directfb.h"
38 #include "gdkinternals.h"
40 #include "gdkkeysyms.h"
42 #include "gdkinput-directfb.h"
47 gboolean gdk_net_wm_supports (GdkAtom property);
52 #define EventBuffer _gdk_display->buffer
53 #define DirectFB _gdk_display->directfb
58 #include "gdkaliasdef.c"
60 /*********************************************
61 * Functions for maintaining the event queue *
62 *********************************************/
64 static GdkEvent * gdk_event_translate (DFBWindowEvent *dfbevent,
68 * Private variable declarations
70 static GList *client_filters; /* Filters for client messages */
74 fixup_event (GdkEvent *event)
76 if (event->any.window)
77 g_object_ref (event->any.window);
78 if (((event->any.type == GDK_ENTER_NOTIFY) ||
79 (event->any.type == GDK_LEAVE_NOTIFY)) &&
80 (event->crossing.subwindow != NULL))
81 g_object_ref (event->crossing.subwindow);
82 event->any.send_event = FALSE;
85 static GdkFilterReturn
86 apply_filters (GdkWindow *window,
87 DFBWindowEvent *dfbevent,
90 GdkFilterReturn result = GDK_FILTER_CONTINUE;
95 event = gdk_event_new (GDK_NOTHING);
97 event->any.window = g_object_ref (window);
98 ((GdkEventPrivate *)event)->flags |= GDK_EVENT_PENDING;
100 /* I think GdkFilterFunc semantics require the passed-in event
101 * to already be in the queue. The filter func can generate
102 * more events and append them after it if it likes.
104 node = _gdk_event_queue_append ((GdkDisplay*)_gdk_display, event);
109 GdkEventFilter *filter = (GdkEventFilter *) tmp_list->data;
111 tmp_list = tmp_list->next;
112 result = filter->function (dfbevent, event, filter->data);
113 if (result != GDK_FILTER_CONTINUE)
117 if (result == GDK_FILTER_CONTINUE || result == GDK_FILTER_REMOVE)
119 _gdk_event_queue_remove_link ((GdkDisplay*)_gdk_display, node);
120 g_list_free_1 (node);
121 gdk_event_free (event);
123 else /* GDK_FILTER_TRANSLATE */
125 ((GdkEventPrivate *)event)->flags &= ~GDK_EVENT_PENDING;
132 dfb_events_process_window_event (DFBWindowEvent *event)
137 * Apply global filters
139 * If result is GDK_FILTER_CONTINUE, we continue as if nothing
140 * happened. If it is GDK_FILTER_REMOVE or GDK_FILTER_TRANSLATE,
141 * we return TRUE and won't dispatch the event.
143 if (_gdk_default_filters)
145 switch (apply_filters (NULL, event, _gdk_default_filters))
147 case GDK_FILTER_REMOVE:
148 case GDK_FILTER_TRANSLATE:
156 window = gdk_directfb_window_id_table_lookup (event->window_id);
160 gdk_event_translate (event, window);
164 gdk_event_send_client_message_by_window (GdkEvent *event,
169 g_return_val_if_fail(event != NULL, FALSE);
170 g_return_val_if_fail(GDK_IS_WINDOW(window), FALSE);
172 evt.clazz = DFEC_USER;
173 evt.type = GPOINTER_TO_UINT (GDK_ATOM_TO_POINTER (event->client.message_type));
174 evt.data = (void *) event->client.data.l[0];
176 _gdk_display->buffer->PostEvent(_gdk_display->buffer, DFB_EVENT (&evt));
182 dfb_events_dispatch (void)
184 GdkDisplay *display = gdk_display_get_default ();
187 GDK_THREADS_ENTER ();
189 while ((event = _gdk_event_unqueue (display)) != NULL)
192 (*_gdk_event_func) (event, _gdk_event_data);
194 gdk_event_free (event);
197 GDK_THREADS_LEAVE ();
201 dfb_events_io_func (GIOChannel *channel,
202 GIOCondition condition,
211 result = g_io_channel_read_chars (channel,
212 (gchar *) buf, sizeof (buf), &read, NULL);
214 if (result == G_IO_STATUS_ERROR)
216 g_warning ("%s: GIOError occured", G_STRFUNC);
220 read /= sizeof (DFBEvent);
222 for (i = 0, event = buf; i < read; i++, event++)
224 switch (event->clazz)
227 /* TODO workaround to prevent two DWET_ENTER in a row from being delivered */
228 if (event->window.type == DWET_ENTER ) {
229 if ( i>0 && buf[i-1].window.type != DWET_ENTER )
230 dfb_events_process_window_event (&event->window);
233 dfb_events_process_window_event (&event->window);
240 GDK_NOTE (EVENTS, g_print (" client_message"));
242 for (list = client_filters; list; list = list->next)
244 GdkClientFilter *filter = list->data;
245 DFBUserEvent *user_event = (DFBUserEvent *) event;
248 type = GDK_POINTER_TO_ATOM (GUINT_TO_POINTER (user_event->type));
250 if (filter->type == type)
252 if (filter->function (user_event,
254 filter->data) != GDK_FILTER_CONTINUE)
266 EventBuffer->Reset (EventBuffer);
268 dfb_events_dispatch ();
274 _gdk_events_init (void)
281 ret = DirectFB->CreateEventBuffer (DirectFB, &EventBuffer);
284 DirectFBError ("_gdk_events_init: "
285 "IDirectFB::CreateEventBuffer() failed", ret);
289 ret = EventBuffer->CreateFileDescriptor (EventBuffer, &fd);
292 DirectFBError ("_gdk_events_init: "
293 "IDirectFBEventBuffer::CreateFileDescriptor() failed",
298 channel = g_io_channel_unix_new (fd);
300 g_io_channel_set_encoding (channel, NULL, NULL);
301 g_io_channel_set_buffered (channel, FALSE);
303 source = g_io_create_watch (channel, G_IO_IN);
305 g_source_set_priority (source, G_PRIORITY_DEFAULT);
306 g_source_set_can_recurse (source, TRUE);
307 g_source_set_callback (source, (GSourceFunc) dfb_events_io_func, NULL, NULL);
309 g_source_attach (source, NULL);
310 g_source_unref (source);
314 gdk_events_pending (void)
316 GdkDisplay *display = gdk_display_get_default ();
318 return _gdk_event_queue_find_first (display) ? TRUE : FALSE;
322 gdk_event_get_graphics_expose (GdkWindow *window)
327 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
329 display = gdk_drawable_get_display (GDK_DRAWABLE (window));
331 for (list = _gdk_event_queue_find_first (display); list; list = list->next)
333 GdkEvent *event = list->data;
334 if (event->type == GDK_EXPOSE && event->expose.window == window)
340 GdkEvent *retval = list->data;
342 _gdk_event_queue_remove_link (display, list);
343 g_list_free_1 (list);
352 _gdk_events_queue (GdkDisplay *display)
359 gdk_display_flush ( GDK_DISPLAY_OBJECT(_gdk_display));
362 /* Sends a ClientMessage to all toplevel client windows */
364 gdk_event_send_client_message_for_display (GdkDisplay *display,
368 GdkWindow *win = NULL;
371 g_return_val_if_fail(event != NULL, FALSE);
373 win = gdk_window_lookup_for_display (display, (GdkNativeWindow) xid);
375 g_return_val_if_fail(win != NULL, FALSE);
377 if ((GDK_WINDOW_OBJECT(win)->window_type != GDK_WINDOW_CHILD) &&
378 (g_object_get_data (G_OBJECT (win), "gdk-window-child-handler")))
380 /* Managed window, check children */
382 for (ltmp = GDK_WINDOW_OBJECT(win)->children; ltmp; ltmp = ltmp->next)
384 ret &= gdk_event_send_client_message_by_window (event,
385 GDK_WINDOW(ltmp->data));
390 ret &= gdk_event_send_client_message_by_window (event, win);
399 gdk_directfb_get_time (void)
403 g_get_current_time (&tv);
405 return (guint32) tv.tv_sec * 1000 + tv.tv_usec / 1000;
409 gdk_directfb_event_windows_add (GdkWindow *window)
411 GdkWindowImplDirectFB *impl;
413 g_return_if_fail (GDK_IS_WINDOW (window));
415 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
421 impl->window->AttachEventBuffer (impl->window, EventBuffer);
423 impl->window->CreateEventBuffer (impl->window, &EventBuffer);
427 gdk_directfb_event_windows_remove (GdkWindow *window)
429 GdkWindowImplDirectFB *impl;
431 g_return_if_fail (GDK_IS_WINDOW (window));
433 impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
439 impl->window->DetachEventBuffer (impl->window, EventBuffer);
440 /* FIXME: should we warn if (! EventBuffer) ? */
444 gdk_directfb_child_at (GdkWindow *window,
448 GdkWindowObject *private;
451 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
453 private = GDK_WINDOW_OBJECT (window);
454 for (list = private->children; list; list = list->next)
456 GdkWindowObject *win = list->data;
458 if (GDK_WINDOW_IS_MAPPED (win) &&
460 *winx < win->x + GDK_DRAWABLE_IMPL_DIRECTFB (win->impl)->width &&
462 *winy < win->y + GDK_DRAWABLE_IMPL_DIRECTFB (win->impl)->height)
467 return gdk_directfb_child_at (GDK_WINDOW (win), winx, winy );
475 gdk_event_translate (DFBWindowEvent *dfbevent,
478 GdkWindowObject *private;
480 GdkEvent *event = NULL;
482 g_return_val_if_fail (dfbevent != NULL, NULL);
483 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
485 private = GDK_WINDOW_OBJECT (window);
487 g_object_ref (G_OBJECT (window));
490 * Apply per-window filters
492 * If result is GDK_FILTER_CONTINUE, we continue as if nothing
493 * happened. If it is GDK_FILTER_REMOVE or GDK_FILTER_TRANSLATE,
494 * we return TRUE and won't dispatch the event.
496 if (private->filters)
498 switch (apply_filters (window, dfbevent, private->filters))
500 case GDK_FILTER_REMOVE:
501 case GDK_FILTER_TRANSLATE:
502 g_object_unref (G_OBJECT (window));
510 display = gdk_drawable_get_display (GDK_DRAWABLE (window));
512 switch (dfbevent->type)
514 case DWET_BUTTONDOWN:
517 static gboolean click_grab = FALSE;
523 _gdk_directfb_mouse_x = wx = dfbevent->cx;
524 _gdk_directfb_mouse_y = wy = dfbevent->cy;
526 switch (dfbevent->button)
530 mask = GDK_BUTTON1_MASK;
534 mask = GDK_BUTTON2_MASK;
538 mask = GDK_BUTTON3_MASK;
541 button = dfbevent->button + 1;
546 child = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
548 if (_gdk_directfb_pointer_grab_window &&
549 (_gdk_directfb_pointer_grab_events & (dfbevent->type ==
551 GDK_BUTTON_PRESS_MASK :
552 GDK_BUTTON_RELEASE_MASK)) &&
553 (_gdk_directfb_pointer_grab_owner_events == FALSE ||
554 child == _gdk_parent_root) )
556 GdkDrawableImplDirectFB *impl;
558 child = _gdk_directfb_pointer_grab_window;
559 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (child)->impl);
561 dfbevent->x = dfbevent->cx - impl->abs_x;
562 dfbevent->y = dfbevent->cy - impl->abs_y;
564 else if (!_gdk_directfb_pointer_grab_window ||
565 (_gdk_directfb_pointer_grab_owner_events == TRUE))
575 if (dfbevent->type == DWET_BUTTONDOWN)
576 _gdk_directfb_modifiers |= mask;
578 _gdk_directfb_modifiers &= ~mask;
583 gdk_directfb_event_make (child,
584 dfbevent->type == DWET_BUTTONDOWN ?
585 GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
587 event->button.x_root = _gdk_directfb_mouse_x;
588 event->button.y_root = _gdk_directfb_mouse_y;
590 event->button.x = dfbevent->x;
591 event->button.y = dfbevent->y;
593 event->button.state = _gdk_directfb_modifiers;
594 event->button.button = button;
595 event->button.device = display->core_pointer;
598 g_message ("button: %d at %d,%d %s with state 0x%08x",
599 event->button.button,
600 (int)event->button.x, (int)event->button.y,
601 dfbevent->type == DWET_BUTTONDOWN ?
602 "pressed" : "released",
603 _gdk_directfb_modifiers));
605 if (dfbevent->type == DWET_BUTTONDOWN)
606 _gdk_event_button_generate (display, event);
609 /* Handle implicit button grabs: */
610 if (dfbevent->type == DWET_BUTTONDOWN && !click_grab && child)
612 if (gdk_directfb_pointer_grab (child, FALSE,
613 gdk_window_get_events (child),
616 TRUE) == GDK_GRAB_SUCCESS)
619 else if (dfbevent->type == DWET_BUTTONUP &&
620 !(_gdk_directfb_modifiers & (GDK_BUTTON1_MASK |
622 GDK_BUTTON3_MASK)) && click_grab)
624 gdk_directfb_pointer_ungrab (GDK_CURRENT_TIME, TRUE);
632 GdkWindow *event_win=NULL;
635 _gdk_directfb_mouse_x = dfbevent->cx;
636 _gdk_directfb_mouse_y = dfbevent->cy;
638 //child = gdk_directfb_child_at (window, &dfbevent->x, &dfbevent->y);
639 /* Go all the way to root to catch popup menus */
640 int wx=_gdk_directfb_mouse_x;
641 int wy=_gdk_directfb_mouse_y;
642 child = gdk_directfb_child_at (_gdk_parent_root, &wx, &wy);
644 /* first let's see if any cossing event has to be send */
645 gdk_directfb_window_send_crossing_events (NULL, child, GDK_CROSSING_NORMAL);
647 /* then dispatch the motion event to the window the cursor it's inside */
648 event_win = gdk_directfb_pointer_event_window (child, GDK_MOTION_NOTIFY);
654 if (event_win == _gdk_directfb_pointer_grab_window) {
655 GdkDrawableImplDirectFB *impl;
657 child = _gdk_directfb_pointer_grab_window;
658 impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (child)->impl);
660 dfbevent->x = _gdk_directfb_mouse_x - impl->abs_x;
661 dfbevent->y = _gdk_directfb_mouse_y - impl->abs_y;
664 event = gdk_directfb_event_make (child, GDK_MOTION_NOTIFY);
666 event->motion.x_root = _gdk_directfb_mouse_x;
667 event->motion.y_root = _gdk_directfb_mouse_y;
669 //event->motion.x = dfbevent->x;
670 //event->motion.y = dfbevent->y;
671 event->motion.x = wx;
672 event->motion.y = wy;
674 event->motion.state = _gdk_directfb_modifiers;
675 event->motion.is_hint = FALSE;
676 event->motion.device = display->core_pointer;
678 if (GDK_WINDOW_OBJECT (event_win)->event_mask &
679 GDK_POINTER_MOTION_HINT_MASK)
681 while (EventBuffer->PeekEvent (EventBuffer,
682 DFB_EVENT (dfbevent)) == DFB_OK
683 && dfbevent->type == DWET_MOTION)
685 EventBuffer->GetEvent (EventBuffer, DFB_EVENT (dfbevent));
686 event->motion.is_hint = TRUE;
690 /* make sure crossing events go to the event window found */
691 /* GdkWindow *ev_win = ( event_win == NULL ) ? gdk_window_at_pointer (NULL,NULL) :event_win;
692 gdk_directfb_window_send_crossing_events (NULL,ev_win,GDK_CROSSING_NORMAL);
698 gdk_directfb_change_focus (window);
703 gdk_directfb_change_focus (_gdk_parent_root);
709 GdkWindow *event_win;
711 private->x = dfbevent->x;
712 private->y = dfbevent->y;
714 event_win = gdk_directfb_other_event_window (window, GDK_CONFIGURE);
718 event = gdk_directfb_event_make (event_win, GDK_CONFIGURE);
719 event->configure.x = dfbevent->x;
720 event->configure.y = dfbevent->y;
721 event->configure.width =
722 GDK_DRAWABLE_IMPL_DIRECTFB (private->impl)->width;
723 event->configure.height =
724 GDK_DRAWABLE_IMPL_DIRECTFB (private->impl)->height;
727 _gdk_directfb_calc_abs (window);
731 case DWET_POSITION_SIZE:
732 private->x = dfbevent->x;
733 private->y = dfbevent->y;
738 GdkDrawableImplDirectFB *impl;
739 GdkWindow *event_win;
742 impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
744 event_win = gdk_directfb_other_event_window (window, GDK_CONFIGURE);
748 event = gdk_directfb_event_make (event_win, GDK_CONFIGURE);
749 event->configure.x = private->x;
750 event->configure.y = private->y;
751 event->configure.width = dfbevent->w;
752 event->configure.height = dfbevent->h;
755 impl->width = dfbevent->w;
756 impl->height = dfbevent->h;
758 for (list = private->children; list; list = list->next)
760 GdkWindowObject *win;
761 GdkDrawableImplDirectFB *impl;
763 win = GDK_WINDOW_OBJECT (list->data);
764 impl = GDK_DRAWABLE_IMPL_DIRECTFB (win->impl);
766 _gdk_directfb_move_resize_child (GDK_WINDOW (win),
768 impl->width, impl->height);
771 _gdk_directfb_calc_abs (window);
773 gdk_window_clear (window);
774 gdk_window_invalidate_rect (window, NULL, TRUE);
782 GdkEventType type = (dfbevent->type == DWET_KEYUP ?
783 GDK_KEY_RELEASE : GDK_KEY_PRESS);
784 GdkWindow *event_win =
785 gdk_directfb_keyboard_event_window (gdk_directfb_window_find_focus (),
789 event = gdk_directfb_event_make (event_win, type);
790 gdk_directfb_translate_key_event (dfbevent, &event->key);
796 _gdk_directfb_mouse_x = dfbevent->cx;
797 _gdk_directfb_mouse_y = dfbevent->cy;
799 gdk_directfb_window_send_crossing_events (NULL, _gdk_parent_root,
800 GDK_CROSSING_NORMAL);
802 if (gdk_directfb_apply_focus_opacity)
804 if (GDK_WINDOW_IS_MAPPED (window))
805 GDK_WINDOW_IMPL_DIRECTFB (private->impl)->window->SetOpacity
806 (GDK_WINDOW_IMPL_DIRECTFB (private->impl)->window,
807 (GDK_WINDOW_IMPL_DIRECTFB (private->impl)->opacity >> 1) +
808 (GDK_WINDOW_IMPL_DIRECTFB (private->impl)->opacity >> 2));
816 _gdk_directfb_mouse_x = dfbevent->cx;
817 _gdk_directfb_mouse_y = dfbevent->cy;
819 child = gdk_directfb_child_at (window, &dfbevent->x, &dfbevent->y);
821 /* this makes sure pointer is set correctly when it previously left
822 * a window being not standard shaped
824 gdk_window_set_cursor (window, NULL);
825 gdk_directfb_window_send_crossing_events (NULL, child,
826 GDK_CROSSING_NORMAL);
828 if (gdk_directfb_apply_focus_opacity)
830 GDK_WINDOW_IMPL_DIRECTFB (private->impl)->window->SetOpacity
831 (GDK_WINDOW_IMPL_DIRECTFB (private->impl)->window,
832 GDK_WINDOW_IMPL_DIRECTFB (private->impl)->opacity);
840 GdkWindow *event_win;
842 event_win = gdk_directfb_other_event_window (window, GDK_DELETE);
845 event = gdk_directfb_event_make (event_win, GDK_DELETE);
851 GdkWindow *event_win;
853 event_win = gdk_directfb_other_event_window (window, GDK_DESTROY);
856 event = gdk_directfb_event_make (event_win, GDK_DESTROY);
858 gdk_window_destroy_notify (window);
864 GdkWindow *event_win;
866 _gdk_directfb_mouse_x = dfbevent->cx;
867 _gdk_directfb_mouse_y = dfbevent->cy;
869 if (_gdk_directfb_pointer_grab_window)
871 GdkDrawableImplDirectFB *impl;
873 event_win = _gdk_directfb_pointer_grab_window;
875 GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (event_win)->impl);
877 dfbevent->x = dfbevent->cx - impl->abs_x;
878 dfbevent->y = dfbevent->cy - impl->abs_y;
882 event_win = gdk_directfb_child_at (window,
883 &dfbevent->x, &dfbevent->y);
888 event = gdk_directfb_event_make (event_win, GDK_SCROLL);
890 event->scroll.direction = (dfbevent->step < 0 ?
891 GDK_SCROLL_DOWN : GDK_SCROLL_UP);
893 event->scroll.x_root = _gdk_directfb_mouse_x;
894 event->scroll.y_root = _gdk_directfb_mouse_y;
895 event->scroll.x = dfbevent->x;
896 event->scroll.y = dfbevent->y;
897 event->scroll.state = _gdk_directfb_modifiers;
898 event->scroll.device = display->core_pointer;
904 g_message ("unhandled DirectFB windowing event 0x%08x", dfbevent->type);
907 g_object_unref (G_OBJECT (window));
913 gdk_screen_get_setting (GdkScreen *screen,
921 gdk_display_add_client_message_filter (GdkDisplay *display,
922 GdkAtom message_type,
926 /* XXX: display should be used */
927 GdkClientFilter *filter = g_new (GdkClientFilter, 1);
929 filter->type = message_type;
930 filter->function = func;
932 client_filters = g_list_append (client_filters, filter);
937 gdk_add_client_message_filter (GdkAtom message_type,
941 gdk_display_add_client_message_filter (gdk_display_get_default (),
942 message_type, func, data);
946 gdk_screen_broadcast_client_message (GdkScreen *screen,
949 GdkWindow *root_window;
950 GdkWindowObject *private;
951 GList *top_level = NULL;
953 g_return_if_fail (GDK_IS_SCREEN (screen));
954 g_return_if_fail(sev != NULL);
956 root_window = gdk_screen_get_root_window (screen);
958 g_return_if_fail(GDK_IS_WINDOW(root_window));
960 private = GDK_WINDOW_OBJECT (root_window);
962 for (top_level = private->children; top_level; top_level = top_level->next)
964 gdk_event_send_client_message_for_display (gdk_drawable_get_display(GDK_DRAWABLE(root_window)),
966 (guint32)(GDK_WINDOW_DFB_ID(GDK_WINDOW(top_level->data))));
972 * gdk_net_wm_supports:
973 * @property: a property atom.
975 * This function is specific to the X11 backend of GDK, and indicates
976 * whether the window manager for the default screen supports a certain
977 * hint from the Extended Window Manager Hints Specification. See
978 * gdk_x11_screen_supports_net_wm_hint() for complete details.
980 * Return value: %TRUE if the window manager supports @property
985 gdk_net_wm_supports (GdkAtom property)
991 _gdk_windowing_event_data_copy (const GdkEvent *src,
997 _gdk_windowing_event_data_free (GdkEvent *event)
1001 #define __GDK_EVENTS_X11_C__
1002 #include "gdkaliasdef.c"