From 17c52854b72a47c7cd1554e57971d37c563e0ade Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 4 Jan 2023 03:46:33 +0100 Subject: [PATCH] default-plugin: Handle unmanaging windows in switch_workspace Also add a regression metatest. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2559 Part-of: --- src/compositor/plugins/default.c | 55 ++++++++++--------- src/tests/meson.build | 1 + .../workspace-unmanaging-window.metatest | 11 ++++ 3 files changed, 42 insertions(+), 25 deletions(-) create mode 100644 src/tests/stacking/workspace-unmanaging-window.metatest diff --git a/src/compositor/plugins/default.c b/src/compositor/plugins/default.c index d97e034e1..9ff255070 100644 --- a/src/compositor/plugins/default.c +++ b/src/compositor/plugins/default.c @@ -555,42 +555,47 @@ switch_workspace (MetaPlugin *plugin, ActorPrivate *apriv = get_actor_private (window_actor); ClutterActor *actor = CLUTTER_ACTOR (window_actor); MetaWindow *window; + MetaWorkspace *workspace; + gint workspace_idx; window = meta_window_actor_get_meta_window (window_actor); + workspace = meta_window_get_workspace (window); + + if (!workspace) + { + /* unmanaging window */ + clutter_actor_hide (actor); + apriv->orig_parent = NULL; + continue; + } if (meta_window_is_on_all_workspaces (window)) { /* Sticky window */ apriv->orig_parent = NULL; + continue; } - else - { - MetaWorkspace *workspace; - gint win_workspace; - workspace = meta_window_get_workspace (window); - win_workspace = meta_workspace_index (workspace); + workspace_idx = meta_workspace_index (workspace); - if (win_workspace == to || win_workspace == from) - { - ClutterActor *parent = win_workspace == to ? workspace1 - : workspace2; - apriv->orig_parent = clutter_actor_get_parent (actor); + if (workspace_idx == to || workspace_idx == from) + { + ClutterActor *parent = workspace_idx == to ? workspace1 + : workspace2; + apriv->orig_parent = clutter_actor_get_parent (actor); - g_object_ref (actor); - clutter_actor_remove_child (clutter_actor_get_parent (actor), - actor); - clutter_actor_add_child (parent, actor); - clutter_actor_set_child_below_sibling (parent, actor, NULL); - g_object_unref (actor); - } - else - { - /* Window on some other desktop */ - clutter_actor_hide (actor); - apriv->orig_parent = NULL; - } - } + g_object_ref (actor); + clutter_actor_remove_child (clutter_actor_get_parent (actor), + actor); + clutter_actor_add_child (parent, actor); + clutter_actor_set_child_below_sibling (parent, actor, NULL); + g_object_unref (actor); + continue; + } + + /* Window on some other desktop */ + clutter_actor_hide (actor); + apriv->orig_parent = NULL; } priv->desktop1 = workspace1; diff --git a/src/tests/meson.build b/src/tests/meson.build index 21b2df3d0..691e3f22a 100644 --- a/src/tests/meson.build +++ b/src/tests/meson.build @@ -446,6 +446,7 @@ stacking_tests = [ 'workspace-test', 'always-on-top', 'focus-default-window-globally-active-input', + 'workspace-unmanaging-window', ] foreach stacking_test: stacking_tests diff --git a/src/tests/stacking/workspace-unmanaging-window.metatest b/src/tests/stacking/workspace-unmanaging-window.metatest new file mode 100644 index 000000000..32f63a524 --- /dev/null +++ b/src/tests/stacking/workspace-unmanaging-window.metatest @@ -0,0 +1,11 @@ +num_workspaces 2 +activate_workspace 0 + +new_client 1 wayland +create 1/1 +show 1/1 +wait + +quit_client 1 +activate_workspace 1 +wait