diff --git a/.cvsignore b/.cvsignore
index 16c1bc7..a421d93 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -1 +1 @@
-gdm-2.22.0.tar.gz
+gdm-2.23.1.tar.bz2
diff --git a/default.desktop b/default.desktop
deleted file mode 100644
index 51e9e17..0000000
--- a/default.desktop
+++ /dev/null
@@ -1,155 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-# The names/descriptions should really be better
-Name=Default System Session
-Name[af]=Verstekstelselsessie
-Name[ar]=جلسة النظام الافتراضية
-Name[az]=Ön Qurğulu Sistem İclası
-Name[be]=Дапомная сыстэмная сэсыя
-Name[bg]=Стандартна системна сесия
-Name[bn]=ডিফল্ট সিস্টেম সেশন
-Name[bn_IN]=সিস্টেমের ডিফল্ট সেশান
-Name[bs]=UobiÄŤajna sesija sistema
-Name[ca]=Sessió predeterminada del sistema
-Name[cs]=Implicitní sezení systému
-Name[cy]=Sesiwn Rhagosodedig y System
-Name[da]=Forvalgt systemsession
-Name[de]=Voreingestellte Systemsitzung
-Name[dz]=རིམ་ལུགས་སྔོན་སྒྲིག་ལཱ་ཡུན།
-Name[el]=Προεπιλεγμένη συνεδρία συστήματος
-Name[en_CA]=Default System Session
-Name[en_GB]=Default System Session
-Name[es]=Sesión predeterminada del sistema
-Name[et]=Vaikimisi süsteemne seanss
-Name[eu]=Sistema-saio lehenetsia
-Name[fa]=نشست پیشفرض سیستم
-Name[fi]=Järjestelmän oletusistunto
-Name[fr]=Session par défaut du système
-Name[gl]=Sesión por defecto do sistema
-Name[gu]=મૂળભૂત સિસ્ટમ સત્ર
-Name[he]=תצורת ההפעלה ברירת המחדל של המערכת
-Name[hi]=मूलभूत सिस्टम सत्र
-Name[hr]=Uobičajena sesija na sistemu
-Name[hu]=Alapértelmezett rendszerkörnyezet
-Name[id]=Sesi Sistem Standar
-Name[it]=Sessione di sistema predefinita
-Name[ja]=デフォルトのシステム・セッション
-Name[ka]=სისტემის სტანდარტული სესია
-Name[ko]=기본 시스템 세션
-Name[ku]=Rûniştina pergalê ya heyî
-Name[lt]=Numatytoji sistemos sesija
-Name[lv]=Noklusētā sistēmas sesija
-Name[mg]=Session'ny rafitra tsotra
-Name[mk]=Стандардна сесија
-Name[ml]=ഡീഫോള്ട്ട് സിസ്റ്റം സെഷന്
-Name[mn]=Системийн стандарт суулт
-Name[mr]=मुलभूत प्रणाली सत्र
-Name[ms]=Sesi Sistem Default
-Name[nb]=Forvalgt sesjon for systemet
-Name[ne]=पूर्वनिर्धारित प्रणाली सत्र
-Name[nl]=Standaard systeemsessie
-Name[nn]=Systemet si standardøkt
-Name[nso]=Lenaneo la Tshepedišo la Tlhaelelo
-Name[or]=ପୂର୍ବ ନିର୍ଦ୍ଧାରିତ ତନ୍ତ୍ର ଅଧିବେଶନ
-Name[pa]=ਮੂਲ ਸਿਸਟਮ ਅਜਲਾਸ
-Name[pl]=Domyślna sesja systemu
-Name[pt]=Sessão de Sistema por Omissão
-Name[pt_BR]=Sessão Padrão do Sistema
-Name[ro]=Sesiune implicită
-Name[ru]=Системный сеанс по умолчанию
-Name[sk]=Štandardné sedenie systému
-Name[sl]=Privzeta seja sistema
-Name[sq]=Seanca e prezgjedhur e sistemit
-Name[sr]=Подразумевана сесија на систему
-Name[sr@Latn]=Podrazumevana sesija na sistemu
-Name[sv]=Standardsystemsession
-Name[ta]=முன்னிருப்பு கணிணி அமர்வு
-Name[th]=วาระระบบปริยาย
-Name[tr]=Öntanımlı Sistem Oturumu
-Name[uk]=Типовий системний сеанс
-Name[vi]=Phiên chạy hệ thống mặc định
-Name[wa]=Prémetowe session do sistinme
-Name[xh]=ISeshoni yeNkqubo eMiselweyo
-Name[zh_CN]=系统默认会话
-Name[zh_HK]=預設系統作業階段
-Name[zh_TW]=預設系統作業階段
-Name[zu]=inhlangano yohlelo enephutha
-Comment=This is the default system session
-Comment[af]=Hierdie is die verstekstelselsessie
-Comment[ar]=هذه جلسة النظام الإفتراضية
-Comment[az]=Bu ön qurğulu sistem iclasıdır
-Comment[be]=Гэта дапмная сыстэмная сэсыя
-Comment[bg]=Това е стандартната системна сесия
-Comment[bn]=এটি হচ্ছে সিস্টেমের ডিফল্ট সেশন
-Comment[bn_IN]=এটি সিস্টেমের ডিফল্ট সেশান
-Comment[bs]=Ovo je uobiÄŤajna sesija sistema
-Comment[ca]=Aquesta és la sessió predeterminada del sistema
-Comment[cs]=Toto je implicitní sezení systému
-Comment[cy]=Dyma sesiwn rhagosodedig y system
-Comment[da]=Dette er den forvalgte systemsession
-Comment[de]=Dies ist die voreingestellte Systemsitzung
-Comment[dz]=འདི་རིམ་ལུགས་སྔོན་སྒྲིག་ལཱ་ཡུན་ཨིན།
-Comment[el]=Αυτή είναι η προεπιλεγμένη συνεδρία συστήματος
-Comment[en_CA]=This is the default system session
-Comment[en_GB]=This is the default system session
-Comment[es]=Ésta es la sesión predeterminada del sistema
-Comment[et]=See on vaikimisi süsteemne seanss
-Comment[eu]=Hau sistema-saio lehenetsia da
-Comment[fa]=این نشست پیشفرض سیستم است
-Comment[fi]=Tämä on järjestelmän oletusistunto
-Comment[fr]=Ceci est la session par défaut du système
-Comment[gl]=Esta é a sesión do sistema por defecto
-Comment[gu]=આ એક મૂળભૂત સિસ્ટમ સત્ર છે
-Comment[he]=זוהי תצורת ההפעלה ברירת המחדל של המערכת
-Comment[hi]=यह मूलभूत सिस्टम सत्र है
-Comment[hr]=Ovo je uobičajena sesija na sistemu
-Comment[hu]=Ez az alapértelmezett rendszerkörnyezet
-Comment[id]=Login dengan sesi sistem standar
-Comment[it]=Questa è la sessione di sistema predefinita
-Comment[ja]=これはデフォルトのシステム・セッションです
-Comment[ka]=ეს არის სისტემის სტანდარტული სესია
-Comment[ko]=기본 시스템 세션을 사용해 로그인합니다
-Comment[ku]=Ev rûniştina ya heyî ya pergalê ye
-Comment[lt]=Tai numatytoji sistemos sesija
-Comment[lv]=Šī ir noklusētā sistēmas sesija
-Comment[mg]=Io ny session'ny rafitra tsotra
-Comment[mk]=Ова е стандардната сесија
-Comment[ml]=ഇതാണ് സിസ്റ്റത്തിന്റെ ഡീഫോള്ട്ടായി സെഷന്
-Comment[mn]=Энэ бол системийн стандарт суулт
-Comment[mr]=हे मुलभूत प्रणाली सत्र आहे
-Comment[ms]=Ini ialah sesi default sistem
-Comment[nb]=Dette er forvalgt sesjon for systemet
-Comment[ne]=यो पूर्वनिर्धारित प्रणाली सत्र हो
-Comment[nl]=Dit is de standaardsessie op het systeem
-Comment[nn]=Dette er systemet si standardøkt
-Comment[nso]=Le ke lenaneo la tshepedišo la tlhaelelo
-Comment[or]=ଏହା ପୂର୍ବ ନିର୍ଦ୍ଧାରିତ ତନ୍ତ୍ର ଅଧିବେଶନ ଅଟେ
-Comment[pa]=ਇਹ ਮੂਲ ਸਿਸਟਮ ਅਜਲਾਸ ਹੈ
-Comment[pl]=Domyślna sesja systemu
-Comment[pt]=Esta é a sessão de sistema por omissão
-Comment[pt_BR]=Esta é uma sessão padrão do sistema
-Comment[ro]=Aceasta este sesiunea implicită a sistemului
-Comment[ru]=Это системный сеанс по умолчанию
-Comment[sk]=Toto je štandardné sedenie systému
-Comment[sl]=To je privzeta seja sistema
-Comment[sq]=Kjo është seanca e prezgjedhur e sistemit
-Comment[sr]=Ово је подразумевана сесија на систему
-Comment[sr@Latn]=Ovo je podrazumevana sesija na sistemu
-Comment[sv]=Det här är standardsystemsessionen
-Comment[ta]=இது ஒரு முன்னிருப்பு கணிணி அமர்வு
-Comment[th]=นี่คือวาระปริยายของระบบ
-Comment[tr]=Bu öntanımlı sistem oturumudur
-Comment[uk]=Це типовий системний сеанс
-Comment[vi]=Đây là phiên chạy hệ thống mặc định
-Comment[wa]=Çouci est li prémetowe session do sistinme, po s' elodjî tot-z eployant li lingaedje defini dins les prémetowès valixhances do sistinme
-Comment[xh]=Le yiseshoni yenkqubo emiselweyo
-Comment[zh_CN]=系统默认的会话
-Comment[zh_HK]=這是系統預設的作業階段
-Comment[zh_TW]=這是系統預設的作業階段
-Comment[zu]=Lokho inhlangano yohlelo enephutha
-Exec=default
-# The "default" Exec is a very special one and is handled specially in
-# the Xsession script, you could also have "custom" which would just run
-# "~/.xsession" directly
-Icon=
-Type=Application
diff --git a/gdm-2.21.8-fedora-logo.patch b/gdm-2.21.8-fedora-logo.patch
deleted file mode 100644
index aadeca9..0000000
--- a/gdm-2.21.8-fedora-logo.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: gdm/gui/simple-greeter/gdm-simple-greeter.schemas.in
-===================================================================
---- gdm/gui/simple-greeter/gdm-simple-greeter.schemas.in (revision 5874)
-+++ gdm/gui/simple-greeter/gdm-simple-greeter.schemas.in (working copy)
-@@ -6,7 +6,7 @@
- /apps/gdm/simple-greeter/logo-icon-name
- gdm-simple-greeter
- string
-- computer
-+ start-here
-
- Icon name to use for greeter logo
- Set to the themed icon name to use for the greeter logo.
diff --git a/gdm-2.22.0-enable-tcp.patch b/gdm-2.22.0-enable-tcp.patch
deleted file mode 100644
index 3ccd311..0000000
--- a/gdm-2.22.0-enable-tcp.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-diff -up gdm-2.22.0/common/gdm-settings-keys.h.enable-tcp gdm-2.22.0/common/gdm-settings-keys.h
---- gdm-2.22.0/common/gdm-settings-keys.h.enable-tcp 2008-04-17 23:29:27.000000000 -0400
-+++ gdm-2.22.0/common/gdm-settings-keys.h 2008-06-25 11:19:51.000000000 -0400
-@@ -31,6 +31,8 @@ G_BEGIN_DECLS
- #define GDM_KEY_TIMED_LOGIN_USER "daemon/TimedLogin"
- #define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay"
-
-+#define GDM_KEY_DISALLOW_TCP "security/DisallowTCP"
-+
- #define GDM_KEY_XDMCP_ENABLE "xdmcp/Enable"
- #define GDM_KEY_MAX_PENDING "xdmcp/MaxPending"
- #define GDM_KEY_MAX_SESSIONS "xdmcp/MaxSessions"
-diff -up gdm-2.22.0/daemon/gdm-simple-slave.c.enable-tcp gdm-2.22.0/daemon/gdm-simple-slave.c
---- gdm-2.22.0/daemon/gdm-simple-slave.c.enable-tcp 2008-06-25 11:19:51.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-simple-slave.c 2008-06-25 11:29:44.000000000 -0400
-@@ -1003,8 +1003,18 @@ gdm_simple_slave_run (GdmSimpleSlave *sl
- * exist */
- if (display_is_local) {
- gboolean res;
-+ gboolean disable_tcp;
-
- slave->priv->server = gdm_server_new (display_name, auth_file);
-+
-+ disable_tcp = TRUE;
-+ if (gdm_settings_client_get_boolean (GDM_KEY_DISALLOW_TCP,
-+ &disable_tcp)) {
-+ g_object_set (slave->priv->server,
-+ "disable-tcp", disable_tcp,
-+ NULL);
-+ }
-+
- g_signal_connect (slave->priv->server,
- "exited",
- G_CALLBACK (on_server_exited),
-diff -up gdm-2.22.0/data/gdm.conf-custom.in.enable-tcp gdm-2.22.0/data/gdm.conf-custom.in
---- gdm-2.22.0/data/gdm.conf-custom.in.enable-tcp 2008-04-17 23:29:29.000000000 -0400
-+++ gdm-2.22.0/data/gdm.conf-custom.in 2008-06-25 11:19:51.000000000 -0400
-@@ -4,4 +4,6 @@
-
- [chooser]
-
-+[security]
-+
- [debug]
-diff -up gdm-2.22.0/data/gdm.schemas.in.enable-tcp gdm-2.22.0/data/gdm.schemas.in
---- gdm-2.22.0/data/gdm.schemas.in.enable-tcp 2008-04-20 09:51:56.000000000 -0400
-+++ gdm-2.22.0/data/gdm.schemas.in 2008-06-25 11:19:51.000000000 -0400
-@@ -28,6 +28,12 @@
-
-
-
-+ security/DisallowTCP
-+ b
-+ true
-+
-+
-+
- xdmcp/Enable
- b
- false
diff --git a/gdm-2.23.1-fedora-logo.patch b/gdm-2.23.1-fedora-logo.patch
new file mode 100644
index 0000000..11631c4
--- /dev/null
+++ b/gdm-2.23.1-fedora-logo.patch
@@ -0,0 +1,11 @@
+--- gdm-2.23.1/gui/simple-greeter/gdm-simple-greeter.schemas.in.fedora-logo 2008-07-21 11:14:46.000000000 -0400
++++ gdm-2.23.1/gui/simple-greeter/gdm-simple-greeter.schemas.in 2008-07-21 14:59:17.000000000 -0400
+@@ -39,7 +39,7 @@
+ /apps/gdm/simple-greeter/logo_icon_name
+ gdm-simple-greeter
+ string
+- computer
++ start-here
+
+ Icon name to use for greeter logo
+ Set to the themed icon name to use for the greeter logo.
diff --git a/gdm-keyboard-chooser.patch b/gdm-keyboard-chooser.patch
deleted file mode 100644
index 21bc4ea..0000000
--- a/gdm-keyboard-chooser.patch
+++ /dev/null
@@ -1,2342 +0,0 @@
-diff -up gdm-2.22.0/configure.ac.keyboard-chooser gdm-2.22.0/configure.ac
---- gdm-2.22.0/configure.ac.keyboard-chooser 2008-05-05 11:29:30.000000000 -0400
-+++ gdm-2.22.0/configure.ac 2008-05-05 11:30:14.000000000 -0400
-@@ -48,6 +48,7 @@ SCROLLKEEPER_REQUIRED_VERSION=0.1.4
- GCONF_REQUIRED_VERSION=2.6.1
- POLICYKIT_REQUIRED_VERSION=0.7
- GNOME_PANEL_REQUIRED_VERSION=2.0.0
-+LIBXKLAVIER_REQUIRED_VERSION=3.5
-
- EXTRA_COMPILE_WARNINGS(yes)
-
-@@ -98,6 +99,7 @@ PKG_CHECK_MODULES(SIMPLE_GREETER,
- gtk+-2.0 >= $GTK_REQUIRED_VERSION
- libglade-2.0 >= $LIBGLADE_REQUIRED_VERSION
- gconf-2.0 >= $GCONF_REQUIRED_VERSION
-+ libxklavier >= $LIBXKLAVIER_REQUIRED_VERSION
- )
- AC_SUBST(SIMPLE_GREETER_CFLAGS)
- AC_SUBST(SIMPLE_GREETER_LIBS)
-diff -up gdm-2.22.0/daemon/gdm-factory-slave.c.keyboard-chooser gdm-2.22.0/daemon/gdm-factory-slave.c
---- gdm-2.22.0/daemon/gdm-factory-slave.c.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-factory-slave.c 2008-05-05 11:28:39.000000000 -0400
-@@ -416,6 +416,14 @@ on_greeter_language_selected (GdmGreeter
- }
-
- static void
-+on_greeter_layout_selected (GdmGreeterServer *greeter_server,
-+ const char *text,
-+ GdmFactorySlave *slave)
-+{
-+ gdm_session_select_layout (GDM_SESSION (slave->priv->session), text);
-+}
-+
-+static void
- on_greeter_user_selected (GdmGreeterServer *greeter_server,
- const char *text,
- GdmFactorySlave *slave)
-@@ -505,6 +513,10 @@ run_greeter (GdmFactorySlave *slave)
- G_CALLBACK (on_greeter_language_selected),
- slave);
- g_signal_connect (slave->priv->greeter_server,
-+ "layout-selected",
-+ G_CALLBACK (on_greeter_layout_selected),
-+ slave);
-+ g_signal_connect (slave->priv->greeter_server,
- "user-selected",
- G_CALLBACK (on_greeter_user_selected),
- slave);
-diff -up gdm-2.22.0/daemon/gdm-greeter-server.c.keyboard-chooser gdm-2.22.0/daemon/gdm-greeter-server.c
---- gdm-2.22.0/daemon/gdm-greeter-server.c.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-greeter-server.c 2008-05-05 11:28:39.000000000 -0400
-@@ -76,6 +76,7 @@ enum {
- SESSION_SELECTED,
- HOSTNAME_SELECTED,
- LANGUAGE_SELECTED,
-+ LAYOUT_SELECTED,
- USER_SELECTED,
- CANCELLED,
- CONNECTED,
-@@ -266,6 +267,13 @@ gdm_greeter_server_default_language_name
- }
-
- void
-+gdm_greeter_server_default_layout_name_changed (GdmGreeterServer *greeter_server,
-+ const char *layout_name)
-+{
-+ send_dbus_string_signal (greeter_server, "DefaultLayoutNameChanged", layout_name);
-+}
-+
-+void
- gdm_greeter_server_default_session_name_changed (GdmGreeterServer *greeter_server,
- const char *session_name)
- {
-@@ -496,6 +504,33 @@ handle_select_language (GdmGreeterServer
- }
-
- static DBusHandlerResult
-+handle_select_layout (GdmGreeterServer *greeter_server,
-+ DBusConnection *connection,
-+ DBusMessage *message)
-+{
-+ DBusMessage *reply;
-+ DBusError error;
-+ const char *text;
-+
-+ dbus_error_init (&error);
-+ if (! dbus_message_get_args (message, &error,
-+ DBUS_TYPE_STRING, &text,
-+ DBUS_TYPE_INVALID)) {
-+ g_warning ("ERROR: %s", error.message);
-+ }
-+
-+ g_debug ("GreeterServer: SelectLayout: %s", text);
-+
-+ reply = dbus_message_new_method_return (message);
-+ dbus_connection_send (connection, reply, NULL);
-+ dbus_message_unref (reply);
-+
-+ g_signal_emit (greeter_server, signals [LAYOUT_SELECTED], 0, text);
-+
-+ return DBUS_HANDLER_RESULT_HANDLED;
-+}
-+
-+static DBusHandlerResult
- handle_select_user (GdmGreeterServer *greeter_server,
- DBusConnection *connection,
- DBusMessage *message)
-@@ -624,6 +659,8 @@ greeter_handle_child_message (DBusConnec
- return handle_select_hostname (greeter_server, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "SelectLanguage")) {
- return handle_select_language (greeter_server, connection, message);
-+ } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "SelectLayout")) {
-+ return handle_select_layout (greeter_server, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "SelectUser")) {
- return handle_select_user (greeter_server, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "Cancel")) {
-@@ -711,6 +748,10 @@ do_introspect (DBusConnection *connectio
- " \n"
- " \n"
- " \n"
-+ " \n"
-+ " \n"
-+ " \n"
-+ " \n"
- " \n"
- " \n"
- " \n"
-@@ -1157,6 +1198,17 @@ gdm_greeter_server_class_init (GdmGreete
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
-+ signals [LAYOUT_SELECTED] =
-+ g_signal_new ("layout-selected",
-+ G_OBJECT_CLASS_TYPE (object_class),
-+ G_SIGNAL_RUN_FIRST,
-+ G_STRUCT_OFFSET (GdmGreeterServerClass, layout_selected),
-+ NULL,
-+ NULL,
-+ g_cclosure_marshal_VOID__STRING,
-+ G_TYPE_NONE,
-+ 1,
-+ G_TYPE_STRING);
- signals [USER_SELECTED] =
- g_signal_new ("user-selected",
- G_OBJECT_CLASS_TYPE (object_class),
-diff -up gdm-2.22.0/daemon/gdm-greeter-server.h.keyboard-chooser gdm-2.22.0/daemon/gdm-greeter-server.h
---- gdm-2.22.0/daemon/gdm-greeter-server.h.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-greeter-server.h 2008-05-05 11:28:39.000000000 -0400
-@@ -57,6 +57,8 @@ typedef struct
- const char *hostname);
- void (* language_selected) (GdmGreeterServer *greeter_server,
- const char *name);
-+ void (* layout_selected) (GdmGreeterServer *greeter_server,
-+ const char *name);
- void (* user_selected) (GdmGreeterServer *greeter_server,
- const char *name);
- void (* cancelled) (GdmGreeterServer *greeter_server);
-@@ -88,6 +90,8 @@ void gdm_greeter_server_s
- const char *text);
- void gdm_greeter_server_default_language_name_changed (GdmGreeterServer *greeter_server,
- const char *text);
-+void gdm_greeter_server_default_layout_name_changed (GdmGreeterServer *greeter_server,
-+ const char *text);
- void gdm_greeter_server_default_session_name_changed (GdmGreeterServer *greeter_server,
- const char *text);
-
-diff -up gdm-2.22.0/daemon/gdm-product-slave.c.keyboard-chooser gdm-2.22.0/daemon/gdm-product-slave.c
---- gdm-2.22.0/daemon/gdm-product-slave.c.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-product-slave.c 2008-05-05 11:28:39.000000000 -0400
-@@ -755,6 +755,28 @@ on_relay_language_selected (GdmProductSl
- }
-
- static void
-+on_relay_layout_selected (GdmProductSlave *slave,
-+ DBusMessage *message)
-+{
-+ DBusError error;
-+ const char *text;
-+ dbus_bool_t res;
-+
-+ dbus_error_init (&error);
-+ res = dbus_message_get_args (message,
-+ &error,
-+ DBUS_TYPE_STRING, &text,
-+ DBUS_TYPE_INVALID);
-+ if (res) {
-+ g_debug ("GdmProductSlave: Layout selected %s", text);
-+ gdm_session_select_layout (GDM_SESSION (slave->priv->session), text);
-+ } else {
-+ g_warning ("Unable to get arguments: %s", error.message);
-+ dbus_error_free (&error);
-+ }
-+}
-+
-+static void
- on_relay_user_selected (GdmProductSlave *slave,
- DBusMessage *message)
- {
-@@ -963,6 +985,8 @@ relay_dbus_handle_message (DBusConnectio
- on_relay_session_selected (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "LanguageSelected")) {
- on_relay_language_selected (slave, message);
-+ } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "LayoutSelected")) {
-+ on_relay_layout_selected (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "UserSelected")) {
- on_relay_user_selected (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "StartSession")) {
-diff -up gdm-2.22.0/daemon/gdm-session.c.keyboard-chooser gdm-2.22.0/daemon/gdm-session.c
---- gdm-2.22.0/daemon/gdm-session.c.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-session.c 2008-05-05 11:28:39.000000000 -0400
-@@ -50,6 +50,7 @@ enum {
- SESSION_DIED,
- SELECTED_USER_CHANGED,
- DEFAULT_LANGUAGE_NAME_CHANGED,
-+ DEFAULT_LAYOUT_NAME_CHANGED,
- DEFAULT_SESSION_NAME_CHANGED,
- LAST_SIGNAL
- };
-@@ -164,6 +165,15 @@ gdm_session_select_language (GdmSession
- }
-
- void
-+gdm_session_select_layout (GdmSession *session,
-+ const char *text)
-+{
-+ g_return_if_fail (GDM_IS_SESSION (session));
-+
-+ GDM_SESSION_GET_IFACE (session)->select_layout (session, text);
-+}
-+
-+void
- gdm_session_select_user (GdmSession *session,
- const char *text)
- {
-@@ -429,6 +439,17 @@ gdm_session_class_init (gpointer g_iface
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
-+ signals [DEFAULT_LAYOUT_NAME_CHANGED] =
-+ g_signal_new ("default-layout-name-changed",
-+ iface_type,
-+ G_SIGNAL_RUN_FIRST,
-+ G_STRUCT_OFFSET (GdmSessionIface, default_layout_name_changed),
-+ NULL,
-+ NULL,
-+ g_cclosure_marshal_VOID__STRING,
-+ G_TYPE_NONE,
-+ 1,
-+ G_TYPE_STRING);
- signals [DEFAULT_SESSION_NAME_CHANGED] =
- g_signal_new ("default-session-name-changed",
- iface_type,
-@@ -610,6 +631,15 @@ _gdm_session_default_language_name_chang
- }
-
- void
-+_gdm_session_default_layout_name_changed (GdmSession *session,
-+ const char *layout_name)
-+{
-+ g_return_if_fail (GDM_IS_SESSION (session));
-+
-+ g_signal_emit (session, signals [DEFAULT_LAYOUT_NAME_CHANGED], 0, layout_name);
-+}
-+
-+void
- _gdm_session_default_session_name_changed (GdmSession *session,
- const char *session_name)
- {
-diff -up gdm-2.22.0/daemon/gdm-session-direct.c.keyboard-chooser gdm-2.22.0/daemon/gdm-session-direct.c
---- gdm-2.22.0/daemon/gdm-session-direct.c.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-session-direct.c 2008-05-05 11:28:39.000000000 -0400
-@@ -70,6 +70,8 @@ struct _GdmSessionDirectPrivate
- char *saved_session;
- char *selected_language;
- char *saved_language;
-+ char *selected_layout;
-+ char *saved_layout;
- char *selected_user;
- char *user_x11_authority_file;
-
-@@ -596,6 +598,16 @@ get_default_language_name (GdmSessionDir
- return setlocale (LC_MESSAGES, NULL);
- }
-
-+static const char *
-+get_default_layout_name (GdmSessionDirect *session)
-+{
-+ if (session->priv->saved_layout != NULL) {
-+ return session->priv->saved_layout;
-+ }
-+
-+ return "us";
-+}
-+
- static char *
- get_fallback_session_name (void)
- {
-@@ -661,6 +673,8 @@ gdm_session_direct_defaults_changed (Gdm
- {
- _gdm_session_default_language_name_changed (GDM_SESSION (session),
- get_default_language_name (session));
-+ _gdm_session_default_layout_name_changed (GDM_SESSION (session),
-+ get_default_layout_name (session));
- _gdm_session_default_session_name_changed (GDM_SESSION (session),
- get_default_session_name (session));
- }
-@@ -681,6 +695,9 @@ gdm_session_direct_select_user (GdmSessi
-
- g_free (impl->priv->saved_language);
- impl->priv->saved_language = NULL;
-+
-+ g_free (impl->priv->saved_layout);
-+ impl->priv->saved_layout = NULL;
- }
-
- static DBusHandlerResult
-@@ -1035,6 +1052,39 @@ gdm_session_direct_handle_saved_language
- }
-
- static DBusHandlerResult
-+gdm_session_direct_handle_saved_layout_name_read (GdmSessionDirect *session,
-+ DBusConnection *connection,
-+ DBusMessage *message)
-+{
-+ DBusMessage *reply;
-+ DBusError error;
-+ const char *layout_name;
-+
-+ dbus_error_init (&error);
-+ if (! dbus_message_get_args (message, &error,
-+ DBUS_TYPE_STRING, &layout_name,
-+ DBUS_TYPE_INVALID)) {
-+ g_warning ("ERROR: %s", error.message);
-+ }
-+
-+ reply = dbus_message_new_method_return (message);
-+ dbus_connection_send (connection, reply, NULL);
-+ dbus_message_unref (reply);
-+
-+ if (strcmp (layout_name,
-+ get_default_layout_name (session)) != 0) {
-+ g_free (session->priv->saved_layout);
-+ session->priv->saved_layout = g_strdup (layout_name);
-+
-+ _gdm_session_default_layout_name_changed (GDM_SESSION (session),
-+ layout_name);
-+ }
-+
-+
-+ return DBUS_HANDLER_RESULT_HANDLED;
-+}
-+
-+static DBusHandlerResult
- gdm_session_direct_handle_saved_session_name_read (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
-@@ -1135,6 +1185,8 @@ session_worker_message (DBusConnection *
- return gdm_session_direct_handle_session_died (session, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SavedLanguageNameRead")) {
- return gdm_session_direct_handle_saved_language_name_read (session, connection, message);
-+ } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SavedLayoutNameRead")) {
-+ return gdm_session_direct_handle_saved_layout_name_read (session, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SavedSessionNameRead")) {
- return gdm_session_direct_handle_saved_session_name_read (session, connection, message);
- }
-@@ -1834,6 +1886,16 @@ get_language_name (GdmSessionDirect *ses
- }
-
- static const char *
-+get_layout_name (GdmSessionDirect *session)
-+{
-+ if (session->priv->selected_layout != NULL) {
-+ return session->priv->selected_layout;
-+ }
-+
-+ return get_default_layout_name (session);
-+}
-+
-+static const char *
- get_session_name (GdmSessionDirect *session)
- {
- /* FIXME: test the session names before we use them? */
-@@ -1975,6 +2037,10 @@ setup_session_environment (GdmSessionDir
- get_language_name (session));
-
- gdm_session_direct_set_environment_variable (session,
-+ "GDM_KEYBOARD_LAYOUT",
-+ get_layout_name (session));
-+
-+ gdm_session_direct_set_environment_variable (session,
- "DISPLAY",
- session->priv->display_name);
- if (session_cookie != NULL) {
-@@ -2063,6 +2129,12 @@ gdm_session_direct_close (GdmSession *se
- g_free (impl->priv->saved_language);
- impl->priv->saved_language = NULL;
-
-+ g_free (impl->priv->selected_layout);
-+ impl->priv->selected_layout = NULL;
-+
-+ g_free (impl->priv->saved_layout);
-+ impl->priv->saved_layout = NULL;
-+
- g_free (impl->priv->user_x11_authority_file);
- impl->priv->user_x11_authority_file = NULL;
-
-@@ -2139,6 +2211,24 @@ gdm_session_direct_select_language (GdmS
- }
-
- static void
-+gdm_session_direct_select_layout (GdmSession *session,
-+ const char *text)
-+{
-+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
-+
-+ g_free (impl->priv->selected_layout);
-+
-+ if (strcmp (text, "__previous") == 0) {
-+ impl->priv->selected_layout = NULL;
-+ } else {
-+ impl->priv->selected_layout = g_strdup (text);
-+ }
-+
-+ send_dbus_string_signal (impl, "SetLayoutName",
-+ get_layout_name (impl));
-+}
-+
-+static void
- _gdm_session_direct_set_display_id (GdmSessionDirect *session,
- const char *id)
- {
-@@ -2330,6 +2420,8 @@ gdm_session_direct_finalize (GObject *ob
- g_free (session->priv->saved_session);
- g_free (session->priv->selected_language);
- g_free (session->priv->saved_language);
-+ g_free (session->priv->selected_layout);
-+ g_free (session->priv->saved_layout);
-
- parent_class = G_OBJECT_CLASS (gdm_session_direct_parent_class);
-
-@@ -2405,6 +2497,7 @@ gdm_session_iface_init (GdmSessionIface
- iface->answer_query = gdm_session_direct_answer_query;
- iface->select_session = gdm_session_direct_select_session;
- iface->select_language = gdm_session_direct_select_language;
-+ iface->select_layout = gdm_session_direct_select_layout;
- iface->select_user = gdm_session_direct_select_user;
- }
-
-diff -up gdm-2.22.0/daemon/gdm-session.h.keyboard-chooser gdm-2.22.0/daemon/gdm-session.h
---- gdm-2.22.0/daemon/gdm-session.h.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-session.h 2008-05-05 11:28:39.000000000 -0400
-@@ -60,6 +60,8 @@ struct _GdmSessionIface
- const char *text);
- void (* select_language) (GdmSession *session,
- const char *text);
-+ void (* select_layout) (GdmSession *session,
-+ const char *text);
- void (* select_session) (GdmSession *session,
- const char *text);
- void (* select_user) (GdmSession *session,
-@@ -108,6 +110,8 @@ struct _GdmSessionIface
-
- void (* default_language_name_changed) (GdmSession *session,
- const char *text);
-+ void (* default_layout_name_changed) (GdmSession *session,
-+ const char *text);
- void (* default_session_name_changed) (GdmSession *session,
- const char *text);
- };
-@@ -134,6 +138,8 @@ void gdm_session_select_session
- const char *session_name);
- void gdm_session_select_language (GdmSession *session,
- const char *language);
-+void gdm_session_select_layout (GdmSession *session,
-+ const char *language);
- void gdm_session_select_user (GdmSession *session,
- const char *username);
- void gdm_session_cancel (GdmSession *session);
-diff -up gdm-2.22.0/daemon/gdm-session-private.h.keyboard-chooser gdm-2.22.0/daemon/gdm-session-private.h
---- gdm-2.22.0/daemon/gdm-session-private.h.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-session-private.h 2008-05-05 11:28:39.000000000 -0400
-@@ -56,6 +56,8 @@ void _gdm_session_closed
- /* user settings read from ~/.dmrc / system defaults */
- void _gdm_session_default_language_name_changed (GdmSession *session,
- const char *language_name);
-+void _gdm_session_default_layout_name_changed (GdmSession *session,
-+ const char *layout_name);
- void _gdm_session_default_session_name_changed (GdmSession *session,
- const char *session_name);
- /* user is selected/changed internally */
-diff -up gdm-2.22.0/daemon/gdm-session-relay.c.keyboard-chooser gdm-2.22.0/daemon/gdm-session-relay.c
---- gdm-2.22.0/daemon/gdm-session-relay.c.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-session-relay.c 2008-05-05 11:28:39.000000000 -0400
-@@ -267,6 +267,14 @@ gdm_session_relay_select_language (GdmSe
- }
-
- static void
-+gdm_session_relay_select_layout (GdmSession *session,
-+ const char *text)
-+{
-+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
-+ send_dbus_string_signal (impl, "LayoutSelected", text);
-+}
-+
-+static void
- gdm_session_relay_select_user (GdmSession *session,
- const char *text)
- {
-@@ -814,6 +822,9 @@ do_introspect (DBusConnection *connectio
- " \n"
- " \n"
- " \n"
-+ " \n"
-+ " \n"
-+ " \n"
- " \n"
- " \n"
- " \n"
-@@ -1108,6 +1119,7 @@ gdm_session_iface_init (GdmSessionIface
- iface->answer_query = gdm_session_relay_answer_query;
- iface->select_session = gdm_session_relay_select_session;
- iface->select_language = gdm_session_relay_select_language;
-+ iface->select_layout = gdm_session_relay_select_layout;
- iface->select_user = gdm_session_relay_select_user;
- }
-
-diff -up gdm-2.22.0/daemon/gdm-session-settings.c.keyboard-chooser gdm-2.22.0/daemon/gdm-session-settings.c
---- gdm-2.22.0/daemon/gdm-session-settings.c.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-session-settings.c 2008-05-05 11:28:39.000000000 -0400
-@@ -36,6 +36,7 @@ struct _GdmSessionSettingsPrivate
- {
- char *session_name;
- char *language_name;
-+ char *layout_name;
- };
-
- static void gdm_session_settings_finalize (GObject *object);
-@@ -55,6 +56,7 @@ enum {
- PROP_0 = 0,
- PROP_SESSION_NAME,
- PROP_LANGUAGE_NAME,
-+ PROP_LAYOUT_NAME,
- };
-
- G_DEFINE_TYPE (GdmSessionSettings, gdm_session_settings, G_TYPE_OBJECT)
-@@ -93,6 +95,11 @@ gdm_session_settings_class_install_prope
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
- g_object_class_install_property (object_class, PROP_LANGUAGE_NAME, param_spec);
-+ param_spec = g_param_spec_string ("layout-name", "Keyboard Layout Name",
-+ "The name of the keyboard layout",
-+ NULL,
-+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
-+ g_object_class_install_property (object_class, PROP_LAYOUT_NAME, param_spec);
- }
-
- static void
-@@ -114,6 +121,7 @@ gdm_session_settings_finalize (GObject *
-
- g_free (settings->priv->session_name);
- g_free (settings->priv->language_name);
-+ g_free (settings->priv->layout_name);
-
- parent_class = G_OBJECT_CLASS (gdm_session_settings_parent_class);
-
-@@ -136,6 +144,19 @@ gdm_session_settings_set_language_name (
- }
-
- void
-+gdm_session_settings_set_layout_name (GdmSessionSettings *settings,
-+ const char *layout_name)
-+{
-+ g_return_if_fail (GDM_IS_SESSION_SETTINGS (settings));
-+
-+ if (settings->priv->layout_name == NULL ||
-+ strcmp (settings->priv->layout_name, layout_name) != 0) {
-+ settings->priv->layout_name = g_strdup (layout_name);
-+ g_object_notify (G_OBJECT (settings), "layout-name");
-+ }
-+}
-+
-+void
- gdm_session_settings_set_session_name (GdmSessionSettings *settings,
- const char *session_name)
- {
-@@ -156,6 +177,13 @@ gdm_session_settings_get_language_name (
- }
-
- char *
-+gdm_session_settings_get_layout_name (GdmSessionSettings *settings)
-+{
-+ g_return_val_if_fail (GDM_IS_SESSION_SETTINGS (settings), NULL);
-+ return g_strdup (settings->priv->layout_name);
-+}
-+
-+char *
- gdm_session_settings_get_session_name (GdmSessionSettings *settings)
- {
- g_return_val_if_fail (GDM_IS_SESSION_SETTINGS (settings), NULL);
-@@ -177,6 +205,10 @@ gdm_session_settings_set_property (GObje
- gdm_session_settings_set_language_name (settings, g_value_get_string (value));
- break;
-
-+ case PROP_LAYOUT_NAME:
-+ gdm_session_settings_set_layout_name (settings, g_value_get_string (value));
-+ break;
-+
- case PROP_SESSION_NAME:
- gdm_session_settings_set_session_name (settings, g_value_get_string (value));
- break;
-@@ -205,6 +237,10 @@ gdm_session_settings_get_property (GObje
- g_value_set_string (value, settings->priv->language_name);
- break;
-
-+ case PROP_LAYOUT_NAME:
-+ g_value_set_string (value, settings->priv->layout_name);
-+ break;
-+
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-@@ -225,7 +261,8 @@ gboolean
- gdm_session_settings_is_loaded (GdmSessionSettings *settings)
- {
- return settings->priv->session_name != NULL ||
-- settings->priv->language_name != NULL;
-+ settings->priv->language_name != NULL ||
-+ settings->priv->layout_name != NULL;
- }
-
- gboolean
-@@ -238,6 +275,7 @@ gdm_session_settings_load (GdmSessionSet
- gboolean is_loaded;
- char *session_name;
- char *language_name;
-+ char *layout_name;
- char *filename;
-
- g_return_val_if_fail (settings != NULL, FALSE);
-@@ -283,6 +321,20 @@ gdm_session_settings_load (GdmSessionSet
- goto out;
- }
-
-+ layout_name = g_key_file_get_string (key_file, "Desktop", "Layout",
-+ &load_error);
-+
-+ if (layout_name != NULL) {
-+ gdm_session_settings_set_layout_name (settings, layout_name);
-+ g_free (layout_name);
-+ } else if (g_error_matches (load_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
-+ g_error_free (load_error);
-+ load_error = NULL;
-+ } else {
-+ g_propagate_error (error, load_error);
-+ goto out;
-+ }
-+
- is_loaded = TRUE;
- out:
- g_key_file_free (key_file);
-@@ -327,6 +379,11 @@ gdm_session_settings_save (GdmSessionSet
- settings->priv->language_name);
- }
-
-+ if (settings->priv->layout_name != NULL) {
-+ g_key_file_set_string (key_file, "Desktop", "Layout",
-+ settings->priv->layout_name);
-+ }
-+
- contents = g_key_file_to_data (key_file, &length, &file_error);
-
- if (contents == NULL) {
-diff -up gdm-2.22.0/daemon/gdm-session-settings.h.keyboard-chooser gdm-2.22.0/daemon/gdm-session-settings.h
---- gdm-2.22.0/daemon/gdm-session-settings.h.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-session-settings.h 2008-05-05 11:28:39.000000000 -0400
-@@ -61,9 +61,12 @@ gboolean gdm_session_settings
- GError **error);
- gboolean gdm_session_settings_is_loaded (GdmSessionSettings *settings);
- char *gdm_session_settings_get_language_name (GdmSessionSettings *settings);
-+char *gdm_session_settings_get_layout_name (GdmSessionSettings *settings);
- char *gdm_session_settings_get_session_name (GdmSessionSettings *settings);
- void gdm_session_settings_set_language_name (GdmSessionSettings *settings,
- const char *language_name);
-+void gdm_session_settings_set_layout_name (GdmSessionSettings *settings,
-+ const char *layout_name);
- void gdm_session_settings_set_session_name (GdmSessionSettings *settings,
- const char *session_name);
-
-diff -up gdm-2.22.0/daemon/gdm-session-worker.c.keyboard-chooser gdm-2.22.0/daemon/gdm-session-worker.c
---- gdm-2.22.0/daemon/gdm-session-worker.c.keyboard-chooser 2008-04-17 23:29:28.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-session-worker.c 2008-05-05 11:28:39.000000000 -0400
-@@ -1785,6 +1785,14 @@ gdm_session_worker_set_language_name (Gd
- }
-
- static void
-+gdm_session_worker_set_layout_name (GdmSessionWorker *worker,
-+ const char *layout_name)
-+{
-+ gdm_session_settings_set_layout_name (worker->priv->user_settings,
-+ layout_name);
-+}
-+
-+static void
- on_set_language_name (GdmSessionWorker *worker,
- DBusMessage *message)
- {
-@@ -1807,6 +1815,28 @@ on_set_language_name (GdmSessionWorker *
- }
-
- static void
-+on_set_layout_name (GdmSessionWorker *worker,
-+ DBusMessage *message)
-+{
-+ DBusError error;
-+ const char *layout_name;
-+ dbus_bool_t res;
-+
-+ dbus_error_init (&error);
-+ res = dbus_message_get_args (message,
-+ &error,
-+ DBUS_TYPE_STRING, &layout_name,
-+ DBUS_TYPE_INVALID);
-+ if (res) {
-+ g_debug ("GdmSessionWorker: layout name set to %s", layout_name);
-+ gdm_session_worker_set_layout_name (worker, layout_name);
-+ } else {
-+ g_warning ("Unable to get arguments: %s", error.message);
-+ dbus_error_free (&error);
-+ }
-+}
-+
-+static void
- on_saved_language_name_read (GdmSessionWorker *worker)
- {
- char *language_name;
-@@ -1819,6 +1849,18 @@ on_saved_language_name_read (GdmSessionW
- }
-
- static void
-+on_saved_layout_name_read (GdmSessionWorker *worker)
-+{
-+ char *layout_name;
-+
-+ layout_name = gdm_session_settings_get_layout_name (worker->priv->user_settings);
-+ send_dbus_string_method (worker->priv->connection,
-+ "SavedLayoutNameRead",
-+ layout_name);
-+ g_free (layout_name);
-+}
-+
-+static void
- on_saved_session_name_read (GdmSessionWorker *worker)
- {
- char *session_name;
-@@ -1844,6 +1886,11 @@ do_setup (GdmSessionWorker *worker)
- worker);
-
- g_signal_connect_swapped (worker->priv->user_settings,
-+ "notify::layout-name",
-+ G_CALLBACK (on_saved_layout_name_read),
-+ worker);
-+
-+ g_signal_connect_swapped (worker->priv->user_settings,
- "notify::session-name",
- G_CALLBACK (on_saved_session_name_read),
- worker);
-@@ -2300,6 +2347,8 @@ worker_dbus_handle_message (DBusConnecti
- on_set_environment_variable (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetLanguageName")) {
- on_set_language_name (worker, message);
-+ } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetLayoutName")) {
-+ on_set_layout_name (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetSessionName")) {
- on_set_session_name (worker, message);
- } else {
-diff -up gdm-2.22.0/daemon/gdm-simple-slave.c.keyboard-chooser gdm-2.22.0/daemon/gdm-simple-slave.c
---- gdm-2.22.0/daemon/gdm-simple-slave.c.keyboard-chooser 2008-05-01 18:35:36.000000000 -0400
-+++ gdm-2.22.0/daemon/gdm-simple-slave.c 2008-05-05 11:28:39.000000000 -0400
-@@ -485,6 +485,16 @@ on_default_language_name_changed (GdmSes
- }
-
- static void
-+on_default_layout_name_changed (GdmSession *session,
-+ const char *text,
-+ GdmSimpleSlave *slave)
-+{
-+ g_debug ("GdmSimpleSlave: Default layout name changed: %s", text);
-+
-+ gdm_greeter_server_default_layout_name_changed (slave->priv->greeter_server, text);
-+}
-+
-+static void
- on_default_session_name_changed (GdmSession *session,
- const char *text,
- GdmSimpleSlave *slave)
-@@ -619,6 +629,11 @@ create_new_session (GdmSimpleSlave *slav
- slave);
-
- g_signal_connect (slave->priv->session,
-+ "default-layout-name-changed",
-+ G_CALLBACK (on_default_layout_name_changed),
-+ slave);
-+
-+ g_signal_connect (slave->priv->session,
- "default-session-name-changed",
- G_CALLBACK (on_default_session_name_changed),
- slave);
-@@ -713,6 +728,14 @@ on_greeter_language_selected (GdmGreeter
- }
-
- static void
-+on_greeter_layout_selected (GdmGreeterServer *greeter_server,
-+ const char *text,
-+ GdmSimpleSlave *slave)
-+{
-+ gdm_session_select_layout (GDM_SESSION (slave->priv->session), text);
-+}
-+
-+static void
- on_greeter_user_selected (GdmGreeterServer *greeter_server,
- const char *text,
- GdmSimpleSlave *slave)
-@@ -847,6 +870,10 @@ run_greeter (GdmSimpleSlave *slave)
- G_CALLBACK (on_greeter_language_selected),
- slave);
- g_signal_connect (slave->priv->greeter_server,
-+ "layout-selected",
-+ G_CALLBACK (on_greeter_layout_selected),
-+ slave);
-+ g_signal_connect (slave->priv->greeter_server,
- "user-selected",
- G_CALLBACK (on_greeter_user_selected),
- slave);
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-greeter-client.c.keyboard-chooser gdm-2.22.0/gui/simple-greeter/gdm-greeter-client.c
---- gdm-2.22.0/gui/simple-greeter/gdm-greeter-client.c.keyboard-chooser 2008-04-17 23:29:26.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-greeter-client.c 2008-05-05 11:28:39.000000000 -0400
-@@ -67,6 +67,7 @@ enum {
- RESET,
- SELECTED_USER_CHANGED,
- DEFAULT_LANGUAGE_NAME_CHANGED,
-+ DEFAULT_LAYOUT_NAME_CHANGED,
- DEFAULT_SESSION_NAME_CHANGED,
- TIMED_LOGIN_REQUESTED,
- USER_AUTHORIZED,
-@@ -175,6 +176,13 @@ on_default_language_name_changed (GdmGre
- }
-
- static void
-+on_default_layout_name_changed (GdmGreeterClient *client,
-+ DBusMessage *message)
-+{
-+ emit_string_signal_for_message (client, "DefaultLayoutNameChanged", message, DEFAULT_LAYOUT_NAME_CHANGED);
-+}
-+
-+static void
- on_default_session_name_changed (GdmGreeterClient *client,
- DBusMessage *message)
- {
-@@ -452,6 +460,14 @@ gdm_greeter_client_call_select_language
- }
-
- void
-+gdm_greeter_client_call_select_layout (GdmGreeterClient *client,
-+ const char *text)
-+{
-+ send_dbus_string_method (client->priv->connection,
-+ "SelectLayout",
-+ text);
-+}
-+void
- gdm_greeter_client_call_select_user (GdmGreeterClient *client,
- const char *text)
- {
-@@ -633,6 +649,8 @@ client_dbus_handle_message (DBusConnecti
- on_selected_user_changed (client, message);
- } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "DefaultLanguageNameChanged")) {
- on_default_language_name_changed (client, message);
-+ } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "DefaultLayoutNameChanged")) {
-+ on_default_layout_name_changed (client, message);
- } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "DefaultSessionNameChanged")) {
- on_default_session_name_changed (client, message);
- } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "TimedLoginRequested")) {
-@@ -895,6 +913,16 @@ gdm_greeter_client_class_init (GdmGreete
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1, G_TYPE_STRING);
-+ gdm_greeter_client_signals[DEFAULT_LAYOUT_NAME_CHANGED] =
-+ g_signal_new ("default-layout-name-changed",
-+ G_OBJECT_CLASS_TYPE (object_class),
-+ G_SIGNAL_RUN_FIRST,
-+ G_STRUCT_OFFSET (GdmGreeterClientClass, default_layout_name_changed),
-+ NULL,
-+ NULL,
-+ g_cclosure_marshal_VOID__STRING,
-+ G_TYPE_NONE,
-+ 1, G_TYPE_STRING);
- gdm_greeter_client_signals[DEFAULT_SESSION_NAME_CHANGED] =
- g_signal_new ("default-session-name-changed",
- G_OBJECT_CLASS_TYPE (object_class),
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-greeter-client.h.keyboard-chooser gdm-2.22.0/gui/simple-greeter/gdm-greeter-client.h
---- gdm-2.22.0/gui/simple-greeter/gdm-greeter-client.h.keyboard-chooser 2008-04-17 23:29:26.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-greeter-client.h 2008-05-05 11:28:39.000000000 -0400
-@@ -64,6 +64,8 @@ typedef struct
- const char *session_name);
- void (* default_language_name_changed) (GdmGreeterClient *client,
- const char *language_name);
-+ void (* default_layout_name_changed) (GdmGreeterClient *client,
-+ const char *layout_name);
- void (* timed_login_requested) (GdmGreeterClient *client,
- const char *username,
- int delay);
-@@ -102,6 +104,8 @@ void gdm_greeter_client_ca
- const char *text);
- void gdm_greeter_client_call_select_language (GdmGreeterClient *client,
- const char *text);
-+void gdm_greeter_client_call_select_layout (GdmGreeterClient *client,
-+ const char *text);
- void gdm_greeter_client_call_select_session (GdmGreeterClient *client,
- const char *text);
- void gdm_greeter_client_call_answer_query (GdmGreeterClient *client,
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-greeter-panel.c.keyboard-chooser gdm-2.22.0/gui/simple-greeter/gdm-greeter-panel.c
---- gdm-2.22.0/gui/simple-greeter/gdm-greeter-panel.c.keyboard-chooser 2008-04-29 13:38:43.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-greeter-panel.c 2008-05-05 11:28:39.000000000 -0400
-@@ -34,9 +34,11 @@
- #include
-
- #include "gdm-languages.h"
-+#include "gdm-layouts.h"
- #include "gdm-greeter-panel.h"
- #include "gdm-clock-widget.h"
- #include "gdm-language-option-widget.h"
-+#include "gdm-layout-option-widget.h"
- #include "gdm-session-option-widget.h"
- #include "gdm-a11y-preferences-dialog.h"
- #include "gdm-profile.h"
-@@ -59,6 +61,7 @@ struct GdmGreeterPanelPrivate
- GtkWidget *hostname_label;
- GtkWidget *clock;
- GtkWidget *language_option_widget;
-+ GtkWidget *layout_option_widget;
- GtkWidget *session_option_widget;
-
- char *default_session_name;
-@@ -71,6 +74,7 @@ enum {
-
- enum {
- LANGUAGE_SELECTED,
-+ LAYOUT_SELECTED,
- SESSION_SELECTED,
- NUMBER_OF_SIGNALS
- };
-@@ -398,6 +402,17 @@ gdm_greeter_panel_class_init (GdmGreeter
- G_TYPE_NONE,
- 1, G_TYPE_STRING);
-
-+ signals[LAYOUT_SELECTED] =
-+ g_signal_new ("layout-selected",
-+ G_TYPE_FROM_CLASS (object_class),
-+ G_SIGNAL_RUN_LAST,
-+ G_STRUCT_OFFSET (GdmGreeterPanelClass, layout_selected),
-+ NULL,
-+ NULL,
-+ g_cclosure_marshal_VOID__STRING,
-+ G_TYPE_NONE,
-+ 1, G_TYPE_STRING);
-+
- signals[SESSION_SELECTED] =
- g_signal_new ("session-selected",
- G_TYPE_FROM_CLASS (object_class),
-@@ -431,6 +446,26 @@ on_language_activated (GdmLanguageOption
- }
-
- static void
-+on_layout_activated (GdmLayoutOptionWidget *widget,
-+ GdmGreeterPanel *panel)
-+{
-+
-+ char *layout;
-+
-+ layout = gdm_layout_option_widget_get_current_layout_name (GDM_LAYOUT_OPTION_WIDGET (panel->priv->layout_option_widget));
-+
-+ if (layout == NULL) {
-+ return;
-+ }
-+
-+ g_debug ("GdmGreeterPanel: activating selected layout %s", layout);
-+ gdm_layout_activate (layout);
-+
-+ g_signal_emit (panel, signals[LAYOUT_SELECTED], 0, layout);
-+
-+ g_free (layout);
-+}
-+static void
- on_session_activated (GdmSessionOptionWidget *widget,
- GdmGreeterPanel *panel)
- {
-@@ -562,6 +597,12 @@ gdm_greeter_panel_init (GdmGreeterPanel
- gtk_box_pack_start (GTK_BOX (panel->priv->option_hbox), panel->priv->language_option_widget, FALSE, FALSE, 6);
- gdm_profile_end ("creating option widget");
-
-+ panel->priv->layout_option_widget = gdm_layout_option_widget_new ();
-+ g_signal_connect (G_OBJECT (panel->priv->layout_option_widget),
-+ "layout-activated",
-+ G_CALLBACK (on_layout_activated), panel);
-+ gtk_box_pack_start (GTK_BOX (panel->priv->option_hbox), panel->priv->layout_option_widget, FALSE, FALSE, 6);
-+
- panel->priv->session_option_widget = gdm_session_option_widget_new ();
- g_signal_connect (G_OBJECT (panel->priv->session_option_widget),
- "session-activated",
-@@ -626,6 +667,7 @@ gdm_greeter_panel_show_user_options (Gdm
- {
- gtk_widget_show (panel->priv->session_option_widget);
- gtk_widget_show (panel->priv->language_option_widget);
-+ gtk_widget_show (panel->priv->layout_option_widget);
- }
-
- void
-@@ -633,12 +675,17 @@ gdm_greeter_panel_hide_user_options (Gdm
- {
- gtk_widget_hide (panel->priv->session_option_widget);
- gtk_widget_hide (panel->priv->language_option_widget);
-+ gtk_widget_hide (panel->priv->layout_option_widget);
-+
-+ g_debug ("GdmGreeterPanel: activating default layout");
-+ gdm_layout_activate (NULL);
- }
-
- void
- gdm_greeter_panel_reset (GdmGreeterPanel *panel)
- {
- gdm_greeter_panel_set_default_language_name (panel, NULL);
-+ gdm_greeter_panel_set_default_layout_name (panel, NULL);
- gdm_greeter_panel_set_default_session_name (panel, NULL);
- gdm_greeter_panel_hide_user_options (panel);
- }
-@@ -671,6 +718,26 @@ gdm_greeter_panel_set_default_language_n
- }
-
- void
-+gdm_greeter_panel_set_default_layout_name (GdmGreeterPanel *panel,
-+ const char *layout_name)
-+{
-+ g_return_if_fail (GDM_IS_GREETER_PANEL (panel));
-+
-+ if (layout_name != NULL &&
-+ !gdm_option_widget_lookup_item (GDM_OPTION_WIDGET (panel->priv->layout_option_widget),
-+ layout_name, NULL, NULL, NULL)) {
-+ gdm_recent_option_widget_add_item (GDM_RECENT_OPTION_WIDGET (panel->priv->layout_option_widget),
-+ layout_name);
-+ }
-+
-+ gdm_option_widget_set_default_item (GDM_OPTION_WIDGET (panel->priv->layout_option_widget),
-+ layout_name);
-+
-+ g_debug ("GdmGreeterPanel: activating layout: %s", layout_name);
-+ gdm_layout_activate (layout_name);
-+}
-+
-+void
- gdm_greeter_panel_set_default_session_name (GdmGreeterPanel *panel,
- const char *session_name)
- {
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-greeter-panel.h.keyboard-chooser gdm-2.22.0/gui/simple-greeter/gdm-greeter-panel.h
---- gdm-2.22.0/gui/simple-greeter/gdm-greeter-panel.h.keyboard-chooser 2008-04-17 23:29:26.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-greeter-panel.h 2008-05-05 11:28:39.000000000 -0400
-@@ -48,6 +48,9 @@ typedef struct
- void (* language_selected) (GdmGreeterPanel *panel,
- const char *text);
-
-+ void (* layout_selected) (GdmGreeterPanel *panel,
-+ const char *text);
-+
- void (* session_selected) (GdmGreeterPanel *panel,
- const char *text);
- } GdmGreeterPanelClass;
-@@ -62,6 +65,8 @@ void gdm_greeter_panel
-
- void gdm_greeter_panel_set_default_language_name (GdmGreeterPanel *panel,
- const char *language_name);
-+void gdm_greeter_panel_set_default_layout_name (GdmGreeterPanel *panel,
-+ const char *layout_name);
- void gdm_greeter_panel_set_default_session_name (GdmGreeterPanel *panel,
- const char *session_name);
- G_END_DECLS
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-greeter-session.c.keyboard-chooser gdm-2.22.0/gui/simple-greeter/gdm-greeter-session.c
---- gdm-2.22.0/gui/simple-greeter/gdm-greeter-session.c.keyboard-chooser 2008-04-17 23:29:26.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-greeter-session.c 2008-05-05 11:28:39.000000000 -0400
-@@ -139,6 +139,16 @@ on_default_language_name_changed (GdmGre
- }
-
- static void
-+on_default_layout_name_changed (GdmGreeterClient *client,
-+ const char *text,
-+ GdmGreeterSession *session)
-+{
-+ g_debug ("GdmGreeterSession: default layout name changed: %s", text);
-+ gdm_greeter_panel_set_default_layout_name (GDM_GREETER_PANEL (session->priv->panel),
-+ text);
-+}
-+
-+static void
- on_default_session_name_changed (GdmGreeterClient *client,
- const char *text,
- GdmGreeterSession *session)
-@@ -237,6 +247,14 @@ on_select_language (GdmGreeterSession
- }
-
- static void
-+on_select_layout (GdmGreeterSession *session,
-+ const char *text)
-+{
-+ gdm_greeter_client_call_select_layout (session->priv->client,
-+ text);
-+}
-+
-+static void
- on_select_user (GdmGreeterLoginWindow *login_window,
- const char *text,
- GdmGreeterSession *session)
-@@ -284,6 +302,11 @@ toggle_panel (GdmSessionManager *manager
- session);
-
- g_signal_connect_swapped (session->priv->panel,
-+ "layout-selected",
-+ G_CALLBACK (on_select_layout),
-+ session);
-+
-+ g_signal_connect_swapped (session->priv->panel,
- "session-selected",
- G_CALLBACK (on_select_session),
- session);
-@@ -883,6 +906,10 @@ gdm_greeter_session_init (GdmGreeterSess
- G_CALLBACK (on_default_language_name_changed),
- session);
- g_signal_connect (session->priv->client,
-+ "default-layout-name-changed",
-+ G_CALLBACK (on_default_layout_name_changed),
-+ session);
-+ g_signal_connect (session->priv->client,
- "default-session-name-changed",
- G_CALLBACK (on_default_session_name_changed),
- session);
-diff -up /dev/null gdm-2.22.0/gui/simple-greeter/gdm-layout-chooser-dialog.c
---- /dev/null 2008-05-05 08:19:33.312003896 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-layout-chooser-dialog.c 2008-05-05 11:28:39.000000000 -0400
-@@ -0,0 +1,216 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2008 Matthias Clasen
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include
-+#include
-+#include
-+#include
-+
-+#include
-+
-+#include
-+#include
-+#include
-+#include
-+
-+#include "gdm-layout-chooser-widget.h"
-+#include "gdm-layout-chooser-dialog.h"
-+
-+#define GDM_LAYOUT_CHOOSER_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LAYOUT_CHOOSER_DIALOG, GdmLayoutChooserDialogPrivate))
-+
-+struct GdmLayoutChooserDialogPrivate
-+{
-+ GtkWidget *chooser_widget;
-+};
-+
-+
-+static void gdm_layout_chooser_dialog_class_init (GdmLayoutChooserDialogClass *klass);
-+static void gdm_layout_chooser_dialog_init (GdmLayoutChooserDialog *layout_chooser_dialog);
-+static void gdm_layout_chooser_dialog_finalize (GObject *object);
-+
-+G_DEFINE_TYPE (GdmLayoutChooserDialog, gdm_layout_chooser_dialog, GTK_TYPE_DIALOG)
-+
-+char *
-+gdm_layout_chooser_dialog_get_current_layout_name (GdmLayoutChooserDialog *dialog)
-+{
-+ char *layout_name;
-+
-+ g_return_val_if_fail (GDM_IS_LAYOUT_CHOOSER_DIALOG (dialog), NULL);
-+
-+ layout_name = gdm_layout_chooser_widget_get_current_layout_name (GDM_LAYOUT_CHOOSER_WIDGET (dialog->priv->chooser_widget));
-+
-+ return layout_name;
-+}
-+
-+void
-+gdm_layout_chooser_dialog_set_current_layout_name (GdmLayoutChooserDialog *dialog,
-+ const char *layout_name)
-+{
-+
-+ g_return_if_fail (GDM_IS_LAYOUT_CHOOSER_DIALOG (dialog));
-+
-+ gdm_layout_chooser_widget_set_current_layout_name (GDM_LAYOUT_CHOOSER_WIDGET (dialog->priv->chooser_widget), layout_name);
-+}
-+
-+static void
-+gdm_layout_chooser_dialog_size_request (GtkWidget *widget,
-+ GtkRequisition *requisition)
-+{
-+ int screen_w;
-+ int screen_h;
-+ GtkRequisition child_requisition;
-+
-+ if (GTK_WIDGET_CLASS (gdm_layout_chooser_dialog_parent_class)->size_request) {
-+ GTK_WIDGET_CLASS (gdm_layout_chooser_dialog_parent_class)->size_request (widget, requisition);
-+ }
-+
-+ screen_w = gdk_screen_get_width (gtk_widget_get_screen (widget));
-+ screen_h = gdk_screen_get_height (gtk_widget_get_screen (widget));
-+
-+ gtk_widget_get_child_requisition (GTK_BIN (widget)->child, &child_requisition);
-+ *requisition = child_requisition;
-+
-+ requisition->width += 2 * GTK_CONTAINER (widget)->border_width;
-+ requisition->height += 2 * GTK_CONTAINER (widget)->border_width;
-+
-+ requisition->width = MIN (requisition->width, .50 * screen_w);
-+ requisition->height = MIN (requisition->height, .80 * screen_h);
-+}
-+
-+static void
-+gdm_layout_chooser_dialog_response (GtkDialog *dialog,
-+ int response_id)
-+{
-+ GdmLayoutChooserDialog *chooser_dialog;
-+
-+ chooser_dialog = GDM_LAYOUT_CHOOSER_DIALOG (dialog);
-+
-+ if (response_id == GTK_RESPONSE_OK) {
-+ gdm_chooser_widget_activate_selected_item (GDM_CHOOSER_WIDGET (chooser_dialog->priv->chooser_widget));
-+ }
-+}
-+
-+static void
-+gdm_layout_chooser_dialog_realize (GtkWidget *widget)
-+{
-+ GdmLayoutChooserDialog *chooser_dialog;
-+
-+ chooser_dialog = GDM_LAYOUT_CHOOSER_DIALOG (widget);
-+
-+ gtk_widget_show (chooser_dialog->priv->chooser_widget);
-+
-+ GTK_WIDGET_CLASS (gdm_layout_chooser_dialog_parent_class)->realize (widget);
-+}
-+
-+static void
-+gdm_layout_chooser_dialog_class_init (GdmLayoutChooserDialogClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-+#ifdef I_COULD_GO_BACK_IN_TIME_AND_MAKE_RESPONSE_RUN_FIRST
-+ GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass);
-+#endif
-+
-+ object_class->finalize = gdm_layout_chooser_dialog_finalize;
-+ widget_class->size_request = gdm_layout_chooser_dialog_size_request;
-+ widget_class->realize = gdm_layout_chooser_dialog_realize;
-+#ifdef I_COULD_GO_BACK_IN_TIME_AND_MAKE_RESPONSE_RUN_FIRST
-+ dialog_class->response = gdm_layout_chooser_dialog_response;
-+#endif
-+
-+ g_type_class_add_private (klass, sizeof (GdmLayoutChooserDialogPrivate));
-+}
-+
-+static gboolean
-+respond (GdmLayoutChooserDialog *dialog)
-+{
-+ gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
-+ return FALSE;
-+}
-+
-+static void
-+queue_response (GdmLayoutChooserDialog *dialog)
-+{
-+ g_idle_add ((GSourceFunc) respond, dialog);
-+}
-+
-+static void
-+gdm_layout_chooser_dialog_init (GdmLayoutChooserDialog *dialog)
-+{
-+
-+ dialog->priv = GDM_LAYOUT_CHOOSER_DIALOG_GET_PRIVATE (dialog);
-+
-+ dialog->priv->chooser_widget = gdm_layout_chooser_widget_new ();
-+ gdm_chooser_widget_set_hide_inactive_items (GDM_CHOOSER_WIDGET (dialog->priv->chooser_widget),
-+ FALSE);
-+
-+#ifndef I_COULD_GO_BACK_IN_TIME_AND_MAKE_RESPONSE_RUN_FIRST
-+ g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (gdm_layout_chooser_dialog_response), NULL);
-+#endif
-+
-+ gdm_layout_chooser_widget_set_current_layout_name (GDM_LAYOUT_CHOOSER_WIDGET (dialog->priv->chooser_widget),
-+ setlocale (LC_MESSAGES, NULL));
-+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), dialog->priv->chooser_widget);
-+
-+ g_signal_connect_swapped (G_OBJECT (dialog->priv->chooser_widget),
-+ "activated", G_CALLBACK (queue_response),
-+ dialog);
-+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
-+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-+ GTK_STOCK_OK, GTK_RESPONSE_OK,
-+ NULL);
-+ gtk_window_set_icon_name (GTK_WINDOW (dialog), "keyboard");
-+ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
-+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);
-+ gtk_container_set_border_width (GTK_CONTAINER (dialog->priv->chooser_widget), 5);
-+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ALWAYS);
-+ gtk_window_set_default_size (GTK_WINDOW (dialog), 512, 440);
-+}
-+
-+static void
-+gdm_layout_chooser_dialog_finalize (GObject *object)
-+{
-+ GdmLayoutChooserDialog *layout_chooser_dialog;
-+
-+ g_return_if_fail (object != NULL);
-+ g_return_if_fail (GDM_IS_LAYOUT_CHOOSER_DIALOG (object));
-+
-+ layout_chooser_dialog = GDM_LAYOUT_CHOOSER_DIALOG (object);
-+
-+ g_return_if_fail (layout_chooser_dialog->priv != NULL);
-+
-+ G_OBJECT_CLASS (gdm_layout_chooser_dialog_parent_class)->finalize (object);
-+}
-+
-+GtkWidget *
-+gdm_layout_chooser_dialog_new (void)
-+{
-+ GObject *object;
-+
-+ object = g_object_new (GDM_TYPE_LAYOUT_CHOOSER_DIALOG,
-+ "title", _("Keyboard layouts"),
-+ "border-width", 8,
-+ "modal", TRUE,
-+ NULL);
-+
-+ return GTK_WIDGET (object);
-+}
-diff -up /dev/null gdm-2.22.0/gui/simple-greeter/gdm-layout-chooser-dialog.h
---- /dev/null 2008-05-05 08:19:33.312003896 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-layout-chooser-dialog.h 2008-05-05 11:28:39.000000000 -0400
-@@ -0,0 +1,59 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2008 Matthias Clasen
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ */
-+
-+#ifndef __GDM_LAYOUT_CHOOSER_DIALOG_H
-+#define __GDM_LAYOUT_CHOOSER_DIALOG_H
-+
-+#include
-+#include
-+
-+G_BEGIN_DECLS
-+
-+#define GDM_TYPE_LAYOUT_CHOOSER_DIALOG (gdm_layout_chooser_dialog_get_type ())
-+#define GDM_LAYOUT_CHOOSER_DIALOG(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_LAYOUT_CHOOSER_DIALOG, GdmLayoutChooserDialog))
-+#define GDM_LAYOUT_CHOOSER_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_LAYOUT_CHOOSER_DIALOG, GdmLayoutChooserDialogClass))
-+#define GDM_IS_LAYOUT_CHOOSER_DIALOG(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_LAYOUT_CHOOSER_DIALOG))
-+#define GDM_IS_LAYOUT_CHOOSER_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_LAYOUT_CHOOSER_DIALOG))
-+#define GDM_LAYOUT_CHOOSER_DIALOG_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_LAYOUT_CHOOSER_DIALOG, GdmLayoutChooserDialogClass))
-+
-+typedef struct GdmLayoutChooserDialogPrivate GdmLayoutChooserDialogPrivate;
-+
-+typedef struct
-+{
-+ GtkDialog parent;
-+ GdmLayoutChooserDialogPrivate *priv;
-+} GdmLayoutChooserDialog;
-+
-+typedef struct
-+{
-+ GtkDialogClass parent_class;
-+} GdmLayoutChooserDialogClass;
-+
-+GType gdm_layout_chooser_dialog_get_type (void);
-+
-+GtkWidget * gdm_layout_chooser_dialog_new (void);
-+
-+char * gdm_layout_chooser_dialog_get_current_layout_name (GdmLayoutChooserDialog *dialog);
-+void gdm_layout_chooser_dialog_set_current_layout_name (GdmLayoutChooserDialog *dialog,
-+ const char *layout_name);
-+
-+G_END_DECLS
-+
-+#endif /* __GDM_LAYOUT_CHOOSER_DIALOG_H */
-diff -up /dev/null gdm-2.22.0/gui/simple-greeter/gdm-layout-chooser-widget.c
---- /dev/null 2008-05-05 08:19:33.312003896 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-layout-chooser-widget.c 2008-05-05 11:28:39.000000000 -0400
-@@ -0,0 +1,202 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2008 Matthias Clasen
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+
-+#include
-+
-+#include
-+#include
-+#include
-+#include
-+
-+#include "gdm-layout-chooser-widget.h"
-+#include "gdm-chooser-widget.h"
-+#include "gdm-layouts.h"
-+
-+#define GDM_LAYOUT_CHOOSER_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LAYOUT_CHOOSER_WIDGET, GdmLayoutChooserWidgetPrivate))
-+
-+struct GdmLayoutChooserWidgetPrivate
-+{
-+ guint layouts_added : 1;
-+};
-+
-+static void gdm_layout_chooser_widget_class_init (GdmLayoutChooserWidgetClass *klass);
-+static void gdm_layout_chooser_widget_init (GdmLayoutChooserWidget *layout_chooser_widget);
-+static void gdm_layout_chooser_widget_finalize (GObject *object);
-+
-+G_DEFINE_TYPE (GdmLayoutChooserWidget, gdm_layout_chooser_widget, GDM_TYPE_CHOOSER_WIDGET)
-+
-+enum {
-+ CHOOSER_LIST_TITLE_COLUMN = 0,
-+ CHOOSER_LIST_TRANSLATED_COLUMN,
-+ CHOOSER_LIST_LOCALE_COLUMN
-+};
-+
-+char *
-+gdm_layout_chooser_widget_get_current_layout_name (GdmLayoutChooserWidget *widget)
-+{
-+ char *id;
-+
-+ g_return_val_if_fail (GDM_IS_LAYOUT_CHOOSER_WIDGET (widget), NULL);
-+
-+ id = gdm_chooser_widget_get_active_item (GDM_CHOOSER_WIDGET (widget));
-+
-+ if (id == NULL) {
-+ id = g_strdup ("us");
-+ }
-+
-+ return id;
-+}
-+
-+void
-+gdm_layout_chooser_widget_set_current_layout_name (GdmLayoutChooserWidget *widget,
-+ const char *id)
-+{
-+ g_return_if_fail (GDM_IS_LAYOUT_CHOOSER_WIDGET (widget));
-+
-+ if (id == NULL) {
-+ gdm_chooser_widget_set_active_item (GDM_CHOOSER_WIDGET (widget),
-+ NULL);
-+ return;
-+ }
-+
-+ gdm_chooser_widget_set_active_item (GDM_CHOOSER_WIDGET (widget), id);
-+}
-+
-+static void
-+gdm_layout_chooser_widget_add_layout (GdmLayoutChooserWidget *widget,
-+ const char *name)
-+{
-+ char *layout;
-+ char *escaped;
-+
-+ layout = gdm_get_layout_from_name (name);
-+
-+ if (layout != NULL) {
-+ escaped = g_markup_escape_text (layout, -1);
-+ gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
-+ name,
-+ NULL,
-+ escaped,
-+ NULL,
-+ 0,
-+ FALSE,
-+ FALSE);
-+ g_free (escaped);
-+ g_free (layout);
-+ }
-+}
-+
-+void
-+add_available_layouts (GdmLayoutChooserWidget *widget)
-+{
-+ char **layout_names;
-+ int i;
-+
-+ layout_names = gdm_get_all_layout_names ();
-+
-+ for (i = 0; layout_names[i] != NULL; i++) {
-+ gdm_layout_chooser_widget_add_layout (widget,
-+ layout_names[i]);
-+ }
-+
-+ g_strfreev (layout_names);
-+}
-+
-+static void
-+gdm_layout_chooser_widget_dispose (GObject *object)
-+{
-+ G_OBJECT_CLASS (gdm_layout_chooser_widget_parent_class)->dispose (object);
-+}
-+
-+static void
-+gdm_layout_chooser_widget_realize (GtkWidget *widget)
-+{
-+ GdmLayoutChooserWidget *chooser;
-+
-+ chooser = GDM_LAYOUT_CHOOSER_WIDGET (widget);
-+
-+ GTK_WIDGET_CLASS (gdm_layout_chooser_widget_parent_class)->realize (widget);
-+
-+ if (!chooser->priv->layouts_added) {
-+ add_available_layouts (chooser);
-+ chooser->priv->layouts_added = TRUE;
-+ }
-+}
-+
-+static void
-+gdm_layout_chooser_widget_class_init (GdmLayoutChooserWidgetClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-+
-+ object_class->dispose = gdm_layout_chooser_widget_dispose;
-+ object_class->finalize = gdm_layout_chooser_widget_finalize;
-+ widget_class->realize = gdm_layout_chooser_widget_realize;
-+
-+ g_type_class_add_private (klass, sizeof (GdmLayoutChooserWidgetPrivate));
-+}
-+
-+static void
-+gdm_layout_chooser_widget_init (GdmLayoutChooserWidget *widget)
-+{
-+ widget->priv = GDM_LAYOUT_CHOOSER_WIDGET_GET_PRIVATE (widget);
-+
-+ gdm_chooser_widget_set_separator_position (GDM_CHOOSER_WIDGET (widget),
-+ GDM_CHOOSER_WIDGET_POSITION_TOP);
-+}
-+
-+static void
-+gdm_layout_chooser_widget_finalize (GObject *object)
-+{
-+ GdmLayoutChooserWidget *layout_chooser_widget;
-+
-+ g_return_if_fail (object != NULL);
-+ g_return_if_fail (GDM_IS_LAYOUT_CHOOSER_WIDGET (object));
-+
-+ layout_chooser_widget = GDM_LAYOUT_CHOOSER_WIDGET (object);
-+
-+ g_return_if_fail (layout_chooser_widget->priv != NULL);
-+
-+ G_OBJECT_CLASS (gdm_layout_chooser_widget_parent_class)->finalize (object);
-+}
-+
-+GtkWidget *
-+gdm_layout_chooser_widget_new (void)
-+{
-+ GObject *object;
-+
-+ object = g_object_new (GDM_TYPE_LAYOUT_CHOOSER_WIDGET,
-+ "inactive-text", _("_Keyboard:"),
-+ "active-text", _("_Keyboard:"),
-+ NULL);
-+
-+ return GTK_WIDGET (object);
-+}
-diff -up /dev/null gdm-2.22.0/gui/simple-greeter/gdm-layout-chooser-widget.h
---- /dev/null 2008-05-05 08:19:33.312003896 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-layout-chooser-widget.h 2008-05-05 11:28:39.000000000 -0400
-@@ -0,0 +1,58 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2008 Matthias Clasen
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ */
-+
-+#ifndef __GDM_LAYOUT_CHOOSER_WIDGET_H
-+#define __GDM_LAYOUT_CHOOSER_WIDGET_H
-+
-+#include
-+#include "gdm-chooser-widget.h"
-+
-+G_BEGIN_DECLS
-+
-+#define GDM_TYPE_LAYOUT_CHOOSER_WIDGET (gdm_layout_chooser_widget_get_type ())
-+#define GDM_LAYOUT_CHOOSER_WIDGET(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_LAYOUT_CHOOSER_WIDGET, GdmLayoutChooserWidget))
-+#define GDM_LAYOUT_CHOOSER_WIDGET_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_LAYOUT_CHOOSER_WIDGET, GdmLayoutChooserWidgetClass))
-+#define GDM_IS_LAYOUT_CHOOSER_WIDGET(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_LAYOUT_CHOOSER_WIDGET))
-+#define GDM_IS_LAYOUT_CHOOSER_WIDGET_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_LAYOUT_CHOOSER_WIDGET))
-+#define GDM_LAYOUT_CHOOSER_WIDGET_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_LAYOUT_CHOOSER_WIDGET, GdmLayoutChooserWidgetClass))
-+
-+typedef struct GdmLayoutChooserWidgetPrivate GdmLayoutChooserWidgetPrivate;
-+
-+typedef struct
-+{
-+ GdmChooserWidget parent;
-+ GdmLayoutChooserWidgetPrivate *priv;
-+} GdmLayoutChooserWidget;
-+
-+typedef struct
-+{
-+ GdmChooserWidgetClass parent_class;
-+} GdmLayoutChooserWidgetClass;
-+
-+GType gdm_layout_chooser_widget_get_type (void);
-+GtkWidget * gdm_layout_chooser_widget_new (void);
-+
-+char * gdm_layout_chooser_widget_get_current_layout_name (GdmLayoutChooserWidget *widget);
-+void gdm_layout_chooser_widget_set_current_layout_name (GdmLayoutChooserWidget *widget,
-+ const char *name);
-+
-+G_END_DECLS
-+
-+#endif /* __GDM_LAYOUT_CHOOSER_WIDGET_H */
-diff -up /dev/null gdm-2.22.0/gui/simple-greeter/gdm-layout-option-widget.c
---- /dev/null 2008-05-05 08:19:33.312003896 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-layout-option-widget.c 2008-05-05 11:28:39.000000000 -0400
-@@ -0,0 +1,268 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2008 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * Written by: Matthias Clasen
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+
-+#include
-+#include
-+#include
-+#include
-+
-+#include "gdm-profile.h"
-+#include "gdm-layouts.h"
-+#include "gdm-layout-option-widget.h"
-+#include "gdm-recent-option-widget.h"
-+#include "gdm-layout-chooser-dialog.h"
-+
-+#define GDM_LAYOUT_OPTION_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LAYOUT_OPTION_WIDGET, GdmLayoutOptionWidgetPrivate))
-+
-+struct GdmLayoutOptionWidgetPrivate
-+{
-+ GtkWidget *dialog;
-+};
-+
-+enum {
-+ LAYOUT_ACTIVATED,
-+ NUMBER_OF_SIGNALS
-+};
-+
-+static guint signals [NUMBER_OF_SIGNALS] = { 0, };
-+
-+static void gdm_layout_option_widget_class_init (GdmLayoutOptionWidgetClass *klass);
-+static void gdm_layout_option_widget_init (GdmLayoutOptionWidget *layout_option_widget);
-+static void gdm_layout_option_widget_finalize (GObject *object);
-+
-+G_DEFINE_TYPE (GdmLayoutOptionWidget, gdm_layout_option_widget, GDM_TYPE_RECENT_OPTION_WIDGET)
-+
-+static void
-+gdm_layout_option_widget_set_layout_from_dialog (GdmLayoutOptionWidget *widget)
-+{
-+ char *layout_name;
-+
-+ layout_name = gdm_layout_chooser_dialog_get_current_layout_name (GDM_LAYOUT_CHOOSER_DIALOG (widget->priv->dialog));
-+ gdm_layout_option_widget_set_current_layout_name (widget, layout_name);
-+ g_free (layout_name);
-+}
-+
-+static void
-+on_dialog_response (GtkDialog *dialog,
-+ int response_id,
-+ GdmLayoutOptionWidget *widget)
-+{
-+ switch (response_id) {
-+ case GTK_RESPONSE_OK:
-+ gdm_layout_option_widget_set_layout_from_dialog (widget);
-+ break;
-+
-+ default:
-+ break;
-+ }
-+ gtk_widget_hide (GTK_WIDGET (dialog));
-+}
-+
-+static void
-+gdm_layout_option_widget_show_dialog (GdmLayoutOptionWidget *widget)
-+{
-+ gdm_layout_option_widget_set_layout_from_dialog (widget);
-+ gtk_widget_show_all (GTK_WIDGET (widget->priv->dialog));
-+}
-+
-+static void
-+gdm_layout_option_widget_activated (GdmOptionWidget *widget)
-+{
-+ char *active_item_id;
-+
-+ active_item_id = gdm_option_widget_get_active_item (GDM_OPTION_WIDGET (widget));
-+ if (active_item_id == NULL) {
-+ return;
-+ }
-+
-+ if (strcmp (active_item_id, "__other") == 0) {
-+ gdm_layout_option_widget_show_dialog (GDM_LAYOUT_OPTION_WIDGET (widget));
-+ return;
-+ }
-+
-+ gdm_layout_chooser_dialog_set_current_layout_name (GDM_LAYOUT_CHOOSER_DIALOG (GDM_LAYOUT_OPTION_WIDGET (widget)->priv->dialog),
-+ active_item_id);
-+
-+ g_signal_emit (G_OBJECT (widget), signals[LAYOUT_ACTIVATED], 0);
-+}
-+
-+static void
-+gdm_layout_option_widget_class_init (GdmLayoutOptionWidgetClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+ GdmOptionWidgetClass *option_widget_class = GDM_OPTION_WIDGET_CLASS (klass);
-+
-+ object_class->finalize = gdm_layout_option_widget_finalize;
-+
-+ option_widget_class->activated = gdm_layout_option_widget_activated;
-+
-+ signals[LAYOUT_ACTIVATED] = g_signal_new ("layout-activated",
-+ G_TYPE_FROM_CLASS (object_class),
-+ G_SIGNAL_RUN_FIRST,
-+ G_STRUCT_OFFSET (GdmLayoutOptionWidgetClass, layout_activated),
-+ NULL,
-+ NULL,
-+ g_cclosure_marshal_VOID__VOID,
-+ G_TYPE_NONE,
-+ 0);
-+
-+ g_type_class_add_private (klass, sizeof (GdmLayoutOptionWidgetPrivate));
-+}
-+
-+static gboolean
-+gdm_layout_option_widget_lookup_item (GdmRecentOptionWidget *widget,
-+ const char *id,
-+ char **name,
-+ char **comment)
-+{
-+ char *layout;
-+
-+ layout = gdm_get_layout_from_name (id);
-+
-+ if (layout == NULL) {
-+ return FALSE;
-+ }
-+
-+ *name = layout;
-+ *comment = NULL;
-+
-+ return TRUE;
-+}
-+
-+static void
-+create_dialog (GdmLayoutOptionWidget *widget)
-+{
-+ gdm_profile_start (NULL);
-+
-+ g_assert (widget->priv->dialog == NULL);
-+
-+ widget->priv->dialog = gdm_layout_chooser_dialog_new ();
-+
-+ g_signal_connect (GTK_DIALOG (widget->priv->dialog),
-+ "response",
-+ G_CALLBACK (on_dialog_response),
-+ widget);
-+
-+ gdm_profile_end (NULL);
-+}
-+
-+static void
-+gdm_layout_option_widget_init (GdmLayoutOptionWidget *widget)
-+{
-+ GError *error;
-+
-+ widget->priv = GDM_LAYOUT_OPTION_WIDGET_GET_PRIVATE (widget);
-+
-+ error = NULL;
-+ gdm_recent_option_widget_set_gconf_key (GDM_RECENT_OPTION_WIDGET (widget),
-+ "/apps/gdm/simple-greeter/recent-layouts",
-+ gdm_layout_option_widget_lookup_item,
-+ &error);
-+
-+ if (error != NULL) {
-+ g_warning ("Could not read recent layouts from gconf: %s",
-+ error->message);
-+ g_error_free (error);
-+ }
-+
-+ gdm_option_widget_add_item (GDM_OPTION_WIDGET (widget),
-+ "__other",
-+ _("Other..."),
-+ _("Choose a keyboard layout from the "
-+ "full list of available layouts."),
-+ GDM_OPTION_WIDGET_POSITION_BOTTOM);
-+
-+ create_dialog (widget);
-+}
-+
-+static void
-+gdm_layout_option_widget_finalize (GObject *object)
-+{
-+ GdmLayoutOptionWidget *layout_option_widget;
-+
-+ g_return_if_fail (object != NULL);
-+ g_return_if_fail (GDM_IS_LAYOUT_OPTION_WIDGET (object));
-+
-+ layout_option_widget = GDM_LAYOUT_OPTION_WIDGET (object);
-+
-+ g_return_if_fail (layout_option_widget->priv != NULL);
-+
-+ G_OBJECT_CLASS (gdm_layout_option_widget_parent_class)->finalize (object);
-+}
-+
-+GtkWidget *
-+gdm_layout_option_widget_new (void)
-+{
-+ GObject *object;
-+
-+ object = g_object_new (GDM_TYPE_LAYOUT_OPTION_WIDGET,
-+ "label-text", _("_Keyboard:"),
-+ "icon-name", "keyboard",
-+ "max-item-count", 8,
-+ NULL);
-+
-+ return GTK_WIDGET (object);
-+}
-+
-+char *
-+gdm_layout_option_widget_get_current_layout_name (GdmLayoutOptionWidget *widget)
-+{
-+ char *active_item_id;
-+
-+ active_item_id = gdm_option_widget_get_active_item (GDM_OPTION_WIDGET (widget));
-+ if (active_item_id == NULL) {
-+ return NULL;
-+ }
-+
-+ if (strcmp (active_item_id, "__other") == 0) {
-+ g_free (active_item_id);
-+ return NULL;
-+ }
-+
-+ return active_item_id;
-+}
-+
-+void
-+gdm_layout_option_widget_set_current_layout_name (GdmLayoutOptionWidget *widget,
-+ const char *id)
-+{
-+ g_return_if_fail (GDM_IS_LAYOUT_OPTION_WIDGET (widget));
-+
-+ if (id != NULL &&
-+ !gdm_option_widget_lookup_item (GDM_OPTION_WIDGET (widget),
-+ id, NULL, NULL, NULL)) {
-+ gdm_recent_option_widget_add_item (GDM_RECENT_OPTION_WIDGET (widget),
-+ id);
-+ }
-+
-+ gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), id);
-+}
-diff -up /dev/null gdm-2.22.0/gui/simple-greeter/gdm-layout-option-widget.h
---- /dev/null 2008-05-05 08:19:33.312003896 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-layout-option-widget.h 2008-05-05 11:28:39.000000000 -0400
-@@ -0,0 +1,62 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2008 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * Written by: Ray Strode
-+ */
-+
-+#ifndef __GDM_LAYOUT_OPTION_WIDGET_H
-+#define __GDM_LAYOUT_OPTION_WIDGET_H
-+
-+#include
-+
-+#include "gdm-recent-option-widget.h"
-+
-+G_BEGIN_DECLS
-+
-+#define GDM_TYPE_LAYOUT_OPTION_WIDGET (gdm_layout_option_widget_get_type ())
-+#define GDM_LAYOUT_OPTION_WIDGET(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_LAYOUT_OPTION_WIDGET, GdmLayoutOptionWidget))
-+#define GDM_LAYOUT_OPTION_WIDGET_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_LAYOUT_OPTION_WIDGET, GdmLayoutOptionWidgetClass))
-+#define GDM_IS_LAYOUT_OPTION_WIDGET(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_LAYOUT_OPTION_WIDGET))
-+#define GDM_IS_LAYOUT_OPTION_WIDGET_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_LAYOUT_OPTION_WIDGET))
-+#define GDM_LAYOUT_OPTION_WIDGET_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_LAYOUT_OPTION_WIDGET, GdmLayoutOptionWidgetClass))
-+
-+typedef struct GdmLayoutOptionWidgetPrivate GdmLayoutOptionWidgetPrivate;
-+
-+typedef struct
-+{
-+ GdmRecentOptionWidget parent;
-+ GdmLayoutOptionWidgetPrivate *priv;
-+} GdmLayoutOptionWidget;
-+
-+typedef struct
-+{
-+ GdmRecentOptionWidgetClass parent_class;
-+
-+ void (* layout_activated) (GdmLayoutOptionWidget *widget);
-+} GdmLayoutOptionWidgetClass;
-+
-+GType gdm_layout_option_widget_get_type (void);
-+GtkWidget * gdm_layout_option_widget_new (void);
-+
-+char * gdm_layout_option_widget_get_current_layout_name (GdmLayoutOptionWidget *widget);
-+void gdm_layout_option_widget_set_current_layout_name (GdmLayoutOptionWidget *widget,
-+ const char *name);
-+
-+
-+
-+#endif /* __GDM_LAYOUT_OPTION_WIDGET_H */
-diff -up /dev/null gdm-2.22.0/gui/simple-greeter/gdm-layouts.c
---- /dev/null 2008-05-05 08:19:33.312003896 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-layouts.c 2008-05-05 11:28:39.000000000 -0400
-@@ -0,0 +1,204 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-+ *
-+ * Copyright 2008 Red Hat, Inc,
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * Written by : Matthias Clasen
-+ */
-+
-+#include "config.h"
-+
-+#include
-+
-+#include
-+
-+#include
-+#include
-+#include
-+
-+#include "gdm-layouts.h"
-+
-+static XklEngine *engine = NULL;
-+static XklConfigRegistry *config_registry = NULL;
-+static XklConfigRec *initial_config = NULL;
-+
-+static void
-+init_xkl (void)
-+{
-+ if (config_registry == NULL) {
-+ engine = xkl_engine_get_instance (GDK_DISPLAY ());
-+ xkl_engine_backup_names_prop (engine);
-+ config_registry = xkl_config_registry_get_instance (engine);
-+ xkl_config_registry_load (config_registry);
-+
-+ initial_config = xkl_config_rec_new ();
-+ if (!xkl_config_rec_get_from_backup (initial_config, engine)) {
-+ g_warning ("failed to load XKB configuration");
-+ initial_config->model = g_strdup ("pc105");
-+ }
-+ }
-+}
-+
-+static char *
-+xci_desc_to_utf8 (XklConfigItem * ci)
-+{
-+ char *sd = g_strstrip (ci->description);
-+ return sd[0] == 0 ? g_strdup (ci->name) :
-+ g_locale_to_utf8 (sd, -1, NULL, NULL, NULL);
-+}
-+
-+gchar *
-+gdm_get_layout_from_name (const char *name)
-+{
-+ XklConfigItem *item;
-+ gchar *layout, *variant, *result;
-+ char *id1, *id2, *p;
-+
-+ init_xkl ();
-+
-+ id1 = g_strdup (name);
-+ p = strchr (id1, '\t');
-+
-+ if (p) {
-+ id2 = p + 1;
-+ *p = 0;
-+ }
-+ else
-+ id2 = NULL;
-+
-+ item = xkl_config_item_new ();
-+
-+ g_snprintf (item->name, XKL_MAX_CI_NAME_LENGTH, id1);
-+ if (xkl_config_registry_find_layout (config_registry, item))
-+ layout = xci_desc_to_utf8 (item);
-+ else
-+ layout = g_strdup_printf ("Layout %s", id1);
-+
-+ if (id2) {
-+ g_snprintf (item->name, XKL_MAX_CI_NAME_LENGTH, id2);
-+ if (xkl_config_registry_find_variant (config_registry, id1, item))
-+ variant = xci_desc_to_utf8 (item);
-+ else
-+ variant = g_strdup_printf ("Variant %s", id2);
-+ }
-+ else
-+ variant = NULL;
-+
-+ g_object_unref (item);
-+
-+ g_free (id1);
-+
-+ if (variant) {
-+ result = g_strdup_printf ("%s (%s)", layout, variant);
-+ g_free (layout);
-+ g_free (variant);
-+ }
-+ else
-+ result = layout;
-+
-+ return result;
-+}
-+
-+typedef struct {
-+ GSList *list;
-+ char *layout;
-+} LayoutData;
-+
-+static void
-+add_variant (XklConfigRegistry *config,
-+ const XklConfigItem *item,
-+ gpointer data)
-+{
-+ LayoutData *ldata = data;
-+
-+ ldata->list = g_slist_prepend (ldata->list, g_strdup_printf ("%s\t%s", ldata->layout, item->name));
-+}
-+
-+static void
-+add_layout (XklConfigRegistry *config,
-+ const XklConfigItem *item,
-+ gpointer data)
-+{
-+ LayoutData *ldata = data;
-+
-+ ldata->layout = item->name;
-+ ldata->list = g_slist_prepend (ldata->list, g_strdup (item->name));
-+ xkl_config_registry_foreach_layout_variant (config, item->name, add_variant, data);
-+ ldata->layout = NULL;
-+}
-+
-+char **
-+gdm_get_all_layout_names (void)
-+{
-+ GSList *l;
-+ int len, i;
-+ char **layouts;
-+ LayoutData data;
-+
-+ init_xkl ();
-+
-+ data.list = NULL;
-+ data.layout = NULL;
-+
-+ xkl_config_registry_foreach_layout (config_registry, add_layout, &data);
-+
-+ len = g_slist_length (data.list);
-+
-+ layouts = g_new (char *, len + 1);
-+ layouts[len] = NULL;
-+
-+ for (i = 0, l = data.list; i < len; i++, l = l->next)
-+ layouts[len - i - 1] = l->data;
-+
-+ g_slist_free (data.list);
-+
-+ return layouts;
-+}
-+
-+void
-+gdm_layout_activate (const char *layout)
-+{
-+ XklConfigRec *config;
-+ char *p;
-+
-+ init_xkl ();
-+
-+ config = xkl_config_rec_new ();
-+ config->model = g_strdup (initial_config->model);
-+
-+ if (layout == NULL) {
-+ config->layouts = g_strdupv (initial_config->layouts);
-+ config->variants = g_strdupv (initial_config->variants);
-+ config->options = g_strdupv (initial_config->options);
-+ }
-+ else {
-+ config->layouts = g_new0 (gchar *, 2);
-+ config->layouts[0] = g_strdup (layout);
-+
-+ p = strchr (config->layouts[0], '\t');
-+ if (p) {
-+
-+ config->variants = g_new0 (gchar *, 2);
-+ config->layouts[0][p - config->layouts[0]] = 0;
-+ config->variants[0] = g_strdup (p + 1);
-+ }
-+ }
-+
-+ xkl_config_rec_activate (config, engine);
-+
-+ g_object_unref (config);
-+}
-+
-diff -up /dev/null gdm-2.22.0/gui/simple-greeter/gdm-layouts.h
---- /dev/null 2008-05-05 08:19:33.312003896 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-layouts.h 2008-05-05 11:28:39.000000000 -0400
-@@ -0,0 +1,33 @@
-+/* -*- Modex: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
-+ *
-+ * Copyright 2008 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * Written by: Matthias Clasen
-+ */
-+
-+#ifndef __GDM_LAYOUTS_H
-+#define __GDM_LAYOUTS_H
-+
-+G_BEGIN_DECLS
-+
-+char * gdm_get_layout_from_name (const char *name);
-+char ** gdm_get_all_layout_names (void);
-+void gdm_layout_activate (const char *layout);
-+
-+G_END_DECLS
-+
-+#endif /* __GDM_LAYOUT_CHOOSER_WIDGET_H */
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-simple-greeter.schemas.in.keyboard-chooser gdm-2.22.0/gui/simple-greeter/gdm-simple-greeter.schemas.in
---- gdm-2.22.0/gui/simple-greeter/gdm-simple-greeter.schemas.in.keyboard-chooser 2008-05-01 18:35:35.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-simple-greeter.schemas.in 2008-05-05 11:28:39.000000000 -0400
-@@ -226,5 +226,29 @@
-
-
-
-+
-+ /schemas/apps/gdm/simple-greeter/settings-manager-plugins/keyboard/active
-+ /apps/gdm/simple-greeter/settings-manager-plugins/keyboard/active
-+ gdm-simple-greeter
-+ bool
-+ TRUE
-+
-+ True if the keyboard settings manager plugin is enabled.
-+ Set to True to enable the keyboard settings manager plugin.
-+
-+
-+
-+
-+ /schemas/apps/gdm/simple-greeter/settings-manager-plugins/keyboard/priority
-+ /apps/gdm/simple-greeter/settings-manager-plugins/keyboard/priority
-+ gdm-simple-greeter
-+ int
-+ 6
-+
-+ True if the keyboard settings manager plugin is enabled.
-+ Set to True to enable the keyboard settings manager plugin.
-+
-+
-+
-
-
-diff -up gdm-2.22.0/gui/simple-greeter/Makefile.am.keyboard-chooser gdm-2.22.0/gui/simple-greeter/Makefile.am
---- gdm-2.22.0/gui/simple-greeter/Makefile.am.keyboard-chooser 2008-04-17 23:29:26.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/Makefile.am 2008-05-05 11:29:03.000000000 -0400
-@@ -123,6 +123,14 @@ test_greeter_panel_SOURCES = \
- gdm-language-chooser-dialog.c \
- gdm-language-option-widget.h \
- gdm-language-option-widget.c \
-+ gdm-layout-chooser-widget.h \
-+ gdm-layout-chooser-widget.c \
-+ gdm-layout-chooser-dialog.h \
-+ gdm-layout-chooser-dialog.c \
-+ gdm-layout-option-widget.h \
-+ gdm-layout-option-widget.c \
-+ gdm-layouts.h \
-+ gdm-layouts.c \
- gdm-sessions.h \
- gdm-sessions.c \
- gdm-session-option-widget.h \
-@@ -276,6 +284,14 @@ gdm_simple_greeter_SOURCES = \
- gdm-languages.c \
- gdm-language-chooser-widget.h \
- gdm-language-chooser-widget.c \
-+ gdm-layout-chooser-widget.h \
-+ gdm-layout-chooser-widget.c \
-+ gdm-layout-chooser-dialog.h \
-+ gdm-layout-chooser-dialog.c \
-+ gdm-layout-option-widget.h \
-+ gdm-layout-option-widget.c \
-+ gdm-layouts.h \
-+ gdm-layouts.c \
- locarchive.h \
- gdm-language-chooser-dialog.h \
- gdm-language-chooser-dialog.c \
diff --git a/gdm-null-fs.patch b/gdm-null-fs.patch
deleted file mode 100644
index 5fc899c..0000000
--- a/gdm-null-fs.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-Index: gdm/gui/simple-greeter/gdm-user.c
-===================================================================
---- gdm/gui/simple-greeter/gdm-user.c (revision 6253)
-+++ gdm/gui/simple-greeter/gdm-user.c (working copy)
-@@ -750,11 +750,13 @@ render_icon_from_home (GdmUser *user,
- }
- filesystem_type = g_file_info_get_attribute_string (file_info,
- G_FILE_ATTRIBUTE_FILESYSTEM_TYPE);
-- is_local = ((strcmp (filesystem_type, "nfs") != 0) &&
-- (strcmp (filesystem_type, "afs") != 0) &&
-- (strcmp (filesystem_type, "autofs") != 0) &&
-- (strcmp (filesystem_type, "unknown") != 0) &&
-- (strcmp (filesystem_type, "ncpfs") != 0));
-+ if (filesystem_type != NULL) {
-+ is_local = ((strcmp (filesystem_type, "nfs") != 0) &&
-+ (strcmp (filesystem_type, "afs") != 0) &&
-+ (strcmp (filesystem_type, "autofs") != 0) &&
-+ (strcmp (filesystem_type, "unknown") != 0) &&
-+ (strcmp (filesystem_type, "ncpfs") != 0));
-+ }
- g_object_unref (file_info);
- g_object_unref (file);
- }
diff --git a/gdm.spec b/gdm.spec
index e23dee6..a9b7d46 100644
--- a/gdm.spec
+++ b/gdm.spec
@@ -14,13 +14,13 @@
Summary: The GNOME Display Manager
Name: gdm
-Version: 2.22.0
-Release: 12%{?dist}
+Version: 2.23.1
+Release: 0.2008.07.21.1%{?dist}
Epoch: 1
License: GPLv2+
Group: User Interface/X
URL: http://download.gnome.org/sources/gdm
-Source: http://download.gnome.org/sources/gdm/2.22/gdm-%{version}.tar.gz
+Source: http://download.gnome.org/sources/gdm/2.23/gdm-%{version}.tar.bz2
Source1: gdm-pam
Source2: gdm-autologin-pam
Source3: gdmsetup-pam
@@ -77,25 +77,9 @@ BuildRequires: libxklavier-devel
Requires: audit-libs >= %{libauditver}
Patch1: xkb-groups.patch
-# from upstream svn
-Patch2: gdm-keyboard-chooser.patch
-# from upstream svn
-Patch3: show-users.patch
-
-# https://bugzilla.redhat.com/show_bug.cgi?id=446672
-Patch4: gdm-2.22.0-enable-tcp.patch
-
-# fixed in upstream svn
-Patch9: gdm-null-fs.patch
-
-# fixed in upstream svn
-Patch10: lang-tag.patch
-
-# fixed in upstream svn
-Patch11: icon-names.patch
# Fedora-specific
-Patch99: gdm-2.21.8-fedora-logo.patch
+Patch99: gdm-2.23.1-fedora-logo.patch
%package user-switch-applet
Summary: GDM User Switcher Panel Applet
@@ -115,12 +99,6 @@ multiple simulanteous logged in users.
%prep
%setup -q
%patch1 -p1 -b .xkb-groups
-%patch2 -p1 -b .keyboard-chooser
-%patch3 -p1 -b .show-users
-%patch4 -p1 -b .enable-tcp
-%patch9 -p1 -b .null-fs
-%patch10 -p1 -b .lang-tag
-%patch11 -p1 -b .icon-names
%patch99 -p1 -b .fedora-logo
autoreconf
@@ -320,6 +298,9 @@ fi
%{_datadir}/gnome-2.0/ui/GNOME_FastUserSwitchApplet.xml
%changelog
+* Mon Jul 21 2008 Jon McCann - 1:2.23.1.0.2008.07.21.1
+- Update to snapshot
+
* Fri Jul 11 2008 Matthias Clasen - 1:2.22.0-12
- Actually apply the patch
diff --git a/icon-names.patch b/icon-names.patch
deleted file mode 100644
index 32a6310..0000000
--- a/icon-names.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-language-option-widget.c.icon-names gdm-2.22.0/gui/simple-greeter/gdm-language-option-widget.c
---- gdm-2.22.0/gui/simple-greeter/gdm-language-option-widget.c.icon-names 2008-07-10 12:55:21.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-language-option-widget.c 2008-07-10 12:57:47.000000000 -0400
-@@ -233,7 +233,7 @@ gdm_language_option_widget_new (void)
-
- object = g_object_new (GDM_TYPE_LANGUAGE_OPTION_WIDGET,
- "label-text", _("_Language:"),
-- "icon-name", "config-language",
-+ "icon-name", "preferences-desktop-locale",
- "max-item-count", 8,
- NULL);
-
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-layout-option-widget.c.icon-names gdm-2.22.0/gui/simple-greeter/gdm-layout-option-widget.c
---- gdm-2.22.0/gui/simple-greeter/gdm-layout-option-widget.c.icon-names 2008-07-10 13:08:38.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-layout-option-widget.c 2008-07-10 13:06:41.000000000 -0400
-@@ -226,7 +226,7 @@ gdm_layout_option_widget_new (void)
-
- object = g_object_new (GDM_TYPE_LAYOUT_OPTION_WIDGET,
- "label-text", _("_Keyboard:"),
-- "icon-name", "keyboard",
-+ "icon-name", "preferences-desktop-keyboard",
- "max-item-count", 8,
- NULL);
-
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-session-option-widget.c.icon-names gdm-2.22.0/gui/simple-greeter/gdm-session-option-widget.c
diff --git a/lang-tag.patch b/lang-tag.patch
deleted file mode 100644
index 4e4cf48..0000000
--- a/lang-tag.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-language-chooser-widget.c.lang-tag gdm-2.22.0/gui/simple-greeter/gdm-language-chooser-widget.c
---- gdm-2.22.0/gui/simple-greeter/gdm-language-chooser-widget.c.lang-tag 2008-07-10 01:10:23.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-language-chooser-widget.c 2008-07-10 01:10:28.000000000 -0400
-@@ -103,24 +103,30 @@ gdm_language_chooser_widget_add_language
- char *language;
- char *normalized_name;
- char *readable_language;
-+ char *lang_tag;
-+ char *tagged;
-
- normalized_name = gdm_normalize_language_name (name);
-+ gdm_parse_language_name (name, &lang_tag, NULL, NULL, NULL);
- language = gdm_get_language_from_name (normalized_name, normalized_name);
- readable_language = gdm_get_language_from_name (normalized_name, NULL);
-
-+ tagged = g_strdup_printf ("%s", lang_tag, language);
-+
- if (language != NULL) {
- gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
- normalized_name,
- NULL,
-- language,
-- readable_language,
-+ tagged,
-+ readable_language,
- 0,
- FALSE,
- FALSE);
- g_free (language);
- }
- g_free (readable_language);
--
-+ g_free (tagged);
-+ g_free (lang_tag);
- g_free (normalized_name);
- }
-
-diff -up gdm-2.22.0/gui/simple-greeter/gdm-language-option-widget.c.lang-tag gdm-2.22.0/gui/simple-greeter/gdm-language-option-widget.c
---- gdm-2.22.0/gui/simple-greeter/gdm-language-option-widget.c.lang-tag 2008-07-10 11:42:07.000000000 -0400
-+++ gdm-2.22.0/gui/simple-greeter/gdm-language-option-widget.c 2008-07-10 11:42:24.000000000 -0400
-@@ -146,6 +146,7 @@ gdm_language_option_widget_lookup_item (
- {
- char *language;
- char *readable_language;
-+ char *lang_tag;
-
- language = gdm_get_language_from_name (locale, locale);
-
-@@ -154,10 +155,13 @@ gdm_language_option_widget_lookup_item (
- }
-
- readable_language = gdm_get_language_from_name (locale, NULL);
--
-- *name = language;
-+ gdm_parse_language_name (locale, &lang_tag, NULL, NULL, NULL);
-+ *name = g_strdup_printf ("%s", lang_tag, language);
- *comment = readable_language;
-
-+ g_free (language);
-+ g_free (lang_tag);
-+
- return TRUE;
- }
-
diff --git a/show-users.patch b/show-users.patch
deleted file mode 100644
index db5c083..0000000
--- a/show-users.patch
+++ /dev/null
@@ -1,90 +0,0 @@
---- gdm-2.22.0/gui/simple-greeter/gdm-user-chooser-widget.c 2008-05-01 18:35:35.000000000 -0400
-+++ hacked/gui/simple-greeter/gdm-user-chooser-widget.c 2008-05-07 20:27:09.000000000 -0400
-@@ -34,9 +34,14 @@
- #include
- #include
-
-+#include
-+
- #include "gdm-user-manager.h"
- #include "gdm-user-chooser-widget.h"
-
-+
-+#define KEY_DISABLE_USER_LIST "/apps/gdm/simple-greeter/disable_user_list"
-+
- enum {
- USER_NO_DISPLAY = 1 << 0,
- USER_ACCOUNT_DISABLED = 1 << 1,
-@@ -59,6 +64,7 @@
- guint show_other_user : 1;
- guint show_guest_user : 1;
- guint show_auto_user : 1;
-+ guint show_normal_users : 1;
- };
-
- enum {
-@@ -231,6 +237,25 @@
- }
- }
-
-+static gboolean
-+is_user_list_disabled (GdmUserChooserWidget *widget)
-+{
-+ GConfClient *client;
-+ GError *error;
-+ gboolean result;
-+
-+ client = gconf_client_get_default ();
-+ error = NULL;
-+ result = gconf_client_get_bool (client, KEY_DISABLE_USER_LIST, &error);
-+ if (error != NULL) {
-+ g_debug ("GdmUserChooserWidget: unable to get disable-user-list configuration: %s", error->message);
-+ g_error_free (error);
-+ }
-+ g_object_unref (client);
-+
-+ return result;
-+}
-+
- static GObject *
- gdm_user_chooser_widget_constructor (GType type,
- guint n_construct_properties,
-@@ -247,6 +272,8 @@
- gdm_user_chooser_widget_set_show_auto_user (user_chooser_widget, FALSE);
- gdm_user_chooser_widget_set_show_other_user (user_chooser_widget, TRUE);
-
-+ user_chooser_widget->priv->show_normal_users = !is_user_list_disabled (user_chooser_widget);
-+
- return G_OBJECT (user_chooser_widget);
- }
-
-@@ -403,6 +430,9 @@
- char *tooltip;
- gboolean is_logged_in;
-
-+ if (!widget->priv->show_normal_users)
-+ return;
-+
- pixbuf = gdm_user_render_icon (user, ICON_SIZE);
- if (pixbuf == NULL && widget->priv->stock_person_pixbuf != NULL) {
- pixbuf = g_object_ref (widget->priv->stock_person_pixbuf);
---- gdm-2.22.0/gui/simple-greeter/gdm-simple-greeter.schemas.in 2008-05-07 20:28:57.000000000 -0400
-+++ hacked/gui/simple-greeter/gdm-simple-greeter.schemas.in 2008-05-07 20:22:33.000000000 -0400
-@@ -68,6 +68,17 @@
-
-
-
-+ /schemas/apps/gdm/simple-greeter/disable_user_list
-+ /apps/gdm/simple-greeter/disable_user_list
-+ gdm-simple-greeter
-+ bool
-+ FALSE
-+
-+ Do not show known users in the login window
-+ Set to TRUE to disable showing known users in the login window.
-+
-+
-+
- /schemas/apps/gdm/simple-greeter/wm_use_compiz
- /apps/gdm/simple-greeter/wm_use_compiz
- gdm-simple-greeter
diff --git a/sources b/sources
index c8d4f5b..1c55177 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-a66ce7c64a33a1bc8a9e9c629b459d4f gdm-2.22.0.tar.gz
+71db0fad83a2163101fe5d37f65688fa gdm-2.23.1.tar.bz2