diff options
author | Owen W. Taylor <otaylor@fishsoup.net> | 2012-10-03 23:10:56 -0400 |
---|---|---|
committer | Owen W. Taylor <otaylor@fishsoup.net> | 2013-01-30 15:47:52 -0500 |
commit | 7a9663500ea816b14eb708c930a705e9c4ba9a87 (patch) | |
tree | c4520429a62a3947fec6168cd09a2e1cf3ebad2a | |
parent | 4f79c70002a8433cee3939b4bd2af955696d5757 (diff) | |
download | mutter-7a9663500ea816b14eb708c930a705e9c4ba9a87.tar.gz |
MetaWindow: always resize the frame first when we have synchronization
Resizing the frame triggers creation of a new backing pixmap for the
window, so we should do that first before we resize the client window
and mess up the contents of the old backing pixmap.
https://bugzilla.gnome.org/show_bug.cgi?id=685463
-rw-r--r-- | src/core/window.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/core/window.c b/src/core/window.c index c332e6008..60bfa91b8 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -5051,12 +5051,28 @@ meta_window_move_resize_internal (MetaWindow *window, * efficiently as possible */ - /* configure frame first if we grow more than we shrink + /* Normally, we configure the frame first depending on whether + * we grow the frame more than we shrink. The idea is to avoid + * messing up the window contents by having a temporary situation + * where the frame is smaller than the window. However, if we're + * cooperating with the client to create an atomic frame upate, + * and the window is redirected, then we should always update + * the frame first, since updating the frame will force a new + * backing pixmap to be allocated, and the old backing pixmap + * will be left undisturbed for us to paint to the screen until + * the client finishes redrawing. */ - size_dx = w - window->rect.width; - size_dy = h - window->rect.height; + if (window->extended_sync_request_counter) + { + configure_frame_first = TRUE; + } + else + { + size_dx = w - window->rect.width; + size_dy = h - window->rect.height; - configure_frame_first = (size_dx + size_dy >= 0); + configure_frame_first = size_dx + size_dy >= 0; + } if (use_static_gravity) meta_window_set_gravity (window, StaticGravity); |