diff options
author | Eric Koegel <eric.koegel@gmail.com> | 2017-05-21 04:05:35 +0300 |
---|---|---|
committer | Eric Koegel <eric.koegel@gmail.com> | 2017-05-21 04:07:49 +0300 |
commit | 702361edb121d2c17fdcb1d7e19ee1af23eb6c61 (patch) | |
tree | 288ccc237fc4845d4c28523248745a759550c54f | |
parent | b1670e77f714848144b495037b0c55c34d8faf6f (diff) | |
download | ConsoleKit2-702361edb121d2c17fdcb1d7e19ee1af23eb6c61.tar.gz |
feat: add a session-state property and method
CK2 will change this property dynamically depending on if the
session is active or online. At some point we may also provide the
"closing" state as well but it's currently unused. This property
maps to the logind state.
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | data/ConsoleKit.conf | 3 | ||||
-rw-r--r-- | doc/libconsolekit/libconsolekit-sections.txt | 1 | ||||
-rw-r--r-- | libconsolekit/libconsolekit.c | 93 | ||||
-rw-r--r-- | libconsolekit/libconsolekit.h | 5 | ||||
-rw-r--r-- | libconsolekit/test-libconsolekit.c | 20 | ||||
-rw-r--r-- | src/ck-session.c | 27 | ||||
-rw-r--r-- | src/org.freedesktop.ConsoleKit.Session.xml | 31 |
8 files changed, 178 insertions, 4 deletions
@@ -84,6 +84,8 @@ doc/libconsolekit/setup-build.stamp doc/libconsolekit/libconsolekit-scan.c doc/libconsolekit/libconsolekit-decl.txt doc/libconsolekit/libconsolekit-decl-list.txt +doc/libconsolekit/libconsolekit-decl-list.txt.bak +doc/libconsolekit/libconsolekit-decl.txt.bak doc/libconsolekit/.libs/ doc/libconsolekit/gtkdoc-check.log doc/libconsolekit/gtkdoc-check.test diff --git a/data/ConsoleKit.conf b/data/ConsoleKit.conf index 54f2ac2..9c564ce 100644 --- a/data/ConsoleKit.conf +++ b/data/ConsoleKit.conf @@ -157,6 +157,9 @@ send_member="GetSessionClass"/> <allow send_destination="org.freedesktop.ConsoleKit" send_interface="org.freedesktop.ConsoleKit.Session" + send_member="GetSessionState"/> + <allow send_destination="org.freedesktop.ConsoleKit" + send_interface="org.freedesktop.ConsoleKit.Session" send_member="GetUser"/> <allow send_destination="org.freedesktop.ConsoleKit" send_interface="org.freedesktop.ConsoleKit.Session" diff --git a/doc/libconsolekit/libconsolekit-sections.txt b/doc/libconsolekit/libconsolekit-sections.txt index dba061d..3c34527 100644 --- a/doc/libconsolekit/libconsolekit-sections.txt +++ b/doc/libconsolekit/libconsolekit-sections.txt @@ -11,6 +11,7 @@ lib_consolekit_session_is_remote lib_consolekit_session_get_class lib_consolekit_session_get_uid lib_consolekit_session_get_seat +lib_consolekit_session_get_state lib_consolekit_session_get_display lib_consolekit_session_get_remote_host lib_consolekit_session_get_tty diff --git a/libconsolekit/libconsolekit.c b/libconsolekit/libconsolekit.c index b67a711..0b77e63 100644 --- a/libconsolekit/libconsolekit.c +++ b/libconsolekit/libconsolekit.c @@ -932,6 +932,97 @@ lib_consolekit_session_get_class (LibConsoleKit *ck, } /** + * lib_consolekit_session_get_state: + * @ck : A #LibConsoleKit + * @session : The session to query + * @state : (out) (transfer full): The session's state + * @error : (out) (allow-none) (transfer full): The error message if something failed + * + * Returns the current state of the provided session. The following states + * may be returned: + * "online" - Session is logged in but not active + * "active" - Session is logged in and active + * "closing" - Session is in the process of shutting down + * + * Note: Additional states may be added in the future. Free the state + * string with g_free. + * + * Return value: TRUE on Success. + * + * Since: 1.0 + **/ +gboolean +lib_consolekit_session_get_state (LibConsoleKit *ck, + const gchar *session, + gchar **state, + GError **error) +{ + GDBusProxy *session_proxy = NULL; + GVariant *variant = NULL; + + if (ck == NULL) { + g_set_error (error, + CONSOLEKIT_ERROR, + CONSOLEKIT_ERROR_INVALID_INPUT, + "Invalid LibConsoleKit"); + return FALSE; + } + + if (session == NULL) { + g_set_error (error, + CONSOLEKIT_ERROR, + CONSOLEKIT_ERROR_INVALID_INPUT, + "Session must not be NULL"); + return FALSE; + } + + if (state == NULL) { + g_set_error (error, + CONSOLEKIT_ERROR, + CONSOLEKIT_ERROR_INVALID_INPUT, + "state must not be NULL"); + return FALSE; + } + + /* connect to the ConsoleKit session */ + session_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + CK_NAME, + session, + CK_SESSION_NAME, + NULL, + error); + + /* failed to connect */ + if (session_proxy == NULL) { + return FALSE; + } + + variant = g_dbus_proxy_call_sync (session_proxy, + "GetSessionState", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + error); + + /* We're done with the session proxy */ + g_clear_object(&session_proxy); + + if (variant == NULL) { + return FALSE; + } + + g_variant_get_child (variant, 0, "s", state); + + g_variant_unref (variant); + variant = NULL; + + return TRUE; +} + +/** * lib_consolekit_session_get_display: * @ck : A #LibConsoleKit * @session : The session to query @@ -1183,7 +1274,7 @@ lib_consolekit_session_get_tty (LibConsoleKit *ck, /* We're not running X11, try for just the display device */ if (strlen (*tty) == 0) { - g_free (tty); + g_free (*tty); variant = g_dbus_proxy_call_sync (session_proxy, "GetDisplayDevice", diff --git a/libconsolekit/libconsolekit.h b/libconsolekit/libconsolekit.h index 234ac73..fd75362 100644 --- a/libconsolekit/libconsolekit.h +++ b/libconsolekit/libconsolekit.h @@ -111,6 +111,11 @@ gboolean lib_consolekit_session_get_class (LibConsoleKit *ck, gchar **session_class, GError **error); +gboolean lib_consolekit_session_get_state (LibConsoleKit *ck, + const gchar *session, + gchar **state, + GError **error); + gboolean lib_consolekit_session_get_display (LibConsoleKit *ck, const gchar *session, gchar **display, diff --git a/libconsolekit/test-libconsolekit.c b/libconsolekit/test-libconsolekit.c index 3b77040..449a6d3 100644 --- a/libconsolekit/test-libconsolekit.c +++ b/libconsolekit/test-libconsolekit.c @@ -250,6 +250,24 @@ test_session_get_class (LibConsoleKit *ck, } static void +test_session_get_state (LibConsoleKit *ck, + const gchar *session) +{ + gchar *state = NULL; + GError *error = NULL; + + lib_consolekit_session_get_state (ck, session, &state, &error); + if (!error) { + g_print ("lib_consolekit_session_get_state (session %s) : session state %s\n", session, state); + } else { + g_print ("lib_consolekit_session_get_state (session %s) : error %s\n", session, error->message); + g_clear_error (&error); + } + + g_free (state); +} + +static void test_session_get_tty (LibConsoleKit *ck, const gchar *session) { @@ -372,6 +390,8 @@ main (int argc, test_session_get_class (ck, opt_session); + test_session_get_state (ck, opt_session); + test_session_get_tty (ck, opt_session); test_session_get_vt (ck, opt_session); diff --git a/src/ck-session.c b/src/ck-session.c index 5c6eaaa..a994c69 100644 --- a/src/ck-session.c +++ b/src/ck-session.c @@ -258,6 +258,11 @@ register_session (CkSession *session, GDBusConnection *connection) console_kit_session_set_session_class (CONSOLE_KIT_SESSION (session), "user"); } + /* default to online for the session state on startup */ + if (console_kit_session_get_session_class (CONSOLE_KIT_SESSION (session)) == NULL) { + console_kit_session_set_session_class (CONSOLE_KIT_SESSION (session), "online"); + } + return TRUE; } @@ -559,6 +564,23 @@ dbus_get_session_class (ConsoleKitSession *cksession, return TRUE; } +static gboolean +dbus_get_session_state (ConsoleKitSession *cksession, + GDBusMethodInvocation *context) +{ + const gchar *state = console_kit_session_get_session_state (cksession); + + TRACE (); + + if (state == NULL) { + /* default to online, but this shouldn't really happen */ + state = "online"; + } + + console_kit_session_complete_get_session_state (cksession, context, state); + return TRUE; +} + static void ck_session_print_list_size (CkSession *session) { @@ -593,6 +615,7 @@ ck_session_check_paused_devices (CkSession *session) console_kit_session_set_active (cksession, FALSE); console_kit_session_emit_active_changed (cksession, FALSE); + console_kit_session_set_session_state (cksession, "online"); } if (session->priv->pause_devices_timer != 0) { @@ -663,6 +686,7 @@ ck_session_pause_all_devices (CkSession *session, console_kit_session_set_active (cksession, FALSE); console_kit_session_emit_active_changed (cksession, FALSE); + console_kit_session_set_session_state (cksession, "online"); } else { session->priv->pause_devices_timer = g_timeout_add_seconds (3, (GSourceFunc)force_pause_devices, session); } @@ -728,6 +752,7 @@ ck_session_resume_all_devices (CkSession *session) g_debug ("no session controller: marking session active"); console_kit_session_set_active (cksession, TRUE); console_kit_session_emit_active_changed (cksession, TRUE); + console_kit_session_set_session_state (cksession, "active"); return; } @@ -789,6 +814,7 @@ ck_session_resume_all_devices (CkSession *session) g_debug ("marking session active"); console_kit_session_set_active (cksession, TRUE); console_kit_session_emit_active_changed (cksession, TRUE); + console_kit_session_set_session_state (cksession, "active"); } gboolean @@ -2013,6 +2039,7 @@ ck_session_iface_init (ConsoleKitSessionIface *iface) iface->handle_get_vtnr = dbus_get_vtnr; iface->handle_get_session_type = dbus_get_session_type; iface->handle_get_session_class = dbus_get_session_class; + iface->handle_get_session_state = dbus_get_session_state; iface->handle_get_x11_display_device = dbus_get_x11_display_device; iface->handle_get_display_device = dbus_get_display_device; iface->handle_get_x11_display = dbus_get_x11_display; diff --git a/src/org.freedesktop.ConsoleKit.Session.xml b/src/org.freedesktop.ConsoleKit.Session.xml index c698023..f899103 100644 --- a/src/org.freedesktop.ConsoleKit.Session.xml +++ b/src/org.freedesktop.ConsoleKit.Session.xml @@ -64,7 +64,7 @@ </arg> <doc:doc> <doc:description> - <doc:para>Returns the display type of the provided session. The following type may be returned:</doc:para> + <doc:para>Returns the display type of the provided session. The following classes may be returned:</doc:para> <doc:para>"user" - A normal user session, the default</doc:para> <doc:para>"greeter" - Display Manager pseudo session</doc:para> <doc:para>"lock-screen" - Screensaver based session</doc:para> @@ -75,6 +75,24 @@ <doc:seealso><doc:ref type="property" to="Session:session-class">session-class</doc:ref></doc:seealso> </doc:doc> </method> + <method name="GetSessionState"> + <arg name="type" direction="out" type="s"> + <doc:doc> + <doc:summary>Session state</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Returns the current state of the session. The following states may be returned:</doc:para> + <doc:para>"online" - Session is logged in but not active</doc:para> + <doc:para>"active" - Session is logged in and active</doc:para> + <doc:para>"closing" - Session is in the process of shutting down</doc:para> + <doc:para>Note: Additional classes may be added in the future.</doc:para> + <doc:para>Since 1.1.2</doc:para> + </doc:description> + <doc:seealso><doc:ref type="property" to="Session:session-state">session-state</doc:ref></doc:seealso> + </doc:doc> + </method> <method name="GetUser"> <arg name="uid" direction="out" type="u"> <doc:doc> @@ -610,20 +628,27 @@ </doc:description> </doc:doc> </property> - <property name="session-type" type="s" access="readwrite"> + <property name="session-type" type="s" access="read"> <doc:doc> <doc:description> <doc:para>The type of the session.</doc:para> </doc:description> </doc:doc> </property> - <property name="session-class" type="s" access="readwrite"> + <property name="session-class" type="s" access="read"> <doc:doc> <doc:description> <doc:para>The class of the session.</doc:para> </doc:description> </doc:doc> </property> + <property name="session-state" type="s" access="read"> + <doc:doc> + <doc:description> + <doc:para>The state of the session.</doc:para> + </doc:description> + </doc:doc> + </property> <property name="remote-host-name" type="s" access="read"> <doc:doc> <doc:description> |