diff options
author | Soeren Sandmann <sandmann@daimi.au.dk> | 2004-07-11 13:26:57 +0000 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@src.gnome.org> | 2004-07-11 13:26:57 +0000 |
commit | 1a5e92dd611a3b9739fa3e19c8dec1f07be9a296 (patch) | |
tree | 6c1f08a8c5a469a4d3939ec5511235c4896cdee9 /gdk/x11/gdkevents-x11.c | |
parent | b1a704b6b8b57ba1cf02581449349a8aaa76a40d (diff) | |
download | gdk-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.c | 46 |
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; } |