From 7532947d4aabdee70733903cdd861a7c305ca987 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 10:09:08 -0600 Subject: Migrating over to the libindicator 0.3.0 API. --- src/indicator-custom.c | 116 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 97 insertions(+), 19 deletions(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index d9763ea..8528a52 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -1,42 +1,120 @@ +#include +#include + #include +#include #include #include "dbus-shared.h" + +#define INDICATOR_CUSTOM_TYPE (indicator_custom_get_type ()) +#define INDICATOR_CUSTOM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INDICATOR_CUSTOM_TYPE, IndicatorCustom)) +#define INDICATOR_CUSTOM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INDICATOR_CUSTOM_TYPE, IndicatorCustomClass)) +#define IS_INDICATOR_CUSTOM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INDICATOR_CUSTOM_TYPE)) +#define IS_INDICATOR_CUSTOM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INDICATOR_CUSTOM_TYPE)) +#define INDICATOR_CUSTOM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), INDICATOR_CUSTOM_TYPE, IndicatorCustomClass)) + +typedef struct _IndicatorCustom IndicatorCustom; +typedef struct _IndicatorCustomClass IndicatorCustomClass; + +struct _IndicatorCustomClass { + IndicatorObjectClass parent_class; +}; + +struct _IndicatorCustom { + IndicatorObject parent; +}; + +GType indicator_custom_get_type (void); + INDICATOR_SET_VERSION -INDICATOR_SET_NAME("indicator-custom") +INDICATOR_SET_TYPE(INDICATOR_CUSTOM_TYPE) -IndicatorServiceManager * sm = NULL; -void -connected (IndicatorServiceManager * sm, gboolean connected, gpointer not_used) +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +typedef struct _IndicatorCustomPrivate IndicatorCustomPrivate; + +struct _IndicatorCustomPrivate { + IndicatorServiceManager * sm; +}; + +#define INDICATOR_CUSTOM_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_CUSTOM_TYPE, IndicatorCustomPrivate)) + +static void indicator_custom_class_init (IndicatorCustomClass *klass); +static void indicator_custom_init (IndicatorCustom *self); +static void indicator_custom_dispose (GObject *object); +static void indicator_custom_finalize (GObject *object); +GList * get_entries (IndicatorObject * io); +void connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * custom); + +G_DEFINE_TYPE (IndicatorCustom, indicator_custom, INDICATOR_OBJECT_TYPE); + +static void +indicator_custom_class_init (IndicatorCustomClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (IndicatorCustomPrivate)); + + object_class->dispose = indicator_custom_dispose; + object_class->finalize = indicator_custom_finalize; + + IndicatorObjectClass * io_class = INDICATOR_OBJECT_CLASS(klass); + + io_class->get_entries = get_entries; return; } -GtkLabel * -get_label (void) +static void +indicator_custom_init (IndicatorCustom *self) { - return NULL; + IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(self); + + priv->sm = indicator_service_manager_new(INDICATOR_CUSTOM_DBUS_ADDR); + g_signal_connect(G_OBJECT(priv->sm), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connected), self); + + return; +} + +static void +indicator_custom_dispose (GObject *object) +{ + IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(object); + + if (priv->sm != NULL) { + g_object_unref(priv->sm); + priv->sm = NULL; + } + + G_OBJECT_CLASS (indicator_custom_parent_class)->dispose (object); + return; } -GtkImage * -get_icon (void) +static void +indicator_custom_finalize (GObject *object) { - return GTK_IMAGE(gtk_image_new()); + + G_OBJECT_CLASS (indicator_custom_parent_class)->finalize (object); + return; } -GtkMenu * -get_menu (void) +void +connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * custom) { - GtkMenu * main_menu = GTK_MENU(gtk_menu_new()); - GtkWidget * loading_item = gtk_menu_item_new_with_label("Loading..."); - gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), loading_item); - gtk_widget_show(GTK_WIDGET(loading_item)); - sm = indicator_service_manager_new(INDICATOR_CUSTOM_DBUS_ADDR); - g_signal_connect(G_OBJECT(sm), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connected), NULL); + return; +} + +GList * +get_entries (IndicatorObject * io) +{ - return main_menu; + return NULL; } -- cgit v1.2.3 From 10d1d2e0357629c137fa04c5436ab385eb46848b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 12:25:29 -0600 Subject: Fleshing out connected to start bringing up the proxy. --- src/dbus-shared.h | 4 +++- src/indicator-custom.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/dbus-shared.h b/src/dbus-shared.h index 36436bd..6cec06b 100644 --- a/src/dbus-shared.h +++ b/src/dbus-shared.h @@ -1,3 +1,5 @@ -#define INDICATOR_CUSTOM_DBUS_ADDR "org.ayatana.indicator.custom" +#define INDICATOR_CUSTOM_DBUS_ADDR "org.ayatana.indicator.custom" +#define INDICATOR_CUSTOM_DBUS_OBJ "/org/ayatana/indicator/custom/service" +#define INDICATOR_CUSTOM_DBUS_IFACE "org.ayatana.indicator.custom.service" diff --git a/src/indicator-custom.c b/src/indicator-custom.c index 8528a52..86eeffc 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -2,6 +2,8 @@ #include #include +#include + #include #include #include @@ -41,6 +43,8 @@ typedef struct _IndicatorCustomPrivate IndicatorCustomPrivate; struct _IndicatorCustomPrivate { IndicatorServiceManager * sm; + DBusGConnection * bus; + DBusGProxy * service_proxy; }; #define INDICATOR_CUSTOM_GET_PRIVATE(o) \ @@ -77,9 +81,14 @@ indicator_custom_init (IndicatorCustom *self) { IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(self); + /* These are built in the connection phase */ + priv->bus = NULL; + priv->service_proxy = NULL; + priv->sm = indicator_service_manager_new(INDICATOR_CUSTOM_DBUS_ADDR); g_signal_connect(G_OBJECT(priv->sm), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connected), self); + return; } @@ -93,6 +102,16 @@ indicator_custom_dispose (GObject *object) priv->sm = NULL; } + if (priv->bus != NULL) { + /* We're not incrementing the ref count on this one. */ + priv->bus = NULL; + } + + if (priv->service_proxy != NULL) { + g_object_unref(G_OBJECT(priv->service_proxy)); + priv->service_proxy = NULL; + } + G_OBJECT_CLASS (indicator_custom_parent_class)->dispose (object); return; } @@ -108,6 +127,26 @@ indicator_custom_finalize (GObject *object) void connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * custom) { + IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(custom); + g_debug("Connected to Custom Indicator Service."); + + GError * error = NULL; + + if (priv->bus == NULL) { + priv->bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + + if (error != NULL) { + g_error("Unable to get session bus: %s", error->message); + g_error_free(error); + return; + } + } + + priv->service_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, + INDICATOR_CUSTOM_DBUS_ADDR, + INDICATOR_CUSTOM_DBUS_OBJ, + INDICATOR_CUSTOM_DBUS_IFACE, + &error); return; } -- cgit v1.2.3 From 349af660b77122a3a8609b09fe0012abf666e4b8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 12:56:54 -0600 Subject: Hooking up to the proxy. Let's do this! --- src/indicator-custom.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index 86eeffc..669bafd 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -1,14 +1,19 @@ +/* G Stuff */ #include #include +/* DBus Stuff */ #include +/* Indicator Stuff */ #include #include #include -#include "dbus-shared.h" +/* Local Stuff */ +#include "dbus-shared.h" +#include "custom-service-client.h" #define INDICATOR_CUSTOM_TYPE (indicator_custom_get_type ()) #define INDICATOR_CUSTOM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INDICATOR_CUSTOM_TYPE, IndicatorCustom)) @@ -54,8 +59,11 @@ static void indicator_custom_class_init (IndicatorCustomClass *klass); static void indicator_custom_init (IndicatorCustom *self); static void indicator_custom_dispose (GObject *object); static void indicator_custom_finalize (GObject *object); -GList * get_entries (IndicatorObject * io); -void connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * custom); +static GList * get_entries (IndicatorObject * io); +static void connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * custom); +static void application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, IndicatorCustom * custom); +static void application_removed (DBusGProxy * proxy, gint position , IndicatorCustom * custom); +static void get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error, gpointer userdata); G_DEFINE_TYPE (IndicatorCustom, indicator_custom, INDICATOR_OBJECT_TYPE); @@ -132,6 +140,7 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c GError * error = NULL; + /* Grab the session bus */ if (priv->bus == NULL) { priv->bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); @@ -142,18 +151,69 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c } } + /* Build the service proxy */ priv->service_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, INDICATOR_CUSTOM_DBUS_ADDR, INDICATOR_CUSTOM_DBUS_OBJ, INDICATOR_CUSTOM_DBUS_IFACE, &error); + /* Set up proxy signals */ + dbus_g_proxy_add_signal(priv->service_proxy, + "ApplicationAdded", + G_TYPE_STRING, + G_TYPE_INT, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_NONE); + dbus_g_proxy_add_signal(priv->service_proxy, + "ApplicationRemoved", + G_TYPE_INT, + G_TYPE_NONE); + + dbus_g_proxy_connect_signal(priv->service_proxy, + "ApplicationAdded", + G_CALLBACK(application_added), + custom, + NULL /* Disconnection Signal */); + dbus_g_proxy_connect_signal(priv->service_proxy, + "ApplicationRemoved", + G_CALLBACK(application_removed), + custom, + NULL /* Disconnection Signal */); + + /* Query it for existing applications */ + org_ayatana_indicator_custom_service_get_applications_async(priv->service_proxy, + get_applications, + custom); + return; } -GList * +static GList * get_entries (IndicatorObject * io) { return NULL; } + +static void +application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, IndicatorCustom * custom) +{ + + return; +} + +static void +application_removed (DBusGProxy * proxy, gint position , IndicatorCustom * custom) +{ + + return; +} + +static void +get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error, gpointer userdata) +{ + + return; +} -- cgit v1.2.3 From 1dc8a8af930e8802cb578673da6bde792619b9c8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 13:32:21 -0600 Subject: Making for a list of applications that we can build and destroy at will. --- src/indicator-custom.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index 669bafd..d520948 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -44,12 +44,17 @@ INDICATOR_SET_TYPE(INDICATOR_CUSTOM_TYPE) #endif typedef struct _IndicatorCustomPrivate IndicatorCustomPrivate; - -struct _IndicatorCustomPrivate -{ +struct _IndicatorCustomPrivate { IndicatorServiceManager * sm; DBusGConnection * bus; DBusGProxy * service_proxy; + GList * applications; +}; + +typedef struct _ApplicationEntry ApplicationEntry; +struct _ApplicationEntry { + guint position; + IndicatorObjectEntry entry; }; #define INDICATOR_CUSTOM_GET_PRIVATE(o) \ @@ -96,6 +101,7 @@ indicator_custom_init (IndicatorCustom *self) priv->sm = indicator_service_manager_new(INDICATOR_CUSTOM_DBUS_ADDR); g_signal_connect(G_OBJECT(priv->sm), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connected), self); + priv->applications = NULL; return; } @@ -105,6 +111,12 @@ indicator_custom_dispose (GObject *object) { IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(object); + while (priv->applications != NULL) { + application_removed(priv->service_proxy, + ((ApplicationEntry *)priv->applications->data)->position, + INDICATOR_CUSTOM(object)); + } + if (priv->sm != NULL) { g_object_unref(priv->sm); priv->sm = NULL; -- cgit v1.2.3 From 463ca24ae82ecadaf319a42dc903301afa2c9b2b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 13:38:09 -0600 Subject: Fleshing out get_entries --- src/indicator-custom.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index d520948..f9577fb 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -202,11 +202,28 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c return; } +/* Goes through the list of applications that we're maintaining and + pulls out the IndicatorObjectEntry and returns that in a list + for the caller. */ static GList * get_entries (IndicatorObject * io) { + g_return_val_if_fail(IS_INDICATOR_CUSTOM(io), NULL); - return NULL; + IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(io); + GList * retval = NULL; + GList * apppointer = NULL; + + for (apppointer = priv->applications; apppointer != NULL; apppointer = g_list_next(apppointer)) { + IndicatorObjectEntry * entry = &(((ApplicationEntry *)apppointer->data)->entry); + retval = g_list_prepend(retval, entry); + } + + if (retval != NULL) { + retval = g_list_reverse(retval); + } + + return retval; } static void -- cgit v1.2.3 From faef47fd05128981c33057236dca7bedab9dd639 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 14:02:38 -0600 Subject: Fleshing out the application added stuff --- src/indicator-custom.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index f9577fb..7cb9142 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -2,9 +2,11 @@ /* G Stuff */ #include #include +#include /* DBus Stuff */ #include +#include /* Indicator Stuff */ #include @@ -226,10 +228,23 @@ get_entries (IndicatorObject * io) return retval; } +/* Here we respond to new applications by building up the + ApplicationEntry and signaling the indicator host that + we've got a new indicator. */ static void application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, IndicatorCustom * custom) { + IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(custom); + ApplicationEntry * app = g_new(ApplicationEntry, 1); + + app->position = position; + app->entry.image = GTK_IMAGE(gtk_image_new_from_icon_name(iconname, GTK_ICON_SIZE_MENU)); + app->entry.label = NULL; + app->entry.menu = GTK_MENU(dbusmenu_gtkmenu_new((gchar *)dbusaddress, (gchar *)dbusobject)); + + priv->applications = g_list_prepend(priv->applications, app); + g_signal_emit(G_OBJECT(custom), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED_ID, 0, &(app->entry), TRUE); return; } @@ -240,6 +255,8 @@ application_removed (DBusGProxy * proxy, gint position , IndicatorCustom * custo return; } +/* This repsonds to the list of applications that the service + has and calls application_added on each one of them. */ static void get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error, gpointer userdata) { -- cgit v1.2.3 From 46443702113ebba13864a1452333a3bd25a9088e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 16:19:35 -0600 Subject: Changing some API and implementing the simple stuff. --- src/custom-service-appstore.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index 1e61852..f8d34d0 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -2,16 +2,18 @@ #include "config.h" #endif +#include #include "custom-service-appstore.h" +#include "dbus-shared.h" /* DBus Prototypes */ -static gboolean _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps, gpointer user_data); +static gboolean _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps); -static gboolean _notification_watcher_server_register_service (CustomServiceAppstore * appstore, const gchar * service, gpointer user_data); -static gboolean _notification_watcher_server_registered_services (CustomServiceAppstore * appstore, GArray ** apps, gpointer user_data); -static gboolean _notification_watcher_server_protocol_version (CustomServiceAppstore * appstore, char ** version, gpointer user_data); -static gboolean _notification_watcher_server_register_notification_host (CustomServiceAppstore * appstore, const gchar * host, gpointer user_data); -static gboolean _notification_watcher_server_is_notification_host_registered (CustomServiceAppstore * appstore, gboolean * haveHost, gpointer user_data); +static gboolean _notification_watcher_server_register_service (CustomServiceAppstore * appstore, const gchar * service, DBusGMethodInvocation * method); +static gboolean _notification_watcher_server_registered_services (CustomServiceAppstore * appstore, GArray ** apps); +static gboolean _notification_watcher_server_protocol_version (CustomServiceAppstore * appstore, char ** version); +static gboolean _notification_watcher_server_register_notification_host (CustomServiceAppstore * appstore, const gchar * host); +static gboolean _notification_watcher_server_is_notification_host_registered (CustomServiceAppstore * appstore, gboolean * haveHost); #include "custom-service-server.h" #include "notification-watcher-server.h" @@ -63,7 +65,7 @@ custom_service_appstore_init (CustomServiceAppstore *self) } dbus_g_connection_register_g_object(session_bus, - "/my/path", + INDICATOR_CUSTOM_DBUS_OBJ, G_OBJECT(self)); return; @@ -87,44 +89,47 @@ custom_service_appstore_finalize (GObject *object) /* DBus Interface */ static gboolean -_custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps, gpointer user_data) +_custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps) { return FALSE; } static gboolean -_notification_watcher_server_register_service (CustomServiceAppstore * appstore, const gchar * service, gpointer user_data) +_notification_watcher_server_register_service (CustomServiceAppstore * appstore, const gchar * service, DBusGMethodInvocation * method) { - return FALSE; + + + dbus_g_method_return(method, G_TYPE_NONE); + return TRUE; } static gboolean -_notification_watcher_server_registered_services (CustomServiceAppstore * appstore, GArray ** apps, gpointer user_data) +_notification_watcher_server_registered_services (CustomServiceAppstore * appstore, GArray ** apps) { return FALSE; } static gboolean -_notification_watcher_server_protocol_version (CustomServiceAppstore * appstore, char ** version, gpointer user_data) +_notification_watcher_server_protocol_version (CustomServiceAppstore * appstore, char ** version) { - - return FALSE; + *version = g_strdup("Ayatana Version 1"); + return TRUE; } static gboolean -_notification_watcher_server_register_notification_host (CustomServiceAppstore * appstore, const gchar * host, gpointer user_data) +_notification_watcher_server_register_notification_host (CustomServiceAppstore * appstore, const gchar * host) { return FALSE; } static gboolean -_notification_watcher_server_is_notification_host_registered (CustomServiceAppstore * appstore, gboolean * haveHost, gpointer user_data) +_notification_watcher_server_is_notification_host_registered (CustomServiceAppstore * appstore, gboolean * haveHost) { - - return FALSE; + *haveHost = TRUE; + return TRUE; } -- cgit v1.2.3 From 3ea189ef44422c02eacfb25089968acaaff61ab1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 16:40:36 -0600 Subject: Putting some signals on here. --- src/custom-service-appstore.c | 28 +++++++++++++++++++++++++++- src/custom-service-appstore.h | 3 +++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index f8d34d0..a012fae 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -18,8 +18,8 @@ static gboolean _notification_watcher_server_is_notification_host_registered (Cu #include "custom-service-server.h" #include "notification-watcher-server.h" +/* Private Stuff */ typedef struct _CustomServiceAppstorePrivate CustomServiceAppstorePrivate; - struct _CustomServiceAppstorePrivate { int demo; }; @@ -27,6 +27,16 @@ struct _CustomServiceAppstorePrivate { #define CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_SERVICE_APPSTORE_TYPE, CustomServiceAppstorePrivate)) +/* Signals Stuff */ +enum { + APPLICATION_ADDED, + APPLICATION_REMOVED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* GObject stuff */ static void custom_service_appstore_class_init (CustomServiceAppstoreClass *klass); static void custom_service_appstore_init (CustomServiceAppstore *self); static void custom_service_appstore_dispose (GObject *object); @@ -44,6 +54,22 @@ custom_service_appstore_class_init (CustomServiceAppstoreClass *klass) object_class->dispose = custom_service_appstore_dispose; object_class->finalize = custom_service_appstore_finalize; + signals[APPLICATION_ADDED] = g_signal_new ("application-added", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomServiceAppstore, application_added), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_NONE); + signals[APPLICATION_REMOVED] = g_signal_new ("application-removed", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomServiceAppstore, application_removed), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_NONE); + + dbus_g_object_type_install_info(CUSTOM_SERVICE_APPSTORE_TYPE, &dbus_glib__notification_watcher_server_object_info); dbus_g_object_type_install_info(CUSTOM_SERVICE_APPSTORE_TYPE, diff --git a/src/custom-service-appstore.h b/src/custom-service-appstore.h index 48c9da9..311158f 100644 --- a/src/custom-service-appstore.h +++ b/src/custom-service-appstore.h @@ -22,6 +22,9 @@ struct _CustomServiceAppstoreClass { struct _CustomServiceAppstore { GObject parent; + + void (*application_added) (CustomServiceAppstore * appstore, gchar *, gint, gchar *, gchar *, gpointer); + void (*application_removed) (CustomServiceAppstore * appstore, gint, gpointer); }; GType custom_service_appstore_get_type (void); -- cgit v1.2.3 From 53f654eec6419c4999a620f9f1e0aaf3f2ac5e89 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 16:47:54 -0600 Subject: Adding in a set of marshallers to make our signals all happy. --- .bzrignore | 3 +++ src/Makefile.am | 6 ++++++ src/custom-service-appstore.c | 3 ++- src/custom-service-marshal.list | 1 + 4 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/custom-service-marshal.list diff --git a/.bzrignore b/.bzrignore index f41b607..2942d56 100644 --- a/.bzrignore +++ b/.bzrignore @@ -26,3 +26,6 @@ tests/libcustomindicator-tests tests/test-libcustomindicator-dbus src/custom-service-client.h src/custom-service-server.h +src/custom-service-marshal.c +src/custom-service-marshal.h +src/stamp-marshal diff --git a/src/Makefile.am b/src/Makefile.am index 273c2dc..2fb861c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,6 +4,7 @@ BUILT_SOURCES = EXTRA_DIST = include $(top_srcdir)/Makefile.am.enum +include $(top_srcdir)/Makefile.am.marshal ################################## # Indicator @@ -33,6 +34,8 @@ indicator_custom_service_SOURCES = \ custom-service.c \ custom-service-appstore.h \ custom-service-appstore.c \ + custom-service-marshal.h \ + custom-service-marshal.c \ custom-service-server.h \ dbus-shared.h \ notification-item-client.h \ @@ -43,6 +46,9 @@ indicator_custom_service_CFLAGS = \ indicator_custom_service_LDADD = \ $(INDICATOR_LIBS) +glib_marshal_list = custom-service-marshal.list +glib_marshal_prefix = _custom_service_marshal + ################################## # Library ################################## diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index a012fae..02d7927 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -4,6 +4,7 @@ #include #include "custom-service-appstore.h" +#include "custom-service-marshal.h" #include "dbus-shared.h" /* DBus Prototypes */ @@ -59,7 +60,7 @@ custom_service_appstore_class_init (CustomServiceAppstoreClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (CustomServiceAppstore, application_added), NULL, NULL, - g_cclosure_marshal_VOID__POINTER, + _custom_service_marshal_VOID__STRING_INT_STRING_STRING, G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_NONE); signals[APPLICATION_REMOVED] = g_signal_new ("application-removed", G_TYPE_FROM_CLASS(klass), diff --git a/src/custom-service-marshal.list b/src/custom-service-marshal.list new file mode 100644 index 0000000..4056f53 --- /dev/null +++ b/src/custom-service-marshal.list @@ -0,0 +1 @@ +VOID: STRING, INT, STRING, STRING -- cgit v1.2.3 From c894aa50b044926d9f8fa30591fdb4f8aada36b5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 16:50:20 -0600 Subject: Adding in teh source directory for distcheck --- Makefile.am.marshal | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.am.marshal b/Makefile.am.marshal index 8b30d4f..a6ab024 100644 --- a/Makefile.am.marshal +++ b/Makefile.am.marshal @@ -26,7 +26,7 @@ stamp-marshal: $(glib_marshal_list) $(QUIET_GEN)$(GLIB_GENMARSHAL) \ --prefix=$(glib_marshal_prefix) \ --header \ - $(glib_marshal_list) > xgen-mh \ + $(srcdir)/$(glib_marshal_list) > xgen-mh \ && (cmp -s xgen-mh $(marshal_h) || cp -f xgen-mh $(marshal_h)) \ && rm -f xgen-mh \ && echo timestamp > $(@F) @@ -39,7 +39,7 @@ $(marshal_c): $(marshal_h) $(GLIB_GENMARSHAL) \ --prefix=$(glib_marshal_prefix) \ --body \ - $(glib_marshal_list)) > xgen-mc \ + $(srcdir)/$(glib_marshal_list)) > xgen-mc \ && cp xgen-mc $(marshal_c) \ && rm -f xgen-mc -- cgit v1.2.3 From ab660ab46dabfdd99fb4e5ee8641a305299852c8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 16:55:48 -0600 Subject: Creating a new object to be our watcher. Apparently we can't have two DBus interfaces on the same object :( --- src/Makefile.am | 2 ++ src/custom-service-watcher.c | 56 ++++++++++++++++++++++++++++++++++++++++++++ src/custom-service-watcher.h | 31 ++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 src/custom-service-watcher.c create mode 100644 src/custom-service-watcher.h diff --git a/src/Makefile.am b/src/Makefile.am index 2fb861c..fa0137f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -37,6 +37,8 @@ indicator_custom_service_SOURCES = \ custom-service-marshal.h \ custom-service-marshal.c \ custom-service-server.h \ + custom-service-watcher.h \ + custom-service-watcher.c \ dbus-shared.h \ notification-item-client.h \ notification-watcher-server.h diff --git a/src/custom-service-watcher.c b/src/custom-service-watcher.c new file mode 100644 index 0000000..5899b83 --- /dev/null +++ b/src/custom-service-watcher.c @@ -0,0 +1,56 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "custom-service-watcher.h" + +typedef struct _CustomServiceWatcherPrivate CustomServiceWatcherPrivate; +struct _CustomServiceWatcherPrivate { + int dummy; +}; + +#define CUSTOM_SERVICE_WATCHER_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_SERVICE_WATCHER_TYPE, CustomServiceWatcherPrivate)) + +static void custom_service_watcher_class_init (CustomServiceWatcherClass *klass); +static void custom_service_watcher_init (CustomServiceWatcher *self); +static void custom_service_watcher_dispose (GObject *object); +static void custom_service_watcher_finalize (GObject *object); + +G_DEFINE_TYPE (CustomServiceWatcher, custom_service_watcher, G_TYPE_OBJECT); + +static void +custom_service_watcher_class_init (CustomServiceWatcherClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (CustomServiceWatcherPrivate)); + + object_class->dispose = custom_service_watcher_dispose; + object_class->finalize = custom_service_watcher_finalize; + + return; +} + +static void +custom_service_watcher_init (CustomServiceWatcher *self) +{ + + return; +} + +static void +custom_service_watcher_dispose (GObject *object) +{ + + G_OBJECT_CLASS (custom_service_watcher_parent_class)->dispose (object); + return; +} + +static void +custom_service_watcher_finalize (GObject *object) +{ + + G_OBJECT_CLASS (custom_service_watcher_parent_class)->finalize (object); + return; +} diff --git a/src/custom-service-watcher.h b/src/custom-service-watcher.h new file mode 100644 index 0000000..3006175 --- /dev/null +++ b/src/custom-service-watcher.h @@ -0,0 +1,31 @@ +#ifndef __CUSTOM_SERVICE_WATCHER_H__ +#define __CUSTOM_SERVICE_WATCHER_H__ + +#include +#include + +G_BEGIN_DECLS + +#define CUSTOM_SERVICE_WATCHER_TYPE (custom_service_watcher_get_type ()) +#define CUSTOM_SERVICE_WATCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CUSTOM_SERVICE_WATCHER_TYPE, CustomServiceWatcher)) +#define CUSTOM_SERVICE_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_SERVICE_WATCHER_TYPE, CustomServiceWatcherClass)) +#define IS_CUSTOM_SERVICE_WATCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_SERVICE_WATCHER_TYPE)) +#define IS_CUSTOM_SERVICE_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_SERVICE_WATCHER_TYPE)) +#define CUSTOM_SERVICE_WATCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_SERVICE_WATCHER_TYPE, CustomServiceWatcherClass)) + +typedef struct _CustomServiceWatcher CustomServiceWatcher; +typedef struct _CustomServiceWatcherClass CustomServiceWatcherClass; + +struct _CustomServiceWatcherClass { + GObjectClass parent_class; +}; + +struct _CustomServiceWatcher { + GObject parent; +}; + +GType custom_service_watcher_get_type (void); + +G_END_DECLS + +#endif -- cgit v1.2.3 From fa2ac0047468678ee0bd6cf8e03731bbfdd98dd3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 17:05:28 -0600 Subject: Moving the watcher stuff to the new object. --- src/custom-service-appstore.c | 48 --------------------------------- src/custom-service-watcher.c | 63 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 48 deletions(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index 02d7927..493d4f4 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -10,14 +10,7 @@ /* DBus Prototypes */ static gboolean _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps); -static gboolean _notification_watcher_server_register_service (CustomServiceAppstore * appstore, const gchar * service, DBusGMethodInvocation * method); -static gboolean _notification_watcher_server_registered_services (CustomServiceAppstore * appstore, GArray ** apps); -static gboolean _notification_watcher_server_protocol_version (CustomServiceAppstore * appstore, char ** version); -static gboolean _notification_watcher_server_register_notification_host (CustomServiceAppstore * appstore, const gchar * host); -static gboolean _notification_watcher_server_is_notification_host_registered (CustomServiceAppstore * appstore, gboolean * haveHost); - #include "custom-service-server.h" -#include "notification-watcher-server.h" /* Private Stuff */ typedef struct _CustomServiceAppstorePrivate CustomServiceAppstorePrivate; @@ -71,8 +64,6 @@ custom_service_appstore_class_init (CustomServiceAppstoreClass *klass) G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_NONE); - dbus_g_object_type_install_info(CUSTOM_SERVICE_APPSTORE_TYPE, - &dbus_glib__notification_watcher_server_object_info); dbus_g_object_type_install_info(CUSTOM_SERVICE_APPSTORE_TYPE, &dbus_glib__custom_service_server_object_info); @@ -121,42 +112,3 @@ _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArra return FALSE; } - -static gboolean -_notification_watcher_server_register_service (CustomServiceAppstore * appstore, const gchar * service, DBusGMethodInvocation * method) -{ - - - - dbus_g_method_return(method, G_TYPE_NONE); - return TRUE; -} - -static gboolean -_notification_watcher_server_registered_services (CustomServiceAppstore * appstore, GArray ** apps) -{ - - return FALSE; -} - -static gboolean -_notification_watcher_server_protocol_version (CustomServiceAppstore * appstore, char ** version) -{ - *version = g_strdup("Ayatana Version 1"); - return TRUE; -} - -static gboolean -_notification_watcher_server_register_notification_host (CustomServiceAppstore * appstore, const gchar * host) -{ - - return FALSE; -} - -static gboolean -_notification_watcher_server_is_notification_host_registered (CustomServiceAppstore * appstore, gboolean * haveHost) -{ - *haveHost = TRUE; - return TRUE; -} - diff --git a/src/custom-service-watcher.c b/src/custom-service-watcher.c index 5899b83..b4680ab 100644 --- a/src/custom-service-watcher.c +++ b/src/custom-service-watcher.c @@ -2,7 +2,17 @@ #include "config.h" #endif +#include #include "custom-service-watcher.h" +#include "dbus-shared.h" + +static gboolean _notification_watcher_server_register_service (CustomServiceWatcher * appstore, const gchar * service, DBusGMethodInvocation * method); +static gboolean _notification_watcher_server_registered_services (CustomServiceWatcher * appstore, GArray ** apps); +static gboolean _notification_watcher_server_protocol_version (CustomServiceWatcher * appstore, char ** version); +static gboolean _notification_watcher_server_register_notification_host (CustomServiceWatcher * appstore, const gchar * host); +static gboolean _notification_watcher_server_is_notification_host_registered (CustomServiceWatcher * appstore, gboolean * haveHost); + +#include "notification-watcher-server.h" typedef struct _CustomServiceWatcherPrivate CustomServiceWatcherPrivate; struct _CustomServiceWatcherPrivate { @@ -29,12 +39,26 @@ custom_service_watcher_class_init (CustomServiceWatcherClass *klass) object_class->dispose = custom_service_watcher_dispose; object_class->finalize = custom_service_watcher_finalize; + dbus_g_object_type_install_info(CUSTOM_SERVICE_WATCHER_TYPE, + &dbus_glib__notification_watcher_server_object_info); + return; } static void custom_service_watcher_init (CustomServiceWatcher *self) { + GError * error = NULL; + DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + if (error != NULL) { + g_error("Unable to get session bus: %s", error->message); + g_error_free(error); + return; + } + + dbus_g_connection_register_g_object(session_bus, + INDICATOR_CUSTOM_DBUS_OBJ "/more", + G_OBJECT(self)); return; } @@ -54,3 +78,42 @@ custom_service_watcher_finalize (GObject *object) G_OBJECT_CLASS (custom_service_watcher_parent_class)->finalize (object); return; } + +static gboolean +_notification_watcher_server_register_service (CustomServiceWatcher * appstore, const gchar * service, DBusGMethodInvocation * method) +{ + + + + dbus_g_method_return(method, G_TYPE_NONE); + return TRUE; +} + +static gboolean +_notification_watcher_server_registered_services (CustomServiceWatcher * appstore, GArray ** apps) +{ + + return FALSE; +} + +static gboolean +_notification_watcher_server_protocol_version (CustomServiceWatcher * appstore, char ** version) +{ + *version = g_strdup("Ayatana Version 1"); + return TRUE; +} + +static gboolean +_notification_watcher_server_register_notification_host (CustomServiceWatcher * appstore, const gchar * host) +{ + + return FALSE; +} + +static gboolean +_notification_watcher_server_is_notification_host_registered (CustomServiceWatcher * appstore, gboolean * haveHost) +{ + *haveHost = TRUE; + return TRUE; +} + -- cgit v1.2.3 From ced0ec2c7e9e9138fb42422e662bf03deb957343 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 17:13:47 -0600 Subject: Connecting the watcher and the appstore. And actually building one. We're on DBus now. --- src/custom-service-watcher.c | 22 +++++++++++++++++++++- src/custom-service-watcher.h | 3 +++ src/custom-service.c | 3 +++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/custom-service-watcher.c b/src/custom-service-watcher.c index b4680ab..2b83c13 100644 --- a/src/custom-service-watcher.c +++ b/src/custom-service-watcher.c @@ -16,7 +16,7 @@ static gboolean _notification_watcher_server_is_notification_host_registered (Cu typedef struct _CustomServiceWatcherPrivate CustomServiceWatcherPrivate; struct _CustomServiceWatcherPrivate { - int dummy; + CustomServiceAppstore * appstore; }; #define CUSTOM_SERVICE_WATCHER_GET_PRIVATE(o) \ @@ -48,6 +48,10 @@ custom_service_watcher_class_init (CustomServiceWatcherClass *klass) static void custom_service_watcher_init (CustomServiceWatcher *self) { + CustomServiceWatcherPrivate * priv = CUSTOM_SERVICE_WATCHER_GET_PRIVATE(self); + + priv->appstore = NULL; + GError * error = NULL; DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); if (error != NULL) { @@ -66,6 +70,12 @@ custom_service_watcher_init (CustomServiceWatcher *self) static void custom_service_watcher_dispose (GObject *object) { + CustomServiceWatcherPrivate * priv = CUSTOM_SERVICE_WATCHER_GET_PRIVATE(object); + + if (priv->appstore != NULL) { + g_object_unref(G_OBJECT(priv->appstore)); + priv->appstore = NULL; + } G_OBJECT_CLASS (custom_service_watcher_parent_class)->dispose (object); return; @@ -79,6 +89,16 @@ custom_service_watcher_finalize (GObject *object) return; } +CustomServiceWatcher * +custom_service_watcher_new (CustomServiceAppstore * appstore) +{ + GObject * obj = g_object_new(CUSTOM_SERVICE_WATCHER_TYPE, NULL); + CustomServiceWatcherPrivate * priv = CUSTOM_SERVICE_WATCHER_GET_PRIVATE(obj); + priv->appstore = appstore; + g_object_ref(G_OBJECT(priv->appstore)); + return CUSTOM_SERVICE_WATCHER(obj); +} + static gboolean _notification_watcher_server_register_service (CustomServiceWatcher * appstore, const gchar * service, DBusGMethodInvocation * method) { diff --git a/src/custom-service-watcher.h b/src/custom-service-watcher.h index 3006175..c705fb5 100644 --- a/src/custom-service-watcher.h +++ b/src/custom-service-watcher.h @@ -4,6 +4,8 @@ #include #include +#include "custom-service-appstore.h" + G_BEGIN_DECLS #define CUSTOM_SERVICE_WATCHER_TYPE (custom_service_watcher_get_type ()) @@ -25,6 +27,7 @@ struct _CustomServiceWatcher { }; GType custom_service_watcher_get_type (void); +CustomServiceWatcher * custom_service_watcher_new (CustomServiceAppstore * appstore); G_END_DECLS diff --git a/src/custom-service.c b/src/custom-service.c index df3d58a..3205bc2 100644 --- a/src/custom-service.c +++ b/src/custom-service.c @@ -2,10 +2,12 @@ #include "libindicator/indicator-service.h" #include "notification-item-client.h" #include "custom-service-appstore.h" +#include "custom-service-watcher.h" #include "dbus-shared.h" static GMainLoop * mainloop = NULL; static CustomServiceAppstore * appstore = NULL; +static CustomServiceWatcher * watcher = NULL; static IndicatorService * service = NULL; int @@ -15,6 +17,7 @@ main (int argc, char ** argv) service = indicator_service_new(INDICATOR_CUSTOM_DBUS_ADDR); appstore = CUSTOM_SERVICE_APPSTORE(g_object_new(CUSTOM_SERVICE_APPSTORE_TYPE, NULL)); + watcher = custom_service_watcher_new(appstore); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); -- cgit v1.2.3 From 591311a82b0ce6e0bc74439186bb22d5224d85c5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 20:41:18 -0600 Subject: Woot! Now we have signals in our watcher. Let's rock on! --- src/custom-service-watcher.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/custom-service-watcher.h | 6 ++++++ src/notification-watcher.xml | 2 +- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/custom-service-watcher.c b/src/custom-service-watcher.c index 2b83c13..4f6c6d3 100644 --- a/src/custom-service-watcher.c +++ b/src/custom-service-watcher.c @@ -14,6 +14,7 @@ static gboolean _notification_watcher_server_is_notification_host_registered (Cu #include "notification-watcher-server.h" +/* Private Stuff */ typedef struct _CustomServiceWatcherPrivate CustomServiceWatcherPrivate; struct _CustomServiceWatcherPrivate { CustomServiceAppstore * appstore; @@ -22,6 +23,18 @@ struct _CustomServiceWatcherPrivate { #define CUSTOM_SERVICE_WATCHER_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_SERVICE_WATCHER_TYPE, CustomServiceWatcherPrivate)) +/* Signals Stuff */ +enum { + SERVICE_REGISTERED, + SERVICE_UNREGISTERED, + NOTIFICATION_HOST_REGISTERED, + NOTIFICATION_HOST_UNREGISTERED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* GObject stuff */ static void custom_service_watcher_class_init (CustomServiceWatcherClass *klass); static void custom_service_watcher_init (CustomServiceWatcher *self); static void custom_service_watcher_dispose (GObject *object); @@ -39,6 +52,35 @@ custom_service_watcher_class_init (CustomServiceWatcherClass *klass) object_class->dispose = custom_service_watcher_dispose; object_class->finalize = custom_service_watcher_finalize; + signals[SERVICE_REGISTERED] = g_signal_new ("service-registered", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomServiceWatcherClass, service_registered), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); + signals[SERVICE_UNREGISTERED] = g_signal_new ("service-unregistered", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomServiceWatcherClass, service_unregistered), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); + signals[NOTIFICATION_HOST_REGISTERED] = g_signal_new ("notification-host-registered", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomServiceWatcherClass, notification_host_registered), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + signals[NOTIFICATION_HOST_UNREGISTERED] = g_signal_new ("notification-host-unregistered", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomServiceWatcherClass, notification_host_unregistered), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + dbus_g_object_type_install_info(CUSTOM_SERVICE_WATCHER_TYPE, &dbus_glib__notification_watcher_server_object_info); diff --git a/src/custom-service-watcher.h b/src/custom-service-watcher.h index c705fb5..1a037be 100644 --- a/src/custom-service-watcher.h +++ b/src/custom-service-watcher.h @@ -20,6 +20,12 @@ typedef struct _CustomServiceWatcherClass CustomServiceWatcherClass; struct _CustomServiceWatcherClass { GObjectClass parent_class; + + /* Signals */ + void (*service_registered) (CustomServiceWatcher * watcher, gchar * object, gpointer data); + void (*service_unregistered) (CustomServiceWatcher * watcher, gchar * object, gpointer data); + void (*notification_host_registered) (CustomServiceWatcher * watcher, gpointer data); + void (*notification_host_unregistered) (CustomServiceWatcher * watcher, gpointer data); }; struct _CustomServiceWatcher { diff --git a/src/notification-watcher.xml b/src/notification-watcher.xml index 93acf74..06e3e68 100644 --- a/src/notification-watcher.xml +++ b/src/notification-watcher.xml @@ -31,7 +31,7 @@ - + -- cgit v1.2.3 From 78a6d0dc74a7ea166e207f8036cc4930bcdcbbbd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 21:16:47 -0600 Subject: Adding app add/remove to appstore --- src/custom-service-appstore.c | 23 +++++++++++++++++++++++ src/custom-service-appstore.h | 8 +++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index 493d4f4..ceb2c17 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -105,6 +105,28 @@ custom_service_appstore_finalize (GObject *object) return; } +void +custom_service_appstore_application_add (CustomServiceAppstore * appstore, gchar * dbus_name, gchar * dbus_object) +{ + g_return_if_fail(IS_CUSTOM_SERVICE_APPSTORE(appstore)); + g_return_if_fail(dbus_name != NULL && dbus_name[0] != '\0'); + g_return_if_fail(dbus_object != NULL && dbus_object[0] != '\0'); + + + return; +} + +void +custom_service_appstore_application_remove (CustomServiceAppstore * appstore, gchar * dbus_name, gchar * dbus_object) +{ + g_return_if_fail(IS_CUSTOM_SERVICE_APPSTORE(appstore)); + g_return_if_fail(dbus_name != NULL && dbus_name[0] != '\0'); + g_return_if_fail(dbus_object != NULL && dbus_object[0] != '\0'); + + + return; +} + /* DBus Interface */ static gboolean _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps) @@ -112,3 +134,4 @@ _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArra return FALSE; } + diff --git a/src/custom-service-appstore.h b/src/custom-service-appstore.h index 311158f..e1cb52a 100644 --- a/src/custom-service-appstore.h +++ b/src/custom-service-appstore.h @@ -27,7 +27,13 @@ struct _CustomServiceAppstore { void (*application_removed) (CustomServiceAppstore * appstore, gint, gpointer); }; -GType custom_service_appstore_get_type (void); +GType custom_service_appstore_get_type (void); +void custom_service_appstore_application_add (CustomServiceAppstore * appstore, + gchar * dbus_name, + gchar * dbus_object); +void custom_service_appstore_application_remove (CustomServiceAppstore * appstore, + gchar * dbus_name, + gchar * dbus_object); G_END_DECLS -- cgit v1.2.3 From bca77a7a1e38c1d97211394799cf103bc02b0547 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 21:40:28 -0600 Subject: Getting the registration signal, and passing it up the stack. --- src/custom-service-appstore.c | 4 ++-- src/custom-service-appstore.h | 8 ++++---- src/custom-service-watcher.c | 24 +++++++++++++----------- src/notification-watcher.xml | 1 + 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index ceb2c17..b25ffa7 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -106,7 +106,7 @@ custom_service_appstore_finalize (GObject *object) } void -custom_service_appstore_application_add (CustomServiceAppstore * appstore, gchar * dbus_name, gchar * dbus_object) +custom_service_appstore_application_add (CustomServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) { g_return_if_fail(IS_CUSTOM_SERVICE_APPSTORE(appstore)); g_return_if_fail(dbus_name != NULL && dbus_name[0] != '\0'); @@ -117,7 +117,7 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, gchar } void -custom_service_appstore_application_remove (CustomServiceAppstore * appstore, gchar * dbus_name, gchar * dbus_object) +custom_service_appstore_application_remove (CustomServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) { g_return_if_fail(IS_CUSTOM_SERVICE_APPSTORE(appstore)); g_return_if_fail(dbus_name != NULL && dbus_name[0] != '\0'); diff --git a/src/custom-service-appstore.h b/src/custom-service-appstore.h index e1cb52a..7263617 100644 --- a/src/custom-service-appstore.h +++ b/src/custom-service-appstore.h @@ -29,11 +29,11 @@ struct _CustomServiceAppstore { GType custom_service_appstore_get_type (void); void custom_service_appstore_application_add (CustomServiceAppstore * appstore, - gchar * dbus_name, - gchar * dbus_object); + const gchar * dbus_name, + const gchar * dbus_object); void custom_service_appstore_application_remove (CustomServiceAppstore * appstore, - gchar * dbus_name, - gchar * dbus_object); + const gchar * dbus_name, + const gchar * dbus_object); G_END_DECLS diff --git a/src/custom-service-watcher.c b/src/custom-service-watcher.c index 4f6c6d3..a0a1b27 100644 --- a/src/custom-service-watcher.c +++ b/src/custom-service-watcher.c @@ -3,14 +3,15 @@ #endif #include +#include #include "custom-service-watcher.h" #include "dbus-shared.h" -static gboolean _notification_watcher_server_register_service (CustomServiceWatcher * appstore, const gchar * service, DBusGMethodInvocation * method); -static gboolean _notification_watcher_server_registered_services (CustomServiceWatcher * appstore, GArray ** apps); -static gboolean _notification_watcher_server_protocol_version (CustomServiceWatcher * appstore, char ** version); -static gboolean _notification_watcher_server_register_notification_host (CustomServiceWatcher * appstore, const gchar * host); -static gboolean _notification_watcher_server_is_notification_host_registered (CustomServiceWatcher * appstore, gboolean * haveHost); +static gboolean _notification_watcher_server_register_service (CustomServiceWatcher * appwatcher, const gchar * service, DBusGMethodInvocation * method); +static gboolean _notification_watcher_server_registered_services (CustomServiceWatcher * appwatcher, GArray ** apps); +static gboolean _notification_watcher_server_protocol_version (CustomServiceWatcher * appwatcher, char ** version); +static gboolean _notification_watcher_server_register_notification_host (CustomServiceWatcher * appwatcher, const gchar * host); +static gboolean _notification_watcher_server_is_notification_host_registered (CustomServiceWatcher * appwatcher, gboolean * haveHost); #include "notification-watcher-server.h" @@ -142,38 +143,39 @@ custom_service_watcher_new (CustomServiceAppstore * appstore) } static gboolean -_notification_watcher_server_register_service (CustomServiceWatcher * appstore, const gchar * service, DBusGMethodInvocation * method) +_notification_watcher_server_register_service (CustomServiceWatcher * appwatcher, const gchar * service, DBusGMethodInvocation * method) { + CustomServiceWatcherPrivate * priv = CUSTOM_SERVICE_WATCHER_GET_PRIVATE(appwatcher); - + custom_service_appstore_application_add(priv->appstore, dbus_g_method_get_sender(method), service); dbus_g_method_return(method, G_TYPE_NONE); return TRUE; } static gboolean -_notification_watcher_server_registered_services (CustomServiceWatcher * appstore, GArray ** apps) +_notification_watcher_server_registered_services (CustomServiceWatcher * appwatcher, GArray ** apps) { return FALSE; } static gboolean -_notification_watcher_server_protocol_version (CustomServiceWatcher * appstore, char ** version) +_notification_watcher_server_protocol_version (CustomServiceWatcher * appwatcher, char ** version) { *version = g_strdup("Ayatana Version 1"); return TRUE; } static gboolean -_notification_watcher_server_register_notification_host (CustomServiceWatcher * appstore, const gchar * host) +_notification_watcher_server_register_notification_host (CustomServiceWatcher * appwatcher, const gchar * host) { return FALSE; } static gboolean -_notification_watcher_server_is_notification_host_registered (CustomServiceWatcher * appstore, gboolean * haveHost) +_notification_watcher_server_is_notification_host_registered (CustomServiceWatcher * appwatcher, gboolean * haveHost) { *haveHost = TRUE; return TRUE; diff --git a/src/notification-watcher.xml b/src/notification-watcher.xml index 06e3e68..7b034e7 100644 --- a/src/notification-watcher.xml +++ b/src/notification-watcher.xml @@ -7,6 +7,7 @@ + -- cgit v1.2.3 From e25d64ff5a87e06212c03167a7b430bd320442dd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 21:53:59 -0600 Subject: Adding an application list. --- src/custom-service-appstore.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index b25ffa7..65c6b6b 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -15,7 +15,14 @@ static gboolean _custom_service_server_get_applications (CustomServiceAppstore * /* Private Stuff */ typedef struct _CustomServiceAppstorePrivate CustomServiceAppstorePrivate; struct _CustomServiceAppstorePrivate { - int demo; + GList * applications; +}; + +typedef struct _Application Application; +struct _Application { + gchar * dbus_name; + gchar * dbus_object; + DBusGProxy * dbus_proxy; }; #define CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(o) \ @@ -73,6 +80,9 @@ custom_service_appstore_class_init (CustomServiceAppstoreClass *klass) static void custom_service_appstore_init (CustomServiceAppstore *self) { + CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(self); + + priv->applications = NULL; GError * error = NULL; DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); @@ -92,6 +102,13 @@ custom_service_appstore_init (CustomServiceAppstore *self) static void custom_service_appstore_dispose (GObject *object) { + CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(object); + + while (priv->applications != NULL) { + custom_service_appstore_application_remove(CUSTOM_SERVICE_APPSTORE(object), + ((Application *)priv->applications->data)->dbus_name, + ((Application *)priv->applications->data)->dbus_object); + } G_OBJECT_CLASS (custom_service_appstore_parent_class)->dispose (object); return; -- cgit v1.2.3 From 8b92c1c28c4d956b45aa85a31a7a201ef831fe2f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 22:15:19 -0600 Subject: Building a proxy. --- src/custom-service-appstore.c | 23 +++++++++++++++++++++-- src/dbus-shared.h | 12 +++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index 65c6b6b..5b8f7e0 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -15,6 +15,7 @@ static gboolean _custom_service_server_get_applications (CustomServiceAppstore * /* Private Stuff */ typedef struct _CustomServiceAppstorePrivate CustomServiceAppstorePrivate; struct _CustomServiceAppstorePrivate { + DBusGConnection * bus; GList * applications; }; @@ -85,14 +86,14 @@ custom_service_appstore_init (CustomServiceAppstore *self) priv->applications = NULL; GError * error = NULL; - DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + priv->bus = dbus_g_bus_get(DBUS_BUS_STARTER, &error); if (error != NULL) { g_error("Unable to get session bus: %s", error->message); g_error_free(error); return; } - dbus_g_connection_register_g_object(session_bus, + dbus_g_connection_register_g_object(priv->bus, INDICATOR_CUSTOM_DBUS_OBJ, G_OBJECT(self)); @@ -128,7 +129,25 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const g_return_if_fail(IS_CUSTOM_SERVICE_APPSTORE(appstore)); g_return_if_fail(dbus_name != NULL && dbus_name[0] != '\0'); g_return_if_fail(dbus_object != NULL && dbus_object[0] != '\0'); + CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(appstore); + Application * app = g_new(Application, 1); + + app->dbus_name = g_strdup(dbus_name); + app->dbus_object = g_strdup(dbus_object); + + GError * error = NULL; + app->dbus_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, + app->dbus_name, + app->dbus_object, + NOTIFICATION_ITEM_DBUS_IFACE, + &error); + if (error != NULL) { + g_warning("Unable to get notification item proxy for object '%s' on host '%s': %s", dbus_object, dbus_name, error->message); + g_error_free(error); + g_free(app); + return; + } return; } diff --git a/src/dbus-shared.h b/src/dbus-shared.h index 6cec06b..5c56e0b 100644 --- a/src/dbus-shared.h +++ b/src/dbus-shared.h @@ -1,5 +1,11 @@ -#define INDICATOR_CUSTOM_DBUS_ADDR "org.ayatana.indicator.custom" -#define INDICATOR_CUSTOM_DBUS_OBJ "/org/ayatana/indicator/custom/service" -#define INDICATOR_CUSTOM_DBUS_IFACE "org.ayatana.indicator.custom.service" +#define INDICATOR_CUSTOM_DBUS_ADDR "org.ayatana.indicator.custom" +#define INDICATOR_CUSTOM_DBUS_OBJ "/org/ayatana/indicator/custom/service" +#define INDICATOR_CUSTOM_DBUS_IFACE "org.ayatana.indicator.custom.service" + +#define NOTIFICATION_WATCHER_DBUS_OBJ "/org/ayatana/indicator/custom/NotificationWatcher" +#define NOTIFICATION_WATCHER_DBUS_IFACE "org.ayatana.indicator.custom.NotificationWatcher" + +#define NOTIFICATION_ITEM_DBUS_OBJ "/org/ayatana/indicator/custom/NotificationItem" +#define NOTIFICATION_ITEM_DBUS_IFACE "org.ayatana.indicator.custom.NotificationItem" -- cgit v1.2.3 From 1cee2f386e28a93036c68bb3f7ff96294440713e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 22:17:54 -0600 Subject: Forgot to save. --- src/custom-service-appstore.c | 3 +++ src/dbus-shared.h | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index 5b8f7e0..6368206 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -149,6 +149,9 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const return; } + + + return; } diff --git a/src/dbus-shared.h b/src/dbus-shared.h index 5c56e0b..364ac46 100644 --- a/src/dbus-shared.h +++ b/src/dbus-shared.h @@ -6,6 +6,5 @@ #define NOTIFICATION_WATCHER_DBUS_OBJ "/org/ayatana/indicator/custom/NotificationWatcher" #define NOTIFICATION_WATCHER_DBUS_IFACE "org.ayatana.indicator.custom.NotificationWatcher" -#define NOTIFICATION_ITEM_DBUS_OBJ "/org/ayatana/indicator/custom/NotificationItem" #define NOTIFICATION_ITEM_DBUS_IFACE "org.ayatana.indicator.custom.NotificationItem" -- cgit v1.2.3 From 4bcfbf41887d4b597cf727ed23e4d59946ff7666 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 22:46:30 -0600 Subject: Building the property proxy. --- src/custom-service-appstore.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index 6368206..fc49b83 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -24,6 +24,7 @@ struct _Application { gchar * dbus_name; gchar * dbus_object; DBusGProxy * dbus_proxy; + DBusGProxy * prop_proxy; }; #define CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(o) \ @@ -142,6 +143,7 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const app->dbus_object, NOTIFICATION_ITEM_DBUS_IFACE, &error); + if (error != NULL) { g_warning("Unable to get notification item proxy for object '%s' on host '%s': %s", dbus_object, dbus_name, error->message); g_error_free(error); @@ -149,6 +151,19 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const return; } + app->prop_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, + app->dbus_name, + app->dbus_object, + DBUS_INTERFACE_PROPERTIES, + &error); + + if (error != NULL) { + g_warning("Unable to get property proxy for object '%s' on host '%s': %s", dbus_object, dbus_name, error->message); + g_error_free(error); + g_object_unref(app->dbus_proxy); + g_free(app); + return; + } -- cgit v1.2.3 From ffd996217a130a5252ca804c506205bbbbadef3a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 22:50:48 -0600 Subject: Adding some XML for dbus properties interface. --- .bzrignore | 2 ++ src/Makefile.am | 2 ++ src/dbus-properties.xml | 23 +++++++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 src/dbus-properties.xml diff --git a/.bzrignore b/.bzrignore index 2942d56..4d5f1b0 100644 --- a/.bzrignore +++ b/.bzrignore @@ -29,3 +29,5 @@ src/custom-service-server.h src/custom-service-marshal.c src/custom-service-marshal.h src/stamp-marshal +src/dbus-properties-client.h +src/dbus-properties-server.h diff --git a/src/Makefile.am b/src/Makefile.am index fa0137f..21d7cf8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,6 +39,7 @@ indicator_custom_service_SOURCES = \ custom-service-server.h \ custom-service-watcher.h \ custom-service-watcher.c \ + dbus-properties-client.h \ dbus-shared.h \ notification-item-client.h \ notification-watcher-server.h @@ -96,6 +97,7 @@ libcustomindicator_la_LIBADD = \ DBUS_SPECS = \ custom-service.xml \ + dbus-properties.xml \ notification-item.xml \ notification-watcher.xml diff --git a/src/dbus-properties.xml b/src/dbus-properties.xml new file mode 100644 index 0000000..c172895 --- /dev/null +++ b/src/dbus-properties.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From d0abddaaf72e621a495871e5805cd39a51891b2b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 6 Nov 2009 23:38:22 -0600 Subject: Grabbing the properties and going to town. Turning back into another signal. --- src/custom-service-appstore.c | 46 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index fc49b83..a69bde6 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -5,6 +5,7 @@ #include #include "custom-service-appstore.h" #include "custom-service-marshal.h" +#include "dbus-properties-client.h" #include "dbus-shared.h" /* DBus Prototypes */ @@ -12,6 +13,13 @@ static gboolean _custom_service_server_get_applications (CustomServiceAppstore * #include "custom-service-server.h" +#define NOTIFICATION_ITEM_PROP_ID "Id" +#define NOTIFICATION_ITEM_PROP_CATEGORY "Category" +#define NOTIFICATION_ITEM_PROP_STATUS "Status" +#define NOTIFICATION_ITEM_PROP_ICON_NAME "IconName" +#define NOTIFICATION_ITEM_PROP_AICON_NAME "AttentionIconName" +#define NOTIFICATION_ITEM_PROP_MENU "Menu" + /* Private Stuff */ typedef struct _CustomServiceAppstorePrivate CustomServiceAppstorePrivate; struct _CustomServiceAppstorePrivate { @@ -23,6 +31,7 @@ typedef struct _Application Application; struct _Application { gchar * dbus_name; gchar * dbus_object; + CustomServiceAppstore * appstore; /* not ref'd */ DBusGProxy * dbus_proxy; DBusGProxy * prop_proxy; }; @@ -124,6 +133,37 @@ custom_service_appstore_finalize (GObject *object) return; } +static void +get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * error, gpointer data) +{ + if (error != NULL) { + g_warning("Unable to get properties: %s", error->message); + return; + } + + Application * app = (Application *)data; + + if (g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_MENU) == NULL || + g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ICON_NAME) == NULL) { + g_warning("Notification Item on object %s of %s doesn't have enough properties.", app->dbus_object, app->dbus_name); + g_free(app); // Need to do more than this, but it gives the idea of the flow we're going for. + return; + } + + CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(app->appstore); + priv->applications = g_list_prepend(priv->applications, app); + + g_signal_emit(G_OBJECT(app->appstore), + signals[APPLICATION_ADDED], 0, + g_value_get_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ICON_NAME)), + 0, /* Position */ + app->dbus_name, + g_value_get_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_MENU)), + TRUE); + + return; +} + void custom_service_appstore_application_add (CustomServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) { @@ -136,6 +176,7 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const app->dbus_name = g_strdup(dbus_name); app->dbus_object = g_strdup(dbus_object); + app->appstore = appstore; GError * error = NULL; app->dbus_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, @@ -165,7 +206,10 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const return; } - + org_freedesktop_DBus_Properties_get_all_async(app->prop_proxy, + NOTIFICATION_ITEM_DBUS_IFACE, + get_all_properties_cb, + app); return; } -- cgit v1.2.3