[gnome-applets/wip/segeiger/window-picker/task-title: 2/5] windowpicker: implement logout button in TaskTitle
- From: Sebastian Geiger <segeiger src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-applets/wip/segeiger/window-picker/task-title: 2/5] windowpicker: implement logout button in TaskTitle
- Date: Tue, 9 Feb 2016 00:38:27 +0000 (UTC)
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]