From ce7f53a5ec2f4792d73c8b2ed45f035b305b1685 Mon Sep 17 00:00:00 2001 From: Martin Stransky Date: Fri, 24 Jul 2020 11:59:38 +0000 Subject: [PATCH] Bug 1645776 [Linux/Gtk] Workspace restore - get window manager name only when XDG_CURRENT_DESKTOP is missing and check/ship widget.disable-workspace-management to disable it, r=jhorak Differential Revision: https://phabricator.services.mozilla.com/D84515 --- modules/libpref/init/all.js | 1 + widget/gtk/nsWindow.cpp | 57 +++++++++++++++++++++---------------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 1d3038973dee..990e7e522f68 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -3824,6 +3824,7 @@ pref("network.psl.onUpdate_notify", false); #ifdef MOZ_WIDGET_GTK pref("gfx.xrender.enabled",false); pref("widget.content.gtk-theme-override", ""); + pref("widget.disable-workspace-management", false); #endif #ifdef MOZ_WAYLAND pref("widget.wayland_vsync.enabled", false); diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp index f2296d000dea..8390ea861076 100644 --- a/widget/gtk/nsWindow.cpp +++ b/widget/gtk/nsWindow.cpp @@ -1889,35 +1889,42 @@ static bool GetWindowManagerName(GdkWindow* gdk_window, nsACString& wmName) { #define kDesktopMutterSchema "org.gnome.mutter" #define kDesktopDynamicWorkspacesKey "dynamic-workspaces" -static bool DesktopUsesDynamicWorkspaces(GdkWindow* gdk_window) { - nsAutoCString wmName; - if (GetWindowManagerName(gdk_window, wmName)) { - if (wmName.EqualsLiteral("bspwm")) { - return true; - } - - if (wmName.EqualsLiteral("i3")) { - return true; - } +static bool WorkspaceManagementDisabled(GdkWindow* gdk_window) { + if (Preferences::GetBool("widget.disable-workspace-management", false)) { + return true; } static const char* currentDesktop = getenv("XDG_CURRENT_DESKTOP"); - if (!currentDesktop || !strstr(currentDesktop, "GNOME")) { - return false; + if (currentDesktop && strstr(currentDesktop, "GNOME")) { + // Gnome uses dynamic workspaces by default so disable workspace management + // in that case. + bool usesDynamicWorkspaces = true; + nsCOMPtr gsettings = + do_GetService(NS_GSETTINGSSERVICE_CONTRACTID); + if (gsettings) { + nsCOMPtr mutterSettings; + gsettings->GetCollectionForSchema(nsLiteralCString(kDesktopMutterSchema), + getter_AddRefs(mutterSettings)); + if (mutterSettings) { + bool usesDynamicWorkspaces; + if (NS_SUCCEEDED(mutterSettings->GetBoolean( + nsLiteralCString(kDesktopDynamicWorkspacesKey), + &usesDynamicWorkspaces))) { + } + } + } + return usesDynamicWorkspaces; } - nsCOMPtr gsettings = - do_GetService(NS_GSETTINGSSERVICE_CONTRACTID); - if (gsettings) { - nsCOMPtr mutterSettings; - gsettings->GetCollectionForSchema(nsLiteralCString(kDesktopMutterSchema), - getter_AddRefs(mutterSettings)); - if (mutterSettings) { - bool usesDynamicWorkspaces; - if (NS_SUCCEEDED(mutterSettings->GetBoolean( - nsLiteralCString(kDesktopDynamicWorkspacesKey), - &usesDynamicWorkspaces))) { - return usesDynamicWorkspaces; + // When XDG_CURRENT_DESKTOP is missing, try to get window manager name. + if (!currentDesktop) { + nsAutoCString wmName; + if (GetWindowManagerName(gdk_window, wmName)) { + if (wmName.EqualsLiteral("bspwm")) { + return true; + } + if (wmName.EqualsLiteral("i3")) { + return true; } } } @@ -1937,7 +1944,7 @@ void nsWindow::GetWorkspaceID(nsAString& workspaceID) { return; } - if (DesktopUsesDynamicWorkspaces(gdk_window)) { + if (WorkspaceManagementDisabled(gdk_window)) { return; }