From 0c9cb02111908409285991e4b0f44a4fdcf91eed Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Tue, 23 Jan 2018 11:43:09 +0100
Subject: [PATCH 1/2] session: use initial workspace if no workspace set
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Having “on_all_workspaces_requested” FALSE on a window does not imply a
workspace is set.

If the X11 window is placed on a secondary monitor while workspaces
applies on primary monitor only  (“workspaces-only-on-primary” set) then
“on_all_workspaces_requested” is FALSE while “on_all_workspaces“ is TRUE
and the associated workspace is NULL, leading to a crash when saving the
gnome-shell/mutter session.

So if no workspace is set, use the “initial_workspace” instead to avoid
a NULL pointer dereference.

https://bugzilla.gnome.org/show_bug.cgi?id=792818
---
 src/x11/session.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/x11/session.c b/src/x11/session.c
index af64270a6..8b2a89f1c 100644
--- a/src/x11/session.c
+++ b/src/x11/session.c
@@ -950,7 +950,10 @@ save_state (void)
               fputs ("    <sticky/>\n", outfile);
             } else {
               int n;
-              n = meta_workspace_index (window->workspace);
+              if (window->workspace)
+                n = meta_workspace_index (window->workspace);
+              else
+                n = window->initial_workspace;
               fprintf (outfile,
                        "    <workspace index=\"%d\"/>\n", n);
             }
-- 
2.14.3


From e2269448dcebd24f23bb8872590204819abc3ac0 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Mon, 29 Jan 2018 16:58:46 +0100
Subject: [PATCH 2/2] =?UTF-8?q?x11/window:=20Mark=20restored=20workspace?=
 =?UTF-8?q?=20as=20=E2=80=9Cset=E2=80=9D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When a window's workspace is not NULL, on_all_workspace should be FALSE.
Similarly, when on_all_workspace is TRUE, the window workspace should be
NULL.

This is an assumption in multiple places in the code, including when
setting the workspace state, the window is either added or removed from
all workspaces only if the window's workspace is NULL.

This rule is initially enforced at creation in _meta_window_shared_new()
when a initial workspace is set. However, when the initial workspace is
set from the session info, the initial workspace is not marked as “set”
which leads to an assertion failure when unmanaging windows, because the
window is not removed from all the workspaces.

When applying the session info to a window, mark the workspace as “set”.

https://gitlab.gnome.org/GNOME/mutter/issues/4

Closes: #4
---
 src/x11/window-x11.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index 36a5e70a3..9c8ef5d75 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -466,6 +466,7 @@ meta_window_apply_session_info (MetaWindow *window,
           MetaWorkspace *workspace = spaces->data;
 
           meta_window_change_workspace (window, workspace);
+          window->initial_workspace_set = TRUE;
 
           meta_topic (META_DEBUG_SM,
                       "Restoring saved window %s to workspace %d\n",
-- 
2.14.3

