From a79d2afb2d6119ae3a4d1eba020d6c35b3fece23 Mon Sep 17 00:00:00 2001 From: Neal Gompa Date: Fri, 29 Oct 2021 09:33:06 -0400 Subject: [PATCH 1/2] classic: Add X-GNOME-SessionRegisters GDM has supported sessions registering with it for a few years now so it can know when to shut down the greeter. Having the GNOME Classic session declare that it will register itself allows GDM to avoid executing a fallback codepath. This has been supported with the regular GNOME session for a while, and this session was likely forgotten about when it was added there. Part-of: --- data/gnome-classic.desktop.in | 1 + 1 file changed, 1 insertion(+) diff --git a/data/gnome-classic.desktop.in b/data/gnome-classic.desktop.in index 5df6821..13da2b5 100644 --- a/data/gnome-classic.desktop.in +++ b/data/gnome-classic.desktop.in @@ -5,3 +5,4 @@ Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session TryExec=gnome-session Type=Application DesktopNames=GNOME-Classic;GNOME; +X-GDM-SessionRegisters=true -- 2.33.1 From eb517c851777067087c3bf067c2baf10dcaf4128 Mon Sep 17 00:00:00 2001 From: Neal Gompa Date: Fri, 29 Oct 2021 09:37:33 -0400 Subject: [PATCH 2/2] classic: Install the session for Wayland and ship override sessions The regular GNOME session ships with three options: * GNOME * GNOME on Wayland (available when GDM starts in X11) * GNOME on Xorg (available when GDM starts in Wayland) The main GNOME session is set up so it works to match how GDM starts, so GNOME is on Wayland if GDM is (or GNOME is on X11 if GDM is). For GNOME Classic, we are missing this setup, so port this behavior over from the GNOME session setup. Part-of: --- data/gnome-classic-wayland.desktop.in | 8 ++++++ data/gnome-classic-xorg.desktop.in | 8 ++++++ data/meson.build | 40 +++++++++++++++++++++------ meson.build | 5 ++++ meson/session-post-install.py | 20 ++++++++++++++ 5 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 data/gnome-classic-wayland.desktop.in create mode 100644 data/gnome-classic-xorg.desktop.in create mode 100755 meson/session-post-install.py diff --git a/data/gnome-classic-wayland.desktop.in b/data/gnome-classic-wayland.desktop.in new file mode 100644 index 0000000..7287c68 --- /dev/null +++ b/data/gnome-classic-wayland.desktop.in @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=GNOME Classic on Wayland +Comment=This session logs you into GNOME Classic +Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session +TryExec=gnome-session +Type=Application +DesktopNames=GNOME-Classic;GNOME; +X-GDM-SessionRegisters=true diff --git a/data/gnome-classic-xorg.desktop.in b/data/gnome-classic-xorg.desktop.in new file mode 100644 index 0000000..5fb338a --- /dev/null +++ b/data/gnome-classic-xorg.desktop.in @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=GNOME Classic on Xorg +Comment=This session logs you into GNOME Classic +Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session +TryExec=gnome-session +Type=Application +DesktopNames=GNOME-Classic;GNOME; +X-GDM-SessionRegisters=true diff --git a/data/meson.build b/data/meson.build index 27f4287..47fe798 100644 --- a/data/meson.build +++ b/data/meson.build @@ -1,12 +1,34 @@ -session_desktop = 'gnome-classic.desktop' -i18n.merge_file('', - input: session_desktop + '.in', - output: session_desktop, - po_dir: '../po', - install: true, - install_dir: xsessiondir, - type: 'desktop' -) +session_desktop_base = 'gnome-classic' + +session_desktops = [ + session_desktop_base, + session_desktop_base + '-xorg', + session_desktop_base + '-wayland', +] + +foreach name: session_desktops + session_desktop = name + '.desktop' + if name.endswith('-xorg') + session_instdir = xsessiondir + elif name.endswith('-wayland') + session_instdir = wlsessiondir + else + # FIXME: The same target can not be copied into two directories. + # There is a workaround in meson/session-post-install.py until proper + # solution arises: + # https://github.com/mesonbuild/meson/issues/2416 + session_instdir = xsessiondir + #session_instdir = [ xesssiondir, wlsessiondir ] + endif + i18n.merge_file('', + input: session_desktop + '.in', + output: session_desktop, + po_dir: '../po', + install: true, + install_dir: session_instdir, + type: 'desktop' + ) +endforeach classic_uuids = [] foreach e : classic_extensions diff --git a/meson.build b/meson.build index 8f2afda..33006b3 100644 --- a/meson.build +++ b/meson.build @@ -20,6 +20,7 @@ themedir = join_paths(shelldir, 'theme') schemadir = join_paths(datadir, 'glib-2.0', 'schemas') sessiondir = join_paths(datadir, 'gnome-session', 'sessions') xsessiondir = join_paths(datadir, 'xsessions') +wlsessiondir = join_paths(datadir, 'wayland-sessions') ver_arr = meson.project_version().split('.') shell_version = ver_arr[0] @@ -83,6 +84,10 @@ endforeach if classic_mode_enabled subdir('data') + meson.add_install_script( + 'meson/session-post-install.py', + join_paths(get_option('prefix'), datadir) + ) endif subdir('extensions') diff --git a/meson/session-post-install.py b/meson/session-post-install.py new file mode 100755 index 0000000..36abe5e --- /dev/null +++ b/meson/session-post-install.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 + +import os +import shutil +import sys + +if os.environ.get('DESTDIR'): + install_root = os.environ.get('DESTDIR') + os.path.abspath(sys.argv[1]) +else: + install_root = sys.argv[1] + +# FIXME: Meson is unable to copy a generated target file: +# https://groups.google.com/forum/#!topic/mesonbuild/3iIoYPrN4P0 +dst_dir = os.path.join(install_root, 'wayland-sessions') +if not os.path.exists(dst_dir): + os.makedirs(dst_dir) + +src = os.path.join(install_root, 'xsessions', 'gnome-classic.desktop') +dst = os.path.join(dst_dir, 'gnome-classic.desktop') +shutil.copyfile(src, dst) -- 2.33.1