plugins/default: Fix broken switch_workspace()
Swap which windows are switched with which in the workspace switching animation of the default plugin since this was backwards (resulting in failures), but animate only those which are on either the current workspace or the one to switch to. Have the animation span the entire screen as intended. Related: https://gitlab.gnome.org/GNOME/mutter/-/issues/2038 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2076>
This commit is contained in:
parent
f04f5d70e6
commit
888e69d3a4
1 changed files with 50 additions and 41 deletions
|
@ -503,11 +503,16 @@ switch_workspace (MetaPlugin *plugin,
|
|||
MetaDisplay *display;
|
||||
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
|
||||
GList *l;
|
||||
ClutterActor *workspace0 = clutter_actor_new ();
|
||||
ClutterActor *workspace1 = clutter_actor_new ();
|
||||
ClutterActor *stage;
|
||||
ClutterActor *workspace1, *workspace2;
|
||||
int screen_width, screen_height;
|
||||
|
||||
if (from == to)
|
||||
{
|
||||
meta_plugin_switch_workspace_completed (plugin);
|
||||
return;
|
||||
}
|
||||
|
||||
display = meta_plugin_get_display (plugin);
|
||||
stage = meta_get_stage_for_display (display);
|
||||
|
||||
|
@ -515,66 +520,70 @@ switch_workspace (MetaPlugin *plugin,
|
|||
&screen_width,
|
||||
&screen_height);
|
||||
|
||||
workspace1 = clutter_actor_new ();
|
||||
workspace2 = clutter_actor_new ();
|
||||
|
||||
clutter_actor_set_pivot_point (workspace1, 1.0, 1.0);
|
||||
clutter_actor_set_position (workspace1,
|
||||
screen_width,
|
||||
screen_height);
|
||||
clutter_actor_set_size (workspace1,
|
||||
screen_width,
|
||||
screen_height);
|
||||
clutter_actor_set_size (workspace2,
|
||||
screen_width,
|
||||
screen_height);
|
||||
|
||||
clutter_actor_set_scale (workspace1, 0.0, 0.0);
|
||||
|
||||
clutter_actor_add_child (stage, workspace1);
|
||||
clutter_actor_add_child (stage, workspace0);
|
||||
clutter_actor_add_child (stage, workspace2);
|
||||
|
||||
if (from == to)
|
||||
{
|
||||
meta_plugin_switch_workspace_completed (plugin);
|
||||
return;
|
||||
}
|
||||
|
||||
l = g_list_last (meta_get_window_actors (display));
|
||||
|
||||
while (l)
|
||||
for (l = g_list_last (meta_get_window_actors (display)); l; l = l->prev)
|
||||
{
|
||||
MetaWindowActor *window_actor = l->data;
|
||||
ActorPrivate *apriv = get_actor_private (window_actor);
|
||||
ClutterActor *actor = CLUTTER_ACTOR (window_actor);
|
||||
MetaWorkspace *workspace;
|
||||
gint win_workspace;
|
||||
MetaWindow *window;
|
||||
|
||||
workspace = meta_window_get_workspace (meta_window_actor_get_meta_window (window_actor));
|
||||
win_workspace = meta_workspace_index (workspace);
|
||||
window = meta_window_actor_get_meta_window (window_actor);
|
||||
|
||||
if (win_workspace == to || win_workspace == from)
|
||||
{
|
||||
ClutterActor *parent = win_workspace == to ? workspace1 : workspace0;
|
||||
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_show (actor);
|
||||
clutter_actor_set_child_below_sibling (parent, actor, NULL);
|
||||
g_object_unref (actor);
|
||||
}
|
||||
else if (win_workspace < 0)
|
||||
if (meta_window_is_on_all_workspaces (window))
|
||||
{
|
||||
/* Sticky window */
|
||||
apriv->orig_parent = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Window on some other desktop */
|
||||
clutter_actor_hide (actor);
|
||||
apriv->orig_parent = NULL;
|
||||
}
|
||||
MetaWorkspace *workspace;
|
||||
gint win_workspace;
|
||||
|
||||
l = l->prev;
|
||||
workspace = meta_window_get_workspace (window);
|
||||
win_workspace = 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);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
priv->desktop1 = workspace0;
|
||||
priv->desktop2 = workspace1;
|
||||
priv->desktop1 = workspace1;
|
||||
priv->desktop2 = workspace2;
|
||||
|
||||
priv->tml_switch_workspace1 = actor_animate (workspace0, CLUTTER_EASE_IN_SINE,
|
||||
priv->tml_switch_workspace1 = actor_animate (workspace1, CLUTTER_EASE_IN_SINE,
|
||||
ANIMATION_SWITCH,
|
||||
"scale-x", 1.0,
|
||||
"scale-y", 1.0,
|
||||
|
@ -584,7 +593,7 @@ switch_workspace (MetaPlugin *plugin,
|
|||
G_CALLBACK (on_switch_workspace_effect_complete),
|
||||
plugin);
|
||||
|
||||
priv->tml_switch_workspace2 = actor_animate (workspace1, CLUTTER_EASE_IN_SINE,
|
||||
priv->tml_switch_workspace2 = actor_animate (workspace2, CLUTTER_EASE_IN_SINE,
|
||||
ANIMATION_SWITCH,
|
||||
"scale-x", 0.0,
|
||||
"scale-y", 0.0,
|
||||
|
|
Loading…
Add table
Reference in a new issue