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 0b7e587..74f2b48 100644 (file)
@@ -175,6 +175,7 @@ openbox_openbox_SOURCES = \
        openbox/actions/if.c \
        openbox/actions/kill.c \
        openbox/actions/layer.c \
        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 \
        openbox/actions/lower.c \
        openbox/actions/maximize.c \
        openbox/actions/move.c \
index 47141ac..c86c428 100644 (file)
@@ -9,6 +9,7 @@ void action_all_startup(void)
     action_reconfigure_startup();
     action_exit_startup();
     action_restart_startup();
     action_reconfigure_startup();
     action_exit_startup();
     action_restart_startup();
+    action_session_startup();
     action_cyclewindows_startup();
     action_breakchroot_startup();
     action_close_startup();
     action_cyclewindows_startup();
     action_breakchroot_startup();
     action_close_startup();
index 5f3f573..4fbd6ff 100644 (file)
@@ -10,6 +10,7 @@ void action_showdesktop_startup();
 void action_reconfigure_startup();
 void action_exit_startup();
 void action_restart_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();
 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 0f74ec2..4483c05 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_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"
 #else
 
 #include "debug.h"
@@ -804,4 +805,20 @@ static void session_load_file(const gchar *path)
     xmlFreeDoc(doc);
 }
 
     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
 #endif
index b4ce6d9..e2307a6 100644 (file)
@@ -53,4 +53,6 @@ void session_shutdown(gboolean permanent);
 
 GList* session_state_find(struct _ObClient *c);
 
 
 GList* session_state_find(struct _ObClient *c);
 
+void session_request_logout(gboolean silent);
+
 #endif
 #endif