Merge pull request #73378 from worldofpeace/gdm-default-session
nixos/gdm: make desktopManager.default work
This commit is contained in:
commit
bec88e1110
|
@ -31,6 +31,44 @@ let
|
|||
load-module module-position-event-sounds
|
||||
'';
|
||||
|
||||
dmDefault = config.services.xserver.desktopManager.default;
|
||||
wmDefault = config.services.xserver.windowManager.default;
|
||||
hasDefaultUserSession = dmDefault != "none" || wmDefault != "none";
|
||||
defaultSessionName = dmDefault + optionalString (wmDefault != "none") ("+" + wmDefault);
|
||||
|
||||
setSessionScript = pkgs.python3.pkgs.buildPythonApplication {
|
||||
name = "set-session";
|
||||
|
||||
format = "other";
|
||||
|
||||
src = ./set-session.py;
|
||||
|
||||
dontUnpack = true;
|
||||
|
||||
strictDeps = false;
|
||||
|
||||
nativeBuildInputs = with pkgs; [
|
||||
wrapGAppsHook
|
||||
gobject-introspection
|
||||
];
|
||||
|
||||
buildInputs = with pkgs; [
|
||||
accountsservice
|
||||
glib
|
||||
];
|
||||
|
||||
propagatedBuildInputs = with pkgs.python3.pkgs; [
|
||||
pygobject3
|
||||
ordered-set
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
cp $src $out/bin/set-session
|
||||
chmod +x $out/bin/set-session
|
||||
'';
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
@ -156,6 +194,8 @@ in
|
|||
cat - > /run/gdm/.config/gnome-initial-setup-done <<- EOF
|
||||
yes
|
||||
EOF
|
||||
'' + optionalString hasDefaultUserSession ''
|
||||
${setSessionScript}/bin/set-session ${defaultSessionName}
|
||||
'';
|
||||
};
|
||||
|
||||
|
|
85
nixos/modules/services/x11/display-managers/set-session.py
Executable file
85
nixos/modules/services/x11/display-managers/set-session.py
Executable file
|
@ -0,0 +1,85 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import gi, argparse, os, logging, sys
|
||||
|
||||
gi.require_version("AccountsService", "1.0")
|
||||
from gi.repository import AccountsService, GLib
|
||||
from ordered_set import OrderedSet
|
||||
|
||||
|
||||
def get_session_file(session):
|
||||
system_data_dirs = GLib.get_system_data_dirs()
|
||||
|
||||
session_dirs = OrderedSet(
|
||||
os.path.join(data_dir, session)
|
||||
for data_dir in system_data_dirs
|
||||
for session in {"wayland-sessions", "xsessions"}
|
||||
)
|
||||
|
||||
session_files = OrderedSet(
|
||||
os.path.join(dir, session + ".desktop")
|
||||
for dir in session_dirs
|
||||
if os.path.exists(os.path.join(dir, session + ".desktop"))
|
||||
)
|
||||
|
||||
# Deal with duplicate wayland-sessions and xsessions.
|
||||
# Needed for the situation in gnome-session, where there's
|
||||
# a xsession named the same as a wayland session.
|
||||
if any(map(is_session_wayland, session_files)):
|
||||
session_files = OrderedSet(
|
||||
session for session in session_files if is_session_wayland(session)
|
||||
)
|
||||
else:
|
||||
session_files = OrderedSet(
|
||||
session for session in session_files if is_session_xsession(session)
|
||||
)
|
||||
|
||||
if len(session_files) == 0:
|
||||
logging.warning("No session files are found.")
|
||||
sys.exit(0)
|
||||
else:
|
||||
return session_files[0]
|
||||
|
||||
|
||||
def is_session_xsession(session_file):
|
||||
return "/xsessions/" in session_file
|
||||
|
||||
|
||||
def is_session_wayland(session_file):
|
||||
return "/wayland-sessions/" in session_file
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Set session type for all normal users."
|
||||
)
|
||||
parser.add_argument("session", help="Name of session to set.")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
session = getattr(args, "session")
|
||||
session_file = get_session_file(session)
|
||||
|
||||
user_manager = AccountsService.UserManager.get_default()
|
||||
users = user_manager.list_users()
|
||||
|
||||
for user in users:
|
||||
if user.is_system_account():
|
||||
continue
|
||||
else:
|
||||
if is_session_wayland(session_file):
|
||||
logging.debug(
|
||||
f"Setting session name: {session}, as we found the existing wayland-session: {session_file}"
|
||||
)
|
||||
user.set_session(session)
|
||||
elif is_session_xsession(session_file):
|
||||
logging.debug(
|
||||
f"Setting session name: {session}, as we found the existing xsession: {session_file}"
|
||||
)
|
||||
user.set_x_session(session)
|
||||
else:
|
||||
raise Exception(f"Couldn't figure out session type for {session_file}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in a new issue