diff options
-rw-r--r-- | data/lightdm-gtk-greeter.conf | 6 | ||||
-rw-r--r-- | src/greeterconfiguration.h | 2 | ||||
-rw-r--r-- | src/lightdm-gtk-greeter.c | 73 |
3 files changed, 70 insertions, 11 deletions
diff --git a/data/lightdm-gtk-greeter.conf b/data/lightdm-gtk-greeter.conf index 2a20ef0..858b40a 100644 --- a/data/lightdm-gtk-greeter.conf +++ b/data/lightdm-gtk-greeter.conf @@ -32,7 +32,8 @@ # Panel: # panel-position = top|bottom ("top" by default) # clock-format = strftime-format string, e.g. %H:%M -# indicators = semi-colon ";" separated list of allowed indicator modules. Built-in indicators include "~a11y", "~language", "~session", "~power", "~clock", "~host", "~spacer". Unity indicators can be represented by short name (e.g. "sound", "power"), service file name, or absolute path +# indicators = semi-colon ";" separated list of allowed indicator modules. Built-in indicators include "~a11y", "~language", "~session", "~power", "~clock", "~host", "~spacer", "~layout". Unity indicators can be represented by short name (e.g. "sound", "power"), service file name, or absolute path +# keyboard-layouts = semi-colon ";" separated list keyboard layouts to be listed by the "~layout" indicator (empty by default which provides all available layouts) # # Accessibility: # a11y-states = states of accessibility features: "name" - save state on exit, "-name" - disabled at start (default value for unlisted), "+name" - enabled at start. Allowed names: contrast, font, keyboard, reader. @@ -45,6 +46,9 @@ # allow-debugging = false|true ("false" by default) # screensaver-timeout = Timeout (in seconds) until the screen blanks when the greeter is called as lockscreen # +# Session: +# default-session = session manager to be started when none has been selected by the user and no one is set as last used (unset by default) +# # Template for per-monitor configuration: # [monitor: name] # background = overrides default value diff --git a/src/greeterconfiguration.h b/src/greeterconfiguration.h index 9e1b452..24028c1 100644 --- a/src/greeterconfiguration.h +++ b/src/greeterconfiguration.h @@ -16,6 +16,7 @@ #define CONFIG_GROUP_DEFAULT "greeter" #define CONFIG_KEY_INDICATORS "indicators" +#define CONFIG_KEY_DEFAULT_SESSION "default-session" #define CONFIG_KEY_DEBUGGING "allow-debugging" #define CONFIG_KEY_SCREENSAVER_TIMEOUT "screensaver-timeout" #define CONFIG_KEY_THEME "theme-name" @@ -32,6 +33,7 @@ #define CONFIG_KEY_ROUND_USER_IMAGE "round-user-image" #define CONFIG_KEY_HIGHLIGHT_LOGGED_USER "highlight-logged-user" #define CONFIG_KEY_KEYBOARD "keyboard" +#define CONFIG_KEY_KEYBOARD_LAYOUTS "keyboard-layouts" #define CONFIG_KEY_READER "reader" #define CONFIG_KEY_CLOCK_FORMAT "clock-format" #define CONFIG_KEY_ACTIVE_MONITOR "active-monitor" diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c index 0504ea0..88cc44b 100644 --- a/src/lightdm-gtk-greeter.c +++ b/src/lightdm-gtk-greeter.c @@ -1002,6 +1002,7 @@ static void set_session (const gchar *session) { gchar *last_session = NULL; + gchar *greeter_default_session = NULL; GList *sessions = lightdm_get_sessions (); /* Validation */ @@ -1015,16 +1016,23 @@ set_session (const gchar *session) else { /* default */ - const gchar* default_session = lightdm_greeter_get_default_session_hint (greeter); - if (g_strcmp0 (session, default_session) != 0 && - is_valid_session (sessions, default_session)) - session = default_session; - /* first in the sessions list */ - else if (sessions) - session = lightdm_session_get_key (sessions->data); - /* give up */ + greeter_default_session = config_get_string (NULL, CONFIG_KEY_DEFAULT_SESSION, NULL); + if (greeter_default_session && g_strcmp0 (session, greeter_default_session) != 0 && + is_valid_session (sessions, greeter_default_session)) + session = greeter_default_session; else - session = NULL; + { + const gchar* default_session = lightdm_greeter_get_default_session_hint (greeter); + if (g_strcmp0 (session, default_session) != 0 && + is_valid_session (sessions, default_session)) + session = default_session; + /* first in the sessions list */ + else if (sessions) + session = lightdm_session_get_key (sessions->data); + /* give up */ + else + session = NULL; + } } } @@ -1060,6 +1068,7 @@ set_session (const gchar *session) g_free (current_session); current_session = g_strdup (session); g_free (last_session); + g_free (greeter_default_session); } void @@ -1755,6 +1764,13 @@ layout_selected_cb (GtkCheckMenuItem *menuitem, gpointer user_data) static void update_layouts_menu (void) { + gchar **layouts; + gsize num_layouts = 0; + + layouts = config_get_string_list (NULL, CONFIG_KEY_KEYBOARD_LAYOUTS, NULL); + if (layouts) + num_layouts = g_strv_length (layouts); + #ifdef HAVE_LIBXKLAVIER XklConfigRegistry *registry; XklConfigRec *config; @@ -1783,6 +1799,23 @@ update_layouts_menu (void) const gchar *variant = config->variants[i] ? config->variants[i] : ""; gchar *label = strlen (variant) > 0 ? g_strdup_printf ("%s_%s", layout, variant) : g_strdup (layout); + /* is the keyboard layout part of keyboard-layouts? */ + if (num_layouts) { + gboolean layout_in_config = FALSE; + for (gint j = 0; j < num_layouts; ++j) + { + if (g_strcmp0 (layouts[j], label) == 0) + { + layout_in_config = TRUE; + break; + } + } + if (!layout_in_config) { + g_free(label); + continue; + } + } + GtkWidget *menuitem = gtk_radio_menu_item_new (menu_group); menu_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); @@ -1819,6 +1852,23 @@ update_layouts_menu (void) for (item = lightdm_get_layouts (); item; item = g_list_next (item)) { LightDMLayout *layout = item->data; + + /* is the keyboard layout part of keyboard-layouts? */ + if (num_layouts) { + gboolean layout_in_config = FALSE; + for (gint j = 0; j < num_layouts; ++j) + { + if (g_strcmp0 (layouts[j], lightdm_layout_get_name (layout)) == 0) + { + layout_in_config = TRUE; + break; + } + } + if (!layout_in_config) { + continue; + } + } + GtkWidget *menuitem = gtk_radio_menu_item_new (menu_group); menu_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); @@ -1833,6 +1883,9 @@ update_layouts_menu (void) gtk_widget_show (GTK_WIDGET (menuitem)); } #endif + + if (layouts) + g_strfreev (layouts); } static void @@ -2390,7 +2443,7 @@ set_displayed_user (LightDMGreeter *ldm, const gchar *username) else { set_language (lightdm_language_get_code (lightdm_get_language ())); - set_session (lightdm_greeter_get_default_session_hint (ldm)); + set_session (NULL); } gtk_widget_set_tooltip_text (GTK_WIDGET (user_combo), user_tooltip); start_authentication (username); |