|
|
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 |
|