[gnome-applets/wip/segeiger/window-picker/task-title: 3/5] windowpicker: implement logout button in TaskTitle



commit bf67bbe24770464f473bfd85026cbf2dc72c5749
Author: Sebastian Geiger <sbastig gmx net>
Date:   Mon Feb 8 14:10:49 2016 +0100

    windowpicker: implement logout button in TaskTitle

 windowpicker/src/Makefile.am     |    2 +
 windowpicker/src/wp-task-title.c |   57 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 0 deletions(-)
---
diff --git a/windowpicker/src/Makefile.am b/windowpicker/src/Makefile.am
index 1e227ad..6ab8c71 100644
--- a/windowpicker/src/Makefile.am
+++ b/windowpicker/src/Makefile.am
@@ -61,6 +61,8 @@ EXTRA_DIST = \
 CLEANFILES = \
        wp-resources.c \
        wp-resources.h \
+       dbus-login1-manager.c \
+       dbus-login1-manager.h \
        $(NULL)
 
 -include $(top_srcdir)/git.mk
diff --git a/windowpicker/src/wp-task-title.c b/windowpicker/src/wp-task-title.c
index 2a48ef4..66cc0d2 100644
--- a/windowpicker/src/wp-task-title.c
+++ b/windowpicker/src/wp-task-title.c
@@ -24,6 +24,7 @@
 #include "config.h"
 
 #include <glib/gi18n-lib.h>
+#include <gio/gio.h>
 #include <libwnck/libwnck.h>
 #include <panel-applet.h>
 
@@ -45,6 +46,7 @@ struct _WpTaskTitle
   PanelAppletOrient  applet_orient;
 
   WnckWindow        *active_window;
+  GDBusProxy        *session_proxy;
 };
 
 enum
@@ -62,6 +64,43 @@ G_DEFINE_TYPE (WpTaskTitle, wp_task_title, GTK_TYPE_BOX)
 
 static void disconnect_active_window (WpTaskTitle *title);
 
+static void
+logout_ready_callback (GObject      *source_object,
+                       GAsyncResult *res,
+                       WpTaskTitle  *title)
+{
+  GError *error = NULL;
+  GVariant *result;
+
+  result = g_dbus_proxy_call_finish (title->session_proxy, res, &error);
+  if (result) {
+    g_variant_unref (result);
+  }
+
+  if (error) {
+    g_warning ("Could not ask session manager to log out: %s", error->message);
+    g_error_free (error);
+  }
+}
+
+static void
+request_logout (WpTaskTitle *title)
+{
+  if (!title->session_proxy) {
+    g_warning ("Session manager service not available.");
+    return;
+  }
+
+  g_dbus_proxy_call (title->session_proxy,
+                     "Logout",
+                     g_variant_new ("(u)", 0),
+                     G_DBUS_CALL_FLAGS_NONE,
+                     -1,
+                     NULL,
+                     (GAsyncReadyCallback) logout_ready_callback,
+                     title);
+}
+
 static gboolean
 button_press_event_cb (GtkButton *button,
                        GdkEvent  *event,
@@ -96,6 +135,7 @@ button_press_event_cb (GtkButton *button,
     }
   else if (g_strcmp0 (icon, LOGOUT_ICON) == 0)
     {
+      request_logout (title);
     }
   else
     {
@@ -519,6 +559,7 @@ static void
 wp_task_title_init (WpTaskTitle *title)
 {
   GtkWidget *widget;
+  GError *error;
 
   widget = GTK_WIDGET (title);
 
@@ -527,6 +568,22 @@ wp_task_title_init (WpTaskTitle *title)
   wp_task_title_setup_label (title);
   wp_task_title_setup_button (title);
   wp_task_title_setup_wnck (title);
+
+  error = NULL;
+  title->session_proxy = g_dbus_proxy_new_for_bus_sync (
+      G_BUS_TYPE_SESSION,
+      G_DBUS_PROXY_FLAGS_NONE,
+      NULL,
+      "org.gnome.SessionManager",
+      "/org/gnome/SessionManager",
+      "org.gnome.SessionManager",
+      NULL, &error);
+
+  if (error) {
+    g_warning ("[windowpicker] Could not connect to session manager: %s",
+               error->message);
+    g_error_free (error);
+  }
 }
 
 GtkWidget *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]