diff -up gnome-session-2.28.0/gnome-session/gsm-manager.c.unresponsive-timeout gnome-session-2.28.0/gnome-session/gsm-manager.c --- gnome-session-2.28.0/gnome-session/gsm-manager.c.unresponsive-timeout 2009-09-18 12:36:04.000000000 -0400 +++ gnome-session-2.28.0/gnome-session/gsm-manager.c 2009-10-14 10:49:34.724468379 -0400 @@ -122,6 +122,7 @@ struct GsmManagerPrivate GsmManagerLogoutType logout_type; GtkWidget *inhibit_dialog; + guint inhibit_timeout_id; /* List of clients which were disconnected due to disabled condition * and shouldn't be automatically restarted */ @@ -797,6 +798,24 @@ inhibitor_has_flag (gpointer key, } static gboolean +is_responsive_inhibitor (gpointer key, + GsmInhibitor *inhibitor, + gpointer data) +{ + guint flag; + guint flags; + const gchar *reason; + + flag = GPOINTER_TO_UINT (data); + + flags = gsm_inhibitor_peek_flags (inhibitor); + reason = gsm_inhibitor_peek_reason (inhibitor); + + return (flags & flag) && + g_strcmp0 (_("Not responding"), reason) != 0; +} + +static gboolean gsm_manager_is_logout_inhibited (GsmManager *manager) { GsmInhibitor *inhibitor; @@ -833,6 +852,24 @@ gsm_manager_is_idle_inhibited (GsmManage } static gboolean +gsm_manager_has_responsive_inhibitor (GsmManager *manager) +{ + GsmInhibitor *inhibitor; + + if (manager->priv->inhibitors == NULL) { + return FALSE; + } + + inhibitor = (GsmInhibitor *)gsm_store_find (manager->priv->inhibitors, + (GsmStoreFunc)is_responsive_inhibitor, + GUINT_TO_POINTER (GSM_INHIBITOR_FLAG_LOGOUT)); + if (inhibitor == NULL) { + return FALSE; + } + return TRUE; +} + +static gboolean _client_cancel_end_session (const char *id, GsmClient *client, GsmManager *manager) @@ -1055,6 +1092,11 @@ inhibit_dialog_response (GsmInhibitDialo g_debug ("GsmManager: Inhibit dialog response: %d", response_id); + if (manager->priv->inhibit_timeout_id > 0) { + g_source_remove (manager->priv->inhibit_timeout_id); + manager->priv->inhibit_timeout_id = 0; + } + /* must destroy dialog before cancelling since we'll remove JIT inhibitors and we don't want to trigger action. */ @@ -1085,6 +1127,20 @@ inhibit_dialog_response (GsmInhibitDialo } } +static gboolean +on_inhibit_dialog_timeout (gpointer data) +{ + GsmManager *manager = data; + + manager->priv->inhibit_timeout_id = 0; + + inhibit_dialog_response (GSM_INHIBIT_DIALOG (manager->priv->inhibit_dialog), + GTK_RESPONSE_ACCEPT, + manager); + + return FALSE; +} + static void query_end_session_complete (GsmManager *manager) { @@ -1143,8 +1199,11 @@ query_end_session_complete (GsmManager * "response", G_CALLBACK (inhibit_dialog_response), manager); + if (! gsm_manager_has_responsive_inhibitor (manager)) { + manager->priv->inhibit_timeout_id = + g_timeout_add_seconds (120, on_inhibit_dialog_timeout, manager); + } gtk_widget_show (manager->priv->inhibit_dialog); - } static guint32 @@ -2459,6 +2518,11 @@ gsm_manager_finalize (GObject *object) g_return_if_fail (manager->priv != NULL); + if (manager->priv->inhibit_timeout_id > 0) { + g_source_remove (manager->priv->inhibit_timeout_id); + manager->priv->inhibit_timeout_id = 0; + } + G_OBJECT_CLASS (gsm_manager_parent_class)->finalize (object); }