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



Author: mccann
Date: Wed Jul 16 22:09:56 2008
New Revision: 4806
URL: http://svn.gnome.org/viewvc/gnome-session?rev=4806&view=rev

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

	* gnome-session/gsm-dbus-client.c (dbus_client_query_end_session),
	(dbus_client_end_session), (gsm_dbus_client_class_init),
	(gsm_dbus_client_new), (gsm_dbus_client_end_session_response):
	* gnome-session/gsm-dbus-client.h:
	* gnome-session/gsm-inhibit-dialog.c (add_inhibitor):
	* gnome-session/gsm-inhibitor.c (gsm_inhibitor_new_for_client):
	* gnome-session/gsm-inhibitor.h:
	* gnome-session/gsm-manager.c (_debug_client), (debug_clients),
	(disconnect_client), (remove_inhibitors_for_connection),
	(manager_logout), (_client_query_end_session),
	(query_end_session_complete), (on_client_end_session_response),
	(on_query_end_session_timeout), (query_end_session),
	(gsm_manager_register_client):
	* gnome-session/gsm-manager.h:
	* gnome-session/gsm-resumed-app.c
	(gsm_resumed_app_new_from_legacy_session):
	* gnome-session/gsm-xsmp-client.c (register_client_callback):
	* gnome-session/test-client-dbus.c (on_client_query_end_session),
	(register_client), (quit_test), (main):
	Fix up some missed property names.  Hook up query-end-session stuff
	for dbus client.



Modified:
   branches/dbus_based/ChangeLog
   branches/dbus_based/gnome-session/gsm-dbus-client.c
   branches/dbus_based/gnome-session/gsm-dbus-client.h
   branches/dbus_based/gnome-session/gsm-inhibit-dialog.c
   branches/dbus_based/gnome-session/gsm-inhibitor.c
   branches/dbus_based/gnome-session/gsm-inhibitor.h
   branches/dbus_based/gnome-session/gsm-manager.c
   branches/dbus_based/gnome-session/gsm-manager.h
   branches/dbus_based/gnome-session/gsm-resumed-app.c
   branches/dbus_based/gnome-session/gsm-xsmp-client.c
   branches/dbus_based/gnome-session/test-client-dbus.c

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	Wed Jul 16 22:09:56 2008
@@ -52,6 +52,14 @@
         PROP_0,
         PROP_BUS_NAME,
 };
+enum {
+        STOP,
+        QUERY_END_SESSION,
+        END_SESSION,
+        LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0, };
 
 G_DEFINE_TYPE (GsmDBusClient, gsm_dbus_client, GSM_TYPE_CLIENT)
 
@@ -230,6 +238,27 @@
                                guint      flags)
 {
         GsmDBusClient  *dbus_client = (GsmDBusClient *) client;
+        g_debug ("GsmDBusClient: sending QueryEndSession signal to %s", dbus_client->priv->bus_name);
+        /* FIXME: unicast signal */
+        g_signal_emit (dbus_client, signals[QUERY_END_SESSION], 0, flags);
+}
+
+static void
+dbus_client_end_session (GsmClient *client,
+                         guint      flags)
+{
+        GsmDBusClient  *dbus_client = (GsmDBusClient *) client;
+        g_debug ("GsmDBusClient: sending EndSession signal to %s", dbus_client->priv->bus_name);
+        /* FIXME: unicast signal */
+        g_signal_emit (dbus_client, signals[END_SESSION], 0, flags);
+}
+
+#if 0
+static void
+dbus_client_query_end_session (GsmClient *client,
+                               guint      flags)
+{
+        GsmDBusClient  *dbus_client = (GsmDBusClient *) client;
         DBusMessage    *message;
         gboolean        ret;
         DBusConnection *connection;
@@ -238,6 +267,8 @@
 
         ret = FALSE;
 
+        g_debug ("GsmDBusClient: sending QueryEndSession signal to %s", dbus_client->priv->bus_name);
+
         /* unicast the signal to only the registered bus name */
         message = dbus_message_new_signal (gsm_client_get_id (client),
                                            CLIENT_INTERFACE,
@@ -318,6 +349,7 @@
                 dbus_message_unref (message);
         }
 }
+#endif
 
 static void
 gsm_dbus_client_class_init (GsmDBusClientClass *klass)
@@ -334,6 +366,37 @@
         client_class->impl_query_end_session = dbus_client_query_end_session;
         client_class->impl_end_session       = dbus_client_end_session;
 
+        signals [STOP] =
+                g_signal_new ("stop",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmDBusClientClass, stop),
+                              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),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmDBusClientClass, query_end_session),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__UINT,
+                              G_TYPE_NONE,
+                              1, G_TYPE_UINT);
+        signals [END_SESSION] =
+                g_signal_new ("end-session",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GsmDBusClientClass, end_session),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__UINT,
+                              G_TYPE_NONE,
+                              1, G_TYPE_UINT);
+
         g_object_class_install_property (object_class,
                                          PROP_BUS_NAME,
                                          g_param_spec_string ("bus-name",
@@ -348,13 +411,13 @@
 }
 
 GsmClient *
-gsm_dbus_client_new (const char *client_id,
+gsm_dbus_client_new (const char *startup_id,
                      const char *bus_name)
 {
         GsmDBusClient *client;
 
         client = g_object_new (GSM_TYPE_DBUS_CLIENT,
-                               "client-id", client_id,
+                               "startup-id", startup_id,
                                "bus-name", bus_name,
                                NULL);
 
@@ -369,6 +432,8 @@
 {
         const char *sender;
 
+        g_debug ("GsmDBusClient: got EndSessionResponse is-ok:%d reason=%s", is_ok, reason);
+
         /* make sure it is from our client */
         sender = dbus_g_method_get_sender (context);
         if (sender == NULL

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	Wed Jul 16 22:09:56 2008
@@ -46,6 +46,13 @@
 struct _GsmDBusClientClass
 {
         GsmClientClass parent_class;
+
+        /* signals */
+        void         (*stop)               (GsmClient  *client);
+        void         (*query_end_session)  (GsmClient  *client,
+                                            guint       flags);
+        void         (*end_session)        (GsmClient  *client,
+                                            guint       flags);
 };
 
 typedef enum
@@ -64,7 +71,7 @@
 
 GType          gsm_dbus_client_get_type           (void) G_GNUC_CONST;
 
-GsmClient *    gsm_dbus_client_new                (const char     *client_id,
+GsmClient *    gsm_dbus_client_new                (const char     *startup_id,
                                                    const char     *bus_name);
 const char *   gsm_dbus_client_get_bus_name       (GsmDBusClient  *client);
 

Modified: branches/dbus_based/gnome-session/gsm-inhibit-dialog.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-inhibit-dialog.c	(original)
+++ branches/dbus_based/gnome-session/gsm-inhibit-dialog.c	Wed Jul 16 22:09:56 2008
@@ -247,7 +247,7 @@
 
 static void
 add_inhibitor (GsmInhibitDialog *dialog,
-               GsmInhibitor           *inhibitor)
+               GsmInhibitor     *inhibitor)
 {
         const char     *name;
         const char     *icon_name;
@@ -260,40 +260,55 @@
 
         /* FIXME: get info from xid */
 
+        name = NULL;
         pixbuf = NULL;
         app_id = gsm_inhibitor_get_app_id (inhibitor);
 
-        if (! g_str_has_suffix (app_id, ".desktop")) {
+        if (app_id == NULL || app_id[0] == '\0') {
+                desktop_filename = NULL;
+        } else if (! g_str_has_suffix (app_id, ".desktop")) {
                 desktop_filename = g_strdup_printf ("%s.desktop", app_id);
         } else {
                 desktop_filename = g_strdup (app_id);
         }
 
-        /* FIXME: maybe also append the autostart dirs ? */
-        search_dirs = gsm_util_get_app_dirs ();
+        if (desktop_filename != NULL) {
+                /* FIXME: maybe also append the autostart dirs ? */
+                search_dirs = gsm_util_get_app_dirs ();
+
+                error = NULL;
+                desktop_file = egg_desktop_file_new_from_dirs (desktop_filename,
+                                                               (const char **)search_dirs,
+                                                               &error);
+                g_strfreev (search_dirs);
+
+                if (desktop_file == NULL) {
+                        g_warning ("Unable to find desktop file '%s': %s", desktop_filename, error->message);
+                        g_error_free (error);
+                } else {
+                        name = egg_desktop_file_get_name (desktop_file);
+                        icon_name = egg_desktop_file_get_icon (desktop_file);
+
+                        pixbuf = _load_icon (gtk_icon_theme_get_default (),
+                                             icon_name,
+                                             DEFAULT_ICON_SIZE,
+                                             DEFAULT_ICON_SIZE,
+                                             DEFAULT_ICON_SIZE,
+                                             NULL);
+                }
+        }
 
-        error = NULL;
-        desktop_file = egg_desktop_file_new_from_dirs (desktop_filename,
-                                                       (const char **)search_dirs,
-                                                       &error);
-        g_strfreev (search_dirs);
-
-        if (desktop_file == NULL) {
-                g_warning ("Unable to find desktop file '%s': %s", desktop_filename, error->message);
-                g_error_free (error);
-                name = app_id;
-                pixbuf = _load_icon (gtk_icon_theme_get_default (),
-                                     "gnome-windows",
-                                     DEFAULT_ICON_SIZE,
-                                     DEFAULT_ICON_SIZE,
-                                     DEFAULT_ICON_SIZE,
-                                     NULL);
-        } else {
-                name = egg_desktop_file_get_name (desktop_file);
-                icon_name = egg_desktop_file_get_icon (desktop_file);
+        if (name == NULL) {
+                if (app_id != NULL) {
+                        name = app_id;
+                } else {
+                        name = _("Unknown");
+                }
+        }
 
+        if (pixbuf == NULL) {
                 pixbuf = _load_icon (gtk_icon_theme_get_default (),
-                                     icon_name,
+                                     "gnome-windows",
                                      DEFAULT_ICON_SIZE,
                                      DEFAULT_ICON_SIZE,
                                      DEFAULT_ICON_SIZE,

Modified: branches/dbus_based/gnome-session/gsm-inhibitor.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-inhibitor.c	(original)
+++ branches/dbus_based/gnome-session/gsm-inhibitor.c	Wed Jul 16 22:09:56 2008
@@ -396,6 +396,7 @@
 
 GsmInhibitor *
 gsm_inhibitor_new_for_client (const char    *client_id,
+                              const char    *app_id,
                               guint          flags,
                               const char    *reason,
                               guint          cookie)
@@ -404,6 +405,7 @@
 
         inhibitor = g_object_new (GSM_TYPE_INHIBITOR,
                                   "client-id", client_id,
+                                  "app-id", app_id,
                                   "reason", reason,
                                   "flags", flags,
                                   "cookie", cookie,

Modified: branches/dbus_based/gnome-session/gsm-inhibitor.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-inhibitor.h	(original)
+++ branches/dbus_based/gnome-session/gsm-inhibitor.h	Wed Jul 16 22:09:56 2008
@@ -64,6 +64,7 @@
                                                    const char    *bus_name,
                                                    guint          cookie);
 GsmInhibitor * gsm_inhibitor_new_for_client       (const char    *client_id,
+                                                   const char    *app_id,
                                                    guint          flags,
                                                    const char    *reason,
                                                    guint          cookie);

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	Wed Jul 16 22:09:56 2008
@@ -165,6 +165,24 @@
 }
 
 static gboolean
+_debug_client (const char *id,
+               GsmClient  *client,
+               GsmManager *manager)
+{
+        g_debug ("GsmManager: Client %s",
+                 gsm_client_get_id (client));
+        return FALSE;
+}
+
+static void
+debug_clients (GsmManager *manager)
+{
+        gsm_client_store_foreach (manager->priv->store,
+                                  (GsmClientStoreFunc)_debug_client,
+                                  manager);
+}
+
+static gboolean
 _find_by_startup_id (const char *id,
                      GsmClient  *client,
                      const char *startup_id_a)
@@ -450,6 +468,7 @@
 
         if (manager->priv->phase == GSM_MANAGER_PHASE_SHUTDOWN
             && gsm_client_store_size (manager->priv->store) == 0) {
+                g_debug ("GsmManager: last client disconnected - exiting");
                 gtk_main_quit ();
         }
 }
@@ -529,8 +548,6 @@
 {
         guint n_removed;
 
-        g_debug ("GsmManager: removing inhibitors for bus name");
-
         n_removed = gsm_inhibitor_store_foreach_remove (manager->priv->inhibitors,
                                                         (GsmInhibitorStoreFunc)inhibitor_has_bus_name,
                                                         (gpointer)service_name);
@@ -1428,6 +1445,7 @@
                                   (GsmClientStoreFunc)_shutdown_client,
                                   NULL);
 
+        g_debug ("GsmManager: session shutdown complete, exiting");
         gtk_main_quit ();
 }
 
@@ -1723,15 +1741,19 @@
                            GsmClient  *client,
                            GsmManager *manager)
 {
+        g_debug ("GsmManager: adding client to query clients: %s", gsm_client_get_id (client));
         manager->priv->query_clients = g_slist_prepend (manager->priv->query_clients,
                                                         client);
         gsm_client_query_end_session (client, 0);
+
         return FALSE;
 }
 
 static void
 query_end_session_complete (GsmManager *manager)
 {
+        g_debug ("GsmManager: query end session complete");
+
         if (! gsm_manager_is_logout_inhibited (manager)) {
                 manager_logout (manager);
                 return;
@@ -1805,10 +1827,7 @@
                                 const char *reason,
                                 GsmManager *manager)
 {
-        if (manager->priv->phase != GSM_MANAGER_PHASE_SHUTDOWN) {
-                /* Not shutting down, nothing to do */
-                return;
-        }
+        g_debug ("GsmManager: Response from end session request: is-ok=%d reason=%s", is_ok, reason);
 
         manager->priv->query_clients = g_slist_remove (manager->priv->query_clients, client);
 
@@ -1820,6 +1839,7 @@
 
                 cookie = _generate_unique_cookie (manager);
                 inhibitor = gsm_inhibitor_new_for_client (gsm_client_get_id (client),
+                                                          gsm_client_get_app_id (client),
                                                           GSM_INHIBITOR_FLAG_LOGOUT,
                                                           reason,
                                                           cookie);
@@ -1839,6 +1859,8 @@
 
         manager->priv->query_timeout_id = 0;
 
+        g_debug ("GsmManager: query end session timed out");
+
         for (l = manager->priv->query_clients; l != NULL; l = l->next) {
                 guint         cookie;
                 GsmInhibitor *inhibitor;
@@ -1850,6 +1872,7 @@
 
                 cookie = _generate_unique_cookie (manager);
                 inhibitor = gsm_inhibitor_new_for_client (gsm_client_get_id (l->data),
+                                                          gsm_client_get_app_id (l->data),
                                                           GSM_INHIBITOR_FLAG_LOGOUT,
                                                           _("Not responding"),
                                                           cookie);
@@ -1870,9 +1893,12 @@
                 manager->priv->query_timeout_id = 0;
         }
         manager->priv->query_timeout_id = g_timeout_add_seconds (1, (GSourceFunc)on_query_end_session_timeout, manager);
+
+        debug_clients (manager);
+        g_debug ("GsmManager: sending query-end-session to clients");
         gsm_client_store_foreach (manager->priv->store,
                                   (GsmClientStoreFunc)_client_query_end_session,
-                                  &manager);
+                                  manager);
 }
 
 static void
@@ -2137,8 +2163,8 @@
 
 gboolean
 gsm_manager_register_client (GsmManager            *manager,
-                             const char            *startup_id,
                              const char            *app_id,
+                             const char            *startup_id,
                              DBusGMethodInvocation *context)
 {
         char      *new_startup_id;
@@ -2219,6 +2245,11 @@
 
         gsm_client_store_add (manager->priv->store, client);
 
+        g_signal_connect (client,
+                          "end-session-response",
+                          G_CALLBACK (on_client_end_session_response),
+                          manager);
+
         if (app != NULL) {
                 gsm_client_set_app_id (client, gsm_app_get_id (app));
                 gsm_app_registered (app);

Modified: branches/dbus_based/gnome-session/gsm-manager.h
==============================================================================
--- branches/dbus_based/gnome-session/gsm-manager.h	(original)
+++ branches/dbus_based/gnome-session/gsm-manager.h	Wed Jul 16 22:09:56 2008
@@ -113,8 +113,8 @@
 /* exported methods */
 
 gboolean            gsm_manager_register_client      (GsmManager            *manager,
-                                                      const char            *client_startup_id,
                                                       const char            *app_id,
+                                                      const char            *client_startup_id,
                                                       DBusGMethodInvocation *context);
 gboolean            gsm_manager_unregister_client    (GsmManager            *manager,
                                                       const char            *session_client_id,

Modified: branches/dbus_based/gnome-session/gsm-resumed-app.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-resumed-app.c	(original)
+++ branches/dbus_based/gnome-session/gsm-resumed-app.c	Wed Jul 16 22:09:56 2008
@@ -226,7 +226,7 @@
         }
 
         app = g_object_new (GSM_TYPE_RESUMED_APP,
-                            "client-id", id,
+                            "startup-id", id,
                             NULL);
 
         key = g_strdup_printf ("%d," SmProgram, n);

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	Wed Jul 16 22:09:56 2008
@@ -780,7 +780,7 @@
                 return FALSE;
         }
 
-        g_object_set (client, "client-id", id, NULL);
+        g_object_set (client, "startup-id", id, NULL);
 
         set_description (client);
 

Modified: branches/dbus_based/gnome-session/test-client-dbus.c
==============================================================================
--- branches/dbus_based/gnome-session/test-client-dbus.c	(original)
+++ branches/dbus_based/gnome-session/test-client-dbus.c	Wed Jul 16 22:09:56 2008
@@ -33,10 +33,14 @@
 #define SM_DBUS_PATH      "/org/gnome/SessionManager"
 #define SM_DBUS_INTERFACE "org.gnome.SessionManager"
 
+#define SM_CLIENT_DBUS_INTERFACE "org.gnome.SessionManager.DBusClient"
+
 static DBusGConnection *bus_connection = NULL;
 static DBusGProxy      *sm_proxy = NULL;
 static char            *new_startup_id = NULL;
 static char            *client_id = NULL;
+static DBusGProxy      *client_proxy = NULL;
+static GMainLoop       *main_loop = NULL;
 
 static gboolean
 session_manager_connect (void)
@@ -62,6 +66,31 @@
         return (sm_proxy != NULL);
 }
 
+static void
+on_client_query_end_session (DBusGProxy     *proxy,
+                             guint           flags,
+                             gpointer        data)
+{
+        GError     *error;
+        gboolean    is_ok;
+        gboolean    res;
+        const char *reason;
+
+        is_ok = FALSE;
+        reason = "Unsaved files";
+
+        g_debug ("Got query end session signal");
+
+        error = NULL;
+        res = dbus_g_proxy_call (proxy,
+                                 "EndSessionResponse",
+                                 &error,
+                                 G_TYPE_BOOLEAN, is_ok,
+                                 G_TYPE_STRING, reason,
+                                 G_TYPE_INVALID,
+                                 G_TYPE_INVALID);
+}
+
 static gboolean
 register_client (void)
 {
@@ -71,7 +100,7 @@
         const char *app_id;
 
         startup_id = g_getenv ("DESKTOP_AUTOSTART_ID");
-        app_id = "test-client-dbus";
+        app_id = "gedit";
 
         error = NULL;
         res = dbus_g_proxy_call (sm_proxy,
@@ -90,9 +119,30 @@
         }
 
         g_debug ("Client registered with session manager: %s", client_id);
+        client_proxy = dbus_g_proxy_new_for_name (bus_connection,
+                                                  SM_DBUS_NAME,
+                                                  client_id,
+                                                  SM_CLIENT_DBUS_INTERFACE);
+        dbus_g_proxy_add_signal (client_proxy,
+                                 "QueryEndSession",
+                                 G_TYPE_UINT,
+                                 G_TYPE_INVALID);
+        dbus_g_proxy_add_signal (client_proxy,
+                                 "EndSession",
+                                 G_TYPE_UINT,
+                                 G_TYPE_INVALID);
+        dbus_g_proxy_add_signal (client_proxy,
+                                 "Stop",
+                                 G_TYPE_INVALID);
+        dbus_g_proxy_connect_signal (client_proxy,
+                                     "QueryEndSession",
+                                     G_CALLBACK (on_client_query_end_session),
+                                     NULL,
+                                     NULL);
 
         return TRUE;
 }
+
 static gboolean
 session_manager_disconnect (void)
 {
@@ -129,6 +179,13 @@
         return TRUE;
 }
 
+static gboolean
+quit_test (gpointer data)
+{
+        g_main_loop_quit (main_loop);
+        return FALSE;
+}
+
 int
 main (int   argc,
       char *argv[])
@@ -150,7 +207,12 @@
                 g_warning ("Unable to register client with session manager");
         }
 
-        sleep (30);
+        main_loop = g_main_loop_new (NULL, FALSE);
+
+        g_timeout_add_seconds (30, quit_test, NULL);
+
+        g_main_loop_run (main_loop);
+        g_main_loop_unref (main_loop);
 
         unregister_client ();
         session_manager_disconnect ();



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