gnome-session r4806 - in branches/dbus_based: . gnome-session
- From: mccann svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-session r4806 - in branches/dbus_based: . gnome-session
- Date: Wed, 16 Jul 2008 22:09:57 +0000 (UTC)
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]