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



commit 0f9317eb168e44da2fd119ef4b1576ac58622a18
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                       |   11 ++++
 .../src/org.freedesktop.login1.Manager.xml         |   35 ++++++++++++
 windowpicker/src/wp-task-title.c                   |   58 ++++++++++++++++++++
 3 files changed, 104 insertions(+), 0 deletions(-)
---
diff --git a/windowpicker/src/Makefile.am b/windowpicker/src/Makefile.am
index 1e227ad..163b3f4 100644
--- a/windowpicker/src/Makefile.am
+++ b/windowpicker/src/Makefile.am
@@ -29,6 +29,8 @@ libwindow_picker_applet_la_LIBADD = \
        $(NULL)
 
 libwindow_picker_applet_la_SOURCES = \
+       dbus-login1-manager.c \
+       dbus-login1-manager.h \
        wp-about-dialog.c \
        wp-about-dialog.h \
        wp-applet.c \
@@ -51,6 +53,13 @@ wp-resources.c: wp-resources.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --s
 wp-resources.h: wp-resources.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) 
--generate-dependencies $(srcdir)/wp-resources.gresource.xml)
        $(AM_V_GEN)$(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --generate --c-name wp $<
 
+dbus-login1-manager.h:
+dbus-login1-manager.c: org.freedesktop.login1.Manager.xml Makefile.am
+       $(AM_V_GEN) gdbus-codegen \
+               --interface-prefix=org.freedesktop \
+               --generate-c-code dbus-login1-manager \
+               $(srcdir)/org.freedesktop.login1.Manager.xml
+
 EXTRA_DIST = \
        wp-about-logo.png \
        wp-menu.xml \
@@ -61,6 +70,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/org.freedesktop.login1.Manager.xml 
b/windowpicker/src/org.freedesktop.login1.Manager.xml
new file mode 100644
index 0000000..0e4c3b8
--- /dev/null
+++ b/windowpicker/src/org.freedesktop.login1.Manager.xml
@@ -0,0 +1,35 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" 
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd";>
+<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd";>
+ <interface name="org.freedesktop.login1.Manager">
+  <method name="PowerOff">
+   <arg name="interactive" type="b" direction="in"/>
+  </method>
+  <method name="Reboot">
+   <arg name="interactive" type="b" direction="in"/>
+  </method>
+  <method name="Suspend">
+   <arg name="interactive" type="b" direction="in"/>
+  </method>
+  <method name="Hibernate">
+   <arg name="interactive" type="b" direction="in"/>
+  </method>
+  <method name="HybridSleep">
+   <arg name="interactive" type="b" direction="in"/>
+  </method>
+  <method name="CanPowerOff">
+   <arg name="result" type="s" direction="out"/>
+  </method>
+  <method name="CanReboot">
+   <arg name="result" type="s" direction="out"/>
+  </method>
+  <method name="CanSuspend">
+   <arg name="result" type="s" direction="out"/>
+  </method>
+  <method name="CanHibernate">
+   <arg name="result" type="s" direction="out"/>
+  </method>
+  <method name="CanHybridSleep">
+   <arg name="result" type="s" direction="out"/>
+  </method>
+ </interface>
+</node>
diff --git a/windowpicker/src/wp-task-title.c b/windowpicker/src/wp-task-title.c
index 2a48ef4..4c1819f 100644
--- a/windowpicker/src/wp-task-title.c
+++ b/windowpicker/src/wp-task-title.c
@@ -24,8 +24,10 @@
 #include "config.h"
 
 #include <glib/gi18n-lib.h>
+#include <gio/gio.h>
 #include <libwnck/libwnck.h>
 #include <panel-applet.h>
+#include <error.h>
 
 #include "wp-task-title.h"
 
@@ -45,6 +47,7 @@ struct _WpTaskTitle
   PanelAppletOrient  applet_orient;
 
   WnckWindow        *active_window;
+  GDBusProxy        *session_proxy;
 };
 
 enum
@@ -62,6 +65,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 +136,7 @@ button_press_event_cb (GtkButton *button,
     }
   else if (g_strcmp0 (icon, LOGOUT_ICON) == 0)
     {
+      request_logout (title);
     }
   else
     {
@@ -519,6 +560,7 @@ static void
 wp_task_title_init (WpTaskTitle *title)
 {
   GtkWidget *widget;
+  GError *error;
 
   widget = GTK_WIDGET (title);
 
@@ -527,6 +569,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]