Combine the Exit and SessionLogout actions
authorDana Jansens <danakj@orodu.net>
Wed, 25 Nov 2009 00:36:18 +0000 (19:36 -0500)
committerDana Jansens <danakj@orodu.net>
Wed, 25 Nov 2009 00:36:18 +0000 (19:36 -0500)
Just "do the right thing" based on if you are connected to a session manager
or not.

Makefile.am
openbox/actions/all.c
openbox/actions/all.h
openbox/actions/exit.c
openbox/actions/session.c [deleted file]
openbox/session.c
openbox/session.h

index 6a6f175..5c312c7 100644 (file)
@@ -176,7 +176,6 @@ openbox_openbox_SOURCES = \
        openbox/actions/if.c \
        openbox/actions/kill.c \
        openbox/actions/layer.c \
-       openbox/actions/session.c \
        openbox/actions/lower.c \
        openbox/actions/maximize.c \
        openbox/actions/move.c \
index c86c428..47141ac 100644 (file)
@@ -9,7 +9,6 @@ void action_all_startup(void)
     action_reconfigure_startup();
     action_exit_startup();
     action_restart_startup();
-    action_session_startup();
     action_cyclewindows_startup();
     action_breakchroot_startup();
     action_close_startup();
index 4fbd6ff..5f3f573 100644 (file)
@@ -10,7 +10,6 @@ void action_showdesktop_startup();
 void action_reconfigure_startup();
 void action_exit_startup();
 void action_restart_startup();
-void action_session_startup();
 void action_cyclewindows_startup();
 void action_breakchroot_startup();
 void action_close_startup();
index 875a181..567926e 100644 (file)
@@ -1,6 +1,7 @@
 #include "openbox/actions.h"
 #include "openbox/openbox.h"
 #include "openbox/prompt.h"
+#include "openbox/session.h"
 #include "gettext.h"
 
 typedef struct {
@@ -13,6 +14,7 @@ static gboolean run_func(ObActionsData *data, gpointer options);
 void action_exit_startup(void)
 {
     actions_register("Exit", setup_func, NULL, run_func, NULL, NULL);
+    actions_register("SessionLogout", setup_func, NULL, run_func, NULL, NULL);
 }
 
 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
@@ -29,10 +31,18 @@ static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
     return o;
 }
 
+static void do_exit(void)
+{
+    if (session_connected())
+        session_request_logout(FALSE);
+    else
+        ob_exit(0);
+}
+
 static gboolean prompt_cb(ObPrompt *p, gint result, gpointer data)
 {
     if (result)
-        ob_exit(0);
+        do_exit();
     return TRUE; /* call the cleanup func */
 }
 
@@ -53,13 +63,19 @@ static gboolean run_func(ObActionsData *data, gpointer options)
             { _("Exit"), 1 }
         };
 
-        p = prompt_new(_("Are you sure you want to exit Openbox?"),
-                       _("Exit Openbox"),
-                       answers, 2, 0, 0, prompt_cb, prompt_cleanup, NULL);
+        if (session_connected())
+            p = prompt_new(_("Are you sure you want to log out?"),
+                           _("Log Out"),
+                           answers, 2, 0, 0, prompt_cb, prompt_cleanup, NULL);
+        else
+            p = prompt_new(_("Are you sure you want to exit Openbox?"),
+                           _("Exit Openbox"),
+                           answers, 2, 0, 0, prompt_cb, prompt_cleanup, NULL);
+
         prompt_show(p, NULL, FALSE);
     }
     else
-        ob_exit(0);
+        do_exit();
 
     return FALSE;
 }
diff --git a/openbox/actions/session.c b/openbox/actions/session.c
deleted file mode 100644 (file)
index 04ba96c..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-#include "openbox/actions.h"
-#include "openbox/prompt.h"
-#include "openbox/session.h"
-#include "gettext.h"
-
-typedef struct {
-    gboolean prompt;
-    gboolean silent;
-} Options;
-
-static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
-static gboolean logout_func(ObActionsData *data, gpointer options);
-
-void action_session_startup(void)
-{
-    actions_register("SessionLogout", setup_func, NULL, logout_func,
-                     NULL, NULL);
-}
-
-static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
-{
-    xmlNodePtr n;
-    Options *o;
-
-    o = g_new0(Options, 1);
-    o->prompt = TRUE;
-
-    if ((n = parse_find_node("prompt", node)))
-        o->prompt = parse_bool(doc, n);
-
-    return o;
-}
-
-static gboolean prompt_cb(ObPrompt *p, gint result, gpointer data)
-{
-    Options *o = data;
-    if (result) {
-#ifdef USE_SM
-        session_request_logout(o->silent);
-#else
-        /* TRANSLATORS: Don't translate the word "SessionLogout" as it's the
-           name of the action you write in rc.xml */
-        g_message(_("The SessionLogout action is not available since Openbox was built without session management support"));
-#endif
-    }
-    return TRUE; /* call cleanup func */
-}
-
-static void prompt_cleanup(ObPrompt *p, gpointer data)
-{
-    g_free(data);
-    prompt_unref(p);
-}
-
-/* Always return FALSE because its not interactive */
-static gboolean logout_func(ObActionsData *data, gpointer options)
-{
-    Options *o = options;
-
-    if (o->prompt) {
-        Options *o2;
-        ObPrompt *p;
-        ObPromptAnswer answers[] = {
-            { _("Cancel"), 0 },
-            { _("Log Out"), 1 }
-        };
-
-        o2 = g_memdup(o, sizeof(Options));
-        p = prompt_new(_("Are you sure you want to log out?"),
-                       _("Log Out"),
-                       answers, 2, 0, 0, prompt_cb, prompt_cleanup, o2);
-        prompt_show(p, NULL, FALSE);
-    }
-    else
-        prompt_cb(NULL, 1, o);
-
-    return FALSE;
-}
index 811592e..1401847 100644 (file)
@@ -34,6 +34,7 @@ void session_startup(gint argc, gchar **argv) {}
 void session_shutdown(gboolean permanent) {}
 GList* session_state_find(struct _ObClient *c) { return NULL; }
 void session_request_logout(gboolean silent) {}
+gboolean session_connected(void) { return FALSE; }
 #else
 
 #include "debug.h"
@@ -155,6 +156,11 @@ void session_shutdown(gboolean permanent)
     }
 }
 
+gboolean session_connected(void)
+{
+    return !!sm_conn;
+}
+
 /*! Connect to the session manager and set up our callback functions */
 static gboolean session_connect()
 {
index e2307a6..f37e211 100644 (file)
@@ -55,4 +55,6 @@ GList* session_state_find(struct _ObClient *c);
 
 void session_request_logout(gboolean silent);
 
+gboolean session_connected(void);
+
 #endif