gnome-session r4811 - in branches/dbus_based: . gnome-session



Author: mccann
Date: Thu Jul 17 20:37:34 2008
New Revision: 4811
URL: http://svn.gnome.org/viewvc/gnome-session?rev=4811&view=rev

Log:
2008-07-17  William Jon McCann  <jmccann redhat com>

	* gnome-session/gsm-client.c (gsm_client_cancel_end_session):
	* gnome-session/gsm-client.h:
	* gnome-session/gsm-dbus-client.c (dbus_client_cancel_end_session),
	(gsm_dbus_client_class_init):
	* gnome-session/gsm-dbus-client.h:
	* gnome-session/gsm-dbus-client.xml:
	* gnome-session/gsm-manager.c (_cancel_shutdown_client),
	(inhibitor_is_jit), (cancel_end_session),
	(inhibit_dialog_response):
	* gnome-session/gsm-xsmp-client.c (xsmp_cancel_end_session),
	(gsm_xsmp_client_class_init), (interact_request_callback):
	Send cancellation to all clients.  Cancel JIT inhibitors.



Modified:
   branches/dbus_based/ChangeLog
   branches/dbus_based/gnome-session/gsm-client.c
   branches/dbus_based/gnome-session/gsm-client.h
   branches/dbus_based/gnome-session/gsm-dbus-client.c
   branches/dbus_based/gnome-session/gsm-dbus-client.h
   branches/dbus_based/gnome-session/gsm-dbus-client.xml
   branches/dbus_based/gnome-session/gsm-manager.c
   branches/dbus_based/gnome-session/gsm-xsmp-client.c

Modified: branches/dbus_based/gnome-session/gsm-client.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-client.c	(original)
+++ branches/dbus_based/gnome-session/gsm-client.c	Thu Jul 17 20:37:34 2008
@@ -333,6 +333,15 @@
 }
 
 void
+gsm_client_cancel_end_session (GsmClient *client)
+{
+        g_return_if_fail (GSM_IS_CLIENT (client));
+
+        GSM_CLIENT_GET_CLASS (client)->impl_cancel_end_session (client);
+}
+
+
+void
 gsm_client_query_end_session (GsmClient *client,
                               guint      flags)
 {

Modified: branches/dbus_based/gnome-session/gsm-client.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-client.h	(original)
+++ branches/dbus_based/gnome-session/gsm-client.h	Thu Jul 17 20:37:34 2008
@@ -68,6 +68,7 @@
                                                    guint      flags);
         void         (*impl_end_session)          (GsmClient *client,
                                                    guint      flags);
+        void         (*impl_cancel_end_session)   (GsmClient *client);
         gboolean     (*impl_stop)                 (GsmClient *client,
                                                    GError   **error);
 };
@@ -89,6 +90,7 @@
                                                    guint       flags);
 void        gsm_client_query_end_session          (GsmClient  *client,
                                                    guint       flags);
+void        gsm_client_cancel_end_session         (GsmClient  *client);
 
 gboolean    gsm_client_stop                       (GsmClient  *client,
                                                    GError    **error);

Modified: branches/dbus_based/gnome-session/gsm-dbus-client.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-dbus-client.c	(original)
+++ branches/dbus_based/gnome-session/gsm-dbus-client.c	Thu Jul 17 20:37:34 2008
@@ -54,6 +54,7 @@
 };
 enum {
         STOP,
+        CANCEL_END_SESSION,
         QUERY_END_SESSION,
         END_SESSION,
         LAST_SIGNAL
@@ -253,6 +254,15 @@
         g_signal_emit (dbus_client, signals[END_SESSION], 0, flags);
 }
 
+static void
+dbus_client_cancel_end_session (GsmClient *client)
+{
+        GsmDBusClient  *dbus_client = (GsmDBusClient *) client;
+        g_debug ("GsmDBusClient: sending CancelEndSession signal to %s", dbus_client->priv->bus_name);
+        /* FIXME: unicast signal */
+        g_signal_emit (dbus_client, signals[CANCEL_END_SESSION], 0);
+}
+
 static char *
 dbus_client_get_app_name (GsmClient *client)
 {
@@ -369,10 +379,11 @@
         object_class->get_property         = gsm_dbus_client_get_property;
         object_class->set_property         = gsm_dbus_client_set_property;
 
-        client_class->impl_stop              = dbus_client_stop;
-        client_class->impl_query_end_session = dbus_client_query_end_session;
-        client_class->impl_end_session       = dbus_client_end_session;
-        client_class->impl_get_app_name      = dbus_client_get_app_name;
+        client_class->impl_stop               = dbus_client_stop;
+        client_class->impl_query_end_session  = dbus_client_query_end_session;
+        client_class->impl_end_session        = dbus_client_end_session;
+        client_class->impl_cancel_end_session = dbus_client_cancel_end_session;
+        client_class->impl_get_app_name       = dbus_client_get_app_name;
 
         signals [STOP] =
                 g_signal_new ("stop",
@@ -384,6 +395,16 @@
                               g_cclosure_marshal_VOID__VOID,
                               G_TYPE_NONE,
                               0);
+        signals [CANCEL_END_SESSION] =
+                g_signal_new ("cancel-end-session",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmDBusClientClass, cancel_end_session),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE,
+                              0);
         signals [QUERY_END_SESSION] =
                 g_signal_new ("query-end-session",
                               G_TYPE_FROM_CLASS (object_class),

Modified: branches/dbus_based/gnome-session/gsm-dbus-client.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-dbus-client.h	(original)
+++ branches/dbus_based/gnome-session/gsm-dbus-client.h	Thu Jul 17 20:37:34 2008
@@ -53,6 +53,7 @@
                                             guint       flags);
         void         (*end_session)        (GsmClient  *client,
                                             guint       flags);
+        void         (*cancel_end_session) (GsmClient  *client);
 };
 
 typedef enum

Modified: branches/dbus_based/gnome-session/gsm-dbus-client.xml
==============================================================================
--- branches/dbus_based/gnome-session/gsm-dbus-client.xml	(original)
+++ branches/dbus_based/gnome-session/gsm-dbus-client.xml	Thu Jul 17 20:37:34 2008
@@ -17,6 +17,8 @@
     <signal name="EndSession">
       <arg name="flags" type="u"/>
     </signal>
+    <signal name="CancelEndSession">
+    </signal>
 
   </interface>
 </node>

Modified: branches/dbus_based/gnome-session/gsm-manager.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-manager.c	(original)
+++ branches/dbus_based/gnome-session/gsm-manager.c	Thu Jul 17 20:37:34 2008
@@ -1516,6 +1516,16 @@
         return FALSE;
 }
 
+static gboolean
+_cancel_shutdown_client (const char *id,
+                         GsmClient  *client,
+                         GsmManager *manager)
+{
+        gsm_client_cancel_end_session (client);
+
+        return FALSE;
+}
+
 static void
 manager_logout (GsmManager *manager)
 {
@@ -1676,6 +1686,35 @@
         }
 }
 
+static gboolean
+inhibitor_is_jit (gpointer      key,
+                  GsmInhibitor *inhibitor,
+                  GsmManager   *manager)
+{
+        gboolean    matches;
+        const char *id;
+
+        id = gsm_inhibitor_get_client_id (inhibitor);
+
+        matches = (id != NULL && id[0] != '\0');
+
+        return matches;
+}
+
+static void
+cancel_end_session (GsmManager *manager)
+{
+        /* clear all JIT inhibitors */
+
+        gsm_inhibitor_store_foreach_remove (manager->priv->inhibitors,
+                                            (GsmInhibitorStoreFunc)inhibitor_is_jit,
+                                            (gpointer)manager);
+
+        gsm_client_store_foreach (manager->priv->store,
+                                  (GsmClientStoreFunc)_cancel_shutdown_client,
+                                  NULL);
+}
+
 static void
 inhibit_dialog_response (GsmInhibitDialog *dialog,
                          guint             response_id,
@@ -1685,6 +1724,13 @@
 
         g_debug ("GsmManager: Inhibit dialog response: %d", response_id);
 
+        /* must destroy dialog before cancelling since we'll
+           remove JIT inhibitors and we don't want to trigger
+           action. */
+        g_object_get (dialog, "action", &action, NULL);
+        gtk_widget_destroy (GTK_WIDGET (dialog));
+        manager->priv->inhibit_dialog = NULL;
+
         /* In case of dialog cancel, switch user, hibernate and
          * suspend, we just perform the respective action and return,
          * without shutting down the session. */
@@ -1692,9 +1738,13 @@
         case GTK_RESPONSE_CANCEL:
         case GTK_RESPONSE_NONE:
         case GTK_RESPONSE_DELETE_EVENT:
+                if (action == GSM_LOGOUT_ACTION_LOGOUT
+                    || action == GSM_LOGOUT_ACTION_SHUTDOWN
+                    || action == GSM_LOGOUT_ACTION_REBOOT) {
+                        cancel_end_session (manager);
+                }
                 break;
         case GTK_RESPONSE_ACCEPT:
-                g_object_get (dialog, "action", &action, NULL);
                 g_debug ("GsmManager: doing action %d", action);
                 do_action (manager, action);
                 break;
@@ -1702,9 +1752,6 @@
                 g_assert_not_reached ();
                 break;
         }
-
-        gtk_widget_destroy (GTK_WIDGET (dialog));
-        manager->priv->inhibit_dialog = NULL;
 }
 
 static void
@@ -1752,7 +1799,7 @@
         }
 
         manager->priv->inhibit_dialog = gsm_inhibit_dialog_new (manager->priv->inhibitors,
-                                                                       GSM_LOGOUT_ACTION_SHUTDOWN);
+                                                                GSM_LOGOUT_ACTION_SHUTDOWN);
 
         g_signal_connect (manager->priv->inhibit_dialog,
                           "response",
@@ -1778,7 +1825,7 @@
         }
 
         manager->priv->inhibit_dialog = gsm_inhibit_dialog_new (manager->priv->inhibitors,
-                                                                       GSM_LOGOUT_ACTION_SLEEP);
+                                                                GSM_LOGOUT_ACTION_SLEEP);
 
         g_signal_connect (manager->priv->inhibit_dialog,
                           "response",
@@ -1805,7 +1852,7 @@
         }
 
         manager->priv->inhibit_dialog = gsm_inhibit_dialog_new (manager->priv->inhibitors,
-                                                                       GSM_LOGOUT_ACTION_HIBERNATE);
+                                                                GSM_LOGOUT_ACTION_HIBERNATE);
 
         g_signal_connect (manager->priv->inhibit_dialog,
                           "response",

Modified: branches/dbus_based/gnome-session/gsm-xsmp-client.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-xsmp-client.c	(original)
+++ branches/dbus_based/gnome-session/gsm-xsmp-client.c	Thu Jul 17 20:37:34 2008
@@ -489,11 +489,11 @@
 }
 
 static void
-xsmp_shutdown_cancelled (GsmClient *client)
+xsmp_cancel_end_session (GsmClient *client)
 {
         GsmXSMPClient *xsmp = (GsmXSMPClient *) client;
 
-        g_debug ("GsmXSMPClient: xsmp_shutdown_cancelled ('%s')", xsmp->priv->description);
+        g_debug ("GsmXSMPClient: xsmp_cancel_end_session ('%s')", xsmp->priv->description);
 
         SmsShutdownCancelled (xsmp->priv->conn);
 }
@@ -637,10 +637,11 @@
         object_class->get_property         = gsm_xsmp_client_get_property;
         object_class->set_property         = gsm_xsmp_client_set_property;
 
-        client_class->impl_stop              = xsmp_stop;
-        client_class->impl_query_end_session = xsmp_query_end_session;
-        client_class->impl_end_session       = xsmp_end_session;
-        client_class->impl_get_app_name      = xsmp_get_app_name;
+        client_class->impl_stop               = xsmp_stop;
+        client_class->impl_query_end_session  = xsmp_query_end_session;
+        client_class->impl_end_session        = xsmp_end_session;
+        client_class->impl_cancel_end_session = xsmp_cancel_end_session;
+        client_class->impl_get_app_name       = xsmp_get_app_name;
 
         signals[REGISTER_REQUEST] =
                 g_signal_new ("register-request",
@@ -840,7 +841,7 @@
            This grabbing is clearly bullshit and is not supported by
            the client spec or protocol spec.
         */
-        xsmp_shutdown_cancelled (GSM_CLIENT (client));
+        xsmp_cancel_end_session (GSM_CLIENT (client));
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]