summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkevents-x11.c
diff options
context:
space:
mode:
authorSoeren Sandmann <sandmann@daimi.au.dk>2004-07-11 13:26:57 +0000
committerSøren Sandmann Pedersen <ssp@src.gnome.org>2004-07-11 13:26:57 +0000
commit1a5e92dd611a3b9739fa3e19c8dec1f07be9a296 (patch)
tree6c1f08a8c5a469a4d3939ec5511235c4896cdee9 /gdk/x11/gdkevents-x11.c
parentb1a704b6b8b57ba1cf02581449349a8aaa76a40d (diff)
downloadgdk-pixbuf-1a5e92dd611a3b9739fa3e19c8dec1f07be9a296.tar.gz
Bug 143330, support update counter spec.
Sun Jul 11 15:24:03 2004 Soeren Sandmann <sandmann@daimi.au.dk> Bug 143330, support update counter spec. * configure.in: Add check for the Sync extension * gdk/gdkwindow.h: gdk_window_enable_synchronized_configure() and gdk_window_configure_finished() * gtk/gtkwindow.c (gtk_window_move_resize): Call gdk_window_finish_configure(). * gtk/gtkwindow.c (gtk_window_realize): Automatically enable synchronized configures. * gdk/x11/gdkwindow-x11.h (struct _GdkToplevelX11): Store current and pending counter values. * gdk/x11/gdkwindow-x11.c (gdk_window_configure_finished): New function. * gdk/x11/gdkwindow-x11.c (gdk_window_enable_synchronized_configure): New function. * gdk/x11/gdkwindow-x11.c (gdk_toplevel_x11_free_contents): Delete update counter. * gdk/x11/gdkwindow-x11.c (set_wm_protocols): Advertise _NET_WM_SYNC_REQUEST when Sync is available * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter): Handle _NET_WM_SYNC_REQUEST messages * gdk/x11/gdkevents-x11.c (gdk_event_translate): Save counter value for use by gdk_window_configure_finished() when receiving ConfigureNotifies. * gdk/x11/gdkdisplay-x11.h (struct _GdkDisplayX11): Add use_sync flag * gdk/x11/gdkdisplay-x11.c (gdk_display_open): Check if the XSync extension is available * gdk/x11/gdkdisplay-x11.c: Add _NET_WM_SYNC_REQUEST and _NET_WM_SYNC_REQUEST_COUNTER to list of supported atoms. * gdk/linux-fb/gdkwindow-fb.c, gdk/win32/gdkwindow-win32.c: Add stubs for enable_synchronized_configure() and configure_finished()
Diffstat (limited to 'gdk/x11/gdkevents-x11.c')
-rw-r--r--gdk/x11/gdkevents-x11.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
index b4a0ba202..825128713 100644
--- a/gdk/x11/gdkevents-x11.c
+++ b/gdk/x11/gdkevents-x11.c
@@ -46,6 +46,10 @@
#include <X11/XKBlib.h>
#endif
+#ifdef HAVE_XSYNC
+#include <X11/extensions/sync.h>
+#endif
+
#ifdef HAVE_XFIXES
#include <X11/extensions/Xfixes.h>
#endif
@@ -215,11 +219,10 @@ _gdk_events_init (GdkDisplay *display)
display_sources = g_list_prepend (display_sources,display_source);
- gdk_display_add_client_message_filter (
- display,
- gdk_atom_intern ("WM_PROTOCOLS", FALSE),
- gdk_wm_protocols_filter,
- NULL);
+ gdk_display_add_client_message_filter (display,
+ gdk_atom_intern ("WM_PROTOCOLS", FALSE),
+ gdk_wm_protocols_filter,
+ NULL);
}
@@ -1723,8 +1726,16 @@ gdk_event_translate (GdkDisplay *display,
!GDK_WINDOW_DESTROYED (window) &&
(window_private->extension_events != 0))
_gdk_input_configure_event (&xevent->xconfigure, window);
+
+#ifdef HAVE_XSYNC
+ if (toplevel && display_x11->use_sync && !XSyncValueIsZero (toplevel->pending_counter_value))
+ {
+ toplevel->current_counter_value = toplevel->pending_counter_value;
+ XSyncIntToValue (&toplevel->pending_counter_value, 0);
+ }
+#endif
- if (!window ||
+ if (!window ||
xevent->xconfigure.event != xevent->xconfigure.window ||
GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD ||
GDK_WINDOW_TYPE (window) == GDK_WINDOW_ROOT)
@@ -2022,8 +2033,9 @@ gdk_wm_protocols_filter (GdkXEvent *xev,
XEvent *xevent = (XEvent *)xev;
GdkWindow *win = event->any.window;
GdkDisplay *display = GDK_WINDOW_DISPLAY (win);
+ Atom atom = (Atom)xevent->xclient.data.l[0];
- if ((Atom) xevent->xclient.data.l[0] == gdk_x11_get_xatom_by_name_for_display (display, "WM_DELETE_WINDOW"))
+ if (atom == gdk_x11_get_xatom_by_name_for_display (display, "WM_DELETE_WINDOW"))
{
/* The delete window request specifies a window
* to delete. We don't actually destroy the
@@ -2041,7 +2053,7 @@ gdk_wm_protocols_filter (GdkXEvent *xev,
return GDK_FILTER_TRANSLATE;
}
- else if ((Atom) xevent->xclient.data.l[0] == gdk_x11_get_xatom_by_name_for_display (display, "WM_TAKE_FOCUS"))
+ else if (atom == gdk_x11_get_xatom_by_name_for_display (display, "WM_TAKE_FOCUS"))
{
GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (event->any.window);
GdkWindowObject *private = (GdkWindowObject *)win;
@@ -2056,7 +2068,7 @@ gdk_wm_protocols_filter (GdkXEvent *xev,
return GDK_FILTER_REMOVE;
}
- else if ((Atom) xevent->xclient.data.l[0] == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_PING") &&
+ else if (atom == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_PING") &&
!_gdk_x11_display_is_root_window (display,
xevent->xclient.window))
{
@@ -2070,7 +2082,21 @@ gdk_wm_protocols_filter (GdkXEvent *xev,
return GDK_FILTER_REMOVE;
}
-
+ else if (atom == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_SYNC_REQUEST") &&
+ GDK_DISPLAY_X11 (display)->use_sync)
+ {
+ GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (event->any.window);
+ if (toplevel)
+ {
+#ifdef HAVE_XSYNC
+ XSyncIntsToValue (&toplevel->pending_counter_value,
+ xevent->xclient.data.l[2],
+ xevent->xclient.data.l[3]);
+#endif
+ }
+ return GDK_FILTER_REMOVE;
+ }
+
return GDK_FILTER_CONTINUE;
}