summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac1
-rw-r--r--doc/Makefile.am2
-rw-r--r--doc/lightdm-gobject-1-docs.sgml2
-rw-r--r--doc/lightdm-gobject-1-sections.txt106
-rw-r--r--doc/tmpl/greeter.sgml151
-rw-r--r--doc/tmpl/language.sgml22
-rw-r--r--doc/tmpl/layout.sgml30
-rw-r--r--doc/tmpl/power.sgml90
-rw-r--r--doc/tmpl/session.sgml13
-rw-r--r--doc/tmpl/system.sgml31
-rw-r--r--doc/tmpl/user.sgml84
-rw-r--r--greeters/gtk/lightdm-gtk-greeter.c50
-rw-r--r--greeters/qt/loginprompt.cpp2
-rw-r--r--liblightdm-gobject/Makefile.am25
-rw-r--r--liblightdm-gobject/greeter.c722
-rw-r--r--liblightdm-gobject/language.c89
-rw-r--r--liblightdm-gobject/layout.c92
-rw-r--r--liblightdm-gobject/liblightdm-gobject-1.vapi55
-rw-r--r--liblightdm-gobject/lightdm.h25
-rw-r--r--liblightdm-gobject/lightdm/Makefile.am10
-rw-r--r--liblightdm-gobject/lightdm/greeter.h43
-rw-r--r--liblightdm-gobject/lightdm/language.h4
-rw-r--r--liblightdm-gobject/lightdm/layout.h6
-rw-r--r--liblightdm-gobject/lightdm/power.h33
-rw-r--r--liblightdm-gobject/lightdm/session.h2
-rw-r--r--liblightdm-gobject/lightdm/system.h21
-rw-r--r--liblightdm-gobject/lightdm/user-list.h54
-rw-r--r--liblightdm-gobject/lightdm/user.h31
-rw-r--r--liblightdm-gobject/power.c205
-rw-r--r--liblightdm-gobject/session.c95
-rw-r--r--liblightdm-gobject/system.c34
-rw-r--r--liblightdm-gobject/user-list.c6
-rw-r--r--liblightdm-gobject/user.c816
-rw-r--r--liblightdm-qt/QLightDM/greeter.h4
-rw-r--r--liblightdm-qt/greeter.cpp12
-rw-r--r--src/greeter.c8
-rw-r--r--tests/scripts/login-gobject-guest-disabled.script2
-rw-r--r--tests/scripts/login-gobject-guest-fail-setup-script.script2
-rw-r--r--tests/scripts/login-gobject-guest-no-config.script2
-rw-r--r--tests/scripts/login-gobject-guest-no-setup-script.script2
-rw-r--r--tests/scripts/login-gobject-guest.script2
-rw-r--r--tests/scripts/login-gobject-invalid-user.script2
-rw-r--r--tests/scripts/login-gobject-logout.script2
-rw-r--r--tests/scripts/login-gobject-manual.script2
-rw-r--r--tests/scripts/login-gobject-no-password.script2
-rw-r--r--tests/scripts/login-gobject-session-crash.script2
-rw-r--r--tests/scripts/login-gobject-wrong-password.script2
-rw-r--r--tests/scripts/login-gobject-xserver-crash.script2
-rw-r--r--tests/scripts/login-gobject.script2
-rw-r--r--tests/scripts/switch-to-greeter.script2
-rw-r--r--tests/scripts/switch-to-user.script2
-rw-r--r--tests/scripts/xdmcp-login.script2
-rw-r--r--tests/src/test-gobject-greeter.c16
53 files changed, 1855 insertions, 1169 deletions
diff --git a/configure.ac b/configure.ac
index 5f5f7211..f0c9d20f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -177,7 +177,6 @@ greeters/gtk/Makefile
greeters/qt/Makefile
liblightdm-gobject/liblightdm-gobject-1.pc
liblightdm-gobject/Makefile
-liblightdm-gobject/lightdm/Makefile
liblightdm-qt/Makefile
liblightdm-qt/liblightdm-qt-1.pc
liblightdm-qt/QLightDM/Makefile
diff --git a/doc/Makefile.am b/doc/Makefile.am
index e67c158b..6594a626 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -4,7 +4,7 @@ DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
DOC_SOURCE_DIR=$(top_srcdir)/liblightdm-gobject
-HFILE_GLOB=$(top_srcdir)/liblightdm-gobject/lightdm/*.h
+HFILE_GLOB=$(top_srcdir)/liblightdm-gobject/lightdm.h
CFILE_GLOB=$(top_srcdir)/liblightdm-gobject/*.c
INCLUDES = \
diff --git a/doc/lightdm-gobject-1-docs.sgml b/doc/lightdm-gobject-1-docs.sgml
index a8be08d3..31fdcb2b 100644
--- a/doc/lightdm-gobject-1-docs.sgml
+++ b/doc/lightdm-gobject-1-docs.sgml
@@ -20,5 +20,7 @@
<xi:include href="xml/layout.xml"/>
<xi:include href="xml/session.xml"/>
<xi:include href="xml/user.xml"/>
+ <xi:include href="xml/power.xml"/>
+ <xi:include href="xml/system.xml"/>
</part>
</book>
diff --git a/doc/lightdm-gobject-1-sections.txt b/doc/lightdm-gobject-1-sections.txt
index 86eaf37a..0e71ca85 100644
--- a/doc/lightdm-gobject-1-sections.txt
+++ b/doc/lightdm-gobject-1-sections.txt
@@ -1,8 +1,29 @@
-<INCLUDE>lightdm/greeter.h</INCLUDE>
+<INCLUDE>lightdm.h</INCLUDE>
+
+<SECTION>
+<FILE>system</FILE>
+<TITLE>System Information</TITLE>
+lightdm_get_hostname
+</SECTION>
+
+<SECTION>
+<FILE>power</FILE>
+<TITLE>Power Management</TITLE>
+lightdm_get_can_suspend
+lightdm_suspend
+lightdm_get_can_hibernate
+lightdm_hibernate
+lightdm_get_can_restart
+lightdm_restart
+lightdm_get_can_shutdown
+lightdm_shutdown
+</SECTION>
<SECTION>
<FILE>language</FILE>
-<TITLE>LightDMLanguage</TITLE>
+<TITLE>Languages</TITLE>
+lightdm_get_languages
+lightdm_get_language
lightdm_language_get_code
lightdm_language_get_name
lightdm_language_get_territory
@@ -20,7 +41,10 @@ lightdm_language_get_type
<SECTION>
<FILE>layout</FILE>
-<TITLE>LightDMLayout</TITLE>
+<TITLE>Keyboard Layout</TITLE>
+lightdm_get_layouts
+lightdm_get_layout
+lightdm_set_layout
lightdm_layout_get_name
lightdm_layout_get_short_description
lightdm_layout_get_description
@@ -36,32 +60,9 @@ lightdm_layout_get_type
</SECTION>
<SECTION>
-<FILE>user</FILE>
-<TITLE>LightDMUser</TITLE>
-changed
-lightdm_user_get_name
-lightdm_user_get_real_name
-lightdm_user_get_display_name
-lightdm_user_get_home_directory
-lightdm_user_get_image
-lightdm_user_get_language
-lightdm_user_get_layout
-lightdm_user_get_session
-lightdm_user_get_logged_in
-<SUBSECTION Standard>
-LIGHTDM_USER
-LIGHTDM_IS_USER
-LIGHTDM_TYPE_USER
-lightdm_user_get_type
-LIGHTDM_USER_CLASS
-LIGHTDM_IS_USER_CLASS
-LIGHTDM_USER_GET_CLASS
-<SUBSECTION Private>
-</SECTION>
-
-<SECTION>
<FILE>session</FILE>
-<TITLE>LightDMSession</TITLE>
+<TITLE>Sessions</TITLE>
+lightdm_get_sessions
lightdm_session_get_key
lightdm_session_get_name
lightdm_session_get_comment
@@ -77,16 +78,33 @@ LIGHTDM_SESSION_GET_CLASS
</SECTION>
<SECTION>
-<FILE>user-list</FILE>
-<TITLE>LightDMUserList</TITLE>
+<FILE>user</FILE>
+<TITLE>User Accounts</TITLE>
+changed
+lightdm_user_get_display_name
+lightdm_user_get_home_directory
+lightdm_user_get_image
+lightdm_user_get_language
+lightdm_user_get_layout
+lightdm_user_get_logged_in
+lightdm_user_get_name
+lightdm_user_get_real_name
+lightdm_user_get_session
user_added
user_changed
user_removed
-lightdm_user_list_new
-lightdm_user_list_get_num_users
+lightdm_user_list_get_instance
+lightdm_user_list_get_length
lightdm_user_list_get_user_by_name
lightdm_user_list_get_users
<SUBSECTION Standard>
+LIGHTDM_IS_USER
+LIGHTDM_IS_USER_CLASS
+LIGHTDM_TYPE_USER
+lightdm_user_get_type
+LIGHTDM_USER
+LIGHTDM_USER_CLASS
+LIGHTDM_USER_GET_CLASS
LIGHTDM_USER_LIST
LIGHTDM_IS_USER_LIST
LIGHTDM_TYPE_USER_LIST
@@ -99,7 +117,7 @@ LIGHTDM_USER_LIST_GET_CLASS
<SECTION>
<FILE>greeter</FILE>
-<TITLE>LightDMGreeter</TITLE>
+<TITLE>Greeter Interface</TITLE>
connected
autologin_timer_expired
show_message
@@ -111,13 +129,6 @@ LightDMMessageType
LightDMPromptType
lightdm_greeter_new
lightdm_greeter_connect_to_server
-lightdm_greeter_get_hostname
-lightdm_greeter_get_default_language
-lightdm_greeter_get_languages
-lightdm_greeter_get_layouts
-lightdm_greeter_get_layout
-lightdm_greeter_set_layout
-lightdm_greeter_get_sessions
lightdm_greeter_get_default_session_hint
lightdm_greeter_get_hint
lightdm_greeter_get_has_guest_account_hint
@@ -127,10 +138,9 @@ lightdm_greeter_get_select_guest_hint
lightdm_greeter_get_autologin_user_hint
lightdm_greeter_get_autologin_guest_hint
lightdm_greeter_get_autologin_timeout_hint
-lightdm_greeter_cancel_timed_login
-lightdm_greeter_login
-lightdm_greeter_login_with_user_prompt
-lightdm_greeter_login_as_guest
+lightdm_greeter_cancel_autologin
+lightdm_greeter_authenticate
+lightdm_greeter_authenticate_as_guest
lightdm_greeter_respond
lightdm_greeter_cancel_authentication
lightdm_greeter_get_in_authentication
@@ -138,14 +148,6 @@ lightdm_greeter_get_is_authenticated
lightdm_greeter_get_authentication_user
lightdm_greeter_start_session
lightdm_greeter_start_default_session
-lightdm_greeter_get_can_suspend
-lightdm_greeter_suspend
-lightdm_greeter_get_can_hibernate
-lightdm_greeter_hibernate
-lightdm_greeter_get_can_restart
-lightdm_greeter_restart
-lightdm_greeter_get_can_shutdown
-lightdm_greeter_shutdown
<SUBSECTION Standard>
LIGHTDM_GREETER
LIGHTDM_IS_GREETER
diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml
index fc6c4803..c3e2761e 100644
--- a/doc/tmpl/greeter.sgml
+++ b/doc/tmpl/greeter.sgml
@@ -1,8 +1,8 @@
<!-- ##### SECTION Title ##### -->
-LightDMGreeter
+Greeter Interface
<!-- ##### SECTION Short_Description ##### -->
-Manages connection to LightDM server and provides greeter functionality
+Make a connection to the LightDM daemon and authenticate users
<!-- ##### SECTION Long_Description ##### -->
<para>
@@ -31,7 +31,7 @@ int main ()
static void connected_cb (LightDMGreeter *greeter)
{
// Start authentication
- lightdm_greeter_login_with_user_prompt (greeter);
+ lightdm_greeter_authenticate (greeter, NULL);
}
static void show_prompt_cb (LightDMGreeter *greeter, const char *text, LightDMPromptType type)
@@ -177,69 +177,6 @@ static void quit_cb (LightDMGreeter *greeter)
@Returns:
-<!-- ##### FUNCTION lightdm_greeter_get_hostname ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
-<!-- ##### FUNCTION lightdm_greeter_get_default_language ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
-<!-- ##### FUNCTION lightdm_greeter_get_languages ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
-<!-- ##### FUNCTION lightdm_greeter_get_layouts ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
-<!-- ##### FUNCTION lightdm_greeter_get_layout ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
-<!-- ##### FUNCTION lightdm_greeter_set_layout ##### -->
-<para>
-
-</para>
-
-@greeter:
-@layout:
-
-
-<!-- ##### FUNCTION lightdm_greeter_get_sessions ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
<!-- ##### FUNCTION lightdm_greeter_get_default_session_hint ##### -->
<para>
@@ -322,7 +259,7 @@ static void quit_cb (LightDMGreeter *greeter)
@Returns:
-<!-- ##### FUNCTION lightdm_greeter_cancel_timed_login ##### -->
+<!-- ##### FUNCTION lightdm_greeter_cancel_autologin ##### -->
<para>
</para>
@@ -330,7 +267,7 @@ static void quit_cb (LightDMGreeter *greeter)
@greeter:
-<!-- ##### FUNCTION lightdm_greeter_login ##### -->
+<!-- ##### FUNCTION lightdm_greeter_authenticate ##### -->
<para>
</para>
@@ -339,15 +276,7 @@ static void quit_cb (LightDMGreeter *greeter)
@username:
-<!-- ##### FUNCTION lightdm_greeter_login_with_user_prompt ##### -->
-<para>
-
-</para>
-
-@greeter:
-
-
-<!-- ##### FUNCTION lightdm_greeter_login_as_guest ##### -->
+<!-- ##### FUNCTION lightdm_greeter_authenticate_as_guest ##### -->
<para>
</para>
@@ -416,71 +345,3 @@ static void quit_cb (LightDMGreeter *greeter)
@greeter:
-<!-- ##### FUNCTION lightdm_greeter_get_can_suspend ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
-<!-- ##### FUNCTION lightdm_greeter_suspend ##### -->
-<para>
-
-</para>
-
-@greeter:
-
-
-<!-- ##### FUNCTION lightdm_greeter_get_can_hibernate ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
-<!-- ##### FUNCTION lightdm_greeter_hibernate ##### -->
-<para>
-
-</para>
-
-@greeter:
-
-
-<!-- ##### FUNCTION lightdm_greeter_get_can_restart ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
-<!-- ##### FUNCTION lightdm_greeter_restart ##### -->
-<para>
-
-</para>
-
-@greeter:
-
-
-<!-- ##### FUNCTION lightdm_greeter_get_can_shutdown ##### -->
-<para>
-
-</para>
-
-@greeter:
-@Returns:
-
-
-<!-- ##### FUNCTION lightdm_greeter_shutdown ##### -->
-<para>
-
-</para>
-
-@greeter:
-
-
diff --git a/doc/tmpl/language.sgml b/doc/tmpl/language.sgml
index c78ffc5d..e8f7269b 100644
--- a/doc/tmpl/language.sgml
+++ b/doc/tmpl/language.sgml
@@ -1,8 +1,8 @@
<!-- ##### SECTION Title ##### -->
-LightDMLanguage
+Languages
<!-- ##### SECTION Short_Description ##### -->
-Information about an available language
+Get information on available languges
<!-- ##### SECTION Long_Description ##### -->
<para>
@@ -20,6 +20,24 @@ Information about an available language
<!-- ##### SECTION Image ##### -->
+<!-- ##### FUNCTION lightdm_get_languages ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_get_language ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
<!-- ##### FUNCTION lightdm_language_get_code ##### -->
<para>
diff --git a/doc/tmpl/layout.sgml b/doc/tmpl/layout.sgml
index 5dc905c6..91db412b 100644
--- a/doc/tmpl/layout.sgml
+++ b/doc/tmpl/layout.sgml
@@ -1,8 +1,8 @@
<!-- ##### SECTION Title ##### -->
-LightDMLayout
+Keyboard Layouts
<!-- ##### SECTION Short_Description ##### -->
-Information about an available keyboard layout
+Control the keyboard layout
<!-- ##### SECTION Long_Description ##### -->
<para>
@@ -20,6 +20,32 @@ Information about an available keyboard layout
<!-- ##### SECTION Image ##### -->
+<!-- ##### FUNCTION lightdm_get_layouts ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_get_layout ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_set_layout ##### -->
+<para>
+
+</para>
+
+@layout:
+
+
<!-- ##### FUNCTION lightdm_layout_get_name ##### -->
<para>
diff --git a/doc/tmpl/power.sgml b/doc/tmpl/power.sgml
new file mode 100644
index 00000000..2d1f5ff5
--- /dev/null
+++ b/doc/tmpl/power.sgml
@@ -0,0 +1,90 @@
+<!-- ##### SECTION Title ##### -->
+Power Management
+
+<!-- ##### SECTION Short_Description ##### -->
+Shutdown, restart, sleep the system
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### SECTION Image ##### -->
+
+
+<!-- ##### FUNCTION lightdm_get_can_suspend ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_suspend ##### -->
+<para>
+
+</para>
+
+@void:
+
+
+<!-- ##### FUNCTION lightdm_get_can_hibernate ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_hibernate ##### -->
+<para>
+
+</para>
+
+@void:
+
+
+<!-- ##### FUNCTION lightdm_get_can_restart ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_restart ##### -->
+<para>
+
+</para>
+
+@void:
+
+
+<!-- ##### FUNCTION lightdm_get_can_shutdown ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_shutdown ##### -->
+<para>
+
+</para>
+
+@void:
+
+
diff --git a/doc/tmpl/session.sgml b/doc/tmpl/session.sgml
index 7fe247c7..96f850ba 100644
--- a/doc/tmpl/session.sgml
+++ b/doc/tmpl/session.sgml
@@ -1,8 +1,8 @@
<!-- ##### SECTION Title ##### -->
-LightDMSession
+User Sessions
<!-- ##### SECTION Short_Description ##### -->
-Information about an available session
+Choose the session to use
<!-- ##### SECTION Long_Description ##### -->
<para>
@@ -20,6 +20,15 @@ Object containing information about a session type. #LightDMSession objects are
<!-- ##### SECTION Image ##### -->
+<!-- ##### FUNCTION lightdm_get_sessions ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
<!-- ##### FUNCTION lightdm_session_get_key ##### -->
<para>
diff --git a/doc/tmpl/system.sgml b/doc/tmpl/system.sgml
new file mode 100644
index 00000000..c8cdb54c
--- /dev/null
+++ b/doc/tmpl/system.sgml
@@ -0,0 +1,31 @@
+<!-- ##### SECTION Title ##### -->
+System Information
+
+<!-- ##### SECTION Short_Description ##### -->
+Get system infomation
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### SECTION Image ##### -->
+
+
+<!-- ##### FUNCTION lightdm_get_hostname ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
diff --git a/doc/tmpl/user.sgml b/doc/tmpl/user.sgml
index c5aa4750..515d2ba2 100644
--- a/doc/tmpl/user.sgml
+++ b/doc/tmpl/user.sgml
@@ -1,8 +1,8 @@
<!-- ##### SECTION Title ##### -->
-LightDMUser
+User Accounts
<!-- ##### SECTION Short_Description ##### -->
-Information about a user account
+Get information on user accounts on this system
<!-- ##### SECTION Long_Description ##### -->
<para>
@@ -44,7 +44,7 @@ A user has the following properties:
@user:
-<!-- ##### FUNCTION lightdm_user_get_name ##### -->
+<!-- ##### FUNCTION lightdm_user_get_display_name ##### -->
<para>
</para>
@@ -53,7 +53,7 @@ A user has the following properties:
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_real_name ##### -->
+<!-- ##### FUNCTION lightdm_user_get_home_directory ##### -->
<para>
</para>
@@ -62,7 +62,7 @@ A user has the following properties:
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_display_name ##### -->
+<!-- ##### FUNCTION lightdm_user_get_image ##### -->
<para>
</para>
@@ -71,7 +71,7 @@ A user has the following properties:
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_home_directory ##### -->
+<!-- ##### FUNCTION lightdm_user_get_language ##### -->
<para>
</para>
@@ -80,7 +80,7 @@ A user has the following properties:
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_image ##### -->
+<!-- ##### FUNCTION lightdm_user_get_layout ##### -->
<para>
</para>
@@ -89,7 +89,7 @@ A user has the following properties:
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_language ##### -->
+<!-- ##### FUNCTION lightdm_user_get_logged_in ##### -->
<para>
</para>
@@ -98,7 +98,16 @@ A user has the following properties:
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_layout ##### -->
+<!-- ##### FUNCTION lightdm_user_get_name ##### -->
+<para>
+
+</para>
+
+@user:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_user_get_real_name ##### -->
<para>
</para>
@@ -116,12 +125,67 @@ A user has the following properties:
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_logged_in ##### -->
+<!-- ##### USER_FUNCTION user_added ##### -->
+<para>
+
+</para>
+
+@user_list:
+@user:
+
+
+<!-- ##### USER_FUNCTION user_changed ##### -->
<para>
</para>
+@user_list:
@user:
+
+
+<!-- ##### USER_FUNCTION user_removed ##### -->
+<para>
+
+</para>
+
+@user_list:
+@user:
+
+
+<!-- ##### FUNCTION lightdm_user_list_get_instance ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_user_list_get_length ##### -->
+<para>
+
+</para>
+
+@user_list:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_user_list_get_user_by_name ##### -->
+<para>
+
+</para>
+
+@user_list:
+@username:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_user_list_get_users ##### -->
+<para>
+
+</para>
+
+@user_list:
@Returns:
diff --git a/greeters/gtk/lightdm-gtk-greeter.c b/greeters/gtk/lightdm-gtk-greeter.c
index bab73f67..c89d85c0 100644
--- a/greeters/gtk/lightdm-gtk-greeter.c
+++ b/greeters/gtk/lightdm-gtk-greeter.c
@@ -16,10 +16,9 @@
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
-#include "lightdm/greeter.h"
+#include "lightdm.h"
static LightDMGreeter *greeter;
-static LightDMUserList *user_list;
static GtkWidget *window, *message_label, *user_view;
static GdkPixbuf *background_pixbuf = NULL;
static GtkWidget *prompt_box, *prompt_label, *prompt_entry, *session_combo;
@@ -71,22 +70,22 @@ start_authentication (const gchar *username)
if (strcmp (username, "*other") == 0)
{
- lightdm_greeter_login_with_user_prompt (greeter);
+ lightdm_greeter_authenticate (greeter, NULL);
}
else if (strcmp (username, "*guest") == 0)
{
- lightdm_greeter_login_as_guest (greeter);
+ lightdm_greeter_authenticate_as_guest (greeter);
}
else
{
LightDMUser *user;
- user = lightdm_user_list_get_user_by_name (user_list, username);
+ user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
if (user)
set_session (lightdm_user_get_session (user));
else
set_session (lightdm_greeter_get_default_session_hint (greeter));
- lightdm_greeter_login (greeter, username);
+ lightdm_greeter_authenticate (greeter, username);
}
}
@@ -192,7 +191,7 @@ authentication_complete_cb (LightDMGreeter *greeter)
gtk_label_set_text (GTK_LABEL (message_label), "Failed to authenticate");
gtk_widget_show (message_label);
if (lightdm_greeter_get_hide_users_hint (greeter))
- lightdm_greeter_login_with_user_prompt (greeter);
+ lightdm_greeter_authenticate (greeter, NULL);
}
}
@@ -201,9 +200,9 @@ autologin_timer_expired_cb (LightDMGreeter *greeter)
{
set_session (lightdm_greeter_get_default_session_hint (greeter));
if (lightdm_greeter_get_autologin_guest_hint (greeter))
- lightdm_greeter_login_as_guest (greeter);
+ lightdm_greeter_authenticate_as_guest (greeter);
else if (lightdm_greeter_get_autologin_user_hint (greeter))
- lightdm_greeter_login (greeter, lightdm_greeter_get_autologin_user_hint (greeter));
+ lightdm_greeter_authenticate (greeter, lightdm_greeter_get_autologin_user_hint (greeter));
}
void suspend_cb (GtkWidget *widget, LightDMGreeter *greeter);
@@ -211,7 +210,7 @@ G_MODULE_EXPORT
void
suspend_cb (GtkWidget *widget, LightDMGreeter *greeter)
{
- lightdm_greeter_suspend (greeter);
+ lightdm_suspend ();
}
void hibernate_cb (GtkWidget *widget, LightDMGreeter *greeter);
@@ -219,7 +218,7 @@ G_MODULE_EXPORT
void
hibernate_cb (GtkWidget *widget, LightDMGreeter *greeter)
{
- lightdm_greeter_hibernate (greeter);
+ lightdm_hibernate ();
}
static void
@@ -258,7 +257,7 @@ restart_cb (GtkWidget *widget, LightDMGreeter *greeter)
center_window (GTK_WINDOW (dialog));
if (gtk_dialog_run (GTK_DIALOG (dialog)))
- lightdm_greeter_restart (greeter);
+ lightdm_restart ();
gtk_widget_destroy (dialog);
}
@@ -280,7 +279,7 @@ shutdown_cb (GtkWidget *widget, LightDMGreeter *greeter)
center_window (GTK_WINDOW (dialog));
if (gtk_dialog_run (GTK_DIALOG (dialog)))
- lightdm_greeter_shutdown (greeter);
+ lightdm_shutdown ();
gtk_widget_destroy (dialog);
}
@@ -435,12 +434,11 @@ load_user_list ()
GtkTreeModel *model;
GtkTreeIter iter;
- user_list = lightdm_user_list_new ();
- g_signal_connect (user_list, "user-added", G_CALLBACK (user_added_cb), NULL);
- g_signal_connect (user_list, "user-changed", G_CALLBACK (user_changed_cb), NULL);
- g_signal_connect (user_list, "user-removed", G_CALLBACK (user_removed_cb), NULL);
+ g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), NULL);
+ g_signal_connect (lightdm_user_list_get_instance (), "user-changed", G_CALLBACK (user_changed_cb), NULL);
+ g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL);
- items = lightdm_user_list_get_users (user_list);
+ items = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_view));
for (item = items; item; item = item->next)
@@ -533,7 +531,7 @@ connected_cb (LightDMGreeter *greeter)
message_label = GTK_WIDGET (gtk_builder_get_object (builder, "message_label"));
session_combo = GTK_WIDGET (gtk_builder_get_object (builder, "session_combobox"));
- gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_greeter_get_hostname (greeter));
+ gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
background_image = NULL; // FIXME
if (background_image)
@@ -568,13 +566,13 @@ connected_cb (LightDMGreeter *greeter)
gdk_window_set_back_pixmap (root, pixmap, FALSE);
}
- if (!lightdm_greeter_get_can_suspend (greeter))
+ if (!lightdm_get_can_suspend ())
gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "suspend_menuitem")));
- if (!lightdm_greeter_get_can_hibernate (greeter))
+ if (!lightdm_get_can_hibernate ())
gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "hibernate_menuitem")));
- if (!lightdm_greeter_get_can_restart (greeter))
+ if (!lightdm_get_can_restart ())
gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "restart_menuitem")));
- if (!lightdm_greeter_get_can_shutdown (greeter))
+ if (!lightdm_get_can_shutdown ())
gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "shutdown_menuitem")));
user_view = GTK_WIDGET (gtk_builder_get_object (builder, "user_treeview"));
@@ -582,20 +580,20 @@ connected_cb (LightDMGreeter *greeter)
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (user_view), 1, "Name", gtk_cell_renderer_text_new(), "text", 1, NULL);
if (lightdm_greeter_get_hide_users_hint (greeter))
- lightdm_greeter_login_with_user_prompt (greeter);
+ lightdm_greeter_authenticate (greeter, NULL);
else
{
load_user_list ();
gtk_widget_show (user_view);
}
- // FIXME: Select the requested user if lightdm_greeter_get_timed_login_user () && lightdm_greeter_get_timed_login_delay () == 0
+ // FIXME: Select the requested user if lightdm_greeter_get_select_user_hint () set
renderer = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (session_combo), renderer, TRUE);
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (session_combo), renderer, "text", 0);
model = gtk_combo_box_get_model (GTK_COMBO_BOX (session_combo));
- items = lightdm_greeter_get_sessions (greeter);
+ items = lightdm_get_sessions ();
for (item = items; item; item = item->next)
{
LightDMSession *session = item->data;
diff --git a/greeters/qt/loginprompt.cpp b/greeters/qt/loginprompt.cpp
index 53e4df68..5a7f6251 100644
--- a/greeters/qt/loginprompt.cpp
+++ b/greeters/qt/loginprompt.cpp
@@ -49,7 +49,7 @@ void LoginPrompt::onLoginButtonClicked()
ui->feedbackLabel->setText(QString());
QModelIndex currentIndex = ui->userListView->currentIndex();
if (currentIndex.isValid()) {
- m_greeter->login(currentIndex.data(QLightDM::UsersModel::NameRole).toString());
+ m_greeter->authenticate(currentIndex.data(QLightDM::UsersModel::NameRole).toString());
}
}
diff --git a/liblightdm-gobject/Makefile.am b/liblightdm-gobject/Makefile.am
index 11ac8785..ed25e59f 100644
--- a/liblightdm-gobject/Makefile.am
+++ b/liblightdm-gobject/Makefile.am
@@ -1,5 +1,3 @@
-SUBDIRS = lightdm
-
lib_LTLIBRARIES = liblightdm-gobject-1.la
CLEANFILES =
@@ -9,19 +7,28 @@ liblightdm_gobject_1_la_CFLAGS = $(LIBLIGHTDM_GOBJECT_CFLAGS) \
$(WARN_CFLAGS) \
-DXSESSIONS_DIR=\"$(datadir)/xsessions\"
+mainheader_HEADERS = lightdm.h
+mainheaderdir=$(includedir)/lightdm-gobject-1
+
+liblightdm_gobject_1include_HEADERS = \
+ lightdm/greeter.h \
+ lightdm/system.h \
+ lightdm/language.h \
+ lightdm/layout.h \
+ lightdm/power.h \
+ lightdm/session.h \
+ lightdm/user.h
+liblightdm_gobject_1includedir=$(mainheaderdir)/lightdm
+
liblightdm_gobject_1_la_SOURCES= \
greeter.c \
+ system.c \
language.c \
layout.c \
+ power.c \
session.c \
user.c \
- user-list.c \
- lightdm/greeter.h \
- lightdm/language.h \
- lightdm/layout.h \
- lightdm/session.h \
- lightdm/user-list.h \
- lightdm/user.h
+ $(liblightdm_gobject_1include_HEADERS)
if HAVE_INTROSPECTION
diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c
index 42461332..fe821030 100644
--- a/liblightdm-gobject/greeter.c
+++ b/liblightdm-gobject/greeter.c
@@ -12,24 +12,13 @@
#include <config.h>
#include <stdlib.h>
-#include <errno.h>
#include <string.h>
-#include <locale.h>
-#include <sys/utsname.h>
-#include <pwd.h>
-#include <gio/gdesktopappinfo.h>
#include <security/pam_appl.h>
-#include <libxklavier/xklavier.h>
#include "lightdm/greeter.h"
enum {
PROP_0,
- PROP_HOSTNAME,
- PROP_DEFAULT_LANGUAGE,
- PROP_LAYOUTS,
- PROP_LAYOUT,
- PROP_SESSIONS,
PROP_DEFAULT_SESSION_HINT,
PROP_HIDE_USERS_HINT,
PROP_HAS_GUEST_ACCOUNT_HINT,
@@ -41,10 +30,6 @@ enum {
PROP_AUTHENTICATION_USER,
PROP_IN_AUTHENTICATION,
PROP_IS_AUTHENTICATED,
- PROP_CAN_SUSPEND,
- PROP_CAN_HIBERNATE,
- PROP_CAN_RESTART,
- PROP_CAN_SHUTDOWN
};
enum {
@@ -61,39 +46,18 @@ static guint signals[LAST_SIGNAL] = { 0 };
typedef struct
{
- GDBusConnection *system_bus;
-
GIOChannel *to_server_channel, *from_server_channel;
guint8 *read_buffer;
gsize n_read;
- Display *display;
-
- gchar *hostname;
-
- LightDMUserList *user_list;
-
- gboolean have_languages;
- GList *languages;
-
- XklEngine *xkl_engine;
- XklConfigRec *xkl_config;
- gboolean have_layouts;
- GList *layouts;
- gchar *layout;
-
- gboolean have_sessions;
- GList *sessions;
+ GHashTable *hints;
+ guint autologin_timeout;
gchar *authentication_user;
gboolean in_authentication;
gboolean is_authenticated;
guint32 authenticate_sequence_number;
gboolean cancelling_authentication;
-
- GHashTable *hints;
-
- guint login_timeout;
} LightDMGreeterPrivate;
G_DEFINE_TYPE (LightDMGreeter, lightdm_greeter, G_TYPE_OBJECT);
@@ -107,8 +71,8 @@ G_DEFINE_TYPE (LightDMGreeter, lightdm_greeter, G_TYPE_OBJECT);
typedef enum
{
GREETER_MESSAGE_CONNECT = 0,
- GREETER_MESSAGE_LOGIN,
- GREETER_MESSAGE_LOGIN_AS_GUEST,
+ GREETER_MESSAGE_AUTHENTICATE,
+ GREETER_MESSAGE_AUTHENTICATE_AS_GUEST,
GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
GREETER_MESSAGE_START_SESSION,
GREETER_MESSAGE_CANCEL_AUTHENTICATION
@@ -143,7 +107,7 @@ timed_login_cb (gpointer data)
LightDMGreeter *greeter = data;
LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
- priv->login_timeout = 0;
+ priv->autologin_timeout = 0;
g_signal_emit (G_OBJECT (greeter), signals[AUTOLOGIN_TIMER_EXPIRED], 0);
return FALSE;
@@ -282,7 +246,7 @@ handle_connected (LightDMGreeter *greeter, guint32 length, gsize *offset)
if (timeout)
{
g_debug ("Setting autologin timer for %d seconds", timeout);
- priv->login_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter);
+ priv->autologin_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter);
}
g_signal_emit (G_OBJECT (greeter), signals[CONNECTED], 0);
}
@@ -481,7 +445,6 @@ gboolean
lightdm_greeter_connect_to_server (LightDMGreeter *greeter)
{
LightDMGreeterPrivate *priv;
- GError *error = NULL;
const gchar *fd;
guint8 message[MAX_MESSAGE_LENGTH];
gsize offset = 0;
@@ -490,12 +453,7 @@ lightdm_greeter_connect_to_server (LightDMGreeter *greeter)
priv = GET_PRIVATE (greeter);
- priv->system_bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
- if (!priv->system_bus)
- g_warning ("Failed to connect to system bus: %s", error->message);
- g_clear_error (&error);
-
- fd = getenv ("LIGHTDM_TO_SERVER_FD");
+ fd = g_getenv ("LIGHTDM_TO_SERVER_FD");
if (!fd)
{
g_warning ("No LIGHTDM_TO_SERVER_FD environment variable");
@@ -504,7 +462,7 @@ lightdm_greeter_connect_to_server (LightDMGreeter *greeter)
priv->to_server_channel = g_io_channel_unix_new (atoi (fd));
g_io_channel_set_encoding (priv->to_server_channel, NULL, NULL);
- fd = getenv ("LIGHTDM_FROM_SERVER_FD");
+ fd = g_getenv ("LIGHTDM_FROM_SERVER_FD");
if (!fd)
{
g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable");
@@ -523,324 +481,6 @@ lightdm_greeter_connect_to_server (LightDMGreeter *greeter)
}
/**
- * lightdm_greeter_get_hostname:
- * @greeter: a #LightDMGreeter
- *
- * Return value: The host this greeter is displaying
- **/
-const gchar *
-lightdm_greeter_get_hostname (LightDMGreeter *greeter)
-{
- LightDMGreeterPrivate *priv;
-
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
-
- priv = GET_PRIVATE (greeter);
-
- if (!priv->hostname)
- {
- struct utsname info;
- uname (&info);
- priv->hostname = g_strdup (info.nodename);
- }
-
- return priv->hostname;
-}
-
-static void
-update_languages (LightDMGreeter *greeter)
-{
- LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
- gchar *stdout_text = NULL, *stderr_text = NULL;
- gint exit_status;
- gboolean result;
- GError *error = NULL;
-
- if (priv->have_languages)
- return;
-
- result = g_spawn_command_line_sync ("locale -a", &stdout_text, &stderr_text, &exit_status, &error);
- if (!result || exit_status != 0)
- g_warning ("Failed to get languages, locale -a returned %d: %s", exit_status, error->message);
- else
- {
- gchar **tokens;
- int i;
-
- tokens = g_strsplit_set (stdout_text, "\n\r", -1);
- for (i = 0; tokens[i]; i++)
- {
- LightDMLanguage *language;
- gchar *code;
-
- code = g_strchug (tokens[i]);
- if (code[0] == '\0')
- continue;
-
- /* Ignore the non-interesting languages */
- if (strcmp (code, "C") == 0 || strcmp (code, "POSIX") == 0)
- continue;
-
- language = g_object_new (LIGHTDM_TYPE_LANGUAGE, "code", code, NULL);
- priv->languages = g_list_append (priv->languages, language);
- }
-
- g_strfreev (tokens);
- }
-
- g_clear_error (&error);
- g_free (stdout_text);
- g_free (stderr_text);
-
- priv->have_languages = TRUE;
-}
-
-/**
- * lightdm_greeter_get_default_language:
- * @greeter: A #LightDMGreeter
- *
- * Get the default language.
- *
- * Return value: The default language.
- **/
-const gchar *
-lightdm_greeter_get_default_language (LightDMGreeter *greeter)
-{
- gchar *lang;
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
- lang = getenv ("LANG");
- if (lang)
- return lang;
- else
- return "C";
-}
-
-/**
- * lightdm_greeter_get_languages:
- * @greeter: A #LightDMGreeter
- *
- * Get a list of languages to present to the user.
- *
- * Return value: (element-type LightDMLanguage) (transfer none): A list of #LightDMLanguage that should be presented to the user.
- **/
-GList *
-lightdm_greeter_get_languages (LightDMGreeter *greeter)
-{
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
- update_languages (greeter);
- return GET_PRIVATE (greeter)->languages;
-}
-
-static void
-layout_cb (XklConfigRegistry *config,
- const XklConfigItem *item,
- gpointer data)
-{
- LightDMGreeter *greeter = data;
- LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
- LightDMLayout *layout;
-
- layout = g_object_new (LIGHTDM_TYPE_LAYOUT, "name", item->name, "short-description", item->short_description, "description", item->description, NULL);
- priv->layouts = g_list_append (priv->layouts, layout);
-}
-
-static void
-setup_display (LightDMGreeter *greeter)
-{
- LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
- if (!priv->display)
- priv->display = XOpenDisplay (NULL);
-}
-
-static void
-setup_xkl (LightDMGreeter *greeter)
-{
- LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
-
- setup_display (greeter);
-
- priv->xkl_engine = xkl_engine_get_instance (priv->display);
- priv->xkl_config = xkl_config_rec_new ();
- if (!xkl_config_rec_get_from_server (priv->xkl_config, priv->xkl_engine))
- g_warning ("Failed to get Xkl configuration from server");
- priv->layout = g_strdup (priv->xkl_config->layouts[0]);
-}
-
-/**
- * lightdm_greeter_get_layouts:
- * @greeter: A #LightDMGreeter
- *
- * Get a list of keyboard layouts to present to the user.
- *
- * Return value: (element-type LightDMLayout) (transfer none): A list of #LightDMLayout that should be presented to the user.
- **/
-GList *
-lightdm_greeter_get_layouts (LightDMGreeter *greeter)
-{
- LightDMGreeterPrivate *priv;
- XklConfigRegistry *registry;
-
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
-
- priv = GET_PRIVATE (greeter);
-
- if (priv->have_layouts)
- return priv->layouts;
-
- setup_xkl (greeter);
-
- registry = xkl_config_registry_get_instance (priv->xkl_engine);
- xkl_config_registry_load (registry, FALSE);
- xkl_config_registry_foreach_layout (registry, layout_cb, greeter);
- g_object_unref (registry);
- priv->have_layouts = TRUE;
-
- return priv->layouts;
-}
-
-/**
- * lightdm_greeter_set_layout:
- * @greeter: A #LightDMGreeter
- * @layout: The layout to use
- *
- * Set the layout for this session.
- **/
-void
-lightdm_greeter_set_layout (LightDMGreeter *greeter, const gchar *layout)
-{
- LightDMGreeterPrivate *priv;
- XklConfigRec *config;
-
- g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
- g_return_if_fail (layout != NULL);
-
- priv = GET_PRIVATE (greeter);
-
- g_debug ("Setting keyboard layout to %s", layout);
-
- setup_xkl (greeter);
-
- config = xkl_config_rec_new ();
- config->layouts = g_malloc (sizeof (gchar *) * 2);
- config->model = g_strdup (priv->xkl_config->model);
- config->layouts[0] = g_strdup (layout);
- config->layouts[1] = NULL;
- if (!xkl_config_rec_activate (config, priv->xkl_engine))
- g_warning ("Failed to activate XKL config");
- else
- priv->layout = g_strdup (layout);
- g_object_unref (config);
-}
-
-/**
- * lightdm_greeter_get_layout:
- * @greeter: A #LightDMGreeter
- *
- * Get the current keyboard layout.
- *
- * Return value: The currently active layout for this user.
- **/
-const gchar *
-lightdm_greeter_get_layout (LightDMGreeter *greeter)
-{
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
- setup_xkl (greeter);
- return GET_PRIVATE (greeter)->layout;
-}
-
-static void
-update_sessions (LightDMGreeter *greeter)
-{
- LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
- GDir *directory;
- GError *error = NULL;
-
- if (priv->have_sessions)
- return;
-
- directory = g_dir_open (XSESSIONS_DIR, 0, &error);
- if (!directory)
- g_warning ("Failed to open sessions directory: %s", error->message);
- g_clear_error (&error);
- if (!directory)
- return;
-
- while (TRUE)
- {
- const gchar *filename;
- GKeyFile *key_file;
- gchar *key, *path;
- gboolean result;
-
- filename = g_dir_read_name (directory);
- if (filename == NULL)
- break;
-
- if (!g_str_has_suffix (filename, ".desktop"))
- continue;
-
- key = g_strndup (filename, strlen (filename) - strlen (".desktop"));
- path = g_build_filename (XSESSIONS_DIR, filename, NULL);
- g_debug ("Loading session %s", path);
-
- key_file = g_key_file_new ();
- result = g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error);
- if (!result)
- g_warning ("Failed to load session file %s: %s:", path, error->message);
- g_clear_error (&error);
-
- if (result && !g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, NULL))
- {
- gchar *domain, *name, *comment;
-
-#ifdef G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN
- domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, NULL);
-#else
- domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-GNOME-Gettext-Domain", NULL);
-#endif
- name = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, domain, NULL);
- comment = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, domain, NULL);
- if (!comment)
- comment = g_strdup ("");
- if (name)
- {
- g_debug ("Loaded session %s (%s, %s)", key, name, comment);
- priv->sessions = g_list_append (priv->sessions, g_object_new (LIGHTDM_TYPE_SESSION, "key", key, "name", name, "comment", comment, NULL));
- }
- else
- g_warning ("Invalid session %s: %s", path, error->message);
- g_free (domain);
- g_free (name);
- g_free (comment);
- }
-
- g_free (key);
- g_free (path);
- g_key_file_free (key_file);
- }
-
- g_dir_close (directory);
-
- priv->have_sessions = TRUE;
-}
-
-/**
- * lightdm_greeter_get_sessions:
- * @greeter: A #LightDMGreeter
- *
- * Get the available sessions.
- *
- * Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession
- **/
-GList *
-lightdm_greeter_get_sessions (LightDMGreeter *greeter)
-{
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
- update_sessions (greeter);
- return GET_PRIVATE (greeter)->sessions;
-}
-
-/**
* lightdm_greeter_get_hint:
* @greeter: A #LightDMGreeter
* @name: The hint name to query.
@@ -1002,13 +642,13 @@ lightdm_greeter_get_autologin_timeout_hint (LightDMGreeter *greeter)
}
/**
- * lightdm_greeter_cancel_timed_login:
+ * lightdm_greeter_cancel_autologin:
* @greeter: A #LightDMGreeter
*
- * Cancel the login as the default user.
+ * Cancel the automatic login.
*/
void
-lightdm_greeter_cancel_timed_login (LightDMGreeter *greeter)
+lightdm_greeter_cancel_autologin (LightDMGreeter *greeter)
{
LightDMGreeterPrivate *priv;
@@ -1016,20 +656,20 @@ lightdm_greeter_cancel_timed_login (LightDMGreeter *greeter)
priv = GET_PRIVATE (greeter);
- if (priv->login_timeout)
- g_source_remove (priv->login_timeout);
- priv->login_timeout = 0;
+ if (priv->autologin_timeout)
+ g_source_remove (priv->autologin_timeout);
+ priv->autologin_timeout = 0;
}
/**
- * lightdm_greeter_login:
+ * lightdm_greeter_authenticate:
* @greeter: A #LightDMGreeter
* @username: (allow-none): A username or #NULL to prompt for a username.
*
* Starts the authentication procedure for a user.
**/
void
-lightdm_greeter_login (LightDMGreeter *greeter, const char *username)
+lightdm_greeter_authenticate (LightDMGreeter *greeter, const char *username)
{
LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
guint8 message[MAX_MESSAGE_LENGTH];
@@ -1048,32 +688,20 @@ lightdm_greeter_login (LightDMGreeter *greeter, const char *username)
priv->authentication_user = g_strdup (username);
g_debug ("Starting authentication for user %s...", username);
- write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_LOGIN, int_length () + string_length (username), &offset);
+ write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE, int_length () + string_length (username), &offset);
write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
write_message (greeter, message, offset);
}
/**
- * lightdm_greeter_login_with_user_prompt:
- * @greeter: A #LightDMGreeter
- *
- * Starts the authentication procedure, prompting the greeter for a username.
- **/
-void
-lightdm_greeter_login_with_user_prompt (LightDMGreeter *greeter)
-{
- lightdm_greeter_login (greeter, NULL);
-}
-
-/**
- * lightdm_greeter_login_as_guest:
+ * lightdm_greeter_authenticate_as_guest:
* @greeter: A #LightDMGreeter
*
* Starts the authentication procedure for the guest user.
**/
void
-lightdm_greeter_login_as_guest (LightDMGreeter *greeter)
+lightdm_greeter_authenticate_as_guest (LightDMGreeter *greeter)
{
LightDMGreeterPrivate *priv;
guint8 message[MAX_MESSAGE_LENGTH];
@@ -1091,7 +719,7 @@ lightdm_greeter_login_as_guest (LightDMGreeter *greeter)
priv->authentication_user = NULL;
g_debug ("Starting authentication for guest account...");
- write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_LOGIN_AS_GUEST, int_length (), &offset);
+ write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, int_length (), &offset);
write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
write_message (greeter, message, offset);
}
@@ -1212,10 +840,10 @@ lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *session)
}
/**
- * lightdm_greeter_start_session_with_defaults:
+ * lightdm_greeter_start_default_session:
* @greeter: A #LightDMGreeter
*
- * Login a user to a session using default settings for that user.
+ * Start the default session for the authenticated user.
**/
void
lightdm_greeter_start_default_session (LightDMGreeter *greeter)
@@ -1223,200 +851,6 @@ lightdm_greeter_start_default_session (LightDMGreeter *greeter)
lightdm_greeter_start_session (greeter, NULL);
}
-static gboolean
-upower_call_function (LightDMGreeter *greeter, const gchar *function, gboolean has_result)
-{
- LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
- GDBusProxy *proxy;
- GVariant *result;
- GError *error = NULL;
- gboolean function_result = FALSE;
-
- if (!priv->system_bus)
- return FALSE;
-
- proxy = g_dbus_proxy_new_sync (priv->system_bus,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL,
- "org.freedesktop.UPower",
- "/org/freedesktop/UPower",
- "org.freedesktop.UPower",
- NULL, NULL);
- result = g_dbus_proxy_call_sync (proxy,
- function,
- NULL,
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error);
- g_object_unref (proxy);
-
- if (!result)
- g_warning ("Error calling UPower function %s: %s", function, error->message);
- g_clear_error (&error);
- if (!result)
- return FALSE;
-
- if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)")))
- g_variant_get (result, "(b)", &function_result);
-
- g_variant_unref (result);
- return function_result;
-}
-
-/**
- * lightdm_greeter_get_can_suspend:
- * @greeter: A #LightDMGreeter
- *
- * Checks if the greeter is authorized to do a system suspend.
- *
- * Return value: #TRUE if the greeter can suspend the system
- **/
-gboolean
-lightdm_greeter_get_can_suspend (LightDMGreeter *greeter)
-{
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
- return upower_call_function (greeter, "SuspendAllowed", TRUE);
-}
-
-/**
- * lightdm_greeter_suspend:
- * @greeter: A #LightDMGreeter
- *
- * Triggers a system suspend.
- **/
-void
-lightdm_greeter_suspend (LightDMGreeter *greeter)
-{
- g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
- upower_call_function (greeter, "Suspend", FALSE);
-}
-
-/**
- * lightdm_greeter_get_can_hibernate:
- * @greeter: A #LightDMGreeter
- *
- * Checks if the greeter is authorized to do a system hibernate.
- *
- * Return value: #TRUE if the greeter can hibernate the system
- **/
-gboolean
-lightdm_greeter_get_can_hibernate (LightDMGreeter *greeter)
-{
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
- return upower_call_function (greeter, "HibernateAllowed", TRUE);
-}
-
-/**
- * lightdm_greeter_hibernate:
- * @greeter: A #LightDMGreeter
- *
- * Triggers a system hibernate.
- **/
-void
-lightdm_greeter_hibernate (LightDMGreeter *greeter)
-{
- g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
- upower_call_function (greeter, "Hibernate", FALSE);
-}
-
-static gboolean
-ck_call_function (LightDMGreeter *greeter, const gchar *function, gboolean has_result)
-{
- LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
- GDBusProxy *proxy;
- GVariant *result;
- GError *error = NULL;
- gboolean function_result = FALSE;
-
- if (!priv->system_bus)
- return FALSE;
-
- proxy = g_dbus_proxy_new_sync (priv->system_bus,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL,
- "org.freedesktop.ConsoleKit",
- "/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
- NULL, NULL);
- result = g_dbus_proxy_call_sync (proxy,
- function,
- NULL,
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error);
- g_object_unref (proxy);
-
- if (!result)
- g_warning ("Error calling ConsoleKit function %s: %s", function, error->message);
- g_clear_error (&error);
- if (!result)
- return FALSE;
-
- if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)")))
- g_variant_get (result, "(b)", &function_result);
-
- g_variant_unref (result);
- return function_result;
-}
-
-/**
- * lightdm_greeter_get_can_restart:
- * @greeter: A #LightDMGreeter
- *
- * Checks if the greeter is authorized to do a system restart.
- *
- * Return value: #TRUE if the greeter can restart the system
- **/
-gboolean
-lightdm_greeter_get_can_restart (LightDMGreeter *greeter)
-{
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
- return ck_call_function (greeter, "CanRestart", TRUE);
-}
-
-/**
- * lightdm_greeter_restart:
- * @greeter: A #LightDMGreeter
- *
- * Triggers a system restart.
- **/
-void
-lightdm_greeter_restart (LightDMGreeter *greeter)
-{
- g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
- ck_call_function (greeter, "Restart", FALSE);
-}
-
-/**
- * lightdm_greeter_get_can_shutdown:
- * @greeter: A #LightDMGreeter
- *
- * Checks if the greeter is authorized to do a system shutdown.
- *
- * Return value: #TRUE if the greeter can shutdown the system
- **/
-gboolean
-lightdm_greeter_get_can_shutdown (LightDMGreeter *greeter)
-{
- g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
- return ck_call_function (greeter, "CanStop", TRUE);
-}
-
-/**
- * lightdm_greeter_shutdown:
- * @greeter: A #LightDMGreeter
- *
- * Triggers a system shutdown.
- **/
-void
-lightdm_greeter_shutdown (LightDMGreeter *greeter)
-{
- g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
- ck_call_function (greeter, "Stop", FALSE);
-}
-
static void
lightdm_greeter_init (LightDMGreeter *greeter)
{
@@ -1432,18 +866,7 @@ lightdm_greeter_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
- LightDMGreeter *self;
-
- self = LIGHTDM_GREETER (object);
-
- switch (prop_id) {
- case PROP_LAYOUT:
- lightdm_greeter_set_layout(self, g_value_get_string (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
static void
@@ -1457,19 +880,6 @@ lightdm_greeter_get_property (GObject *object,
self = LIGHTDM_GREETER (object);
switch (prop_id) {
- case PROP_HOSTNAME:
- g_value_set_string (value, lightdm_greeter_get_hostname (self));
- break;
- case PROP_DEFAULT_LANGUAGE:
- g_value_set_string (value, lightdm_greeter_get_default_language (self));
- break;
- case PROP_LAYOUTS:
- break;
- case PROP_LAYOUT:
- g_value_set_string (value, lightdm_greeter_get_layout (self));
- break;
- case PROP_SESSIONS:
- break;
case PROP_DEFAULT_SESSION_HINT:
g_value_set_string (value, lightdm_greeter_get_default_session_hint (self));
break;
@@ -1503,18 +913,6 @@ lightdm_greeter_get_property (GObject *object,
case PROP_IS_AUTHENTICATED:
g_value_set_boolean (value, lightdm_greeter_get_is_authenticated (self));
break;
- case PROP_CAN_SUSPEND:
- g_value_set_boolean (value, lightdm_greeter_get_can_suspend (self));
- break;
- case PROP_CAN_HIBERNATE:
- g_value_set_boolean (value, lightdm_greeter_get_can_hibernate (self));
- break;
- case PROP_CAN_RESTART:
- g_value_set_boolean (value, lightdm_greeter_get_can_restart (self));
- break;
- case PROP_CAN_SHUTDOWN:
- g_value_set_boolean (value, lightdm_greeter_get_can_shutdown (self));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1563,25 +961,10 @@ lightdm_greeter_finalize (GObject *object)
LightDMGreeter *self = LIGHTDM_GREETER (object);
LightDMGreeterPrivate *priv = GET_PRIVATE (self);
- if (priv->system_bus)
- g_object_unref (priv->system_bus);
if (priv->to_server_channel)
g_io_channel_unref (priv->to_server_channel);
if (priv->from_server_channel)
g_io_channel_unref (priv->from_server_channel);
- if (priv->display)
- XCloseDisplay (priv->display);
- g_free (priv->hostname);
- if (priv->user_list)
- g_object_unref (priv->user_list);
- g_list_free_full (priv->languages, g_object_unref);
- if (priv->xkl_engine)
- g_object_unref (priv->xkl_engine);
- if (priv->xkl_config)
- g_object_unref (priv->xkl_config);
- g_list_free_full (priv->layouts, g_object_unref);
- g_free (priv->layout);
- g_list_free_full (priv->sessions, g_object_unref);
g_free (priv->authentication_user);
g_hash_table_unref (priv->hints);
@@ -1600,37 +983,6 @@ lightdm_greeter_class_init (LightDMGreeterClass *klass)
object_class->finalize = lightdm_greeter_finalize;
g_object_class_install_property (object_class,
- PROP_HOSTNAME,
- g_param_spec_string ("hostname",
- "hostname",
- "Hostname displaying greeter for",
- NULL,
- G_PARAM_READABLE));
- g_object_class_install_property (object_class,
- PROP_DEFAULT_LANGUAGE,
- g_param_spec_string ("default-language",
- "default-language",
- "Default language",
- NULL,
- G_PARAM_READWRITE));
- /*g_object_class_install_property (object_class,
- PROP_LAYOUTS,
- g_param_spec_list ("layouts",
- "layouts",
- "Available keyboard layouts"));*/
- g_object_class_install_property (object_class,
- PROP_LAYOUT,
- g_param_spec_string ("layout",
- "layout",
- "Current keyboard layout",
- NULL,
- G_PARAM_READWRITE));
- /*g_object_class_install_property (object_class,
- PROP_SESSIONS,
- g_param_spec_list ("sessions",
- "sessions",
- "Available sessions"));*/
- g_object_class_install_property (object_class,
PROP_DEFAULT_SESSION_HINT,
g_param_spec_string ("default-session-hint",
"default-session-hint",
@@ -1715,34 +1067,6 @@ lightdm_greeter_class_init (LightDMGreeterClass *klass)
"TRUE if the selected user is authenticated",
FALSE,
G_PARAM_READABLE));
- g_object_class_install_property (object_class,
- PROP_CAN_SUSPEND,
- g_param_spec_boolean ("can-suspend",
- "can-suspend",
- "TRUE if allowed to suspend the system",
- FALSE,
- G_PARAM_READABLE));
- g_object_class_install_property (object_class,
- PROP_CAN_HIBERNATE,
- g_param_spec_boolean ("can-hibernate",
- "can-hibernate",
- "TRUE if allowed to hibernate the system",
- FALSE,
- G_PARAM_READABLE));
- g_object_class_install_property (object_class,
- PROP_CAN_RESTART,
- g_param_spec_boolean ("can-restart",
- "can-restart",
- "TRUE if allowed to restart the system",
- FALSE,
- G_PARAM_READABLE));
- g_object_class_install_property (object_class,
- PROP_CAN_SHUTDOWN,
- g_param_spec_boolean ("can-shutdown",
- "can-shutdown",
- "TRUE if allowed to shutdown the system",
- FALSE,
- G_PARAM_READABLE));
/**
* LightDMGreeter::connected:
diff --git a/liblightdm-gobject/language.c b/liblightdm-gobject/language.c
index 68911ddb..b7f4d7d7 100644
--- a/liblightdm-gobject/language.c
+++ b/liblightdm-gobject/language.c
@@ -9,6 +9,7 @@
* license.
*/
+#include <string.h>
#include <locale.h>
#include <langinfo.h>
@@ -32,6 +33,94 @@ G_DEFINE_TYPE (LightDMLanguage, lightdm_language, G_TYPE_OBJECT);
#define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_LANGUAGE, LightDMLanguagePrivate)
+static gboolean have_languages = FALSE;
+static GList *languages = NULL;
+
+static void
+update_languages (void)
+{
+ gchar *stdout_text = NULL, *stderr_text = NULL;
+ gint exit_status;
+ gboolean result;
+ GError *error = NULL;
+
+ if (have_languages)
+ return;
+
+ result = g_spawn_command_line_sync ("locale -a", &stdout_text, &stderr_text, &exit_status, &error);
+ if (!result || exit_status != 0)
+ g_warning ("Failed to get languages, locale -a returned %d: %s", exit_status, error->message);
+ else
+ {
+ gchar **tokens;
+ int i;
+
+ tokens = g_strsplit_set (stdout_text, "\n\r", -1);
+ for (i = 0; tokens[i]; i++)
+ {
+ LightDMLanguage *language;
+ gchar *code;
+
+ code = g_strchug (tokens[i]);
+ if (code[0] == '\0')
+ continue;
+
+ /* Ignore the non-interesting languages */
+ if (strcmp (code, "C") == 0 || strcmp (code, "POSIX") == 0)
+ continue;
+
+ language = g_object_new (LIGHTDM_TYPE_LANGUAGE, "code", code, NULL);
+ languages = g_list_append (languages, language);
+ }
+
+ g_strfreev (tokens);
+ }
+
+ g_clear_error (&error);
+ g_free (stdout_text);
+ g_free (stderr_text);
+
+ have_languages = TRUE;
+}
+
+/**
+ * lightdm_get_language:
+ *
+ * Get the current language.
+ *
+ * Return value: (transfer none): The current language or #NULL if no language.
+ **/
+const LightDMLanguage *
+lightdm_get_language (void)
+{
+ const gchar *lang;
+ GList *link;
+
+ lang = g_getenv ("LANG");
+ for (link = lightdm_get_languages (); link; link = link->next)
+ {
+ LightDMLanguage *language = link->data;
+ if (lightdm_language_matches (language, lang))
+ return language;
+ }
+
+ return NULL;
+}
+
+/**
+ * lightdm_get_languages:
+ *
+ * Get a list of languages to present to the user.
+ *
+ * Return value: (element-type LightDMLanguage) (transfer none): A list of #LightDMLanguage that should be presented to the user.
+ **/
+GList *
+lightdm_get_languages (void)
+{
+ update_languages ();
+ return languages;
+}
+
/**
* lightdm_language_get_code:
* @language: A #LightDMLanguage
diff --git a/liblightdm-gobject/layout.c b/liblightdm-gobject/layout.c
index 67648223..b5bd5adf 100644
--- a/liblightdm-gobject/layout.c
+++ b/liblightdm-gobject/layout.c
@@ -9,6 +9,8 @@
* license.
*/
+#include <libxklavier/xklavier.h>
+
#include "lightdm/layout.h"
enum {
@@ -29,6 +31,96 @@ G_DEFINE_TYPE (LightDMLayout, lightdm_layout, G_TYPE_OBJECT);
#define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_LAYOUT, LightDMLayoutPrivate)
+static gboolean have_layouts = FALSE;
+static Display *display = NULL;
+static XklEngine *xkl_engine = NULL;
+static XklConfigRec *xkl_config = NULL;
+static GList *layouts = NULL;
+
+static void
+layout_cb (XklConfigRegistry *config,
+ const XklConfigItem *item,
+ gpointer data)
+{
+ LightDMLayout *layout;
+
+ layout = g_object_new (LIGHTDM_TYPE_LAYOUT, "name", item->name, "short-description", item->short_description, "description", item->description, NULL);
+ layouts = g_list_append (layouts, layout);
+}
+
+/**
+ * lightdm_get_layouts:
+ *
+ * Get a list of keyboard layouts to present to the user.
+ *
+ * Return value: (element-type LightDMLayout) (transfer none): A list of #LightDMLayout that should be presented to the user.
+ **/
+GList *
+lightdm_get_layouts (void)
+{
+ XklConfigRegistry *registry;
+
+ if (have_layouts)
+ return layouts;
+
+ display = XOpenDisplay (NULL);
+ xkl_engine = xkl_engine_get_instance (display);
+ xkl_config = xkl_config_rec_new ();
+ if (!xkl_config_rec_get_from_server (xkl_config, xkl_engine))
+ g_warning ("Failed to get Xkl configuration from server");
+
+ registry = xkl_config_registry_get_instance (xkl_engine);
+ xkl_config_registry_load (registry, FALSE);
+ xkl_config_registry_foreach_layout (registry, layout_cb, NULL);
+ g_object_unref (registry);
+
+ have_layouts = TRUE;
+
+ return layouts;
+}
+
+/**
+ * lightdm_set_layout:
+ * @layout: The layout to use
+ *
+ * Set the layout for this session.
+ **/
+void
+lightdm_set_layout (LightDMLayout *layout)
+{
+ XklConfigRec *config;
+
+ g_return_if_fail (layout != NULL);
+
+ g_debug ("Setting keyboard layout to %s", lightdm_layout_get_name (layout));
+
+ config = xkl_config_rec_new ();
+ config->layouts = g_malloc (sizeof (gchar *) * 2);
+ config->model = g_strdup (xkl_config->model);
+ config->layouts[0] = g_strdup (lightdm_layout_get_name (layout));
+ config->layouts[1] = NULL;
+ if (!xkl_config_rec_activate (config, xkl_engine))
+ g_warning ("Failed to activate XKL config");
+ g_object_unref (config);
+}
+
+/**
+ * lightdm_get_layout:
+ *
+ * Get the current keyboard layout.
+ *
+ * Return value: (transfer none): The currently active layout for this user.
+ **/
+LightDMLayout *
+lightdm_get_layout (void)
+{
+ lightdm_get_layouts ();
+ if (layouts)
+ return (LightDMLayout *) g_list_first (layouts);
+ else
+ return NULL;
+}
+
/**
* lightdm_layout_get_name:
* @layout: A #LightDMLayout
diff --git a/liblightdm-gobject/liblightdm-gobject-1.vapi b/liblightdm-gobject/liblightdm-gobject-1.vapi
index 8373b5cd..051a1eee 100644
--- a/liblightdm-gobject/liblightdm-gobject-1.vapi
+++ b/liblightdm-gobject/liblightdm-gobject-1.vapi
@@ -1,24 +1,30 @@
[CCode (cprefix = "LightDM", lower_case_cprefix = "lightdm_", cheader_filename = "lightdm/greeter.h")]
namespace LightDM {
+ public unowned string hostname { get; }
+ public unowned string default_language { get; }
+ public unowned GLib.List<weak LightDM.Language> get_languages ();
+ public unowned GLib.List<weak LightDM.Layout> get_layouts ();
+ public unowned string layout { get; set; }
+ public bool can_suspend { get; }
+ public void suspend ();
+ public bool can_hibernate { get; }
+ public void hibernate ();
+ public bool can_restart { get; }
+ public void restart ();
+ public bool can_shutdown { get; }
+ public void shutdown ();
+
public class Greeter : GLib.Object {
public Greeter ();
- public virtual signal void connected ();
- public virtual signal void show_message (string text, MessageType type);
- public virtual signal void show_prompt (string text, PromptType type);
- public virtual signal void authentication_complete ();
- public virtual signal void session_failed ();
- public virtual signal void autologin_timer_expired ();
- public virtual signal void user_added ();
- public virtual signal void user_changed ();
- public virtual signal void user_removed ();
- public virtual signal void quit ();
+ public signal void connected ();
+ public signal void show_message (string text, MessageType type);
+ public signal void show_prompt (string text, PromptType type);
+ public signal void authentication_complete ();
+ public signal void session_failed ();
+ public signal void autologin_timer_expired ();
+ public signal void quit ();
public bool connect_to_server ();
- public unowned string hostname { get; }
- public unowned string default_language { get; }
- public unowned GLib.List<weak LightDM.Language> get_languages ();
- public unowned GLib.List<weak LightDM.Layout> get_layouts ();
- public unowned string layout { get; set; }
public unowned string get_hint (string name);
public unowned string default_session_hint { get; };
public bool hide_users_hint { get; };
@@ -29,9 +35,8 @@ namespace LightDM {
public bool autologin_guest_hint { get; };
public int autologin_timeout_hint { get; };
public void cancel_timed_login ();
- public void login (string username);
- public void login_with_user_prompt ();
- public void login_as_guest ();
+ public void authenticate (string? username = null);
+ public void authenticate_as_guest ();
public void respond (string response);
public void cancel_authentication ();
public bool in_authentication { get; }
@@ -39,14 +44,6 @@ namespace LightDM {
public unowned string authentication_user { get; }
public void start_session (string? session);
public void start_default_session ();
- public bool can_suspend { get; }
- public void suspend ();
- public bool can_hibernate { get; }
- public void hibernate ();
- public bool can_restart { get; }
- public void restart ();
- public bool can_shutdown { get; }
- public void shutdown ();
}
public enum MessageType {
INFO,
@@ -72,12 +69,18 @@ namespace LightDM {
public unowned string name { get; }
}
public class UserList : GLib.Object {
+ public signal void user_added (User user);
+ public signal void user_changed (User user);
+ public signal void user_removed (User user);
+
public UserList ();
public int num_users { get; }
public unowned GLib.List<weak LightDM.User> get_users ();
public unowned LightDM.User get_user_by_name (string username);
}
public class User : GLib.Object {
+ public signal void changed ();
+
public unowned string display_name { get; }
public unowned string image { get; }
public unowned string language { get; }
diff --git a/liblightdm-gobject/lightdm.h b/liblightdm-gobject/lightdm.h
new file mode 100644
index 00000000..a23ecdfc
--- /dev/null
+++ b/liblightdm-gobject/lightdm.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version. See http://www.gnu.org/copyleft/lgpl.html the full text of the
+ * license.
+ */
+
+#ifndef _LIGHTDM_H_
+#define _LIGHTDM_H_
+
+#include "lightdm/greeter.h"
+#include "lightdm/language.h"
+#include "lightdm/layout.h"
+#include "lightdm/power.h"
+#include "lightdm/session.h"
+#include "lightdm/system.h"
+#include "lightdm/user.h"
+
+G_END_DECLS
+
+#endif /* _LIGHTDM_H_ */
diff --git a/liblightdm-gobject/lightdm/Makefile.am b/liblightdm-gobject/lightdm/Makefile.am
deleted file mode 100644
index ca20dda6..00000000
--- a/liblightdm-gobject/lightdm/Makefile.am
+++ /dev/null
@@ -1,10 +0,0 @@
-liblightdm_gobject_1include_HEADERS = \
- greeter.h \
- language.h \
- layout.h \
- session.h \
- user.h
-liblightdm_gobject_1includedir=$(includedir)/lightdm-gobject-1/lightdm
-
-DISTCLEANFILES = \
- Makefile.in
diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h
index 54a6b7c4..f8b98276 100644
--- a/liblightdm-gobject/lightdm/greeter.h
+++ b/liblightdm-gobject/lightdm/greeter.h
@@ -14,11 +14,6 @@
#include <glib-object.h>
-#include "user-list.h"
-#include "language.h"
-#include "layout.h"
-#include "session.h"
-
G_BEGIN_DECLS
#define LIGHTDM_TYPE_GREETER (lightdm_greeter_get_type())
@@ -74,20 +69,6 @@ LightDMGreeter *lightdm_greeter_new (void);
gboolean lightdm_greeter_connect_to_server (LightDMGreeter *greeter);
-const gchar *lightdm_greeter_get_hostname (LightDMGreeter *greeter);
-
-const gchar *lightdm_greeter_get_default_language (LightDMGreeter *greeter);
-
-GList *lightdm_greeter_get_languages (LightDMGreeter *greeter);
-
-GList *lightdm_greeter_get_layouts (LightDMGreeter *greeter);
-
-void lightdm_greeter_set_layout (LightDMGreeter *greeter, const gchar *layout);
-
-const gchar *lightdm_greeter_get_layout (LightDMGreeter *greeter);
-
-GList *lightdm_greeter_get_sessions (LightDMGreeter *greeter);
-
const gchar *lightdm_greeter_get_hint (LightDMGreeter *greeter, const gchar *name);
const gchar *lightdm_greeter_get_default_session_hint (LightDMGreeter *greeter);
@@ -106,13 +87,11 @@ gboolean lightdm_greeter_get_autologin_guest_hint (LightDMGreeter *greeter);
gint lightdm_greeter_get_autologin_timeout_hint (LightDMGreeter *greeter);
-void lightdm_greeter_cancel_timed_login (LightDMGreeter *greeter);
-
-void lightdm_greeter_login (LightDMGreeter *greeter, const char *username);
+void lightdm_greeter_cancel_autologin (LightDMGreeter *greeter);
-void lightdm_greeter_login_with_user_prompt (LightDMGreeter *greeter);
+void lightdm_greeter_authenticate (LightDMGreeter *greeter, const char *username);
-void lightdm_greeter_login_as_guest (LightDMGreeter *greeter);
+void lightdm_greeter_authenticate_as_guest (LightDMGreeter *greeter);
void lightdm_greeter_respond (LightDMGreeter *greeter, const gchar *response);
@@ -128,22 +107,6 @@ void lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *sessio
void lightdm_greeter_start_default_session (LightDMGreeter *greeter);
-gboolean lightdm_greeter_get_can_suspend (LightDMGreeter *greeter);
-
-void lightdm_greeter_suspend (LightDMGreeter *greeter);
-
-gboolean lightdm_greeter_get_can_hibernate (LightDMGreeter *greeter);
-
-void lightdm_greeter_hibernate (LightDMGreeter *greeter);
-
-gboolean lightdm_greeter_get_can_restart (LightDMGreeter *greeter);
-
-void lightdm_greeter_restart (LightDMGreeter *greeter);
-
-gboolean lightdm_greeter_get_can_shutdown (LightDMGreeter *greeter);
-
-void lightdm_greeter_shutdown (LightDMGreeter *greeter);
-
G_END_DECLS
#endif /* _LIGHTDM_GREETER_H_ */
diff --git a/liblightdm-gobject/lightdm/language.h b/liblightdm-gobject/lightdm/language.h
index e8a34008..490f20f9 100644
--- a/liblightdm-gobject/lightdm/language.h
+++ b/liblightdm-gobject/lightdm/language.h
@@ -35,6 +35,10 @@ typedef struct
GType lightdm_language_get_type (void);
+GList *lightdm_get_languages (void);
+
+const LightDMLanguage *lightdm_get_language (void);
+
const gchar *lightdm_language_get_code (LightDMLanguage *language);
const gchar *lightdm_language_get_name (LightDMLanguage *language);
diff --git a/liblightdm-gobject/lightdm/layout.h b/liblightdm-gobject/lightdm/layout.h
index f98dbe20..aea43805 100644
--- a/liblightdm-gobject/lightdm/layout.h
+++ b/liblightdm-gobject/lightdm/layout.h
@@ -35,6 +35,12 @@ typedef struct
GType lightdm_layout_get_type (void);
+GList *lightdm_get_layouts (void);
+
+void lightdm_set_layout (LightDMLayout *layout);
+
+LightDMLayout *lightdm_get_layout (void);
+
const gchar *lightdm_layout_get_name (LightDMLayout *layout);
const gchar *lightdm_layout_get_short_description (LightDMLayout *layout);
diff --git a/liblightdm-gobject/lightdm/power.h b/liblightdm-gobject/lightdm/power.h
new file mode 100644
index 00000000..7d37c1c6
--- /dev/null
+++ b/liblightdm-gobject/lightdm/power.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version. See http://www.gnu.org/copyleft/lgpl.html the full text of the
+ * license.
+ */
+
+#ifndef _LIGHTDM_POWER_H_
+#define _LIGHTDM_POWER_H_
+
+gboolean lightdm_get_can_suspend (void);
+
+void lightdm_suspend (void);
+
+gboolean lightdm_get_can_hibernate (void);
+
+void lightdm_hibernate (void);
+
+gboolean lightdm_get_can_restart (void);
+
+void lightdm_restart (void);
+
+gboolean lightdm_get_can_shutdown (void);
+
+void lightdm_shutdown (void);
+
+G_END_DECLS
+
+#endif /* _LIGHTDM_POWER_H_ */
diff --git a/liblightdm-gobject/lightdm/session.h b/liblightdm-gobject/lightdm/session.h
index 4f9d4a2f..4835299b 100644
--- a/liblightdm-gobject/lightdm/session.h
+++ b/liblightdm-gobject/lightdm/session.h
@@ -35,6 +35,8 @@ typedef struct
GType lightdm_session_get_type (void);
+GList *lightdm_get_sessions (void);
+
const gchar *lightdm_session_get_key (LightDMSession *session);
const gchar *lightdm_session_get_name (LightDMSession *session);
diff --git a/liblightdm-gobject/lightdm/system.h b/liblightdm-gobject/lightdm/system.h
new file mode 100644
index 00000000..f070ec80
--- /dev/null
+++ b/liblightdm-gobject/lightdm/system.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version. See http://www.gnu.org/copyleft/lgpl.html the full text of the
+ * license.
+ */
+
+#ifndef _LIGHTDM_HOSTNAME_H_
+#define _LIGHTDM_HOSTNAME_H_
+
+#include <glib-object.h>
+
+const gchar *lightdm_get_hostname (void);
+
+G_END_DECLS
+
+#endif /* _LIGHTDM_HOSTNAME_H_ */
diff --git a/liblightdm-gobject/lightdm/user-list.h b/liblightdm-gobject/lightdm/user-list.h
deleted file mode 100644
index 76e4460b..00000000
--- a/liblightdm-gobject/lightdm/user-list.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2010 Robert Ancell.
- * Author: Robert Ancell <robert.ancell@canonical.com>
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 3 of the License, or (at your option) any
- * later version. See http://www.gnu.org/copyleft/lgpl.html the full text of the
- * license.
- */
-
-#ifndef _LIGHTDM_USER_LIST_H_
-#define _LIGHTDM_USER_LIST_H_
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define LIGHTDM_TYPE_USER_LIST (lightdm_user_list_get_type())
-#define LIGHTDM_USER_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserList));
-#define LIGHTDM_USER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_USER_LIST, LightDMUserListClass))
-#define LIGHTDM_IS_USER_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIGHTDM_TYPE_USER_LIST))
-#define LIGHTDM_IS_USER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_USER_LIST))
-#define LIGHTDM_USER_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserListClass))
-
-#include "user.h"
-
-typedef struct
-{
- GObject parent_instance;
-} LightDMUserList;
-
-typedef struct
-{
- GObjectClass parent_class;
-
- void (*user_added)(LightDMUserList *user_list, LightDMUser *user);
- void (*user_changed)(LightDMUserList *user_list, LightDMUser *user);
- void (*user_removed)(LightDMUserList *user_list, LightDMUser *user);
-} LightDMUserListClass;
-
-GType lightdm_user_list_get_type (void);
-
-LightDMUserList *lightdm_user_list_new (void);
-
-gint lightdm_user_list_get_num_users (LightDMUserList *user_list);
-
-LightDMUser *lightdm_user_list_get_user_by_name (LightDMUserList *user_list, const gchar *username);
-
-GList *lightdm_user_list_get_users (LightDMUserList *user_list);
-
-G_END_DECLS
-
-#endif /* _LIGHTDM_USER_LIST_H_ */
diff --git a/liblightdm-gobject/lightdm/user.h b/liblightdm-gobject/lightdm/user.h
index 6e6e1eb7..20e37299 100644
--- a/liblightdm-gobject/lightdm/user.h
+++ b/liblightdm-gobject/lightdm/user.h
@@ -16,6 +16,13 @@
G_BEGIN_DECLS
+#define LIGHTDM_TYPE_USER_LIST (lightdm_user_list_get_type())
+#define LIGHTDM_USER_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserList));
+#define LIGHTDM_USER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_USER_LIST, LightDMUserListClass))
+#define LIGHTDM_IS_USER_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIGHTDM_TYPE_USER_LIST))
+#define LIGHTDM_IS_USER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_USER_LIST))
+#define LIGHTDM_USER_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserListClass))
+
#define LIGHTDM_TYPE_USER (lightdm_user_get_type())
#define LIGHTDM_USER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_USER, LightDMUser));
#define LIGHTDM_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_USER, LightDMUserClass))
@@ -34,8 +41,32 @@ typedef struct
void (*changed)(LightDMUser *user);
} LightDMUserClass;
+typedef struct
+{
+ GObject parent_instance;
+} LightDMUserList;
+
+typedef struct
+{
+ GObjectClass parent_class;
+
+ void (*user_added)(LightDMUserList *user_list, LightDMUser *user);
+ void (*user_changed)(LightDMUserList *user_list, LightDMUser *user);
+ void (*user_removed)(LightDMUserList *user_list, LightDMUser *user);
+} LightDMUserListClass;
+
+GType lightdm_user_list_get_type (void);
+
GType lightdm_user_get_type (void);
+LightDMUserList *lightdm_user_list_get_instance (void);
+
+gint lightdm_user_list_get_length (LightDMUserList *user_list);
+
+LightDMUser *lightdm_user_list_get_user_by_name (LightDMUserList *user_list, const gchar *username);
+
+GList *lightdm_user_list_get_users (LightDMUserList *user_list);
+
const gchar *lightdm_user_get_name (LightDMUser *user);
const gchar *lightdm_user_get_real_name (LightDMUser *user);
diff --git a/liblightdm-gobject/power.c b/liblightdm-gobject/power.c
new file mode 100644
index 00000000..fb0cc96b
--- /dev/null
+++ b/liblightdm-gobject/power.c
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version. See http://www.gnu.org/copyleft/lgpl.html the full text of the
+ * license.
+ */
+
+#include <config.h>
+
+#include <string.h>
+#include <gio/gio.h>
+
+#include "lightdm/power.h"
+
+static GDBusProxy *upower_proxy = NULL;
+static GDBusProxy *ck_proxy = NULL;
+
+static gboolean
+upower_call_function (const gchar *function, gboolean has_result)
+{
+ GVariant *result;
+ gboolean function_result = FALSE;
+ GError *error = NULL;
+
+ if (!upower_proxy)
+ {
+ upower_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.UPower",
+ "/org/freedesktop/UPower",
+ "org.freedesktop.UPower",
+ NULL,
+ &error);
+ if (!upower_proxy)
+ g_warning ("Error getting UPower proxy: %s", error->message);
+ g_clear_error (&error);
+ if (!upower_proxy)
+ return FALSE;
+ }
+
+ result = g_dbus_proxy_call_sync (upower_proxy,
+ function,
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (!result)
+ g_warning ("Error calling UPower function %s: %s", function, error->message);
+ g_clear_error (&error);
+ if (!result)
+ return FALSE;
+
+ if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)")))
+ g_variant_get (result, "(b)", &function_result);
+
+ g_variant_unref (result);
+ return function_result;
+}
+
+/**
+ * lightdm_get_can_suspend:
+ *
+ * Checks if authorized to do a system suspend.
+ *
+ * Return value: #TRUE if can suspend the system
+ **/
+gboolean
+lightdm_get_can_suspend (void)
+{
+ return upower_call_function ("SuspendAllowed", TRUE);
+}
+
+/**
+ * lightdm_suspend:
+ *
+ * Triggers a system suspend.
+ **/
+void
+lightdm_suspend (void)
+{
+ upower_call_function ("Suspend", FALSE);
+}
+
+/**
+ * lightdm_get_can_hibernate:
+ *
+ * Checks if is authorized to do a system hibernate.
+ *
+ * Return value: #TRUE if can hibernate the system
+ **/
+gboolean
+lightdm_get_can_hibernate (void)
+{
+ return upower_call_function ("HibernateAllowed", TRUE);
+}
+
+/**
+ * lightdm_hibernate:
+ *
+ * Triggers a system hibernate.
+ **/
+void
+lightdm_hibernate (void)
+{
+ upower_call_function ("Hibernate", FALSE);
+}
+
+static gboolean
+ck_call_function (const gchar *function, gboolean has_result)
+{
+ GVariant *result;
+ gboolean function_result = FALSE;
+ GError *error = NULL;
+
+ if (!upower_proxy)
+ {
+ ck_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.ConsoleKit",
+ "/org/freedesktop/ConsoleKit/Manager",
+ "org.freedesktop.ConsoleKit.Manager",
+ NULL,
+ &error);
+ if (!ck_proxy)
+ g_warning ("Error getting ConsoleKit proxy: %s", error->message);
+ g_clear_error (&error);
+ if (!ck_proxy)
+ return FALSE;
+ }
+
+ result = g_dbus_proxy_call_sync (ck_proxy,
+ function,
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result)
+ g_warning ("Error calling ConsoleKit function %s: %s", function, error->message);
+ g_clear_error (&error);
+ if (!result)
+ return FALSE;
+
+ if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)")))
+ g_variant_get (result, "(b)", &function_result);
+
+ g_variant_unref (result);
+ return function_result;
+}
+
+/**
+ * lightdm_get_can_restart:
+ *
+ * Checks if is authorized to do a system restart.
+ *
+ * Return value: #TRUE if can restart the system
+ **/
+gboolean
+lightdm_get_can_restart (void)
+{
+ return ck_call_function ("CanRestart", TRUE);
+}
+
+/**
+ * lightdm_restart:
+ *
+ * Triggers a system restart.
+ **/
+void
+lightdm_restart (void)
+{
+ ck_call_function ("Restart", FALSE);
+}
+
+/**
+ * lightdm_get_can_shutdown:
+ *
+ * Checks if is authorized to do a system shutdown.
+ *
+ * Return value: #TRUE if can shutdown the system
+ **/
+gboolean
+lightdm_get_can_shutdown (void)
+{
+ return ck_call_function ("CanStop", TRUE);
+}
+
+/**
+ * lightdm_shutdown:
+ *
+ * Triggers a system shutdown.
+ **/
+void
+lightdm_shutdown (void)
+{
+ ck_call_function ("Stop", FALSE);
+}
diff --git a/liblightdm-gobject/session.c b/liblightdm-gobject/session.c
index 932db539..6b99dbde 100644
--- a/liblightdm-gobject/session.c
+++ b/liblightdm-gobject/session.c
@@ -9,6 +9,9 @@
* license.
*/
+#include <string.h>
+#include <gio/gdesktopappinfo.h>
+
#include "lightdm/session.h"
enum {
@@ -29,6 +32,98 @@ G_DEFINE_TYPE (LightDMSession, lightdm_session, G_TYPE_OBJECT);
#define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_SESSION, LightDMSessionPrivate)
+static gboolean have_sessions = FALSE;
+static GList *sessions = NULL;
+
+static void
+update_sessions (void)
+{
+ GDir *directory;
+ GError *error = NULL;
+
+ if (have_sessions)
+ return;
+
+ directory = g_dir_open (XSESSIONS_DIR, 0, &error);
+ if (!directory)
+ g_warning ("Failed to open sessions directory: %s", error->message);
+ g_clear_error (&error);
+ if (!directory)
+ return;
+
+ while (TRUE)
+ {
+ const gchar *filename;
+ GKeyFile *key_file;
+ gchar *key, *path;
+ gboolean result;
+
+ filename = g_dir_read_name (directory);
+ if (filename == NULL)
+ break;
+
+ if (!g_str_has_suffix (filename, ".desktop"))
+ continue;
+
+ key = g_strndup (filename, strlen (filename) - strlen (".desktop"));
+ path = g_build_filename (XSESSIONS_DIR, filename, NULL);
+ g_debug ("Loading session %s", path);
+
+ key_file = g_key_file_new ();
+ result = g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error);
+ if (!result)
+ g_warning ("Failed to load session file %s: %s:", path, error->message);
+ g_clear_error (&error);
+
+ if (result && !g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, NULL))
+ {
+ gchar *domain, *name, *comment;
+
+#ifdef G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN
+ domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, NULL);
+#else
+ domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-GNOME-Gettext-Domain", NULL);
+#endif
+ name = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, domain, NULL);
+ comment = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, domain, NULL);
+ if (!comment)
+ comment = g_strdup ("");
+ if (name)
+ {
+ g_debug ("Loaded session %s (%s, %s)", key, name, comment);
+ sessions = g_list_append (sessions, g_object_new (LIGHTDM_TYPE_SESSION, "key", key, "name", name, "comment", comment, NULL));
+ }
+ else
+ g_warning ("Invalid session %s: %s", path, error->message);
+ g_free (domain);
+ g_free (name);
+ g_free (comment);
+ }
+
+ g_free (key);
+ g_free (path);
+ g_key_file_free (key_file);
+ }
+
+ g_dir_close (directory);
+
+ have_sessions = TRUE;
+}
+
+/**
+ * lightdm_get_sessions:
+ *
+ * Get the available sessions.
+ *
+ * Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession
+ **/
+GList *
+lightdm_get_sessions (void)
+{
+ update_sessions ();
+ return sessions;
+}
+
/**
* lightdm_session_get_key
* @session: A #LightDMSession
diff --git a/liblightdm-gobject/system.c b/liblightdm-gobject/system.c
new file mode 100644
index 00000000..1a339583
--- /dev/null
+++ b/liblightdm-gobject/system.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version. See http://www.gnu.org/copyleft/lgpl.html the full text of the
+ * license.
+ */
+
+#include <sys/utsname.h>
+
+#include "lightdm/system.h"
+
+static gchar *hostname = NULL;
+
+/**
+ * lightdm_get_hostname:
+ *
+ * Return value: The name of the host we are running on.
+ **/
+const gchar *
+lightdm_get_hostname (void)
+{
+ if (!hostname)
+ {
+ struct utsname info;
+ uname (&info);
+ hostname = g_strdup (info.nodename);
+ }
+
+ return hostname;
+}
diff --git a/liblightdm-gobject/user-list.c b/liblightdm-gobject/user-list.c
index 1acca818..ba8759be 100644
--- a/liblightdm-gobject/user-list.c
+++ b/liblightdm-gobject/user-list.c
@@ -560,13 +560,13 @@ update_users (LightDMUserList *user_list)
}
/**
- * lightdm_user_list_get_num_users:
+ * lightdm_user_list_get_length:
* @user_list: a #LightDMUserList
*
* Return value: The number of users able to log in
**/
gint
-lightdm_user_list_get_num_users (LightDMUserList *user_list)
+lightdm_user_list_get_length (LightDMUserList *user_list)
{
g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), 0);
update_users (user_list);
@@ -636,7 +636,7 @@ lightdm_user_list_get_property (GObject *object,
switch (prop_id) {
case PROP_NUM_USERS:
- g_value_set_int (value, lightdm_user_list_get_num_users (self));
+ g_value_set_int (value, lightdm_user_list_get_length (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
diff --git a/liblightdm-gobject/user.c b/liblightdm-gobject/user.c
index 9641fcbf..6d172ed7 100644
--- a/liblightdm-gobject/user.c
+++ b/liblightdm-gobject/user.c
@@ -9,28 +9,70 @@
* license.
*/
+#include <config.h>
+
+#include <errno.h>
#include <string.h>
+#include <sys/utsname.h>
+#include <pwd.h>
+#include <gio/gio.h>
#include "lightdm/user.h"
enum {
- PROP_0,
- PROP_NAME,
- PROP_REAL_NAME,
- PROP_DISPLAY_NAME,
- PROP_HOME_DIRECTORY,
- PROP_IMAGE,
- PROP_LANGUAGE,
- PROP_LAYOUT,
- PROP_SESSION,
- PROP_LOGGED_IN
+ LIST_PROP_0,
+ LIST_PROP_NUM_USERS,
+ LIST_PROP_USERS,
+};
+
+enum {
+ USER_PROP_0,
+ USER_PROP_NAME,
+ USER_PROP_REAL_NAME,
+ USER_PROP_DISPLAY_NAME,
+ USER_PROP_HOME_DIRECTORY,
+ USER_PROP_IMAGE,
+ USER_PROP_LANGUAGE,
+ USER_PROP_LAYOUT,
+ USER_PROP_SESSION,
+ USER_PROP_LOGGED_IN
+};
+
+enum {
+ USER_ADDED,
+ USER_CHANGED,
+ USER_REMOVED,
+ LAST_LIST_SIGNAL
};
+static guint list_signals[LAST_LIST_SIGNAL] = { 0 };
enum {
CHANGED,
- LAST_SIGNAL
+ LAST_USER_SIGNAL
};
-static guint signals[LAST_SIGNAL] = { 0 };
+static guint user_signals[LAST_USER_SIGNAL] = { 0 };
+
+typedef struct
+{
+ /* Connection to AccountsService */
+ GDBusProxy *accounts_service_proxy;
+ GList *user_account_objects;
+
+ /* File monitor for password file */
+ GFileMonitor *passwd_monitor;
+
+ /* TRUE if have scanned users */
+ gboolean have_users;
+
+ /* List of users */
+ GList *users;
+} LightDMUserListPrivate;
+
+typedef struct
+{
+ GDBusProxy *proxy;
+ LightDMUser *user;
+} UserAccountObject;
typedef struct
{
@@ -46,9 +88,683 @@ typedef struct
gchar *session;
} LightDMUserPrivate;
+G_DEFINE_TYPE (LightDMUserList, lightdm_user_list, G_TYPE_OBJECT);
G_DEFINE_TYPE (LightDMUser, lightdm_user, G_TYPE_OBJECT);
-#define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_USER, LightDMUserPrivate)
+#define GET_LIST_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserListPrivate)
+#define GET_USER_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_USER, LightDMUserPrivate)
+
+#define PASSWD_FILE "/etc/passwd"
+#define USER_CONFIG_FILE "/etc/lightdm/users.conf"
+
+static LightDMUserList *singleton = NULL;
+
+/**
+ * lightdm_user_list_get_instance:
+ *
+ * Get the user list.
+ *
+ * Return value: the #LightDMUserList
+ **/
+LightDMUserList *
+lightdm_user_list_get_instance (void)
+{
+ if (!singleton)
+ singleton = g_object_new (LIGHTDM_TYPE_USER_LIST, NULL);
+ return singleton;
+}
+
+static LightDMUser *
+get_user_by_name (LightDMUserList *user_list, const gchar *username)
+{
+ LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
+ GList *link;
+
+ for (link = priv->users; link; link = link->next)
+ {
+ LightDMUser *user = link->data;
+ if (strcmp (lightdm_user_get_name (user), username) == 0)
+ return user;
+ }
+
+ return NULL;
+}
+
+static gint
+compare_user (gconstpointer a, gconstpointer b)
+{
+ LightDMUser *user_a = (LightDMUser *) a, *user_b = (LightDMUser *) b;
+ return strcmp (lightdm_user_get_display_name (user_a), lightdm_user_get_display_name (user_b));
+}
+
+static gboolean
+update_passwd_user (LightDMUser *user, const gchar *real_name, const gchar *home_directory, const gchar *image, gboolean logged_in)
+{
+ if (g_strcmp0 (lightdm_user_get_real_name (user), real_name) == 0 &&
+ g_strcmp0 (lightdm_user_get_home_directory (user), home_directory) == 0 &&
+ g_strcmp0 (lightdm_user_get_image (user), image) == 0 &&
+ lightdm_user_get_logged_in (user) == logged_in)
+ return FALSE;
+
+ g_object_set (user, "real-name", real_name, "home-directory", home_directory, "image", image, "logged-in", logged_in, NULL);
+
+ return TRUE;
+}
+
+static void
+user_changed_cb (LightDMUser *user, LightDMUserList *user_list)
+{
+ g_signal_emit (user_list, list_signals[USER_CHANGED], 0, user);
+}
+
+static void
+load_passwd_file (LightDMUserList *user_list)
+{
+ LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
+ GKeyFile *config;
+ gchar *value;
+ gint minimum_uid;
+ gchar **hidden_users, **hidden_shells;
+ GList *users = NULL, *old_users, *new_users = NULL, *changed_users = NULL, *link;
+ GError *error = NULL;
+
+ g_debug ("Loading user config from %s", USER_CONFIG_FILE);
+
+ config = g_key_file_new ();
+ if (!g_key_file_load_from_file (config, USER_CONFIG_FILE, G_KEY_FILE_NONE, &error) &&
+ !g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
+ g_warning ("Failed to load configuration from %s: %s", USER_CONFIG_FILE, error->message); // FIXME: Don't make warning on no file, just info
+ g_clear_error (&error);
+
+ if (g_key_file_has_key (config, "UserList", "minimum-uid", NULL))
+ minimum_uid = g_key_file_get_integer (config, "UserList", "minimum-uid", NULL);
+ else
+ minimum_uid = 500;
+
+ value = g_key_file_get_string (config, "UserList", "hidden-users", NULL);
+ if (!value)
+ value = g_strdup ("nobody nobody4 noaccess");
+ hidden_users = g_strsplit (value, " ", -1);
+ g_free (value);
+
+ value = g_key_file_get_string (config, "UserList", "hidden-shells", NULL);
+ if (!value)
+ value = g_strdup ("/bin/false /usr/sbin/nologin");
+ hidden_shells = g_strsplit (value, " ", -1);
+ g_free (value);
+
+ g_key_file_free (config);
+
+ setpwent ();
+
+ while (TRUE)
+ {
+ struct passwd *entry;
+ LightDMUser *user;
+ char **tokens;
+ gchar *real_name, *image;
+ int i;
+
+ errno = 0;
+ entry = getpwent ();
+ if (!entry)
+ break;
+
+ /* Ignore system users */
+ if (entry->pw_uid < minimum_uid)
+ continue;
+
+ /* Ignore users disabled by shell */
+ if (entry->pw_shell)
+ {
+ for (i = 0; hidden_shells[i] && strcmp (entry->pw_shell, hidden_shells[i]) != 0; i++);
+ if (hidden_shells[i])
+ continue;
+ }
+
+ /* Ignore certain users */
+ for (i = 0; hidden_users[i] && strcmp (entry->pw_name, hidden_users[i]) != 0; i++);
+ if (hidden_users[i])
+ continue;
+
+ tokens = g_strsplit (entry->pw_gecos, ",", -1);
+ if (tokens[0] != NULL && tokens[0][0] != '\0')
+ real_name = g_strdup (tokens[0]);
+ else
+ real_name = NULL;
+ g_strfreev (tokens);
+
+ image = g_build_filename (entry->pw_dir, ".face", NULL);
+ if (!g_file_test (image, G_FILE_TEST_EXISTS))
+ {
+ g_free (image);
+ image = g_build_filename (entry->pw_dir, ".face.icon", NULL);
+ if (!g_file_test (image, G_FILE_TEST_EXISTS))
+ {
+ g_free (image);
+ image = NULL;
+ }
+ }
+
+ user = g_object_new (LIGHTDM_TYPE_USER, "name", entry->pw_name, "real-name", real_name, "home-directory", entry->pw_dir, "image", image, "logged-in", FALSE, NULL);
+ g_free (real_name);
+ g_free (image);
+
+ /* Update existing users if have them */
+ for (link = priv->users; link; link = link->next)
+ {
+ LightDMUser *info = link->data;
+ if (strcmp (lightdm_user_get_name (info), lightdm_user_get_name (user)) == 0)
+ {
+ if (update_passwd_user (info, lightdm_user_get_real_name (user), lightdm_user_get_home_directory (user), lightdm_user_get_image (user), lightdm_user_get_logged_in (user)))
+ changed_users = g_list_insert_sorted (changed_users, info, compare_user);
+ g_object_unref (user);
+ user = info;
+ break;
+ }
+ }
+ if (!link)
+ {
+ /* Only notify once we have loaded the user list */
+ if (priv->have_users)
+ new_users = g_list_insert_sorted (new_users, user, compare_user);
+ }
+ users = g_list_insert_sorted (users, user, compare_user);
+ }
+ g_strfreev (hidden_users);
+ g_strfreev (hidden_shells);
+
+ if (errno != 0)
+ g_warning ("Failed to read password database: %s", strerror (errno));
+
+ endpwent ();
+
+ /* Use new user list */
+ old_users = priv->users;
+ priv->users = users;
+
+ /* Notify of changes */
+ for (link = new_users; link; link = link->next)
+ {
+ LightDMUser *info = link->data;
+ g_debug ("User %s added", lightdm_user_get_name (info));
+ g_signal_connect (info, "changed", G_CALLBACK (user_changed_cb), user_list);
+ g_signal_emit (user_list, list_signals[USER_ADDED], 0, info);
+ }
+ g_list_free (new_users);
+ for (link = changed_users; link; link = link->next)
+ {
+ LightDMUser *info = link->data;
+ g_debug ("User %s changed", lightdm_user_get_name (info));
+ g_signal_emit_by_name (info, "changed");
+ }
+ g_list_free (changed_users);
+ for (link = old_users; link; link = link->next)
+ {
+ GList *new_link;
+
+ /* See if this user is in the current list */
+ for (new_link = priv->users; new_link; new_link = new_link->next)
+ {
+ if (new_link->data == link->data)
+ break;
+ }
+
+ if (!new_link)
+ {
+ LightDMUser *info = link->data;
+ g_debug ("User %s removed", lightdm_user_get_name (info));
+ g_signal_emit (user_list, list_signals[USER_REMOVED], 0, info);
+ g_object_unref (info);
+ }
+ }
+ g_list_free (old_users);
+}
+
+static void
+passwd_changed_cb (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, LightDMUserList *user_list)
+{
+ if (event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT)
+ {
+ g_debug ("%s changed, reloading user list", g_file_get_path (file));
+ load_passwd_file (user_list);
+ }
+}
+
+static gboolean
+update_user (UserAccountObject *object)
+{
+ GVariant *result, *value;
+ GVariantIter *iter;
+ gchar *name;
+ GError *error = NULL;
+
+ result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (object->proxy),
+ "org.freedesktop.Accounts",
+ g_dbus_proxy_get_object_path (object->proxy),
+ "org.freedesktop.DBus.Properties",
+ "GetAll",
+ g_variant_new ("(s)", "org.freedesktop.Accounts.User"),
+ G_VARIANT_TYPE ("(a{sv})"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (!result)
+ g_warning ("Error updating user %s: %s", g_dbus_proxy_get_object_path (object->proxy), error->message);
+ g_clear_error (&error);
+ if (!result)
+ return FALSE;
+
+ g_variant_get (result, "(a{sv})", &iter);
+ while (g_variant_iter_loop (iter, "{&sv}", &name, &value))
+ {
+ g_debug ("%s=?", name);
+ if (strcmp (name, "UserName") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
+ {
+ gchar *user_name;
+ g_variant_get (value, "&s", &user_name);
+ g_object_set (object->user, "name", user_name, NULL);
+ }
+ else if (strcmp (name, "RealName") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
+ {
+ gchar *real_name;
+ g_variant_get (value, "&s", &real_name);
+ g_object_set (object->user, "real-name", real_name, NULL);
+ }
+ else if (strcmp (name, "HomeDirectory") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
+ {
+ gchar *home_directory;
+ g_variant_get (value, "&s", &home_directory);
+ g_object_set (object->user, "home-directory", home_directory, NULL);
+ }
+ else if (strcmp (name, "IconFile") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
+ {
+ gchar *icon_file;
+ g_variant_get (value, "&s", &icon_file);
+ g_object_set (object->user, "image", icon_file, NULL);
+ }
+ }
+ g_debug ("!1");
+ g_variant_iter_free (iter);
+ g_debug ("!2");
+
+ g_variant_unref (result);
+ g_debug ("!3");
+
+ return TRUE;
+}
+
+static void
+user_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, UserAccountObject *object)
+{
+ if (strcmp (signal_name, "Changed") == 0)
+ {
+ if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("()")))
+ {
+ g_debug ("User %s changed", g_dbus_proxy_get_object_path (object->proxy));
+ update_user (object);
+ g_signal_emit_by_name (object->user, "changed");
+ }
+ else
+ g_warning ("Got org.freedesktop.Accounts.User signal Changed with unknown parameters %s", g_variant_get_type_string (parameters));
+ }
+}
+
+static UserAccountObject *
+user_account_object_new (const gchar *path)
+{
+ GDBusProxy *proxy;
+ UserAccountObject *object;
+ GError *error = NULL;
+
+ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.Accounts",
+ path,
+ "org.freedesktop.Accounts.User",
+ NULL,
+ &error);
+ if (!proxy)
+ g_warning ("Error getting user %s: %s", path, error->message);
+ g_clear_error (&error);
+ if (!proxy)
+ return NULL;
+
+ object = g_malloc0 (sizeof (UserAccountObject));
+ object->user = g_object_new (LIGHTDM_TYPE_USER, NULL);
+ object->proxy = proxy;
+ g_signal_connect (proxy, "g-signal", G_CALLBACK (user_signal_cb), object);
+
+ return object;
+}
+
+static void
+user_account_object_free (UserAccountObject *object)
+{
+ if (!object)
+ return;
+ g_object_unref (object->user);
+ g_object_unref (object->proxy);
+ g_free (object);
+}
+
+static void
+user_accounts_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, LightDMUserList *user_list)
+{
+ LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
+
+ if (strcmp (signal_name, "UserAdded") == 0)
+ {
+ if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
+ {
+ gchar *path;
+ UserAccountObject *object;
+
+ g_variant_get (parameters, "(&o)", &path);
+ g_debug ("User %s added", path);
+
+ object = user_account_object_new (path);
+ if (object && update_user (object))
+ {
+ priv->user_account_objects = g_list_append (priv->user_account_objects, object);
+ priv->users = g_list_insert_sorted (priv->users, g_object_ref (object->user), compare_user);
+ g_signal_connect (object->user, "changed", G_CALLBACK (user_changed_cb), user_list);
+ g_signal_emit (user_list, list_signals[USER_ADDED], 0, object->user);
+ }
+ else
+ user_account_object_free (object);
+ }
+ else
+ g_warning ("Got UserAccounts signal UserAdded with unknown parameters %s", g_variant_get_type_string (parameters));
+ }
+ else if (strcmp (signal_name, "UserDeleted") == 0)
+ {
+ if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
+ {
+ gchar *path;
+ GList *link;
+
+ g_variant_get (parameters, "(&o)", &path);
+ g_debug ("User %s deleted", path);
+
+ for (link = priv->user_account_objects; link; link = link->next)
+ {
+ UserAccountObject *object = link->data;
+ if (strcmp (g_dbus_proxy_get_object_path (object->proxy), path) == 0)
+ {
+ priv->users = g_list_remove (priv->users, object->user);
+ g_object_unref (object->user);
+
+ g_signal_emit (user_list, list_signals[USER_REMOVED], 0, object->user);
+
+ priv->user_account_objects = g_list_remove (priv->user_account_objects, object);
+ user_account_object_free (object);
+ break;
+ }
+ }
+ }
+ else
+ g_warning ("Got UserAccounts signal UserDeleted with unknown parameters %s", g_variant_get_type_string (parameters));
+ }
+}
+
+static void
+update_users (LightDMUserList *user_list)
+{
+ LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
+ GFile *passwd_file;
+ GError *error = NULL;
+
+ if (priv->have_users)
+ return;
+ priv->have_users = TRUE;
+
+ priv->accounts_service_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.Accounts",
+ "/org/freedesktop/Accounts",
+ "org.freedesktop.Accounts",
+ NULL,
+ &error);
+ if (!priv->accounts_service_proxy)
+ g_warning ("Error contacting AccountsService: %s", error->message);
+ g_clear_error (&error);
+
+ if (priv->accounts_service_proxy)
+ {
+ GVariant *result;
+
+ g_signal_connect (priv->accounts_service_proxy, "g-signal", G_CALLBACK (user_accounts_signal_cb), user_list);
+
+ result = g_dbus_proxy_call_sync (priv->accounts_service_proxy,
+ "ListCachedUsers",
+ g_variant_new ("()"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (!result)
+ g_warning ("Error getting user list from AccountsService: %s", error->message);
+ g_clear_error (&error);
+ if (!result)
+ return;
+
+ if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(ao)")))
+ {
+ GVariantIter *iter;
+ const gchar *path;
+
+ g_debug ("Loading users from AccountsService");
+ g_variant_get (result, "(ao)", &iter);
+ while (g_variant_iter_loop (iter, "&o", &path))
+ {
+ UserAccountObject *object;
+
+ g_debug ("Loading user %s", path);
+
+ object = user_account_object_new (path);
+ if (object && update_user (object))
+ {
+ priv->user_account_objects = g_list_append (priv->user_account_objects, object);
+ priv->users = g_list_insert_sorted (priv->users, g_object_ref (object->user), compare_user);
+ g_signal_connect (object->user, "changed", G_CALLBACK (user_changed_cb), user_list);
+ }
+ else
+ user_account_object_free (object);
+ }
+ g_variant_iter_free (iter);
+ }
+ else
+ g_warning ("Unexpected type from ListCachedUsers: %s", g_variant_get_type_string (result));
+
+ g_variant_unref (result);
+ }
+ else
+ {
+ load_passwd_file (user_list);
+
+ /* Watch for changes to user list */
+ passwd_file = g_file_new_for_path (PASSWD_FILE);
+ priv->passwd_monitor = g_file_monitor (passwd_file, G_FILE_MONITOR_NONE, NULL, &error);
+ g_object_unref (passwd_file);
+ if (!priv->passwd_monitor)
+ g_warning ("Error monitoring %s: %s", PASSWD_FILE, error->message);
+ else
+ g_signal_connect (priv->passwd_monitor, "changed", G_CALLBACK (passwd_changed_cb), user_list);
+ g_clear_error (&error);
+ }
+}
+
+/**
+ * lightdm_user_list_get_length:
+ * @user_list: a #LightDMUserList
+ *
+ * Return value: The number of users able to log in
+ **/
+gint
+lightdm_user_list_get_length (LightDMUserList *user_list)
+{
+ g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), 0);
+ update_users (user_list);
+ return g_list_length (GET_LIST_PRIVATE (user_list)->users);
+}
+
+/**
+ * lightdm_user_list_get_users:
+ * @user_list: A #LightDMUserList
+ *
+ * Get a list of users to present to the user. This list may be a subset of the
+ * available users and may be empty depending on the server configuration.
+ *
+ * Return value: (element-type LightDMUser) (transfer none): A list of #LightDMUser that should be presented to the user.
+ **/
+GList *
+lightdm_user_list_get_users (LightDMUserList *user_list)
+{
+ g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), NULL);
+ update_users (user_list);
+ return GET_LIST_PRIVATE (user_list)->users;
+}
+
+/**
+ * lightdm_user_list_get_user_by_name:
+ * @user_list: A #LightDMUserList
+ * @username: Name of user to get.
+ *
+ * Get infomation about a given user or #NULL if this user doesn't exist.
+ *
+ * Return value: (transfer none): A #LightDMUser entry for the given user.
+ **/
+LightDMUser *
+lightdm_user_list_get_user_by_name (LightDMUserList *user_list, const gchar *username)
+{
+ g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), NULL);
+ g_return_val_if_fail (username != NULL, NULL);
+
+ update_users (user_list);
+
+ return get_user_by_name (user_list, username);
+}
+
+static void
+lightdm_user_list_init (LightDMUserList *user_list)
+{
+}
+
+static void
+lightdm_user_list_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+}
+
+static void
+lightdm_user_list_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ LightDMUserList *self;
+
+ self = LIGHTDM_USER_LIST (object);
+
+ switch (prop_id) {
+ case LIST_PROP_NUM_USERS:
+ g_value_set_int (value, lightdm_user_list_get_length (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+lightdm_user_list_finalize (GObject *object)
+{
+ LightDMUserList *self = LIGHTDM_USER_LIST (object);
+ LightDMUserListPrivate *priv = GET_LIST_PRIVATE (self);
+
+ if (priv->accounts_service_proxy)
+ g_object_unref (priv->accounts_service_proxy);
+ g_list_free_full (priv->user_account_objects, (GDestroyNotify) user_account_object_free);
+ if (priv->passwd_monitor)
+ g_object_unref (priv->passwd_monitor);
+ g_list_free_full (priv->users, g_object_unref);
+
+ G_OBJECT_CLASS (lightdm_user_list_parent_class)->finalize (object);
+}
+
+static void
+lightdm_user_list_class_init (LightDMUserListClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (LightDMUserListPrivate));
+
+ object_class->set_property = lightdm_user_list_set_property;
+ object_class->get_property = lightdm_user_list_get_property;
+ object_class->finalize = lightdm_user_list_finalize;
+
+ g_object_class_install_property (object_class,
+ LIST_PROP_NUM_USERS,
+ g_param_spec_int ("num-users",
+ "num-users",
+ "Number of login users",
+ 0, G_MAXINT, 0,
+ G_PARAM_READABLE));
+ /**
+ * LightDMUserList::user-added:
+ * @user_list: A #LightDMUserList
+ * @user: The #LightDM user that has been added.
+ *
+ * The ::user-added signal gets emitted when a user account is created.
+ **/
+ list_signals[USER_ADDED] =
+ g_signal_new ("user-added",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (LightDMUserListClass, user_added),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, LIGHTDM_TYPE_USER);
+
+ /**
+ * LightDMUserList::user-changed:
+ * @user_list: A #LightDMUserList
+ * @user: The #LightDM user that has been changed.
+ *
+ * The ::user-changed signal gets emitted when a user account is modified.
+ **/
+ list_signals[USER_CHANGED] =
+ g_signal_new ("user-changed",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (LightDMUserListClass, user_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, LIGHTDM_TYPE_USER);
+
+ /**
+ * LightDMUserList::user-removed:
+ * @user_list: A #LightDMUserList
+ * @user: The #LightDM user that has been removed.
+ *
+ * The ::user-removed signal gets emitted when a user account is removed.
+ **/
+ list_signals[USER_REMOVED] =
+ g_signal_new ("user-removed",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (LightDMUserListClass, user_removed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, LIGHTDM_TYPE_USER);
+}
/**
* lightdm_user_get_name:
@@ -62,7 +778,7 @@ const gchar *
lightdm_user_get_name (LightDMUser *user)
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
- return GET_PRIVATE (user)->name;
+ return GET_USER_PRIVATE (user)->name;
}
/**
@@ -77,7 +793,7 @@ const gchar *
lightdm_user_get_real_name (LightDMUser *user)
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
- return GET_PRIVATE (user)->real_name;
+ return GET_USER_PRIVATE (user)->real_name;
}
/**
@@ -95,7 +811,7 @@ lightdm_user_get_display_name (LightDMUser *user)
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
- priv = GET_PRIVATE (user);
+ priv = GET_USER_PRIVATE (user);
if (strcmp (priv->real_name, ""))
return priv->real_name;
else
@@ -114,7 +830,7 @@ const gchar *
lightdm_user_get_home_directory (LightDMUser *user)
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
- return GET_PRIVATE (user)->home_directory;
+ return GET_USER_PRIVATE (user)->home_directory;
}
/**
@@ -129,13 +845,13 @@ const gchar *
lightdm_user_get_image (LightDMUser *user)
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
- return GET_PRIVATE (user)->image;
+ return GET_USER_PRIVATE (user)->image;
}
static void
load_dmrc (LightDMUser *user)
{
- LightDMUserPrivate *priv = GET_PRIVATE (user);
+ LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
gchar *path;
gboolean have_dmrc;
@@ -169,7 +885,7 @@ lightdm_user_get_language (LightDMUser *user)
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
load_dmrc (user);
- return GET_PRIVATE (user)->language;
+ return GET_USER_PRIVATE (user)->language;
}
/**
@@ -185,7 +901,7 @@ lightdm_user_get_layout (LightDMUser *user)
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
load_dmrc (user);
- return GET_PRIVATE (user)->layout;
+ return GET_USER_PRIVATE (user)->layout;
}
/**
@@ -201,7 +917,7 @@ lightdm_user_get_session (LightDMUser *user)
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
load_dmrc (user);
- return GET_PRIVATE (user)->session;
+ return GET_USER_PRIVATE (user)->session;
}
/**
@@ -216,13 +932,13 @@ gboolean
lightdm_user_get_logged_in (LightDMUser *user)
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), FALSE);
- return GET_PRIVATE (user)->logged_in;
+ return GET_USER_PRIVATE (user)->logged_in;
}
static void
lightdm_user_init (LightDMUser *user)
{
- LightDMUserPrivate *priv = GET_PRIVATE (user);
+ LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
priv->name = g_strdup ("");
priv->real_name = g_strdup ("");
@@ -240,26 +956,26 @@ lightdm_user_set_property (GObject *object,
GParamSpec *pspec)
{
LightDMUser *self = LIGHTDM_USER (object);
- LightDMUserPrivate *priv = GET_PRIVATE (self);
+ LightDMUserPrivate *priv = GET_USER_PRIVATE (self);
switch (prop_id) {
- case PROP_NAME:
+ case USER_PROP_NAME:
g_free (priv->name);
priv->name = g_strdup (g_value_get_string (value));
break;
- case PROP_REAL_NAME:
+ case USER_PROP_REAL_NAME:
g_free (priv->real_name);
priv->real_name = g_strdup (g_value_get_string (value));
break;
- case PROP_HOME_DIRECTORY:
+ case USER_PROP_HOME_DIRECTORY:
g_free (priv->home_directory);
priv->home_directory = g_strdup (g_value_get_string (value));
break;
- case PROP_IMAGE:
+ case USER_PROP_IMAGE:
g_free (priv->image);
priv->image = g_strdup (g_value_get_string (value));
break;
- case PROP_LOGGED_IN:
+ case USER_PROP_LOGGED_IN:
priv->logged_in = g_value_get_boolean (value);
break;
default:
@@ -279,31 +995,31 @@ lightdm_user_get_property (GObject *object,
self = LIGHTDM_USER (object);
switch (prop_id) {
- case PROP_NAME:
+ case USER_PROP_NAME:
g_value_set_string (value, lightdm_user_get_name (self));
break;
- case PROP_REAL_NAME:
+ case USER_PROP_REAL_NAME:
g_value_set_string (value, lightdm_user_get_real_name (self));
break;
- case PROP_DISPLAY_NAME:
+ case USER_PROP_DISPLAY_NAME:
g_value_set_string (value, lightdm_user_get_display_name (self));
break;
- case PROP_HOME_DIRECTORY:
+ case USER_PROP_HOME_DIRECTORY:
g_value_set_string (value, lightdm_user_get_home_directory (self));
break;
- case PROP_IMAGE:
+ case USER_PROP_IMAGE:
g_value_set_string (value, lightdm_user_get_image (self));
break;
- case PROP_LANGUAGE:
+ case USER_PROP_LANGUAGE:
g_value_set_string (value, lightdm_user_get_language (self));
break;
- case PROP_LAYOUT:
+ case USER_PROP_LAYOUT:
g_value_set_string (value, lightdm_user_get_layout (self));
break;
- case PROP_SESSION:
+ case USER_PROP_SESSION:
g_value_set_string (value, lightdm_user_get_session (self));
break;
- case PROP_LOGGED_IN:
+ case USER_PROP_LOGGED_IN:
g_value_set_boolean (value, lightdm_user_get_logged_in (self));
break;
default:
@@ -316,7 +1032,7 @@ static void
lightdm_user_finalize (GObject *object)
{
LightDMUser *self = LIGHTDM_USER (object);
- LightDMUserPrivate *priv = GET_PRIVATE (self);
+ LightDMUserPrivate *priv = GET_USER_PRIVATE (self);
g_free (priv->name);
g_free (priv->real_name);
@@ -338,63 +1054,63 @@ lightdm_user_class_init (LightDMUserClass *klass)
object_class->finalize = lightdm_user_finalize;
g_object_class_install_property(object_class,
- PROP_NAME,
+ USER_PROP_NAME,
g_param_spec_string("name",
"name",
"Username",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
- PROP_REAL_NAME,
+ USER_PROP_REAL_NAME,
g_param_spec_string("real-name",
"real-name",
"Users real name",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
- PROP_DISPLAY_NAME,
+ USER_PROP_DISPLAY_NAME,
g_param_spec_string("display-name",
"display-name",
"Users display name",
NULL,
G_PARAM_READABLE));
g_object_class_install_property(object_class,
- PROP_HOME_DIRECTORY,
+ USER_PROP_HOME_DIRECTORY,
g_param_spec_string("home-directory",
"home-directory",
"Home directory",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
- PROP_IMAGE,
+ USER_PROP_IMAGE,
g_param_spec_string("image",
"image",
"Avatar image",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property(object_class,
- PROP_LANGUAGE,
+ USER_PROP_LANGUAGE,
g_param_spec_string("language",
"language",
"Language used by this user",
NULL,
G_PARAM_READABLE));
g_object_class_install_property(object_class,
- PROP_LAYOUT,
+ USER_PROP_LAYOUT,
g_param_spec_string("layout",
"layout",
"Keyboard layout used by this user",
NULL,
G_PARAM_READABLE));
g_object_class_install_property(object_class,
- PROP_SESSION,
+ USER_PROP_SESSION,
g_param_spec_string("session",
"session",
"Session used by this user",
NULL,
G_PARAM_READABLE));
g_object_class_install_property(object_class,
- PROP_LOGGED_IN,
+ USER_PROP_LOGGED_IN,
g_param_spec_boolean("logged-in",
"logged-in",
"TRUE if the user is currently in a session",
@@ -407,7 +1123,7 @@ lightdm_user_class_init (LightDMUserClass *klass)
*
* The ::changed signal gets emitted this user account is modified.
**/
- signals[CHANGED] =
+ user_signals[CHANGED] =
g_signal_new ("changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h
index 51918708..1d5ead3c 100644
--- a/liblightdm-qt/QLightDM/greeter.h
+++ b/liblightdm-qt/QLightDM/greeter.h
@@ -85,8 +85,8 @@ namespace QLightDM
void restart();
void connectToServer();
- void login(const QString &username=QString());
- void loginAsGuest();
+ void authenticate(const QString &username=QString());
+ void authenticateAsGuest();
void respond(const QString &response);
void cancelAuthentication();
void startSession(const QString &session=QString());
diff --git a/liblightdm-qt/greeter.cpp b/liblightdm-qt/greeter.cpp
index 249a910c..89ea1808 100644
--- a/liblightdm-qt/greeter.cpp
+++ b/liblightdm-qt/greeter.cpp
@@ -35,8 +35,8 @@
typedef enum
{
GREETER_MESSAGE_CONNECT = 0,
- GREETER_MESSAGE_LOGIN,
- GREETER_MESSAGE_LOGIN_AS_GUEST,
+ GREETER_MESSAGE_AUTHENTICATE,
+ GREETER_MESSAGE_AUTHENTICATE_AS_GUEST,
GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
GREETER_MESSAGE_START_SESSION,
GREETER_MESSAGE_CANCEL_AUTHENTICATION
@@ -209,21 +209,21 @@ void Greeter::connectToServer()
flush();
}
-void Greeter::login(const QString &username)
+void Greeter::authenticate(const QString &username)
{
d->inAuthentication = true;
d->isAuthenticated = false;
d->cancellingAuthentication = false;
d->authenticationUser = username;
qDebug() << "Starting authentication for user " << username << "...";
- writeHeader(GREETER_MESSAGE_LOGIN, intLength() + stringLength(username));
+ writeHeader(GREETER_MESSAGE_AUTHENTICATE, intLength() + stringLength(username));
d->authenticateSequenceNumber++;
writeInt(d->authenticateSequenceNumber);
writeString(username);
flush();
}
-void Greeter::loginAsGuest()
+void Greeter::authenticateAsGuest()
{
d->authenticateSequenceNumber++;
d->inAuthentication = true;
@@ -231,7 +231,7 @@ void Greeter::loginAsGuest()
d->cancellingAuthentication = false;
d->authenticationUser = "";
qDebug() << "Starting authentication for guest account";
- writeHeader(GREETER_MESSAGE_LOGIN_AS_GUEST, intLength());
+ writeHeader(GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, intLength());
writeInt(d->authenticateSequenceNumber);
flush();
}
diff --git a/src/greeter.c b/src/greeter.c
index 62a28103..55157dd2 100644
--- a/src/greeter.c
+++ b/src/greeter.c
@@ -60,8 +60,8 @@ G_DEFINE_TYPE (Greeter, greeter, G_TYPE_OBJECT);
typedef enum
{
GREETER_MESSAGE_CONNECT = 0,
- GREETER_MESSAGE_LOGIN,
- GREETER_MESSAGE_LOGIN_AS_GUEST,
+ GREETER_MESSAGE_AUTHENTICATE,
+ GREETER_MESSAGE_AUTHENTICATE_AS_GUEST,
GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
GREETER_MESSAGE_START_SESSION,
GREETER_MESSAGE_CANCEL_AUTHENTICATION
@@ -485,13 +485,13 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
handle_connect (greeter, version);
g_free (version);
break;
- case GREETER_MESSAGE_LOGIN:
+ case GREETER_MESSAGE_AUTHENTICATE:
sequence_number = read_int (greeter, &offset);
username = read_string (greeter, &offset);
handle_login (greeter, sequence_number, username);
g_free (username);
break;
- case GREETER_MESSAGE_LOGIN_AS_GUEST:
+ case GREETER_MESSAGE_AUTHENTICATE_AS_GUEST:
sequence_number = read_int (greeter, &offset);
handle_login_as_guest (greeter, sequence_number);
break;
diff --git a/tests/scripts/login-gobject-guest-disabled.script b/tests/scripts/login-gobject-guest-disabled.script
index 902540e6..dc83a232 100644
--- a/tests/scripts/login-gobject-guest-disabled.script
+++ b/tests/scripts/login-gobject-guest-disabled.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE
# Cleanup
diff --git a/tests/scripts/login-gobject-guest-fail-setup-script.script b/tests/scripts/login-gobject-guest-fail-setup-script.script
index 90968647..8f9ec184 100644
--- a/tests/scripts/login-gobject-guest-fail-setup-script.script
+++ b/tests/scripts/login-gobject-guest-fail-setup-script.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
GREETER SESSION-FAILED
diff --git a/tests/scripts/login-gobject-guest-no-config.script b/tests/scripts/login-gobject-guest-no-config.script
index 018a7abc..817c7522 100644
--- a/tests/scripts/login-gobject-guest-no-config.script
+++ b/tests/scripts/login-gobject-guest-no-config.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE
# Cleanup
diff --git a/tests/scripts/login-gobject-guest-no-setup-script.script b/tests/scripts/login-gobject-guest-no-setup-script.script
index 3524fffe..f4738239 100644
--- a/tests/scripts/login-gobject-guest-no-setup-script.script
+++ b/tests/scripts/login-gobject-guest-no-setup-script.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
GREETER SESSION-FAILED
diff --git a/tests/scripts/login-gobject-guest.script b/tests/scripts/login-gobject-guest.script
index 22db7319..56ebe033 100644
--- a/tests/scripts/login-gobject-guest.script
+++ b/tests/scripts/login-gobject-guest.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
GREETER QUIT
diff --git a/tests/scripts/login-gobject-invalid-user.script b/tests/scripts/login-gobject-invalid-user.script
index 056a01ab..5e54492c 100644
--- a/tests/scripts/login-gobject-invalid-user.script
+++ b/tests/scripts/login-gobject-invalid-user.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login as invalid user
-GREETER LOGIN USERNAME=notauser
+GREETER AUTHENTICATE USERNAME=notauser
GREETER SHOW-PROMPT TEXT="Password:"
GREETER RESPOND TEXT="password"
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE
diff --git a/tests/scripts/login-gobject-logout.script b/tests/scripts/login-gobject-logout.script
index 54ddab68..c296e671 100644
--- a/tests/scripts/login-gobject-logout.script
+++ b/tests/scripts/login-gobject-logout.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Log in
-GREETER LOGIN USERNAME=alice
+GREETER AUTHENTICATE USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
GREETER RESPOND TEXT="password"
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
diff --git a/tests/scripts/login-gobject-manual.script b/tests/scripts/login-gobject-manual.script
index 910a7477..ffd6d17f 100644
--- a/tests/scripts/login-gobject-manual.script
+++ b/tests/scripts/login-gobject-manual.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login as alice, but let lightdm prompt for a username
-GREETER LOGIN
+GREETER AUTHENTICATE
GREETER SHOW-PROMPT TEXT="login:"
GREETER RESPOND TEXT="alice"
GREETER SHOW-PROMPT TEXT="Password:"
diff --git a/tests/scripts/login-gobject-no-password.script b/tests/scripts/login-gobject-no-password.script
index 3eb27124..ce46e851 100644
--- a/tests/scripts/login-gobject-no-password.script
+++ b/tests/scripts/login-gobject-no-password.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login as bob (no password required)
-GREETER LOGIN USERNAME=bob
+GREETER AUTHENTICATE USERNAME=bob
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
GREETER QUIT
diff --git a/tests/scripts/login-gobject-session-crash.script b/tests/scripts/login-gobject-session-crash.script
index 4f58b15a..1534be8f 100644
--- a/tests/scripts/login-gobject-session-crash.script
+++ b/tests/scripts/login-gobject-session-crash.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login as alice
-GREETER LOGIN USERNAME=alice
+GREETER AUTHENTICATE USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
GREETER RESPOND TEXT="password"
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
diff --git a/tests/scripts/login-gobject-wrong-password.script b/tests/scripts/login-gobject-wrong-password.script
index dc749245..461bce79 100644
--- a/tests/scripts/login-gobject-wrong-password.script
+++ b/tests/scripts/login-gobject-wrong-password.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login with invalid password
-GREETER LOGIN USERNAME=alice
+GREETER AUTHENTICATE USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
GREETER RESPOND TEXT="rubbish"
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE
diff --git a/tests/scripts/login-gobject-xserver-crash.script b/tests/scripts/login-gobject-xserver-crash.script
index 786f400f..9d47566d 100644
--- a/tests/scripts/login-gobject-xserver-crash.script
+++ b/tests/scripts/login-gobject-xserver-crash.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Log in as alice
-GREETER LOGIN USERNAME=alice
+GREETER AUTHENTICATE USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
GREETER RESPOND TEXT="password"
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
diff --git a/tests/scripts/login-gobject.script b/tests/scripts/login-gobject.script
index 5c16435a..a9a9f91c 100644
--- a/tests/scripts/login-gobject.script
+++ b/tests/scripts/login-gobject.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login
-GREETER LOGIN USERNAME=alice
+GREETER AUTHENTICATE USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
GREETER RESPOND TEXT="password"
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
diff --git a/tests/scripts/switch-to-greeter.script b/tests/scripts/switch-to-greeter.script
index 71625f0a..b7373b3d 100644
--- a/tests/scripts/switch-to-greeter.script
+++ b/tests/scripts/switch-to-greeter.script
@@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Login
-GREETER LOGIN USERNAME=alice
+GREETER AUTHENTICATE USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
GREETER RESPOND TEXT="password"
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
diff --git a/tests/scripts/switch-to-user.script b/tests/scripts/switch-to-user.script
index 7d0cc950..0e3ceec6 100644
--- a/tests/scripts/switch-to-user.script
+++ b/tests/scripts/switch-to-user.script
@@ -36,7 +36,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Alice is automatically selected
-GREETER LOGIN-SELECTED USERNAME=alice
+GREETER AUTHENTICATE-SELECTED USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
# Cleanup
diff --git a/tests/scripts/xdmcp-login.script b/tests/scripts/xdmcp-login.script
index 334346a4..f3dbef48 100644
--- a/tests/scripts/xdmcp-login.script
+++ b/tests/scripts/xdmcp-login.script
@@ -24,7 +24,7 @@ GREETER CONNECT-TO-DAEMON
GREETER CONNECTED-TO-DAEMON
# Log in
-GREETER LOGIN USERNAME=alice
+GREETER AUTHENTICATE USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
GREETER RESPOND TEXT="password"
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
diff --git a/tests/src/test-gobject-greeter.c b/tests/src/test-gobject-greeter.c
index 7274e688..27ddb2f2 100644
--- a/tests/src/test-gobject-greeter.c
+++ b/tests/src/test-gobject-greeter.c
@@ -28,8 +28,8 @@ connected_cb (LightDMGreeter *greeter)
/* Automatically log in as requested user */
if (lightdm_greeter_get_select_user_hint (greeter))
{
- notify_status ("GREETER LOGIN-SELECTED USERNAME=%s", lightdm_greeter_get_select_user_hint (greeter));
- lightdm_greeter_login (greeter, lightdm_greeter_get_select_user_hint (greeter));
+ notify_status ("GREETER AUTHENTICATE-SELECTED USERNAME=%s", lightdm_greeter_get_select_user_hint (greeter));
+ lightdm_greeter_authenticate (greeter, lightdm_greeter_get_select_user_hint (greeter));
return;
}
@@ -39,13 +39,13 @@ connected_cb (LightDMGreeter *greeter)
{
if (g_key_file_get_boolean (config, "test-greeter-config", "login-guest", NULL))
{
- notify_status ("GREETER LOGIN-GUEST");
- lightdm_greeter_login_as_guest (greeter);
+ notify_status ("GREETER AUTHENTICATE-GUEST");
+ lightdm_greeter_authenticate_as_guest (greeter);
}
else if (g_key_file_get_boolean (config, "test-greeter-config", "prompt-username", NULL))
{
- notify_status ("GREETER LOGIN");
- lightdm_greeter_login (greeter, NULL);
+ notify_status ("GREETER AUTHENTICATE");
+ lightdm_greeter_authenticate (greeter, NULL);
}
else
{
@@ -55,8 +55,8 @@ connected_cb (LightDMGreeter *greeter)
if (!username)
return;
- notify_status ("GREETER LOGIN USERNAME=%s", username);
- lightdm_greeter_login (greeter, username);
+ notify_status ("GREETER AUTHENTICATE USERNAME=%s", username);
+ lightdm_greeter_authenticate (greeter, username);
g_free (username);
}