[Xfce4-commits] <xfce4-session:dbus-api-additions> WIP
Brian J. Tarricone
noreply at xfce.org
Fri Jan 29 07:08:07 CET 2010
Updating branch refs/heads/dbus-api-additions
to c5315ad04d59b70fb7c39727514691444cf356a9 (commit)
from cfaeaeeb62f354e0060c1c036d8a04b41f4349bb (commit)
commit c5315ad04d59b70fb7c39727514691444cf356a9
Author: Brian J. Tarricone <brian at tarricone.org>
Date: Mon Jul 27 04:50:45 2009 -0700
WIP
xfce4-session/xfsm-manager-dbus.xml | 62 ++++++++++++++++++
xfce4-session/xfsm-manager.c | 122 +++++++++++++++++++++++++++++------
2 files changed, 163 insertions(+), 21 deletions(-)
diff --git a/xfce4-session/xfsm-manager-dbus.xml b/xfce4-session/xfsm-manager-dbus.xml
index 69c652c..8682d53 100644
--- a/xfce4-session/xfsm-manager-dbus.xml
+++ b/xfce4-session/xfsm-manager-dbus.xml
@@ -35,6 +35,20 @@
</method>
<!--
+ String[] org.xfce.Session.Manager.GetCapabilities()
+
+ Retrieves a list of stuff the session manager is
+ capable of doing. Current possibilities:
+ suspend
+ hibernate
+ reboot
+ shutdown
+ -->
+ <method name="GetCapabilities">
+ <arg direction="out" type="as"/>
+ </method>
+
+ <!--
ObjectPath[] org.xfce.Session.Manager.ListClients()
Retrieves a list of session clients from the session
@@ -81,6 +95,36 @@
</method>
<!--
+ void org.xfce.Session.Manager.SessionControl(String action,
+ Dict[] options)
+
+ @action: Action to request. Currently-recognized
+ values are:
+ show-logout-dialog
+ logout
+ suspend
+ hibernate
+ reboot
+ shutdown
+ @options: An array of (String, Variant) pairs. Currently-
+ recognized options are:
+ fast (bool): Whether or not to allow
+ applications connected to the
+ SM a chance to close cleanly.
+ allow-interact (bool): Whether or not to allow
+ applications connected
+ to the SM to interact
+ with the user during
+ shutdown.
+ These two options are ignored for all @action values
+ except 'reboot' and 'shutdown'.
+ -->
+ <method name="SessionControl">
+ <arg direction="in" name="action" type="s"/>
+ <arg direction="in" name="options" type="a{sv}"/>
+ </method>
+
+ <!--
void org.xfce.Session.Manager.Shutdown(Unsigned Int type,
Boolean save)
@@ -96,6 +140,10 @@
immediately. Note that this parameter is
ignored for type==0.
+ NOTE: This method is deprecated and should not be used in
+ newly-written code. See the SessionControl() method for
+ a replacement.
+
Instructs the session manager to shut down. Type 0 will
prompt the user for a shutdown type. All other types will
take immediate action without user input.
@@ -143,5 +191,19 @@
cancelled.
-->
<signal name="ShutdownCancelled"/>
+
+ <!--
+ void org.xfce.Session.Manager.CapabilitiesChanged(String[] caps_added,
+ String[] caps_removed)
+
+ @caps_added: A list of new capabilities available.
+ @caps_removed: A list of capabilities lost.
+
+ Emitted when the list of capabilities is changed.
+ -->
+ <signal name="CapabilitiesChanged">
+ <arg name="caps_added" type="as"/>
+ <arg name="caps_removed" type="as"/>
+ </signal>
</interface>
</node>
diff --git a/xfce4-session/xfsm-manager.c b/xfce4-session/xfsm-manager.c
index 49f6cd2..f674f22 100644
--- a/xfce4-session/xfsm-manager.c
+++ b/xfce4-session/xfsm-manager.c
@@ -1,7 +1,7 @@
/* $Id$ */
/*-
* Copyright (c) 2003-2006 Benedikt Meurer <benny at xfce.org>
- * Copyright (c) 2008 Brian Tarricone <bjt23 at cornell.edu>
+ * Copyright (c) 2008-2009 Brian Tarricone <bjt23 at cornell.edu>
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -146,8 +146,9 @@ typedef struct
{
XfsmManager *manager;
XfsmShutdownType type;
- gboolean allow_save;
-} ShutdownIdleData;
+ gboolean fast;
+ gboolean allow_interact;
+} XfsmSessionControlIdleData;
enum
{
@@ -1776,6 +1777,10 @@ static gboolean xfsm_manager_dbus_get_state (XfsmManager *manager,
static gboolean xfsm_manager_dbus_checkpoint (XfsmManager *manager,
const gchar *session_name,
GError **error);
+static gboolean xfsm_manager_dbus_session_control (XfsmManager *manager,
+ const gchar *action,
+ GHashTable *options,
+ GError **error);
static gboolean xfsm_manager_dbus_shutdown (XfsmManager *manager,
guint type,
gboolean allow_save,
@@ -1935,34 +1940,99 @@ xfsm_manager_dbus_checkpoint (XfsmManager *manager,
}
+
static gboolean
-xfsm_manager_dbus_shutdown_idled (gpointer data)
+xfsm_manager_dbus_session_control_idled (gpointer data)
{
- ShutdownIdleData *idata = data;
+ XfsmSessionControlIdleData *scdata = data;
- xfsm_manager_save_yourself_global (idata->manager, SmSaveBoth, TRUE,
- SmInteractStyleAny, FALSE,
- idata->type, idata->allow_save);
+ xfsm_manager_save_yourself_global (scdata->manager, SmSaveBoth, TRUE,
+ scdata->allow_interact
+ ? SmInteractStyleAny
+ : SmInteractStyleNone,
+ scdata->fast, scdata->type,
+ !scdata->fast);
return FALSE;
}
+
static gboolean
-xfsm_manager_dbus_shutdown (XfsmManager *manager,
- guint type,
- gboolean allow_save,
- GError **error)
+xfsm_manager_dbus_session_control (XfsmManager *manager,
+ const gchar *action,
+ GHashTable *options,
+ GError **error)
{
- ShutdownIdleData *idata;
+ XfsmShutdownType type = -1;
+ XfsmSessionControlIdleData *scdata;
+ GValue *value;
if (manager->state != XFSM_MANAGER_IDLE)
{
g_set_error (error, XFSM_ERROR, XFSM_ERROR_BAD_STATE,
- _("Session manager must be in idle state when requesting a shutdown"));
+ _("Session manager must be in idle state when requesting session control"));
return FALSE;
}
+ if (!strcmp (action, "show-logout-dialog"))
+ type = XFSM_SHUTDOWN_ASK;
+ else if (!strcmp (action, "suspend"))
+ type = XFSM_SHUTDOWN_SUSPEND;
+ else if (!strcmp (action, "hibernate"))
+ type = XFSM_SHUTDOWN_HIBERNATE;
+ else if (!strcmp (action, "reboot"))
+ type = XFSM_SHUTDOWN_REBOOT;
+ else if (!strcmp (action, "shutdown"))
+ type = XFSM_SHUTDOWN_HALT;
+ else
+ {
+ g_set_error (error, XFSM_ERROR, XFSM_ERROR_BAD_VALUE,
+ _("Invalid action \"%s\""), action);
+ return FALSE;
+ }
+
+ scdata = g_new0 (XfsmSessionControlIdleData, 1);
+ scdata->manager = manager;
+ scdata->type = type;
+
+ value = g_hash_table_lookup (options, "fast");
+ if (value)
+ scdata->fast = g_value_get_boolean (value);
+ else
+ scdata->fast = FALSE;
+
+ value = g_hash_table_lookup (options, "allow-interact");
+ if (value)
+ scdata->allow_interact = g_value_get_boolean (value);
+ else
+ scdata->allow_interact = TRUE;
+
+ g_idle_add_full (G_PRIORITY_DEFAULT, xfsm_manager_dbus_session_control_idled,
+ scdata, (GDestroyNotify) g_free);
+
+ return TRUE;
+}
+
+static gboolean
+xfsm_manager_dbus_shutdown (XfsmManager *manager,
+ guint type,
+ gboolean allow_save,
+ GError **error)
+{
+ static const gchar *action_map[] =
+ {
+ [XFSM_SHUTDOWN_ASK] = "show-logout-dialog",
+ [XFSM_SHUTDOWN_SUSPEND] = "suspend",
+ [XFSM_SHUTDOWN_HIBERNATE] = "hibernate",
+ [XFSM_SHUTDOWN_REBOOT] = "reboot",
+ [XFSM_SHUTDOWN_HALT] = "shutdown",
+ };
+ GHashTable *options;
+ gboolean ret;
+ GValue value1 = { 0, };
+ GValue value2 = { 0, };
+
if (type > XFSM_SHUTDOWN_HIBERNATE)
{
g_set_error (error, XFSM_ERROR, XFSM_ERROR_BAD_VALUE,
@@ -1970,12 +2040,22 @@ xfsm_manager_dbus_shutdown (XfsmManager *manager,
return FALSE;
}
- idata = g_new (ShutdownIdleData, 1);
- idata->manager = manager;
- idata->type = type;
- idata->allow_save = allow_save;
- g_idle_add_full (G_PRIORITY_DEFAULT, xfsm_manager_dbus_shutdown_idled,
- idata, (GDestroyNotify) g_free);
+ options = g_hash_table_new (g_str_hash, g_str_equal);
- return TRUE;
+ g_value_init (&value1, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value1, !allow_save);
+ g_hash_table_insert (options, "fast", &value1);
+
+ g_value_init (&value2, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value2, allow_save);
+ g_hash_table_insert (options, "allow-interact", &value2);
+
+ ret = xfsm_manager_dbus_session_control (manager, action_map[type],
+ options, error);
+
+ g_hash_table_destroy (options);
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+
+ return ret;
}
More information about the Xfce4-commits
mailing list