summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <ofourdan@redhat.com>2018-09-19 16:08:52 +0200
committerOlivier Fourdan <ofourdan@redhat.com>2018-09-21 18:50:06 +0200
commit2fb3db7659caa3627a473fefabc4d6a87f688cee (patch)
tree4d6d275fa70884bdf2b488e2f7a7e4c9108d3e61
parent7d82cdeea307608c9f4e6442eb4ea64d7dee0c58 (diff)
downloadmutter-2fb3db7659caa3627a473fefabc4d6a87f688cee.tar.gz
compositor: Skip windows not visible to the compositor
The compositor will automatically unredirect the top most window which is fully visible on screen. When unredirecting windows, it also shapes the compositor overlay window (COW) so that other redirected windows still shows correctly. The function `get_top_visible_window_actor()` however will simply walks down the window list, so if a window is placed on a layer above and unredirected, then iconified by the client, it will still be picked up by `get_top_visible_window_actor()` and he compositor will reckon it's still unredirected while not in a visible state anymore, thus leaving a black area on screen. Make sure we skip the windows not known to the compositor while picking the top visible window actor to avoid this issue. Closes: https://gitlab.gnome.org/GNOME/mutter/issues/306
-rw-r--r--src/compositor/compositor.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index e45d10c00..e1f597346 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -804,6 +804,7 @@ meta_compositor_hide_window (MetaCompositor *compositor,
{
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
meta_window_actor_hide (window_actor, effect);
+ meta_stack_tracker_queue_sync_stack (compositor->display->stack_tracker);
}
void
@@ -951,6 +952,9 @@ get_top_visible_window_actor (MetaCompositor *compositor)
MetaRectangle buffer_rect;
MetaRectangle display_rect = { 0 };
+ if (!window->visible_to_compositor)
+ continue;
+
meta_window_get_buffer_rect (window, &buffer_rect);
meta_display_get_size (compositor->display,
&display_rect.width, &display_rect.height);