1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 2009 Carlos Garnacho <carlosg@gnome.org>
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.
22 #include "gdkeventsource.h"
24 #include "gdkinternals.h"
26 static gboolean gdk_event_source_prepare (GSource *source,
28 static gboolean gdk_event_source_check (GSource *source);
29 static gboolean gdk_event_source_dispatch (GSource *source,
32 static void gdk_event_source_finalize (GSource *source);
34 #define HAS_FOCUS(toplevel) \
35 ((toplevel)->has_focus || (toplevel)->has_pointer_focus)
37 struct _GdkEventSource
42 GPollFD event_poll_fd;
45 static GSourceFuncs event_funcs = {
46 gdk_event_source_prepare,
47 gdk_event_source_check,
48 gdk_event_source_dispatch,
49 gdk_event_source_finalize
52 static GList *event_sources = NULL;
55 gdk_event_source_prepare (GSource *source,
58 GdkDisplay *display = ((GdkEventSource*) source)->display;
64 retval = (_gdk_event_queue_find_first (display) != NULL);
72 gdk_event_source_check (GSource *source)
74 GdkEventSource *event_source = (GdkEventSource*) source;
79 if (event_source->event_poll_fd.revents & G_IO_IN)
80 retval = (_gdk_event_queue_find_first (event_source->display) != NULL);
90 _gdk_events_queue (GdkDisplay *display)
95 gdk_event_source_dispatch (GSource *source,
99 GdkDisplay *display = ((GdkEventSource*) source)->display;
102 GDK_THREADS_ENTER ();
104 event = gdk_display_get_event (display);
109 (*_gdk_event_func) (event, _gdk_event_data);
111 gdk_event_free (event);
114 GDK_THREADS_LEAVE ();
120 gdk_event_source_finalize (GSource *source)
122 GdkEventSource *event_source = (GdkEventSource *)source;
124 event_sources = g_list_remove (event_sources, event_source);
128 gdk_event_source_new (GdkDisplay *display)
131 GdkEventSource *event_source;
134 source = g_source_new (&event_funcs, sizeof (GdkEventSource));
135 name = g_strdup_printf ("GDK Broadway Event source (%s)",
136 gdk_display_get_name (display));
137 g_source_set_name (source, name);
139 event_source = (GdkEventSource *) source;
140 event_source->display = display;
142 g_source_set_priority (source, GDK_PRIORITY_EVENTS);
143 g_source_set_can_recurse (source, TRUE);
144 g_source_attach (source, NULL);
146 event_sources = g_list_prepend (event_sources, source);
152 gdk_event_source_select_events (GdkEventSource *source,
154 GdkEventMask event_mask,
155 unsigned int extra_x_mask)
160 gdk_events_pending (void)
164 for (tmp_list = event_sources; tmp_list; tmp_list = tmp_list->next)
166 GdkEventSource *tmp_source = tmp_list->data;
167 GdkDisplay *display = tmp_source->display;
169 if (_gdk_event_queue_find_first (display))