summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/lightdm-gtk-greeter.conf6
-rw-r--r--src/greeterconfiguration.h2
-rw-r--r--src/lightdm-gtk-greeter.c73
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);