Merge lp:~indicator-applet-developers/indicator-session/ubuntu into lp:~ubuntu-desktop/indicator-session/ubuntu

Proposed by Ted Gould
Status: Merged
Merged at revision: not available
Proposed branch: lp:~indicator-applet-developers/indicator-session/ubuntu
Merge into: lp:~ubuntu-desktop/indicator-session/ubuntu
Diff against target: None lines
To merge this branch: bzr merge lp:~indicator-applet-developers/indicator-session/ubuntu
Reviewer Review Type Date Requested Status
Sebastien Bacher Pending
Ken VanDine Pending
Review via email: mp+11569@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Ted Gould (ted) wrote :

Upstream release 0.1.3

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'configure.ac'
2--- configure.ac 2009-09-08 15:51:54 +0000
3+++ configure.ac 2009-09-11 01:36:16 +0000
4@@ -4,7 +4,7 @@
5 AC_PREREQ(2.53)
6
7 AM_CONFIG_HEADER(config.h)
8-AM_INIT_AUTOMAKE(indicator-session, 0.1.2)
9+AM_INIT_AUTOMAKE(indicator-session, 0.1.3)
10
11 AM_MAINTAINER_MODE
12
13
14=== modified file 'debian/changelog'
15--- debian/changelog 2009-09-08 16:16:10 +0000
16+++ debian/changelog 2009-09-11 01:39:48 +0000
17@@ -1,3 +1,13 @@
18+indicator-session (0.1.3-0ubuntu1~ppa1) karmic; urgency=low
19+
20+ * Upstream release 0.1.3
21+ * GConf Key change listening
22+ * Pidgin and Empathy (2.26) startup detection
23+ * Label fixes
24+ * Icon fixes for logout windows (LP: #426355)
25+
26+ -- Ted Gould <ted@ubuntu.com> Thu, 10 Sep 2009 20:38:44 -0500
27+
28 indicator-session (0.1.2-0ubuntu1) karmic; urgency=low
29
30 * debian/control:
31
32=== modified file 'src/gtk-dialog/Makefile.am'
33--- src/gtk-dialog/Makefile.am 2009-09-02 14:17:44 +0000
34+++ src/gtk-dialog/Makefile.am 2009-09-10 22:02:32 +0000
35@@ -10,6 +10,6 @@
36 logout-dialog.c \
37 logout-dialog.h
38
39-gtk_logout_helper_CFLAGS = $(GTKLOGOUTHELPER_CFLAGS) $(GCONF_CFLAGS) -Wall -Werror
40-gtk_logout_helper_LDADD = $(GTKLOGOUTHELPER_LIBS) $(GCONF_LIBS)
41+gtk_logout_helper_CFLAGS = $(SESSIONSERVICE_CFLAGS) $(GTKLOGOUTHELPER_CFLAGS) $(GCONF_CFLAGS) -Wall -Werror -DINDICATOR_ICONS_DIR="\"$(INDICATORICONSDIR)\""
42+gtk_logout_helper_LDADD = $(SESSIONSERVICE_LIBS) $(GTKLOGOUTHELPER_LIBS) $(GCONF_LIBS)
43
44
45=== modified file 'src/gtk-dialog/gconf-helper.c'
46--- src/gtk-dialog/gconf-helper.c 2009-09-02 15:10:20 +0000
47+++ src/gtk-dialog/gconf-helper.c 2009-09-10 22:05:42 +0000
48@@ -1,6 +1,5 @@
49 /*
50-A small wrapper utility to load indicators and put them as menu items
51-into the gnome-panel using it's applet interface.
52+A small wrapper utility for connecting to gconf.
53
54 Copyright 2009 Canonical Ltd.
55
56@@ -23,10 +22,52 @@
57
58 #include <gconf/gconf-client.h>
59
60+#include <glib/gi18n.h>
61+
62+#include <dbus/dbus-glib.h>
63+#include <dbus/dbus-glib-bindings.h>
64+
65+#include <libdbusmenu-glib/server.h>
66+#include <libdbusmenu-glib/menuitem.h>
67+
68 #include "gconf-helper.h"
69
70+static GConfClient * gconf_client = NULL;
71+
72 gboolean
73 supress_confirmations (void) {
74- GConfClient *client = gconf_client_get_default ();
75- return gconf_client_get_bool (client, SUPPRESS_KEY, NULL) ;
76-}
77+ if(!gconf_client) {
78+ gconf_client = gconf_client_get_default ();
79+ }
80+ return gconf_client_get_bool (gconf_client, SUPPRESS_KEY, NULL) ;
81+}
82+
83+static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer data) {
84+ RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi = (RestartShutdownLogoutMenuItems*) data;
85+ GConfValue * value = gconf_entry_get_value (entry);
86+ const gchar * key = gconf_entry_get_key (entry);
87+
88+ if(g_strcmp0 (key, SUPPRESS_KEY) == 0) {
89+ if (gconf_value_get_bool (value)) {
90+ dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out"));
91+ dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart"));
92+ dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown"));
93+ } else {
94+ dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out..."));
95+ dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart..."));
96+ dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown..."));
97+ }
98+ }
99+}
100+
101+void
102+update_menu_entries(RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi) {
103+ if(!gconf_client) {
104+ gconf_client = gconf_client_get_default ();
105+ }
106+ gconf_client_add_dir (gconf_client, GLOBAL_DIR,
107+ GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
108+ gconf_client_notify_add (gconf_client, SUPPRESS_KEY,
109+ update_menu_entries_callback, restart_shutdown_logout_mi, NULL, NULL);
110+}
111+
112
113=== modified file 'src/gtk-dialog/gconf-helper.h'
114--- src/gtk-dialog/gconf-helper.h 2009-09-02 15:10:20 +0000
115+++ src/gtk-dialog/gconf-helper.h 2009-09-08 19:26:38 +0000
116@@ -1,6 +1,5 @@
117 /*
118-A small wrapper utility to load indicators and put them as menu items
119-into the gnome-panel using it's applet interface.
120+A small wrapper utility for connecting to gconf.
121
122 Copyright 2009 Canonical Ltd.
123
124@@ -26,8 +25,26 @@
125
126 #include <gconf/gconf-client.h>
127
128+#include <glib/gi18n.h>
129+
130+#include <dbus/dbus-glib.h>
131+#include <dbus/dbus-glib-bindings.h>
132+
133+#include <libdbusmenu-glib/server.h>
134+#include <libdbusmenu-glib/menuitem.h>
135+
136 #define SUPPRESS_KEY "/apps/indicator-session/suppress_logout_restart_shutdown"
137-
138+#define GLOBAL_DIR "/apps/indicator-session"
139+
140+typedef struct _RestartShutdownLogoutMenuItems
141+{
142+ DbusmenuMenuitem * logout_mi;
143+ DbusmenuMenuitem * restart_mi;
144+ DbusmenuMenuitem * shutdown_mi;
145+}
146+RestartShutdownLogoutMenuItems;
147+
148+void update_menu_entries(RestartShutdownLogoutMenuItems*);
149 gboolean supress_confirmations (void);
150
151 #endif /* __GCONF_HELPER__ */
152
153=== modified file 'src/gtk-dialog/gtk-logout-helper.c'
154--- src/gtk-dialog/gtk-logout-helper.c 2009-09-02 14:17:44 +0000
155+++ src/gtk-dialog/gtk-logout-helper.c 2009-09-10 20:59:38 +0000
156@@ -133,6 +133,10 @@
157 return 1;
158 }
159
160+ /* Init some theme/icon stuff */
161+ gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(),
162+ INDICATOR_ICONS_DIR);
163+
164 GtkWidget * dialog = NULL;
165 if (!pk_require_auth(type) && !supress_confirmations()) {
166 dialog = logout_dialog_new(type);
167
168=== modified file 'src/gtk-dialog/logout-dialog.c'
169--- src/gtk-dialog/logout-dialog.c 2009-08-24 15:40:20 +0000
170+++ src/gtk-dialog/logout-dialog.c 2009-09-11 01:36:16 +0000
171@@ -298,8 +298,9 @@
172 GTK_RESPONSE_OK);
173 gtk_widget_grab_default (logout_dialog->ok_button);
174
175- /* Title */
176+ /* Window Title and Icon */
177 gtk_window_set_title (GTK_WINDOW(logout_dialog), _(title_strings[logout_dialog->action]));
178+ gtk_window_set_icon_name (GTK_WINDOW(logout_dialog), icon_strings[logout_dialog->action]);
179
180 /* hbox */
181 logout_dialog->hbox = gtk_hbox_new (FALSE, 12);
182
183=== modified file 'src/session-service.c'
184--- src/session-service.c 2009-09-08 15:09:45 +0000
185+++ src/session-service.c 2009-09-10 22:05:42 +0000
186@@ -6,6 +6,7 @@
187
188 Authors:
189 Ted Gould <ted@canonical.com>
190+ Christoph Korn <c_korn@gmx.de>
191
192 This program is free software: you can redistribute it and/or modify it
193 under the terms of the GNU General Public License version 3, as published
194@@ -47,6 +48,9 @@
195
196 static DbusmenuMenuitem * hibernate_mi = NULL;
197 static DbusmenuMenuitem * suspend_mi = NULL;
198+static DbusmenuMenuitem * logout_mi = NULL;
199+static DbusmenuMenuitem * restart_mi = NULL;
200+static DbusmenuMenuitem * shutdown_mi = NULL;
201
202 /* Let's put this machine to sleep, with some info on how
203 it should sleep. */
204@@ -222,16 +226,14 @@
205 provides in the UI. It also connects them to the callbacks. */
206 static void
207 create_items (DbusmenuMenuitem * root) {
208- DbusmenuMenuitem * mi = NULL;
209-
210- mi = dbusmenu_menuitem_new();
211+ logout_mi = dbusmenu_menuitem_new();
212 if (supress_confirmations()) {
213- dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out"));
214+ dbusmenu_menuitem_property_set(logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out"));
215 } else {
216- dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out ..."));
217+ dbusmenu_menuitem_property_set(logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out..."));
218 }
219- dbusmenu_menuitem_child_append(root, mi);
220- g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "logout");
221+ dbusmenu_menuitem_child_append(root, logout_mi);
222+ g_signal_connect(G_OBJECT(logout_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "logout");
223
224 suspend_mi = dbusmenu_menuitem_new();
225 dbusmenu_menuitem_property_set(suspend_mi, DBUSMENU_MENUITEM_PROP_VISIBLE, "false");
226@@ -245,23 +247,30 @@
227 dbusmenu_menuitem_child_append(root, hibernate_mi);
228 g_signal_connect(G_OBJECT(hibernate_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(sleep), "Hibernate");
229
230- mi = dbusmenu_menuitem_new();
231- if (supress_confirmations()) {
232- dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart"));
233- } else {
234- dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart ..."));
235- }
236- dbusmenu_menuitem_child_append(root, mi);
237- g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "restart");
238-
239- mi = dbusmenu_menuitem_new();
240- if (supress_confirmations()) {
241- dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown"));
242- } else {
243- dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown ..."));
244- }
245- dbusmenu_menuitem_child_append(root, mi);
246- g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "shutdown");
247+ restart_mi = dbusmenu_menuitem_new();
248+ if (supress_confirmations()) {
249+ dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart"));
250+ } else {
251+ dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart..."));
252+ }
253+ dbusmenu_menuitem_child_append(root, restart_mi);
254+ g_signal_connect(G_OBJECT(restart_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "restart");
255+
256+ shutdown_mi = dbusmenu_menuitem_new();
257+ if (supress_confirmations()) {
258+ dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown"));
259+ } else {
260+ dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown..."));
261+ }
262+ dbusmenu_menuitem_child_append(root, shutdown_mi);
263+ g_signal_connect(G_OBJECT(shutdown_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "shutdown");
264+
265+ RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi = g_new0 (RestartShutdownLogoutMenuItems, 1);
266+ restart_shutdown_logout_mi->logout_mi = logout_mi;
267+ restart_shutdown_logout_mi->restart_mi = restart_mi;
268+ restart_shutdown_logout_mi->shutdown_mi = shutdown_mi;
269+
270+ update_menu_entries(restart_shutdown_logout_mi);
271
272 return;
273 }
274
275=== modified file 'src/status-provider-pidgin.c'
276--- src/status-provider-pidgin.c 2009-08-17 21:52:43 +0000
277+++ src/status-provider-pidgin.c 2009-09-10 18:28:43 +0000
278@@ -59,12 +59,14 @@
279 /* STATUS_PROVIDER_STATUS_AWAY, */ PG_STATUS_AWAY,
280 /* STATUS_PROVIDER_STATUS_DND */ PG_STATUS_UNAVAILABLE,
281 /* STATUS_PROVIDER_STATUS_INVISIBLE*/ PG_STATUS_INVISIBLE,
282- /* STATUS_PROVIDER_STATUS_OFFLINE */ PG_STATUS_OFFLINE
283+ /* STATUS_PROVIDER_STATUS_OFFLINE */ PG_STATUS_OFFLINE,
284+ /* STATUS_PROVIDER_STATUS_DISCONNECTED*/ PG_STATUS_OFFLINE
285 };
286
287 typedef struct _StatusProviderPidginPrivate StatusProviderPidginPrivate;
288 struct _StatusProviderPidginPrivate {
289 DBusGProxy * proxy;
290+ DBusGProxy * dbus_proxy;
291 pg_status_t pg_status;
292 };
293
294@@ -80,6 +82,8 @@
295 /* Internal Funcs */
296 static void set_status (StatusProvider * sp, StatusProviderStatus status);
297 static StatusProviderStatus get_status (StatusProvider * sp);
298+static void setup_pidgin_proxy (StatusProviderPidgin * self);
299+static void dbus_namechange (DBusGProxy * proxy, const gchar * name, const gchar * prev, const gchar * new, StatusProviderPidgin * self);
300
301 G_DEFINE_TYPE (StatusProviderPidgin, status_provider_pidgin, STATUS_PROVIDER_TYPE);
302
303@@ -183,22 +187,85 @@
304 all non-DBus stuff should be done */
305
306 GError * error = NULL;
307+
308+ /* Set up the dbus Proxy */
309+ priv->dbus_proxy = dbus_g_proxy_new_for_name_owner (bus,
310+ DBUS_SERVICE_DBUS,
311+ DBUS_PATH_DBUS,
312+ DBUS_INTERFACE_DBUS,
313+ &error);
314+ if (error != NULL) {
315+ g_warning("Unable to connect to DBus events: %s", error->message);
316+ g_error_free(error);
317+ return;
318+ }
319+
320+ /* Configure the name owner changing */
321+ dbus_g_proxy_add_signal(priv->dbus_proxy, "NameOwnerChanged",
322+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
323+ G_TYPE_INVALID);
324+ dbus_g_proxy_connect_signal(priv->dbus_proxy, "NameOwnerChanged",
325+ G_CALLBACK(dbus_namechange),
326+ self, NULL);
327+
328+ setup_pidgin_proxy(self);
329+
330+ return;
331+}
332+
333+/* Watch to see if the Pidgin comes up on Dbus */
334+static void
335+dbus_namechange (DBusGProxy * proxy, const gchar * name, const gchar * prev, const gchar * new, StatusProviderPidgin * self)
336+{
337+ g_return_if_fail(name != NULL);
338+ g_return_if_fail(new != NULL);
339+
340+ if (g_strcmp0(name, "im.pidgin.purple.PurpleService") == 0) {
341+ setup_pidgin_proxy(self);
342+ }
343+ return;
344+}
345+
346+/* Setup the Pidgin proxy so that we can talk to it
347+ and get signals from it. */
348+static void
349+setup_pidgin_proxy (StatusProviderPidgin * self)
350+{
351+ StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(self);
352+
353+ if (priv->proxy != NULL) {
354+ g_debug("Odd, we were asked to set up a Pidgin proxy when we already had one.");
355+ return;
356+ }
357+
358+ DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
359+ g_return_if_fail(bus != NULL); /* Can't do anymore DBus stuff without this,
360+ all non-DBus stuff should be done */
361+
362+ GError * error = NULL;
363+
364+ /* Set up the Pidgin Proxy */
365 priv->proxy = dbus_g_proxy_new_for_name_owner (bus,
366 "im.pidgin.purple.PurpleService",
367 "/im/pidgin/purple/PurpleObject",
368 "im.pidgin.purple.PurpleInterface",
369 &error);
370+ /* Report any errors */
371 if (error != NULL) {
372 g_debug("Unable to get Pidgin proxy: %s", error->message);
373 g_error_free(error);
374- return;
375 }
376
377+ /* If we have a proxy, let's start using it */
378 if (priv->proxy != NULL) {
379+ /* Set the proxy to NULL if it's destroyed */
380 g_object_add_weak_pointer (G_OBJECT(priv->proxy), (gpointer *)&priv->proxy);
381+ /* If it's destroyed, let's clean up as well */
382 g_signal_connect(G_OBJECT(priv->proxy), "destroy",
383 G_CALLBACK(proxy_destroy), self);
384
385+ /* Watching for the status change coming from the
386+ Pidgin side of things. */
387 g_debug("Adding Pidgin Signals");
388 dbus_g_object_register_marshaller(_status_provider_pidgin_marshal_VOID__INT_INT,
389 G_TYPE_NONE,
390@@ -216,6 +283,8 @@
391 (void *)self,
392 NULL);
393
394+ /* Get the current status to update our cached
395+ value of the status. */
396 dbus_g_proxy_begin_call(priv->proxy,
397 "PurpleSavedstatusGetCurrent",
398 savedstatus_cb,
399@@ -346,11 +415,17 @@
400 }
401
402 /* Takes the cached Pidgin status and makes it into the generic
403- Status provider status */
404+ Status provider status. If there is no Pidgin proxy then it
405+ returns the disconnected state. */
406 static StatusProviderStatus
407 get_status (StatusProvider * sp)
408 {
409- g_return_val_if_fail(IS_STATUS_PROVIDER_PIDGIN(sp), STATUS_PROVIDER_STATUS_OFFLINE);
410+ g_return_val_if_fail(IS_STATUS_PROVIDER_PIDGIN(sp), STATUS_PROVIDER_STATUS_DISCONNECTED);
411 StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(sp);
412+
413+ if (priv->proxy == NULL) {
414+ return STATUS_PROVIDER_STATUS_DISCONNECTED;
415+ }
416+
417 return pg_to_sp_map[priv->pg_status];
418 }
419
420=== modified file 'src/status-provider-telepathy.c'
421--- src/status-provider-telepathy.c 2009-08-25 20:59:07 +0000
422+++ src/status-provider-telepathy.c 2009-09-10 19:09:43 +0000
423@@ -55,12 +55,14 @@
424 /* STATUS_PROVIDER_STATUS_AWAY, */ MC_STATUS_AWAY,
425 /* STATUS_PROVIDER_STATUS_DND */ MC_STATUS_DND,
426 /* STATUS_PROVIDER_STATUS_INVISIBLE*/ MC_STATUS_HIDDEN,
427- /* STATUS_PROVIDER_STATUS_OFFLINE */ MC_STATUS_OFFLINE
428+ /* STATUS_PROVIDER_STATUS_OFFLINE */ MC_STATUS_OFFLINE,
429+ /* STATUS_PROVIDER_STATUS_DISCONNECTED*/MC_STATUS_OFFLINE
430 };
431
432 typedef struct _StatusProviderTelepathyPrivate StatusProviderTelepathyPrivate;
433 struct _StatusProviderTelepathyPrivate {
434 DBusGProxy * proxy;
435+ DBusGProxy * dbus_proxy;
436 mc_status_t mc_status;
437 };
438
439@@ -74,6 +76,8 @@
440 static void status_provider_telepathy_dispose (GObject *object);
441 static void status_provider_telepathy_finalize (GObject *object);
442 /* Internal Funcs */
443+static void build_telepathy_proxy (StatusProviderTelepathy * self);
444+static void dbus_namechange (DBusGProxy * proxy, const gchar * name, const gchar * prev, const gchar * new, StatusProviderTelepathy * self);
445 static void set_status (StatusProvider * sp, StatusProviderStatus status);
446 static StatusProviderStatus get_status (StatusProvider * sp);
447 static void changed_status (DBusGProxy * proxy, guint status, gchar * message, StatusProvider * sp);
448@@ -107,10 +111,61 @@
449 StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(self);
450
451 priv->proxy = NULL;
452+ priv->dbus_proxy = NULL;
453 priv->mc_status = MC_STATUS_OFFLINE;
454
455 GError * error = NULL;
456
457+ /* Grabbing the session bus */
458+ DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
459+ if (bus == NULL) {
460+ g_warning("Unable to connect to Session Bus: %s", error == NULL ? "No message" : error->message);
461+ g_error_free(error);
462+ return;
463+ }
464+
465+ /* Set up the dbus Proxy */
466+ priv->dbus_proxy = dbus_g_proxy_new_for_name_owner (bus,
467+ DBUS_SERVICE_DBUS,
468+ DBUS_PATH_DBUS,
469+ DBUS_INTERFACE_DBUS,
470+ &error);
471+ if (error != NULL) {
472+ g_warning("Unable to connect to DBus events: %s", error->message);
473+ g_error_free(error);
474+ return;
475+ }
476+
477+ /* Configure the name owner changing */
478+ dbus_g_proxy_add_signal(priv->dbus_proxy, "NameOwnerChanged",
479+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
480+ G_TYPE_INVALID);
481+ dbus_g_proxy_connect_signal(priv->dbus_proxy, "NameOwnerChanged",
482+ G_CALLBACK(dbus_namechange),
483+ self, NULL);
484+
485+ build_telepathy_proxy(self);
486+
487+ return;
488+}
489+
490+/* Builds up the proxy to Mission Control and configures all of the
491+ signals for getting info from the proxy. Also does a call to get
492+ the inital value of the status. */
493+static void
494+build_telepathy_proxy (StatusProviderTelepathy * self)
495+{
496+ g_debug("Building Telepathy Proxy");
497+ StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(self);
498+
499+ if (priv->proxy != NULL) {
500+ g_debug("Hmm, being asked to build a proxy we alredy have.");
501+ return;
502+ }
503+
504+ GError * error = NULL;
505+
506+ /* Grabbing the session bus */
507 DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
508 if (session_bus == NULL) {
509 g_warning("Unable to connect to Session Bus: %s", error == NULL ? "No message" : error->message);
510@@ -118,7 +173,7 @@
511 return;
512 }
513
514- priv->proxy = NULL;
515+ /* Get the proxy to Mission Control */
516 priv->proxy = dbus_g_proxy_new_for_name_owner(session_bus,
517 "org.freedesktop.Telepathy.MissionControl",
518 "/org/freedesktop/Telepathy/MissionControl",
519@@ -126,10 +181,13 @@
520 &error);
521
522 if (priv->proxy != NULL) {
523+ /* If it goes, we set the proxy to NULL */
524 g_object_add_weak_pointer (G_OBJECT(priv->proxy), (gpointer *)&priv->proxy);
525+ /* And we clean up other variables associated */
526 g_signal_connect(G_OBJECT(priv->proxy), "destroy",
527 G_CALLBACK(proxy_destroy), self);
528
529+ /* Set up the signal handler for watching when status changes. */
530 dbus_g_object_register_marshaller(_status_provider_telepathy_marshal_VOID__UINT_STRING,
531 G_TYPE_NONE,
532 G_TYPE_UINT,
533@@ -163,6 +221,19 @@
534 return;
535 }
536
537+/* Watch to see if the Mission Control comes up on Dbus */
538+static void
539+dbus_namechange (DBusGProxy * proxy, const gchar * name, const gchar * prev, const gchar * new, StatusProviderTelepathy * self)
540+{
541+ g_return_if_fail(name != NULL);
542+ g_return_if_fail(new != NULL);
543+
544+ if (g_strcmp0(name, "org.freedesktop.Telepathy.MissionControl") == 0) {
545+ build_telepathy_proxy(self);
546+ }
547+ return;
548+}
549+
550 static void
551 status_provider_telepathy_dispose (GObject *object)
552 {
553@@ -258,10 +329,11 @@
554 static StatusProviderStatus
555 get_status (StatusProvider * sp)
556 {
557+ g_return_val_if_fail(IS_STATUS_PROVIDER_TELEPATHY(sp), STATUS_PROVIDER_STATUS_DISCONNECTED);
558 StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(sp);
559
560 if (priv->proxy == NULL) {
561- return mc_to_sp_map[MC_STATUS_OFFLINE];
562+ return STATUS_PROVIDER_STATUS_DISCONNECTED;
563 }
564
565 return mc_to_sp_map[priv->mc_status];
566
567=== modified file 'src/status-provider.h'
568--- src/status-provider.h 2009-08-25 04:43:50 +0000
569+++ src/status-provider.h 2009-09-10 17:10:07 +0000
570@@ -42,6 +42,7 @@
571 STATUS_PROVIDER_STATUS_DND,
572 STATUS_PROVIDER_STATUS_INVISIBLE,
573 STATUS_PROVIDER_STATUS_OFFLINE,
574+ STATUS_PROVIDER_STATUS_DISCONNECTED,
575 /* Leave as last */
576 STATUS_PROVIDER_STATUS_LAST
577 }
578
579=== modified file 'src/status-service.c'
580--- src/status-service.c 2009-09-03 19:52:47 +0000
581+++ src/status-service.c 2009-09-10 18:40:49 +0000
582@@ -55,7 +55,8 @@
583 /* STATUS_PROVIDER_STATUS_AWAY, */ N_("Away"),
584 /* STATUS_PROVIDER_STATUS_DND */ N_("Busy"),
585 /* STATUS_PROVIDER_STATUS_INVISIBLE */ N_("Invisible"),
586- /* STATUS_PROVIDER_STATUS_OFFLINE, */ N_("Offline")
587+ /* STATUS_PROVIDER_STATUS_OFFLINE, */ N_("Offline"),
588+ /* STATUS_PROVIDER_STATUS_DISCONNECTED*/ N_("Offline")
589 };
590
591 static const gchar * status_icons[STATUS_PROVIDER_STATUS_LAST] = {
592@@ -63,21 +64,25 @@
593 /* STATUS_PROVIDER_STATUS_AWAY, */ "user-away",
594 /* STATUS_PROVIDER_STATUS_DND, */ "user-busy",
595 /* STATUS_PROVIDER_STATUS_INVISIBLE, */ "user-invisible",
596- /* STATUS_PROVIDER_STATUS_OFFLINE */ "user-offline"
597+ /* STATUS_PROVIDER_STATUS_OFFLINE */ "user-offline",
598+ /* STATUS_PROVIDER_STATUS_DISCONNECTED */"user-offline"
599 };
600
601
602 static DbusmenuMenuitem * root_menuitem = NULL;
603 static DbusmenuMenuitem * status_menuitem = NULL;
604+static DbusmenuMenuitem * status_menuitems[STATUS_PROVIDER_STATUS_LAST] = {0};
605 static GMainLoop * mainloop = NULL;
606 static StatusServiceDbus * dbus_interface = NULL;
607-static StatusProviderStatus global_status = STATUS_PROVIDER_STATUS_OFFLINE;
608+static StatusProviderStatus global_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
609
610 static void
611 status_update (void) {
612 StatusProviderStatus oldglobal = global_status;
613- global_status = STATUS_PROVIDER_STATUS_OFFLINE;
614+ global_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
615
616+ /* Ask everyone what they think the status should be, if
617+ they're more connected, up the global level */
618 int i;
619 for (i = 0; i < STATUS_PROVIDER_CNT; i++) {
620 StatusProviderStatus localstatus = status_provider_get_status(status_providers[i]);
621@@ -86,11 +91,34 @@
622 }
623 }
624
625+ /* If changed */
626 if (global_status != oldglobal) {
627 g_debug("Global status changed to: %s", _(status_strings[global_status]));
628
629+ /* Set the status name on the menu item */
630 dbusmenu_menuitem_property_set(status_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _(status_strings[global_status]));
631+ /* Configure the icon on the panel */
632 status_service_dbus_set_status(dbus_interface, status_icons[global_status]);
633+
634+ /* If we're now disconnected, make setting the statuses
635+ insensitive. */
636+ if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
637+ StatusProviderStatus i;
638+ for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
639+ if (status_menuitems[i] == NULL) continue;
640+ dbusmenu_menuitem_property_set(status_menuitems[i], DBUSMENU_MENUITEM_PROP_SENSITIVE, "false");
641+ }
642+ }
643+
644+ /* If we're now back to a state where we have an IM client
645+ connected then we need to resensitize the items. */
646+ if (oldglobal == STATUS_PROVIDER_STATUS_DISCONNECTED) {
647+ StatusProviderStatus i;
648+ for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
649+ if (status_menuitems[i] == NULL) continue;
650+ dbusmenu_menuitem_property_set(status_menuitems[i], DBUSMENU_MENUITEM_PROP_SENSITIVE, "true");
651+ }
652+ }
653 }
654
655 return;
656@@ -195,14 +223,23 @@
657
658 StatusProviderStatus i;
659 for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
660- DbusmenuMenuitem * mi = dbusmenu_menuitem_new();
661-
662- dbusmenu_menuitem_property_set(mi, "type", DBUSMENU_CLIENT_TYPES_IMAGE);
663- dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, _(status_strings[i]));
664- dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_ICON, status_icons[i]);
665- g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(status_menu_click), GINT_TO_POINTER(i));
666-
667- dbusmenu_menuitem_child_append(status_menuitem, mi);
668+ if (i == STATUS_PROVIDER_STATUS_DISCONNECTED) {
669+ /* We don't want an item for the disconnected status. Users
670+ can't set that value through the menu :) */
671+ continue;
672+ }
673+
674+ status_menuitems[i] = dbusmenu_menuitem_new();
675+
676+ dbusmenu_menuitem_property_set(status_menuitems[i], "type", DBUSMENU_CLIENT_TYPES_IMAGE);
677+ dbusmenu_menuitem_property_set(status_menuitems[i], DBUSMENU_MENUITEM_PROP_LABEL, _(status_strings[i]));
678+ dbusmenu_menuitem_property_set(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ICON, status_icons[i]);
679+ if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
680+ dbusmenu_menuitem_property_set(status_menuitems[i], DBUSMENU_MENUITEM_PROP_SENSITIVE, "false");
681+ }
682+ g_signal_connect(G_OBJECT(status_menuitems[i]), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(status_menu_click), GINT_TO_POINTER(i));
683+
684+ dbusmenu_menuitem_child_append(status_menuitem, status_menuitems[i]);
685
686 g_debug("Built %s", status_strings[i]);
687 }

Subscribers

People subscribed via source and target branches

to all changes: