From da311f266d61bd0222a78be8a0eadf6857623926 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Tue, 3 Jun 2014 11:21:22 -0400 Subject: [PATCH] window: Make sure to update client_rect for OR windows too Before we unmanage, we send a ConfigureNotify to clients to let them know if their frame is destroyed. We do this for OR windows too, even if we really probably shouldn't. This is based off of the client_rect. Since we listen to ConfigureNotify on OR windows, we'll receive the event. If we don't ever update the client_rect when moving or resizing OR windows, then we'll send ourselves a ConfigureNotify for a 0x0 size and then think that the client chose a new size for itself. Since our get_paint_volume is based on that rectangle, but the TFP code inside Cogl uses XGetGeometry itself, we get weird flickering artifacts. --- src/x11/window-x11.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c index 4bf253742..be5754608 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -534,11 +534,22 @@ meta_window_x11_manage (MetaWindow *window) } } - /* Put our state back where it should be, - * passing TRUE for is_configure_request, ICCCM says - * initial map is handled same as configure request + /* For override-redirect windows, save the client rect + * directly. window->rect was assigned from the XWindowAttributes + * in the main meta_window_shared_new. + * + * For normal windows, do a full ConfigureRequest based on the + * window hints, as that's what the ICCCM says to do. */ - if (!window->override_redirect) + + if (window->override_redirect) + { + MetaWindowX11 *window_x11 = META_WINDOW_X11 (window); + MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11); + + priv->client_rect = window->rect; + } + else { MetaRectangle rect; MetaMoveResizeFlags flags; @@ -3212,6 +3223,9 @@ void meta_window_x11_configure_notify (MetaWindow *window, XConfigureEvent *event) { + MetaWindowX11 *window_x11 = META_WINDOW_X11 (window); + MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11); + g_assert (window->override_redirect); g_assert (window->frame == NULL); @@ -3219,6 +3233,9 @@ meta_window_x11_configure_notify (MetaWindow *window, window->rect.y = event->y; window->rect.width = event->width; window->rect.height = event->height; + + priv->client_rect = window->rect; + meta_window_update_monitor (window); /* Whether an override-redirect window is considered fullscreen depends