aboutsummaryrefslogtreecommitdiff
path: root/libindicate
diff options
context:
space:
mode:
Diffstat (limited to 'libindicate')
-rw-r--r--libindicate/Makefile.am1
-rw-r--r--libindicate/indicate-listener.xml41
-rw-r--r--libindicate/listener.c16
3 files changed, 54 insertions, 4 deletions
diff --git a/libindicate/Makefile.am b/libindicate/Makefile.am
index fdbda8a..5d50352 100644
--- a/libindicate/Makefile.am
+++ b/libindicate/Makefile.am
@@ -4,6 +4,7 @@ INCLUDES= \
EXTRA_DIST = \
indicate-interface.xml \
+ indicate-listener.xml \
listener-marshal.list \
indicate.pc.in
diff --git a/libindicate/indicate-listener.xml b/libindicate/indicate-listener.xml
new file mode 100644
index 0000000..c834489
--- /dev/null
+++ b/libindicate/indicate-listener.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+A library to allow applictions to provide simple indications of
+information to be displayed to users of the application through the
+interface shell.
+
+Copyright 2009 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@canonical.com>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of either or both of the following licenses:
+
+1) the GNU Lesser General Public License version 3, as published by the
+Free Software Foundation; and/or
+2) the GNU Lesser General Public License version 2.1, as published by
+the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
+PURPOSE. See the applicable version of the GNU Lesser General Public
+License for more details.
+
+You should have received a copy of both the GNU Lesser General Public
+License version 3 and version 2.1 along with this program. If not, see
+<http://www.gnu.org/licenses/>
+-->
+<node name="/">
+ <interface name="org.freedesktop.indicator.listener">
+
+<!-- Functions -->
+ <method name="GetIndicatorServers">
+ <arg type="as" name="server_ids" direction="out" />
+ </method>
+
+<!-- End of interesting stuff -->
+
+ </interface>
+</node>
diff --git a/libindicate/listener.c b/libindicate/listener.c
index d8926f1..6feb6d7 100644
--- a/libindicate/listener.c
+++ b/libindicate/listener.c
@@ -81,6 +81,7 @@ typedef struct {
typedef struct {
DBusGConnection * bus;
gchar * name;
+ gboolean startup;
} proxy_todo_t;
G_DEFINE_TYPE (IndicateListener, indicate_listener, G_TYPE_OBJECT);
@@ -90,7 +91,7 @@ static void indicate_listener_finalize (GObject * obj);
static void dbus_owner_change (DBusGProxy * proxy, const gchar * name, const gchar * prev, const gchar * new, IndicateListener * listener);
static void proxy_struct_destroy (gpointer data);
static void build_todo_list_cb (DBusGProxy * proxy, char ** names, GError * error, void * data);
-static void todo_list_add (const gchar * name, DBusGProxy * proxy, IndicateListener * listener);
+static void todo_list_add (const gchar * name, DBusGProxy * proxy, IndicateListener * listener, gboolean startup);
static gboolean todo_idle (gpointer data);
void get_type_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * type, gpointer data);
static void proxy_server_added (DBusGProxy * proxy, const gchar * type, proxy_t * proxyt);
@@ -286,7 +287,7 @@ dbus_owner_change (DBusGProxy * proxy, const gchar * name, const gchar * prev, c
/* g_debug("Name change on %s bus: '%s' from '%s' to '%s'", bus_name, name, prev, new); */
if (prev != NULL && prev[0] == '\0') {
- todo_list_add(name, proxy, listener);
+ todo_list_add(name, proxy, listener, false);
}
if (new != NULL && new[0] == '\0') {
proxy_t * proxyt;
@@ -369,14 +370,14 @@ build_todo_list_cb (DBusGProxy * proxy, char ** names, GError * error, void * da
guint i = 0;
for (i = 0; names[i] != NULL; i++) {
- todo_list_add(names[i], proxy, listener);
+ todo_list_add(names[i], proxy, listener, true);
}
return;
}
static void
-todo_list_add (const gchar * name, DBusGProxy * proxy, IndicateListener * listener)
+todo_list_add (const gchar * name, DBusGProxy * proxy, IndicateListener * listener, gboolean startup)
{
if (name == NULL || name[0] != ':') {
return;
@@ -398,6 +399,7 @@ todo_list_add (const gchar * name, DBusGProxy * proxy, IndicateListener * listen
proxy_todo_t todo;
todo.name = g_strdup(name);
todo.bus = bus;
+ todo.startup = startup;
g_array_append_val(priv->proxy_todo, todo);
@@ -455,6 +457,12 @@ todo_idle (gpointer data)
g_hash_table_insert(priv->proxies_possible, proxyt->name, proxyt);
+ /* I think that we need to have this as there is a race
+ * condition here. If someone comes on the bus and we get
+ * that message, but before we set up the handler for the ServerShow
+ * signal it gets sent, we wouldn't get it. So then we would
+ * miss an indicator server coming on the bus. I'd like to not
+ * generate a warning in every app with DBus though. */
indicate_listener_server_get_type(listener, (IndicateListenerServer *)proxyt->name, get_type_cb, proxyt);
return TRUE;