Blame SOURCES/0001-shell-app-Handle-workspace-from-startup-notification.patch

28ed8f
From 391f262aee82ac12fcf99951d6b2df362f734b31 Mon Sep 17 00:00:00 2001
28ed8f
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
28ed8f
Date: Mon, 15 Jun 2020 20:41:45 +0200
28ed8f
Subject: [PATCH] shell/app: Handle workspace from startup notifications
28ed8f
28ed8f
Launching applications on a particular workspace works through
28ed8f
launch contexts and startup notifications. While this is no
28ed8f
longer required by a launcher/WM split, in theory this allows
28ed8f
us to reliably identify the correct window to apply startup
28ed8f
properties to.
28ed8f
28ed8f
However in practice we fail more often than not: Missing support in
28ed8f
toolkits, differences between display protocols, D-Bus activation
28ed8f
and single-instance applications all provide their own pitfalls.
28ed8f
28ed8f
So instead, take advantage of the fact that launcher and WM live in
28ed8f
the same process, and go with the unsophisticated approach: Just
28ed8f
remember the last workspace that was requested when launching an
28ed8f
app, then move the next window that is associated with the app to
28ed8f
that workspace.
28ed8f
28ed8f
This will break X11 applications that set an initial workspace, but
28ed8f
that's legacy functionality anyway (given that there's no wayland
28ed8f
protocol for that functionality), and seems a price worth paying
28ed8f
for making launching apps on workspaces more reliable.
28ed8f
---
28ed8f
 src/shell-app.c | 19 +++++++++++--------
28ed8f
 1 file changed, 11 insertions(+), 8 deletions(-)
28ed8f
28ed8f
diff --git a/src/shell-app.c b/src/shell-app.c
28ed8f
index 7d40186c9..f716bc5f8 100644
28ed8f
--- a/src/shell-app.c
28ed8f
+++ b/src/shell-app.c
28ed8f
@@ -1067,6 +1067,10 @@ _shell_app_add_window (ShellApp        *app,
28ed8f
   if (!app->running_state)
28ed8f
       create_running_state (app);
28ed8f
 
28ed8f
+  if (app->started_on_workspace >= 0)
28ed8f
+    meta_window_change_workspace_by_index (window, app->started_on_workspace, FALSE);
28ed8f
+  app->started_on_workspace = -1;
28ed8f
+
28ed8f
   app->running_state->window_sort_stale = TRUE;
28ed8f
   app->running_state->windows = g_slist_prepend (app->running_state->windows, g_object_ref (window));
28ed8f
   g_signal_connect_object (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app, 0);
28ed8f
@@ -1156,16 +1160,14 @@ _shell_app_handle_startup_sequence (ShellApp            *app,
28ed8f
       shell_app_state_transition (app, SHELL_APP_STATE_STARTING);
28ed8f
       meta_x11_display_focus_the_no_focus_window (x11_display,
28ed8f
                                                   meta_startup_sequence_get_timestamp (sequence));
28ed8f
-      app->started_on_workspace = meta_startup_sequence_get_workspace (sequence);
28ed8f
     }
28ed8f
 
28ed8f
-  if (!starting)
28ed8f
-    {
28ed8f
-      if (app->running_state && app->running_state->windows)
28ed8f
-        shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
28ed8f
-      else /* application have > 1 .desktop file */
28ed8f
-        shell_app_state_transition (app, SHELL_APP_STATE_STOPPED);
28ed8f
-    }
28ed8f
+  if (starting)
28ed8f
+    app->started_on_workspace = meta_startup_sequence_get_workspace (sequence);
28ed8f
+  else if (app->running_state && app->running_state->windows)
28ed8f
+    shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
28ed8f
+  else /* application have > 1 .desktop file */
28ed8f
+    shell_app_state_transition (app, SHELL_APP_STATE_STOPPED);
28ed8f
 }
28ed8f
 
28ed8f
 /**
28ed8f
@@ -1473,6 +1475,7 @@ static void
28ed8f
 shell_app_init (ShellApp *self)
28ed8f
 {
28ed8f
   self->state = SHELL_APP_STATE_STOPPED;
28ed8f
+  self->started_on_workspace = -1;
28ed8f
 }
28ed8f
 
28ed8f
 static void
28ed8f
-- 
28ed8f
2.29.2
28ed8f