aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@canonical.com>2009-08-04 00:23:05 +0100
committerTed Gould <ted@canonical.com>2009-08-04 00:23:05 +0100
commita1fa7baf4cdc6b0a29ba2d04e89691e6f1f02b72 (patch)
tree564c261e3d8cacb45e7b2fe36be8c7ef6e8a4c58
parent064740bd411abe73a67a9c75f469f04d8259afdb (diff)
parent475cf3d1bc5ede2ba3e9388edf1b12345ebf5986 (diff)
downloadlibayatana-indicator-a1fa7baf4cdc6b0a29ba2d04e89691e6f1f02b72.tar.gz
libayatana-indicator-a1fa7baf4cdc6b0a29ba2d04e89691e6f1f02b72.tar.bz2
libayatana-indicator-a1fa7baf4cdc6b0a29ba2d04e89691e6f1f02b72.zip
Merging in upstream code to split out libindicate-gtk
-rw-r--r--.bzrignore20
-rw-r--r--Makefile.am1
-rw-r--r--configure.ac29
-rw-r--r--debian/changelog6
-rw-r--r--docs/reference/tmpl/libindicate-unused.sgml9
-rw-r--r--examples/Makefile.am14
-rw-r--r--examples/im-client.c1
-rw-r--r--examples/listen-and-print.c1
-rw-r--r--libindicate-gtk/Makefile.am71
-rw-r--r--libindicate-gtk/indicate-gtk.pc.in14
-rw-r--r--libindicate-gtk/indicator.c74
-rw-r--r--libindicate-gtk/indicator.h44
-rw-r--r--libindicate-gtk/listener.c148
-rw-r--r--libindicate-gtk/listener.h57
-rw-r--r--libindicate/Makefile.am16
-rw-r--r--libindicate/indicator.c74
-rw-r--r--libindicate/indicator.h8
-rw-r--r--libindicate/listener-private.h63
-rw-r--r--libindicate/listener.c94
-rw-r--r--libindicate/listener.h9
-rw-r--r--libindicate/server-marshal.list29
-rw-r--r--libindicate/server.c11
-rw-r--r--libindicate/server.h6
-rw-r--r--src/Makefile.am1
-rw-r--r--src/applet-main.c12
25 files changed, 651 insertions, 161 deletions
diff --git a/.bzrignore b/.bzrignore
index 6e10243..d1781cd 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -79,3 +79,23 @@ test-interests-server4
test-interests-server5
test-thousand-indicators-server
test-thousand-indicators-client
+libindicate_la-server-marshal.lo
+server-marshal.c
+server-marshal.h
+libindicate-gtk.la
+libindicate_gtk_la-indicator.lo
+libindicate_gtk_la-indicator.o
+libindicate_gtk_la-listener.lo
+libindicate_gtk_la-listener.o
+indicate-gtk.pc
+.deps
+.libs
+indicator-applet-*.tar.gz
+docs/reference/tmpl/indicator-message.sgml
+docs/reference/tmpl/indicator-message.sgml.bak
+docs/reference/tmpl/indicator.sgml.bak
+docs/reference/tmpl/libindicate-unused.sgml.bak
+docs/reference/tmpl/listener.sgml
+docs/reference/tmpl/listener.sgml.bak
+docs/reference/tmpl/server.sgml
+docs/reference/tmpl/server.sgml.bak
diff --git a/Makefile.am b/Makefile.am
index ac6fe90..bdd32f4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,6 +2,7 @@
SUBDIRS = \
src \
libindicate \
+ libindicate-gtk \
libindicator \
examples \
tests \
diff --git a/configure.ac b/configure.ac
index 939accd..471512f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7,6 +7,7 @@ AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(indicator-applet, 0.2.0dev)
AM_MAINTAINER_MODE
+m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES])
IT_PROG_INTLTOOL([0.35.0])
AC_ISC_POSIX
@@ -22,7 +23,7 @@ AC_CONFIG_MACRO_DIR([m4])
# Libindicate versioning
###########################
-LIBINDICATE_CURRENT=1
+LIBINDICATE_CURRENT=2
LIBINDICATE_REVISION=0
LIBINDICATE_AGE=0
@@ -31,6 +32,18 @@ AC_SUBST(LIBINDICATE_REVISION)
AC_SUBST(LIBINDICATE_AGE)
###########################
+# Libindicate versioning
+###########################
+
+LIBINDICATEGTK_CURRENT=0
+LIBINDICATEGTK_REVISION=0
+LIBINDICATEGTK_AGE=0
+
+AC_SUBST(LIBINDICATEGTK_CURRENT)
+AC_SUBST(LIBINDICATEGTK_REVISION)
+AC_SUBST(LIBINDICATEGTK_AGE)
+
+###########################
# Dependencies
###########################
@@ -49,17 +62,25 @@ AM_GCONF_SOURCE_2
GLIB_REQUIRED_VERSION=2.18
GIO_REQUIRED_VERSION=2.18
-GDK_PIXBUF_REQUIRED_VERSION=2.12
XML_REQUIRED_VERSION=2.6
PKG_CHECK_MODULES(LIBINDICATE, glib-2.0 >= $GLIB_REQUIRED_VERSION
gio-2.0 >= $GIO_REQUIRED_VERSION
- gdk-pixbuf-2.0 >= $GDK_PIXBUF_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_REQUIRED_VERSION
libxml-2.0 >= $XML_REQUIRED_VERSION)
AC_SUBST(LIBINDICATE_CFLAGS)
AC_SUBST(LIBINDICATE_LIBS)
+GDK_PIXBUF_REQUIRED_VERSION=2.12
+
+PKG_CHECK_MODULES(LIBINDICATEGTK, glib-2.0 >= $GLIB_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
+ gdk-pixbuf-2.0 >= $GDK_PIXBUF_REQUIRED_VERSION
+ gtk+-2.0 >= $GTK_REQUIRED_VERSION
+ dbus-glib-1 >= $DBUS_REQUIRED_VERSION)
+AC_SUBST(LIBINDICATEGTK_CFLAGS)
+AC_SUBST(LIBINDICATEGTK_LIBS)
+
###########################
# GObject Introspection
###########################
@@ -161,6 +182,8 @@ Makefile
src/Makefile
libindicate/Makefile
libindicate/indicate.pc
+libindicate-gtk/Makefile
+libindicate-gtk/indicate-gtk.pc
libindicator/Makefile
libindicator/indicator.pc
examples/Makefile
diff --git a/debian/changelog b/debian/changelog
index a412e6e..c05a0c0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+indicator-applet (0.2.0~bzr309-0ubuntu4~ppa1) UNRELEASED; urgency=low
+
+ * Merging in upstream code to split out libindicate-gtk
+
+ -- Ted Gould <ted@ubuntu.com> Tue, 04 Aug 2009 00:22:33 +0100
+
indicator-applet (0.2.0~bzr309-0ubuntu3) karmic; urgency=low
* Now moving on to Karmic
diff --git a/docs/reference/tmpl/libindicate-unused.sgml b/docs/reference/tmpl/libindicate-unused.sgml
index c3152b1..83a53a7 100644
--- a/docs/reference/tmpl/libindicate-unused.sgml
+++ b/docs/reference/tmpl/libindicate-unused.sgml
@@ -1,3 +1,12 @@
+<!-- ##### FUNCTION indicate_indicator_set_property_icon ##### -->
+<para>
+
+</para>
+
+@indicator:
+@key:
+@data:
+
<!-- ##### FUNCTION indicate_server_new ##### -->
<para>
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 862046e..d6b74c6 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -33,22 +33,28 @@ listen_and_print_SOURCES = \
listen_and_print_CFLAGS = \
-I $(srcdir)/.. \
- $(LIBINDICATE_CFLAGS)
+ $(LIBINDICATE_CFLAGS) \
+ $(LIBINDICATEGTK_CFLAGS)
listen_and_print_LDADD = \
../libindicate/libindicate.la \
- $(LIBINDICATE_LIBS)
+ ../libindicate-gtk/libindicate-gtk.la \
+ $(LIBINDICATE_LIBS) \
+ $(LIBINDICATEGTK_LIBS)
im_client_SOURCES = \
im-client.c
im_client_CFLAGS = \
-I $(srcdir)/.. \
- $(LIBINDICATE_CFLAGS)
+ $(LIBINDICATE_CFLAGS) \
+ $(LIBINDICATEGTK_CFLAGS)
im_client_LDADD = \
../libindicate/libindicate.la \
- $(LIBINDICATE_LIBS)
+ ../libindicate-gtk/libindicate-gtk.la \
+ $(LIBINDICATE_LIBS) \
+ $(LIBINDICATEGTK_LIBS)
show_hide_server_SOURCES = \
show-hide-server.c
diff --git a/examples/im-client.c b/examples/im-client.c
index bf2fbb2..502484d 100644
--- a/examples/im-client.c
+++ b/examples/im-client.c
@@ -22,6 +22,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <glib.h>
#include "libindicate/server.h"
#include "libindicate/indicator-message.h"
+#include "libindicate-gtk/indicator.h"
gchar * patha = "/usr/share/icons/hicolor/16x16/apps/empathy.png";
gchar * pathb = "/usr/share/icons/hicolor/22x22/apps/empathy.png";
diff --git a/examples/listen-and-print.c b/examples/listen-and-print.c
index dcad92b..57cb7be 100644
--- a/examples/listen-and-print.c
+++ b/examples/listen-and-print.c
@@ -21,6 +21,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <glib.h>
#include "libindicate/listener.h"
+#include "libindicate-gtk/listener.h"
static void
show_property_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, gchar * propertydata, gpointer data)
diff --git a/libindicate-gtk/Makefile.am b/libindicate-gtk/Makefile.am
new file mode 100644
index 0000000..7d3206d
--- /dev/null
+++ b/libindicate-gtk/Makefile.am
@@ -0,0 +1,71 @@
+
+INCLUDES= \
+ -DG_LOG_DOMAIN=\"libindicate-gtk\"
+
+EXTRA_DIST = \
+ indicate-gtk.pc.in
+
+lib_LTLIBRARIES = \
+ libindicate-gtk.la
+
+libindicate_gtkincludedir=$(includedir)/libindicate-0.1/libindicate-gtk
+
+indicate_gtk_headers = \
+ indicator.h \
+ listener.h
+
+libindicate_gtkinclude_HEADERS = \
+ $(indicate_gtk_headers)
+
+libindicate_gtk_la_SOURCES = \
+ $(indicate_gtk_headers) \
+ indicator.c \
+ listener.c
+
+libindicate_gtk_la_LDFLAGS = \
+ -version-info $(LIBINDICATEGTK_CURRENT):$(LIBINDICATEGTK_REVISION):$(LIBINDICATEGTK_AGE) \
+ -no-undefined \
+ -export-symbols-regex "^[^_d].*"
+
+libindicate_gtk_la_CFLAGS = \
+ -I $(srcdir)/.. \
+ $(LIBINDICATEGTK_CFLAGS)
+
+libindicate_gtk_la_LIBADD = \
+ $(LIBINDICATEGTK_LIBS)
+
+pkgconfig_DATA = indicate-gtk.pc
+pkgconfigdir = $(libdir)/pkgconfig
+
+if USE_GIR
+
+gobjectintrospection_gir_DATA = \
+ Indicate-gtk-0.1.gir
+gobjectintrospection_girdir = $(datadir)/gir
+
+gobjectintrospection_type_DATA = \
+ Indicate-gtk-0.1.typelib
+gobjectintrospection_typedir = $(libdir)/girepository
+
+irscanner_headers = $(patsubst %,$(srcdir)/%,$(indicate_headers))
+Indicate-gtk-0.1.gir: $(irscanner_headers)
+ $(G_IR_SCANNER) \
+ -v --namespace IndicateGtk \
+ --nsversion=0.1 \
+ --add-include-path=$(srcdir) \
+ --include=GObject-2.0 \
+ --include=GLib-2.0 \
+ --include=GdkPixbuf-2.0 \
+ --library=indicate --pkg indicate \
+ --output Indicate-gtk-0.1.gir $(irscanner_headers)
+
+Indicate-gtk-0.1.typelib: Indicate-gtk-0.1.gir
+ $(G_IR_COMPILER) \
+ --includedir=$(srcdir) Indicate-gtk-0.1.gir \
+ -o Indicate-gtk-0.1.typelib
+
+DISTCLEANFILES = \
+ Indicate-gtk-0.1.gir \
+ Indicate-gtk-0.1.typelib
+
+endif
diff --git a/libindicate-gtk/indicate-gtk.pc.in b/libindicate-gtk/indicate-gtk.pc.in
new file mode 100644
index 0000000..28e3c81
--- /dev/null
+++ b/libindicate-gtk/indicate-gtk.pc.in
@@ -0,0 +1,14 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+bindir=@bindir@
+includedir=@includedir@
+
+Cflags: -I${includedir}/libindicate-0.1
+Requires: gtk+-2.0 indicate
+Libs: -L${libdir} -lindicate-gtk
+
+Name: libindicate-gtk
+Description: libindicate GTK stuff.
+Version: @VERSION@
+
diff --git a/libindicate-gtk/indicator.c b/libindicate-gtk/indicator.c
new file mode 100644
index 0000000..a575849
--- /dev/null
+++ b/libindicate-gtk/indicator.c
@@ -0,0 +1,74 @@
+/*
+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/>
+*/
+
+#include "indicator.h"
+
+/**
+ indicate_indicator_set_property_icon:
+ @indicator: a #IndicateIndicator to act on
+ @key: name of the property
+ @data: icon to set property with
+
+ This is a helper function that wraps around #indicate_indicator_set_property
+ but takes an #GdkPixbuf parameter. It then takes the @data
+ parameter, turns it into a PNG, base64 encodes it and then
+ uses that data to call #indicate_indicator_set_property.
+*/
+void
+indicate_indicator_set_property_icon (IndicateIndicator * indicator, const gchar * key, const GdkPixbuf * data)
+{
+ if (!GDK_IS_PIXBUF(data)) {
+ g_warning("Invalide GdkPixbuf");
+ return;
+ }
+
+ GError * error = NULL;
+ gchar * png_data;
+ gsize png_data_len;
+
+ if (!gdk_pixbuf_save_to_buffer((GdkPixbuf *)data, &png_data, &png_data_len, "png", &error, NULL)) {
+ if (error == NULL) {
+ g_warning("Unable to create pixbuf data stream: %d", png_data_len);
+ } else {
+ g_warning("Unable to create pixbuf data stream: %s", error->message);
+ g_error_free(error);
+ error = NULL;
+ }
+
+ return;
+ }
+
+ gchar * prop_str = g_base64_encode((guchar *)png_data, png_data_len);
+ indicate_indicator_set_property(indicator, key, prop_str);
+
+ g_free(prop_str);
+ g_free(png_data);
+
+ return;
+}
diff --git a/libindicate-gtk/indicator.h b/libindicate-gtk/indicator.h
new file mode 100644
index 0000000..43e264f
--- /dev/null
+++ b/libindicate-gtk/indicator.h
@@ -0,0 +1,44 @@
+/*
+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/>
+*/
+
+#ifndef INDICATE_GTK_INDICATOR_H_INCLUDED__
+#define INDICATE_GTK_INDICATOR_H_INCLUDED__ 1
+
+#include <glib.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include "libindicate/indicator.h"
+
+G_BEGIN_DECLS
+
+/* Properties handling */
+void indicate_indicator_set_property_icon (IndicateIndicator * indicator, const gchar * key, const GdkPixbuf * data);
+
+G_END_DECLS
+
+#endif /* INDICATE_GTK_INDICATOR_H_INCLUDED__ */
diff --git a/libindicate-gtk/listener.c b/libindicate-gtk/listener.c
new file mode 100644
index 0000000..dceb05b
--- /dev/null
+++ b/libindicate-gtk/listener.c
@@ -0,0 +1,148 @@
+/*
+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/>
+*/
+
+#include "listener.h"
+#include <dbus/dbus-glib-bindings.h>
+
+#include "../libindicate/dbus-indicate-client.h"
+#include "../libindicate/listener-private.h"
+
+typedef enum _get_property_type get_property_type;
+enum _get_property_type {
+ PROPERTY_TYPE_STRING,
+ PROPERTY_TYPE_TIME,
+ PROPERTY_TYPE_ICON
+};
+
+typedef struct _get_property_t get_property_t;
+struct _get_property_t {
+ GCallback cb;
+ gpointer data;
+ IndicateListener * listener;
+ IndicateListenerServer * server;
+ IndicateListenerIndicator * indicator;
+ gchar * property;
+ get_property_type type;
+};
+
+static void
+get_property_cb (DBusGProxy *proxy, char * OUT_value, GError *error, gpointer userdata)
+{
+ get_property_t * get_property_data = (get_property_t *)userdata;
+
+ if (error != NULL) {
+ g_warning("Unable to get property data: %s", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ switch (get_property_data->type) {
+ case PROPERTY_TYPE_STRING: {
+ indicate_listener_get_property_cb cb = (indicate_listener_get_property_cb)get_property_data->cb;
+ cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, OUT_value, get_property_data->data);
+ break;
+ }
+ case PROPERTY_TYPE_ICON: {
+ indicate_listener_get_property_icon_cb cb = (indicate_listener_get_property_icon_cb)get_property_data->cb;
+
+ /* There is no icon */
+ if (OUT_value == NULL || OUT_value[0] == '\0') {
+ break;
+ }
+
+ gsize length = 0;
+ guchar * icondata = g_base64_decode(OUT_value, &length);
+
+ GInputStream * input = g_memory_input_stream_new_from_data(icondata, length, NULL);
+ if (input == NULL) {
+ g_warning("Cound not create input stream from icon property data");
+ g_free(icondata);
+ break;
+ }
+
+ GError * error = NULL;
+ GdkPixbuf * icon = gdk_pixbuf_new_from_stream(input, NULL, &error);
+ if (icon != NULL) {
+ cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, icon, get_property_data->data);
+ }
+
+ if (error != NULL) {
+ g_warning("Unable to build Pixbuf from icon data: %s", error->message);
+ g_error_free(error);
+ }
+
+ error = NULL;
+ g_input_stream_close(input, NULL, &error);
+ if (error != NULL) {
+ g_warning("Unable to close input stream: %s", error->message);
+ g_error_free(error);
+ }
+ g_free(icondata);
+ break;
+ }
+ case PROPERTY_TYPE_TIME: {
+ indicate_listener_get_property_time_cb cb = (indicate_listener_get_property_time_cb)get_property_data->cb;
+ GTimeVal time;
+ if (g_time_val_from_iso8601(OUT_value, &time)) {
+ cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, &time, get_property_data->data);
+ }
+ break;
+ }
+ }
+
+ g_free(get_property_data->property);
+ g_free(get_property_data);
+
+ return;
+};
+
+static void
+get_property_helper (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, GCallback callback, gpointer data, get_property_type prop_type)
+{
+ /* g_debug("get_property_helper: %s %d", property, prop_type); */
+ /* TODO: Do we need to somehow refcount the server/indicator while we're waiting on this? */
+ get_property_t * get_property_data = g_new(get_property_t, 1);
+ get_property_data->cb = callback;
+ get_property_data->data = data;
+ get_property_data->listener = listener;
+ get_property_data->server = server;
+ get_property_data->indicator = indicator;
+ get_property_data->property = g_strdup(property);
+ get_property_data->type = prop_type;
+
+ org_freedesktop_indicator_get_indicator_property_async (server->proxy , INDICATE_LISTENER_INDICATOR_ID(indicator), property, get_property_cb, get_property_data);
+ return;
+}
+
+void
+indicate_listener_get_property_icon (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, indicate_listener_get_property_icon_cb callback, gpointer data)
+{
+ return get_property_helper(listener, server, indicator, property, G_CALLBACK(callback), data, PROPERTY_TYPE_ICON);
+}
+
diff --git a/libindicate-gtk/listener.h b/libindicate-gtk/listener.h
new file mode 100644
index 0000000..cedc9a3
--- /dev/null
+++ b/libindicate-gtk/listener.h
@@ -0,0 +1,57 @@
+/*
+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/>
+*/
+
+#ifndef INDICATE_GTK_LISTENER_H_INCLUDED__
+#define INDICATE_GTK_LISTENER_H_INCLUDED__ 1
+
+#include <glib.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+#include "libindicate/listener.h"
+
+G_BEGIN_DECLS
+
+typedef void (*indicate_listener_get_property_icon_cb) (IndicateListener * listener,
+ IndicateListenerServer * server,
+ IndicateListenerIndicator * indicator,
+ gchar * property,
+ GdkPixbuf * propertydata,
+ gpointer data);
+
+void indicate_listener_get_property_icon (IndicateListener * listener,
+ IndicateListenerServer * server,
+ IndicateListenerIndicator * indicator,
+ gchar * property,
+ indicate_listener_get_property_icon_cb callback,
+ gpointer data);
+
+G_END_DECLS
+
+#endif /* INDICATE_GTK_LISTENER_H_INCLUDED__ */
+
diff --git a/libindicate/Makefile.am b/libindicate/Makefile.am
index 3ad6247..d4746fb 100644
--- a/libindicate/Makefile.am
+++ b/libindicate/Makefile.am
@@ -9,6 +9,7 @@ EXTRA_DIST = \
indicate-interface.xml \
indicate-listener.xml \
listener-marshal.list \
+ server-marshal.list \
indicate.pc.in
BUILT_SOURCES = \
@@ -18,6 +19,8 @@ BUILT_SOURCES = \
dbus-listener-client.h \
listener-marshal.c \
listener-marshal.h \
+ server-marshal.c \
+ server-marshal.h \
$(ENUM_FILE).h \
$(ENUM_FILE).c
@@ -45,9 +48,12 @@ libindicate_la_SOURCES = \
dbus-listener-client.h \
indicate-enum-types.c \
server.c \
+ server-marshal.c \
+ server-marshal.h \
listener.c \
listener-marshal.c \
listener-marshal.h \
+ listener-private.h \
indicator.c \
indicator-message.c \
interests-priv.h
@@ -101,6 +107,16 @@ listener-marshal.c: $(srcdir)/listener-marshal.list
--prefix=_indicate_listener_marshal $(srcdir)/listener-marshal.list \
> listener-marshal.c
+server-marshal.h: $(srcdir)/server-marshal.list
+ glib-genmarshal --header \
+ --prefix=_indicate_server_marshal $(srcdir)/server-marshal.list \
+ > server-marshal.h
+
+server-marshal.c: $(srcdir)/server-marshal.list
+ glib-genmarshal --body \
+ --prefix=_indicate_server_marshal $(srcdir)/server-marshal.list \
+ > server-marshal.c
+
pkgconfig_DATA = indicate.pc
pkgconfigdir = $(libdir)/pkgconfig
diff --git a/libindicate/indicator.c b/libindicate/indicator.c
index 76eb616..cb257eb 100644
--- a/libindicate/indicator.c
+++ b/libindicate/indicator.c
@@ -204,6 +204,36 @@ indicate_indicator_new (void)
}
/**
+ indicate_indicator_new_with_server:
+ @server: The server that should be associated with this indicator.
+
+ Builds a new indicator object using g_object_new() and sets
+ the server to the specified server. Also, adds a reference
+ to the server.
+
+ Return value: A pointer to a new #IndicateIndicator object.
+*/
+IndicateIndicator *
+indicate_indicator_new_with_server (IndicateServer * server)
+{
+ g_return_val_if_fail(server != NULL, NULL);
+
+ IndicateIndicator * indicator = g_object_new(INDICATE_TYPE_INDICATOR, NULL);
+
+ IndicateIndicatorPrivate * priv = INDICATE_INDICATOR_GET_PRIVATE(indicator);
+ if (priv->server != NULL) {
+ g_object_unref(priv->server);
+ priv->server = NULL;
+ }
+
+ priv->server = server;
+ g_object_ref(priv->server);
+
+ return indicator;
+}
+
+
+/**
indicate_indicator_show:
@indicator: a #IndicateIndicator to act on
@@ -351,50 +381,6 @@ indicate_indicator_set_property (IndicateIndicator * indicator, const gchar * ke
}
/**
- indicate_indicator_set_property_icon:
- @indicator: a #IndicateIndicator to act on
- @key: name of the property
- @data: icon to set property with
-
- This is a helper function that wraps around #indicate_indicator_set_property
- but takes an #GdkPixbuf parameter. It then takes the @data
- parameter, turns it into a PNG, base64 encodes it and then
- uses that data to call #indicate_indicator_set_property.
-*/
-void
-indicate_indicator_set_property_icon (IndicateIndicator * indicator, const gchar * key, const GdkPixbuf * data)
-{
- if (!GDK_IS_PIXBUF(data)) {
- g_warning("Invalide GdkPixbuf");
- return;
- }
-
- GError * error = NULL;
- gchar * png_data;
- gsize png_data_len;
-
- if (!gdk_pixbuf_save_to_buffer((GdkPixbuf *)data, &png_data, &png_data_len, "png", &error, NULL)) {
- if (error == NULL) {
- g_warning("Unable to create pixbuf data stream: %d", png_data_len);
- } else {
- g_warning("Unable to create pixbuf data stream: %s", error->message);
- g_error_free(error);
- error = NULL;
- }
-
- return;
- }
-
- gchar * prop_str = g_base64_encode((guchar *)png_data, png_data_len);
- indicate_indicator_set_property(indicator, key, prop_str);
-
- g_free(prop_str);
- g_free(png_data);
-
- return;
-}
-
-/**
indicate_indicator_set_property_time:
@indicator: a #IndicateIndicator to act on
@key: name of the property
diff --git a/libindicate/indicator.h b/libindicate/indicator.h
index 3e2a803..20b998d 100644
--- a/libindicate/indicator.h
+++ b/libindicate/indicator.h
@@ -33,8 +33,6 @@ License version 3 and version 2.1 along with this program. If not, see
#include <glib.h>
#include <glib-object.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
G_BEGIN_DECLS
/* Boilerplate */
@@ -68,6 +66,8 @@ struct _IndicateIndicator {
GObject parent;
};
+#include "server.h"
+
/**
IndicateIndicatorClass:
@parent_class: Parent class #GObjectClass.
@@ -109,7 +109,9 @@ struct _IndicateIndicatorClass {
GType indicate_indicator_get_type(void) G_GNUC_CONST;
+/* New Indicator Functions */
IndicateIndicator * indicate_indicator_new (void);
+IndicateIndicator * indicate_indicator_new_with_server (IndicateServer * server);
/* Show and hide this indicator */
void indicate_indicator_show (IndicateIndicator * indicator);
@@ -128,7 +130,6 @@ void indicate_indicator_user_display (IndicateIndicator * indicator);
/* Properties handling */
void indicate_indicator_set_property (IndicateIndicator * indicator, const gchar * key, const gchar * data);
-void indicate_indicator_set_property_icon (IndicateIndicator * indicator, const gchar * key, const GdkPixbuf * data);
void indicate_indicator_set_property_time (IndicateIndicator * indicator, const gchar * key, GTimeVal * time);
const gchar * indicate_indicator_get_property (IndicateIndicator * indicator, const gchar * key);
GPtrArray * indicate_indicator_list_properties (IndicateIndicator * indicator);
@@ -167,4 +168,3 @@ GPtrArray * indicate_indicator_list_properties (IndicateIndicator * indicator);
G_END_DECLS
#endif /* INDICATE_INDICATOR_H_INCLUDED__ */
-
diff --git a/libindicate/listener-private.h b/libindicate/listener-private.h
new file mode 100644
index 0000000..ea1b108
--- /dev/null
+++ b/libindicate/listener-private.h
@@ -0,0 +1,63 @@
+/*
+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/>
+*/
+
+#ifndef INDICATE_LISTENER_PRIVATE_H__
+#define INDICATE_LISTENER_PRIVATE_H__ 1
+
+struct _IndicateListenerServer {
+ gchar * name;
+ DBusGProxy * proxy;
+ DBusGConnection * connection;
+ gboolean interests[INDICATE_INTEREST_LAST];
+};
+
+struct _IndicateListenerIndicator {
+ guint id;
+};
+
+typedef struct _IndicateListenerPrivate IndicateListenerPrivate;
+struct _IndicateListenerPrivate
+{
+ DBusGConnection * session_bus;
+ DBusGConnection * system_bus;
+
+ DBusGProxy * dbus_proxy_session;
+ DBusGProxy * dbus_proxy_system;
+
+ GList * proxies_working;
+ GList * proxies_possible;
+
+ GArray * proxy_todo;
+ guint todo_idle;
+};
+
+#define INDICATE_LISTENER_GET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATE_TYPE_LISTENER, IndicateListenerPrivate))
+
+#endif /* INDICATE_LISTENER_PRIVATE_H__ */
diff --git a/libindicate/listener.c b/libindicate/listener.c
index bd3639d..48ad616 100644
--- a/libindicate/listener.c
+++ b/libindicate/listener.c
@@ -54,35 +54,7 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
-struct _IndicateListenerServer {
- gchar * name;
- DBusGProxy * proxy;
- DBusGConnection * connection;
- gboolean interests[INDICATE_INTEREST_LAST];
-};
-
-struct _IndicateListenerIndicator {
- guint id;
-};
-
-typedef struct _IndicateListenerPrivate IndicateListenerPrivate;
-struct _IndicateListenerPrivate
-{
- DBusGConnection * session_bus;
- DBusGConnection * system_bus;
-
- DBusGProxy * dbus_proxy_session;
- DBusGProxy * dbus_proxy_system;
-
- GList * proxies_working;
- GList * proxies_possible;
-
- GArray * proxy_todo;
- guint todo_idle;
-};
-
-#define INDICATE_LISTENER_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATE_TYPE_LISTENER, IndicateListenerPrivate))
+#include "listener-private.h"
typedef struct {
DBusGProxy * proxy;
@@ -277,8 +249,19 @@ indicate_listener_init (IndicateListener * listener)
static void
indicate_listener_finalize (GObject * obj)
{
- /* IndicateListener * listener = INDICATE_LISTENER(obj); */
-
+ IndicateListener * listener = INDICATE_LISTENER(obj);
+ IndicateListenerPrivate * priv = INDICATE_LISTENER_GET_PRIVATE(listener);
+
+ if (priv->todo_idle != 0) {
+ g_idle_remove_by_data(obj);
+ }
+ /* Hack: proxy_struct_destroy() lacks a user_data parameter, but since the
+ * caller is responsible for handling params on the stack, it works
+ */
+ g_list_foreach(priv->proxies_possible, (GFunc)proxy_struct_destroy, NULL);
+ g_list_free(priv->proxies_possible);
+ g_list_foreach(priv->proxies_working, (GFunc)proxy_struct_destroy, NULL);
+ g_list_free(priv->proxies_working);
G_OBJECT_CLASS (indicate_listener_parent_class)->finalize (obj);
return;
}
@@ -286,8 +269,6 @@ indicate_listener_finalize (GObject * obj)
IndicateListener *
indicate_listener_new (void)
{
- g_warning("Creating a new listener is generally discouraged, please use indicate_listener_ref_default");
-
IndicateListener * listener;
listener = g_object_new(INDICATE_TYPE_LISTENER, NULL);
return listener;
@@ -709,8 +690,7 @@ proxy_indicators_free (gpointer data)
typedef enum _get_property_type get_property_type;
enum _get_property_type {
PROPERTY_TYPE_STRING,
- PROPERTY_TYPE_TIME,
- PROPERTY_TYPE_ICON
+ PROPERTY_TYPE_TIME
};
typedef struct _get_property_t get_property_t;
@@ -741,44 +721,6 @@ get_property_cb (DBusGProxy *proxy, char * OUT_value, GError *error, gpointer us
cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, OUT_value, get_property_data->data);
break;
}
- case PROPERTY_TYPE_ICON: {
- indicate_listener_get_property_icon_cb cb = (indicate_listener_get_property_icon_cb)get_property_data->cb;
-
- /* There is no icon */
- if (OUT_value == NULL || OUT_value[0] == '\0') {
- break;
- }
-
- gsize length = 0;
- guchar * icondata = g_base64_decode(OUT_value, &length);
-
- GInputStream * input = g_memory_input_stream_new_from_data(icondata, length, NULL);
- if (input == NULL) {
- g_warning("Cound not create input stream from icon property data");
- g_free(icondata);
- break;
- }
-
- GError * error = NULL;
- GdkPixbuf * icon = gdk_pixbuf_new_from_stream(input, NULL, &error);
- if (icon != NULL) {
- cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, icon, get_property_data->data);
- }
-
- if (error != NULL) {
- g_warning("Unable to build Pixbuf from icon data: %s", error->message);
- g_error_free(error);
- }
-
- error = NULL;
- g_input_stream_close(input, NULL, &error);
- if (error != NULL) {
- g_warning("Unable to close input stream: %s", error->message);
- g_error_free(error);
- }
- g_free(icondata);
- break;
- }
case PROPERTY_TYPE_TIME: {
indicate_listener_get_property_time_cb cb = (indicate_listener_get_property_time_cb)get_property_data->cb;
GTimeVal time;
@@ -825,12 +767,6 @@ indicate_listener_get_property_time (IndicateListener * listener, IndicateListen
return get_property_helper(listener, server, indicator, property, G_CALLBACK(callback), data, PROPERTY_TYPE_TIME);
}
-void
-indicate_listener_get_property_icon (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, indicate_listener_get_property_icon_cb callback, gpointer data)
-{
- return get_property_helper(listener, server, indicator, property, G_CALLBACK(callback), data, PROPERTY_TYPE_ICON);
-}
-
gboolean
_indicate_listener_get_indicator_servers (IndicateListener * listener, GList * servers)
{
diff --git a/libindicate/listener.h b/libindicate/listener.h
index 5bfd298..37cda03 100644
--- a/libindicate/listener.h
+++ b/libindicate/listener.h
@@ -33,8 +33,6 @@ License version 3 and version 2.1 along with this program. If not, see
#include <glib.h>
#include <glib-object.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
#include "indicator.h"
#include "server.h"
#include "interests.h"
@@ -88,7 +86,6 @@ GType indicate_listener_get_type (void) G_GNUC_CONST;
typedef void (*indicate_listener_get_property_cb) (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, gchar * propertydata, gpointer data);
typedef void (*indicate_listener_get_property_time_cb) (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, GTimeVal * propertydata, gpointer data);
-typedef void (*indicate_listener_get_property_icon_cb) (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, GdkPixbuf * propertydata, gpointer data);
typedef void (*indicate_listener_get_server_property_cb) (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data);
/* Create a new listener */
@@ -106,12 +103,6 @@ void indicate_listener_get_property_time (IndicateListener * l
gchar * property,
indicate_listener_get_property_time_cb callback,
gpointer data);
-void indicate_listener_get_property_icon (IndicateListener * listener,
- IndicateListenerServer * server,
- IndicateListenerIndicator * indicator,
- gchar * property,
- indicate_listener_get_property_icon_cb callback,
- gpointer data);
void indicate_listener_display (IndicateListener * listener,
IndicateListenerServer * server,
IndicateListenerIndicator * indicator);
diff --git a/libindicate/server-marshal.list b/libindicate/server-marshal.list
new file mode 100644
index 0000000..540f0fe
--- /dev/null
+++ b/libindicate/server-marshal.list
@@ -0,0 +1,29 @@
+# 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/>
+#
+# IndicatorAdded
+VOID:UINT,STRING
diff --git a/libindicate/server.c b/libindicate/server.c
index cd8b33a..a3d3be8 100644
--- a/libindicate/server.c
+++ b/libindicate/server.c
@@ -29,6 +29,7 @@ License version 3 and version 2.1 along with this program. If not, see
#include "server.h"
#include "interests-priv.h"
+#include "server-marshal.h"
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-lowlevel.h>
@@ -179,7 +180,7 @@ indicate_server_class_init (IndicateServerClass * class)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (IndicateServerClass, indicator_added),
NULL, NULL,
- g_cclosure_marshal_VOID__UINT_POINTER,
+ _indicate_server_marshal_VOID__UINT_STRING,
G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING);
/**
IndicateServer::indicator-removed:
@@ -197,7 +198,7 @@ indicate_server_class_init (IndicateServerClass * class)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (IndicateServerClass, indicator_removed),
NULL, NULL,
- g_cclosure_marshal_VOID__UINT_POINTER,
+ _indicate_server_marshal_VOID__UINT_STRING,
G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING);
/**
IndicateServer::indicator-modified:
@@ -215,7 +216,7 @@ indicate_server_class_init (IndicateServerClass * class)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (IndicateServerClass, indicator_modified),
NULL, NULL,
- g_cclosure_marshal_VOID__UINT_POINTER,
+ _indicate_server_marshal_VOID__UINT_STRING,
G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING);
/**
IndicateServer::server-show:
@@ -231,7 +232,7 @@ indicate_server_class_init (IndicateServerClass * class)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (IndicateServerClass, server_show),
NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
+ g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
/**
IndicateServer::server-hide:
@@ -246,7 +247,7 @@ indicate_server_class_init (IndicateServerClass * class)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (IndicateServerClass, server_hide),
NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
+ g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
/**
IndicateServer::server-display:
diff --git a/libindicate/server.h b/libindicate/server.h
index 2a300e2..cff76c4 100644
--- a/libindicate/server.h
+++ b/libindicate/server.h
@@ -33,7 +33,6 @@ License version 3 and version 2.1 along with this program. If not, see
#include <glib.h>
#include <glib-object.h>
-#include "indicator.h"
#include "interests.h"
G_BEGIN_DECLS
@@ -72,6 +71,8 @@ struct _IndicateServer {
GObject parent;
};
+#include "indicator.h"
+
/**
IndicateServerClass:
@parent: Parent Class
@@ -151,9 +152,6 @@ struct _IndicateServerClass {
GType indicate_server_get_type (void) G_GNUC_CONST;
-/* Create a new server */
-IndicateServer * indicate_server_new (void);
-
/* Sets the object. By default this is /org/freedesktop/indicators */
void indicate_server_set_dbus_object (const gchar * obj);
diff --git a/src/Makefile.am b/src/Makefile.am
index 02b70c1..97af739 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -6,6 +6,7 @@ indicator_applet_CFLAGS = \
-DG_LOG_DOMAIN=\""Indicator-Applet"\" \
-DDATADIR=\""$(datadir)"\" \
-DINDICATOR_DIR=\""$(libdir)/indicators/2"\" \
+ -I$(srcdir)/.. \
$(APPLET_CFLAGS)
indicator_applet_SOURCES = \
diff --git a/src/applet-main.c b/src/applet-main.c
index feb1b4d..5af2763 100644
--- a/src/applet-main.c
+++ b/src/applet-main.c
@@ -62,16 +62,10 @@ load_module (const gchar * name, GtkWidget * menu)
g_debug("Looking at Module: %s", name);
g_return_val_if_fail(name != NULL, FALSE);
- guint suffix_len = strlen(G_MODULE_SUFFIX);
- guint name_len = strlen(name);
-
- g_return_val_if_fail(name_len > suffix_len, FALSE);
-
- int i;
- for (i = 0; i < suffix_len; i++) {
- if (name[(name_len - suffix_len) + i] != (G_MODULE_SUFFIX)[i])
- return FALSE;
+ if (!g_str_has_suffix(name, G_MODULE_SUFFIX)) {
+ return FALSE;
}
+
g_debug("Loading Module: %s", name);
gchar * fullpath = g_build_filename(INDICATOR_DIR, name, NULL);