]> Dogcows Code - chaz/openbox/commitdiff
add a SessionLogout action
authorDana Jansens <danakj@orodu.net>
Sun, 2 Mar 2008 07:50:19 +0000 (02:50 -0500)
committerDana Jansens <danakj@orodu.net>
Sun, 2 Mar 2008 08:46:22 +0000 (03:46 -0500)
Makefile.am
openbox/actions/all.c
openbox/actions/all.h
openbox/actions/session.c [new file with mode: 0644]
openbox/session.c
openbox/session.h

index 0b7e58787077c773f281e3e9def263390130d975..74f2b48a968bcf9bcfac66dde187ae6e6cf9a35e 100644 (file)
@@ -175,6 +175,7 @@ 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 47141ac6a65df57d31b1665c04ff9389b0d9c9de..c86c4281abfde8fe76c59084314ea1a676d39e45 100644 (file)
@@ -9,6 +9,7 @@ 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 5f3f573f247a967e3c1e19f3b5c85b29a8584b7b..4fbd6ff547365f353cba2e1843b1ea1231954e7c 100644 (file)
@@ -10,6 +10,7 @@ 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();
diff --git a/openbox/actions/session.c b/openbox/actions/session.c
new file mode 100644 (file)
index 0000000..0031a27
--- /dev/null
@@ -0,0 +1,70 @@
+#include "openbox/actions.h"
+#include "openbox/prompt.h"
+#include "openbox/session.h"
+#include "gettext.h"
+
+#ifndef USE_SM
+void action_logout_startup(void) {}
+#else
+
+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);
+
+    if ((n = parse_find_node("prompt", node)))
+        o->prompt = parse_bool(doc, n);
+
+    return o;
+}
+
+static void prompt_cb(ObPrompt *p, gint result, gpointer data)
+{
+    Options *o = data;
+    if (result)
+        session_request_logout(o->silent);
+    g_free(o);
+    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?"),
+                       answers, 2, 0, 0, prompt_cb, o2);
+        prompt_show(p, NULL, FALSE);
+    }
+    else
+        prompt_cb(NULL, 1, NULL);
+
+    return FALSE;
+}
+
+#endif
index 0f74ec28bdcda79ea67dc62cdac017e2fec2513e..4483c0515547db5013a16747e81a6324a3e4b297 100644 (file)
@@ -33,6 +33,7 @@ GSList *session_desktop_names = NULL;
 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) {}
 #else
 
 #include "debug.h"
@@ -804,4 +805,20 @@ static void session_load_file(const gchar *path)
     xmlFreeDoc(doc);
 }
 
+void session_request_logout(gboolean silent)
+{
+    if (sm_conn) {
+        SmcRequestSaveYourself(sm_conn,
+                               SmSaveBoth,
+                               TRUE, /* logout */
+                               (silent ?
+                                SmInteractStyleNone : SmInteractStyleAny),
+                               TRUE,  /* if false, with GSM, it shows the old
+                                         logout prompt */
+                               TRUE); /* global */
+    }
+    else
+        g_message(_("Not connected to a session manager"));
+}
+
 #endif
index b4ce6d917a156c775c02ce72f832fcec0cf8a3eb..e2307a6f420e5faf72b95065f16ff5d48dfb648f 100644 (file)
@@ -53,4 +53,6 @@ void session_shutdown(gboolean permanent);
 
 GList* session_state_find(struct _ObClient *c);
 
+void session_request_logout(gboolean silent);
+
 #endif
This page took 0.026375 seconds and 4 git commands to generate.