[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