diff options
Diffstat (limited to 'libindicate')
-rw-r--r-- | libindicate/Makefile.am | 16 | ||||
-rw-r--r-- | libindicate/indicator.c | 74 | ||||
-rw-r--r-- | libindicate/indicator.h | 8 | ||||
-rw-r--r-- | libindicate/listener-private.h | 63 | ||||
-rw-r--r-- | libindicate/listener.c | 94 | ||||
-rw-r--r-- | libindicate/listener.h | 9 | ||||
-rw-r--r-- | libindicate/server-marshal.list | 29 | ||||
-rw-r--r-- | libindicate/server.c | 11 | ||||
-rw-r--r-- | libindicate/server.h | 6 |
9 files changed, 165 insertions, 145 deletions
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); |