From ead8135e65766a04ed8f744d70b0aa2c6dd9674b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= Date: Sat, 18 Oct 2014 00:10:09 +0200 Subject: [PATCH 1/2] libend-session-dialog: Add support for suspend and hibernate with logind --- gnome-flashback/libend-session-dialog/Makefile.am | 12 ++ .../flashback-end-session-dialog.c | 36 ++++ .../flashback-inhibit-dialog.c | 124 ++++++++++- .../flashback-inhibit-dialog.h | 6 +- .../flashback-inhibit-dialog.ui | 57 +++++ .../org.freedesktop.login1.Manager.xml | 240 +++++++++++++++++++++ 6 files changed, 464 insertions(+), 11 deletions(-) create mode 100644 gnome-flashback/libend-session-dialog/org.freedesktop.login1.Manager.xml diff --git a/gnome-flashback/libend-session-dialog/Makefile.am b/gnome-flashback/libend-session-dialog/Makefile.am index f6ea2a0..02c01c0 100644 --- a/gnome-flashback/libend-session-dialog/Makefile.am +++ b/gnome-flashback/libend-session-dialog/Makefile.am @@ -9,6 +9,8 @@ AM_CPPFLAGS = \ libend_session_dialog_la_SOURCES = \ dbus-end-session-dialog.c \ dbus-end-session-dialog.h \ + dbus-login1-manager.h \ + dbus-login1-manager.c \ flashback-end-session-dialog.c \ flashback-end-session-dialog.h \ flashback-inhibit-dialog.c \ @@ -27,6 +29,13 @@ dbus-end-session-dialog.c: org.gnome.SessionManager.EndSessionDialog.xml Makefil --c-namespace DBus \ org.gnome.SessionManager.EndSessionDialog.xml +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 \ + org.freedesktop.login1.Manager.xml + flashback-resources.c: flashback.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/flashback.gresource.xml) $(AM_V_GEN)$(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --generate --c-name flashback --manual-register $< flashback-resources.h: flashback.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/flashback.gresource.xml) @@ -35,11 +44,14 @@ flashback-resources.h: flashback.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) BUILT_SOURCES = \ dbus-end-session-dialog.h \ dbus-end-session-dialog.c \ + dbus-login1-manager.h \ + dbus-login1-manager.c \ flashback-resources.c \ flashback-resources.h EXTRA_DIST = \ org.gnome.SessionManager.EndSessionDialog.xml \ + org.freedesktop.login1.Manager.xml \ flashback.gresource.xml \ flashback-inhibit-dialog.ui diff --git a/gnome-flashback/libend-session-dialog/flashback-end-session-dialog.c b/gnome-flashback/libend-session-dialog/flashback-end-session-dialog.c index 8b61235..7379c8f 100644 --- a/gnome-flashback/libend-session-dialog/flashback-end-session-dialog.c +++ b/gnome-flashback/libend-session-dialog/flashback-end-session-dialog.c @@ -18,6 +18,7 @@ #include #include "config.h" #include "dbus-end-session-dialog.h" +#include "dbus-login1-manager.h" #include "flashback-end-session-dialog.h" #include "flashback-inhibit-dialog.h" @@ -35,10 +36,17 @@ inhibit_dialog_response (FlashbackInhibitDialog *dialog, DBusEndSessionDialog *object) { int action; + Login1Manager *login1_proxy; g_object_get (dialog, "action", &action, NULL); flashback_inhibit_dialog_close (dialog); + login1_proxy = login1_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + "org.freedesktop.login1", + "/org/freedesktop/login1", + NULL, + NULL); switch (response_id) { case FLASHBACK_RESPONSE_CANCEL: dbus_end_session_dialog_emit_canceled (object); @@ -55,10 +63,38 @@ inhibit_dialog_response (FlashbackInhibitDialog *dialog, g_assert_not_reached (); } break; + case FLASHBACK_RESPONSE_REBOOT: + dbus_end_session_dialog_emit_confirmed_reboot (object); + break; + case FLASHBACK_RESPONSE_HIBERNATE: + if (login1_proxy) + login1_manager_call_hibernate_sync (login1_proxy, + FALSE, + NULL, + NULL); + break; + case FLASHBACK_RESPONSE_SUSPEND: + if (login1_proxy) + login1_manager_call_suspend_sync (login1_proxy, + FALSE, + NULL, + NULL); + break; + case FLASHBACK_RESPONSE_HYBRID_SLEEP: + if (login1_proxy) + login1_manager_call_hybrid_sleep_sync (login1_proxy, + FALSE, + NULL, + NULL); + break; default: g_assert_not_reached (); break; } + + if (login1_proxy) { + g_object_unref(login1_proxy); + } } static void diff --git a/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.c b/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.c index c6d613f..2942605 100644 --- a/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.c +++ b/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.c @@ -29,6 +29,7 @@ #include #include "config.h" +#include "dbus-login1-manager.h" #include "flashback-inhibit-dialog.h" #include "flashback-resources.h" @@ -51,6 +52,14 @@ struct _FlashbackInhibitDialogPrivate { GtkWidget *lock_screen_button; GtkWidget *cancel_button; GtkWidget *accept_button; + GtkWidget *reboot_button; + GtkWidget *hibernate_button; + GtkWidget *suspend_button; + GtkWidget *hybrid_sleep_button; + + gboolean can_hibernate; + gboolean can_suspend; + gboolean can_hybrid_sleep; }; enum { @@ -494,12 +503,31 @@ setup_dialog (FlashbackInhibitDialog *dialog) switch (dialog->priv->action) { case FLASHBACK_LOGOUT_ACTION_LOGOUT: button_text = _("Log Out"); + gtk_widget_hide (dialog->priv->reboot_button); + gtk_widget_hide (dialog->priv->hibernate_button); + gtk_widget_hide (dialog->priv->suspend_button); + gtk_widget_hide (dialog->priv->hybrid_sleep_button); break; case FLASHBACK_LOGOUT_ACTION_SHUTDOWN: button_text = _("Power Off"); + gtk_widget_hide (dialog->priv->lock_screen_button); + + if (!dialog->priv->can_hibernate) + gtk_widget_hide (dialog->priv->hibernate_button); + + if (!dialog->priv->can_suspend) + gtk_widget_hide (dialog->priv->suspend_button); + + if (!dialog->priv->can_hybrid_sleep) + gtk_widget_hide (dialog->priv->hybrid_sleep_button); break; case FLASHBACK_LOGOUT_ACTION_REBOOT: button_text = _("Restart"); + gtk_widget_hide (dialog->priv->lock_screen_button); + gtk_widget_hide (dialog->priv->reboot_button); + gtk_widget_hide (dialog->priv->hibernate_button); + gtk_widget_hide (dialog->priv->suspend_button); + gtk_widget_hide (dialog->priv->hybrid_sleep_button); break; default: g_assert_not_reached (); @@ -613,14 +641,6 @@ flashback_inhibit_dialog_stop_timer (FlashbackInhibitDialog *dialog) } static void -flashback_inhibit_dialog_get_preferred_width (GtkWidget *widget, - gint *minimum_width, - gint *natural_width) -{ - *minimum_width = *natural_width = 460; -} - -static void flashback_inhibit_dialog_class_init (FlashbackInhibitDialogClass *klass) { GObjectClass *object_class; @@ -637,8 +657,6 @@ flashback_inhibit_dialog_class_init (FlashbackInhibitDialogClass *klass) object_class->constructor = flashback_inhibit_dialog_constructor; object_class->dispose = flashback_inhibit_dialog_dispose; - widget_class->get_preferred_width = flashback_inhibit_dialog_get_preferred_width; - signals[SIGNAL_RESPONSE] = g_signal_new ("response", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, @@ -693,6 +711,10 @@ flashback_inhibit_dialog_class_init (FlashbackInhibitDialogClass *klass) gtk_widget_class_bind_template_child_private (widget_class, FlashbackInhibitDialog, lock_screen_button); gtk_widget_class_bind_template_child_private (widget_class, FlashbackInhibitDialog, cancel_button); gtk_widget_class_bind_template_child_private (widget_class, FlashbackInhibitDialog, accept_button); + gtk_widget_class_bind_template_child_private (widget_class, FlashbackInhibitDialog, reboot_button); + gtk_widget_class_bind_template_child_private (widget_class, FlashbackInhibitDialog, hibernate_button); + gtk_widget_class_bind_template_child_private (widget_class, FlashbackInhibitDialog, suspend_button); + gtk_widget_class_bind_template_child_private (widget_class, FlashbackInhibitDialog, hybrid_sleep_button); } static void @@ -727,6 +749,78 @@ accept_button_clicked (GtkButton *button, } static void +reboot_button_clicked (GtkButton *button, + FlashbackInhibitDialog *dialog) +{ + flashback_inhibit_dialog_response (dialog, FLASHBACK_RESPONSE_REBOOT); +} + +static void +hibernate_button_clicked (GtkButton *button, + FlashbackInhibitDialog *dialog) +{ + flashback_inhibit_dialog_response (dialog, FLASHBACK_RESPONSE_HIBERNATE); +} + +static void +suspend_button_clicked (GtkButton *button, + FlashbackInhibitDialog *dialog) +{ + flashback_inhibit_dialog_response (dialog, FLASHBACK_RESPONSE_SUSPEND); +} + +static void +hybrid_sleep_button_clicked (GtkButton *button, + FlashbackInhibitDialog *dialog) +{ + flashback_inhibit_dialog_response (dialog, FLASHBACK_RESPONSE_HYBRID_SLEEP); +} + +static void +init_login1_proxy (FlashbackInhibitDialog *dialog) +{ + Login1Manager *login1_proxy; + gchar * can_hibernate; + gchar * can_suspend; + gchar * can_hybrid_sleep; + + dialog->priv->can_hibernate = FALSE; + dialog->priv->can_suspend = FALSE; + dialog->priv->can_hybrid_sleep = FALSE; + + login1_proxy = login1_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + "org.freedesktop.login1", + "/org/freedesktop/login1", + NULL, + NULL); + + if (login1_proxy) { + login1_manager_call_can_hibernate_sync (login1_proxy, + &can_hibernate, + NULL, + NULL); + login1_manager_call_can_suspend_sync (login1_proxy, + &can_suspend, + NULL, + NULL); + login1_manager_call_can_hybrid_sleep_sync (login1_proxy, + &can_hybrid_sleep, + NULL, + NULL); + + if (g_strcmp0 ("yes", can_hibernate) == 0) + dialog->priv->can_hibernate = TRUE; + if (g_strcmp0 ("yes", can_suspend) == 0) + dialog->priv->can_suspend = TRUE; + if (g_strcmp0 ("yes", can_hybrid_sleep) == 0) + dialog->priv->can_hybrid_sleep = TRUE; + + g_object_unref(login1_proxy); + } +} + +static void flashback_inhibit_dialog_init (FlashbackInhibitDialog *dialog) { GtkWindow *window; @@ -743,6 +837,14 @@ flashback_inhibit_dialog_init (FlashbackInhibitDialog *dialog) G_CALLBACK (cancel_button_clicked), dialog); g_signal_connect (dialog->priv->accept_button, "clicked", G_CALLBACK (accept_button_clicked), dialog); + g_signal_connect (dialog->priv->reboot_button, "clicked", + G_CALLBACK (reboot_button_clicked), dialog); + g_signal_connect (dialog->priv->hibernate_button, "clicked", + G_CALLBACK (hibernate_button_clicked), dialog); + g_signal_connect (dialog->priv->suspend_button, "clicked", + G_CALLBACK (suspend_button_clicked), dialog); + g_signal_connect (dialog->priv->hybrid_sleep_button, "clicked", + G_CALLBACK (hybrid_sleep_button_clicked), dialog); window = GTK_WINDOW (dialog); @@ -750,6 +852,8 @@ flashback_inhibit_dialog_init (FlashbackInhibitDialog *dialog) gtk_window_set_keep_above (window, TRUE); gtk_window_set_skip_taskbar_hint (window, TRUE); gtk_window_set_skip_pager_hint (window, TRUE); + + init_login1_proxy (dialog); } GtkWidget * diff --git a/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.h b/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.h index 140e637..ac960a2 100644 --- a/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.h +++ b/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.h @@ -31,7 +31,11 @@ typedef enum { typedef enum { FLASHBACK_RESPONSE_CANCEL, - FLASHBACK_RESPONSE_ACCEPT + FLASHBACK_RESPONSE_ACCEPT, + FLASHBACK_RESPONSE_REBOOT, + FLASHBACK_RESPONSE_HIBERNATE, + FLASHBACK_RESPONSE_SUSPEND, + FLASHBACK_RESPONSE_HYBRID_SLEEP } FlashbackResponseType; #define FLASHBACK_TYPE_INHIBIT_DIALOG (flashback_inhibit_dialog_get_type ()) diff --git a/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.ui b/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.ui index 0f6f867..e0ba342 100644 --- a/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.ui +++ b/gnome-flashback/libend-session-dialog/flashback-inhibit-dialog.ui @@ -94,6 +94,7 @@ True True + True True @@ -131,6 +132,62 @@ 2 + + + Reboot + True + True + True + + + False + True + end + 3 + + + + + Hibernate + True + True + True + + + False + True + end + 4 + + + + + Suspend + True + True + True + + + False + True + end + 5 + + + + + Hybrid Sleep + True + True + True + + + False + True + end + 6 + + False diff --git a/gnome-flashback/libend-session-dialog/org.freedesktop.login1.Manager.xml b/gnome-flashback/libend-session-dialog/org.freedesktop.login1.Manager.xml new file mode 100644 index 0000000..c10c5f5 --- /dev/null +++ b/gnome-flashback/libend-session-dialog/org.freedesktop.login1.Manager.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.1.2