diff --git a/ChangeLog b/ChangeLog index 2200f0f05153a561fb92fb71bac9e5f9e0bd1946..2bff70c24344eb7abc53e9305052a3b0aacdd1b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Mon Aug 2 21:52:45 2004 Soeren Sandmann + + * gdk/x11/gdkwindow-x11.c (ensure_sync_counter): New + function. Make sure the sync counter is recreated when a window is + reparented to become a toplevel. (#148358) + 2004-08-02 Matthias Clasen * tests/testcombo.c: Some trees in combo boxes. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 2200f0f05153a561fb92fb71bac9e5f9e0bd1946..2bff70c24344eb7abc53e9305052a3b0aacdd1b4 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +Mon Aug 2 21:52:45 2004 Soeren Sandmann + + * gdk/x11/gdkwindow-x11.c (ensure_sync_counter): New + function. Make sure the sync counter is recreated when a window is + reparented to become a toplevel. (#148358) + 2004-08-02 Matthias Clasen * tests/testcombo.c: Some trees in combo boxes. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 2200f0f05153a561fb92fb71bac9e5f9e0bd1946..2bff70c24344eb7abc53e9305052a3b0aacdd1b4 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +Mon Aug 2 21:52:45 2004 Soeren Sandmann + + * gdk/x11/gdkwindow-x11.c (ensure_sync_counter): New + function. Make sure the sync counter is recreated when a window is + reparented to become a toplevel. (#148358) + 2004-08-02 Matthias Clasen * tests/testcombo.c: Some trees in combo boxes. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 2200f0f05153a561fb92fb71bac9e5f9e0bd1946..2bff70c24344eb7abc53e9305052a3b0aacdd1b4 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +Mon Aug 2 21:52:45 2004 Soeren Sandmann + + * gdk/x11/gdkwindow-x11.c (ensure_sync_counter): New + function. Make sure the sync counter is recreated when a window is + reparented to become a toplevel. (#148358) + 2004-08-02 Matthias Clasen * tests/testcombo.c: Some trees in combo boxes. diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index da42d5b31096c81c0c58a22ab063fb6593251fcc..2f059db004302adac3abfa49d01d70b661ad1f8b 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -2150,6 +2150,13 @@ _gdk_events_queue (GdkDisplay *display) } } +static gboolean +has_events_already (GdkDisplay *display) +{ + gboolean r = XEventsQueued (GDK_DISPLAY_XDISPLAY (display), QueuedAlready); + return r; +} + static gboolean gdk_event_prepare (GSource *source, gint *timeout) @@ -2161,7 +2168,7 @@ gdk_event_prepare (GSource *source, *timeout = -1; retval = (_gdk_event_queue_find_first (display) != NULL || - gdk_check_xpending (display)); + has_events_already (display)); GDK_THREADS_LEAVE (); @@ -2198,15 +2205,15 @@ gdk_event_dispatch (GSource *source, GDK_THREADS_ENTER (); _gdk_events_queue (display); + event = _gdk_event_unqueue (display); if (event) { if (_gdk_event_func) (*_gdk_event_func) (event, _gdk_event_data); - gdk_event_free (event); - } + } GDK_THREADS_LEAVE (); diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 02d899311563ae24e42de560ba4fd773f3a4bea4..6ecb9371b2a51dc76b47062d274728c40d7f012b 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -524,6 +524,43 @@ create_focus_window (Display *xdisplay, return focus_window; } +static void +ensure_sync_counter (GdkWindow *window) +{ +#ifdef HAVE_XSYNC + if (!GDK_WINDOW_DESTROYED (window)) + { + GdkDisplay *display = GDK_WINDOW_DISPLAY (window); + GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window); + GdkWindowObject *private = (GdkWindowObject *)window; + GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (private->impl); + + if (toplevel && impl->use_synchronized_configure && + toplevel->update_counter == None && + GDK_DISPLAY_X11 (display)->use_sync) + { + Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); + XSyncValue value; + Atom atom; + + XSyncIntToValue (&value, 0); + + toplevel->update_counter = XSyncCreateCounter (xdisplay, value); + + atom = gdk_x11_get_xatom_by_name_for_display (display, + "_NET_WM_SYNC_REQUEST_COUNTER"); + + XChangeProperty (xdisplay, GDK_WINDOW_XID (window), + atom, XA_CARDINAL, + 32, PropModeReplace, + (guchar *)&toplevel->update_counter, 1); + + XSyncIntToValue (&toplevel->current_counter_value, 0); + } + } +#endif +} + static void setup_toplevel_window (GdkWindow *window, GdkWindow *parent) @@ -583,6 +620,8 @@ setup_toplevel_window (GdkWindow *window, gdk_x11_window_set_user_time (window, 0); else if (GDK_DISPLAY_X11 (screen_x11->display)->user_time != 0) gdk_x11_window_set_user_time (window, GDK_DISPLAY_X11 (screen_x11->display)->user_time); + + ensure_sync_counter (window); } /** @@ -5653,40 +5692,18 @@ gdk_window_begin_move_drag (GdkWindow *window, void gdk_window_enable_synchronized_configure (GdkWindow *window) { + GdkWindowObject *private = (GdkWindowObject *)window; + GdkWindowImplX11 *impl; + g_return_if_fail (GDK_IS_WINDOW (window)); - -#ifdef HAVE_XSYNC - if (!GDK_WINDOW_DESTROYED (window)) - { - GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window); - GdkDisplay *display = GDK_WINDOW_DISPLAY (window); - if (toplevel && toplevel->update_counter == None && - GDK_DISPLAY_X11 (display)->use_sync) - { - Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); - XSyncValue value; - Atom atom; - - if (toplevel->update_counter != None) - return; - - XSyncIntToValue (&value, 0); - - toplevel->update_counter = XSyncCreateCounter (xdisplay, value); - - atom = gdk_x11_get_xatom_by_name_for_display (display, - "_NET_WM_SYNC_REQUEST_COUNTER"); - - XChangeProperty (xdisplay, GDK_WINDOW_XID (window), - atom, XA_CARDINAL, - 32, PropModeReplace, - (guchar *)&toplevel->update_counter, 1); + impl = GDK_WINDOW_IMPL_X11 (private->impl); - XSyncIntToValue (&toplevel->current_counter_value, 0); - } + if (!impl->use_synchronized_configure) + { + impl->use_synchronized_configure = TRUE; + ensure_sync_counter (window); } -#endif /* HAVE_XSYNC */ } /** @@ -5708,7 +5725,7 @@ void gdk_window_configure_finished (GdkWindow *window) { g_return_if_fail (GDK_IS_WINDOW (window)); - + #ifdef HAVE_XSYNC if (!GDK_WINDOW_DESTROYED (window)) { diff --git a/gdk/x11/gdkwindow-x11.h b/gdk/x11/gdkwindow-x11.h index d40110f44c218599902e6a26a233d9de1a63d14f..a85c873a58125c8113b2a7a30f4248c941aaf16d 100644 --- a/gdk/x11/gdkwindow-x11.h +++ b/gdk/x11/gdkwindow-x11.h @@ -77,6 +77,7 @@ struct _GdkWindowImplX11 GdkToplevelX11 *toplevel; /* Toplevel-specific information */ gint8 toplevel_window_type; guint override_redirect : 1; + guint use_synchronized_configure : 1; }; struct _GdkWindowImplX11Class