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()
 |