aboutsummaryrefslogtreecommitdiff
path: root/src/session-list.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/session-list.vala')
-rw-r--r--src/session-list.vala184
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)