From ec8cd6885a17a2a03fc65c89f6e10f3da42b59de Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 28 Oct 2009 14:52:08 -0500 Subject: Adding the custom-service interface. --- .bzrignore | 2 ++ src/Makefile.am | 1 + src/custom-service.xml | 24 ++++++++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 src/custom-service.xml diff --git a/.bzrignore b/.bzrignore index 7121e6e..f41b607 100644 --- a/.bzrignore +++ b/.bzrignore @@ -24,3 +24,5 @@ tests/test-libcustomindicator-dbus-client tests/test-libcustomindicator-dbus-server tests/libcustomindicator-tests tests/test-libcustomindicator-dbus +src/custom-service-client.h +src/custom-service-server.h diff --git a/src/Makefile.am b/src/Makefile.am index ff5b26e..aace163 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -82,6 +82,7 @@ libcustomindicator_la_LIBADD = \ ################################## DBUS_SPECS = \ + custom-service.xml \ notification-item.xml \ notification-watcher.xml diff --git a/src/custom-service.xml b/src/custom-service.xml new file mode 100644 index 0000000..3d943a2 --- /dev/null +++ b/src/custom-service.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From ecf44bf6a995071c7f0e5760dc3ed03542b993a0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 28 Oct 2009 14:57:38 -0500 Subject: Adding an appstore object to hold all of our apps. --- src/Makefile.am | 3 +++ src/custom-service-appstore.c | 57 +++++++++++++++++++++++++++++++++++++++++++ src/custom-service-appstore.h | 31 +++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/custom-service-appstore.c create mode 100644 src/custom-service-appstore.h diff --git a/src/Makefile.am b/src/Makefile.am index aace163..6f7e6e6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -30,6 +30,9 @@ libexec_PROGRAMS = indicator-custom-service indicator_custom_service_SOURCES = \ custom-service.c \ + custom-service-appstore.h \ + custom-service-appstore.c \ + custom-service-server.h \ notification-item-client.h \ notification-watcher-server.h indicator_custom_service_CFLAGS = \ diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c new file mode 100644 index 0000000..c1bc345 --- /dev/null +++ b/src/custom-service-appstore.c @@ -0,0 +1,57 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "custom-service-appstore.h" + +typedef struct _CustomServiceAppstorePrivate CustomServiceAppstorePrivate; + +struct _CustomServiceAppstorePrivate { + int demo; +}; + +#define CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_SERVICE_APPSTORE_TYPE, CustomServiceAppstorePrivate)) + +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); +static void custom_service_appstore_finalize (GObject *object); + +G_DEFINE_TYPE (CustomServiceAppstore, custom_service_appstore, G_TYPE_OBJECT); + +static void +custom_service_appstore_class_init (CustomServiceAppstoreClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (CustomServiceAppstorePrivate)); + + object_class->dispose = custom_service_appstore_dispose; + object_class->finalize = custom_service_appstore_finalize; + + return; +} + +static void +custom_service_appstore_init (CustomServiceAppstore *self) +{ + + return; +} + +static void +custom_service_appstore_dispose (GObject *object) +{ + + G_OBJECT_CLASS (custom_service_appstore_parent_class)->dispose (object); + return; +} + +static void +custom_service_appstore_finalize (GObject *object) +{ + + G_OBJECT_CLASS (custom_service_appstore_parent_class)->finalize (object); + return; +} diff --git a/src/custom-service-appstore.h b/src/custom-service-appstore.h new file mode 100644 index 0000000..48c9da9 --- /dev/null +++ b/src/custom-service-appstore.h @@ -0,0 +1,31 @@ +#ifndef __CUSTOM_SERVICE_APPSTORE_H__ +#define __CUSTOM_SERVICE_APPSTORE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define CUSTOM_SERVICE_APPSTORE_TYPE (custom_service_appstore_get_type ()) +#define CUSTOM_SERVICE_APPSTORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CUSTOM_SERVICE_APPSTORE_TYPE, CustomServiceAppstore)) +#define CUSTOM_SERVICE_APPSTORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_SERVICE_APPSTORE_TYPE, CustomServiceAppstoreClass)) +#define IS_CUSTOM_SERVICE_APPSTORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_SERVICE_APPSTORE_TYPE)) +#define IS_CUSTOM_SERVICE_APPSTORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_SERVICE_APPSTORE_TYPE)) +#define CUSTOM_SERVICE_APPSTORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_SERVICE_APPSTORE_TYPE, CustomServiceAppstoreClass)) + +typedef struct _CustomServiceAppstore CustomServiceAppstore; +typedef struct _CustomServiceAppstoreClass CustomServiceAppstoreClass; + +struct _CustomServiceAppstoreClass { + GObjectClass parent_class; +}; + +struct _CustomServiceAppstore { + GObject parent; +}; + +GType custom_service_appstore_get_type (void); + +G_END_DECLS + +#endif -- cgit v1.2.3 From 8903841582ea26b4987fbe04b5a5545d8d65f729 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 28 Oct 2009 15:12:46 -0500 Subject: Boom! Now we're implementing dbus. --- src/custom-service-appstore.c | 56 +++++++++++++++++++++++++++++++++++++++++++ src/custom-service.c | 10 ++------ 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index c1bc345..7f88d46 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -4,6 +4,18 @@ #include "custom-service-appstore.h" +/* DBus Prototypes */ +static gboolean _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps, gpointer user_data); + +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); + +#include "custom-service-server.h" +#include "notification-watcher-server.h" + typedef struct _CustomServiceAppstorePrivate CustomServiceAppstorePrivate; struct _CustomServiceAppstorePrivate { @@ -55,3 +67,47 @@ custom_service_appstore_finalize (GObject *object) G_OBJECT_CLASS (custom_service_appstore_parent_class)->finalize (object); return; } + +/* DBus Interface */ +static gboolean +_custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps, gpointer user_data) +{ + + return FALSE; +} + +static gboolean +_notification_watcher_server_register_service (CustomServiceAppstore * appstore, const gchar * service, gpointer user_data) +{ + + return FALSE; +} + +static gboolean +_notification_watcher_server_registered_services (CustomServiceAppstore * appstore, GArray ** apps, gpointer user_data) +{ + + return FALSE; +} + +static gboolean +_notification_watcher_server_protocol_version (CustomServiceAppstore * appstore, char ** version, gpointer user_data) +{ + + return FALSE; +} + +static gboolean +_notification_watcher_server_register_notification_host (CustomServiceAppstore * appstore, const gchar * host, gpointer user_data) +{ + + return FALSE; +} + +static gboolean +_notification_watcher_server_is_notification_host_registered (CustomServiceAppstore * appstore, gboolean * haveHost, gpointer user_data) +{ + + return FALSE; +} + diff --git a/src/custom-service.c b/src/custom-service.c index d96a9de..382fd71 100644 --- a/src/custom-service.c +++ b/src/custom-service.c @@ -1,12 +1,6 @@ -#include "notification-item-client.h" - -void _notification_watcher_server_register_service (void) { }; -void _notification_watcher_server_registered_services (void) { }; -void _notification_watcher_server_protocol_version (void) { }; -void _notification_watcher_server_register_notification_host (void) { }; -void _notification_watcher_server_is_notification_host_registered (void) { }; -#include "notification-watcher-server.h" +#include "notification-item-client.h" +#include "custom-service-appstore.h" int main (int argc, char ** argv) -- cgit v1.2.3 From 714f372137fb2a9a992a6d0c23dc12a58b34c43d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 28 Oct 2009 15:52:48 -0500 Subject: Registering ourselves on dbus --- src/custom-service-appstore.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index 7f88d46..1e61852 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -42,12 +42,29 @@ custom_service_appstore_class_init (CustomServiceAppstoreClass *klass) object_class->dispose = custom_service_appstore_dispose; object_class->finalize = custom_service_appstore_finalize; + 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); + return; } static void custom_service_appstore_init (CustomServiceAppstore *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, + "/my/path", + G_OBJECT(self)); return; } -- cgit v1.2.3 From f2c4a15e281e697bd6222efe80432014f0cef32f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 28 Oct 2009 15:55:28 -0500 Subject: Building our app store --- src/custom-service.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/custom-service.c b/src/custom-service.c index 382fd71..b191bac 100644 --- a/src/custom-service.c +++ b/src/custom-service.c @@ -1,10 +1,19 @@ #include "notification-item-client.h" #include "custom-service-appstore.h" + +static GMainLoop * mainloop = NULL; +static CustomServiceAppstore * appstore = NULL; int main (int argc, char ** argv) { + g_type_init(); + + appstore = CUSTOM_SERVICE_APPSTORE(g_object_new(CUSTOM_SERVICE_APPSTORE_TYPE, NULL)); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); return 0; } -- cgit v1.2.3 From 3d1c4c46fd56576b228bc59dc7b3af3bf82db642 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 2 Nov 2009 17:19:25 -0600 Subject: Boom, make us an indicator service. --- src/custom-service.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/custom-service.c b/src/custom-service.c index b191bac..2f8ecf5 100644 --- a/src/custom-service.c +++ b/src/custom-service.c @@ -1,15 +1,18 @@ +#include "libindicator/indicator-service.h" #include "notification-item-client.h" #include "custom-service-appstore.h" static GMainLoop * mainloop = NULL; static CustomServiceAppstore * appstore = NULL; +static IndicatorService * service = NULL; int main (int argc, char ** argv) { g_type_init(); + service = indicator_service_new("org.ayatana.indicator.custom"); appstore = CUSTOM_SERVICE_APPSTORE(g_object_new(CUSTOM_SERVICE_APPSTORE_TYPE, NULL)); mainloop = g_main_loop_new(NULL, FALSE); -- cgit v1.2.3 From 9aff9ba7149a1757f124db54599637801fa76ae6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 2 Nov 2009 19:52:47 -0600 Subject: Getting the name into a header. --- src/Makefile.am | 2 ++ src/custom-service.c | 3 ++- src/dbus-shared.h | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 src/dbus-shared.h diff --git a/src/Makefile.am b/src/Makefile.am index 6f7e6e6..273c2dc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -12,6 +12,7 @@ include $(top_srcdir)/Makefile.am.enum customlibdir = $(INDICATORDIR) customlib_LTLIBRARIES = libcustom.la libcustom_la_SOURCES = \ + dbus-shared.h \ indicator-custom.c libcustom_la_CFLAGS = $(INDICATOR_CFLAGS) \ -Wall \ @@ -33,6 +34,7 @@ indicator_custom_service_SOURCES = \ custom-service-appstore.h \ custom-service-appstore.c \ custom-service-server.h \ + dbus-shared.h \ notification-item-client.h \ notification-watcher-server.h indicator_custom_service_CFLAGS = \ diff --git a/src/custom-service.c b/src/custom-service.c index 2f8ecf5..df3d58a 100644 --- a/src/custom-service.c +++ b/src/custom-service.c @@ -2,6 +2,7 @@ #include "libindicator/indicator-service.h" #include "notification-item-client.h" #include "custom-service-appstore.h" +#include "dbus-shared.h" static GMainLoop * mainloop = NULL; static CustomServiceAppstore * appstore = NULL; @@ -12,7 +13,7 @@ main (int argc, char ** argv) { g_type_init(); - service = indicator_service_new("org.ayatana.indicator.custom"); + service = indicator_service_new(INDICATOR_CUSTOM_DBUS_ADDR); appstore = CUSTOM_SERVICE_APPSTORE(g_object_new(CUSTOM_SERVICE_APPSTORE_TYPE, NULL)); mainloop = g_main_loop_new(NULL, FALSE); diff --git a/src/dbus-shared.h b/src/dbus-shared.h new file mode 100644 index 0000000..36436bd --- /dev/null +++ b/src/dbus-shared.h @@ -0,0 +1,3 @@ + +#define INDICATOR_CUSTOM_DBUS_ADDR "org.ayatana.indicator.custom" + -- cgit v1.2.3 From d496d7ad4557d8bd09030c47140210a666612a92 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 2 Nov 2009 20:08:07 -0600 Subject: We've got a service manager. Now we'll start ourselves up! --- src/indicator-custom.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index 1a09a9a..d9763ea 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -1,9 +1,20 @@ -#include "libindicator/indicator.h" +#include +#include +#include "dbus-shared.h" INDICATOR_SET_VERSION INDICATOR_SET_NAME("indicator-custom") +IndicatorServiceManager * sm = NULL; + +void +connected (IndicatorServiceManager * sm, gboolean connected, gpointer not_used) +{ + + return; +} + GtkLabel * get_label (void) { @@ -24,5 +35,8 @@ get_menu (void) 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 main_menu; } -- cgit v1.2.3 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 From 23d6b5d0da79ac8afaff855f0eed4811615999f3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Nov 2009 00:14:54 -0600 Subject: Adding a defualt file for a little appliction that'll grow into a full app. --- .bzrignore | 1 + tests/Makefile.am | 19 ++++++++++++++++++- tests/test-simple-app.c | 8 ++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 tests/test-simple-app.c diff --git a/.bzrignore b/.bzrignore index 4d5f1b0..b582d67 100644 --- a/.bzrignore +++ b/.bzrignore @@ -31,3 +31,4 @@ src/custom-service-marshal.h src/stamp-marshal src/dbus-properties-client.h src/dbus-properties-server.h +tests/test-simple-app diff --git a/tests/Makefile.am b/tests/Makefile.am index f6a0525..39cd3a6 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -2,7 +2,8 @@ check_PROGRAMS = \ test-libcustomindicator \ test-libcustomindicator-dbus-client \ - test-libcustomindicator-dbus-server + test-libcustomindicator-dbus-server \ + test-simple-app TESTS = DISTCLEANFILES = $(TESTS) @@ -82,3 +83,19 @@ test-libcustomindicator-dbus: test-libcustomindicator-dbus-client test-libcustom TESTS += test-libcustomindicator-dbus +######################################### +## test-simple-app +######################################### + +test_simple_app_SOURCES = \ + test-simple-app.c + +test_simple_app_CFLAGS = \ + $(INDICATOR_CFLAGS) \ + -Wall -Werror \ + -I$(top_srcdir)/src + +test_simple_app_LDADD = \ + $(INDICATOR_LIBS) \ + $(top_builddir)/src/libcustomindicator.la + diff --git a/tests/test-simple-app.c b/tests/test-simple-app.c new file mode 100644 index 0000000..9c2d164 --- /dev/null +++ b/tests/test-simple-app.c @@ -0,0 +1,8 @@ + +int +main (int argc, char ** argv) +{ + + + return 0; +} -- cgit v1.2.3 From 5c797c35b740399391fecf1cb5bd8eff843d3282 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Nov 2009 00:27:17 -0600 Subject: A simple little app. --- tests/test-simple-app.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test-simple-app.c b/tests/test-simple-app.c index 9c2d164..9e779ec 100644 --- a/tests/test-simple-app.c +++ b/tests/test-simple-app.c @@ -1,8 +1,32 @@ +#include +#include +#include +#include + +static GMainLoop * mainloop = NULL; + int main (int argc, char ** argv) { + g_type_init(); + + DbusmenuServer * dms = dbusmenu_server_new("/menu"); + DbusmenuMenuitem * dmi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(dmi, "label", "Bob"); + + CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, + "id", "test-application", + "status-enum", CUSTOM_INDICATOR_STATUS_ACTIVE, + "icon-name", "system-shutdown", + "menu-object", dms, + NULL)); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + g_object_unref(G_OBJECT(ci)); + g_debug("Quiting"); return 0; } -- cgit v1.2.3 From 3d71f7f6f3da9d796bc7c9050d8b6df0eeb1179d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 9 Nov 2009 21:55:02 -0600 Subject: Adding in the dbus shared header. --- src/libcustomindicator/custom-indicator.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libcustomindicator/custom-indicator.c b/src/libcustomindicator/custom-indicator.c index a4835cc..6138daf 100644 --- a/src/libcustomindicator/custom-indicator.c +++ b/src/libcustomindicator/custom-indicator.c @@ -11,6 +11,8 @@ #include "notification-item-server.h" #include "notification-watcher-client.h" +#include "../dbus-shared.h" + /** CustomIndicatorPrivate: @id: The ID of the indicator. Maps to CustomIndicator::id. -- cgit v1.2.3 From f7cfd25bc2cf4696a579d8b7374666ee5e6bb3b3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 11:44:29 -0600 Subject: Adding a remove function and switching to the position in the list being the position. --- src/indicator-custom.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index 7cb9142..3bd2aa9 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -55,7 +55,6 @@ struct _IndicatorCustomPrivate { typedef struct _ApplicationEntry ApplicationEntry; struct _ApplicationEntry { - guint position; IndicatorObjectEntry entry; }; @@ -115,7 +114,7 @@ indicator_custom_dispose (GObject *object) while (priv->applications != NULL) { application_removed(priv->service_proxy, - ((ApplicationEntry *)priv->applications->data)->position, + 0, INDICATOR_CUSTOM(object)); } @@ -237,20 +236,44 @@ application_added (DBusGProxy * proxy, const gchar * iconname, gint position, co 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); + priv->applications = g_list_insert(priv->applications, app, position); + /* TODO: Need to deal with position here somehow */ g_signal_emit(G_OBJECT(custom), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED_ID, 0, &(app->entry), TRUE); return; } +/* This removes the application from the list and free's all + of the memory associated with it. */ static void -application_removed (DBusGProxy * proxy, gint position , IndicatorCustom * custom) +application_removed (DBusGProxy * proxy, gint position, IndicatorCustom * custom) { + IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(custom); + ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position); + + if (app == NULL) { + g_warning("Unable to find application at position: %d", position); + return; + } + + priv->applications = g_list_remove(priv->applications, app); + g_signal_emit(G_OBJECT(custom), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED_ID, 0, &(app->entry), TRUE); + + if (app->entry.image != NULL) { + g_object_unref(G_OBJECT(app->entry.image)); + } + if (app->entry.label != NULL) { + g_warning("Odd, an application indicator with a label?"); + g_object_unref(G_OBJECT(app->entry.label)); + } + if (app->entry.menu != NULL) { + g_object_unref(G_OBJECT(app->entry.menu)); + } + g_free(app); return; } -- cgit v1.2.3 From f22ff6a153ca3b6ebc6cab0177913823f0251be7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 12:02:40 -0600 Subject: Cleaning up main a little bit and handling the 'disconnected' case that doesn't yet quite exist. --- src/custom-service.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/custom-service.c b/src/custom-service.c index 3205bc2..5bd9b96 100644 --- a/src/custom-service.c +++ b/src/custom-service.c @@ -5,22 +5,52 @@ #include "custom-service-watcher.h" #include "dbus-shared.h" +/* The base main loop */ static GMainLoop * mainloop = NULL; +/* Where the application registry lives */ static CustomServiceAppstore * appstore = NULL; +/* Interface for applications */ static CustomServiceWatcher * watcher = NULL; +/* The service management interface */ static IndicatorService * service = NULL; + +/* Recieves the disonnection signal from the service + object and closes the mainloop. */ +static void +service_disconnected (IndicatorService * service, gpointer data) +{ + g_debug("Service disconnected"); + if (mainloop != NULL) { + g_main_loop_quit(mainloop); + } + return; +} +/* Builds up the core objects and puts us spinning into + a main loop. */ int main (int argc, char ** argv) { g_type_init(); + /* Bring us up as a basic indicator service */ service = indicator_service_new(INDICATOR_CUSTOM_DBUS_ADDR); + g_signal_connect(G_OBJECT(service), "disconnected", G_CALLBACK(service_disconnected), NULL); + + /* Building our app store */ appstore = CUSTOM_SERVICE_APPSTORE(g_object_new(CUSTOM_SERVICE_APPSTORE_TYPE, NULL)); + + /* Adding a watcher for the Apps coming up */ watcher = custom_service_watcher_new(appstore); + /* Building and executing our main loop */ mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); + /* Unref'ing all the objects */ + g_object_unref(G_OBJECT(watcher)); + g_object_unref(G_OBJECT(appstore)); + g_object_unref(G_OBJECT(service)); + return 0; } -- cgit v1.2.3 From efd63e3ff881a38bdbd466774dcf506b485166c2 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 12:52:14 -0600 Subject: Fixing custom indicator watcher object path. --- src/custom-service-watcher.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/custom-service-watcher.c b/src/custom-service-watcher.c index a0a1b27..7cc15ee 100644 --- a/src/custom-service-watcher.c +++ b/src/custom-service-watcher.c @@ -104,7 +104,7 @@ custom_service_watcher_init (CustomServiceWatcher *self) } dbus_g_connection_register_g_object(session_bus, - INDICATOR_CUSTOM_DBUS_OBJ "/more", + NOTIFICATION_WATCHER_DBUS_OBJ, G_OBJECT(self)); return; -- cgit v1.2.3 From 5a87d20ea3873748036185ae74da33ed88cf9d63 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 13:09:58 -0600 Subject: Commenting. --- src/custom-service-appstore.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index a69bde6..81910dd 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -164,20 +164,27 @@ get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * err return; } +/* Adding a new NotificationItem object from DBus in to the + appstore. First, we need to get the information on it + though. */ void custom_service_appstore_application_add (CustomServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) { + /* Make sure we got a sensible request */ 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); + /* Build the application entry. This will be carried + along until we're sure we've got everything. */ Application * app = g_new(Application, 1); app->dbus_name = g_strdup(dbus_name); app->dbus_object = g_strdup(dbus_object); app->appstore = appstore; + /* Get the DBus proxy for the NotificationItem interface */ GError * error = NULL; app->dbus_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, app->dbus_name, @@ -192,6 +199,7 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const return; } + /* Grab the property proxy interface */ app->prop_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, app->dbus_name, app->dbus_object, @@ -206,11 +214,14 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const return; } + /* Get all the propertiees */ org_freedesktop_DBus_Properties_get_all_async(app->prop_proxy, NOTIFICATION_ITEM_DBUS_IFACE, get_all_properties_cb, app); + /* We're returning, nothing is yet added until the properties + come back and give us more info. */ return; } -- cgit v1.2.3 From 9a4835415f4df9b906a4d489245b0aecab43c09d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 13:26:32 -0600 Subject: Adding in a TODO --- src/custom-service-appstore.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index 81910dd..6cb2dd9 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -152,6 +152,10 @@ get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * err CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(app->appstore); priv->applications = g_list_prepend(priv->applications, app); + + /* TODO: We need to have the position determined better. This + would involve looking at the name and category and sorting + it with the other entries. */ g_signal_emit(G_OBJECT(app->appstore), signals[APPLICATION_ADDED], 0, -- cgit v1.2.3 From 2c04418795e644efafc0204656dd575844ba0976 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 14:51:51 -0600 Subject: Connecting to a notification watcher. --- src/libcustomindicator/custom-indicator.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/libcustomindicator/custom-indicator.c b/src/libcustomindicator/custom-indicator.c index 6138daf..b2d1384 100644 --- a/src/libcustomindicator/custom-indicator.c +++ b/src/libcustomindicator/custom-indicator.c @@ -11,7 +11,7 @@ #include "notification-item-server.h" #include "notification-watcher-client.h" -#include "../dbus-shared.h" +#include "dbus-shared.h" /** CustomIndicatorPrivate: @@ -93,6 +93,7 @@ static void custom_indicator_set_property (GObject * object, guint prop_id, cons static void custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* Other stuff */ static void check_connect (CustomIndicator * self); +static void register_service_cb (DBusGProxy * proxy, GError * error, gpointer data); /* GObject type */ G_DEFINE_TYPE (CustomIndicator, custom_indicator, G_TYPE_OBJECT); @@ -279,10 +280,25 @@ custom_indicator_init (CustomIndicator *self) g_error_free(error); return; } + dbus_g_connection_register_g_object(connection, "/need/a/path", G_OBJECT(self)); + priv->watcher_proxy = dbus_g_proxy_new_for_name_owner(connection, + INDICATOR_CUSTOM_DBUS_ADDR, + NOTIFICATION_WATCHER_DBUS_OBJ, + NOTIFICATION_WATCHER_DBUS_IFACE, + &error); + if (error != NULL) { + g_warning("Unable to create Ayatana Watcher proxy! %s", error->message); + /* TODO: This is where we should start looking at fallbacks */ + g_error_free(error); + return; + } + + org_ayatana_indicator_custom_NotificationWatcher_register_service_async(priv->watcher_proxy, "/need/a/path", register_service_cb, self); + return; } @@ -600,6 +616,15 @@ check_connect (CustomIndicator * self) } +static void +register_service_cb (DBusGProxy * proxy, GError * error, gpointer data) +{ + if (error != NULL) { + g_warning("Unable to connect to the Notification Watcher: %s", error->message); + } + return; +} + /* ************************* */ /* Public Functions */ -- cgit v1.2.3 From 62f0373e2b8c8bb54fd4c72182d40622fad1215b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 15:44:18 -0600 Subject: Making a simple client --- .bzrignore | 3 +++ Makefile.am | 1 + configure.ac | 1 + example/Makefile.am | 19 +++++++++++++++++++ example/simple-client.c | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+) create mode 100644 example/Makefile.am create mode 100644 example/simple-client.c diff --git a/.bzrignore b/.bzrignore index b582d67..0a09d4f 100644 --- a/.bzrignore +++ b/.bzrignore @@ -32,3 +32,6 @@ src/stamp-marshal src/dbus-properties-client.h src/dbus-properties-server.h tests/test-simple-app +example/.deps +example/.libs +example/simple-client diff --git a/Makefile.am b/Makefile.am index 4eb69d7..33f9f3e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,6 @@ SUBDIRS = data \ src \ + example \ tests DISTCHECK_CONFIGURE_FLAGS = --enable-localinstall diff --git a/configure.ac b/configure.ac index 015677c..d76aec8 100644 --- a/configure.ac +++ b/configure.ac @@ -81,6 +81,7 @@ Makefile src/Makefile data/Makefile tests/Makefile +example/Makefile ]) ########################### diff --git a/example/Makefile.am b/example/Makefile.am new file mode 100644 index 0000000..954b04e --- /dev/null +++ b/example/Makefile.am @@ -0,0 +1,19 @@ + +check_PROGRAMS = \ + simple-client + +######################################### +## simple-client +######################################### + +simple_client_SOURCES = \ + simple-client.c + +simple_client_CFLAGS = \ + $(INDICATOR_CFLAGS) \ + -Wall -Werror \ + -I$(top_srcdir)/src + +simple_client_LDADD = \ + $(INDICATOR_LIBS) \ + $(top_builddir)/src/libcustomindicator.la diff --git a/example/simple-client.c b/example/simple-client.c new file mode 100644 index 0000000..1c29647 --- /dev/null +++ b/example/simple-client.c @@ -0,0 +1,34 @@ + +#include "libcustomindicator/custom-indicator.h" +#include "libdbusmenu-glib/server.h" +#include "libdbusmenu-glib/menuitem.h" + +GMainLoop * mainloop = NULL; + +int +main (int argc, char ** argv) +{ + g_type_init(); + + CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); + g_assert(ci != NULL); + + custom_indicator_set_id(ci, "example-simple-client"); + custom_indicator_set_category(ci, CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); + custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); + custom_indicator_set_icon(ci, "indicator-messages"); + custom_indicator_set_attention_icon(ci, "indicator-messages-new"); + + DbusmenuMenuitem * root = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(root, "label", "Root"); + + DbusmenuServer * menuservice = dbusmenu_server_new ("/need/a/menu/path"); + dbusmenu_server_set_root(menuservice, root); + + custom_indicator_set_menu(ci, menuservice); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + return 0; +} -- cgit v1.2.3 From 009e468befbd97cf69263b47a01bc66d9a119d66 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 15:59:30 -0600 Subject: Adding a debug message on getting an application. --- src/custom-service-appstore.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index 6cb2dd9..fdb227a 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -174,6 +174,8 @@ get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * err void custom_service_appstore_application_add (CustomServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) { + g_debug("Adding new application: %s:%s", dbus_name, dbus_object); + /* Make sure we got a sensible request */ g_return_if_fail(IS_CUSTOM_SERVICE_APPSTORE(appstore)); g_return_if_fail(dbus_name != NULL && dbus_name[0] != '\0'); -- cgit v1.2.3 From 25d690a42cb12ca9136932d7ace759bbe4185f86 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 16:35:45 -0600 Subject: Registering marshallers for DBus in the indicator. --- src/Makefile.am | 1 + src/indicator-custom.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index 21d7cf8..102804e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,6 +13,7 @@ include $(top_srcdir)/Makefile.am.marshal customlibdir = $(INDICATORDIR) customlib_LTLIBRARIES = libcustom.la libcustom_la_SOURCES = \ + custom-service-marshal.c \ dbus-shared.h \ indicator-custom.c libcustom_la_CFLAGS = $(INDICATOR_CFLAGS) \ diff --git a/src/indicator-custom.c b/src/indicator-custom.c index 3bd2aa9..53e2269 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -16,6 +16,7 @@ /* Local Stuff */ #include "dbus-shared.h" #include "custom-service-client.h" +#include "custom-service-marshal.h" #define INDICATOR_CUSTOM_TYPE (indicator_custom_get_type ()) #define INDICATOR_CUSTOM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INDICATOR_CUSTOM_TYPE, IndicatorCustom)) @@ -87,6 +88,10 @@ indicator_custom_class_init (IndicatorCustomClass *klass) io_class->get_entries = get_entries; + /* Register the marshallers for the dbus signals */ + dbus_g_object_register_marshaller(g_cclosure_marshal_VOID__INT, G_TYPE_INT, G_TYPE_INVALID); + dbus_g_object_register_marshaller(_custom_service_marshal_VOID__STRING_INT_STRING_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); + return; } @@ -184,6 +189,7 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c G_TYPE_INT, G_TYPE_NONE); + /* Connect to them */ dbus_g_proxy_connect_signal(priv->service_proxy, "ApplicationAdded", G_CALLBACK(application_added), -- cgit v1.2.3 From 756b6c9aa6b03489fb47b2ecc82944df0fd54bad Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 16:51:01 -0600 Subject: Forgot return types. --- src/indicator-custom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index 53e2269..a32db80 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -89,8 +89,8 @@ indicator_custom_class_init (IndicatorCustomClass *klass) io_class->get_entries = get_entries; /* Register the marshallers for the dbus signals */ - dbus_g_object_register_marshaller(g_cclosure_marshal_VOID__INT, G_TYPE_INT, G_TYPE_INVALID); - dbus_g_object_register_marshaller(_custom_service_marshal_VOID__STRING_INT_STRING_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_object_register_marshaller(g_cclosure_marshal_VOID__INT, G_TYPE_NONE, G_TYPE_INT, G_TYPE_INVALID); + dbus_g_object_register_marshaller(_custom_service_marshal_VOID__STRING_INT_STRING_STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); return; } -- cgit v1.2.3 From f0b58f56e4495d5a499fe165f1a7c48aac11e5ef Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 17:33:26 -0600 Subject: Moving the registration of the marshallers until after the proxy. Odd that I'd have to do this, but let's try. --- src/indicator-custom.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index a32db80..e505e7a 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -88,10 +88,6 @@ indicator_custom_class_init (IndicatorCustomClass *klass) io_class->get_entries = get_entries; - /* Register the marshallers for the dbus signals */ - dbus_g_object_register_marshaller(g_cclosure_marshal_VOID__INT, G_TYPE_NONE, G_TYPE_INT, G_TYPE_INVALID); - dbus_g_object_register_marshaller(_custom_service_marshal_VOID__STRING_INT_STRING_STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); - return; } @@ -176,6 +172,10 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c INDICATOR_CUSTOM_DBUS_IFACE, &error); + /* Register the marshallers for the dbus signals */ + dbus_g_object_register_marshaller(g_cclosure_marshal_VOID__INT, G_TYPE_NONE, G_TYPE_INT, G_TYPE_INVALID); + dbus_g_object_register_marshaller(_custom_service_marshal_VOID__STRING_INT_STRING_STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); + /* Set up proxy signals */ dbus_g_proxy_add_signal(priv->service_proxy, "ApplicationAdded", -- cgit v1.2.3 From 6caead9f4b7ac3ec6347a83eb69979add5db8632 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 23 Nov 2009 17:38:00 -0600 Subject: I really shouldn't have to register marshalers. Srsly. --- src/indicator-custom.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index e505e7a..964d8aa 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -172,11 +172,8 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c INDICATOR_CUSTOM_DBUS_IFACE, &error); - /* Register the marshallers for the dbus signals */ - dbus_g_object_register_marshaller(g_cclosure_marshal_VOID__INT, G_TYPE_NONE, G_TYPE_INT, G_TYPE_INVALID); - dbus_g_object_register_marshaller(_custom_service_marshal_VOID__STRING_INT_STRING_STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); - /* Set up proxy signals */ + g_debug("Setup proxy signals"); dbus_g_proxy_add_signal(priv->service_proxy, "ApplicationAdded", G_TYPE_STRING, @@ -190,6 +187,7 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c G_TYPE_NONE); /* Connect to them */ + g_debug("Connect to them."); dbus_g_proxy_connect_signal(priv->service_proxy, "ApplicationAdded", G_CALLBACK(application_added), @@ -202,6 +200,7 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c NULL /* Disconnection Signal */); /* Query it for existing applications */ + g_debug("Request current apps"); org_ayatana_indicator_custom_service_get_applications_async(priv->service_proxy, get_applications, custom); -- cgit v1.2.3 From c8faaf3f5490dc8b516b6944432d1de8f05248cc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 24 Nov 2009 11:23:21 -0600 Subject: Fixing Marshallers so that everything is happy-happy. --- src/indicator-custom.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index 964d8aa..56f1032 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -88,6 +88,14 @@ indicator_custom_class_init (IndicatorCustomClass *klass) io_class->get_entries = get_entries; + dbus_g_object_register_marshaller(_custom_service_marshal_VOID__STRING_INT_STRING_STRING, + G_TYPE_NONE, + G_TYPE_STRING, + G_TYPE_INT, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_INVALID); + return; } @@ -180,11 +188,11 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_NONE); + G_TYPE_INVALID); dbus_g_proxy_add_signal(priv->service_proxy, "ApplicationRemoved", G_TYPE_INT, - G_TYPE_NONE); + G_TYPE_INVALID); /* Connect to them */ g_debug("Connect to them."); -- cgit v1.2.3 From 314754fe25afd90caa38581d3e9e0d2c1cf43b70 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 24 Nov 2009 13:03:56 -0600 Subject: Building a little more of a menu item for testing. --- example/simple-client.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/example/simple-client.c b/example/simple-client.c index 1c29647..f1f53e1 100644 --- a/example/simple-client.c +++ b/example/simple-client.c @@ -20,7 +20,14 @@ main (int argc, char ** argv) custom_indicator_set_attention_icon(ci, "indicator-messages-new"); DbusmenuMenuitem * root = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(root, "label", "Root"); + + DbusmenuMenuitem * item = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_LABEL, "Item 1"); + dbusmenu_menuitem_child_append(root, item); + + item = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_LABEL, "Item 2"); + dbusmenu_menuitem_child_append(root, item); DbusmenuServer * menuservice = dbusmenu_server_new ("/need/a/menu/path"); dbusmenu_server_set_root(menuservice, root); -- cgit v1.2.3 From 254386fc933403d7b4ab559d6c9aa5dfb1234492 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 24 Nov 2009 13:04:41 -0600 Subject: Ignoring the marshallers --- .bzrignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.bzrignore b/.bzrignore index 0a09d4f..ca8d63a 100644 --- a/.bzrignore +++ b/.bzrignore @@ -35,3 +35,4 @@ tests/test-simple-app example/.deps example/.libs example/simple-client +src/libcustom_la-custom-service-marshal.lo -- cgit v1.2.3 From ce09817718cd7fd41b55c3ec1476f7ebe8834b46 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 24 Nov 2009 14:06:05 -0600 Subject: Showing the icon. Now we can put things up in the menu! Finally. --- src/indicator-custom.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/indicator-custom.c b/src/indicator-custom.c index 56f1032..da89c30 100644 --- a/src/indicator-custom.c +++ b/src/indicator-custom.c @@ -246,6 +246,7 @@ get_entries (IndicatorObject * io) static void application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, IndicatorCustom * custom) { + g_debug("Building new application entry: %s with icon: %s", dbusaddress, iconname); IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(custom); ApplicationEntry * app = g_new(ApplicationEntry, 1); @@ -253,6 +254,8 @@ application_added (DBusGProxy * proxy, const gchar * iconname, gint position, co app->entry.label = NULL; app->entry.menu = GTK_MENU(dbusmenu_gtkmenu_new((gchar *)dbusaddress, (gchar *)dbusobject)); + gtk_widget_show(GTK_WIDGET(app->entry.image)); + priv->applications = g_list_insert(priv->applications, app, position); /* TODO: Need to deal with position here somehow */ -- cgit v1.2.3 From 4b23fc39d2fed996dd651d101dc1fb0a5b76d8f0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 24 Nov 2009 15:17:03 -0600 Subject: Woot, basic remove support. Causes warnings, but it works. --- src/custom-service-appstore.c | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c index fdb227a..bdf8ffb 100644 --- a/src/custom-service-appstore.c +++ b/src/custom-service-appstore.c @@ -168,6 +168,51 @@ get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * err return; } +/* A simple global function for dealing with freeing the information + in an Application structure */ +static void +application_free (Application * app) +{ + if (app == NULL) return; + + if (app->dbus_name != NULL) { + g_free(app->dbus_name); + } + if (app->dbus_object != NULL) { + g_free(app->dbus_object); + } + + g_free(app); + return; +} + +/* Gets called when the proxy is destroyed, which is usually when it + drops off of the bus. */ +static void +application_removed_cb (DBusGProxy * proxy, gpointer userdata) +{ + Application * app = (Application *)userdata; + CustomServiceAppstore * appstore = app->appstore; + CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(appstore); + + GList * applistitem = g_list_find(priv->applications, app); + if (applistitem == NULL) { + g_warning("Removing an application that isn't in the application list?"); + return; + } + + gint position = g_list_position(priv->applications, applistitem); + + g_signal_emit(G_OBJECT(appstore), + signals[APPLICATION_REMOVED], 0, + position, TRUE); + + priv->applications = g_list_remove(priv->applications, app); + + application_free(app); + return; +} + /* Adding a new NotificationItem object from DBus in to the appstore. First, we need to get the information on it though. */ @@ -204,6 +249,9 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const g_free(app); return; } + + /* We've got it, let's watch it for destruction */ + g_signal_connect(G_OBJECT(app->dbus_proxy), "destroy", G_CALLBACK(application_removed_cb), app); /* Grab the property proxy interface */ app->prop_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, -- cgit v1.2.3 From 8c7ce8faffe025e5c5cf8f4f23d9cf97cf719533 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 24 Nov 2009 17:03:24 -0600 Subject: Moving the connection code into a function that is called to check to see if we have enough data. This fixes distcheck after the merge from main. --- src/libcustomindicator/custom-indicator.c | 52 ++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/src/libcustomindicator/custom-indicator.c b/src/libcustomindicator/custom-indicator.c index 6ade629..8d6633a 100644 --- a/src/libcustomindicator/custom-indicator.c +++ b/src/libcustomindicator/custom-indicator.c @@ -38,6 +38,7 @@ struct _CustomIndicatorPrivate { /* Fun stuff */ DBusGProxy * watcher_proxy; + DBusGConnection * connection; }; /* Signals Stuff */ @@ -270,34 +271,21 @@ custom_indicator_init (CustomIndicator *self) priv->menu = NULL; priv->watcher_proxy = NULL; + priv->connection = NULL; /* Put the object on DBus */ GError * error = NULL; - DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + priv->connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error); if (error != NULL) { g_error("Unable to connect to the session bus when creating custom indicator: %s", error->message); g_error_free(error); return; } - dbus_g_connection_register_g_object(connection, + dbus_g_connection_register_g_object(priv->connection, "/need/a/path", G_OBJECT(self)); - priv->watcher_proxy = dbus_g_proxy_new_for_name_owner(connection, - INDICATOR_CUSTOM_DBUS_ADDR, - NOTIFICATION_WATCHER_DBUS_OBJ, - NOTIFICATION_WATCHER_DBUS_IFACE, - &error); - if (error != NULL) { - g_warning("Unable to create Ayatana Watcher proxy! %s", error->message); - /* TODO: This is where we should start looking at fallbacks */ - g_error_free(error); - return; - } - - org_ayatana_indicator_custom_NotificationWatcher_register_service_async(priv->watcher_proxy, "/need/a/path", register_service_cb, self); - return; } @@ -321,8 +309,7 @@ custom_indicator_dispose (GObject *object) } if (priv->watcher_proxy != NULL) { - DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); - dbus_g_connection_flush(session_bus); + dbus_g_connection_flush(priv->connection); g_object_unref(G_OBJECT(priv->watcher_proxy)); priv->watcher_proxy = NULL; } @@ -439,6 +426,7 @@ custom_indicator_set_property (GObject * object, guint prop_id, const GValue * v } else { WARN_BAD_TYPE(PROP_ICON_NAME_S, value); } + check_connect(self); break; /* *********************** */ case PROP_ATTENTION_ICON_NAME: @@ -473,6 +461,7 @@ custom_indicator_set_property (GObject * object, guint prop_id, const GValue * v } else { WARN_BAD_TYPE(PROP_MENU_S, value); } + check_connect(self); break; /* *********************** */ default: @@ -606,16 +595,43 @@ custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, static void check_connect (CustomIndicator * self) { + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + /* We're alreadying connecting or trying to connect. */ + if (priv->watcher_proxy != NULL) return; + /* Do we have enough information? */ + if (priv->menu == NULL) return; + if (priv->icon_name == NULL) return; + if (priv->id == NULL) return; + GError * error = NULL; + priv->watcher_proxy = dbus_g_proxy_new_for_name_owner(priv->connection, + INDICATOR_CUSTOM_DBUS_ADDR, + NOTIFICATION_WATCHER_DBUS_OBJ, + NOTIFICATION_WATCHER_DBUS_IFACE, + &error); + if (error != NULL) { + g_warning("Unable to create Ayatana Watcher proxy! %s", error->message); + /* TODO: This is where we should start looking at fallbacks */ + g_error_free(error); + return; + } + + org_ayatana_indicator_custom_NotificationWatcher_register_service_async(priv->watcher_proxy, "/need/a/path", register_service_cb, self); + return; } static void register_service_cb (DBusGProxy * proxy, GError * error, gpointer data) { + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(data); + if (error != NULL) { g_warning("Unable to connect to the Notification Watcher: %s", error->message); + g_object_unref(G_OBJECT(priv->watcher_proxy)); + priv->watcher_proxy = NULL; } return; } -- cgit v1.2.3