Commit ac387875 authored by Eric Koegel's avatar Eric Koegel
Browse files

Add switch-user to the xfsm-logout program

parent 6f654c94
......@@ -47,6 +47,7 @@ gboolean opt_halt = FALSE;
gboolean opt_reboot = FALSE;
gboolean opt_suspend = FALSE;
gboolean opt_hibernate = FALSE;
gboolean opt_switch_user = FALSE;
gboolean opt_fast = FALSE;
gboolean opt_version = FALSE;
......@@ -57,7 +58,8 @@ enum
XFSM_SHUTDOWN_HALT,
XFSM_SHUTDOWN_REBOOT,
XFSM_SHUTDOWN_SUSPEND,
XFSM_SHUTDOWN_HIBERNATE
XFSM_SHUTDOWN_HIBERNATE,
XFSM_SHUTDOWN_SWITCH_USER
};
static GOptionEntry option_entries[] =
......@@ -82,6 +84,10 @@ static GOptionEntry option_entries[] =
N_("Hibernate without displaying the logout dialog"),
NULL
},
{ "switch-user", 'u', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_switch_user,
N_("Switch user without displaying the logout dialog"),
NULL
},
{ "fast", 'f', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_fast,
N_("Log out quickly; don't save the session"),
NULL
......@@ -194,6 +200,15 @@ main (int argc, char **argv)
NULL,
&err);
}
else if (opt_switch_user)
{
result = g_dbus_proxy_call_sync (proxy, "SwitchUser",
g_variant_new("()"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&err);
}
else
{
show_dialog = !opt_logout;
......@@ -225,6 +240,8 @@ main (int argc, char **argv)
shutdown_type = XFSM_SHUTDOWN_SUSPEND;
else if (opt_hibernate)
shutdown_type = XFSM_SHUTDOWN_HIBERNATE;
else if (opt_switch_user)
shutdown_type = XFSM_SHUTDOWN_SWITCH_USER;
else
shutdown_type = XFSM_SHUTDOWN_ASK;
......
......@@ -148,6 +148,11 @@
<arg direction="out" name="can_hibernate" type="b"/>
</method>
<!--
void org.Xfce.Session.Manager.SwitchUser
-->
<method name="SwitchUser" />
<!--
ObjectPath[] org.Xfce.Session.Manager.RegisterClient
......
......@@ -1201,10 +1201,11 @@ xfsm_manager_save_yourself_global (XfsmManager *manager,
manager->shutdown_type = shutdown_type;
/* we only save the session and quit if we're actually shutting down;
* suspend and hibernate will (if successful) return us to
* suspend, hibernate, and switch user will (if successful) return us to
* exactly the same state, so there's no need to save session */
if (manager->shutdown_type == XFSM_SHUTDOWN_SUSPEND
|| manager->shutdown_type == XFSM_SHUTDOWN_HIBERNATE)
|| manager->shutdown_type == XFSM_SHUTDOWN_HIBERNATE
|| manager->shutdown_type == XFSM_SHUTDOWN_SWITCH_USER)
{
if (!xfsm_shutdown_try_type (manager->shutdown_helper,
manager->shutdown_type,
......@@ -1215,16 +1216,18 @@ xfsm_manager_save_yourself_global (XfsmManager *manager,
"dialog-error",
manager->shutdown_type == XFSM_SHUTDOWN_SUSPEND
? _("Failed to suspend session")
: _("Failed to hibernate session"),
: manager->shutdown_type == XFSM_SHUTDOWN_HIBERNATE
? _("Failed to hibernate session")
: _("Failed to switch user"),
error->message,
XFCE_BUTTON_TYPE_MIXED, "window-close", _("_Close"), GTK_RESPONSE_ACCEPT,
NULL);
g_error_free (error);
}
/* at this point, either we failed to suspend/hibernate, or we
* successfully suspended/hibernated, and we've been woken back
* up, so return control to the user */
/* at this point, either we failed to suspend/hibernate/switch user,
* or we successfully did and we've been woken back
* up or returned to the session, so return control to the user */
return;
}
}
......@@ -1967,6 +1970,8 @@ static gboolean xfsm_manager_dbus_hibernate (XfsmDbusManager *object,
GDBusMethodInvocation *invocation);
static gboolean xfsm_manager_dbus_can_hibernate (XfsmDbusManager *object,
GDBusMethodInvocation *invocation);
static gboolean xfsm_manager_dbus_switch_user (XfsmDbusManager *object,
GDBusMethodInvocation *invocation);
static gboolean xfsm_manager_dbus_register_client (XfsmDbusManager *object,
GDBusMethodInvocation *invocation,
const gchar *arg_app_id,
......@@ -2073,6 +2078,7 @@ xfsm_manager_iface_init (XfsmDbusManagerIface *iface)
iface->handle_get_info = xfsm_manager_dbus_get_info;
iface->handle_get_state = xfsm_manager_dbus_get_state;
iface->handle_hibernate = xfsm_manager_dbus_hibernate;
iface->handle_switch_user = xfsm_manager_dbus_switch_user;
iface->handle_list_clients = xfsm_manager_dbus_list_clients;
iface->handle_logout = xfsm_manager_dbus_logout;
iface->handle_restart = xfsm_manager_dbus_restart;
......@@ -2231,6 +2237,8 @@ xfsm_manager_dbus_logout (XfsmDbusManager *object,
{
XfsmShutdownType type;
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
type = arg_show_dialog ? XFSM_SHUTDOWN_ASK : XFSM_SHUTDOWN_LOGOUT;
......@@ -2251,6 +2259,8 @@ xfsm_manager_dbus_shutdown (XfsmDbusManager *object,
GDBusMethodInvocation *invocation,
gboolean arg_allow_save)
{
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
if (xfsm_manager_save_yourself_dbus (XFSM_MANAGER (object), XFSM_SHUTDOWN_SHUTDOWN, arg_allow_save) == FALSE)
{
......@@ -2271,6 +2281,8 @@ xfsm_manager_dbus_can_shutdown (XfsmDbusManager *object,
gboolean can_shutdown = FALSE;
GError *error = NULL;
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
xfsm_shutdown_can_shutdown (XFSM_MANAGER (object)->shutdown_helper, &can_shutdown, &error);
......@@ -2292,6 +2304,8 @@ xfsm_manager_dbus_restart (XfsmDbusManager *object,
GDBusMethodInvocation *invocation,
gboolean arg_allow_save)
{
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
if (xfsm_manager_save_yourself_dbus (XFSM_MANAGER (object), XFSM_SHUTDOWN_RESTART, arg_allow_save) == FALSE)
{
......@@ -2312,6 +2326,8 @@ xfsm_manager_dbus_can_restart (XfsmDbusManager *object,
gboolean can_restart = FALSE;
GError *error = NULL;
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
xfsm_shutdown_can_restart (XFSM_MANAGER (object)->shutdown_helper, &can_restart, &error);
......@@ -2334,6 +2350,8 @@ xfsm_manager_dbus_suspend (XfsmDbusManager *object,
{
GError *error = NULL;
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
if (xfsm_shutdown_try_suspend (XFSM_MANAGER (object)->shutdown_helper, &error) == FALSE)
{
......@@ -2355,6 +2373,8 @@ xfsm_manager_dbus_can_suspend (XfsmDbusManager *object,
gboolean can_suspend = FALSE;
GError *error = NULL;
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
xfsm_shutdown_can_suspend (XFSM_MANAGER (object)->shutdown_helper, &can_suspend, &auth_suspend, &error);
......@@ -2379,6 +2399,8 @@ xfsm_manager_dbus_hibernate (XfsmDbusManager *object,
{
GError *error = NULL;
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
if (xfsm_shutdown_try_hibernate (XFSM_MANAGER (object)->shutdown_helper, &error) == FALSE)
{
......@@ -2391,7 +2413,6 @@ xfsm_manager_dbus_hibernate (XfsmDbusManager *object,
return TRUE;
}
static gboolean
xfsm_manager_dbus_can_hibernate (XfsmDbusManager *object,
GDBusMethodInvocation *invocation)
......@@ -2400,6 +2421,8 @@ xfsm_manager_dbus_can_hibernate (XfsmDbusManager *object,
gboolean can_hibernate = FALSE;
GError *error = NULL;
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
xfsm_shutdown_can_hibernate (XFSM_MANAGER (object)->shutdown_helper, &can_hibernate, &auth_hibernate, &error);
......@@ -2418,6 +2441,26 @@ xfsm_manager_dbus_can_hibernate (XfsmDbusManager *object,
return TRUE;
}
static gboolean
xfsm_manager_dbus_switch_user (XfsmDbusManager *object,
GDBusMethodInvocation *invocation)
{
GError *error = NULL;
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
if (xfsm_shutdown_try_switch_user (XFSM_MANAGER (object)->shutdown_helper, &error) == FALSE)
{
throw_error (invocation, XFSM_ERROR_BAD_STATE, error->message);
g_clear_error (&error);
return TRUE;
}
xfsm_dbus_manager_complete_switch_user (object, invocation);
return TRUE;
}
/* adapted from ConsoleKit2 whch was adapted from PolicyKit */
......
......@@ -209,6 +209,9 @@ xfsm_shutdown_try_type (XfsmShutdown *shutdown,
case XFSM_SHUTDOWN_HIBERNATE:
return xfsm_shutdown_try_hibernate (shutdown, error);
case XFSM_SHUTDOWN_SWITCH_USER:
return xfsm_shutdown_try_switch_user (shutdown, error);
default:
g_set_error (error, 1, 0, _("Unknown shutdown method %d"), type);
break;
......@@ -338,7 +341,9 @@ xfsm_shutdown_try_switch_user (XfsmShutdown *shutdown,
GVariant *unused = NULL;
const gchar *DBUS_NAME = "org.freedesktop.DisplayManager";
const gchar *DBUS_INTERFACE = "org.freedesktop.DisplayManager.Seat";
const gchar *DBUS_OBJECT_PATH = "/org/freedesktop/DisplayManager/Seat0";
const gchar *DBUS_OBJECT_PATH = g_getenv ("XDG_SEAT_PATH");
xfsm_verbose ("entering\n");
g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE);
......@@ -351,11 +356,13 @@ xfsm_shutdown_try_switch_user (XfsmShutdown *shutdown,
NULL,
error);
if (display_proxy == NULL || error != NULL)
if (display_proxy == NULL || *error != NULL)
{
xfsm_verbose ("display proxy == NULL or an error was set\n");
return FALSE;
}
xfsm_verbose ("calling SwitchToGreeter\n");
unused = g_dbus_proxy_call_sync (display_proxy,
"SwitchToGreeter",
g_variant_new ("()"),
......@@ -371,7 +378,7 @@ xfsm_shutdown_try_switch_user (XfsmShutdown *shutdown,
g_object_unref (display_proxy);
return (error == NULL);
return (*error == NULL);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment