87 lines
2.6 KiB
Python
Executable File
87 lines
2.6 KiB
Python
Executable File
#!/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:
|
|
logging.error(f"Couldn't figure out session type for {session_file}")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|