diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2014-12-13 14:14:34 +0200 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2015-01-21 17:28:17 +0200 |
commit | 525ca136f3007f00a4293269965326d13b7777cc (patch) | |
tree | b01c9b638ab478683796109c921334c1bc7d5341 | |
parent | 8fe2c7f56871845ef988dd6ef8a572217fc5807b (diff) | |
download | gnome-session-wip/flashback.tar.gz |
don't use org.gnome.Shell for end session dialogwip/flashback
https://bugzilla.gnome.org/show_bug.cgi?id=738264
-rw-r--r-- | gnome-session/Makefile.am | 2 | ||||
-rw-r--r-- | gnome-session/gsm-end-session-dialog.c | 431 | ||||
-rw-r--r-- | gnome-session/gsm-end-session-dialog.h | 82 | ||||
-rw-r--r-- | gnome-session/gsm-manager.c | 159 | ||||
-rw-r--r-- | gnome-session/gsm-shell.c | 352 | ||||
-rw-r--r-- | gnome-session/gsm-shell.h | 21 |
6 files changed, 596 insertions, 451 deletions
diff --git a/gnome-session/Makefile.am b/gnome-session/Makefile.am index c70c5421..3f3f87b2 100644 --- a/gnome-session/Makefile.am +++ b/gnome-session/Makefile.am @@ -54,6 +54,8 @@ gnome_session_SOURCES = \ gsm-session-fill.h \ gsm-session-save.c \ gsm-session-save.h \ + gsm-end-session-dialog.c \ + gsm-end-session-dialog.h \ gsm-shell-extensions.c \ gsm-shell-extensions.h \ gsm-shell.c \ diff --git a/gnome-session/gsm-end-session-dialog.c b/gnome-session/gsm-end-session-dialog.c new file mode 100644 index 00000000..9fae1667 --- /dev/null +++ b/gnome-session/gsm-end-session-dialog.c @@ -0,0 +1,431 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2010 Red Hat, Inc + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <errno.h> +#include <string.h> +#include <unistd.h> + +#include <glib.h> +#include <glib-object.h> +#include <glib/gi18n.h> +#include <gio/gio.h> + +#include "gsm-inhibitor.h" +#include "gsm-end-session-dialog.h" + +#define END_SESSION_DIALOG_NAME "org.gnome.SessionManager.EndSessionDialog" +#define END_SESSION_DIALOG_PATH "/org/gnome/SessionManager/EndSessionDialog" +#define END_SESSION_DIALOG_INTERFACE "org.gnome.SessionManager.EndSessionDialog" + +#define AUTOMATIC_ACTION_TIMEOUT 60 + +struct _GsmEndSessionDialogPrivate +{ + GDBusProxy *end_session_dialog_proxy; + GsmStore *inhibitors; + + gboolean dialog_is_open; + GsmEndSessionDialogType end_session_dialog_type; + + guint update_idle_id; + guint watch_id; +}; + +enum { + END_SESSION_DIALOG_OPENED = 0, + END_SESSION_DIALOG_OPEN_FAILED, + END_SESSION_DIALOG_CLOSED, + END_SESSION_DIALOG_CANCELED, + END_SESSION_DIALOG_CONFIRMED_LOGOUT, + END_SESSION_DIALOG_CONFIRMED_SHUTDOWN, + END_SESSION_DIALOG_CONFIRMED_REBOOT, + NUMBER_OF_SIGNALS +}; + +static guint signals[NUMBER_OF_SIGNALS] = { 0 }; + +static void gsm_end_session_dialog_finalize (GObject *object); +static void queue_end_session_dialog_update (GsmEndSessionDialog *dialog); + +G_DEFINE_TYPE_WITH_PRIVATE (GsmEndSessionDialog, gsm_end_session_dialog, G_TYPE_OBJECT); + +static void +gsm_end_session_dialog_class_init (GsmEndSessionDialogClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = gsm_end_session_dialog_finalize; + + signals [END_SESSION_DIALOG_OPENED] = + g_signal_new ("end-session-dialog-opened", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsmEndSessionDialogClass, end_session_dialog_opened), + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + signals [END_SESSION_DIALOG_OPEN_FAILED] = + g_signal_new ("end-session-dialog-open-failed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsmEndSessionDialogClass, end_session_dialog_open_failed), + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + signals [END_SESSION_DIALOG_CLOSED] = + g_signal_new ("end-session-dialog-closed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsmEndSessionDialogClass, end_session_dialog_closed), + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + signals [END_SESSION_DIALOG_CANCELED] = + g_signal_new ("end-session-dialog-canceled", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsmEndSessionDialogClass, end_session_dialog_canceled), + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + signals [END_SESSION_DIALOG_CONFIRMED_LOGOUT] = + g_signal_new ("end-session-dialog-confirmed-logout", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsmEndSessionDialogClass, end_session_dialog_confirmed_logout), + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + signals [END_SESSION_DIALOG_CONFIRMED_SHUTDOWN] = + g_signal_new ("end-session-dialog-confirmed-shutdown", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsmEndSessionDialogClass, end_session_dialog_confirmed_shutdown), + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + signals [END_SESSION_DIALOG_CONFIRMED_REBOOT] = + g_signal_new ("end-session-dialog-confirmed-reboot", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GsmEndSessionDialogClass, end_session_dialog_confirmed_reboot), + NULL, NULL, NULL, + G_TYPE_NONE, 0); +} + +static void +gsm_end_session_dialog_init (GsmEndSessionDialog *dialog) +{ + dialog->priv = gsm_end_session_dialog_get_instance_private (dialog); + + dialog->priv->watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION, + END_SESSION_DIALOG_NAME, + G_BUS_NAME_WATCHER_FLAGS_NONE, + NULL, + NULL, + dialog, + NULL); +} + +static void +gsm_end_session_dialog_finalize (GObject *object) +{ + GsmEndSessionDialog *dialog = GSM_END_SESSION_DIALOG (object); + + g_object_unref (dialog->priv->inhibitors); + + if (dialog->priv->watch_id != 0) { + g_bus_unwatch_name (dialog->priv->watch_id); + dialog->priv->watch_id = 0; + } + + G_OBJECT_CLASS (gsm_end_session_dialog_parent_class)->finalize (object); +} + +GsmEndSessionDialog * +gsm_end_session_dialog_new (void) +{ + GsmEndSessionDialog *dialog; + + dialog = g_object_new (GSM_TYPE_END_SESSION_DIALOG, NULL); + + return dialog; +} + +static gboolean +add_inhibitor_to_array (const char *id, + GsmInhibitor *inhibitor, + GVariantBuilder *builder) +{ + g_variant_builder_add (builder, "o", gsm_inhibitor_peek_id (inhibitor)); + return FALSE; +} + +static GVariant * +get_array_from_store (GsmStore *inhibitors) +{ + GVariantBuilder builder; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("ao")); + gsm_store_foreach (inhibitors, + (GsmStoreFunc) add_inhibitor_to_array, + &builder); + + return g_variant_builder_end (&builder); +} + +static void +remove_update_idle_source (GsmEndSessionDialog *dialog) +{ + if (dialog->priv->update_idle_id != 0) { + g_source_remove (dialog->priv->update_idle_id); + dialog->priv->update_idle_id = 0; + } +} + +static void +on_open_finished (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GsmEndSessionDialog *dialog; + GError *error; + + dialog = GSM_END_SESSION_DIALOG (user_data); + + remove_update_idle_source (dialog); + + dialog->priv->dialog_is_open = FALSE; + + error = NULL; + g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error); + + if (error != NULL) { + g_warning ("Unable to open end session dialog: %s", error->message); + g_error_free (error); + + g_signal_emit (dialog, signals[END_SESSION_DIALOG_OPEN_FAILED], 0); + return; + } + + g_signal_emit (dialog, signals[END_SESSION_DIALOG_OPENED], 0); +} + +static void +on_end_session_dialog_closed (GsmEndSessionDialog *dialog) +{ + remove_update_idle_source (dialog); + + g_signal_handlers_disconnect_by_func (dialog->priv->inhibitors, + G_CALLBACK (queue_end_session_dialog_update), + dialog); + + g_signal_emit (G_OBJECT (dialog), signals[END_SESSION_DIALOG_CLOSED], 0); +} + +static void +on_end_session_dialog_canceled (GsmEndSessionDialog *dialog) +{ + remove_update_idle_source (dialog); + + g_signal_handlers_disconnect_by_func (dialog->priv->inhibitors, + G_CALLBACK (queue_end_session_dialog_update), + dialog); + + g_signal_emit (G_OBJECT (dialog), signals[END_SESSION_DIALOG_CANCELED], 0); +} + +static void +on_end_session_dialog_confirmed_logout (GsmEndSessionDialog *dialog) +{ + remove_update_idle_source (dialog); + + g_signal_emit (G_OBJECT (dialog), signals[END_SESSION_DIALOG_CONFIRMED_LOGOUT], 0); +} + +static void +on_end_session_dialog_confirmed_shutdown (GsmEndSessionDialog *dialog) +{ + remove_update_idle_source (dialog); + + g_signal_emit (G_OBJECT (dialog), signals[END_SESSION_DIALOG_CONFIRMED_SHUTDOWN], 0); +} + +static void +on_end_session_dialog_confirmed_reboot (GsmEndSessionDialog *dialog) +{ + remove_update_idle_source (dialog); + + g_signal_emit (G_OBJECT (dialog), signals[END_SESSION_DIALOG_CONFIRMED_REBOOT], 0); +} + +static void +on_end_session_dialog_dbus_signal (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + GsmEndSessionDialog *dialog) +{ + if (g_strcmp0 (signal_name, "Closed") == 0) { + on_end_session_dialog_closed (dialog); + } else if (g_strcmp0 (signal_name, "Canceled") == 0) { + on_end_session_dialog_canceled (dialog); + } else if (g_strcmp0 (signal_name ,"ConfirmedLogout") == 0) { + on_end_session_dialog_confirmed_logout (dialog); + } else if (g_strcmp0 (signal_name ,"ConfirmedReboot") == 0) { + on_end_session_dialog_confirmed_reboot (dialog); + } else if (g_strcmp0 (signal_name ,"ConfirmedShutdown") == 0) { + on_end_session_dialog_confirmed_shutdown (dialog); + } +} + +static void +on_end_session_dialog_name_owner_changed (GDBusProxy *proxy, + GParamSpec *pspec, + GsmEndSessionDialog *dialog) +{ + gchar *name_owner; + + name_owner = g_dbus_proxy_get_name_owner (proxy); + if (name_owner == NULL) { + g_clear_object (&dialog->priv->end_session_dialog_proxy); + } + + g_free (name_owner); +} + +static gboolean +on_need_end_session_dialog_update (GsmEndSessionDialog *dialog) +{ + /* No longer need an update */ + if (dialog->priv->update_idle_id == 0) + return FALSE; + + dialog->priv->update_idle_id = 0; + + gsm_end_session_dialog_open (dialog, + dialog->priv->end_session_dialog_type, + dialog->priv->inhibitors); + return FALSE; +} + +static void +queue_end_session_dialog_update (GsmEndSessionDialog *dialog) +{ + if (dialog->priv->update_idle_id != 0) + return; + + dialog->priv->update_idle_id = g_idle_add ((GSourceFunc) on_need_end_session_dialog_update, + dialog); +} + +gboolean +gsm_end_session_dialog_open (GsmEndSessionDialog *dialog, + GsmEndSessionDialogType type, + GsmStore *inhibitors) +{ + GDBusProxy *proxy; + GError *error; + + error = NULL; + + if (dialog->priv->dialog_is_open) { + g_return_val_if_fail (dialog->priv->end_session_dialog_type == type, + FALSE); + return TRUE; + } + + if (dialog->priv->end_session_dialog_proxy == NULL) { + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + END_SESSION_DIALOG_NAME, + END_SESSION_DIALOG_PATH, + END_SESSION_DIALOG_INTERFACE, + NULL, + &error); + + if (error != NULL) { + g_critical ("Could not connect to the end session dialog: %s", + error->message); + g_error_free (error); + return FALSE; + } + + dialog->priv->end_session_dialog_proxy = proxy; + + g_signal_connect (proxy, "notify::g-name-owner", + G_CALLBACK (on_end_session_dialog_name_owner_changed), + dialog); + g_signal_connect (proxy, "g-signal", + G_CALLBACK (on_end_session_dialog_dbus_signal), + dialog); + } + + g_dbus_proxy_call (dialog->priv->end_session_dialog_proxy, + "Open", + g_variant_new ("(uuu@ao)", + type, + 0, + AUTOMATIC_ACTION_TIMEOUT, + get_array_from_store (inhibitors)), + G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, + NULL, + on_open_finished, + dialog); + + g_object_ref (inhibitors); + + if (dialog->priv->inhibitors != NULL) { + g_signal_handlers_disconnect_by_func (dialog->priv->inhibitors, + G_CALLBACK (queue_end_session_dialog_update), + dialog); + g_object_unref (dialog->priv->inhibitors); + } + + dialog->priv->inhibitors = inhibitors; + + g_signal_connect_swapped (inhibitors, "added", + G_CALLBACK (queue_end_session_dialog_update), + dialog); + + g_signal_connect_swapped (inhibitors, "removed", + G_CALLBACK (queue_end_session_dialog_update), + dialog); + + dialog->priv->dialog_is_open = TRUE; + dialog->priv->end_session_dialog_type = type; + + return TRUE; +} + +void +gsm_end_session_dialog_close (GsmEndSessionDialog *dialog) +{ + if (!dialog->priv->end_session_dialog_proxy) + return; + + g_dbus_proxy_call (dialog->priv->end_session_dialog_proxy, + "Close", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, NULL, NULL); +} diff --git a/gnome-session/gsm-end-session-dialog.h b/gnome-session/gsm-end-session-dialog.h new file mode 100644 index 00000000..25fb8d7f --- /dev/null +++ b/gnome-session/gsm-end-session-dialog.h @@ -0,0 +1,82 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2010 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * + * Authors: + * Ray Strode <rstrode@redhat.com> + */ + +#ifndef __GSM_END_SESSION_DIALOG_H__ +#define __GSM_END_SESSION_DIALOG_H__ + +#include <glib.h> +#include <glib-object.h> + +#include "gsm-store.h" + +G_BEGIN_DECLS + +#define GSM_TYPE_END_SESSION_DIALOG (gsm_end_session_dialog_get_type ()) +#define GSM_END_SESSION_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSM_TYPE_END_SESSION_DIALOG, GsmEndSessionDialog)) +#define GSM_END_SESSION_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSM_TYPE_END_SESSION_DIALOG, GsmEndSessionDialogClass)) +#define GSM_IS_END_SESSION_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSM_TYPE_END_SESSION_DIALOG)) +#define GSM_IS_END_SESSION_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSM_TYPE_END_SESSION_DIALOG)) +#define GSM_END_SESSION_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GSM_TYPE_END_SESSION_DIALOG, GsmEndSessionDialogClass)) + +typedef struct _GsmEndSessionDialog GsmEndSessionDialog; +typedef struct _GsmEndSessionDialogClass GsmEndSessionDialogClass; +typedef struct _GsmEndSessionDialogPrivate GsmEndSessionDialogPrivate; + +typedef enum +{ + GSM_END_SESSION_DIALOG_TYPE_LOGOUT = 0, + GSM_END_SESSION_DIALOG_TYPE_SHUTDOWN, + GSM_END_SESSION_DIALOG_TYPE_RESTART +} GsmEndSessionDialogType; + +struct _GsmEndSessionDialog +{ + GObject parent; + + GsmEndSessionDialogPrivate *priv; +}; + +struct _GsmEndSessionDialogClass +{ + GObjectClass parent_class; + + void (* end_session_dialog_opened) (GsmEndSessionDialog *dialog); + void (* end_session_dialog_open_failed) (GsmEndSessionDialog *dialog); + void (* end_session_dialog_closed) (GsmEndSessionDialog *dialog); + void (* end_session_dialog_canceled) (GsmEndSessionDialog *dialog); + + void (* end_session_dialog_confirmed_logout) (GsmEndSessionDialog *dialog); + void (* end_session_dialog_confirmed_shutdown) (GsmEndSessionDialog *dialog); + void (* end_session_dialog_confirmed_reboot) (GsmEndSessionDialog *dialog); +}; + +GType gsm_end_session_dialog_get_type (void); + +GsmEndSessionDialog *gsm_end_session_dialog_new (void); + +gboolean gsm_end_session_dialog_open (GsmEndSessionDialog *dialog, + GsmEndSessionDialogType type, + GsmStore *inhibitors); +void gsm_end_session_dialog_close (GsmEndSessionDialog *dialog); + +G_END_DECLS + +#endif /* __GSM_END_SESSION_DIALOG_H__ */ diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c index 0edfef0a..b5b7aa71 100644 --- a/gnome-session/gsm-manager.c +++ b/gnome-session/gsm-manager.c @@ -48,6 +48,7 @@ #include "gsm-inhibitor.h" #include "gsm-presence.h" #include "gsm-shell.h" +#include "gsm-end-session-dialog.h" #include "gsm-xsmp-server.h" #include "gsm-xsmp-client.h" @@ -161,11 +162,13 @@ struct GsmManagerPrivate guint name_owner_id; GsmShell *shell; - guint shell_end_session_dialog_canceled_id; - guint shell_end_session_dialog_open_failed_id; - guint shell_end_session_dialog_confirmed_logout_id; - guint shell_end_session_dialog_confirmed_shutdown_id; - guint shell_end_session_dialog_confirmed_reboot_id; + + GsmEndSessionDialog *end_session_dialog; + guint end_session_dialog_canceled_id; + guint end_session_dialog_open_failed_id; + guint end_session_dialog_confirmed_logout_id; + guint end_session_dialog_confirmed_shutdown_id; + guint end_session_dialog_confirmed_reboot_id; }; enum { @@ -197,8 +200,8 @@ static void _handle_client_end_session_response (GsmManager *manager, gboolean do_last, gboolean cancel, const char *reason); -static void show_shell_end_session_dialog (GsmManager *manager, - GsmShellEndSessionDialogType type); +static void show_end_session_dialog (GsmManager *manager, + GsmEndSessionDialogType type); static gpointer manager_object = NULL; G_DEFINE_TYPE (GsmManager, gsm_manager, G_TYPE_OBJECT) @@ -1107,28 +1110,28 @@ cancel_end_session (GsmManager *manager) } static void -end_session_or_show_shell_dialog (GsmManager *manager) +end_session_or_show_end_session_dialog (GsmManager *manager) { gboolean logout_prompt; - GsmShellEndSessionDialogType type; + GsmEndSessionDialogType type; gboolean logout_inhibited; switch (manager->priv->logout_type) { case GSM_MANAGER_LOGOUT_LOGOUT: - type = GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT; + type = GSM_END_SESSION_DIALOG_TYPE_LOGOUT; break; case GSM_MANAGER_LOGOUT_REBOOT: case GSM_MANAGER_LOGOUT_REBOOT_INTERACT: - type = GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART; + type = GSM_END_SESSION_DIALOG_TYPE_RESTART; break; case GSM_MANAGER_LOGOUT_SHUTDOWN: case GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT: - type = GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN; + type = GSM_END_SESSION_DIALOG_TYPE_SHUTDOWN; break; default: g_warning ("Unexpected logout type %d when creating end session dialog", manager->priv->logout_type); - type = GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT; + type = GSM_END_SESSION_DIALOG_TYPE_LOGOUT; break; } @@ -1139,7 +1142,7 @@ end_session_or_show_shell_dialog (GsmManager *manager) switch (manager->priv->logout_mode) { case GSM_MANAGER_LOGOUT_MODE_NORMAL: if (logout_inhibited || logout_prompt) { - show_shell_end_session_dialog (manager, type); + show_end_session_dialog (manager, type); } else { end_phase (manager); } @@ -1147,7 +1150,7 @@ end_session_or_show_shell_dialog (GsmManager *manager) case GSM_MANAGER_LOGOUT_MODE_NO_CONFIRMATION: if (logout_inhibited) { - show_shell_end_session_dialog (manager, type); + show_end_session_dialog (manager, type); } else { end_phase (manager); } @@ -1176,7 +1179,7 @@ query_end_session_complete (GsmManager *manager) manager->priv->query_timeout_id = 0; } - end_session_or_show_shell_dialog (manager); + end_session_or_show_end_session_dialog (manager); } static guint32 @@ -2245,6 +2248,7 @@ gsm_manager_dispose (GObject *object) g_clear_object (&manager->priv->lockdown_settings); g_clear_object (&manager->priv->system); g_clear_object (&manager->priv->shell); + g_clear_object (&manager->priv->end_session_dialog); if (manager->priv->name_owner_id != 0) { g_dbus_connection_signal_unsubscribe (manager->priv->connection, manager->priv->name_owner_id);; @@ -3095,7 +3099,7 @@ remove_inhibitors_for_connection (GsmManager *manager, &data); if (count > 0 && manager->priv->phase == GSM_MANAGER_PHASE_QUERY_END_SESSION) { - end_session_or_show_shell_dialog (manager); + end_session_or_show_end_session_dialog (manager); } } @@ -3264,6 +3268,8 @@ gsm_manager_init (GsmManager *manager) G_CALLBACK (on_gsm_system_active_changed), manager); manager->priv->shell = gsm_get_shell (); + + manager->priv->end_session_dialog = gsm_end_session_dialog_new (); manager->priv->end_session_cancellable = g_cancellable_new (); } @@ -3300,45 +3306,45 @@ gsm_manager_new (GsmStore *client_store, } static void -disconnect_shell_dialog_signals (GsmManager *manager) +disconnect_end_session_dialog_signals (GsmManager *manager) { - if (manager->priv->shell_end_session_dialog_canceled_id != 0) { - g_signal_handler_disconnect (manager->priv->shell, - manager->priv->shell_end_session_dialog_canceled_id); - manager->priv->shell_end_session_dialog_canceled_id = 0; + if (manager->priv->end_session_dialog_canceled_id != 0) { + g_signal_handler_disconnect (manager->priv->end_session_dialog, + manager->priv->end_session_dialog_canceled_id); + manager->priv->end_session_dialog_canceled_id = 0; } - if (manager->priv->shell_end_session_dialog_confirmed_logout_id != 0) { - g_signal_handler_disconnect (manager->priv->shell, - manager->priv->shell_end_session_dialog_confirmed_logout_id); - manager->priv->shell_end_session_dialog_confirmed_logout_id = 0; + if (manager->priv->end_session_dialog_confirmed_logout_id != 0) { + g_signal_handler_disconnect (manager->priv->end_session_dialog, + manager->priv->end_session_dialog_confirmed_logout_id); + manager->priv->end_session_dialog_confirmed_logout_id = 0; } - if (manager->priv->shell_end_session_dialog_confirmed_shutdown_id != 0) { - g_signal_handler_disconnect (manager->priv->shell, - manager->priv->shell_end_session_dialog_confirmed_shutdown_id); - manager->priv->shell_end_session_dialog_confirmed_shutdown_id = 0; + if (manager->priv->end_session_dialog_confirmed_shutdown_id != 0) { + g_signal_handler_disconnect (manager->priv->end_session_dialog, + manager->priv->end_session_dialog_confirmed_shutdown_id); + manager->priv->end_session_dialog_confirmed_shutdown_id = 0; } - if (manager->priv->shell_end_session_dialog_confirmed_reboot_id != 0) { - g_signal_handler_disconnect (manager->priv->shell, - manager->priv->shell_end_session_dialog_confirmed_reboot_id); - manager->priv->shell_end_session_dialog_confirmed_reboot_id = 0; + if (manager->priv->end_session_dialog_confirmed_reboot_id != 0) { + g_signal_handler_disconnect (manager->priv->end_session_dialog, + manager->priv->end_session_dialog_confirmed_reboot_id); + manager->priv->end_session_dialog_confirmed_reboot_id = 0; } - if (manager->priv->shell_end_session_dialog_open_failed_id != 0) { - g_signal_handler_disconnect (manager->priv->shell, - manager->priv->shell_end_session_dialog_open_failed_id); - manager->priv->shell_end_session_dialog_open_failed_id = 0; + if (manager->priv->end_session_dialog_open_failed_id != 0) { + g_signal_handler_disconnect (manager->priv->end_session_dialog, + manager->priv->end_session_dialog_open_failed_id); + manager->priv->end_session_dialog_open_failed_id = 0; } } static void -on_shell_end_session_dialog_canceled (GsmShell *shell, - GsmManager *manager) +on_end_session_dialog_canceled (GsmEndSessionDialog *end_session_dialog, + GsmManager *manager) { cancel_end_session (manager); - disconnect_shell_dialog_signals (manager); + disconnect_end_session_dialog_signals (manager); } static void @@ -3365,77 +3371,74 @@ _handle_end_session_dialog_response (GsmManager *manager, } static void -on_shell_end_session_dialog_confirmed_logout (GsmShell *shell, - GsmManager *manager) +on_end_session_dialog_confirmed_logout (GsmEndSessionDialog *end_session_dialog, + GsmManager *manager) { _handle_end_session_dialog_response (manager, GSM_MANAGER_LOGOUT_LOGOUT); - disconnect_shell_dialog_signals (manager); + disconnect_end_session_dialog_signals (manager); } static void -on_shell_end_session_dialog_confirmed_shutdown (GsmShell *shell, - GsmManager *manager) +on_end_session_dialog_confirmed_shutdown (GsmEndSessionDialog *end_session_dialog, + GsmManager *manager) { _handle_end_session_dialog_response (manager, GSM_MANAGER_LOGOUT_SHUTDOWN); - disconnect_shell_dialog_signals (manager); + disconnect_end_session_dialog_signals (manager); } static void -on_shell_end_session_dialog_confirmed_reboot (GsmShell *shell, - GsmManager *manager) +on_end_session_dialog_confirmed_reboot (GsmEndSessionDialog *end_session_dialog, + GsmManager *manager) { _handle_end_session_dialog_response (manager, GSM_MANAGER_LOGOUT_REBOOT); - disconnect_shell_dialog_signals (manager); + disconnect_end_session_dialog_signals (manager); } static void -connect_shell_dialog_signals (GsmManager *manager) +connect_end_session_dialog_signals (GsmManager *manager) { - if (manager->priv->shell_end_session_dialog_canceled_id != 0) + if (manager->priv->end_session_dialog_canceled_id != 0) return; - manager->priv->shell_end_session_dialog_canceled_id = - g_signal_connect (manager->priv->shell, + manager->priv->end_session_dialog_canceled_id = + g_signal_connect (manager->priv->end_session_dialog, "end-session-dialog-canceled", - G_CALLBACK (on_shell_end_session_dialog_canceled), + G_CALLBACK (on_end_session_dialog_canceled), manager); - manager->priv->shell_end_session_dialog_open_failed_id = - g_signal_connect (manager->priv->shell, + manager->priv->end_session_dialog_open_failed_id = + g_signal_connect (manager->priv->end_session_dialog, "end-session-dialog-open-failed", - G_CALLBACK (on_shell_end_session_dialog_canceled), + G_CALLBACK (on_end_session_dialog_canceled), manager); - manager->priv->shell_end_session_dialog_confirmed_logout_id = - g_signal_connect (manager->priv->shell, + manager->priv->end_session_dialog_confirmed_logout_id = + g_signal_connect (manager->priv->end_session_dialog, "end-session-dialog-confirmed-logout", - G_CALLBACK (on_shell_end_session_dialog_confirmed_logout), + G_CALLBACK (on_end_session_dialog_confirmed_logout), manager); - manager->priv->shell_end_session_dialog_confirmed_shutdown_id = - g_signal_connect (manager->priv->shell, + manager->priv->end_session_dialog_confirmed_shutdown_id = + g_signal_connect (manager->priv->end_session_dialog, "end-session-dialog-confirmed-shutdown", - G_CALLBACK (on_shell_end_session_dialog_confirmed_shutdown), + G_CALLBACK (on_end_session_dialog_confirmed_shutdown), manager); - manager->priv->shell_end_session_dialog_confirmed_reboot_id = - g_signal_connect (manager->priv->shell, + manager->priv->end_session_dialog_confirmed_reboot_id = + g_signal_connect (manager->priv->end_session_dialog, "end-session-dialog-confirmed-reboot", - G_CALLBACK (on_shell_end_session_dialog_confirmed_reboot), + G_CALLBACK (on_end_session_dialog_confirmed_reboot), manager); } static void -show_shell_end_session_dialog (GsmManager *manager, - GsmShellEndSessionDialogType type) +show_end_session_dialog (GsmManager *manager, + GsmEndSessionDialogType type) { - if (!gsm_shell_is_running (manager->priv->shell)) - return; - - gsm_shell_open_end_session_dialog (manager->priv->shell, - type, - manager->priv->inhibitors); - connect_shell_dialog_signals (manager); + gsm_end_session_dialog_open (manager->priv->end_session_dialog, + type, + manager->priv->inhibitors); + connect_end_session_dialog_signals (manager); } /* @@ -3676,8 +3679,8 @@ on_shutdown_prepared (GsmSystem *system, manager->priv->phase++; start_phase (manager); } else { - disconnect_shell_dialog_signals (manager); - gsm_shell_close_end_session_dialog (manager->priv->shell); + disconnect_end_session_dialog_signals (manager); + gsm_end_session_dialog_close (manager->priv->end_session_dialog); /* back to running phase */ cancel_end_session (manager); } diff --git a/gnome-session/gsm-shell.c b/gnome-session/gsm-shell.c index 854ad30a..86193a24 100644 --- a/gnome-session/gsm-shell.c +++ b/gnome-session/gsm-shell.c @@ -27,32 +27,19 @@ #include <glib/gi18n.h> #include <gio/gio.h> -#include "gsm-inhibitor.h" #include "gsm-shell.h" #define SHELL_NAME "org.gnome.Shell" #define SHELL_PATH "/org/gnome/Shell" #define SHELL_INTERFACE "org.gnome.Shell" -#define SHELL_END_SESSION_DIALOG_PATH "/org/gnome/SessionManager/EndSessionDialog" -#define SHELL_END_SESSION_DIALOG_INTERFACE "org.gnome.SessionManager.EndSessionDialog" - -#define AUTOMATIC_ACTION_TIMEOUT 60 - #define GSM_SHELL_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_SHELL, GsmShellPrivate)) struct _GsmShellPrivate { - GDBusProxy *end_session_dialog_proxy; - GsmStore *inhibitors; - guint32 is_running : 1; - gboolean dialog_is_open; - GsmShellEndSessionDialogType end_session_dialog_type; - - guint update_idle_id; guint watch_id; }; @@ -61,25 +48,10 @@ enum { PROP_IS_RUNNING }; -enum { - END_SESSION_DIALOG_OPENED = 0, - END_SESSION_DIALOG_OPEN_FAILED, - END_SESSION_DIALOG_CLOSED, - END_SESSION_DIALOG_CANCELED, - END_SESSION_DIALOG_CONFIRMED_LOGOUT, - END_SESSION_DIALOG_CONFIRMED_SHUTDOWN, - END_SESSION_DIALOG_CONFIRMED_REBOOT, - NUMBER_OF_SIGNALS -}; - -static guint signals[NUMBER_OF_SIGNALS] = { 0 }; - static void gsm_shell_class_init (GsmShellClass *klass); static void gsm_shell_init (GsmShell *ck); static void gsm_shell_finalize (GObject *object); -static void queue_end_session_dialog_update (GsmShell *shell); - G_DEFINE_TYPE (GsmShell, gsm_shell, G_TYPE_OBJECT); static void @@ -123,62 +95,6 @@ gsm_shell_class_init (GsmShellClass *shell_class) g_object_class_install_property (object_class, PROP_IS_RUNNING, param_spec); - signals [END_SESSION_DIALOG_OPENED] = - g_signal_new ("end-session-dialog-opened", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GsmShellClass, end_session_dialog_opened), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - signals [END_SESSION_DIALOG_OPEN_FAILED] = - g_signal_new ("end-session-dialog-open-failed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GsmShellClass, end_session_dialog_open_failed), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - signals [END_SESSION_DIALOG_CLOSED] = - g_signal_new ("end-session-dialog-closed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GsmShellClass, end_session_dialog_closed), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - signals [END_SESSION_DIALOG_CANCELED] = - g_signal_new ("end-session-dialog-canceled", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GsmShellClass, end_session_dialog_canceled), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - signals [END_SESSION_DIALOG_CONFIRMED_LOGOUT] = - g_signal_new ("end-session-dialog-confirmed-logout", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GsmShellClass, end_session_dialog_confirmed_logout), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - signals [END_SESSION_DIALOG_CONFIRMED_SHUTDOWN] = - g_signal_new ("end-session-dialog-confirmed-shutdown", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GsmShellClass, end_session_dialog_confirmed_shutdown), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - signals [END_SESSION_DIALOG_CONFIRMED_REBOOT] = - g_signal_new ("end-session-dialog-confirmed-reboot", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GsmShellClass, end_session_dialog_confirmed_reboot), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - g_type_class_add_private (shell_class, sizeof (GsmShellPrivate)); } @@ -234,8 +150,6 @@ gsm_shell_finalize (GObject *object) parent_class = G_OBJECT_CLASS (gsm_shell_parent_class); - g_object_unref (shell->priv->inhibitors); - if (shell->priv->watch_id != 0) { g_bus_unwatch_name (shell->priv->watch_id); shell->priv->watch_id = 0; @@ -275,269 +189,3 @@ gsm_shell_is_running (GsmShell *shell) return shell->priv->is_running; } - -static gboolean -add_inhibitor_to_array (const char *id, - GsmInhibitor *inhibitor, - GVariantBuilder *builder) -{ - g_variant_builder_add (builder, "o", gsm_inhibitor_peek_id (inhibitor)); - return FALSE; -} - -static GVariant * -get_array_from_store (GsmStore *inhibitors) -{ - GVariantBuilder builder; - - g_variant_builder_init (&builder, G_VARIANT_TYPE ("ao")); - gsm_store_foreach (inhibitors, - (GsmStoreFunc) add_inhibitor_to_array, - &builder); - - return g_variant_builder_end (&builder); -} - -static void -on_open_finished (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - GsmShell *shell = user_data; - GError *error; - - if (shell->priv->update_idle_id != 0) { - g_source_remove (shell->priv->update_idle_id); - shell->priv->update_idle_id = 0; - } - - shell->priv->dialog_is_open = FALSE; - - error = NULL; - g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error); - - if (error != NULL) { - g_warning ("Unable to open shell end session dialog: %s", error->message); - g_error_free (error); - - g_signal_emit (G_OBJECT (shell), signals[END_SESSION_DIALOG_OPEN_FAILED], 0); - return; - } - - g_signal_emit (G_OBJECT (shell), signals[END_SESSION_DIALOG_OPENED], 0); -} - -static void -on_end_session_dialog_closed (GsmShell *shell) -{ - if (shell->priv->update_idle_id != 0) { - g_source_remove (shell->priv->update_idle_id); - shell->priv->update_idle_id = 0; - } - - g_signal_handlers_disconnect_by_func (shell->priv->inhibitors, - G_CALLBACK (queue_end_session_dialog_update), - shell); - - g_signal_emit (G_OBJECT (shell), signals[END_SESSION_DIALOG_CLOSED], 0); -} - -static void -on_end_session_dialog_canceled (GsmShell *shell) -{ - if (shell->priv->update_idle_id != 0) { - g_source_remove (shell->priv->update_idle_id); - shell->priv->update_idle_id = 0; - } - - g_signal_handlers_disconnect_by_func (shell->priv->inhibitors, - G_CALLBACK (queue_end_session_dialog_update), - shell); - - g_signal_emit (G_OBJECT (shell), signals[END_SESSION_DIALOG_CANCELED], 0); -} - -static void -on_end_session_dialog_confirmed_logout (GsmShell *shell) -{ - if (shell->priv->update_idle_id != 0) { - g_source_remove (shell->priv->update_idle_id); - shell->priv->update_idle_id = 0; - } - - g_signal_emit (G_OBJECT (shell), signals[END_SESSION_DIALOG_CONFIRMED_LOGOUT], 0); -} - -static void -on_end_session_dialog_confirmed_shutdown (GsmShell *shell) -{ - if (shell->priv->update_idle_id != 0) { - g_source_remove (shell->priv->update_idle_id); - shell->priv->update_idle_id = 0; - } - - g_signal_emit (G_OBJECT (shell), signals[END_SESSION_DIALOG_CONFIRMED_SHUTDOWN], 0); -} - -static void -on_end_session_dialog_confirmed_reboot (GsmShell *shell) -{ - if (shell->priv->update_idle_id != 0) { - g_source_remove (shell->priv->update_idle_id); - shell->priv->update_idle_id = 0; - } - - g_signal_emit (G_OBJECT (shell), signals[END_SESSION_DIALOG_CONFIRMED_REBOOT], 0); -} - -static void -on_end_session_dialog_dbus_signal (GDBusProxy *proxy, - gchar *sender_name, - gchar *signal_name, - GVariant *parameters, - GsmShell *shell) -{ - if (g_strcmp0 (signal_name, "Closed") == 0) { - on_end_session_dialog_closed (shell); - } else if (g_strcmp0 (signal_name, "Canceled") == 0) { - on_end_session_dialog_canceled (shell); - } else if (g_strcmp0 (signal_name ,"ConfirmedLogout") == 0) { - on_end_session_dialog_confirmed_logout (shell); - } else if (g_strcmp0 (signal_name ,"ConfirmedReboot") == 0) { - on_end_session_dialog_confirmed_reboot (shell); - } else if (g_strcmp0 (signal_name ,"ConfirmedShutdown") == 0) { - on_end_session_dialog_confirmed_shutdown (shell); - } -} - -static void -on_end_session_dialog_name_owner_changed (GDBusProxy *proxy, - GParamSpec *pspec, - GsmShell *shell) -{ - gchar *name_owner; - - name_owner = g_dbus_proxy_get_name_owner (proxy); - if (name_owner == NULL) { - g_clear_object (&shell->priv->end_session_dialog_proxy); - } - - g_free (name_owner); -} - -static gboolean -on_need_end_session_dialog_update (GsmShell *shell) -{ - /* No longer need an update */ - if (shell->priv->update_idle_id == 0) - return FALSE; - - shell->priv->update_idle_id = 0; - - gsm_shell_open_end_session_dialog (shell, - shell->priv->end_session_dialog_type, - shell->priv->inhibitors); - return FALSE; -} - -static void -queue_end_session_dialog_update (GsmShell *shell) -{ - if (shell->priv->update_idle_id != 0) - return; - - shell->priv->update_idle_id = g_idle_add ((GSourceFunc) on_need_end_session_dialog_update, - shell); -} - -gboolean -gsm_shell_open_end_session_dialog (GsmShell *shell, - GsmShellEndSessionDialogType type, - GsmStore *inhibitors) -{ - GDBusProxy *proxy; - GError *error; - - error = NULL; - - if (shell->priv->dialog_is_open) { - g_return_val_if_fail (shell->priv->end_session_dialog_type == type, - FALSE); - - return TRUE; - } - - if (shell->priv->end_session_dialog_proxy == NULL) { - proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, - G_DBUS_PROXY_FLAGS_NONE, - NULL, - SHELL_NAME, - SHELL_END_SESSION_DIALOG_PATH, - SHELL_END_SESSION_DIALOG_INTERFACE, - NULL, &error); - - if (error != NULL) { - g_critical ("Could not connect to the shell: %s", - error->message); - g_error_free (error); - return FALSE; - } - - shell->priv->end_session_dialog_proxy = proxy; - - g_signal_connect (proxy, "notify::g-name-owner", - G_CALLBACK (on_end_session_dialog_name_owner_changed), - shell); - g_signal_connect (proxy, "g-signal", - G_CALLBACK (on_end_session_dialog_dbus_signal), - shell); - } - - g_dbus_proxy_call (shell->priv->end_session_dialog_proxy, - "Open", - g_variant_new ("(uuu@ao)", - type, - 0, - AUTOMATIC_ACTION_TIMEOUT, - get_array_from_store (inhibitors)), - G_DBUS_CALL_FLAGS_NONE, - G_MAXINT, NULL, - on_open_finished, shell); - - g_object_ref (inhibitors); - - if (shell->priv->inhibitors != NULL) { - g_signal_handlers_disconnect_by_func (shell->priv->inhibitors, - G_CALLBACK (queue_end_session_dialog_update), - shell); - g_object_unref (shell->priv->inhibitors); - } - - shell->priv->inhibitors = inhibitors; - - g_signal_connect_swapped (inhibitors, "added", - G_CALLBACK (queue_end_session_dialog_update), - shell); - - g_signal_connect_swapped (inhibitors, "removed", - G_CALLBACK (queue_end_session_dialog_update), - shell); - - shell->priv->dialog_is_open = TRUE; - shell->priv->end_session_dialog_type = type; - - return TRUE; -} - -void -gsm_shell_close_end_session_dialog (GsmShell *shell) -{ - if (!shell->priv->end_session_dialog_proxy) - return; - - g_dbus_proxy_call (shell->priv->end_session_dialog_proxy, - "Close", - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, NULL, NULL, NULL); -} diff --git a/gnome-session/gsm-shell.h b/gnome-session/gsm-shell.h index e236493a..ef28f22c 100644 --- a/gnome-session/gsm-shell.h +++ b/gnome-session/gsm-shell.h @@ -41,13 +41,6 @@ typedef struct _GsmShell GsmShell; typedef struct _GsmShellClass GsmShellClass; typedef struct _GsmShellPrivate GsmShellPrivate; -typedef enum -{ - GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT = 0, - GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN, - GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART, -} GsmShellEndSessionDialogType; - struct _GsmShell { GObject parent; @@ -59,15 +52,6 @@ struct _GsmShellClass { GObjectClass parent_class; - void (* end_session_dialog_opened) (GsmShell *shell); - void (* end_session_dialog_open_failed) (GsmShell *shell); - void (* end_session_dialog_closed) (GsmShell *shell); - void (* end_session_dialog_canceled) (GsmShell *shell); - - void (* end_session_dialog_confirmed_logout) (GsmShell *shell); - void (* end_session_dialog_confirmed_shutdown) (GsmShell *shell); - void (* end_session_dialog_confirmed_reboot) (GsmShell *shell); - }; GType gsm_shell_get_type (void); @@ -77,11 +61,6 @@ GsmShell *gsm_shell_new (void); GsmShell *gsm_get_shell (void); gboolean gsm_shell_is_running (GsmShell *shell); -gboolean gsm_shell_open_end_session_dialog (GsmShell *shell, - GsmShellEndSessionDialogType type, - GsmStore *inhibitors); -void gsm_shell_close_end_session_dialog (GsmShell *shell); - G_END_DECLS #endif /* __GSM_SHELL_H__ */ |