diff options
Diffstat (limited to 'src/session-list.vala')
-rw-r--r-- | src/session-list.vala | 184 |
1 files changed, 140 insertions, 44 deletions
diff --git a/src/session-list.vala b/src/session-list.vala index 735ca1f..c4e865f 100644 --- a/src/session-list.vala +++ b/src/session-list.vala @@ -47,14 +47,56 @@ public class SessionPrompt : PromptBox } else { - var sessions = LightDM.get_sessions().copy(); - sessions.sort_with_data((a, b) => GLib.strcmp (a.name.casefold().collate_key(), b.name.casefold().collate_key())); - foreach (var session in sessions) + /* Pick the selected session (if any) and add it as first item. + */ + var dm_sessions = LightDM.get_sessions().copy(); + foreach (var dm_session in dm_sessions) { + if (dm_session.key == session) { + debug ("Adding session %s (%s) as first entry", dm_session.key, dm_session.name); + box.add_item (dm_session.key, dm_session.name, SessionList.get_badge (dm_session.key)); + break; + } + } + /* Pick the default session (if different from selected session) and add it as next item. + * + * In SUSE and derivatives, LightDM ships a distro-specific patch that hides the default.desktop + * (and other) symlink(s) from LightDM. + * https://build.opensuse.org/projects/X11:Utilities/packages/lightdm/files/lightdm-ignore-known-symlink-sessions.patch?expand=1 + * + * So the next if-clause won't take effect on SUSE-based systems. + */ + if (session != default_session) { + foreach (var dm_session in dm_sessions) + { + if (dm_session.key == default_session) { + debug ("Adding session %s (%s) as second entry", dm_session.key, dm_session.name); + box.add_item (dm_session.key, dm_session.name, SessionList.get_badge (dm_session.key)); + break; + } + } + } + + dm_sessions.sort_with_data((a, b) => GLib.strcmp (a.name.casefold().collate_key(), b.name.casefold().collate_key())); + foreach (var dm_session in dm_sessions) + { + /* Skip the selected session, we already have added that as first time. + */ + if (dm_session.key == session) { + continue; + } + + /* Skip the default session, we already have added that as first or second item + (depending on whether there was a selected session). + */ + if (dm_session.key == default_session) { + continue; + } + /* Apply hide x11/wayland filter */ - if (greeter.validate_session(session.key, false) != null) { - debug ("Adding session %s (%s)", session.key, session.name); - box.add_item (session.key, session.name, SessionList.get_badge (session.key)); + if (greeter.validate_session(dm_session.key, false) != null) { + debug ("Adding session %s (%s)", dm_session.key, dm_session.name); + box.add_item (dm_session.key, dm_session.name, SessionList.get_badge (dm_session.key)); } } } @@ -79,6 +121,8 @@ public class SessionList : GreeterList private SessionPrompt prompt; + private const int BADGE_SIZE = 22; + public SessionList (Background bg, MenuBar mb, string? session, string? default_session) { Object (background: bg, menubar: mb, session: session, default_session: default_session); @@ -100,80 +144,88 @@ public class SessionList : GreeterList protected override void add_manual_entry () {} public override void show_authenticated (bool successful = true) {} - private static string? get_badge_name (string session) + private static string? get_badge_name_from_alias_list (string session) { + /* + * Only list aliases here, if the badge name can be derived from <session> + * via <session>_badge.(svg|png) then the badge file is found automatically. + */ switch (session) { - case "awesome": - return "awesome_badge.png"; case "budgie-desktop": return "budgie_badge.png"; - case "ubuntu": - case "ubuntu-2d": - case "unity": - return "ubuntu_badge.png"; + case "cairo-dock-fallback": + case "cairo-dock-unity": + return "cairo-dock_badge.svg"; + case "cinnamon-wayland": + case "cinnamon2d": + return "cinnamon_badge.svg"; + case "fvwm-crystal": + case "fvwm1": + return "fvwm_badge.png"; case "gnome-classic": + case "gnome-classic-xorg": + case "gnome-classic-wayland": case "gnome-flashback-compiz": case "gnome-flashback-metacity": case "gnome-shell": case "gnome-wayland": case "gnome-xorg": - case "gnome": case "openbox-gnome": return "gnome_badge.png"; - case "sle-classic": - return "sleclassic_badge.png"; case "wmaker-common": return "gnustep_badge.png"; - case "kde": + case "IceWM-Experimental": + case "IceWM-Lite": + case "IceWM": + case "icewm-session": + return "icewm_badge.png"; case "kde-plasma": case "openbox-kde": case "plasma": case "plasma5": case "plasmawayland": return "kde_badge.png"; - case "i3": case "i3-with-shmlog": return "i3_badge.png"; - case "sway": - return "sway_badge.svg"; + case "default": case "lightdm-xsession": return "xsession_badge.png"; - case "lomiri": - return "lomiri_badge.png"; - case "lxde": case "LXDE": + case "lubuntu-nexus7": + case "lxgames": + case "Lubuntu": + case "Lubuntu-Netbook": + case "QLubuntu": return "lxde_badge.png"; - case "lxqt": case "LXQt": return "lxqt_badge.png"; - case "matchbox": - return "matchbox_badge.png"; - case "mate": - return "mate_badge.png"; case "mir-shell": return "mirshell_badge.png"; - case "openbox": - return "openbox_badge.png"; - case "pademelon": - return "pademelon_badge.png"; - case "sugar": + case "sle-classic": + return "sleclassic_badge.png"; + case "sugar-session-0.84": + case "sugar-session-0.86": + case "sugar-session-0.88": + case "sugar-session-0.90": + case "sugar-session-0.96": + case "sugar-session-0.98": + case "usr": return "sugar_badge.png"; case "surf-display": return "surf_badge.png"; - case "twm": - return "twm_badge.png"; - case "xfce": + case "ubuntu-2d": + case "ubuntu-xorg": + case "unity": + return "ubuntu_badge.png"; + case "XBMC": + return "xbmc_badge.png"; + case "xubuntu": return "xfce_badge.png"; case "xterm": return "recovery_console_badge.png"; - case "xmonad": + case "gnome-xmonad": return "xmonad_badge.png"; - case "icewm": - case "icewm-session": - return "icewm_badge.png"; - case "fynedesk": - return "fynedesk_badge.svg"; case "remote-login": return "remote_login_help.png"; default: @@ -184,7 +236,47 @@ public class SessionList : GreeterList private static HashTable<string, Gdk.Pixbuf> badges; /* cache of badges */ public static Gdk.Pixbuf? get_badge (string session) { - var name = get_badge_name (session); + if (session == "default") + { + var sessions = LightDM.get_sessions().copy(); + foreach (var find_session in sessions) + { + if (find_session.key == "default") + { + foreach (var real_session in sessions) + { + // Skip the default session + if (real_session.key == "default") { + continue; + } + + // If we find the real session, use its key value for badge icon loading... + if (real_session.name == find_session.name) + { + session = real_session.key; + break; + } + } + break; + } + } + } + + var name = get_badge_name_from_alias_list (session); + + if (name == null) + { + var default_name_svg = "%s_badge.svg".printf (session); + var default_name_png = "%s_badge.png".printf (session); + var default_name_svg_path = Path.build_filename (Config.PKGDATADIR, default_name_svg, null); + var default_name_png_path = Path.build_filename (Config.PKGDATADIR, default_name_png, null); + if (FileUtils.test (default_name_svg_path, FileTest.EXISTS)) { + name = default_name_svg; + } + else if (FileUtils.test (default_name_png_path, FileTest.EXISTS)) { + name = default_name_png; + } + } if (name == null) { @@ -206,7 +298,11 @@ public class SessionList : GreeterList { try { - pixbuf = new Gdk.Pixbuf.from_file (Path.build_filename (Config.PKGDATADIR, name, null)); + var greeter = new ArcticaGreeter(); + + pixbuf = new Gdk.Pixbuf.from_file_at_size (Path.build_filename (Config.PKGDATADIR, name, null), + (int)(BADGE_SIZE * _scale_factor * greeter.scaling_factor_widgets), + (int)(BADGE_SIZE * _scale_factor * greeter.scaling_factor_widgets)); badges.insert (name, pixbuf); } catch (Error e) |