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. --- src/Makefile.am | 1 + src/custom-service.xml | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/custom-service.xml (limited to 'src') 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 (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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(+) (limited to 'src') 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(+) (limited to 'src') 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 (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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. --- src/Makefile.am | 6 ++++++ src/custom-service-appstore.c | 3 ++- src/custom-service-marshal.list | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 src/custom-service-marshal.list (limited to 'src') 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 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 (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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. --- src/Makefile.am | 2 ++ src/dbus-properties.xml | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/dbus-properties.xml (limited to 'src') 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(-) (limited to 'src') 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 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(+) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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 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(+) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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 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(+) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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 From ad2afb8723f171a9a3d952761172f3ba1be0d808 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 24 Nov 2009 21:55:10 -0600 Subject: Changing all the dbus names. --- src/custom-service.xml | 2 +- src/dbus-shared.h | 12 ++++++------ src/notification-item.xml | 2 +- src/notification-watcher.xml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/custom-service.xml b/src/custom-service.xml index 3d943a2..ec96297 100644 --- a/src/custom-service.xml +++ b/src/custom-service.xml @@ -1,6 +1,6 @@ - + diff --git a/src/dbus-shared.h b/src/dbus-shared.h index 364ac46..ce7e813 100644 --- a/src/dbus-shared.h +++ b/src/dbus-shared.h @@ -1,10 +1,10 @@ -#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.application" +#define INDICATOR_CUSTOM_DBUS_OBJ "/org/ayatana/indicator/application/service" +#define INDICATOR_CUSTOM_DBUS_IFACE "org.ayatana.indicator.application.service" -#define NOTIFICATION_WATCHER_DBUS_OBJ "/org/ayatana/indicator/custom/NotificationWatcher" -#define NOTIFICATION_WATCHER_DBUS_IFACE "org.ayatana.indicator.custom.NotificationWatcher" +#define NOTIFICATION_WATCHER_DBUS_OBJ "/org/ayatana/indicator/application/NotificationWatcher" +#define NOTIFICATION_WATCHER_DBUS_IFACE "org.ayatana.indicator.application.NotificationWatcher" -#define NOTIFICATION_ITEM_DBUS_IFACE "org.ayatana.indicator.custom.NotificationItem" +#define NOTIFICATION_ITEM_DBUS_IFACE "org.ayatana.indicator.application.NotificationItem" diff --git a/src/notification-item.xml b/src/notification-item.xml index f3a4792..c28cc54 100644 --- a/src/notification-item.xml +++ b/src/notification-item.xml @@ -1,6 +1,6 @@ - + diff --git a/src/notification-watcher.xml b/src/notification-watcher.xml index 7b034e7..2ef54a0 100644 --- a/src/notification-watcher.xml +++ b/src/notification-watcher.xml @@ -1,6 +1,6 @@ - + -- cgit v1.2.3 From fc1e08a7c7873005d9161da2ea677908d07f3fcc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 09:52:16 -0600 Subject: Total insane rename. Probably broke more than a few things. --- src/Makefile.am | 78 +- src/application-service-appstore.c | 300 ++++++++ src/application-service-appstore.h | 40 + src/application-service-marshal.list | 1 + src/application-service-watcher.c | 183 +++++ src/application-service-watcher.h | 40 + src/application-service.c | 56 ++ src/application-service.xml | 24 + src/custom-service-appstore.c | 300 -------- src/custom-service-appstore.h | 40 - src/custom-service-marshal.list | 1 - src/custom-service-watcher.c | 183 ----- src/custom-service-watcher.h | 40 - src/custom-service.c | 56 -- src/custom-service.xml | 24 - src/indicator-application.c | 304 ++++++++ src/indicator-custom.c | 304 -------- .../application-indicator-enum-types.c.in | 33 + .../application-indicator-enum-types.h.in | 33 + .../application-indicator.c | 847 +++++++++++++++++++++ .../application-indicator.h | 142 ++++ .../custom-indicator-enum-types.c.in | 33 - .../custom-indicator-enum-types.h.in | 33 - src/libcustomindicator/custom-indicator.c | 847 --------------------- src/libcustomindicator/custom-indicator.h | 142 ---- 25 files changed, 2042 insertions(+), 2042 deletions(-) create mode 100644 src/application-service-appstore.c create mode 100644 src/application-service-appstore.h create mode 100644 src/application-service-marshal.list create mode 100644 src/application-service-watcher.c create mode 100644 src/application-service-watcher.h create mode 100644 src/application-service.c create mode 100644 src/application-service.xml delete mode 100644 src/custom-service-appstore.c delete mode 100644 src/custom-service-appstore.h delete mode 100644 src/custom-service-marshal.list delete mode 100644 src/custom-service-watcher.c delete mode 100644 src/custom-service-watcher.h delete mode 100644 src/custom-service.c delete mode 100644 src/custom-service.xml create mode 100644 src/indicator-application.c delete mode 100644 src/indicator-custom.c create mode 100644 src/libapplicationindicator/application-indicator-enum-types.c.in create mode 100644 src/libapplicationindicator/application-indicator-enum-types.h.in create mode 100644 src/libapplicationindicator/application-indicator.c create mode 100644 src/libapplicationindicator/application-indicator.h delete mode 100644 src/libcustomindicator/custom-indicator-enum-types.c.in delete mode 100644 src/libcustomindicator/custom-indicator-enum-types.h.in delete mode 100644 src/libcustomindicator/custom-indicator.c delete mode 100644 src/libcustomindicator/custom-indicator.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 102804e..ddcbdfd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -10,86 +10,86 @@ include $(top_srcdir)/Makefile.am.marshal # Indicator ################################## -customlibdir = $(INDICATORDIR) -customlib_LTLIBRARIES = libcustom.la -libcustom_la_SOURCES = \ - custom-service-marshal.c \ +applicationlibdir = $(INDICATORDIR) +applicationlib_LTLIBRARIES = libapplication.la +libapplication_la_SOURCES = \ + application-service-marshal.c \ dbus-shared.h \ - indicator-custom.c -libcustom_la_CFLAGS = $(INDICATOR_CFLAGS) \ + indicator-application.c +libapplication_la_CFLAGS = $(INDICATOR_CFLAGS) \ -Wall \ -Wl,-Bsymbolic-functions \ -Wl,-z,defs \ -Wl,--as-needed \ -Werror -libcustom_la_LIBADD = $(INDICATOR_LIBS) -libcustom_la_LDFLAGS = -module -avoid-version +libapplication_la_LIBADD = $(INDICATOR_LIBS) +libapplication_la_LDFLAGS = -module -avoid-version ################################## # Service ################################## -libexec_PROGRAMS = indicator-custom-service - -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 \ - custom-service-watcher.h \ - custom-service-watcher.c \ +libexec_PROGRAMS = indicator-application-service + +indicator_application_service_SOURCES = \ + application-service.c \ + application-service-appstore.h \ + application-service-appstore.c \ + application-service-marshal.h \ + application-service-marshal.c \ + application-service-server.h \ + application-service-watcher.h \ + application-service-watcher.c \ dbus-properties-client.h \ dbus-shared.h \ notification-item-client.h \ notification-watcher-server.h -indicator_custom_service_CFLAGS = \ +indicator_application_service_CFLAGS = \ $(INDICATOR_CFLAGS) \ -Wall -Werror -indicator_custom_service_LDADD = \ +indicator_application_service_LDADD = \ $(INDICATOR_LIBS) -glib_marshal_list = custom-service-marshal.list -glib_marshal_prefix = _custom_service_marshal +glib_marshal_list = application-service-marshal.list +glib_marshal_prefix = _application_service_marshal ################################## # Library ################################## -glib_enum_h = libcustomindicator/custom-indicator-enum-types.h -glib_enum_c = libcustomindicator/custom-indicator-enum-types.c -glib_enum_headers = $(libcustomindicator_headers) +glib_enum_h = libapplicationindicator/application-indicator-enum-types.h +glib_enum_c = libapplicationindicator/application-indicator-enum-types.c +glib_enum_headers = $(libapplicationindicator_headers) lib_LTLIBRARIES = \ - libcustomindicator.la + libapplicationindicator.la -libcustomindicatorincludedir=$(includedir)/libcustomindicator-0.1/libcustomindicator +libapplicationindicatorincludedir=$(includedir)/libapplicationindicator-0.1/libapplicationindicator -libcustomindicator_headers = \ - $(srcdir)/libcustomindicator/custom-indicator.h +libapplicationindicator_headers = \ + $(srcdir)/libapplicationindicator/application-indicator.h -libcustomindicatorinclude_HEADERS = \ - $(libcustomindicator_headers) \ +libapplicationindicatorinclude_HEADERS = \ + $(libapplicationindicator_headers) \ $(glib_enum_h) -libcustomindicator_la_SOURCES = \ - $(libcustomindicator_headers) \ +libapplicationindicator_la_SOURCES = \ + $(libapplicationindicator_headers) \ $(glib_enum_c) \ notification-watcher-client.h \ notification-item-server.h \ - libcustomindicator/custom-indicator.c + libapplicationindicator/application-indicator.c -libcustomindicator_la_LDFLAGS = \ +libapplicationindicator_la_LDFLAGS = \ -version-info 0:0:0 \ -no-undefined \ -export-symbols-regex "^[^_d].*" -libcustomindicator_la_CFLAGS = \ +libapplicationindicator_la_CFLAGS = \ $(INDICATOR_CFLAGS) \ -Wall -Werror -libcustomindicator_la_LIBADD = \ +libapplicationindicator_la_LIBADD = \ $(INDICATOR_LIBS) ################################## @@ -97,7 +97,7 @@ libcustomindicator_la_LIBADD = \ ################################## DBUS_SPECS = \ - custom-service.xml \ + application-service.xml \ dbus-properties.xml \ notification-item.xml \ notification-watcher.xml diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c new file mode 100644 index 0000000..bdf8ffb --- /dev/null +++ b/src/application-service-appstore.c @@ -0,0 +1,300 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "custom-service-appstore.h" +#include "custom-service-marshal.h" +#include "dbus-properties-client.h" +#include "dbus-shared.h" + +/* DBus Prototypes */ +static gboolean _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps); + +#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 { + DBusGConnection * bus; + GList * applications; +}; + +typedef struct _Application Application; +struct _Application { + gchar * dbus_name; + gchar * dbus_object; + CustomServiceAppstore * appstore; /* not ref'd */ + DBusGProxy * dbus_proxy; + DBusGProxy * prop_proxy; +}; + +#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); +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; + + 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, + _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), + 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__custom_service_server_object_info); + + return; +} + +static void +custom_service_appstore_init (CustomServiceAppstore *self) +{ + CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(self); + + priv->applications = NULL; + + GError * error = NULL; + 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(priv->bus, + INDICATOR_CUSTOM_DBUS_OBJ, + G_OBJECT(self)); + + return; +} + +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; +} + +static void +custom_service_appstore_finalize (GObject *object) +{ + + G_OBJECT_CLASS (custom_service_appstore_parent_class)->finalize (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); + + /* 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, + 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; +} + +/* 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. */ +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'); + 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, + 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; + } + + /* 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, + 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; + } + + /* 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; +} + +void +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'); + 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) +{ + + return FALSE; +} + diff --git a/src/application-service-appstore.h b/src/application-service-appstore.h new file mode 100644 index 0000000..7263617 --- /dev/null +++ b/src/application-service-appstore.h @@ -0,0 +1,40 @@ +#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; + + void (*application_added) (CustomServiceAppstore * appstore, gchar *, gint, gchar *, gchar *, gpointer); + void (*application_removed) (CustomServiceAppstore * appstore, gint, gpointer); +}; + +GType custom_service_appstore_get_type (void); +void custom_service_appstore_application_add (CustomServiceAppstore * appstore, + const gchar * dbus_name, + const gchar * dbus_object); +void custom_service_appstore_application_remove (CustomServiceAppstore * appstore, + const gchar * dbus_name, + const gchar * dbus_object); + +G_END_DECLS + +#endif diff --git a/src/application-service-marshal.list b/src/application-service-marshal.list new file mode 100644 index 0000000..4056f53 --- /dev/null +++ b/src/application-service-marshal.list @@ -0,0 +1 @@ +VOID: STRING, INT, STRING, STRING diff --git a/src/application-service-watcher.c b/src/application-service-watcher.c new file mode 100644 index 0000000..7cc15ee --- /dev/null +++ b/src/application-service-watcher.c @@ -0,0 +1,183 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "custom-service-watcher.h" +#include "dbus-shared.h" + +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" + +/* Private Stuff */ +typedef struct _CustomServiceWatcherPrivate CustomServiceWatcherPrivate; +struct _CustomServiceWatcherPrivate { + CustomServiceAppstore * appstore; +}; + +#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); +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; + + 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); + + return; +} + +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) { + g_error("Unable to get session bus: %s", error->message); + g_error_free(error); + return; + } + + dbus_g_connection_register_g_object(session_bus, + NOTIFICATION_WATCHER_DBUS_OBJ, + G_OBJECT(self)); + + return; +} + +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; +} + +static void +custom_service_watcher_finalize (GObject *object) +{ + + G_OBJECT_CLASS (custom_service_watcher_parent_class)->finalize (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 * 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 * appwatcher, GArray ** apps) +{ + + return FALSE; +} + +static gboolean +_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 * appwatcher, const gchar * host) +{ + + return FALSE; +} + +static gboolean +_notification_watcher_server_is_notification_host_registered (CustomServiceWatcher * appwatcher, gboolean * haveHost) +{ + *haveHost = TRUE; + return TRUE; +} + diff --git a/src/application-service-watcher.h b/src/application-service-watcher.h new file mode 100644 index 0000000..1a037be --- /dev/null +++ b/src/application-service-watcher.h @@ -0,0 +1,40 @@ +#ifndef __CUSTOM_SERVICE_WATCHER_H__ +#define __CUSTOM_SERVICE_WATCHER_H__ + +#include +#include + +#include "custom-service-appstore.h" + +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; + + /* 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 { + GObject parent; +}; + +GType custom_service_watcher_get_type (void); +CustomServiceWatcher * custom_service_watcher_new (CustomServiceAppstore * appstore); + +G_END_DECLS + +#endif diff --git a/src/application-service.c b/src/application-service.c new file mode 100644 index 0000000..5bd9b96 --- /dev/null +++ b/src/application-service.c @@ -0,0 +1,56 @@ + +#include "libindicator/indicator-service.h" +#include "notification-item-client.h" +#include "custom-service-appstore.h" +#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; +} diff --git a/src/application-service.xml b/src/application-service.xml new file mode 100644 index 0000000..ec96297 --- /dev/null +++ b/src/application-service.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/custom-service-appstore.c b/src/custom-service-appstore.c deleted file mode 100644 index bdf8ffb..0000000 --- a/src/custom-service-appstore.c +++ /dev/null @@ -1,300 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "custom-service-appstore.h" -#include "custom-service-marshal.h" -#include "dbus-properties-client.h" -#include "dbus-shared.h" - -/* DBus Prototypes */ -static gboolean _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps); - -#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 { - DBusGConnection * bus; - GList * applications; -}; - -typedef struct _Application Application; -struct _Application { - gchar * dbus_name; - gchar * dbus_object; - CustomServiceAppstore * appstore; /* not ref'd */ - DBusGProxy * dbus_proxy; - DBusGProxy * prop_proxy; -}; - -#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); -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; - - 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, - _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), - 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__custom_service_server_object_info); - - return; -} - -static void -custom_service_appstore_init (CustomServiceAppstore *self) -{ - CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(self); - - priv->applications = NULL; - - GError * error = NULL; - 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(priv->bus, - INDICATOR_CUSTOM_DBUS_OBJ, - G_OBJECT(self)); - - return; -} - -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; -} - -static void -custom_service_appstore_finalize (GObject *object) -{ - - G_OBJECT_CLASS (custom_service_appstore_parent_class)->finalize (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); - - /* 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, - 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; -} - -/* 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. */ -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'); - 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, - 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; - } - - /* 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, - 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; - } - - /* 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; -} - -void -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'); - 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) -{ - - return FALSE; -} - diff --git a/src/custom-service-appstore.h b/src/custom-service-appstore.h deleted file mode 100644 index 7263617..0000000 --- a/src/custom-service-appstore.h +++ /dev/null @@ -1,40 +0,0 @@ -#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; - - void (*application_added) (CustomServiceAppstore * appstore, gchar *, gint, gchar *, gchar *, gpointer); - void (*application_removed) (CustomServiceAppstore * appstore, gint, gpointer); -}; - -GType custom_service_appstore_get_type (void); -void custom_service_appstore_application_add (CustomServiceAppstore * appstore, - const gchar * dbus_name, - const gchar * dbus_object); -void custom_service_appstore_application_remove (CustomServiceAppstore * appstore, - const gchar * dbus_name, - const gchar * dbus_object); - -G_END_DECLS - -#endif diff --git a/src/custom-service-marshal.list b/src/custom-service-marshal.list deleted file mode 100644 index 4056f53..0000000 --- a/src/custom-service-marshal.list +++ /dev/null @@ -1 +0,0 @@ -VOID: STRING, INT, STRING, STRING diff --git a/src/custom-service-watcher.c b/src/custom-service-watcher.c deleted file mode 100644 index 7cc15ee..0000000 --- a/src/custom-service-watcher.c +++ /dev/null @@ -1,183 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include "custom-service-watcher.h" -#include "dbus-shared.h" - -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" - -/* Private Stuff */ -typedef struct _CustomServiceWatcherPrivate CustomServiceWatcherPrivate; -struct _CustomServiceWatcherPrivate { - CustomServiceAppstore * appstore; -}; - -#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); -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; - - 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); - - return; -} - -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) { - g_error("Unable to get session bus: %s", error->message); - g_error_free(error); - return; - } - - dbus_g_connection_register_g_object(session_bus, - NOTIFICATION_WATCHER_DBUS_OBJ, - G_OBJECT(self)); - - return; -} - -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; -} - -static void -custom_service_watcher_finalize (GObject *object) -{ - - G_OBJECT_CLASS (custom_service_watcher_parent_class)->finalize (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 * 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 * appwatcher, GArray ** apps) -{ - - return FALSE; -} - -static gboolean -_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 * appwatcher, const gchar * host) -{ - - return FALSE; -} - -static gboolean -_notification_watcher_server_is_notification_host_registered (CustomServiceWatcher * appwatcher, gboolean * haveHost) -{ - *haveHost = TRUE; - return TRUE; -} - diff --git a/src/custom-service-watcher.h b/src/custom-service-watcher.h deleted file mode 100644 index 1a037be..0000000 --- a/src/custom-service-watcher.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef __CUSTOM_SERVICE_WATCHER_H__ -#define __CUSTOM_SERVICE_WATCHER_H__ - -#include -#include - -#include "custom-service-appstore.h" - -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; - - /* 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 { - GObject parent; -}; - -GType custom_service_watcher_get_type (void); -CustomServiceWatcher * custom_service_watcher_new (CustomServiceAppstore * appstore); - -G_END_DECLS - -#endif diff --git a/src/custom-service.c b/src/custom-service.c deleted file mode 100644 index 5bd9b96..0000000 --- a/src/custom-service.c +++ /dev/null @@ -1,56 +0,0 @@ - -#include "libindicator/indicator-service.h" -#include "notification-item-client.h" -#include "custom-service-appstore.h" -#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; -} diff --git a/src/custom-service.xml b/src/custom-service.xml deleted file mode 100644 index ec96297..0000000 --- a/src/custom-service.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/indicator-application.c b/src/indicator-application.c new file mode 100644 index 0000000..da89c30 --- /dev/null +++ b/src/indicator-application.c @@ -0,0 +1,304 @@ + +/* G Stuff */ +#include +#include +#include + +/* DBus Stuff */ +#include +#include + +/* Indicator Stuff */ +#include +#include +#include + +/* 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)) +#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_TYPE(INDICATOR_CUSTOM_TYPE) + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +typedef struct _IndicatorCustomPrivate IndicatorCustomPrivate; +struct _IndicatorCustomPrivate { + IndicatorServiceManager * sm; + DBusGConnection * bus; + DBusGProxy * service_proxy; + GList * applications; +}; + +typedef struct _ApplicationEntry ApplicationEntry; +struct _ApplicationEntry { + IndicatorObjectEntry entry; +}; + +#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); +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); + +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; + + 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; +} + +static void +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); + + priv->applications = NULL; + + return; +} + +static void +indicator_custom_dispose (GObject *object) +{ + IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(object); + + while (priv->applications != NULL) { + application_removed(priv->service_proxy, + 0, + INDICATOR_CUSTOM(object)); + } + + if (priv->sm != NULL) { + g_object_unref(priv->sm); + 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; +} + +static void +indicator_custom_finalize (GObject *object) +{ + + G_OBJECT_CLASS (indicator_custom_parent_class)->finalize (object); + return; +} + +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; + + /* Grab the session bus */ + 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; + } + } + + /* 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 */ + g_debug("Setup 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_INVALID); + dbus_g_proxy_add_signal(priv->service_proxy, + "ApplicationRemoved", + G_TYPE_INT, + G_TYPE_INVALID); + + /* Connect to them */ + g_debug("Connect to them."); + 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 */ + g_debug("Request current apps"); + org_ayatana_indicator_custom_service_get_applications_async(priv->service_proxy, + get_applications, + custom); + + 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); + + 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; +} + +/* 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) +{ + 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); + + 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)); + + 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 */ + 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) +{ + 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; +} + +/* 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) +{ + + return; +} diff --git a/src/indicator-custom.c b/src/indicator-custom.c deleted file mode 100644 index da89c30..0000000 --- a/src/indicator-custom.c +++ /dev/null @@ -1,304 +0,0 @@ - -/* G Stuff */ -#include -#include -#include - -/* DBus Stuff */ -#include -#include - -/* Indicator Stuff */ -#include -#include -#include - -/* 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)) -#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_TYPE(INDICATOR_CUSTOM_TYPE) - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -typedef struct _IndicatorCustomPrivate IndicatorCustomPrivate; -struct _IndicatorCustomPrivate { - IndicatorServiceManager * sm; - DBusGConnection * bus; - DBusGProxy * service_proxy; - GList * applications; -}; - -typedef struct _ApplicationEntry ApplicationEntry; -struct _ApplicationEntry { - IndicatorObjectEntry entry; -}; - -#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); -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); - -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; - - 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; -} - -static void -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); - - priv->applications = NULL; - - return; -} - -static void -indicator_custom_dispose (GObject *object) -{ - IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(object); - - while (priv->applications != NULL) { - application_removed(priv->service_proxy, - 0, - INDICATOR_CUSTOM(object)); - } - - if (priv->sm != NULL) { - g_object_unref(priv->sm); - 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; -} - -static void -indicator_custom_finalize (GObject *object) -{ - - G_OBJECT_CLASS (indicator_custom_parent_class)->finalize (object); - return; -} - -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; - - /* Grab the session bus */ - 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; - } - } - - /* 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 */ - g_debug("Setup 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_INVALID); - dbus_g_proxy_add_signal(priv->service_proxy, - "ApplicationRemoved", - G_TYPE_INT, - G_TYPE_INVALID); - - /* Connect to them */ - g_debug("Connect to them."); - 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 */ - g_debug("Request current apps"); - org_ayatana_indicator_custom_service_get_applications_async(priv->service_proxy, - get_applications, - custom); - - 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); - - 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; -} - -/* 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) -{ - 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); - - 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)); - - 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 */ - 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) -{ - 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; -} - -/* 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) -{ - - return; -} diff --git a/src/libapplicationindicator/application-indicator-enum-types.c.in b/src/libapplicationindicator/application-indicator-enum-types.c.in new file mode 100644 index 0000000..51512f6 --- /dev/null +++ b/src/libapplicationindicator/application-indicator-enum-types.c.in @@ -0,0 +1,33 @@ +/*** BEGIN file-header ***/ +#include "libcustomindicator/custom-indicator-enum-types.h" + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +#include "@filename@" +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type (void) +{ + static GType etype = 0; + if (G_UNLIKELY(etype == 0)) { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL} + }; + + etype = g_@type@_register_static (g_intern_static_string("@EnumName@"), values); + } + + return etype; +} + +/*** END value-tail ***/ diff --git a/src/libapplicationindicator/application-indicator-enum-types.h.in b/src/libapplicationindicator/application-indicator-enum-types.h.in new file mode 100644 index 0000000..e037be7 --- /dev/null +++ b/src/libapplicationindicator/application-indicator-enum-types.h.in @@ -0,0 +1,33 @@ +/*** BEGIN file-header ***/ +#ifndef __CUSTOM_INDICATOR_ENUM_TYPES_H__ +#define __CUSTOM_INDICATOR_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS + +/*** END file-header ***/ + +/*** BEGIN file-tail ***/ + +G_END_DECLS + +#endif /* __CUSTOM_INDICATOR_ENUM_TYPES_H__ */ +/*** END file-tail ***/ + +/*** BEGIN file-production ***/ +/* Enumerations from file: "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +/** + @enum_name@_get_type: + + Builds a glib type for the @EnumName@ enumeration. + + Return value: A registered type for the enum +*/ +GType @enum_name@_get_type (void) G_GNUC_CONST; +#define CUSTOM_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) + +/*** END value-header ***/ diff --git a/src/libapplicationindicator/application-indicator.c b/src/libapplicationindicator/application-indicator.c new file mode 100644 index 0000000..8d6633a --- /dev/null +++ b/src/libapplicationindicator/application-indicator.c @@ -0,0 +1,847 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "libcustomindicator/custom-indicator.h" +#include "libcustomindicator/custom-indicator-enum-types.h" + +#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. + @category: Which category the indicator is. Maps to CustomIndicator::category. + @status: The status of the indicator. Maps to CustomIndicator::status. + @icon_name: The name of the icon to use. Maps to CustomIndicator::icon-name. + @attention_icon_name: The name of the attention icon to use. Maps to CustomIndicator::attention-icon-name. + @menu: The menu for this indicator. Maps to CustomIndicator::menu + @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be #NULL. + + All of the private data in an instance of a + custom indicator. +*/ +typedef struct _CustomIndicatorPrivate CustomIndicatorPrivate; +struct _CustomIndicatorPrivate { + /* Properties */ + gchar * id; + CustomIndicatorCategory category; + CustomIndicatorStatus status; + gchar * icon_name; + gchar * attention_icon_name; + DbusmenuServer * menu; + + /* Fun stuff */ + DBusGProxy * watcher_proxy; + DBusGConnection * connection; +}; + +/* Signals Stuff */ +enum { + NEW_ICON, + NEW_ATTENTION_ICON, + NEW_STATUS, + CONNECTION_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* Enum for the properties so that they can be quickly + found and looked up. */ +enum { + PROP_0, + PROP_ID, + PROP_CATEGORY, + PROP_CATEGORY_ENUM, + PROP_STATUS, + PROP_STATUS_ENUM, + PROP_ICON_NAME, + PROP_ATTENTION_ICON_NAME, + PROP_MENU, + PROP_MENU_OBJECT, + PROP_CONNECTED +}; + +/* The strings so that they can be slowly looked up. */ +#define PROP_ID_S "id" +#define PROP_CATEGORY_S "category" +#define PROP_CATEGORY_ENUM_S "category-enum" +#define PROP_STATUS_S "status" +#define PROP_STATUS_ENUM_S "status-enum" +#define PROP_ICON_NAME_S "icon-name" +#define PROP_ATTENTION_ICON_NAME_S "attention-icon-name" +#define PROP_MENU_S "menu" +#define PROP_MENU_OBJECT_S "menu-object" +#define PROP_CONNECTED_S "connected" + +/* Private macro, shhhh! */ +#define CUSTOM_INDICATOR_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_INDICATOR_TYPE, CustomIndicatorPrivate)) + +/* Boiler plate */ +static void custom_indicator_class_init (CustomIndicatorClass *klass); +static void custom_indicator_init (CustomIndicator *self); +static void custom_indicator_dispose (GObject *object); +static void custom_indicator_finalize (GObject *object); +/* Property functions */ +static void custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +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); + +static void +custom_indicator_class_init (CustomIndicatorClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (CustomIndicatorPrivate)); + + /* Clean up */ + object_class->dispose = custom_indicator_dispose; + object_class->finalize = custom_indicator_finalize; + + /* Property funcs */ + object_class->set_property = custom_indicator_set_property; + object_class->get_property = custom_indicator_get_property; + + /* Properties */ + g_object_class_install_property(object_class, PROP_ID, + g_param_spec_string(PROP_ID_S, + "The ID for this indicator", + "An ID that should be unique, but used consistently by this program and it's indicator.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_CATEGORY, + g_param_spec_string(PROP_CATEGORY_S, + "Indicator Category as a string", + "The type of indicator that this represents as a string. For DBus.", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_CATEGORY_ENUM, + g_param_spec_enum(PROP_CATEGORY_ENUM_S, + "Indicator Category", + "The type of indicator that this represents. Please don't use 'other'. Defaults to 'Application Status'.", + CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY, + CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_STATUS, + g_param_spec_string(PROP_STATUS_S, + "Indicator Status as a string", + "The status of the indicator represented as a string. For DBus.", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_STATUS_ENUM, + g_param_spec_enum(PROP_STATUS_ENUM_S, + "Indicator Status", + "Whether the indicator is shown or requests attention. Defaults to 'off'.", + CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS, + CUSTOM_INDICATOR_STATUS_PASSIVE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_ICON_NAME, + g_param_spec_string(PROP_ICON_NAME_S, + "An icon for the indicator", + "The default icon that is shown for the indicator.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_ATTENTION_ICON_NAME, + g_param_spec_string(PROP_ATTENTION_ICON_NAME_S, + "An icon to show when the indicator request attention.", + "If the indicator sets it's status to 'attention' then this icon is shown.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_MENU, + g_param_spec_string(PROP_MENU_S, + "The object path of the menu on DBus.", + "A method for getting the menu path as a string for DBus.", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_MENU_OBJECT, + g_param_spec_object(PROP_MENU_OBJECT_S, + "The Menu for the indicator", + "A DBus Menu Server object that can have a menu attached to it. The object from this menu will be sent across the bus for the client to connect to and signal.", + DBUSMENU_TYPE_SERVER, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_CONNECTED, + g_param_spec_boolean(PROP_CONNECTED_S, + "Whether we're conneced to a watcher", + "Pretty simple, true if we have a reasonable expectation of being displayed through this object. You should hide your TrayIcon if so.", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + + /* Signals */ + + /** + CustomIndicator::new-icon: + @arg0: The #CustomIndicator object + + Signaled when there is a new icon set for the + object. + */ + signals[NEW_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ICON, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, new_icon), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + CustomIndicator::new-attention-icon: + @arg0: The #CustomIndicator object + + Signaled when there is a new attention icon set for the + object. + */ + signals[NEW_ATTENTION_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, new_attention_icon), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + CustomIndicator::new-status: + @arg0: The #CustomIndicator object + @arg1: The string value of the #CustomIndicatorStatus enum. + + Signaled when the status of the indicator changes. + */ + signals[NEW_STATUS] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_STATUS, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, new_status), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); + + /** + CustomIndicator::connection-changed: + @arg0: The #CustomIndicator object + @arg1: Whether we're connected or not + + Signaled when we connect to a watcher, or when it drops + away. + */ + signals[CONNECTION_CHANGED] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, connection_changed), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE); + + /* Initialize the object as a DBus type */ + dbus_g_object_type_install_info(CUSTOM_INDICATOR_TYPE, + &dbus_glib__notification_item_server_object_info); + + return; +} + +static void +custom_indicator_init (CustomIndicator *self) +{ + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + priv->id = NULL; + priv->category = CUSTOM_INDICATOR_CATEGORY_OTHER; + priv->status = CUSTOM_INDICATOR_STATUS_PASSIVE; + priv->icon_name = NULL; + priv->attention_icon_name = NULL; + priv->menu = NULL; + + priv->watcher_proxy = NULL; + priv->connection = NULL; + + /* Put the object on DBus */ + GError * error = NULL; + 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(priv->connection, + "/need/a/path", + G_OBJECT(self)); + + return; +} + +/* Free all objects, make sure that all the dbus + signals are sent out before we shut this down. */ +static void +custom_indicator_dispose (GObject *object) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { + custom_indicator_set_status(self, CUSTOM_INDICATOR_STATUS_PASSIVE); + } + + if (priv->menu != NULL) { + g_object_unref(G_OBJECT(priv->menu)); + priv->menu = NULL; + } + + if (priv->watcher_proxy != NULL) { + dbus_g_connection_flush(priv->connection); + g_object_unref(G_OBJECT(priv->watcher_proxy)); + priv->watcher_proxy = NULL; + } + + G_OBJECT_CLASS (custom_indicator_parent_class)->dispose (object); + return; +} + +/* Free all of the memory that we could be using in + the object. */ +static void +custom_indicator_finalize (GObject *object) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { + g_warning("Finalizing Custom Status with the status set to: %d", priv->status); + } + + if (priv->id != NULL) { + g_free(priv->id); + priv->id = NULL; + } + + if (priv->icon_name != NULL) { + g_free(priv->icon_name); + priv->icon_name = NULL; + } + + if (priv->attention_icon_name != NULL) { + g_free(priv->attention_icon_name); + priv->attention_icon_name = NULL; + } + + G_OBJECT_CLASS (custom_indicator_parent_class)->finalize (object); + return; +} + +#define WARN_BAD_TYPE(prop, value) g_warning("Can not work with property '%s' with value of type '%s'.", prop, G_VALUE_TYPE_NAME(value)) + +/* Set some properties */ +static void +custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + switch (prop_id) { + /* *********************** */ + case PROP_ID: + if (G_VALUE_HOLDS_STRING(value)) { + if (priv->id != NULL) { + g_warning("Resetting ID value when I already had a value of: %s", priv->id); + g_free(priv->id); + priv->id = NULL; + } + priv->id = g_strdup(g_value_get_string(value)); + } else { + WARN_BAD_TYPE(PROP_ID_S, value); + } + check_connect(self); + break; + /* *********************** */ + case PROP_CATEGORY_ENUM: + if (G_VALUE_HOLDS_ENUM(value)) { + priv->category = g_value_get_enum(value); + } else { + WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); + } + break; + /* *********************** */ + case PROP_STATUS_ENUM: { + gboolean changed = FALSE; + if (G_VALUE_HOLDS_ENUM(value)) { + if (priv->status != g_value_get_enum(value)) { + changed = TRUE; + } + priv->status = g_value_get_enum(value); + } else { + WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); + } + if (changed) { + GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(pspec); + if (enumspec != NULL) { + GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); + g_signal_emit(object, signals[NEW_STATUS], 0, enumval->value_nick, TRUE); + } + } + break; + } + /* *********************** */ + case PROP_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + const gchar * instr = g_value_get_string(value); + gboolean changed = FALSE; + if (priv->icon_name == NULL) { + priv->icon_name = g_strdup(instr); + changed = TRUE; + } else if (!g_strcmp0(instr, priv->icon_name)) { + changed = FALSE; + } else { + g_free(priv->icon_name); + priv->icon_name = g_strdup(instr); + changed = TRUE; + } + if (changed) { + g_signal_emit(object, signals[NEW_ICON], 0, TRUE); + } + } else { + WARN_BAD_TYPE(PROP_ICON_NAME_S, value); + } + check_connect(self); + break; + /* *********************** */ + case PROP_ATTENTION_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + const gchar * instr = g_value_get_string(value); + gboolean changed = FALSE; + if (priv->attention_icon_name == NULL) { + priv->attention_icon_name = g_strdup(instr); + changed = TRUE; + } else if (!g_strcmp0(instr, priv->attention_icon_name)) { + changed = FALSE; + } else { + g_free(priv->attention_icon_name); + priv->attention_icon_name = g_strdup(instr); + changed = TRUE; + } + if (changed) { + g_signal_emit(object, signals[NEW_ATTENTION_ICON], 0, TRUE); + } + } else { + WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); + } + break; + /* *********************** */ + case PROP_MENU_OBJECT: + if (G_VALUE_HOLDS_OBJECT(value)) { + if (priv->menu != NULL) { + g_object_unref(G_OBJECT(priv->menu)); + } + priv->menu = DBUSMENU_SERVER(g_value_get_object(value)); + g_object_ref(G_OBJECT(priv->menu)); + } else { + WARN_BAD_TYPE(PROP_MENU_S, value); + } + check_connect(self); + break; + /* *********************** */ + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + return; +} + +/* Function to fill our value with the property it's requesting. */ +static void +custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + switch (prop_id) { + /* *********************** */ + case PROP_ID: + if (G_VALUE_HOLDS_STRING(value)) { + g_value_set_string(value, priv->id); + } else { + WARN_BAD_TYPE(PROP_ID_S, value); + } + break; + /* *********************** */ + case PROP_CATEGORY: + if (G_VALUE_HOLDS_STRING(value)) { + GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_CATEGORY_ENUM_S); + GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); + if (enumspec != NULL) { + GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->category); + g_value_set_string(value, enumval->value_nick); + } else { + g_assert_not_reached(); + } + } else { + WARN_BAD_TYPE(PROP_CATEGORY_S, value); + } + break; + /* *********************** */ + case PROP_CATEGORY_ENUM: + if (G_VALUE_HOLDS_ENUM(value)) { + /* We want the enum value */ + g_value_set_enum(value, priv->category); + } else { + WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); + } + break; + /* *********************** */ + case PROP_STATUS: + if (G_VALUE_HOLDS_STRING(value)) { + GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_STATUS_ENUM_S); + GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); + if (enumspec != NULL) { + GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); + g_value_set_string(value, enumval->value_nick); + } else { + g_assert_not_reached(); + } + } else { + WARN_BAD_TYPE(PROP_STATUS_S, value); + } + break; + /* *********************** */ + case PROP_STATUS_ENUM: + if (G_VALUE_HOLDS_ENUM(value)) { + /* We want the enum value */ + g_value_set_enum(value, priv->status); + } else { + WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); + } + break; + /* *********************** */ + case PROP_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + g_value_set_string(value, priv->icon_name); + } else { + WARN_BAD_TYPE(PROP_ICON_NAME_S, value); + } + break; + /* *********************** */ + case PROP_ATTENTION_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + g_value_set_string(value, priv->attention_icon_name); + } else { + WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); + } + break; + /* *********************** */ + case PROP_MENU: + if (G_VALUE_HOLDS_STRING(value)) { + if (priv->menu != NULL) { + g_object_get_property(G_OBJECT(priv->menu), DBUSMENU_SERVER_PROP_DBUS_OBJECT, value); + } + } else { + WARN_BAD_TYPE(PROP_MENU_S, value); + } + break; + /* *********************** */ + case PROP_MENU_OBJECT: + if (G_VALUE_HOLDS_OBJECT(value)) { + g_value_set_object(value, priv->menu); + } else { + WARN_BAD_TYPE(PROP_MENU_OBJECT_S, value); + } + break; + /* *********************** */ + case PROP_CONNECTED: + if (G_VALUE_HOLDS_BOOLEAN(value)) { + g_value_set_boolean(value, priv->watcher_proxy != NULL ? TRUE : FALSE); + } else { + WARN_BAD_TYPE(PROP_CONNECTED_S, value); + } + break; + /* *********************** */ + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + return; +} + +/* This function is used to see if we have enough information to + connect to things. If we do, and we're not connected, it + connects for us. */ +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; +} + + +/* ************************* */ +/* Public Functions */ +/* ************************* */ + +/** + custom_indicator_set_id: + @ci: The #CustomIndicator object to use + @id: ID to set for this indicator + + Wrapper function for property #CustomIndicator::id. +*/ +void +custom_indicator_set_id (CustomIndicator * ci, const gchar * id) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_value_set_string(&value, id); + g_object_set_property(G_OBJECT(ci), PROP_ID_S, &value); + return; +} + +/** + custom_indicator_set_category: + @ci: The #CustomIndicator object to use + @category: The category to set for this indicator + + Wrapper function for property #CustomIndicator::category. +*/ +void +custom_indicator_set_category (CustomIndicator * ci, CustomIndicatorCategory category) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_value_set_enum(&value, category); + g_object_set_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); + return; +} + +/** + custom_indicator_set_status: + @ci: The #CustomIndicator object to use + @status: The status to set for this indicator + + Wrapper function for property #CustomIndicator::status. +*/ +void +custom_indicator_set_status (CustomIndicator * ci, CustomIndicatorStatus status) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); + g_value_set_enum(&value, status); + g_object_set_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); + return; +} + +/** + custom_indicator_set_icon: + @ci: The #CustomIndicator object to use + @icon_name: The name of the icon to set for this indicator + + Wrapper function for property #CustomIndicator::icon. +*/ +void custom_indicator_set_icon (CustomIndicator * ci, const gchar * icon_name) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_value_set_string(&value, icon_name); + g_object_set_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); + return; +} + +/** + custom_indicator_set_attention_icon: + @ci: The #CustomIndicator object to use + @icon_name: The name of the attention icon to set for this indicator + + Wrapper function for property #CustomIndicator::attention-icon. +*/ +void +custom_indicator_set_attention_icon (CustomIndicator * ci, const gchar * icon_name) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_value_set_string(&value, icon_name); + g_object_set_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); + return; +} + +/** + custom_indicator_set_menu: + @ci: The #CustomIndicator object to use + @menu: The object with the menu for the indicator + + Wrapper function for property #CustomIndicator::menu. +*/ +void +custom_indicator_set_menu (CustomIndicator * ci, DbusmenuServer * menu) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_OBJECT); + g_value_set_object(&value, G_OBJECT(menu)); + g_object_set_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); + return; +} + +/** + custom_indicator_get_id: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::id. + + Return value: The current ID +*/ +const gchar * +custom_indicator_get_id (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(ci), PROP_ID_S, &value); + return g_value_get_string(&value); +} + +/** + custom_indicator_get_category: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::category. + + Return value: The current category. +*/ +CustomIndicatorCategory +custom_indicator_get_category (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_object_get_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); + return g_value_get_enum(&value); +} + +/** + custom_indicator_get_status: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::status. + + Return value: The current status. +*/ +CustomIndicatorStatus +custom_indicator_get_status (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); + g_object_get_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); + return g_value_get_enum(&value); +} + +/** + custom_indicator_get_icon: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::icon-name. + + Return value: The current icon name. +*/ +const gchar * +custom_indicator_get_icon (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); + return g_value_get_string(&value); +} + +/** + custom_indicator_get_attention_icon: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::attention-icon-name. + + Return value: The current attention icon name. +*/ +const gchar * +custom_indicator_get_attention_icon (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); + return g_value_get_string(&value); +} + +/** + custom_indicator_get_menu: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::menu. + + Return value: The current menu being used. +*/ +DbusmenuServer * +custom_indicator_get_menu (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_OBJECT); + g_object_get_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); + return DBUSMENU_SERVER(g_value_get_object(&value)); +} + + diff --git a/src/libapplicationindicator/application-indicator.h b/src/libapplicationindicator/application-indicator.h new file mode 100644 index 0000000..2e9045c --- /dev/null +++ b/src/libapplicationindicator/application-indicator.h @@ -0,0 +1,142 @@ +#ifndef __CUSTOM_INDICATOR_H__ +#define __CUSTOM_INDICATOR_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define CUSTOM_INDICATOR_TYPE (custom_indicator_get_type ()) +#define CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicator)) +#define CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) +#define IS_CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_INDICATOR_TYPE)) +#define IS_CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_INDICATOR_TYPE)) +#define CUSTOM_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) + +#define CUSTOM_INDICATOR_SIGNAL_NEW_ICON "new-icon" +#define CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" +#define CUSTOM_INDICATOR_SIGNAL_NEW_STATUS "new-status" +#define CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" + +/** + CustomIndicatorCategory: + @CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. + @CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. + @CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. + @CUSTOM_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. + @CUSTOM_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. + + The category provides grouping for the indicators so that + users can find indicators that are similar together. +*/ +typedef enum { /*< prefix=CUSTOM_INDICATOR_CATEGORY >*/ + CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, + CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS, + CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES, + CUSTOM_INDICATOR_CATEGORY_HARDWARE, + CUSTOM_INDICATOR_CATEGORY_OTHER +} CustomIndicatorCategory; + +/** + CustomIndicatorStatus: + @CUSTOM_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. + @CUSTOM_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. + @CUSTOM_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. + + These are the states that the indicator can be on in + the user's panel. The indicator by default starts + in the state @CUSTOM_INDICATOR_STATUS_OFF and can be + shown by setting it to @CUSTOM_INDICATOR_STATUS_ON. +*/ +typedef enum { /*< prefix=CUSTOM_INDICATOR_STATUS >*/ + CUSTOM_INDICATOR_STATUS_PASSIVE, + CUSTOM_INDICATOR_STATUS_ACTIVE, + CUSTOM_INDICATOR_STATUS_ATTENTION +} CustomIndicatorStatus; + +typedef struct _CustomIndicator CustomIndicator; +typedef struct _CustomIndicatorClass CustomIndicatorClass; + +/** + CustomIndicatorClass: + @parent_class: Mia familia + @new_icon: Slot for #CustomIndicator::new-icon. + @new_attention_icon: Slot for #CustomIndicator::new-attention-icon. + @new_status: Slot for #CustomIndicator::new-status. + @connection_changed: Slot for #CustomIndicator::connection-changed. + @custom_indicator_reserved_1: Reserved for future use. + @custom_indicator_reserved_2: Reserved for future use. + @custom_indicator_reserved_3: Reserved for future use. + @custom_indicator_reserved_4: Reserved for future use. + + The signals and external functions that make up the #CustomIndicator + class object. +*/ +struct _CustomIndicatorClass { + /* Parent */ + GObjectClass parent_class; + + /* DBus Signals */ + void (* new_icon) (CustomIndicator * indicator, + gpointer user_data); + void (* new_attention_icon) (CustomIndicator * indicator, + gpointer user_data); + void (* new_status) (CustomIndicator * indicator, + gchar * status_string, + gpointer user_data); + + /* Local Signals */ + void (* connection_changed) (CustomIndicator * indicator, + gboolean connected, + gpointer user_data); + + /* Reserved */ + void (*custom_indicator_reserved_1)(void); + void (*custom_indicator_reserved_2)(void); + void (*custom_indicator_reserved_3)(void); + void (*custom_indicator_reserved_4)(void); +}; + +/** + CustomIndicator: + @parent: Parent object. + + A custom indicator represents the values that are needed to show a + unique status in the panel for an application. In general, applications + should try to fit in the other indicators that are available on the + panel before using this. But, sometimes it is necissary. +*/ +struct _CustomIndicator { + GObject parent; + /* None. We're a very private object. */ +}; + +/* GObject Stuff */ +GType custom_indicator_get_type (void); + +/* Set properties */ +void custom_indicator_set_id (CustomIndicator * ci, + const gchar * id); +void custom_indicator_set_category (CustomIndicator * ci, + CustomIndicatorCategory category); +void custom_indicator_set_status (CustomIndicator * ci, + CustomIndicatorStatus status); +void custom_indicator_set_icon (CustomIndicator * ci, + const gchar * icon_name); +void custom_indicator_set_attention_icon (CustomIndicator * ci, + const gchar * icon_name); +void custom_indicator_set_menu (CustomIndicator * ci, + DbusmenuServer * menu); + +/* Get properties */ +const gchar * custom_indicator_get_id (CustomIndicator * ci); +CustomIndicatorCategory custom_indicator_get_category (CustomIndicator * ci); +CustomIndicatorStatus custom_indicator_get_status (CustomIndicator * ci); +const gchar * custom_indicator_get_icon (CustomIndicator * ci); +const gchar * custom_indicator_get_attention_icon (CustomIndicator * ci); +DbusmenuServer * custom_indicator_get_menu (CustomIndicator * ci); + +G_END_DECLS + +#endif diff --git a/src/libcustomindicator/custom-indicator-enum-types.c.in b/src/libcustomindicator/custom-indicator-enum-types.c.in deleted file mode 100644 index 51512f6..0000000 --- a/src/libcustomindicator/custom-indicator-enum-types.c.in +++ /dev/null @@ -1,33 +0,0 @@ -/*** BEGIN file-header ***/ -#include "libcustomindicator/custom-indicator-enum-types.h" - -/*** END file-header ***/ - -/*** BEGIN file-production ***/ -#include "@filename@" -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -GType -@enum_name@_get_type (void) -{ - static GType etype = 0; - if (G_UNLIKELY(etype == 0)) { - static const G@Type@Value values[] = { -/*** END value-header ***/ - -/*** BEGIN value-production ***/ - { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, -/*** END value-production ***/ - -/*** BEGIN value-tail ***/ - { 0, NULL, NULL} - }; - - etype = g_@type@_register_static (g_intern_static_string("@EnumName@"), values); - } - - return etype; -} - -/*** END value-tail ***/ diff --git a/src/libcustomindicator/custom-indicator-enum-types.h.in b/src/libcustomindicator/custom-indicator-enum-types.h.in deleted file mode 100644 index e037be7..0000000 --- a/src/libcustomindicator/custom-indicator-enum-types.h.in +++ /dev/null @@ -1,33 +0,0 @@ -/*** BEGIN file-header ***/ -#ifndef __CUSTOM_INDICATOR_ENUM_TYPES_H__ -#define __CUSTOM_INDICATOR_ENUM_TYPES_H__ - -#include - -G_BEGIN_DECLS - -/*** END file-header ***/ - -/*** BEGIN file-tail ***/ - -G_END_DECLS - -#endif /* __CUSTOM_INDICATOR_ENUM_TYPES_H__ */ -/*** END file-tail ***/ - -/*** BEGIN file-production ***/ -/* Enumerations from file: "@filename@" */ -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -/** - @enum_name@_get_type: - - Builds a glib type for the @EnumName@ enumeration. - - Return value: A registered type for the enum -*/ -GType @enum_name@_get_type (void) G_GNUC_CONST; -#define CUSTOM_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) - -/*** END value-header ***/ diff --git a/src/libcustomindicator/custom-indicator.c b/src/libcustomindicator/custom-indicator.c deleted file mode 100644 index 8d6633a..0000000 --- a/src/libcustomindicator/custom-indicator.c +++ /dev/null @@ -1,847 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#include "libcustomindicator/custom-indicator.h" -#include "libcustomindicator/custom-indicator-enum-types.h" - -#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. - @category: Which category the indicator is. Maps to CustomIndicator::category. - @status: The status of the indicator. Maps to CustomIndicator::status. - @icon_name: The name of the icon to use. Maps to CustomIndicator::icon-name. - @attention_icon_name: The name of the attention icon to use. Maps to CustomIndicator::attention-icon-name. - @menu: The menu for this indicator. Maps to CustomIndicator::menu - @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be #NULL. - - All of the private data in an instance of a - custom indicator. -*/ -typedef struct _CustomIndicatorPrivate CustomIndicatorPrivate; -struct _CustomIndicatorPrivate { - /* Properties */ - gchar * id; - CustomIndicatorCategory category; - CustomIndicatorStatus status; - gchar * icon_name; - gchar * attention_icon_name; - DbusmenuServer * menu; - - /* Fun stuff */ - DBusGProxy * watcher_proxy; - DBusGConnection * connection; -}; - -/* Signals Stuff */ -enum { - NEW_ICON, - NEW_ATTENTION_ICON, - NEW_STATUS, - CONNECTION_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -/* Enum for the properties so that they can be quickly - found and looked up. */ -enum { - PROP_0, - PROP_ID, - PROP_CATEGORY, - PROP_CATEGORY_ENUM, - PROP_STATUS, - PROP_STATUS_ENUM, - PROP_ICON_NAME, - PROP_ATTENTION_ICON_NAME, - PROP_MENU, - PROP_MENU_OBJECT, - PROP_CONNECTED -}; - -/* The strings so that they can be slowly looked up. */ -#define PROP_ID_S "id" -#define PROP_CATEGORY_S "category" -#define PROP_CATEGORY_ENUM_S "category-enum" -#define PROP_STATUS_S "status" -#define PROP_STATUS_ENUM_S "status-enum" -#define PROP_ICON_NAME_S "icon-name" -#define PROP_ATTENTION_ICON_NAME_S "attention-icon-name" -#define PROP_MENU_S "menu" -#define PROP_MENU_OBJECT_S "menu-object" -#define PROP_CONNECTED_S "connected" - -/* Private macro, shhhh! */ -#define CUSTOM_INDICATOR_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_INDICATOR_TYPE, CustomIndicatorPrivate)) - -/* Boiler plate */ -static void custom_indicator_class_init (CustomIndicatorClass *klass); -static void custom_indicator_init (CustomIndicator *self); -static void custom_indicator_dispose (GObject *object); -static void custom_indicator_finalize (GObject *object); -/* Property functions */ -static void custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -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); - -static void -custom_indicator_class_init (CustomIndicatorClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (CustomIndicatorPrivate)); - - /* Clean up */ - object_class->dispose = custom_indicator_dispose; - object_class->finalize = custom_indicator_finalize; - - /* Property funcs */ - object_class->set_property = custom_indicator_set_property; - object_class->get_property = custom_indicator_get_property; - - /* Properties */ - g_object_class_install_property(object_class, PROP_ID, - g_param_spec_string(PROP_ID_S, - "The ID for this indicator", - "An ID that should be unique, but used consistently by this program and it's indicator.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_CATEGORY, - g_param_spec_string(PROP_CATEGORY_S, - "Indicator Category as a string", - "The type of indicator that this represents as a string. For DBus.", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_CATEGORY_ENUM, - g_param_spec_enum(PROP_CATEGORY_ENUM_S, - "Indicator Category", - "The type of indicator that this represents. Please don't use 'other'. Defaults to 'Application Status'.", - CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY, - CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_STATUS, - g_param_spec_string(PROP_STATUS_S, - "Indicator Status as a string", - "The status of the indicator represented as a string. For DBus.", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_STATUS_ENUM, - g_param_spec_enum(PROP_STATUS_ENUM_S, - "Indicator Status", - "Whether the indicator is shown or requests attention. Defaults to 'off'.", - CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS, - CUSTOM_INDICATOR_STATUS_PASSIVE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_ICON_NAME, - g_param_spec_string(PROP_ICON_NAME_S, - "An icon for the indicator", - "The default icon that is shown for the indicator.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_ATTENTION_ICON_NAME, - g_param_spec_string(PROP_ATTENTION_ICON_NAME_S, - "An icon to show when the indicator request attention.", - "If the indicator sets it's status to 'attention' then this icon is shown.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_MENU, - g_param_spec_string(PROP_MENU_S, - "The object path of the menu on DBus.", - "A method for getting the menu path as a string for DBus.", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_MENU_OBJECT, - g_param_spec_object(PROP_MENU_OBJECT_S, - "The Menu for the indicator", - "A DBus Menu Server object that can have a menu attached to it. The object from this menu will be sent across the bus for the client to connect to and signal.", - DBUSMENU_TYPE_SERVER, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_CONNECTED, - g_param_spec_boolean(PROP_CONNECTED_S, - "Whether we're conneced to a watcher", - "Pretty simple, true if we have a reasonable expectation of being displayed through this object. You should hide your TrayIcon if so.", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - - /* Signals */ - - /** - CustomIndicator::new-icon: - @arg0: The #CustomIndicator object - - Signaled when there is a new icon set for the - object. - */ - signals[NEW_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ICON, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_icon), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); - - /** - CustomIndicator::new-attention-icon: - @arg0: The #CustomIndicator object - - Signaled when there is a new attention icon set for the - object. - */ - signals[NEW_ATTENTION_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_attention_icon), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); - - /** - CustomIndicator::new-status: - @arg0: The #CustomIndicator object - @arg1: The string value of the #CustomIndicatorStatus enum. - - Signaled when the status of the indicator changes. - */ - signals[NEW_STATUS] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_STATUS, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_status), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); - - /** - CustomIndicator::connection-changed: - @arg0: The #CustomIndicator object - @arg1: Whether we're connected or not - - Signaled when we connect to a watcher, or when it drops - away. - */ - signals[CONNECTION_CHANGED] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, connection_changed), - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE); - - /* Initialize the object as a DBus type */ - dbus_g_object_type_install_info(CUSTOM_INDICATOR_TYPE, - &dbus_glib__notification_item_server_object_info); - - return; -} - -static void -custom_indicator_init (CustomIndicator *self) -{ - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - priv->id = NULL; - priv->category = CUSTOM_INDICATOR_CATEGORY_OTHER; - priv->status = CUSTOM_INDICATOR_STATUS_PASSIVE; - priv->icon_name = NULL; - priv->attention_icon_name = NULL; - priv->menu = NULL; - - priv->watcher_proxy = NULL; - priv->connection = NULL; - - /* Put the object on DBus */ - GError * error = NULL; - 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(priv->connection, - "/need/a/path", - G_OBJECT(self)); - - return; -} - -/* Free all objects, make sure that all the dbus - signals are sent out before we shut this down. */ -static void -custom_indicator_dispose (GObject *object) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { - custom_indicator_set_status(self, CUSTOM_INDICATOR_STATUS_PASSIVE); - } - - if (priv->menu != NULL) { - g_object_unref(G_OBJECT(priv->menu)); - priv->menu = NULL; - } - - if (priv->watcher_proxy != NULL) { - dbus_g_connection_flush(priv->connection); - g_object_unref(G_OBJECT(priv->watcher_proxy)); - priv->watcher_proxy = NULL; - } - - G_OBJECT_CLASS (custom_indicator_parent_class)->dispose (object); - return; -} - -/* Free all of the memory that we could be using in - the object. */ -static void -custom_indicator_finalize (GObject *object) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { - g_warning("Finalizing Custom Status with the status set to: %d", priv->status); - } - - if (priv->id != NULL) { - g_free(priv->id); - priv->id = NULL; - } - - if (priv->icon_name != NULL) { - g_free(priv->icon_name); - priv->icon_name = NULL; - } - - if (priv->attention_icon_name != NULL) { - g_free(priv->attention_icon_name); - priv->attention_icon_name = NULL; - } - - G_OBJECT_CLASS (custom_indicator_parent_class)->finalize (object); - return; -} - -#define WARN_BAD_TYPE(prop, value) g_warning("Can not work with property '%s' with value of type '%s'.", prop, G_VALUE_TYPE_NAME(value)) - -/* Set some properties */ -static void -custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - switch (prop_id) { - /* *********************** */ - case PROP_ID: - if (G_VALUE_HOLDS_STRING(value)) { - if (priv->id != NULL) { - g_warning("Resetting ID value when I already had a value of: %s", priv->id); - g_free(priv->id); - priv->id = NULL; - } - priv->id = g_strdup(g_value_get_string(value)); - } else { - WARN_BAD_TYPE(PROP_ID_S, value); - } - check_connect(self); - break; - /* *********************** */ - case PROP_CATEGORY_ENUM: - if (G_VALUE_HOLDS_ENUM(value)) { - priv->category = g_value_get_enum(value); - } else { - WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); - } - break; - /* *********************** */ - case PROP_STATUS_ENUM: { - gboolean changed = FALSE; - if (G_VALUE_HOLDS_ENUM(value)) { - if (priv->status != g_value_get_enum(value)) { - changed = TRUE; - } - priv->status = g_value_get_enum(value); - } else { - WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); - } - if (changed) { - GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(pspec); - if (enumspec != NULL) { - GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); - g_signal_emit(object, signals[NEW_STATUS], 0, enumval->value_nick, TRUE); - } - } - break; - } - /* *********************** */ - case PROP_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - const gchar * instr = g_value_get_string(value); - gboolean changed = FALSE; - if (priv->icon_name == NULL) { - priv->icon_name = g_strdup(instr); - changed = TRUE; - } else if (!g_strcmp0(instr, priv->icon_name)) { - changed = FALSE; - } else { - g_free(priv->icon_name); - priv->icon_name = g_strdup(instr); - changed = TRUE; - } - if (changed) { - g_signal_emit(object, signals[NEW_ICON], 0, TRUE); - } - } else { - WARN_BAD_TYPE(PROP_ICON_NAME_S, value); - } - check_connect(self); - break; - /* *********************** */ - case PROP_ATTENTION_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - const gchar * instr = g_value_get_string(value); - gboolean changed = FALSE; - if (priv->attention_icon_name == NULL) { - priv->attention_icon_name = g_strdup(instr); - changed = TRUE; - } else if (!g_strcmp0(instr, priv->attention_icon_name)) { - changed = FALSE; - } else { - g_free(priv->attention_icon_name); - priv->attention_icon_name = g_strdup(instr); - changed = TRUE; - } - if (changed) { - g_signal_emit(object, signals[NEW_ATTENTION_ICON], 0, TRUE); - } - } else { - WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); - } - break; - /* *********************** */ - case PROP_MENU_OBJECT: - if (G_VALUE_HOLDS_OBJECT(value)) { - if (priv->menu != NULL) { - g_object_unref(G_OBJECT(priv->menu)); - } - priv->menu = DBUSMENU_SERVER(g_value_get_object(value)); - g_object_ref(G_OBJECT(priv->menu)); - } else { - WARN_BAD_TYPE(PROP_MENU_S, value); - } - check_connect(self); - break; - /* *********************** */ - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - - return; -} - -/* Function to fill our value with the property it's requesting. */ -static void -custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - switch (prop_id) { - /* *********************** */ - case PROP_ID: - if (G_VALUE_HOLDS_STRING(value)) { - g_value_set_string(value, priv->id); - } else { - WARN_BAD_TYPE(PROP_ID_S, value); - } - break; - /* *********************** */ - case PROP_CATEGORY: - if (G_VALUE_HOLDS_STRING(value)) { - GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_CATEGORY_ENUM_S); - GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); - if (enumspec != NULL) { - GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->category); - g_value_set_string(value, enumval->value_nick); - } else { - g_assert_not_reached(); - } - } else { - WARN_BAD_TYPE(PROP_CATEGORY_S, value); - } - break; - /* *********************** */ - case PROP_CATEGORY_ENUM: - if (G_VALUE_HOLDS_ENUM(value)) { - /* We want the enum value */ - g_value_set_enum(value, priv->category); - } else { - WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); - } - break; - /* *********************** */ - case PROP_STATUS: - if (G_VALUE_HOLDS_STRING(value)) { - GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_STATUS_ENUM_S); - GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); - if (enumspec != NULL) { - GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); - g_value_set_string(value, enumval->value_nick); - } else { - g_assert_not_reached(); - } - } else { - WARN_BAD_TYPE(PROP_STATUS_S, value); - } - break; - /* *********************** */ - case PROP_STATUS_ENUM: - if (G_VALUE_HOLDS_ENUM(value)) { - /* We want the enum value */ - g_value_set_enum(value, priv->status); - } else { - WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); - } - break; - /* *********************** */ - case PROP_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - g_value_set_string(value, priv->icon_name); - } else { - WARN_BAD_TYPE(PROP_ICON_NAME_S, value); - } - break; - /* *********************** */ - case PROP_ATTENTION_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - g_value_set_string(value, priv->attention_icon_name); - } else { - WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); - } - break; - /* *********************** */ - case PROP_MENU: - if (G_VALUE_HOLDS_STRING(value)) { - if (priv->menu != NULL) { - g_object_get_property(G_OBJECT(priv->menu), DBUSMENU_SERVER_PROP_DBUS_OBJECT, value); - } - } else { - WARN_BAD_TYPE(PROP_MENU_S, value); - } - break; - /* *********************** */ - case PROP_MENU_OBJECT: - if (G_VALUE_HOLDS_OBJECT(value)) { - g_value_set_object(value, priv->menu); - } else { - WARN_BAD_TYPE(PROP_MENU_OBJECT_S, value); - } - break; - /* *********************** */ - case PROP_CONNECTED: - if (G_VALUE_HOLDS_BOOLEAN(value)) { - g_value_set_boolean(value, priv->watcher_proxy != NULL ? TRUE : FALSE); - } else { - WARN_BAD_TYPE(PROP_CONNECTED_S, value); - } - break; - /* *********************** */ - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - - return; -} - -/* This function is used to see if we have enough information to - connect to things. If we do, and we're not connected, it - connects for us. */ -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; -} - - -/* ************************* */ -/* Public Functions */ -/* ************************* */ - -/** - custom_indicator_set_id: - @ci: The #CustomIndicator object to use - @id: ID to set for this indicator - - Wrapper function for property #CustomIndicator::id. -*/ -void -custom_indicator_set_id (CustomIndicator * ci, const gchar * id) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, id); - g_object_set_property(G_OBJECT(ci), PROP_ID_S, &value); - return; -} - -/** - custom_indicator_set_category: - @ci: The #CustomIndicator object to use - @category: The category to set for this indicator - - Wrapper function for property #CustomIndicator::category. -*/ -void -custom_indicator_set_category (CustomIndicator * ci, CustomIndicatorCategory category) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); - g_value_set_enum(&value, category); - g_object_set_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); - return; -} - -/** - custom_indicator_set_status: - @ci: The #CustomIndicator object to use - @status: The status to set for this indicator - - Wrapper function for property #CustomIndicator::status. -*/ -void -custom_indicator_set_status (CustomIndicator * ci, CustomIndicatorStatus status) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); - g_value_set_enum(&value, status); - g_object_set_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); - return; -} - -/** - custom_indicator_set_icon: - @ci: The #CustomIndicator object to use - @icon_name: The name of the icon to set for this indicator - - Wrapper function for property #CustomIndicator::icon. -*/ -void custom_indicator_set_icon (CustomIndicator * ci, const gchar * icon_name) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, icon_name); - g_object_set_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); - return; -} - -/** - custom_indicator_set_attention_icon: - @ci: The #CustomIndicator object to use - @icon_name: The name of the attention icon to set for this indicator - - Wrapper function for property #CustomIndicator::attention-icon. -*/ -void -custom_indicator_set_attention_icon (CustomIndicator * ci, const gchar * icon_name) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, icon_name); - g_object_set_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); - return; -} - -/** - custom_indicator_set_menu: - @ci: The #CustomIndicator object to use - @menu: The object with the menu for the indicator - - Wrapper function for property #CustomIndicator::menu. -*/ -void -custom_indicator_set_menu (CustomIndicator * ci, DbusmenuServer * menu) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_OBJECT); - g_value_set_object(&value, G_OBJECT(menu)); - g_object_set_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); - return; -} - -/** - custom_indicator_get_id: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::id. - - Return value: The current ID -*/ -const gchar * -custom_indicator_get_id (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_object_get_property(G_OBJECT(ci), PROP_ID_S, &value); - return g_value_get_string(&value); -} - -/** - custom_indicator_get_category: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::category. - - Return value: The current category. -*/ -CustomIndicatorCategory -custom_indicator_get_category (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); - g_object_get_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); - return g_value_get_enum(&value); -} - -/** - custom_indicator_get_status: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::status. - - Return value: The current status. -*/ -CustomIndicatorStatus -custom_indicator_get_status (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); - g_object_get_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); - return g_value_get_enum(&value); -} - -/** - custom_indicator_get_icon: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::icon-name. - - Return value: The current icon name. -*/ -const gchar * -custom_indicator_get_icon (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_object_get_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); - return g_value_get_string(&value); -} - -/** - custom_indicator_get_attention_icon: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::attention-icon-name. - - Return value: The current attention icon name. -*/ -const gchar * -custom_indicator_get_attention_icon (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_object_get_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); - return g_value_get_string(&value); -} - -/** - custom_indicator_get_menu: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::menu. - - Return value: The current menu being used. -*/ -DbusmenuServer * -custom_indicator_get_menu (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_OBJECT); - g_object_get_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); - return DBUSMENU_SERVER(g_value_get_object(&value)); -} - - diff --git a/src/libcustomindicator/custom-indicator.h b/src/libcustomindicator/custom-indicator.h deleted file mode 100644 index 2e9045c..0000000 --- a/src/libcustomindicator/custom-indicator.h +++ /dev/null @@ -1,142 +0,0 @@ -#ifndef __CUSTOM_INDICATOR_H__ -#define __CUSTOM_INDICATOR_H__ - -#include -#include -#include - -G_BEGIN_DECLS - -#define CUSTOM_INDICATOR_TYPE (custom_indicator_get_type ()) -#define CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicator)) -#define CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) -#define IS_CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_INDICATOR_TYPE)) -#define IS_CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_INDICATOR_TYPE)) -#define CUSTOM_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) - -#define CUSTOM_INDICATOR_SIGNAL_NEW_ICON "new-icon" -#define CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" -#define CUSTOM_INDICATOR_SIGNAL_NEW_STATUS "new-status" -#define CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" - -/** - CustomIndicatorCategory: - @CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. - @CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. - @CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. - @CUSTOM_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. - @CUSTOM_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. - - The category provides grouping for the indicators so that - users can find indicators that are similar together. -*/ -typedef enum { /*< prefix=CUSTOM_INDICATOR_CATEGORY >*/ - CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, - CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS, - CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES, - CUSTOM_INDICATOR_CATEGORY_HARDWARE, - CUSTOM_INDICATOR_CATEGORY_OTHER -} CustomIndicatorCategory; - -/** - CustomIndicatorStatus: - @CUSTOM_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. - @CUSTOM_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. - @CUSTOM_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. - - These are the states that the indicator can be on in - the user's panel. The indicator by default starts - in the state @CUSTOM_INDICATOR_STATUS_OFF and can be - shown by setting it to @CUSTOM_INDICATOR_STATUS_ON. -*/ -typedef enum { /*< prefix=CUSTOM_INDICATOR_STATUS >*/ - CUSTOM_INDICATOR_STATUS_PASSIVE, - CUSTOM_INDICATOR_STATUS_ACTIVE, - CUSTOM_INDICATOR_STATUS_ATTENTION -} CustomIndicatorStatus; - -typedef struct _CustomIndicator CustomIndicator; -typedef struct _CustomIndicatorClass CustomIndicatorClass; - -/** - CustomIndicatorClass: - @parent_class: Mia familia - @new_icon: Slot for #CustomIndicator::new-icon. - @new_attention_icon: Slot for #CustomIndicator::new-attention-icon. - @new_status: Slot for #CustomIndicator::new-status. - @connection_changed: Slot for #CustomIndicator::connection-changed. - @custom_indicator_reserved_1: Reserved for future use. - @custom_indicator_reserved_2: Reserved for future use. - @custom_indicator_reserved_3: Reserved for future use. - @custom_indicator_reserved_4: Reserved for future use. - - The signals and external functions that make up the #CustomIndicator - class object. -*/ -struct _CustomIndicatorClass { - /* Parent */ - GObjectClass parent_class; - - /* DBus Signals */ - void (* new_icon) (CustomIndicator * indicator, - gpointer user_data); - void (* new_attention_icon) (CustomIndicator * indicator, - gpointer user_data); - void (* new_status) (CustomIndicator * indicator, - gchar * status_string, - gpointer user_data); - - /* Local Signals */ - void (* connection_changed) (CustomIndicator * indicator, - gboolean connected, - gpointer user_data); - - /* Reserved */ - void (*custom_indicator_reserved_1)(void); - void (*custom_indicator_reserved_2)(void); - void (*custom_indicator_reserved_3)(void); - void (*custom_indicator_reserved_4)(void); -}; - -/** - CustomIndicator: - @parent: Parent object. - - A custom indicator represents the values that are needed to show a - unique status in the panel for an application. In general, applications - should try to fit in the other indicators that are available on the - panel before using this. But, sometimes it is necissary. -*/ -struct _CustomIndicator { - GObject parent; - /* None. We're a very private object. */ -}; - -/* GObject Stuff */ -GType custom_indicator_get_type (void); - -/* Set properties */ -void custom_indicator_set_id (CustomIndicator * ci, - const gchar * id); -void custom_indicator_set_category (CustomIndicator * ci, - CustomIndicatorCategory category); -void custom_indicator_set_status (CustomIndicator * ci, - CustomIndicatorStatus status); -void custom_indicator_set_icon (CustomIndicator * ci, - const gchar * icon_name); -void custom_indicator_set_attention_icon (CustomIndicator * ci, - const gchar * icon_name); -void custom_indicator_set_menu (CustomIndicator * ci, - DbusmenuServer * menu); - -/* Get properties */ -const gchar * custom_indicator_get_id (CustomIndicator * ci); -CustomIndicatorCategory custom_indicator_get_category (CustomIndicator * ci); -CustomIndicatorStatus custom_indicator_get_status (CustomIndicator * ci); -const gchar * custom_indicator_get_icon (CustomIndicator * ci); -const gchar * custom_indicator_get_attention_icon (CustomIndicator * ci); -DbusmenuServer * custom_indicator_get_menu (CustomIndicator * ci); - -G_END_DECLS - -#endif -- cgit v1.2.3 From 5b2dcab7aad9e2920bedc3ef28c34c661d70ce71 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 09:58:53 -0600 Subject: Changing file names, and some fallouts from that. --- src/application-service-appstore.c | 14 +++++++------- src/application-service-watcher.c | 2 +- src/application-service-watcher.h | 2 +- src/application-service.c | 4 ++-- src/indicator-application.c | 12 ++++++------ .../application-indicator-enum-types.c.in | 2 +- src/libapplicationindicator/application-indicator.c | 6 +++--- 7 files changed, 21 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c index bdf8ffb..4e3beda 100644 --- a/src/application-service-appstore.c +++ b/src/application-service-appstore.c @@ -3,15 +3,15 @@ #endif #include -#include "custom-service-appstore.h" -#include "custom-service-marshal.h" +#include "application-service-appstore.h" +#include "application-service-marshal.h" #include "dbus-properties-client.h" #include "dbus-shared.h" /* DBus Prototypes */ -static gboolean _custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps); +static gboolean _application_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps); -#include "custom-service-server.h" +#include "application-service-server.h" #define NOTIFICATION_ITEM_PROP_ID "Id" #define NOTIFICATION_ITEM_PROP_CATEGORY "Category" @@ -71,7 +71,7 @@ custom_service_appstore_class_init (CustomServiceAppstoreClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (CustomServiceAppstore, application_added), NULL, NULL, - _custom_service_marshal_VOID__STRING_INT_STRING_STRING, + _application_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), @@ -83,7 +83,7 @@ custom_service_appstore_class_init (CustomServiceAppstoreClass *klass) dbus_g_object_type_install_info(CUSTOM_SERVICE_APPSTORE_TYPE, - &dbus_glib__custom_service_server_object_info); + &dbus_glib__application_service_server_object_info); return; } @@ -292,7 +292,7 @@ custom_service_appstore_application_remove (CustomServiceAppstore * appstore, co /* DBus Interface */ static gboolean -_custom_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps) +_application_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps) { return FALSE; diff --git a/src/application-service-watcher.c b/src/application-service-watcher.c index 7cc15ee..a5e1817 100644 --- a/src/application-service-watcher.c +++ b/src/application-service-watcher.c @@ -4,7 +4,7 @@ #include #include -#include "custom-service-watcher.h" +#include "application-service-watcher.h" #include "dbus-shared.h" static gboolean _notification_watcher_server_register_service (CustomServiceWatcher * appwatcher, const gchar * service, DBusGMethodInvocation * method); diff --git a/src/application-service-watcher.h b/src/application-service-watcher.h index 1a037be..c431a59 100644 --- a/src/application-service-watcher.h +++ b/src/application-service-watcher.h @@ -4,7 +4,7 @@ #include #include -#include "custom-service-appstore.h" +#include "application-service-appstore.h" G_BEGIN_DECLS diff --git a/src/application-service.c b/src/application-service.c index 5bd9b96..6d5f44d 100644 --- a/src/application-service.c +++ b/src/application-service.c @@ -1,8 +1,8 @@ #include "libindicator/indicator-service.h" #include "notification-item-client.h" -#include "custom-service-appstore.h" -#include "custom-service-watcher.h" +#include "application-service-appstore.h" +#include "application-service-watcher.h" #include "dbus-shared.h" /* The base main loop */ diff --git a/src/indicator-application.c b/src/indicator-application.c index da89c30..e52eaa0 100644 --- a/src/indicator-application.c +++ b/src/indicator-application.c @@ -15,8 +15,8 @@ /* Local Stuff */ #include "dbus-shared.h" -#include "custom-service-client.h" -#include "custom-service-marshal.h" +#include "application-service-client.h" +#include "application-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)) @@ -88,7 +88,7 @@ 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, + dbus_g_object_register_marshaller(_application_service_marshal_VOID__STRING_INT_STRING_STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_INT, @@ -209,9 +209,9 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c /* Query it for existing applications */ g_debug("Request current apps"); - org_ayatana_indicator_custom_service_get_applications_async(priv->service_proxy, - get_applications, - custom); + org_ayatana_indicator_application_service_get_applications_async(priv->service_proxy, + get_applications, + custom); return; } diff --git a/src/libapplicationindicator/application-indicator-enum-types.c.in b/src/libapplicationindicator/application-indicator-enum-types.c.in index 51512f6..39d44ab 100644 --- a/src/libapplicationindicator/application-indicator-enum-types.c.in +++ b/src/libapplicationindicator/application-indicator-enum-types.c.in @@ -1,5 +1,5 @@ /*** BEGIN file-header ***/ -#include "libcustomindicator/custom-indicator-enum-types.h" +#include "libapplicationindicator/application-indicator-enum-types.h" /*** END file-header ***/ diff --git a/src/libapplicationindicator/application-indicator.c b/src/libapplicationindicator/application-indicator.c index 8d6633a..979791d 100644 --- a/src/libapplicationindicator/application-indicator.c +++ b/src/libapplicationindicator/application-indicator.c @@ -5,8 +5,8 @@ #include #include -#include "libcustomindicator/custom-indicator.h" -#include "libcustomindicator/custom-indicator-enum-types.h" +#include "libapplicationindicator/application-indicator.h" +#include "libapplicationindicator/application-indicator-enum-types.h" #include "notification-item-server.h" #include "notification-watcher-client.h" @@ -618,7 +618,7 @@ check_connect (CustomIndicator * self) return; } - org_ayatana_indicator_custom_NotificationWatcher_register_service_async(priv->watcher_proxy, "/need/a/path", register_service_cb, self); + org_ayatana_indicator_application_NotificationWatcher_register_service_async(priv->watcher_proxy, "/need/a/path", register_service_cb, self); return; } -- cgit v1.2.3 From 8eff74d9fb43dfc5e86ca6225cdbfb31f550c100 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 10:30:22 -0600 Subject: Making the directory name shorter --- src/Makefile.am | 30 +- .../application-indicator-enum-types.c.in | 33 + .../application-indicator-enum-types.h.in | 33 + src/libappindicator/application-indicator.c | 847 +++++++++++++++++++++ src/libappindicator/application-indicator.h | 142 ++++ .../application-indicator-enum-types.c.in | 33 - .../application-indicator-enum-types.h.in | 33 - .../application-indicator.c | 847 --------------------- .../application-indicator.h | 142 ---- 9 files changed, 1070 insertions(+), 1070 deletions(-) create mode 100644 src/libappindicator/application-indicator-enum-types.c.in create mode 100644 src/libappindicator/application-indicator-enum-types.h.in create mode 100644 src/libappindicator/application-indicator.c create mode 100644 src/libappindicator/application-indicator.h delete mode 100644 src/libapplicationindicator/application-indicator-enum-types.c.in delete mode 100644 src/libapplicationindicator/application-indicator-enum-types.h.in delete mode 100644 src/libapplicationindicator/application-indicator.c delete mode 100644 src/libapplicationindicator/application-indicator.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index ddcbdfd..508e13d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -57,39 +57,39 @@ glib_marshal_prefix = _application_service_marshal # Library ################################## -glib_enum_h = libapplicationindicator/application-indicator-enum-types.h -glib_enum_c = libapplicationindicator/application-indicator-enum-types.c -glib_enum_headers = $(libapplicationindicator_headers) +glib_enum_h = libappindicator/application-indicator-enum-types.h +glib_enum_c = libappindicator/application-indicator-enum-types.c +glib_enum_headers = $(libappindicator_headers) lib_LTLIBRARIES = \ - libapplicationindicator.la + libappindicator.la -libapplicationindicatorincludedir=$(includedir)/libapplicationindicator-0.1/libapplicationindicator +libappindicatorincludedir=$(includedir)/libappindicator-0.1/libappindicator -libapplicationindicator_headers = \ - $(srcdir)/libapplicationindicator/application-indicator.h +libappindicator_headers = \ + $(srcdir)/libappindicator/application-indicator.h -libapplicationindicatorinclude_HEADERS = \ - $(libapplicationindicator_headers) \ +libappindicatorinclude_HEADERS = \ + $(libappindicator_headers) \ $(glib_enum_h) -libapplicationindicator_la_SOURCES = \ - $(libapplicationindicator_headers) \ +libappindicator_la_SOURCES = \ + $(libappindicator_headers) \ $(glib_enum_c) \ notification-watcher-client.h \ notification-item-server.h \ - libapplicationindicator/application-indicator.c + libappindicator/application-indicator.c -libapplicationindicator_la_LDFLAGS = \ +libappindicator_la_LDFLAGS = \ -version-info 0:0:0 \ -no-undefined \ -export-symbols-regex "^[^_d].*" -libapplicationindicator_la_CFLAGS = \ +libappindicator_la_CFLAGS = \ $(INDICATOR_CFLAGS) \ -Wall -Werror -libapplicationindicator_la_LIBADD = \ +libappindicator_la_LIBADD = \ $(INDICATOR_LIBS) ################################## diff --git a/src/libappindicator/application-indicator-enum-types.c.in b/src/libappindicator/application-indicator-enum-types.c.in new file mode 100644 index 0000000..dedf54c --- /dev/null +++ b/src/libappindicator/application-indicator-enum-types.c.in @@ -0,0 +1,33 @@ +/*** BEGIN file-header ***/ +#include "libappindicator/application-indicator-enum-types.h" + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +#include "@filename@" +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type (void) +{ + static GType etype = 0; + if (G_UNLIKELY(etype == 0)) { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL} + }; + + etype = g_@type@_register_static (g_intern_static_string("@EnumName@"), values); + } + + return etype; +} + +/*** END value-tail ***/ diff --git a/src/libappindicator/application-indicator-enum-types.h.in b/src/libappindicator/application-indicator-enum-types.h.in new file mode 100644 index 0000000..e037be7 --- /dev/null +++ b/src/libappindicator/application-indicator-enum-types.h.in @@ -0,0 +1,33 @@ +/*** BEGIN file-header ***/ +#ifndef __CUSTOM_INDICATOR_ENUM_TYPES_H__ +#define __CUSTOM_INDICATOR_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS + +/*** END file-header ***/ + +/*** BEGIN file-tail ***/ + +G_END_DECLS + +#endif /* __CUSTOM_INDICATOR_ENUM_TYPES_H__ */ +/*** END file-tail ***/ + +/*** BEGIN file-production ***/ +/* Enumerations from file: "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +/** + @enum_name@_get_type: + + Builds a glib type for the @EnumName@ enumeration. + + Return value: A registered type for the enum +*/ +GType @enum_name@_get_type (void) G_GNUC_CONST; +#define CUSTOM_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) + +/*** END value-header ***/ diff --git a/src/libappindicator/application-indicator.c b/src/libappindicator/application-indicator.c new file mode 100644 index 0000000..74efd1e --- /dev/null +++ b/src/libappindicator/application-indicator.c @@ -0,0 +1,847 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "libappindicator/application-indicator.h" +#include "libappindicator/application-indicator-enum-types.h" + +#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. + @category: Which category the indicator is. Maps to CustomIndicator::category. + @status: The status of the indicator. Maps to CustomIndicator::status. + @icon_name: The name of the icon to use. Maps to CustomIndicator::icon-name. + @attention_icon_name: The name of the attention icon to use. Maps to CustomIndicator::attention-icon-name. + @menu: The menu for this indicator. Maps to CustomIndicator::menu + @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be #NULL. + + All of the private data in an instance of a + custom indicator. +*/ +typedef struct _CustomIndicatorPrivate CustomIndicatorPrivate; +struct _CustomIndicatorPrivate { + /* Properties */ + gchar * id; + CustomIndicatorCategory category; + CustomIndicatorStatus status; + gchar * icon_name; + gchar * attention_icon_name; + DbusmenuServer * menu; + + /* Fun stuff */ + DBusGProxy * watcher_proxy; + DBusGConnection * connection; +}; + +/* Signals Stuff */ +enum { + NEW_ICON, + NEW_ATTENTION_ICON, + NEW_STATUS, + CONNECTION_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* Enum for the properties so that they can be quickly + found and looked up. */ +enum { + PROP_0, + PROP_ID, + PROP_CATEGORY, + PROP_CATEGORY_ENUM, + PROP_STATUS, + PROP_STATUS_ENUM, + PROP_ICON_NAME, + PROP_ATTENTION_ICON_NAME, + PROP_MENU, + PROP_MENU_OBJECT, + PROP_CONNECTED +}; + +/* The strings so that they can be slowly looked up. */ +#define PROP_ID_S "id" +#define PROP_CATEGORY_S "category" +#define PROP_CATEGORY_ENUM_S "category-enum" +#define PROP_STATUS_S "status" +#define PROP_STATUS_ENUM_S "status-enum" +#define PROP_ICON_NAME_S "icon-name" +#define PROP_ATTENTION_ICON_NAME_S "attention-icon-name" +#define PROP_MENU_S "menu" +#define PROP_MENU_OBJECT_S "menu-object" +#define PROP_CONNECTED_S "connected" + +/* Private macro, shhhh! */ +#define CUSTOM_INDICATOR_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_INDICATOR_TYPE, CustomIndicatorPrivate)) + +/* Boiler plate */ +static void custom_indicator_class_init (CustomIndicatorClass *klass); +static void custom_indicator_init (CustomIndicator *self); +static void custom_indicator_dispose (GObject *object); +static void custom_indicator_finalize (GObject *object); +/* Property functions */ +static void custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +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); + +static void +custom_indicator_class_init (CustomIndicatorClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (CustomIndicatorPrivate)); + + /* Clean up */ + object_class->dispose = custom_indicator_dispose; + object_class->finalize = custom_indicator_finalize; + + /* Property funcs */ + object_class->set_property = custom_indicator_set_property; + object_class->get_property = custom_indicator_get_property; + + /* Properties */ + g_object_class_install_property(object_class, PROP_ID, + g_param_spec_string(PROP_ID_S, + "The ID for this indicator", + "An ID that should be unique, but used consistently by this program and it's indicator.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_CATEGORY, + g_param_spec_string(PROP_CATEGORY_S, + "Indicator Category as a string", + "The type of indicator that this represents as a string. For DBus.", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_CATEGORY_ENUM, + g_param_spec_enum(PROP_CATEGORY_ENUM_S, + "Indicator Category", + "The type of indicator that this represents. Please don't use 'other'. Defaults to 'Application Status'.", + CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY, + CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_STATUS, + g_param_spec_string(PROP_STATUS_S, + "Indicator Status as a string", + "The status of the indicator represented as a string. For DBus.", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_STATUS_ENUM, + g_param_spec_enum(PROP_STATUS_ENUM_S, + "Indicator Status", + "Whether the indicator is shown or requests attention. Defaults to 'off'.", + CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS, + CUSTOM_INDICATOR_STATUS_PASSIVE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_ICON_NAME, + g_param_spec_string(PROP_ICON_NAME_S, + "An icon for the indicator", + "The default icon that is shown for the indicator.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_ATTENTION_ICON_NAME, + g_param_spec_string(PROP_ATTENTION_ICON_NAME_S, + "An icon to show when the indicator request attention.", + "If the indicator sets it's status to 'attention' then this icon is shown.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_MENU, + g_param_spec_string(PROP_MENU_S, + "The object path of the menu on DBus.", + "A method for getting the menu path as a string for DBus.", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_MENU_OBJECT, + g_param_spec_object(PROP_MENU_OBJECT_S, + "The Menu for the indicator", + "A DBus Menu Server object that can have a menu attached to it. The object from this menu will be sent across the bus for the client to connect to and signal.", + DBUSMENU_TYPE_SERVER, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_CONNECTED, + g_param_spec_boolean(PROP_CONNECTED_S, + "Whether we're conneced to a watcher", + "Pretty simple, true if we have a reasonable expectation of being displayed through this object. You should hide your TrayIcon if so.", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + + /* Signals */ + + /** + CustomIndicator::new-icon: + @arg0: The #CustomIndicator object + + Signaled when there is a new icon set for the + object. + */ + signals[NEW_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ICON, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, new_icon), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + CustomIndicator::new-attention-icon: + @arg0: The #CustomIndicator object + + Signaled when there is a new attention icon set for the + object. + */ + signals[NEW_ATTENTION_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, new_attention_icon), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + CustomIndicator::new-status: + @arg0: The #CustomIndicator object + @arg1: The string value of the #CustomIndicatorStatus enum. + + Signaled when the status of the indicator changes. + */ + signals[NEW_STATUS] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_STATUS, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, new_status), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); + + /** + CustomIndicator::connection-changed: + @arg0: The #CustomIndicator object + @arg1: Whether we're connected or not + + Signaled when we connect to a watcher, or when it drops + away. + */ + signals[CONNECTION_CHANGED] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, connection_changed), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE); + + /* Initialize the object as a DBus type */ + dbus_g_object_type_install_info(CUSTOM_INDICATOR_TYPE, + &dbus_glib__notification_item_server_object_info); + + return; +} + +static void +custom_indicator_init (CustomIndicator *self) +{ + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + priv->id = NULL; + priv->category = CUSTOM_INDICATOR_CATEGORY_OTHER; + priv->status = CUSTOM_INDICATOR_STATUS_PASSIVE; + priv->icon_name = NULL; + priv->attention_icon_name = NULL; + priv->menu = NULL; + + priv->watcher_proxy = NULL; + priv->connection = NULL; + + /* Put the object on DBus */ + GError * error = NULL; + 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(priv->connection, + "/need/a/path", + G_OBJECT(self)); + + return; +} + +/* Free all objects, make sure that all the dbus + signals are sent out before we shut this down. */ +static void +custom_indicator_dispose (GObject *object) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { + custom_indicator_set_status(self, CUSTOM_INDICATOR_STATUS_PASSIVE); + } + + if (priv->menu != NULL) { + g_object_unref(G_OBJECT(priv->menu)); + priv->menu = NULL; + } + + if (priv->watcher_proxy != NULL) { + dbus_g_connection_flush(priv->connection); + g_object_unref(G_OBJECT(priv->watcher_proxy)); + priv->watcher_proxy = NULL; + } + + G_OBJECT_CLASS (custom_indicator_parent_class)->dispose (object); + return; +} + +/* Free all of the memory that we could be using in + the object. */ +static void +custom_indicator_finalize (GObject *object) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { + g_warning("Finalizing Custom Status with the status set to: %d", priv->status); + } + + if (priv->id != NULL) { + g_free(priv->id); + priv->id = NULL; + } + + if (priv->icon_name != NULL) { + g_free(priv->icon_name); + priv->icon_name = NULL; + } + + if (priv->attention_icon_name != NULL) { + g_free(priv->attention_icon_name); + priv->attention_icon_name = NULL; + } + + G_OBJECT_CLASS (custom_indicator_parent_class)->finalize (object); + return; +} + +#define WARN_BAD_TYPE(prop, value) g_warning("Can not work with property '%s' with value of type '%s'.", prop, G_VALUE_TYPE_NAME(value)) + +/* Set some properties */ +static void +custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + switch (prop_id) { + /* *********************** */ + case PROP_ID: + if (G_VALUE_HOLDS_STRING(value)) { + if (priv->id != NULL) { + g_warning("Resetting ID value when I already had a value of: %s", priv->id); + g_free(priv->id); + priv->id = NULL; + } + priv->id = g_strdup(g_value_get_string(value)); + } else { + WARN_BAD_TYPE(PROP_ID_S, value); + } + check_connect(self); + break; + /* *********************** */ + case PROP_CATEGORY_ENUM: + if (G_VALUE_HOLDS_ENUM(value)) { + priv->category = g_value_get_enum(value); + } else { + WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); + } + break; + /* *********************** */ + case PROP_STATUS_ENUM: { + gboolean changed = FALSE; + if (G_VALUE_HOLDS_ENUM(value)) { + if (priv->status != g_value_get_enum(value)) { + changed = TRUE; + } + priv->status = g_value_get_enum(value); + } else { + WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); + } + if (changed) { + GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(pspec); + if (enumspec != NULL) { + GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); + g_signal_emit(object, signals[NEW_STATUS], 0, enumval->value_nick, TRUE); + } + } + break; + } + /* *********************** */ + case PROP_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + const gchar * instr = g_value_get_string(value); + gboolean changed = FALSE; + if (priv->icon_name == NULL) { + priv->icon_name = g_strdup(instr); + changed = TRUE; + } else if (!g_strcmp0(instr, priv->icon_name)) { + changed = FALSE; + } else { + g_free(priv->icon_name); + priv->icon_name = g_strdup(instr); + changed = TRUE; + } + if (changed) { + g_signal_emit(object, signals[NEW_ICON], 0, TRUE); + } + } else { + WARN_BAD_TYPE(PROP_ICON_NAME_S, value); + } + check_connect(self); + break; + /* *********************** */ + case PROP_ATTENTION_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + const gchar * instr = g_value_get_string(value); + gboolean changed = FALSE; + if (priv->attention_icon_name == NULL) { + priv->attention_icon_name = g_strdup(instr); + changed = TRUE; + } else if (!g_strcmp0(instr, priv->attention_icon_name)) { + changed = FALSE; + } else { + g_free(priv->attention_icon_name); + priv->attention_icon_name = g_strdup(instr); + changed = TRUE; + } + if (changed) { + g_signal_emit(object, signals[NEW_ATTENTION_ICON], 0, TRUE); + } + } else { + WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); + } + break; + /* *********************** */ + case PROP_MENU_OBJECT: + if (G_VALUE_HOLDS_OBJECT(value)) { + if (priv->menu != NULL) { + g_object_unref(G_OBJECT(priv->menu)); + } + priv->menu = DBUSMENU_SERVER(g_value_get_object(value)); + g_object_ref(G_OBJECT(priv->menu)); + } else { + WARN_BAD_TYPE(PROP_MENU_S, value); + } + check_connect(self); + break; + /* *********************** */ + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + return; +} + +/* Function to fill our value with the property it's requesting. */ +static void +custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + switch (prop_id) { + /* *********************** */ + case PROP_ID: + if (G_VALUE_HOLDS_STRING(value)) { + g_value_set_string(value, priv->id); + } else { + WARN_BAD_TYPE(PROP_ID_S, value); + } + break; + /* *********************** */ + case PROP_CATEGORY: + if (G_VALUE_HOLDS_STRING(value)) { + GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_CATEGORY_ENUM_S); + GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); + if (enumspec != NULL) { + GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->category); + g_value_set_string(value, enumval->value_nick); + } else { + g_assert_not_reached(); + } + } else { + WARN_BAD_TYPE(PROP_CATEGORY_S, value); + } + break; + /* *********************** */ + case PROP_CATEGORY_ENUM: + if (G_VALUE_HOLDS_ENUM(value)) { + /* We want the enum value */ + g_value_set_enum(value, priv->category); + } else { + WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); + } + break; + /* *********************** */ + case PROP_STATUS: + if (G_VALUE_HOLDS_STRING(value)) { + GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_STATUS_ENUM_S); + GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); + if (enumspec != NULL) { + GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); + g_value_set_string(value, enumval->value_nick); + } else { + g_assert_not_reached(); + } + } else { + WARN_BAD_TYPE(PROP_STATUS_S, value); + } + break; + /* *********************** */ + case PROP_STATUS_ENUM: + if (G_VALUE_HOLDS_ENUM(value)) { + /* We want the enum value */ + g_value_set_enum(value, priv->status); + } else { + WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); + } + break; + /* *********************** */ + case PROP_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + g_value_set_string(value, priv->icon_name); + } else { + WARN_BAD_TYPE(PROP_ICON_NAME_S, value); + } + break; + /* *********************** */ + case PROP_ATTENTION_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + g_value_set_string(value, priv->attention_icon_name); + } else { + WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); + } + break; + /* *********************** */ + case PROP_MENU: + if (G_VALUE_HOLDS_STRING(value)) { + if (priv->menu != NULL) { + g_object_get_property(G_OBJECT(priv->menu), DBUSMENU_SERVER_PROP_DBUS_OBJECT, value); + } + } else { + WARN_BAD_TYPE(PROP_MENU_S, value); + } + break; + /* *********************** */ + case PROP_MENU_OBJECT: + if (G_VALUE_HOLDS_OBJECT(value)) { + g_value_set_object(value, priv->menu); + } else { + WARN_BAD_TYPE(PROP_MENU_OBJECT_S, value); + } + break; + /* *********************** */ + case PROP_CONNECTED: + if (G_VALUE_HOLDS_BOOLEAN(value)) { + g_value_set_boolean(value, priv->watcher_proxy != NULL ? TRUE : FALSE); + } else { + WARN_BAD_TYPE(PROP_CONNECTED_S, value); + } + break; + /* *********************** */ + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + return; +} + +/* This function is used to see if we have enough information to + connect to things. If we do, and we're not connected, it + connects for us. */ +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_application_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; +} + + +/* ************************* */ +/* Public Functions */ +/* ************************* */ + +/** + custom_indicator_set_id: + @ci: The #CustomIndicator object to use + @id: ID to set for this indicator + + Wrapper function for property #CustomIndicator::id. +*/ +void +custom_indicator_set_id (CustomIndicator * ci, const gchar * id) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_value_set_string(&value, id); + g_object_set_property(G_OBJECT(ci), PROP_ID_S, &value); + return; +} + +/** + custom_indicator_set_category: + @ci: The #CustomIndicator object to use + @category: The category to set for this indicator + + Wrapper function for property #CustomIndicator::category. +*/ +void +custom_indicator_set_category (CustomIndicator * ci, CustomIndicatorCategory category) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_value_set_enum(&value, category); + g_object_set_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); + return; +} + +/** + custom_indicator_set_status: + @ci: The #CustomIndicator object to use + @status: The status to set for this indicator + + Wrapper function for property #CustomIndicator::status. +*/ +void +custom_indicator_set_status (CustomIndicator * ci, CustomIndicatorStatus status) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); + g_value_set_enum(&value, status); + g_object_set_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); + return; +} + +/** + custom_indicator_set_icon: + @ci: The #CustomIndicator object to use + @icon_name: The name of the icon to set for this indicator + + Wrapper function for property #CustomIndicator::icon. +*/ +void custom_indicator_set_icon (CustomIndicator * ci, const gchar * icon_name) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_value_set_string(&value, icon_name); + g_object_set_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); + return; +} + +/** + custom_indicator_set_attention_icon: + @ci: The #CustomIndicator object to use + @icon_name: The name of the attention icon to set for this indicator + + Wrapper function for property #CustomIndicator::attention-icon. +*/ +void +custom_indicator_set_attention_icon (CustomIndicator * ci, const gchar * icon_name) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_value_set_string(&value, icon_name); + g_object_set_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); + return; +} + +/** + custom_indicator_set_menu: + @ci: The #CustomIndicator object to use + @menu: The object with the menu for the indicator + + Wrapper function for property #CustomIndicator::menu. +*/ +void +custom_indicator_set_menu (CustomIndicator * ci, DbusmenuServer * menu) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_OBJECT); + g_value_set_object(&value, G_OBJECT(menu)); + g_object_set_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); + return; +} + +/** + custom_indicator_get_id: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::id. + + Return value: The current ID +*/ +const gchar * +custom_indicator_get_id (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(ci), PROP_ID_S, &value); + return g_value_get_string(&value); +} + +/** + custom_indicator_get_category: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::category. + + Return value: The current category. +*/ +CustomIndicatorCategory +custom_indicator_get_category (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_object_get_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); + return g_value_get_enum(&value); +} + +/** + custom_indicator_get_status: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::status. + + Return value: The current status. +*/ +CustomIndicatorStatus +custom_indicator_get_status (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); + g_object_get_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); + return g_value_get_enum(&value); +} + +/** + custom_indicator_get_icon: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::icon-name. + + Return value: The current icon name. +*/ +const gchar * +custom_indicator_get_icon (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); + return g_value_get_string(&value); +} + +/** + custom_indicator_get_attention_icon: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::attention-icon-name. + + Return value: The current attention icon name. +*/ +const gchar * +custom_indicator_get_attention_icon (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); + return g_value_get_string(&value); +} + +/** + custom_indicator_get_menu: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::menu. + + Return value: The current menu being used. +*/ +DbusmenuServer * +custom_indicator_get_menu (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_OBJECT); + g_object_get_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); + return DBUSMENU_SERVER(g_value_get_object(&value)); +} + + diff --git a/src/libappindicator/application-indicator.h b/src/libappindicator/application-indicator.h new file mode 100644 index 0000000..2e9045c --- /dev/null +++ b/src/libappindicator/application-indicator.h @@ -0,0 +1,142 @@ +#ifndef __CUSTOM_INDICATOR_H__ +#define __CUSTOM_INDICATOR_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define CUSTOM_INDICATOR_TYPE (custom_indicator_get_type ()) +#define CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicator)) +#define CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) +#define IS_CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_INDICATOR_TYPE)) +#define IS_CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_INDICATOR_TYPE)) +#define CUSTOM_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) + +#define CUSTOM_INDICATOR_SIGNAL_NEW_ICON "new-icon" +#define CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" +#define CUSTOM_INDICATOR_SIGNAL_NEW_STATUS "new-status" +#define CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" + +/** + CustomIndicatorCategory: + @CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. + @CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. + @CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. + @CUSTOM_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. + @CUSTOM_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. + + The category provides grouping for the indicators so that + users can find indicators that are similar together. +*/ +typedef enum { /*< prefix=CUSTOM_INDICATOR_CATEGORY >*/ + CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, + CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS, + CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES, + CUSTOM_INDICATOR_CATEGORY_HARDWARE, + CUSTOM_INDICATOR_CATEGORY_OTHER +} CustomIndicatorCategory; + +/** + CustomIndicatorStatus: + @CUSTOM_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. + @CUSTOM_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. + @CUSTOM_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. + + These are the states that the indicator can be on in + the user's panel. The indicator by default starts + in the state @CUSTOM_INDICATOR_STATUS_OFF and can be + shown by setting it to @CUSTOM_INDICATOR_STATUS_ON. +*/ +typedef enum { /*< prefix=CUSTOM_INDICATOR_STATUS >*/ + CUSTOM_INDICATOR_STATUS_PASSIVE, + CUSTOM_INDICATOR_STATUS_ACTIVE, + CUSTOM_INDICATOR_STATUS_ATTENTION +} CustomIndicatorStatus; + +typedef struct _CustomIndicator CustomIndicator; +typedef struct _CustomIndicatorClass CustomIndicatorClass; + +/** + CustomIndicatorClass: + @parent_class: Mia familia + @new_icon: Slot for #CustomIndicator::new-icon. + @new_attention_icon: Slot for #CustomIndicator::new-attention-icon. + @new_status: Slot for #CustomIndicator::new-status. + @connection_changed: Slot for #CustomIndicator::connection-changed. + @custom_indicator_reserved_1: Reserved for future use. + @custom_indicator_reserved_2: Reserved for future use. + @custom_indicator_reserved_3: Reserved for future use. + @custom_indicator_reserved_4: Reserved for future use. + + The signals and external functions that make up the #CustomIndicator + class object. +*/ +struct _CustomIndicatorClass { + /* Parent */ + GObjectClass parent_class; + + /* DBus Signals */ + void (* new_icon) (CustomIndicator * indicator, + gpointer user_data); + void (* new_attention_icon) (CustomIndicator * indicator, + gpointer user_data); + void (* new_status) (CustomIndicator * indicator, + gchar * status_string, + gpointer user_data); + + /* Local Signals */ + void (* connection_changed) (CustomIndicator * indicator, + gboolean connected, + gpointer user_data); + + /* Reserved */ + void (*custom_indicator_reserved_1)(void); + void (*custom_indicator_reserved_2)(void); + void (*custom_indicator_reserved_3)(void); + void (*custom_indicator_reserved_4)(void); +}; + +/** + CustomIndicator: + @parent: Parent object. + + A custom indicator represents the values that are needed to show a + unique status in the panel for an application. In general, applications + should try to fit in the other indicators that are available on the + panel before using this. But, sometimes it is necissary. +*/ +struct _CustomIndicator { + GObject parent; + /* None. We're a very private object. */ +}; + +/* GObject Stuff */ +GType custom_indicator_get_type (void); + +/* Set properties */ +void custom_indicator_set_id (CustomIndicator * ci, + const gchar * id); +void custom_indicator_set_category (CustomIndicator * ci, + CustomIndicatorCategory category); +void custom_indicator_set_status (CustomIndicator * ci, + CustomIndicatorStatus status); +void custom_indicator_set_icon (CustomIndicator * ci, + const gchar * icon_name); +void custom_indicator_set_attention_icon (CustomIndicator * ci, + const gchar * icon_name); +void custom_indicator_set_menu (CustomIndicator * ci, + DbusmenuServer * menu); + +/* Get properties */ +const gchar * custom_indicator_get_id (CustomIndicator * ci); +CustomIndicatorCategory custom_indicator_get_category (CustomIndicator * ci); +CustomIndicatorStatus custom_indicator_get_status (CustomIndicator * ci); +const gchar * custom_indicator_get_icon (CustomIndicator * ci); +const gchar * custom_indicator_get_attention_icon (CustomIndicator * ci); +DbusmenuServer * custom_indicator_get_menu (CustomIndicator * ci); + +G_END_DECLS + +#endif diff --git a/src/libapplicationindicator/application-indicator-enum-types.c.in b/src/libapplicationindicator/application-indicator-enum-types.c.in deleted file mode 100644 index 39d44ab..0000000 --- a/src/libapplicationindicator/application-indicator-enum-types.c.in +++ /dev/null @@ -1,33 +0,0 @@ -/*** BEGIN file-header ***/ -#include "libapplicationindicator/application-indicator-enum-types.h" - -/*** END file-header ***/ - -/*** BEGIN file-production ***/ -#include "@filename@" -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -GType -@enum_name@_get_type (void) -{ - static GType etype = 0; - if (G_UNLIKELY(etype == 0)) { - static const G@Type@Value values[] = { -/*** END value-header ***/ - -/*** BEGIN value-production ***/ - { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, -/*** END value-production ***/ - -/*** BEGIN value-tail ***/ - { 0, NULL, NULL} - }; - - etype = g_@type@_register_static (g_intern_static_string("@EnumName@"), values); - } - - return etype; -} - -/*** END value-tail ***/ diff --git a/src/libapplicationindicator/application-indicator-enum-types.h.in b/src/libapplicationindicator/application-indicator-enum-types.h.in deleted file mode 100644 index e037be7..0000000 --- a/src/libapplicationindicator/application-indicator-enum-types.h.in +++ /dev/null @@ -1,33 +0,0 @@ -/*** BEGIN file-header ***/ -#ifndef __CUSTOM_INDICATOR_ENUM_TYPES_H__ -#define __CUSTOM_INDICATOR_ENUM_TYPES_H__ - -#include - -G_BEGIN_DECLS - -/*** END file-header ***/ - -/*** BEGIN file-tail ***/ - -G_END_DECLS - -#endif /* __CUSTOM_INDICATOR_ENUM_TYPES_H__ */ -/*** END file-tail ***/ - -/*** BEGIN file-production ***/ -/* Enumerations from file: "@filename@" */ -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -/** - @enum_name@_get_type: - - Builds a glib type for the @EnumName@ enumeration. - - Return value: A registered type for the enum -*/ -GType @enum_name@_get_type (void) G_GNUC_CONST; -#define CUSTOM_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) - -/*** END value-header ***/ diff --git a/src/libapplicationindicator/application-indicator.c b/src/libapplicationindicator/application-indicator.c deleted file mode 100644 index 979791d..0000000 --- a/src/libapplicationindicator/application-indicator.c +++ /dev/null @@ -1,847 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#include "libapplicationindicator/application-indicator.h" -#include "libapplicationindicator/application-indicator-enum-types.h" - -#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. - @category: Which category the indicator is. Maps to CustomIndicator::category. - @status: The status of the indicator. Maps to CustomIndicator::status. - @icon_name: The name of the icon to use. Maps to CustomIndicator::icon-name. - @attention_icon_name: The name of the attention icon to use. Maps to CustomIndicator::attention-icon-name. - @menu: The menu for this indicator. Maps to CustomIndicator::menu - @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be #NULL. - - All of the private data in an instance of a - custom indicator. -*/ -typedef struct _CustomIndicatorPrivate CustomIndicatorPrivate; -struct _CustomIndicatorPrivate { - /* Properties */ - gchar * id; - CustomIndicatorCategory category; - CustomIndicatorStatus status; - gchar * icon_name; - gchar * attention_icon_name; - DbusmenuServer * menu; - - /* Fun stuff */ - DBusGProxy * watcher_proxy; - DBusGConnection * connection; -}; - -/* Signals Stuff */ -enum { - NEW_ICON, - NEW_ATTENTION_ICON, - NEW_STATUS, - CONNECTION_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -/* Enum for the properties so that they can be quickly - found and looked up. */ -enum { - PROP_0, - PROP_ID, - PROP_CATEGORY, - PROP_CATEGORY_ENUM, - PROP_STATUS, - PROP_STATUS_ENUM, - PROP_ICON_NAME, - PROP_ATTENTION_ICON_NAME, - PROP_MENU, - PROP_MENU_OBJECT, - PROP_CONNECTED -}; - -/* The strings so that they can be slowly looked up. */ -#define PROP_ID_S "id" -#define PROP_CATEGORY_S "category" -#define PROP_CATEGORY_ENUM_S "category-enum" -#define PROP_STATUS_S "status" -#define PROP_STATUS_ENUM_S "status-enum" -#define PROP_ICON_NAME_S "icon-name" -#define PROP_ATTENTION_ICON_NAME_S "attention-icon-name" -#define PROP_MENU_S "menu" -#define PROP_MENU_OBJECT_S "menu-object" -#define PROP_CONNECTED_S "connected" - -/* Private macro, shhhh! */ -#define CUSTOM_INDICATOR_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_INDICATOR_TYPE, CustomIndicatorPrivate)) - -/* Boiler plate */ -static void custom_indicator_class_init (CustomIndicatorClass *klass); -static void custom_indicator_init (CustomIndicator *self); -static void custom_indicator_dispose (GObject *object); -static void custom_indicator_finalize (GObject *object); -/* Property functions */ -static void custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -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); - -static void -custom_indicator_class_init (CustomIndicatorClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (CustomIndicatorPrivate)); - - /* Clean up */ - object_class->dispose = custom_indicator_dispose; - object_class->finalize = custom_indicator_finalize; - - /* Property funcs */ - object_class->set_property = custom_indicator_set_property; - object_class->get_property = custom_indicator_get_property; - - /* Properties */ - g_object_class_install_property(object_class, PROP_ID, - g_param_spec_string(PROP_ID_S, - "The ID for this indicator", - "An ID that should be unique, but used consistently by this program and it's indicator.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_CATEGORY, - g_param_spec_string(PROP_CATEGORY_S, - "Indicator Category as a string", - "The type of indicator that this represents as a string. For DBus.", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_CATEGORY_ENUM, - g_param_spec_enum(PROP_CATEGORY_ENUM_S, - "Indicator Category", - "The type of indicator that this represents. Please don't use 'other'. Defaults to 'Application Status'.", - CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY, - CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_STATUS, - g_param_spec_string(PROP_STATUS_S, - "Indicator Status as a string", - "The status of the indicator represented as a string. For DBus.", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_STATUS_ENUM, - g_param_spec_enum(PROP_STATUS_ENUM_S, - "Indicator Status", - "Whether the indicator is shown or requests attention. Defaults to 'off'.", - CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS, - CUSTOM_INDICATOR_STATUS_PASSIVE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_ICON_NAME, - g_param_spec_string(PROP_ICON_NAME_S, - "An icon for the indicator", - "The default icon that is shown for the indicator.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_ATTENTION_ICON_NAME, - g_param_spec_string(PROP_ATTENTION_ICON_NAME_S, - "An icon to show when the indicator request attention.", - "If the indicator sets it's status to 'attention' then this icon is shown.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_MENU, - g_param_spec_string(PROP_MENU_S, - "The object path of the menu on DBus.", - "A method for getting the menu path as a string for DBus.", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_MENU_OBJECT, - g_param_spec_object(PROP_MENU_OBJECT_S, - "The Menu for the indicator", - "A DBus Menu Server object that can have a menu attached to it. The object from this menu will be sent across the bus for the client to connect to and signal.", - DBUSMENU_TYPE_SERVER, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_CONNECTED, - g_param_spec_boolean(PROP_CONNECTED_S, - "Whether we're conneced to a watcher", - "Pretty simple, true if we have a reasonable expectation of being displayed through this object. You should hide your TrayIcon if so.", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - - /* Signals */ - - /** - CustomIndicator::new-icon: - @arg0: The #CustomIndicator object - - Signaled when there is a new icon set for the - object. - */ - signals[NEW_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ICON, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_icon), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); - - /** - CustomIndicator::new-attention-icon: - @arg0: The #CustomIndicator object - - Signaled when there is a new attention icon set for the - object. - */ - signals[NEW_ATTENTION_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_attention_icon), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); - - /** - CustomIndicator::new-status: - @arg0: The #CustomIndicator object - @arg1: The string value of the #CustomIndicatorStatus enum. - - Signaled when the status of the indicator changes. - */ - signals[NEW_STATUS] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_STATUS, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_status), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); - - /** - CustomIndicator::connection-changed: - @arg0: The #CustomIndicator object - @arg1: Whether we're connected or not - - Signaled when we connect to a watcher, or when it drops - away. - */ - signals[CONNECTION_CHANGED] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, connection_changed), - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE); - - /* Initialize the object as a DBus type */ - dbus_g_object_type_install_info(CUSTOM_INDICATOR_TYPE, - &dbus_glib__notification_item_server_object_info); - - return; -} - -static void -custom_indicator_init (CustomIndicator *self) -{ - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - priv->id = NULL; - priv->category = CUSTOM_INDICATOR_CATEGORY_OTHER; - priv->status = CUSTOM_INDICATOR_STATUS_PASSIVE; - priv->icon_name = NULL; - priv->attention_icon_name = NULL; - priv->menu = NULL; - - priv->watcher_proxy = NULL; - priv->connection = NULL; - - /* Put the object on DBus */ - GError * error = NULL; - 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(priv->connection, - "/need/a/path", - G_OBJECT(self)); - - return; -} - -/* Free all objects, make sure that all the dbus - signals are sent out before we shut this down. */ -static void -custom_indicator_dispose (GObject *object) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { - custom_indicator_set_status(self, CUSTOM_INDICATOR_STATUS_PASSIVE); - } - - if (priv->menu != NULL) { - g_object_unref(G_OBJECT(priv->menu)); - priv->menu = NULL; - } - - if (priv->watcher_proxy != NULL) { - dbus_g_connection_flush(priv->connection); - g_object_unref(G_OBJECT(priv->watcher_proxy)); - priv->watcher_proxy = NULL; - } - - G_OBJECT_CLASS (custom_indicator_parent_class)->dispose (object); - return; -} - -/* Free all of the memory that we could be using in - the object. */ -static void -custom_indicator_finalize (GObject *object) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { - g_warning("Finalizing Custom Status with the status set to: %d", priv->status); - } - - if (priv->id != NULL) { - g_free(priv->id); - priv->id = NULL; - } - - if (priv->icon_name != NULL) { - g_free(priv->icon_name); - priv->icon_name = NULL; - } - - if (priv->attention_icon_name != NULL) { - g_free(priv->attention_icon_name); - priv->attention_icon_name = NULL; - } - - G_OBJECT_CLASS (custom_indicator_parent_class)->finalize (object); - return; -} - -#define WARN_BAD_TYPE(prop, value) g_warning("Can not work with property '%s' with value of type '%s'.", prop, G_VALUE_TYPE_NAME(value)) - -/* Set some properties */ -static void -custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - switch (prop_id) { - /* *********************** */ - case PROP_ID: - if (G_VALUE_HOLDS_STRING(value)) { - if (priv->id != NULL) { - g_warning("Resetting ID value when I already had a value of: %s", priv->id); - g_free(priv->id); - priv->id = NULL; - } - priv->id = g_strdup(g_value_get_string(value)); - } else { - WARN_BAD_TYPE(PROP_ID_S, value); - } - check_connect(self); - break; - /* *********************** */ - case PROP_CATEGORY_ENUM: - if (G_VALUE_HOLDS_ENUM(value)) { - priv->category = g_value_get_enum(value); - } else { - WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); - } - break; - /* *********************** */ - case PROP_STATUS_ENUM: { - gboolean changed = FALSE; - if (G_VALUE_HOLDS_ENUM(value)) { - if (priv->status != g_value_get_enum(value)) { - changed = TRUE; - } - priv->status = g_value_get_enum(value); - } else { - WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); - } - if (changed) { - GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(pspec); - if (enumspec != NULL) { - GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); - g_signal_emit(object, signals[NEW_STATUS], 0, enumval->value_nick, TRUE); - } - } - break; - } - /* *********************** */ - case PROP_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - const gchar * instr = g_value_get_string(value); - gboolean changed = FALSE; - if (priv->icon_name == NULL) { - priv->icon_name = g_strdup(instr); - changed = TRUE; - } else if (!g_strcmp0(instr, priv->icon_name)) { - changed = FALSE; - } else { - g_free(priv->icon_name); - priv->icon_name = g_strdup(instr); - changed = TRUE; - } - if (changed) { - g_signal_emit(object, signals[NEW_ICON], 0, TRUE); - } - } else { - WARN_BAD_TYPE(PROP_ICON_NAME_S, value); - } - check_connect(self); - break; - /* *********************** */ - case PROP_ATTENTION_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - const gchar * instr = g_value_get_string(value); - gboolean changed = FALSE; - if (priv->attention_icon_name == NULL) { - priv->attention_icon_name = g_strdup(instr); - changed = TRUE; - } else if (!g_strcmp0(instr, priv->attention_icon_name)) { - changed = FALSE; - } else { - g_free(priv->attention_icon_name); - priv->attention_icon_name = g_strdup(instr); - changed = TRUE; - } - if (changed) { - g_signal_emit(object, signals[NEW_ATTENTION_ICON], 0, TRUE); - } - } else { - WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); - } - break; - /* *********************** */ - case PROP_MENU_OBJECT: - if (G_VALUE_HOLDS_OBJECT(value)) { - if (priv->menu != NULL) { - g_object_unref(G_OBJECT(priv->menu)); - } - priv->menu = DBUSMENU_SERVER(g_value_get_object(value)); - g_object_ref(G_OBJECT(priv->menu)); - } else { - WARN_BAD_TYPE(PROP_MENU_S, value); - } - check_connect(self); - break; - /* *********************** */ - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - - return; -} - -/* Function to fill our value with the property it's requesting. */ -static void -custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - switch (prop_id) { - /* *********************** */ - case PROP_ID: - if (G_VALUE_HOLDS_STRING(value)) { - g_value_set_string(value, priv->id); - } else { - WARN_BAD_TYPE(PROP_ID_S, value); - } - break; - /* *********************** */ - case PROP_CATEGORY: - if (G_VALUE_HOLDS_STRING(value)) { - GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_CATEGORY_ENUM_S); - GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); - if (enumspec != NULL) { - GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->category); - g_value_set_string(value, enumval->value_nick); - } else { - g_assert_not_reached(); - } - } else { - WARN_BAD_TYPE(PROP_CATEGORY_S, value); - } - break; - /* *********************** */ - case PROP_CATEGORY_ENUM: - if (G_VALUE_HOLDS_ENUM(value)) { - /* We want the enum value */ - g_value_set_enum(value, priv->category); - } else { - WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); - } - break; - /* *********************** */ - case PROP_STATUS: - if (G_VALUE_HOLDS_STRING(value)) { - GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_STATUS_ENUM_S); - GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); - if (enumspec != NULL) { - GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); - g_value_set_string(value, enumval->value_nick); - } else { - g_assert_not_reached(); - } - } else { - WARN_BAD_TYPE(PROP_STATUS_S, value); - } - break; - /* *********************** */ - case PROP_STATUS_ENUM: - if (G_VALUE_HOLDS_ENUM(value)) { - /* We want the enum value */ - g_value_set_enum(value, priv->status); - } else { - WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); - } - break; - /* *********************** */ - case PROP_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - g_value_set_string(value, priv->icon_name); - } else { - WARN_BAD_TYPE(PROP_ICON_NAME_S, value); - } - break; - /* *********************** */ - case PROP_ATTENTION_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - g_value_set_string(value, priv->attention_icon_name); - } else { - WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); - } - break; - /* *********************** */ - case PROP_MENU: - if (G_VALUE_HOLDS_STRING(value)) { - if (priv->menu != NULL) { - g_object_get_property(G_OBJECT(priv->menu), DBUSMENU_SERVER_PROP_DBUS_OBJECT, value); - } - } else { - WARN_BAD_TYPE(PROP_MENU_S, value); - } - break; - /* *********************** */ - case PROP_MENU_OBJECT: - if (G_VALUE_HOLDS_OBJECT(value)) { - g_value_set_object(value, priv->menu); - } else { - WARN_BAD_TYPE(PROP_MENU_OBJECT_S, value); - } - break; - /* *********************** */ - case PROP_CONNECTED: - if (G_VALUE_HOLDS_BOOLEAN(value)) { - g_value_set_boolean(value, priv->watcher_proxy != NULL ? TRUE : FALSE); - } else { - WARN_BAD_TYPE(PROP_CONNECTED_S, value); - } - break; - /* *********************** */ - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - - return; -} - -/* This function is used to see if we have enough information to - connect to things. If we do, and we're not connected, it - connects for us. */ -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_application_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; -} - - -/* ************************* */ -/* Public Functions */ -/* ************************* */ - -/** - custom_indicator_set_id: - @ci: The #CustomIndicator object to use - @id: ID to set for this indicator - - Wrapper function for property #CustomIndicator::id. -*/ -void -custom_indicator_set_id (CustomIndicator * ci, const gchar * id) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, id); - g_object_set_property(G_OBJECT(ci), PROP_ID_S, &value); - return; -} - -/** - custom_indicator_set_category: - @ci: The #CustomIndicator object to use - @category: The category to set for this indicator - - Wrapper function for property #CustomIndicator::category. -*/ -void -custom_indicator_set_category (CustomIndicator * ci, CustomIndicatorCategory category) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); - g_value_set_enum(&value, category); - g_object_set_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); - return; -} - -/** - custom_indicator_set_status: - @ci: The #CustomIndicator object to use - @status: The status to set for this indicator - - Wrapper function for property #CustomIndicator::status. -*/ -void -custom_indicator_set_status (CustomIndicator * ci, CustomIndicatorStatus status) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); - g_value_set_enum(&value, status); - g_object_set_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); - return; -} - -/** - custom_indicator_set_icon: - @ci: The #CustomIndicator object to use - @icon_name: The name of the icon to set for this indicator - - Wrapper function for property #CustomIndicator::icon. -*/ -void custom_indicator_set_icon (CustomIndicator * ci, const gchar * icon_name) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, icon_name); - g_object_set_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); - return; -} - -/** - custom_indicator_set_attention_icon: - @ci: The #CustomIndicator object to use - @icon_name: The name of the attention icon to set for this indicator - - Wrapper function for property #CustomIndicator::attention-icon. -*/ -void -custom_indicator_set_attention_icon (CustomIndicator * ci, const gchar * icon_name) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, icon_name); - g_object_set_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); - return; -} - -/** - custom_indicator_set_menu: - @ci: The #CustomIndicator object to use - @menu: The object with the menu for the indicator - - Wrapper function for property #CustomIndicator::menu. -*/ -void -custom_indicator_set_menu (CustomIndicator * ci, DbusmenuServer * menu) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_OBJECT); - g_value_set_object(&value, G_OBJECT(menu)); - g_object_set_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); - return; -} - -/** - custom_indicator_get_id: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::id. - - Return value: The current ID -*/ -const gchar * -custom_indicator_get_id (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_object_get_property(G_OBJECT(ci), PROP_ID_S, &value); - return g_value_get_string(&value); -} - -/** - custom_indicator_get_category: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::category. - - Return value: The current category. -*/ -CustomIndicatorCategory -custom_indicator_get_category (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); - g_object_get_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); - return g_value_get_enum(&value); -} - -/** - custom_indicator_get_status: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::status. - - Return value: The current status. -*/ -CustomIndicatorStatus -custom_indicator_get_status (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); - g_object_get_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); - return g_value_get_enum(&value); -} - -/** - custom_indicator_get_icon: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::icon-name. - - Return value: The current icon name. -*/ -const gchar * -custom_indicator_get_icon (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_object_get_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); - return g_value_get_string(&value); -} - -/** - custom_indicator_get_attention_icon: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::attention-icon-name. - - Return value: The current attention icon name. -*/ -const gchar * -custom_indicator_get_attention_icon (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_object_get_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); - return g_value_get_string(&value); -} - -/** - custom_indicator_get_menu: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::menu. - - Return value: The current menu being used. -*/ -DbusmenuServer * -custom_indicator_get_menu (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_OBJECT); - g_object_get_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); - return DBUSMENU_SERVER(g_value_get_object(&value)); -} - - diff --git a/src/libapplicationindicator/application-indicator.h b/src/libapplicationindicator/application-indicator.h deleted file mode 100644 index 2e9045c..0000000 --- a/src/libapplicationindicator/application-indicator.h +++ /dev/null @@ -1,142 +0,0 @@ -#ifndef __CUSTOM_INDICATOR_H__ -#define __CUSTOM_INDICATOR_H__ - -#include -#include -#include - -G_BEGIN_DECLS - -#define CUSTOM_INDICATOR_TYPE (custom_indicator_get_type ()) -#define CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicator)) -#define CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) -#define IS_CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_INDICATOR_TYPE)) -#define IS_CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_INDICATOR_TYPE)) -#define CUSTOM_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) - -#define CUSTOM_INDICATOR_SIGNAL_NEW_ICON "new-icon" -#define CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" -#define CUSTOM_INDICATOR_SIGNAL_NEW_STATUS "new-status" -#define CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" - -/** - CustomIndicatorCategory: - @CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. - @CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. - @CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. - @CUSTOM_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. - @CUSTOM_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. - - The category provides grouping for the indicators so that - users can find indicators that are similar together. -*/ -typedef enum { /*< prefix=CUSTOM_INDICATOR_CATEGORY >*/ - CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, - CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS, - CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES, - CUSTOM_INDICATOR_CATEGORY_HARDWARE, - CUSTOM_INDICATOR_CATEGORY_OTHER -} CustomIndicatorCategory; - -/** - CustomIndicatorStatus: - @CUSTOM_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. - @CUSTOM_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. - @CUSTOM_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. - - These are the states that the indicator can be on in - the user's panel. The indicator by default starts - in the state @CUSTOM_INDICATOR_STATUS_OFF and can be - shown by setting it to @CUSTOM_INDICATOR_STATUS_ON. -*/ -typedef enum { /*< prefix=CUSTOM_INDICATOR_STATUS >*/ - CUSTOM_INDICATOR_STATUS_PASSIVE, - CUSTOM_INDICATOR_STATUS_ACTIVE, - CUSTOM_INDICATOR_STATUS_ATTENTION -} CustomIndicatorStatus; - -typedef struct _CustomIndicator CustomIndicator; -typedef struct _CustomIndicatorClass CustomIndicatorClass; - -/** - CustomIndicatorClass: - @parent_class: Mia familia - @new_icon: Slot for #CustomIndicator::new-icon. - @new_attention_icon: Slot for #CustomIndicator::new-attention-icon. - @new_status: Slot for #CustomIndicator::new-status. - @connection_changed: Slot for #CustomIndicator::connection-changed. - @custom_indicator_reserved_1: Reserved for future use. - @custom_indicator_reserved_2: Reserved for future use. - @custom_indicator_reserved_3: Reserved for future use. - @custom_indicator_reserved_4: Reserved for future use. - - The signals and external functions that make up the #CustomIndicator - class object. -*/ -struct _CustomIndicatorClass { - /* Parent */ - GObjectClass parent_class; - - /* DBus Signals */ - void (* new_icon) (CustomIndicator * indicator, - gpointer user_data); - void (* new_attention_icon) (CustomIndicator * indicator, - gpointer user_data); - void (* new_status) (CustomIndicator * indicator, - gchar * status_string, - gpointer user_data); - - /* Local Signals */ - void (* connection_changed) (CustomIndicator * indicator, - gboolean connected, - gpointer user_data); - - /* Reserved */ - void (*custom_indicator_reserved_1)(void); - void (*custom_indicator_reserved_2)(void); - void (*custom_indicator_reserved_3)(void); - void (*custom_indicator_reserved_4)(void); -}; - -/** - CustomIndicator: - @parent: Parent object. - - A custom indicator represents the values that are needed to show a - unique status in the panel for an application. In general, applications - should try to fit in the other indicators that are available on the - panel before using this. But, sometimes it is necissary. -*/ -struct _CustomIndicator { - GObject parent; - /* None. We're a very private object. */ -}; - -/* GObject Stuff */ -GType custom_indicator_get_type (void); - -/* Set properties */ -void custom_indicator_set_id (CustomIndicator * ci, - const gchar * id); -void custom_indicator_set_category (CustomIndicator * ci, - CustomIndicatorCategory category); -void custom_indicator_set_status (CustomIndicator * ci, - CustomIndicatorStatus status); -void custom_indicator_set_icon (CustomIndicator * ci, - const gchar * icon_name); -void custom_indicator_set_attention_icon (CustomIndicator * ci, - const gchar * icon_name); -void custom_indicator_set_menu (CustomIndicator * ci, - DbusmenuServer * menu); - -/* Get properties */ -const gchar * custom_indicator_get_id (CustomIndicator * ci); -CustomIndicatorCategory custom_indicator_get_category (CustomIndicator * ci); -CustomIndicatorStatus custom_indicator_get_status (CustomIndicator * ci); -const gchar * custom_indicator_get_icon (CustomIndicator * ci); -const gchar * custom_indicator_get_attention_icon (CustomIndicator * ci); -DbusmenuServer * custom_indicator_get_menu (CustomIndicator * ci); - -G_END_DECLS - -#endif -- cgit v1.2.3 From 997bdb5be1665441cfa2e13d4cb0c9733e7776f6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 10:58:09 -0600 Subject: Shortening the file names as well. --- src/Makefile.am | 8 +- src/libappindicator/app-indicator-enum-types.c.in | 33 + src/libappindicator/app-indicator-enum-types.h.in | 33 + src/libappindicator/app-indicator.c | 847 +++++++++++++++++++++ src/libappindicator/app-indicator.h | 142 ++++ .../application-indicator-enum-types.c.in | 33 - .../application-indicator-enum-types.h.in | 33 - src/libappindicator/application-indicator.c | 847 --------------------- src/libappindicator/application-indicator.h | 142 ---- 9 files changed, 1059 insertions(+), 1059 deletions(-) create mode 100644 src/libappindicator/app-indicator-enum-types.c.in create mode 100644 src/libappindicator/app-indicator-enum-types.h.in create mode 100644 src/libappindicator/app-indicator.c create mode 100644 src/libappindicator/app-indicator.h delete mode 100644 src/libappindicator/application-indicator-enum-types.c.in delete mode 100644 src/libappindicator/application-indicator-enum-types.h.in delete mode 100644 src/libappindicator/application-indicator.c delete mode 100644 src/libappindicator/application-indicator.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 508e13d..1c19d91 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -57,8 +57,8 @@ glib_marshal_prefix = _application_service_marshal # Library ################################## -glib_enum_h = libappindicator/application-indicator-enum-types.h -glib_enum_c = libappindicator/application-indicator-enum-types.c +glib_enum_h = libappindicator/app-indicator-enum-types.h +glib_enum_c = libappindicator/app-indicator-enum-types.c glib_enum_headers = $(libappindicator_headers) lib_LTLIBRARIES = \ @@ -67,7 +67,7 @@ lib_LTLIBRARIES = \ libappindicatorincludedir=$(includedir)/libappindicator-0.1/libappindicator libappindicator_headers = \ - $(srcdir)/libappindicator/application-indicator.h + $(srcdir)/libappindicator/app-indicator.h libappindicatorinclude_HEADERS = \ $(libappindicator_headers) \ @@ -78,7 +78,7 @@ libappindicator_la_SOURCES = \ $(glib_enum_c) \ notification-watcher-client.h \ notification-item-server.h \ - libappindicator/application-indicator.c + libappindicator/app-indicator.c libappindicator_la_LDFLAGS = \ -version-info 0:0:0 \ diff --git a/src/libappindicator/app-indicator-enum-types.c.in b/src/libappindicator/app-indicator-enum-types.c.in new file mode 100644 index 0000000..19abc88 --- /dev/null +++ b/src/libappindicator/app-indicator-enum-types.c.in @@ -0,0 +1,33 @@ +/*** BEGIN file-header ***/ +#include "libappindicator/app-indicator-enum-types.h" + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +#include "@filename@" +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type (void) +{ + static GType etype = 0; + if (G_UNLIKELY(etype == 0)) { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL} + }; + + etype = g_@type@_register_static (g_intern_static_string("@EnumName@"), values); + } + + return etype; +} + +/*** END value-tail ***/ diff --git a/src/libappindicator/app-indicator-enum-types.h.in b/src/libappindicator/app-indicator-enum-types.h.in new file mode 100644 index 0000000..e037be7 --- /dev/null +++ b/src/libappindicator/app-indicator-enum-types.h.in @@ -0,0 +1,33 @@ +/*** BEGIN file-header ***/ +#ifndef __CUSTOM_INDICATOR_ENUM_TYPES_H__ +#define __CUSTOM_INDICATOR_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS + +/*** END file-header ***/ + +/*** BEGIN file-tail ***/ + +G_END_DECLS + +#endif /* __CUSTOM_INDICATOR_ENUM_TYPES_H__ */ +/*** END file-tail ***/ + +/*** BEGIN file-production ***/ +/* Enumerations from file: "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +/** + @enum_name@_get_type: + + Builds a glib type for the @EnumName@ enumeration. + + Return value: A registered type for the enum +*/ +GType @enum_name@_get_type (void) G_GNUC_CONST; +#define CUSTOM_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) + +/*** END value-header ***/ diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c new file mode 100644 index 0000000..fc2e196 --- /dev/null +++ b/src/libappindicator/app-indicator.c @@ -0,0 +1,847 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "libappindicator/app-indicator.h" +#include "libappindicator/app-indicator-enum-types.h" + +#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. + @category: Which category the indicator is. Maps to CustomIndicator::category. + @status: The status of the indicator. Maps to CustomIndicator::status. + @icon_name: The name of the icon to use. Maps to CustomIndicator::icon-name. + @attention_icon_name: The name of the attention icon to use. Maps to CustomIndicator::attention-icon-name. + @menu: The menu for this indicator. Maps to CustomIndicator::menu + @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be #NULL. + + All of the private data in an instance of a + custom indicator. +*/ +typedef struct _CustomIndicatorPrivate CustomIndicatorPrivate; +struct _CustomIndicatorPrivate { + /* Properties */ + gchar * id; + CustomIndicatorCategory category; + CustomIndicatorStatus status; + gchar * icon_name; + gchar * attention_icon_name; + DbusmenuServer * menu; + + /* Fun stuff */ + DBusGProxy * watcher_proxy; + DBusGConnection * connection; +}; + +/* Signals Stuff */ +enum { + NEW_ICON, + NEW_ATTENTION_ICON, + NEW_STATUS, + CONNECTION_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* Enum for the properties so that they can be quickly + found and looked up. */ +enum { + PROP_0, + PROP_ID, + PROP_CATEGORY, + PROP_CATEGORY_ENUM, + PROP_STATUS, + PROP_STATUS_ENUM, + PROP_ICON_NAME, + PROP_ATTENTION_ICON_NAME, + PROP_MENU, + PROP_MENU_OBJECT, + PROP_CONNECTED +}; + +/* The strings so that they can be slowly looked up. */ +#define PROP_ID_S "id" +#define PROP_CATEGORY_S "category" +#define PROP_CATEGORY_ENUM_S "category-enum" +#define PROP_STATUS_S "status" +#define PROP_STATUS_ENUM_S "status-enum" +#define PROP_ICON_NAME_S "icon-name" +#define PROP_ATTENTION_ICON_NAME_S "attention-icon-name" +#define PROP_MENU_S "menu" +#define PROP_MENU_OBJECT_S "menu-object" +#define PROP_CONNECTED_S "connected" + +/* Private macro, shhhh! */ +#define CUSTOM_INDICATOR_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_INDICATOR_TYPE, CustomIndicatorPrivate)) + +/* Boiler plate */ +static void custom_indicator_class_init (CustomIndicatorClass *klass); +static void custom_indicator_init (CustomIndicator *self); +static void custom_indicator_dispose (GObject *object); +static void custom_indicator_finalize (GObject *object); +/* Property functions */ +static void custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +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); + +static void +custom_indicator_class_init (CustomIndicatorClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (CustomIndicatorPrivate)); + + /* Clean up */ + object_class->dispose = custom_indicator_dispose; + object_class->finalize = custom_indicator_finalize; + + /* Property funcs */ + object_class->set_property = custom_indicator_set_property; + object_class->get_property = custom_indicator_get_property; + + /* Properties */ + g_object_class_install_property(object_class, PROP_ID, + g_param_spec_string(PROP_ID_S, + "The ID for this indicator", + "An ID that should be unique, but used consistently by this program and it's indicator.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_CATEGORY, + g_param_spec_string(PROP_CATEGORY_S, + "Indicator Category as a string", + "The type of indicator that this represents as a string. For DBus.", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_CATEGORY_ENUM, + g_param_spec_enum(PROP_CATEGORY_ENUM_S, + "Indicator Category", + "The type of indicator that this represents. Please don't use 'other'. Defaults to 'Application Status'.", + CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY, + CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_STATUS, + g_param_spec_string(PROP_STATUS_S, + "Indicator Status as a string", + "The status of the indicator represented as a string. For DBus.", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_STATUS_ENUM, + g_param_spec_enum(PROP_STATUS_ENUM_S, + "Indicator Status", + "Whether the indicator is shown or requests attention. Defaults to 'off'.", + CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS, + CUSTOM_INDICATOR_STATUS_PASSIVE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_ICON_NAME, + g_param_spec_string(PROP_ICON_NAME_S, + "An icon for the indicator", + "The default icon that is shown for the indicator.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_ATTENTION_ICON_NAME, + g_param_spec_string(PROP_ATTENTION_ICON_NAME_S, + "An icon to show when the indicator request attention.", + "If the indicator sets it's status to 'attention' then this icon is shown.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_MENU, + g_param_spec_string(PROP_MENU_S, + "The object path of the menu on DBus.", + "A method for getting the menu path as a string for DBus.", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_MENU_OBJECT, + g_param_spec_object(PROP_MENU_OBJECT_S, + "The Menu for the indicator", + "A DBus Menu Server object that can have a menu attached to it. The object from this menu will be sent across the bus for the client to connect to and signal.", + DBUSMENU_TYPE_SERVER, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property(object_class, PROP_CONNECTED, + g_param_spec_boolean(PROP_CONNECTED_S, + "Whether we're conneced to a watcher", + "Pretty simple, true if we have a reasonable expectation of being displayed through this object. You should hide your TrayIcon if so.", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + + /* Signals */ + + /** + CustomIndicator::new-icon: + @arg0: The #CustomIndicator object + + Signaled when there is a new icon set for the + object. + */ + signals[NEW_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ICON, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, new_icon), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + CustomIndicator::new-attention-icon: + @arg0: The #CustomIndicator object + + Signaled when there is a new attention icon set for the + object. + */ + signals[NEW_ATTENTION_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, new_attention_icon), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + CustomIndicator::new-status: + @arg0: The #CustomIndicator object + @arg1: The string value of the #CustomIndicatorStatus enum. + + Signaled when the status of the indicator changes. + */ + signals[NEW_STATUS] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_STATUS, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, new_status), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); + + /** + CustomIndicator::connection-changed: + @arg0: The #CustomIndicator object + @arg1: Whether we're connected or not + + Signaled when we connect to a watcher, or when it drops + away. + */ + signals[CONNECTION_CHANGED] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (CustomIndicatorClass, connection_changed), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE); + + /* Initialize the object as a DBus type */ + dbus_g_object_type_install_info(CUSTOM_INDICATOR_TYPE, + &dbus_glib__notification_item_server_object_info); + + return; +} + +static void +custom_indicator_init (CustomIndicator *self) +{ + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + priv->id = NULL; + priv->category = CUSTOM_INDICATOR_CATEGORY_OTHER; + priv->status = CUSTOM_INDICATOR_STATUS_PASSIVE; + priv->icon_name = NULL; + priv->attention_icon_name = NULL; + priv->menu = NULL; + + priv->watcher_proxy = NULL; + priv->connection = NULL; + + /* Put the object on DBus */ + GError * error = NULL; + 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(priv->connection, + "/need/a/path", + G_OBJECT(self)); + + return; +} + +/* Free all objects, make sure that all the dbus + signals are sent out before we shut this down. */ +static void +custom_indicator_dispose (GObject *object) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { + custom_indicator_set_status(self, CUSTOM_INDICATOR_STATUS_PASSIVE); + } + + if (priv->menu != NULL) { + g_object_unref(G_OBJECT(priv->menu)); + priv->menu = NULL; + } + + if (priv->watcher_proxy != NULL) { + dbus_g_connection_flush(priv->connection); + g_object_unref(G_OBJECT(priv->watcher_proxy)); + priv->watcher_proxy = NULL; + } + + G_OBJECT_CLASS (custom_indicator_parent_class)->dispose (object); + return; +} + +/* Free all of the memory that we could be using in + the object. */ +static void +custom_indicator_finalize (GObject *object) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { + g_warning("Finalizing Custom Status with the status set to: %d", priv->status); + } + + if (priv->id != NULL) { + g_free(priv->id); + priv->id = NULL; + } + + if (priv->icon_name != NULL) { + g_free(priv->icon_name); + priv->icon_name = NULL; + } + + if (priv->attention_icon_name != NULL) { + g_free(priv->attention_icon_name); + priv->attention_icon_name = NULL; + } + + G_OBJECT_CLASS (custom_indicator_parent_class)->finalize (object); + return; +} + +#define WARN_BAD_TYPE(prop, value) g_warning("Can not work with property '%s' with value of type '%s'.", prop, G_VALUE_TYPE_NAME(value)) + +/* Set some properties */ +static void +custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + switch (prop_id) { + /* *********************** */ + case PROP_ID: + if (G_VALUE_HOLDS_STRING(value)) { + if (priv->id != NULL) { + g_warning("Resetting ID value when I already had a value of: %s", priv->id); + g_free(priv->id); + priv->id = NULL; + } + priv->id = g_strdup(g_value_get_string(value)); + } else { + WARN_BAD_TYPE(PROP_ID_S, value); + } + check_connect(self); + break; + /* *********************** */ + case PROP_CATEGORY_ENUM: + if (G_VALUE_HOLDS_ENUM(value)) { + priv->category = g_value_get_enum(value); + } else { + WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); + } + break; + /* *********************** */ + case PROP_STATUS_ENUM: { + gboolean changed = FALSE; + if (G_VALUE_HOLDS_ENUM(value)) { + if (priv->status != g_value_get_enum(value)) { + changed = TRUE; + } + priv->status = g_value_get_enum(value); + } else { + WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); + } + if (changed) { + GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(pspec); + if (enumspec != NULL) { + GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); + g_signal_emit(object, signals[NEW_STATUS], 0, enumval->value_nick, TRUE); + } + } + break; + } + /* *********************** */ + case PROP_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + const gchar * instr = g_value_get_string(value); + gboolean changed = FALSE; + if (priv->icon_name == NULL) { + priv->icon_name = g_strdup(instr); + changed = TRUE; + } else if (!g_strcmp0(instr, priv->icon_name)) { + changed = FALSE; + } else { + g_free(priv->icon_name); + priv->icon_name = g_strdup(instr); + changed = TRUE; + } + if (changed) { + g_signal_emit(object, signals[NEW_ICON], 0, TRUE); + } + } else { + WARN_BAD_TYPE(PROP_ICON_NAME_S, value); + } + check_connect(self); + break; + /* *********************** */ + case PROP_ATTENTION_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + const gchar * instr = g_value_get_string(value); + gboolean changed = FALSE; + if (priv->attention_icon_name == NULL) { + priv->attention_icon_name = g_strdup(instr); + changed = TRUE; + } else if (!g_strcmp0(instr, priv->attention_icon_name)) { + changed = FALSE; + } else { + g_free(priv->attention_icon_name); + priv->attention_icon_name = g_strdup(instr); + changed = TRUE; + } + if (changed) { + g_signal_emit(object, signals[NEW_ATTENTION_ICON], 0, TRUE); + } + } else { + WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); + } + break; + /* *********************** */ + case PROP_MENU_OBJECT: + if (G_VALUE_HOLDS_OBJECT(value)) { + if (priv->menu != NULL) { + g_object_unref(G_OBJECT(priv->menu)); + } + priv->menu = DBUSMENU_SERVER(g_value_get_object(value)); + g_object_ref(G_OBJECT(priv->menu)); + } else { + WARN_BAD_TYPE(PROP_MENU_S, value); + } + check_connect(self); + break; + /* *********************** */ + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + return; +} + +/* Function to fill our value with the property it's requesting. */ +static void +custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +{ + CustomIndicator * self = CUSTOM_INDICATOR(object); + g_return_if_fail(self != NULL); + + CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + + switch (prop_id) { + /* *********************** */ + case PROP_ID: + if (G_VALUE_HOLDS_STRING(value)) { + g_value_set_string(value, priv->id); + } else { + WARN_BAD_TYPE(PROP_ID_S, value); + } + break; + /* *********************** */ + case PROP_CATEGORY: + if (G_VALUE_HOLDS_STRING(value)) { + GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_CATEGORY_ENUM_S); + GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); + if (enumspec != NULL) { + GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->category); + g_value_set_string(value, enumval->value_nick); + } else { + g_assert_not_reached(); + } + } else { + WARN_BAD_TYPE(PROP_CATEGORY_S, value); + } + break; + /* *********************** */ + case PROP_CATEGORY_ENUM: + if (G_VALUE_HOLDS_ENUM(value)) { + /* We want the enum value */ + g_value_set_enum(value, priv->category); + } else { + WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); + } + break; + /* *********************** */ + case PROP_STATUS: + if (G_VALUE_HOLDS_STRING(value)) { + GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_STATUS_ENUM_S); + GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); + if (enumspec != NULL) { + GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); + g_value_set_string(value, enumval->value_nick); + } else { + g_assert_not_reached(); + } + } else { + WARN_BAD_TYPE(PROP_STATUS_S, value); + } + break; + /* *********************** */ + case PROP_STATUS_ENUM: + if (G_VALUE_HOLDS_ENUM(value)) { + /* We want the enum value */ + g_value_set_enum(value, priv->status); + } else { + WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); + } + break; + /* *********************** */ + case PROP_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + g_value_set_string(value, priv->icon_name); + } else { + WARN_BAD_TYPE(PROP_ICON_NAME_S, value); + } + break; + /* *********************** */ + case PROP_ATTENTION_ICON_NAME: + if (G_VALUE_HOLDS_STRING(value)) { + g_value_set_string(value, priv->attention_icon_name); + } else { + WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); + } + break; + /* *********************** */ + case PROP_MENU: + if (G_VALUE_HOLDS_STRING(value)) { + if (priv->menu != NULL) { + g_object_get_property(G_OBJECT(priv->menu), DBUSMENU_SERVER_PROP_DBUS_OBJECT, value); + } + } else { + WARN_BAD_TYPE(PROP_MENU_S, value); + } + break; + /* *********************** */ + case PROP_MENU_OBJECT: + if (G_VALUE_HOLDS_OBJECT(value)) { + g_value_set_object(value, priv->menu); + } else { + WARN_BAD_TYPE(PROP_MENU_OBJECT_S, value); + } + break; + /* *********************** */ + case PROP_CONNECTED: + if (G_VALUE_HOLDS_BOOLEAN(value)) { + g_value_set_boolean(value, priv->watcher_proxy != NULL ? TRUE : FALSE); + } else { + WARN_BAD_TYPE(PROP_CONNECTED_S, value); + } + break; + /* *********************** */ + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + return; +} + +/* This function is used to see if we have enough information to + connect to things. If we do, and we're not connected, it + connects for us. */ +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_application_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; +} + + +/* ************************* */ +/* Public Functions */ +/* ************************* */ + +/** + custom_indicator_set_id: + @ci: The #CustomIndicator object to use + @id: ID to set for this indicator + + Wrapper function for property #CustomIndicator::id. +*/ +void +custom_indicator_set_id (CustomIndicator * ci, const gchar * id) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_value_set_string(&value, id); + g_object_set_property(G_OBJECT(ci), PROP_ID_S, &value); + return; +} + +/** + custom_indicator_set_category: + @ci: The #CustomIndicator object to use + @category: The category to set for this indicator + + Wrapper function for property #CustomIndicator::category. +*/ +void +custom_indicator_set_category (CustomIndicator * ci, CustomIndicatorCategory category) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_value_set_enum(&value, category); + g_object_set_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); + return; +} + +/** + custom_indicator_set_status: + @ci: The #CustomIndicator object to use + @status: The status to set for this indicator + + Wrapper function for property #CustomIndicator::status. +*/ +void +custom_indicator_set_status (CustomIndicator * ci, CustomIndicatorStatus status) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); + g_value_set_enum(&value, status); + g_object_set_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); + return; +} + +/** + custom_indicator_set_icon: + @ci: The #CustomIndicator object to use + @icon_name: The name of the icon to set for this indicator + + Wrapper function for property #CustomIndicator::icon. +*/ +void custom_indicator_set_icon (CustomIndicator * ci, const gchar * icon_name) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_value_set_string(&value, icon_name); + g_object_set_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); + return; +} + +/** + custom_indicator_set_attention_icon: + @ci: The #CustomIndicator object to use + @icon_name: The name of the attention icon to set for this indicator + + Wrapper function for property #CustomIndicator::attention-icon. +*/ +void +custom_indicator_set_attention_icon (CustomIndicator * ci, const gchar * icon_name) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_value_set_string(&value, icon_name); + g_object_set_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); + return; +} + +/** + custom_indicator_set_menu: + @ci: The #CustomIndicator object to use + @menu: The object with the menu for the indicator + + Wrapper function for property #CustomIndicator::menu. +*/ +void +custom_indicator_set_menu (CustomIndicator * ci, DbusmenuServer * menu) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_OBJECT); + g_value_set_object(&value, G_OBJECT(menu)); + g_object_set_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); + return; +} + +/** + custom_indicator_get_id: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::id. + + Return value: The current ID +*/ +const gchar * +custom_indicator_get_id (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(ci), PROP_ID_S, &value); + return g_value_get_string(&value); +} + +/** + custom_indicator_get_category: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::category. + + Return value: The current category. +*/ +CustomIndicatorCategory +custom_indicator_get_category (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_object_get_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); + return g_value_get_enum(&value); +} + +/** + custom_indicator_get_status: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::status. + + Return value: The current status. +*/ +CustomIndicatorStatus +custom_indicator_get_status (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); + g_object_get_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); + return g_value_get_enum(&value); +} + +/** + custom_indicator_get_icon: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::icon-name. + + Return value: The current icon name. +*/ +const gchar * +custom_indicator_get_icon (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); + return g_value_get_string(&value); +} + +/** + custom_indicator_get_attention_icon: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::attention-icon-name. + + Return value: The current attention icon name. +*/ +const gchar * +custom_indicator_get_attention_icon (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); + return g_value_get_string(&value); +} + +/** + custom_indicator_get_menu: + @ci: The #CustomIndicator object to use + + Wrapper function for property #CustomIndicator::menu. + + Return value: The current menu being used. +*/ +DbusmenuServer * +custom_indicator_get_menu (CustomIndicator * ci) +{ + GValue value = {0}; + g_value_init(&value, G_TYPE_OBJECT); + g_object_get_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); + return DBUSMENU_SERVER(g_value_get_object(&value)); +} + + diff --git a/src/libappindicator/app-indicator.h b/src/libappindicator/app-indicator.h new file mode 100644 index 0000000..2e9045c --- /dev/null +++ b/src/libappindicator/app-indicator.h @@ -0,0 +1,142 @@ +#ifndef __CUSTOM_INDICATOR_H__ +#define __CUSTOM_INDICATOR_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define CUSTOM_INDICATOR_TYPE (custom_indicator_get_type ()) +#define CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicator)) +#define CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) +#define IS_CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_INDICATOR_TYPE)) +#define IS_CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_INDICATOR_TYPE)) +#define CUSTOM_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) + +#define CUSTOM_INDICATOR_SIGNAL_NEW_ICON "new-icon" +#define CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" +#define CUSTOM_INDICATOR_SIGNAL_NEW_STATUS "new-status" +#define CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" + +/** + CustomIndicatorCategory: + @CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. + @CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. + @CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. + @CUSTOM_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. + @CUSTOM_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. + + The category provides grouping for the indicators so that + users can find indicators that are similar together. +*/ +typedef enum { /*< prefix=CUSTOM_INDICATOR_CATEGORY >*/ + CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, + CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS, + CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES, + CUSTOM_INDICATOR_CATEGORY_HARDWARE, + CUSTOM_INDICATOR_CATEGORY_OTHER +} CustomIndicatorCategory; + +/** + CustomIndicatorStatus: + @CUSTOM_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. + @CUSTOM_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. + @CUSTOM_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. + + These are the states that the indicator can be on in + the user's panel. The indicator by default starts + in the state @CUSTOM_INDICATOR_STATUS_OFF and can be + shown by setting it to @CUSTOM_INDICATOR_STATUS_ON. +*/ +typedef enum { /*< prefix=CUSTOM_INDICATOR_STATUS >*/ + CUSTOM_INDICATOR_STATUS_PASSIVE, + CUSTOM_INDICATOR_STATUS_ACTIVE, + CUSTOM_INDICATOR_STATUS_ATTENTION +} CustomIndicatorStatus; + +typedef struct _CustomIndicator CustomIndicator; +typedef struct _CustomIndicatorClass CustomIndicatorClass; + +/** + CustomIndicatorClass: + @parent_class: Mia familia + @new_icon: Slot for #CustomIndicator::new-icon. + @new_attention_icon: Slot for #CustomIndicator::new-attention-icon. + @new_status: Slot for #CustomIndicator::new-status. + @connection_changed: Slot for #CustomIndicator::connection-changed. + @custom_indicator_reserved_1: Reserved for future use. + @custom_indicator_reserved_2: Reserved for future use. + @custom_indicator_reserved_3: Reserved for future use. + @custom_indicator_reserved_4: Reserved for future use. + + The signals and external functions that make up the #CustomIndicator + class object. +*/ +struct _CustomIndicatorClass { + /* Parent */ + GObjectClass parent_class; + + /* DBus Signals */ + void (* new_icon) (CustomIndicator * indicator, + gpointer user_data); + void (* new_attention_icon) (CustomIndicator * indicator, + gpointer user_data); + void (* new_status) (CustomIndicator * indicator, + gchar * status_string, + gpointer user_data); + + /* Local Signals */ + void (* connection_changed) (CustomIndicator * indicator, + gboolean connected, + gpointer user_data); + + /* Reserved */ + void (*custom_indicator_reserved_1)(void); + void (*custom_indicator_reserved_2)(void); + void (*custom_indicator_reserved_3)(void); + void (*custom_indicator_reserved_4)(void); +}; + +/** + CustomIndicator: + @parent: Parent object. + + A custom indicator represents the values that are needed to show a + unique status in the panel for an application. In general, applications + should try to fit in the other indicators that are available on the + panel before using this. But, sometimes it is necissary. +*/ +struct _CustomIndicator { + GObject parent; + /* None. We're a very private object. */ +}; + +/* GObject Stuff */ +GType custom_indicator_get_type (void); + +/* Set properties */ +void custom_indicator_set_id (CustomIndicator * ci, + const gchar * id); +void custom_indicator_set_category (CustomIndicator * ci, + CustomIndicatorCategory category); +void custom_indicator_set_status (CustomIndicator * ci, + CustomIndicatorStatus status); +void custom_indicator_set_icon (CustomIndicator * ci, + const gchar * icon_name); +void custom_indicator_set_attention_icon (CustomIndicator * ci, + const gchar * icon_name); +void custom_indicator_set_menu (CustomIndicator * ci, + DbusmenuServer * menu); + +/* Get properties */ +const gchar * custom_indicator_get_id (CustomIndicator * ci); +CustomIndicatorCategory custom_indicator_get_category (CustomIndicator * ci); +CustomIndicatorStatus custom_indicator_get_status (CustomIndicator * ci); +const gchar * custom_indicator_get_icon (CustomIndicator * ci); +const gchar * custom_indicator_get_attention_icon (CustomIndicator * ci); +DbusmenuServer * custom_indicator_get_menu (CustomIndicator * ci); + +G_END_DECLS + +#endif diff --git a/src/libappindicator/application-indicator-enum-types.c.in b/src/libappindicator/application-indicator-enum-types.c.in deleted file mode 100644 index dedf54c..0000000 --- a/src/libappindicator/application-indicator-enum-types.c.in +++ /dev/null @@ -1,33 +0,0 @@ -/*** BEGIN file-header ***/ -#include "libappindicator/application-indicator-enum-types.h" - -/*** END file-header ***/ - -/*** BEGIN file-production ***/ -#include "@filename@" -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -GType -@enum_name@_get_type (void) -{ - static GType etype = 0; - if (G_UNLIKELY(etype == 0)) { - static const G@Type@Value values[] = { -/*** END value-header ***/ - -/*** BEGIN value-production ***/ - { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, -/*** END value-production ***/ - -/*** BEGIN value-tail ***/ - { 0, NULL, NULL} - }; - - etype = g_@type@_register_static (g_intern_static_string("@EnumName@"), values); - } - - return etype; -} - -/*** END value-tail ***/ diff --git a/src/libappindicator/application-indicator-enum-types.h.in b/src/libappindicator/application-indicator-enum-types.h.in deleted file mode 100644 index e037be7..0000000 --- a/src/libappindicator/application-indicator-enum-types.h.in +++ /dev/null @@ -1,33 +0,0 @@ -/*** BEGIN file-header ***/ -#ifndef __CUSTOM_INDICATOR_ENUM_TYPES_H__ -#define __CUSTOM_INDICATOR_ENUM_TYPES_H__ - -#include - -G_BEGIN_DECLS - -/*** END file-header ***/ - -/*** BEGIN file-tail ***/ - -G_END_DECLS - -#endif /* __CUSTOM_INDICATOR_ENUM_TYPES_H__ */ -/*** END file-tail ***/ - -/*** BEGIN file-production ***/ -/* Enumerations from file: "@filename@" */ -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -/** - @enum_name@_get_type: - - Builds a glib type for the @EnumName@ enumeration. - - Return value: A registered type for the enum -*/ -GType @enum_name@_get_type (void) G_GNUC_CONST; -#define CUSTOM_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) - -/*** END value-header ***/ diff --git a/src/libappindicator/application-indicator.c b/src/libappindicator/application-indicator.c deleted file mode 100644 index 74efd1e..0000000 --- a/src/libappindicator/application-indicator.c +++ /dev/null @@ -1,847 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#include "libappindicator/application-indicator.h" -#include "libappindicator/application-indicator-enum-types.h" - -#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. - @category: Which category the indicator is. Maps to CustomIndicator::category. - @status: The status of the indicator. Maps to CustomIndicator::status. - @icon_name: The name of the icon to use. Maps to CustomIndicator::icon-name. - @attention_icon_name: The name of the attention icon to use. Maps to CustomIndicator::attention-icon-name. - @menu: The menu for this indicator. Maps to CustomIndicator::menu - @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be #NULL. - - All of the private data in an instance of a - custom indicator. -*/ -typedef struct _CustomIndicatorPrivate CustomIndicatorPrivate; -struct _CustomIndicatorPrivate { - /* Properties */ - gchar * id; - CustomIndicatorCategory category; - CustomIndicatorStatus status; - gchar * icon_name; - gchar * attention_icon_name; - DbusmenuServer * menu; - - /* Fun stuff */ - DBusGProxy * watcher_proxy; - DBusGConnection * connection; -}; - -/* Signals Stuff */ -enum { - NEW_ICON, - NEW_ATTENTION_ICON, - NEW_STATUS, - CONNECTION_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -/* Enum for the properties so that they can be quickly - found and looked up. */ -enum { - PROP_0, - PROP_ID, - PROP_CATEGORY, - PROP_CATEGORY_ENUM, - PROP_STATUS, - PROP_STATUS_ENUM, - PROP_ICON_NAME, - PROP_ATTENTION_ICON_NAME, - PROP_MENU, - PROP_MENU_OBJECT, - PROP_CONNECTED -}; - -/* The strings so that they can be slowly looked up. */ -#define PROP_ID_S "id" -#define PROP_CATEGORY_S "category" -#define PROP_CATEGORY_ENUM_S "category-enum" -#define PROP_STATUS_S "status" -#define PROP_STATUS_ENUM_S "status-enum" -#define PROP_ICON_NAME_S "icon-name" -#define PROP_ATTENTION_ICON_NAME_S "attention-icon-name" -#define PROP_MENU_S "menu" -#define PROP_MENU_OBJECT_S "menu-object" -#define PROP_CONNECTED_S "connected" - -/* Private macro, shhhh! */ -#define CUSTOM_INDICATOR_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_INDICATOR_TYPE, CustomIndicatorPrivate)) - -/* Boiler plate */ -static void custom_indicator_class_init (CustomIndicatorClass *klass); -static void custom_indicator_init (CustomIndicator *self); -static void custom_indicator_dispose (GObject *object); -static void custom_indicator_finalize (GObject *object); -/* Property functions */ -static void custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -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); - -static void -custom_indicator_class_init (CustomIndicatorClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (CustomIndicatorPrivate)); - - /* Clean up */ - object_class->dispose = custom_indicator_dispose; - object_class->finalize = custom_indicator_finalize; - - /* Property funcs */ - object_class->set_property = custom_indicator_set_property; - object_class->get_property = custom_indicator_get_property; - - /* Properties */ - g_object_class_install_property(object_class, PROP_ID, - g_param_spec_string(PROP_ID_S, - "The ID for this indicator", - "An ID that should be unique, but used consistently by this program and it's indicator.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_CATEGORY, - g_param_spec_string(PROP_CATEGORY_S, - "Indicator Category as a string", - "The type of indicator that this represents as a string. For DBus.", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_CATEGORY_ENUM, - g_param_spec_enum(PROP_CATEGORY_ENUM_S, - "Indicator Category", - "The type of indicator that this represents. Please don't use 'other'. Defaults to 'Application Status'.", - CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY, - CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_STATUS, - g_param_spec_string(PROP_STATUS_S, - "Indicator Status as a string", - "The status of the indicator represented as a string. For DBus.", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_STATUS_ENUM, - g_param_spec_enum(PROP_STATUS_ENUM_S, - "Indicator Status", - "Whether the indicator is shown or requests attention. Defaults to 'off'.", - CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS, - CUSTOM_INDICATOR_STATUS_PASSIVE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_ICON_NAME, - g_param_spec_string(PROP_ICON_NAME_S, - "An icon for the indicator", - "The default icon that is shown for the indicator.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_ATTENTION_ICON_NAME, - g_param_spec_string(PROP_ATTENTION_ICON_NAME_S, - "An icon to show when the indicator request attention.", - "If the indicator sets it's status to 'attention' then this icon is shown.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_MENU, - g_param_spec_string(PROP_MENU_S, - "The object path of the menu on DBus.", - "A method for getting the menu path as a string for DBus.", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_MENU_OBJECT, - g_param_spec_object(PROP_MENU_OBJECT_S, - "The Menu for the indicator", - "A DBus Menu Server object that can have a menu attached to it. The object from this menu will be sent across the bus for the client to connect to and signal.", - DBUSMENU_TYPE_SERVER, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property(object_class, PROP_CONNECTED, - g_param_spec_boolean(PROP_CONNECTED_S, - "Whether we're conneced to a watcher", - "Pretty simple, true if we have a reasonable expectation of being displayed through this object. You should hide your TrayIcon if so.", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - - /* Signals */ - - /** - CustomIndicator::new-icon: - @arg0: The #CustomIndicator object - - Signaled when there is a new icon set for the - object. - */ - signals[NEW_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ICON, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_icon), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); - - /** - CustomIndicator::new-attention-icon: - @arg0: The #CustomIndicator object - - Signaled when there is a new attention icon set for the - object. - */ - signals[NEW_ATTENTION_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_attention_icon), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); - - /** - CustomIndicator::new-status: - @arg0: The #CustomIndicator object - @arg1: The string value of the #CustomIndicatorStatus enum. - - Signaled when the status of the indicator changes. - */ - signals[NEW_STATUS] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_STATUS, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_status), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); - - /** - CustomIndicator::connection-changed: - @arg0: The #CustomIndicator object - @arg1: Whether we're connected or not - - Signaled when we connect to a watcher, or when it drops - away. - */ - signals[CONNECTION_CHANGED] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, connection_changed), - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE); - - /* Initialize the object as a DBus type */ - dbus_g_object_type_install_info(CUSTOM_INDICATOR_TYPE, - &dbus_glib__notification_item_server_object_info); - - return; -} - -static void -custom_indicator_init (CustomIndicator *self) -{ - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - priv->id = NULL; - priv->category = CUSTOM_INDICATOR_CATEGORY_OTHER; - priv->status = CUSTOM_INDICATOR_STATUS_PASSIVE; - priv->icon_name = NULL; - priv->attention_icon_name = NULL; - priv->menu = NULL; - - priv->watcher_proxy = NULL; - priv->connection = NULL; - - /* Put the object on DBus */ - GError * error = NULL; - 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(priv->connection, - "/need/a/path", - G_OBJECT(self)); - - return; -} - -/* Free all objects, make sure that all the dbus - signals are sent out before we shut this down. */ -static void -custom_indicator_dispose (GObject *object) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { - custom_indicator_set_status(self, CUSTOM_INDICATOR_STATUS_PASSIVE); - } - - if (priv->menu != NULL) { - g_object_unref(G_OBJECT(priv->menu)); - priv->menu = NULL; - } - - if (priv->watcher_proxy != NULL) { - dbus_g_connection_flush(priv->connection); - g_object_unref(G_OBJECT(priv->watcher_proxy)); - priv->watcher_proxy = NULL; - } - - G_OBJECT_CLASS (custom_indicator_parent_class)->dispose (object); - return; -} - -/* Free all of the memory that we could be using in - the object. */ -static void -custom_indicator_finalize (GObject *object) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { - g_warning("Finalizing Custom Status with the status set to: %d", priv->status); - } - - if (priv->id != NULL) { - g_free(priv->id); - priv->id = NULL; - } - - if (priv->icon_name != NULL) { - g_free(priv->icon_name); - priv->icon_name = NULL; - } - - if (priv->attention_icon_name != NULL) { - g_free(priv->attention_icon_name); - priv->attention_icon_name = NULL; - } - - G_OBJECT_CLASS (custom_indicator_parent_class)->finalize (object); - return; -} - -#define WARN_BAD_TYPE(prop, value) g_warning("Can not work with property '%s' with value of type '%s'.", prop, G_VALUE_TYPE_NAME(value)) - -/* Set some properties */ -static void -custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - switch (prop_id) { - /* *********************** */ - case PROP_ID: - if (G_VALUE_HOLDS_STRING(value)) { - if (priv->id != NULL) { - g_warning("Resetting ID value when I already had a value of: %s", priv->id); - g_free(priv->id); - priv->id = NULL; - } - priv->id = g_strdup(g_value_get_string(value)); - } else { - WARN_BAD_TYPE(PROP_ID_S, value); - } - check_connect(self); - break; - /* *********************** */ - case PROP_CATEGORY_ENUM: - if (G_VALUE_HOLDS_ENUM(value)) { - priv->category = g_value_get_enum(value); - } else { - WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); - } - break; - /* *********************** */ - case PROP_STATUS_ENUM: { - gboolean changed = FALSE; - if (G_VALUE_HOLDS_ENUM(value)) { - if (priv->status != g_value_get_enum(value)) { - changed = TRUE; - } - priv->status = g_value_get_enum(value); - } else { - WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); - } - if (changed) { - GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(pspec); - if (enumspec != NULL) { - GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); - g_signal_emit(object, signals[NEW_STATUS], 0, enumval->value_nick, TRUE); - } - } - break; - } - /* *********************** */ - case PROP_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - const gchar * instr = g_value_get_string(value); - gboolean changed = FALSE; - if (priv->icon_name == NULL) { - priv->icon_name = g_strdup(instr); - changed = TRUE; - } else if (!g_strcmp0(instr, priv->icon_name)) { - changed = FALSE; - } else { - g_free(priv->icon_name); - priv->icon_name = g_strdup(instr); - changed = TRUE; - } - if (changed) { - g_signal_emit(object, signals[NEW_ICON], 0, TRUE); - } - } else { - WARN_BAD_TYPE(PROP_ICON_NAME_S, value); - } - check_connect(self); - break; - /* *********************** */ - case PROP_ATTENTION_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - const gchar * instr = g_value_get_string(value); - gboolean changed = FALSE; - if (priv->attention_icon_name == NULL) { - priv->attention_icon_name = g_strdup(instr); - changed = TRUE; - } else if (!g_strcmp0(instr, priv->attention_icon_name)) { - changed = FALSE; - } else { - g_free(priv->attention_icon_name); - priv->attention_icon_name = g_strdup(instr); - changed = TRUE; - } - if (changed) { - g_signal_emit(object, signals[NEW_ATTENTION_ICON], 0, TRUE); - } - } else { - WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); - } - break; - /* *********************** */ - case PROP_MENU_OBJECT: - if (G_VALUE_HOLDS_OBJECT(value)) { - if (priv->menu != NULL) { - g_object_unref(G_OBJECT(priv->menu)); - } - priv->menu = DBUSMENU_SERVER(g_value_get_object(value)); - g_object_ref(G_OBJECT(priv->menu)); - } else { - WARN_BAD_TYPE(PROP_MENU_S, value); - } - check_connect(self); - break; - /* *********************** */ - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - - return; -} - -/* Function to fill our value with the property it's requesting. */ -static void -custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) -{ - CustomIndicator * self = CUSTOM_INDICATOR(object); - g_return_if_fail(self != NULL); - - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); - - switch (prop_id) { - /* *********************** */ - case PROP_ID: - if (G_VALUE_HOLDS_STRING(value)) { - g_value_set_string(value, priv->id); - } else { - WARN_BAD_TYPE(PROP_ID_S, value); - } - break; - /* *********************** */ - case PROP_CATEGORY: - if (G_VALUE_HOLDS_STRING(value)) { - GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_CATEGORY_ENUM_S); - GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); - if (enumspec != NULL) { - GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->category); - g_value_set_string(value, enumval->value_nick); - } else { - g_assert_not_reached(); - } - } else { - WARN_BAD_TYPE(PROP_CATEGORY_S, value); - } - break; - /* *********************** */ - case PROP_CATEGORY_ENUM: - if (G_VALUE_HOLDS_ENUM(value)) { - /* We want the enum value */ - g_value_set_enum(value, priv->category); - } else { - WARN_BAD_TYPE(PROP_CATEGORY_ENUM_S, value); - } - break; - /* *********************** */ - case PROP_STATUS: - if (G_VALUE_HOLDS_STRING(value)) { - GParamSpec * spec_for_enum = g_object_class_find_property(G_OBJECT_GET_CLASS(object), PROP_STATUS_ENUM_S); - GParamSpecEnum * enumspec = G_PARAM_SPEC_ENUM(spec_for_enum); - if (enumspec != NULL) { - GEnumValue * enumval = g_enum_get_value(enumspec->enum_class, priv->status); - g_value_set_string(value, enumval->value_nick); - } else { - g_assert_not_reached(); - } - } else { - WARN_BAD_TYPE(PROP_STATUS_S, value); - } - break; - /* *********************** */ - case PROP_STATUS_ENUM: - if (G_VALUE_HOLDS_ENUM(value)) { - /* We want the enum value */ - g_value_set_enum(value, priv->status); - } else { - WARN_BAD_TYPE(PROP_STATUS_ENUM_S, value); - } - break; - /* *********************** */ - case PROP_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - g_value_set_string(value, priv->icon_name); - } else { - WARN_BAD_TYPE(PROP_ICON_NAME_S, value); - } - break; - /* *********************** */ - case PROP_ATTENTION_ICON_NAME: - if (G_VALUE_HOLDS_STRING(value)) { - g_value_set_string(value, priv->attention_icon_name); - } else { - WARN_BAD_TYPE(PROP_ATTENTION_ICON_NAME_S, value); - } - break; - /* *********************** */ - case PROP_MENU: - if (G_VALUE_HOLDS_STRING(value)) { - if (priv->menu != NULL) { - g_object_get_property(G_OBJECT(priv->menu), DBUSMENU_SERVER_PROP_DBUS_OBJECT, value); - } - } else { - WARN_BAD_TYPE(PROP_MENU_S, value); - } - break; - /* *********************** */ - case PROP_MENU_OBJECT: - if (G_VALUE_HOLDS_OBJECT(value)) { - g_value_set_object(value, priv->menu); - } else { - WARN_BAD_TYPE(PROP_MENU_OBJECT_S, value); - } - break; - /* *********************** */ - case PROP_CONNECTED: - if (G_VALUE_HOLDS_BOOLEAN(value)) { - g_value_set_boolean(value, priv->watcher_proxy != NULL ? TRUE : FALSE); - } else { - WARN_BAD_TYPE(PROP_CONNECTED_S, value); - } - break; - /* *********************** */ - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - - return; -} - -/* This function is used to see if we have enough information to - connect to things. If we do, and we're not connected, it - connects for us. */ -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_application_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; -} - - -/* ************************* */ -/* Public Functions */ -/* ************************* */ - -/** - custom_indicator_set_id: - @ci: The #CustomIndicator object to use - @id: ID to set for this indicator - - Wrapper function for property #CustomIndicator::id. -*/ -void -custom_indicator_set_id (CustomIndicator * ci, const gchar * id) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, id); - g_object_set_property(G_OBJECT(ci), PROP_ID_S, &value); - return; -} - -/** - custom_indicator_set_category: - @ci: The #CustomIndicator object to use - @category: The category to set for this indicator - - Wrapper function for property #CustomIndicator::category. -*/ -void -custom_indicator_set_category (CustomIndicator * ci, CustomIndicatorCategory category) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); - g_value_set_enum(&value, category); - g_object_set_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); - return; -} - -/** - custom_indicator_set_status: - @ci: The #CustomIndicator object to use - @status: The status to set for this indicator - - Wrapper function for property #CustomIndicator::status. -*/ -void -custom_indicator_set_status (CustomIndicator * ci, CustomIndicatorStatus status) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); - g_value_set_enum(&value, status); - g_object_set_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); - return; -} - -/** - custom_indicator_set_icon: - @ci: The #CustomIndicator object to use - @icon_name: The name of the icon to set for this indicator - - Wrapper function for property #CustomIndicator::icon. -*/ -void custom_indicator_set_icon (CustomIndicator * ci, const gchar * icon_name) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, icon_name); - g_object_set_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); - return; -} - -/** - custom_indicator_set_attention_icon: - @ci: The #CustomIndicator object to use - @icon_name: The name of the attention icon to set for this indicator - - Wrapper function for property #CustomIndicator::attention-icon. -*/ -void -custom_indicator_set_attention_icon (CustomIndicator * ci, const gchar * icon_name) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, icon_name); - g_object_set_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); - return; -} - -/** - custom_indicator_set_menu: - @ci: The #CustomIndicator object to use - @menu: The object with the menu for the indicator - - Wrapper function for property #CustomIndicator::menu. -*/ -void -custom_indicator_set_menu (CustomIndicator * ci, DbusmenuServer * menu) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_OBJECT); - g_value_set_object(&value, G_OBJECT(menu)); - g_object_set_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); - return; -} - -/** - custom_indicator_get_id: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::id. - - Return value: The current ID -*/ -const gchar * -custom_indicator_get_id (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_object_get_property(G_OBJECT(ci), PROP_ID_S, &value); - return g_value_get_string(&value); -} - -/** - custom_indicator_get_category: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::category. - - Return value: The current category. -*/ -CustomIndicatorCategory -custom_indicator_get_category (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); - g_object_get_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); - return g_value_get_enum(&value); -} - -/** - custom_indicator_get_status: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::status. - - Return value: The current status. -*/ -CustomIndicatorStatus -custom_indicator_get_status (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); - g_object_get_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); - return g_value_get_enum(&value); -} - -/** - custom_indicator_get_icon: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::icon-name. - - Return value: The current icon name. -*/ -const gchar * -custom_indicator_get_icon (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_object_get_property(G_OBJECT(ci), PROP_ICON_NAME_S, &value); - return g_value_get_string(&value); -} - -/** - custom_indicator_get_attention_icon: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::attention-icon-name. - - Return value: The current attention icon name. -*/ -const gchar * -custom_indicator_get_attention_icon (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - g_object_get_property(G_OBJECT(ci), PROP_ATTENTION_ICON_NAME_S, &value); - return g_value_get_string(&value); -} - -/** - custom_indicator_get_menu: - @ci: The #CustomIndicator object to use - - Wrapper function for property #CustomIndicator::menu. - - Return value: The current menu being used. -*/ -DbusmenuServer * -custom_indicator_get_menu (CustomIndicator * ci) -{ - GValue value = {0}; - g_value_init(&value, G_TYPE_OBJECT); - g_object_get_property(G_OBJECT(ci), PROP_MENU_OBJECT_S, &value); - return DBUSMENU_SERVER(g_value_get_object(&value)); -} - - diff --git a/src/libappindicator/application-indicator.h b/src/libappindicator/application-indicator.h deleted file mode 100644 index 2e9045c..0000000 --- a/src/libappindicator/application-indicator.h +++ /dev/null @@ -1,142 +0,0 @@ -#ifndef __CUSTOM_INDICATOR_H__ -#define __CUSTOM_INDICATOR_H__ - -#include -#include -#include - -G_BEGIN_DECLS - -#define CUSTOM_INDICATOR_TYPE (custom_indicator_get_type ()) -#define CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicator)) -#define CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) -#define IS_CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_INDICATOR_TYPE)) -#define IS_CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_INDICATOR_TYPE)) -#define CUSTOM_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) - -#define CUSTOM_INDICATOR_SIGNAL_NEW_ICON "new-icon" -#define CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" -#define CUSTOM_INDICATOR_SIGNAL_NEW_STATUS "new-status" -#define CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" - -/** - CustomIndicatorCategory: - @CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. - @CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. - @CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. - @CUSTOM_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. - @CUSTOM_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. - - The category provides grouping for the indicators so that - users can find indicators that are similar together. -*/ -typedef enum { /*< prefix=CUSTOM_INDICATOR_CATEGORY >*/ - CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, - CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS, - CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES, - CUSTOM_INDICATOR_CATEGORY_HARDWARE, - CUSTOM_INDICATOR_CATEGORY_OTHER -} CustomIndicatorCategory; - -/** - CustomIndicatorStatus: - @CUSTOM_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. - @CUSTOM_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. - @CUSTOM_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. - - These are the states that the indicator can be on in - the user's panel. The indicator by default starts - in the state @CUSTOM_INDICATOR_STATUS_OFF and can be - shown by setting it to @CUSTOM_INDICATOR_STATUS_ON. -*/ -typedef enum { /*< prefix=CUSTOM_INDICATOR_STATUS >*/ - CUSTOM_INDICATOR_STATUS_PASSIVE, - CUSTOM_INDICATOR_STATUS_ACTIVE, - CUSTOM_INDICATOR_STATUS_ATTENTION -} CustomIndicatorStatus; - -typedef struct _CustomIndicator CustomIndicator; -typedef struct _CustomIndicatorClass CustomIndicatorClass; - -/** - CustomIndicatorClass: - @parent_class: Mia familia - @new_icon: Slot for #CustomIndicator::new-icon. - @new_attention_icon: Slot for #CustomIndicator::new-attention-icon. - @new_status: Slot for #CustomIndicator::new-status. - @connection_changed: Slot for #CustomIndicator::connection-changed. - @custom_indicator_reserved_1: Reserved for future use. - @custom_indicator_reserved_2: Reserved for future use. - @custom_indicator_reserved_3: Reserved for future use. - @custom_indicator_reserved_4: Reserved for future use. - - The signals and external functions that make up the #CustomIndicator - class object. -*/ -struct _CustomIndicatorClass { - /* Parent */ - GObjectClass parent_class; - - /* DBus Signals */ - void (* new_icon) (CustomIndicator * indicator, - gpointer user_data); - void (* new_attention_icon) (CustomIndicator * indicator, - gpointer user_data); - void (* new_status) (CustomIndicator * indicator, - gchar * status_string, - gpointer user_data); - - /* Local Signals */ - void (* connection_changed) (CustomIndicator * indicator, - gboolean connected, - gpointer user_data); - - /* Reserved */ - void (*custom_indicator_reserved_1)(void); - void (*custom_indicator_reserved_2)(void); - void (*custom_indicator_reserved_3)(void); - void (*custom_indicator_reserved_4)(void); -}; - -/** - CustomIndicator: - @parent: Parent object. - - A custom indicator represents the values that are needed to show a - unique status in the panel for an application. In general, applications - should try to fit in the other indicators that are available on the - panel before using this. But, sometimes it is necissary. -*/ -struct _CustomIndicator { - GObject parent; - /* None. We're a very private object. */ -}; - -/* GObject Stuff */ -GType custom_indicator_get_type (void); - -/* Set properties */ -void custom_indicator_set_id (CustomIndicator * ci, - const gchar * id); -void custom_indicator_set_category (CustomIndicator * ci, - CustomIndicatorCategory category); -void custom_indicator_set_status (CustomIndicator * ci, - CustomIndicatorStatus status); -void custom_indicator_set_icon (CustomIndicator * ci, - const gchar * icon_name); -void custom_indicator_set_attention_icon (CustomIndicator * ci, - const gchar * icon_name); -void custom_indicator_set_menu (CustomIndicator * ci, - DbusmenuServer * menu); - -/* Get properties */ -const gchar * custom_indicator_get_id (CustomIndicator * ci); -CustomIndicatorCategory custom_indicator_get_category (CustomIndicator * ci); -CustomIndicatorStatus custom_indicator_get_status (CustomIndicator * ci); -const gchar * custom_indicator_get_icon (CustomIndicator * ci); -const gchar * custom_indicator_get_attention_icon (CustomIndicator * ci); -DbusmenuServer * custom_indicator_get_menu (CustomIndicator * ci); - -G_END_DECLS - -#endif -- cgit v1.2.3 From 672b7258707f3508ca4abe5fd1adee3847af5f94 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 12:34:53 -0600 Subject: Massive custom to application find and replace throughout the code. --- src/application-service-appstore.c | 72 +++--- src/application-service-appstore.h | 34 +-- src/application-service-watcher.c | 86 +++---- src/application-service-watcher.h | 36 +-- src/application-service.c | 10 +- src/dbus-shared.h | 6 +- src/indicator-application.c | 108 ++++----- src/libappindicator/app-indicator-enum-types.h.in | 8 +- src/libappindicator/app-indicator.c | 262 +++++++++++----------- src/libappindicator/app-indicator.h | 160 ++++++------- 10 files changed, 391 insertions(+), 391 deletions(-) (limited to 'src') diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c index 4e3beda..db07e7d 100644 --- a/src/application-service-appstore.c +++ b/src/application-service-appstore.c @@ -9,7 +9,7 @@ #include "dbus-shared.h" /* DBus Prototypes */ -static gboolean _application_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps); +static gboolean _application_service_server_get_applications (ApplicationServiceAppstore * appstore, GArray ** apps); #include "application-service-server.h" @@ -21,8 +21,8 @@ static gboolean _application_service_server_get_applications (CustomServiceAppst #define NOTIFICATION_ITEM_PROP_MENU "Menu" /* Private Stuff */ -typedef struct _CustomServiceAppstorePrivate CustomServiceAppstorePrivate; -struct _CustomServiceAppstorePrivate { +typedef struct _ApplicationServiceAppstorePrivate ApplicationServiceAppstorePrivate; +struct _ApplicationServiceAppstorePrivate { DBusGConnection * bus; GList * applications; }; @@ -31,13 +31,13 @@ typedef struct _Application Application; struct _Application { gchar * dbus_name; gchar * dbus_object; - CustomServiceAppstore * appstore; /* not ref'd */ + ApplicationServiceAppstore * appstore; /* not ref'd */ DBusGProxy * dbus_proxy; DBusGProxy * prop_proxy; }; -#define CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_SERVICE_APPSTORE_TYPE, CustomServiceAppstorePrivate)) +#define APPLICATION_SERVICE_APPSTORE_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), APPLICATION_SERVICE_APPSTORE_TYPE, ApplicationServiceAppstorePrivate)) /* Signals Stuff */ enum { @@ -49,49 +49,49 @@ enum { 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); -static void custom_service_appstore_finalize (GObject *object); +static void application_service_appstore_class_init (ApplicationServiceAppstoreClass *klass); +static void application_service_appstore_init (ApplicationServiceAppstore *self); +static void application_service_appstore_dispose (GObject *object); +static void application_service_appstore_finalize (GObject *object); -G_DEFINE_TYPE (CustomServiceAppstore, custom_service_appstore, G_TYPE_OBJECT); +G_DEFINE_TYPE (ApplicationServiceAppstore, application_service_appstore, G_TYPE_OBJECT); static void -custom_service_appstore_class_init (CustomServiceAppstoreClass *klass) +application_service_appstore_class_init (ApplicationServiceAppstoreClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (CustomServiceAppstorePrivate)); + g_type_class_add_private (klass, sizeof (ApplicationServiceAppstorePrivate)); - object_class->dispose = custom_service_appstore_dispose; - object_class->finalize = custom_service_appstore_finalize; + object_class->dispose = application_service_appstore_dispose; + object_class->finalize = application_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), + G_STRUCT_OFFSET (ApplicationServiceAppstore, application_added), NULL, NULL, _application_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), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomServiceAppstore, application_removed), + G_STRUCT_OFFSET (ApplicationServiceAppstore, 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_g_object_type_install_info(APPLICATION_SERVICE_APPSTORE_TYPE, &dbus_glib__application_service_server_object_info); return; } static void -custom_service_appstore_init (CustomServiceAppstore *self) +application_service_appstore_init (ApplicationServiceAppstore *self) { - CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(self); + ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE(self); priv->applications = NULL; @@ -104,32 +104,32 @@ custom_service_appstore_init (CustomServiceAppstore *self) } dbus_g_connection_register_g_object(priv->bus, - INDICATOR_CUSTOM_DBUS_OBJ, + INDICATOR_APPLICATION_DBUS_OBJ, G_OBJECT(self)); return; } static void -custom_service_appstore_dispose (GObject *object) +application_service_appstore_dispose (GObject *object) { - CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(object); + ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE(object); while (priv->applications != NULL) { - custom_service_appstore_application_remove(CUSTOM_SERVICE_APPSTORE(object), + application_service_appstore_application_remove(APPLICATION_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); + G_OBJECT_CLASS (application_service_appstore_parent_class)->dispose (object); return; } static void -custom_service_appstore_finalize (GObject *object) +application_service_appstore_finalize (GObject *object) { - G_OBJECT_CLASS (custom_service_appstore_parent_class)->finalize (object); + G_OBJECT_CLASS (application_service_appstore_parent_class)->finalize (object); return; } @@ -150,7 +150,7 @@ get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * err return; } - CustomServiceAppstorePrivate * priv = CUSTOM_SERVICE_APPSTORE_GET_PRIVATE(app->appstore); + ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE(app->appstore); priv->applications = g_list_prepend(priv->applications, app); /* TODO: We need to have the position determined better. This @@ -192,8 +192,8 @@ 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); + ApplicationServiceAppstore * appstore = app->appstore; + ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE(appstore); GList * applistitem = g_list_find(priv->applications, app); if (applistitem == NULL) { @@ -217,15 +217,15 @@ application_removed_cb (DBusGProxy * proxy, gpointer userdata) 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) +application_service_appstore_application_add (ApplicationServiceAppstore * 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(IS_APPLICATION_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); + ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE(appstore); /* Build the application entry. This will be carried along until we're sure we've got everything. */ @@ -280,9 +280,9 @@ custom_service_appstore_application_add (CustomServiceAppstore * appstore, const } void -custom_service_appstore_application_remove (CustomServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) +application_service_appstore_application_remove (ApplicationServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) { - g_return_if_fail(IS_CUSTOM_SERVICE_APPSTORE(appstore)); + g_return_if_fail(IS_APPLICATION_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'); @@ -292,7 +292,7 @@ custom_service_appstore_application_remove (CustomServiceAppstore * appstore, co /* DBus Interface */ static gboolean -_application_service_server_get_applications (CustomServiceAppstore * appstore, GArray ** apps) +_application_service_server_get_applications (ApplicationServiceAppstore * appstore, GArray ** apps) { return FALSE; diff --git a/src/application-service-appstore.h b/src/application-service-appstore.h index 7263617..6a03f80 100644 --- a/src/application-service-appstore.h +++ b/src/application-service-appstore.h @@ -1,37 +1,37 @@ -#ifndef __CUSTOM_SERVICE_APPSTORE_H__ -#define __CUSTOM_SERVICE_APPSTORE_H__ +#ifndef __APPLICATION_SERVICE_APPSTORE_H__ +#define __APPLICATION_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)) +#define APPLICATION_SERVICE_APPSTORE_TYPE (application_service_appstore_get_type ()) +#define APPLICATION_SERVICE_APPSTORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), APPLICATION_SERVICE_APPSTORE_TYPE, ApplicationServiceAppstore)) +#define APPLICATION_SERVICE_APPSTORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), APPLICATION_SERVICE_APPSTORE_TYPE, ApplicationServiceAppstoreClass)) +#define IS_APPLICATION_SERVICE_APPSTORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), APPLICATION_SERVICE_APPSTORE_TYPE)) +#define IS_APPLICATION_SERVICE_APPSTORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), APPLICATION_SERVICE_APPSTORE_TYPE)) +#define APPLICATION_SERVICE_APPSTORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), APPLICATION_SERVICE_APPSTORE_TYPE, ApplicationServiceAppstoreClass)) -typedef struct _CustomServiceAppstore CustomServiceAppstore; -typedef struct _CustomServiceAppstoreClass CustomServiceAppstoreClass; +typedef struct _ApplicationServiceAppstore ApplicationServiceAppstore; +typedef struct _ApplicationServiceAppstoreClass ApplicationServiceAppstoreClass; -struct _CustomServiceAppstoreClass { +struct _ApplicationServiceAppstoreClass { GObjectClass parent_class; }; -struct _CustomServiceAppstore { +struct _ApplicationServiceAppstore { GObject parent; - void (*application_added) (CustomServiceAppstore * appstore, gchar *, gint, gchar *, gchar *, gpointer); - void (*application_removed) (CustomServiceAppstore * appstore, gint, gpointer); + void (*application_added) (ApplicationServiceAppstore * appstore, gchar *, gint, gchar *, gchar *, gpointer); + void (*application_removed) (ApplicationServiceAppstore * appstore, gint, gpointer); }; -GType custom_service_appstore_get_type (void); -void custom_service_appstore_application_add (CustomServiceAppstore * appstore, +GType application_service_appstore_get_type (void); +void application_service_appstore_application_add (ApplicationServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object); -void custom_service_appstore_application_remove (CustomServiceAppstore * appstore, +void application_service_appstore_application_remove (ApplicationServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object); diff --git a/src/application-service-watcher.c b/src/application-service-watcher.c index a5e1817..b077e6a 100644 --- a/src/application-service-watcher.c +++ b/src/application-service-watcher.c @@ -7,22 +7,22 @@ #include "application-service-watcher.h" #include "dbus-shared.h" -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); +static gboolean _notification_watcher_server_register_service (ApplicationServiceWatcher * appwatcher, const gchar * service, DBusGMethodInvocation * method); +static gboolean _notification_watcher_server_registered_services (ApplicationServiceWatcher * appwatcher, GArray ** apps); +static gboolean _notification_watcher_server_protocol_version (ApplicationServiceWatcher * appwatcher, char ** version); +static gboolean _notification_watcher_server_register_notification_host (ApplicationServiceWatcher * appwatcher, const gchar * host); +static gboolean _notification_watcher_server_is_notification_host_registered (ApplicationServiceWatcher * appwatcher, gboolean * haveHost); #include "notification-watcher-server.h" /* Private Stuff */ -typedef struct _CustomServiceWatcherPrivate CustomServiceWatcherPrivate; -struct _CustomServiceWatcherPrivate { - CustomServiceAppstore * appstore; +typedef struct _ApplicationServiceWatcherPrivate ApplicationServiceWatcherPrivate; +struct _ApplicationServiceWatcherPrivate { + ApplicationServiceAppstore * appstore; }; -#define CUSTOM_SERVICE_WATCHER_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_SERVICE_WATCHER_TYPE, CustomServiceWatcherPrivate)) +#define APPLICATION_SERVICE_WATCHER_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), APPLICATION_SERVICE_WATCHER_TYPE, ApplicationServiceWatcherPrivate)) /* Signals Stuff */ enum { @@ -36,62 +36,62 @@ enum { 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); -static void custom_service_watcher_finalize (GObject *object); +static void application_service_watcher_class_init (ApplicationServiceWatcherClass *klass); +static void application_service_watcher_init (ApplicationServiceWatcher *self); +static void application_service_watcher_dispose (GObject *object); +static void application_service_watcher_finalize (GObject *object); -G_DEFINE_TYPE (CustomServiceWatcher, custom_service_watcher, G_TYPE_OBJECT); +G_DEFINE_TYPE (ApplicationServiceWatcher, application_service_watcher, G_TYPE_OBJECT); static void -custom_service_watcher_class_init (CustomServiceWatcherClass *klass) +application_service_watcher_class_init (ApplicationServiceWatcherClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (CustomServiceWatcherPrivate)); + g_type_class_add_private (klass, sizeof (ApplicationServiceWatcherPrivate)); - object_class->dispose = custom_service_watcher_dispose; - object_class->finalize = custom_service_watcher_finalize; + object_class->dispose = application_service_watcher_dispose; + object_class->finalize = application_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), + G_STRUCT_OFFSET (ApplicationServiceWatcherClass, 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), + G_STRUCT_OFFSET (ApplicationServiceWatcherClass, 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), + G_STRUCT_OFFSET (ApplicationServiceWatcherClass, 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), + G_STRUCT_OFFSET (ApplicationServiceWatcherClass, 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_g_object_type_install_info(APPLICATION_SERVICE_WATCHER_TYPE, &dbus_glib__notification_watcher_server_object_info); return; } static void -custom_service_watcher_init (CustomServiceWatcher *self) +application_service_watcher_init (ApplicationServiceWatcher *self) { - CustomServiceWatcherPrivate * priv = CUSTOM_SERVICE_WATCHER_GET_PRIVATE(self); + ApplicationServiceWatcherPrivate * priv = APPLICATION_SERVICE_WATCHER_GET_PRIVATE(self); priv->appstore = NULL; @@ -111,71 +111,71 @@ custom_service_watcher_init (CustomServiceWatcher *self) } static void -custom_service_watcher_dispose (GObject *object) +application_service_watcher_dispose (GObject *object) { - CustomServiceWatcherPrivate * priv = CUSTOM_SERVICE_WATCHER_GET_PRIVATE(object); + ApplicationServiceWatcherPrivate * priv = APPLICATION_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); + G_OBJECT_CLASS (application_service_watcher_parent_class)->dispose (object); return; } static void -custom_service_watcher_finalize (GObject *object) +application_service_watcher_finalize (GObject *object) { - G_OBJECT_CLASS (custom_service_watcher_parent_class)->finalize (object); + G_OBJECT_CLASS (application_service_watcher_parent_class)->finalize (object); return; } -CustomServiceWatcher * -custom_service_watcher_new (CustomServiceAppstore * appstore) +ApplicationServiceWatcher * +application_service_watcher_new (ApplicationServiceAppstore * appstore) { - GObject * obj = g_object_new(CUSTOM_SERVICE_WATCHER_TYPE, NULL); - CustomServiceWatcherPrivate * priv = CUSTOM_SERVICE_WATCHER_GET_PRIVATE(obj); + GObject * obj = g_object_new(APPLICATION_SERVICE_WATCHER_TYPE, NULL); + ApplicationServiceWatcherPrivate * priv = APPLICATION_SERVICE_WATCHER_GET_PRIVATE(obj); priv->appstore = appstore; g_object_ref(G_OBJECT(priv->appstore)); - return CUSTOM_SERVICE_WATCHER(obj); + return APPLICATION_SERVICE_WATCHER(obj); } static gboolean -_notification_watcher_server_register_service (CustomServiceWatcher * appwatcher, const gchar * service, DBusGMethodInvocation * method) +_notification_watcher_server_register_service (ApplicationServiceWatcher * appwatcher, const gchar * service, DBusGMethodInvocation * method) { - CustomServiceWatcherPrivate * priv = CUSTOM_SERVICE_WATCHER_GET_PRIVATE(appwatcher); + ApplicationServiceWatcherPrivate * priv = APPLICATION_SERVICE_WATCHER_GET_PRIVATE(appwatcher); - custom_service_appstore_application_add(priv->appstore, dbus_g_method_get_sender(method), service); + application_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 * appwatcher, GArray ** apps) +_notification_watcher_server_registered_services (ApplicationServiceWatcher * appwatcher, GArray ** apps) { return FALSE; } static gboolean -_notification_watcher_server_protocol_version (CustomServiceWatcher * appwatcher, char ** version) +_notification_watcher_server_protocol_version (ApplicationServiceWatcher * appwatcher, char ** version) { *version = g_strdup("Ayatana Version 1"); return TRUE; } static gboolean -_notification_watcher_server_register_notification_host (CustomServiceWatcher * appwatcher, const gchar * host) +_notification_watcher_server_register_notification_host (ApplicationServiceWatcher * appwatcher, const gchar * host) { return FALSE; } static gboolean -_notification_watcher_server_is_notification_host_registered (CustomServiceWatcher * appwatcher, gboolean * haveHost) +_notification_watcher_server_is_notification_host_registered (ApplicationServiceWatcher * appwatcher, gboolean * haveHost) { *haveHost = TRUE; return TRUE; diff --git a/src/application-service-watcher.h b/src/application-service-watcher.h index c431a59..e8263f5 100644 --- a/src/application-service-watcher.h +++ b/src/application-service-watcher.h @@ -1,5 +1,5 @@ -#ifndef __CUSTOM_SERVICE_WATCHER_H__ -#define __CUSTOM_SERVICE_WATCHER_H__ +#ifndef __APPLICATION_SERVICE_WATCHER_H__ +#define __APPLICATION_SERVICE_WATCHER_H__ #include #include @@ -8,32 +8,32 @@ 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)) +#define APPLICATION_SERVICE_WATCHER_TYPE (application_service_watcher_get_type ()) +#define APPLICATION_SERVICE_WATCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), APPLICATION_SERVICE_WATCHER_TYPE, ApplicationServiceWatcher)) +#define APPLICATION_SERVICE_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), APPLICATION_SERVICE_WATCHER_TYPE, ApplicationServiceWatcherClass)) +#define IS_APPLICATION_SERVICE_WATCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), APPLICATION_SERVICE_WATCHER_TYPE)) +#define IS_APPLICATION_SERVICE_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), APPLICATION_SERVICE_WATCHER_TYPE)) +#define APPLICATION_SERVICE_WATCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), APPLICATION_SERVICE_WATCHER_TYPE, ApplicationServiceWatcherClass)) -typedef struct _CustomServiceWatcher CustomServiceWatcher; -typedef struct _CustomServiceWatcherClass CustomServiceWatcherClass; +typedef struct _ApplicationServiceWatcher ApplicationServiceWatcher; +typedef struct _ApplicationServiceWatcherClass ApplicationServiceWatcherClass; -struct _CustomServiceWatcherClass { +struct _ApplicationServiceWatcherClass { 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); + void (*service_registered) (ApplicationServiceWatcher * watcher, gchar * object, gpointer data); + void (*service_unregistered) (ApplicationServiceWatcher * watcher, gchar * object, gpointer data); + void (*notification_host_registered) (ApplicationServiceWatcher * watcher, gpointer data); + void (*notification_host_unregistered) (ApplicationServiceWatcher * watcher, gpointer data); }; -struct _CustomServiceWatcher { +struct _ApplicationServiceWatcher { GObject parent; }; -GType custom_service_watcher_get_type (void); -CustomServiceWatcher * custom_service_watcher_new (CustomServiceAppstore * appstore); +GType application_service_watcher_get_type (void); +ApplicationServiceWatcher * application_service_watcher_new (ApplicationServiceAppstore * appstore); G_END_DECLS diff --git a/src/application-service.c b/src/application-service.c index 6d5f44d..56e3e80 100644 --- a/src/application-service.c +++ b/src/application-service.c @@ -8,9 +8,9 @@ /* The base main loop */ static GMainLoop * mainloop = NULL; /* Where the application registry lives */ -static CustomServiceAppstore * appstore = NULL; +static ApplicationServiceAppstore * appstore = NULL; /* Interface for applications */ -static CustomServiceWatcher * watcher = NULL; +static ApplicationServiceWatcher * watcher = NULL; /* The service management interface */ static IndicatorService * service = NULL; @@ -34,14 +34,14 @@ main (int argc, char ** argv) g_type_init(); /* Bring us up as a basic indicator service */ - service = indicator_service_new(INDICATOR_CUSTOM_DBUS_ADDR); + service = indicator_service_new(INDICATOR_APPLICATION_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)); + appstore = APPLICATION_SERVICE_APPSTORE(g_object_new(APPLICATION_SERVICE_APPSTORE_TYPE, NULL)); /* Adding a watcher for the Apps coming up */ - watcher = custom_service_watcher_new(appstore); + watcher = application_service_watcher_new(appstore); /* Building and executing our main loop */ mainloop = g_main_loop_new(NULL, FALSE); diff --git a/src/dbus-shared.h b/src/dbus-shared.h index ce7e813..f8e7cce 100644 --- a/src/dbus-shared.h +++ b/src/dbus-shared.h @@ -1,7 +1,7 @@ -#define INDICATOR_CUSTOM_DBUS_ADDR "org.ayatana.indicator.application" -#define INDICATOR_CUSTOM_DBUS_OBJ "/org/ayatana/indicator/application/service" -#define INDICATOR_CUSTOM_DBUS_IFACE "org.ayatana.indicator.application.service" +#define INDICATOR_APPLICATION_DBUS_ADDR "org.ayatana.indicator.application" +#define INDICATOR_APPLICATION_DBUS_OBJ "/org/ayatana/indicator/application/service" +#define INDICATOR_APPLICATION_DBUS_IFACE "org.ayatana.indicator.application.service" #define NOTIFICATION_WATCHER_DBUS_OBJ "/org/ayatana/indicator/application/NotificationWatcher" #define NOTIFICATION_WATCHER_DBUS_IFACE "org.ayatana.indicator.application.NotificationWatcher" diff --git a/src/indicator-application.c b/src/indicator-application.c index e52eaa0..df45d13 100644 --- a/src/indicator-application.c +++ b/src/indicator-application.c @@ -18,36 +18,36 @@ #include "application-service-client.h" #include "application-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)) -#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)) +#define INDICATOR_APPLICATION_TYPE (indicator_application_get_type ()) +#define INDICATOR_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INDICATOR_APPLICATION_TYPE, IndicatorApplication)) +#define INDICATOR_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INDICATOR_APPLICATION_TYPE, IndicatorApplicationClass)) +#define IS_INDICATOR_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INDICATOR_APPLICATION_TYPE)) +#define IS_INDICATOR_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INDICATOR_APPLICATION_TYPE)) +#define INDICATOR_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), INDICATOR_APPLICATION_TYPE, IndicatorApplicationClass)) -typedef struct _IndicatorCustom IndicatorCustom; -typedef struct _IndicatorCustomClass IndicatorCustomClass; +typedef struct _IndicatorApplication IndicatorApplication; +typedef struct _IndicatorApplicationClass IndicatorApplicationClass; -struct _IndicatorCustomClass { +struct _IndicatorApplicationClass { IndicatorObjectClass parent_class; }; -struct _IndicatorCustom { +struct _IndicatorApplication { IndicatorObject parent; }; -GType indicator_custom_get_type (void); +GType indicator_application_get_type (void); INDICATOR_SET_VERSION -INDICATOR_SET_TYPE(INDICATOR_CUSTOM_TYPE) +INDICATOR_SET_TYPE(INDICATOR_APPLICATION_TYPE) #ifdef HAVE_CONFIG_H #include "config.h" #endif -typedef struct _IndicatorCustomPrivate IndicatorCustomPrivate; -struct _IndicatorCustomPrivate { +typedef struct _IndicatorApplicationPrivate IndicatorApplicationPrivate; +struct _IndicatorApplicationPrivate { IndicatorServiceManager * sm; DBusGConnection * bus; DBusGProxy * service_proxy; @@ -59,30 +59,30 @@ struct _ApplicationEntry { IndicatorObjectEntry entry; }; -#define INDICATOR_CUSTOM_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_CUSTOM_TYPE, IndicatorCustomPrivate)) +#define INDICATOR_APPLICATION_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_APPLICATION_TYPE, IndicatorApplicationPrivate)) -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); +static void indicator_application_class_init (IndicatorApplicationClass *klass); +static void indicator_application_init (IndicatorApplication *self); +static void indicator_application_dispose (GObject *object); +static void indicator_application_finalize (GObject *object); 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 connected (IndicatorServiceManager * sm, gboolean connected, IndicatorApplication * application); +static void application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, IndicatorApplication * application); +static void application_removed (DBusGProxy * proxy, gint position , IndicatorApplication * application); static void get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error, gpointer userdata); -G_DEFINE_TYPE (IndicatorCustom, indicator_custom, INDICATOR_OBJECT_TYPE); +G_DEFINE_TYPE (IndicatorApplication, indicator_application, INDICATOR_OBJECT_TYPE); static void -indicator_custom_class_init (IndicatorCustomClass *klass) +indicator_application_class_init (IndicatorApplicationClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (IndicatorCustomPrivate)); + g_type_class_add_private (klass, sizeof (IndicatorApplicationPrivate)); - object_class->dispose = indicator_custom_dispose; - object_class->finalize = indicator_custom_finalize; + object_class->dispose = indicator_application_dispose; + object_class->finalize = indicator_application_finalize; IndicatorObjectClass * io_class = INDICATOR_OBJECT_CLASS(klass); @@ -100,15 +100,15 @@ indicator_custom_class_init (IndicatorCustomClass *klass) } static void -indicator_custom_init (IndicatorCustom *self) +indicator_application_init (IndicatorApplication *self) { - IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(self); + IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_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); + priv->sm = indicator_service_manager_new(INDICATOR_APPLICATION_DBUS_ADDR); g_signal_connect(G_OBJECT(priv->sm), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connected), self); priv->applications = NULL; @@ -117,14 +117,14 @@ indicator_custom_init (IndicatorCustom *self) } static void -indicator_custom_dispose (GObject *object) +indicator_application_dispose (GObject *object) { - IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(object); + IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(object); while (priv->applications != NULL) { application_removed(priv->service_proxy, 0, - INDICATOR_CUSTOM(object)); + INDICATOR_APPLICATION(object)); } if (priv->sm != NULL) { @@ -142,23 +142,23 @@ indicator_custom_dispose (GObject *object) priv->service_proxy = NULL; } - G_OBJECT_CLASS (indicator_custom_parent_class)->dispose (object); + G_OBJECT_CLASS (indicator_application_parent_class)->dispose (object); return; } static void -indicator_custom_finalize (GObject *object) +indicator_application_finalize (GObject *object) { - G_OBJECT_CLASS (indicator_custom_parent_class)->finalize (object); + G_OBJECT_CLASS (indicator_application_parent_class)->finalize (object); return; } void -connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * custom) +connected (IndicatorServiceManager * sm, gboolean connected, IndicatorApplication * application) { - IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(custom); - g_debug("Connected to Custom Indicator Service."); + IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); + g_debug("Connected to Application Indicator Service."); GError * error = NULL; @@ -175,9 +175,9 @@ 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, + INDICATOR_APPLICATION_DBUS_ADDR, + INDICATOR_APPLICATION_DBUS_OBJ, + INDICATOR_APPLICATION_DBUS_IFACE, &error); /* Set up proxy signals */ @@ -199,19 +199,19 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c dbus_g_proxy_connect_signal(priv->service_proxy, "ApplicationAdded", G_CALLBACK(application_added), - custom, + application, NULL /* Disconnection Signal */); dbus_g_proxy_connect_signal(priv->service_proxy, "ApplicationRemoved", G_CALLBACK(application_removed), - custom, + application, NULL /* Disconnection Signal */); /* Query it for existing applications */ g_debug("Request current apps"); org_ayatana_indicator_application_service_get_applications_async(priv->service_proxy, get_applications, - custom); + application); return; } @@ -222,9 +222,9 @@ connected (IndicatorServiceManager * sm, gboolean connected, IndicatorCustom * c static GList * get_entries (IndicatorObject * io) { - g_return_val_if_fail(IS_INDICATOR_CUSTOM(io), NULL); + g_return_val_if_fail(IS_INDICATOR_APPLICATION(io), NULL); - IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(io); + IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(io); GList * retval = NULL; GList * apppointer = NULL; @@ -244,10 +244,10 @@ get_entries (IndicatorObject * io) 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) +application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, IndicatorApplication * application) { g_debug("Building new application entry: %s with icon: %s", dbusaddress, iconname); - IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(custom); + IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); ApplicationEntry * app = g_new(ApplicationEntry, 1); app->entry.image = GTK_IMAGE(gtk_image_new_from_icon_name(iconname, GTK_ICON_SIZE_MENU)); @@ -259,16 +259,16 @@ application_added (DBusGProxy * proxy, const gchar * iconname, gint position, co 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); + g_signal_emit(G_OBJECT(application), 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, IndicatorApplication * application) { - IndicatorCustomPrivate * priv = INDICATOR_CUSTOM_GET_PRIVATE(custom); + IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position); if (app == NULL) { @@ -277,7 +277,7 @@ application_removed (DBusGProxy * proxy, gint position, IndicatorCustom * custom } priv->applications = g_list_remove(priv->applications, app); - g_signal_emit(G_OBJECT(custom), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED_ID, 0, &(app->entry), TRUE); + g_signal_emit(G_OBJECT(application), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED_ID, 0, &(app->entry), TRUE); if (app->entry.image != NULL) { g_object_unref(G_OBJECT(app->entry.image)); diff --git a/src/libappindicator/app-indicator-enum-types.h.in b/src/libappindicator/app-indicator-enum-types.h.in index e037be7..1f48b41 100644 --- a/src/libappindicator/app-indicator-enum-types.h.in +++ b/src/libappindicator/app-indicator-enum-types.h.in @@ -1,6 +1,6 @@ /*** BEGIN file-header ***/ -#ifndef __CUSTOM_INDICATOR_ENUM_TYPES_H__ -#define __CUSTOM_INDICATOR_ENUM_TYPES_H__ +#ifndef __APPLICATION_INDICATOR_ENUM_TYPES_H__ +#define __APPLICATION_INDICATOR_ENUM_TYPES_H__ #include @@ -12,7 +12,7 @@ G_BEGIN_DECLS G_END_DECLS -#endif /* __CUSTOM_INDICATOR_ENUM_TYPES_H__ */ +#endif /* __APPLICATION_INDICATOR_ENUM_TYPES_H__ */ /*** END file-tail ***/ /*** BEGIN file-production ***/ @@ -28,6 +28,6 @@ G_END_DECLS Return value: A registered type for the enum */ GType @enum_name@_get_type (void) G_GNUC_CONST; -#define CUSTOM_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) +#define APPLICATION_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) /*** END value-header ***/ diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c index fc2e196..da8576e 100644 --- a/src/libappindicator/app-indicator.c +++ b/src/libappindicator/app-indicator.c @@ -14,24 +14,24 @@ #include "dbus-shared.h" /** - CustomIndicatorPrivate: - @id: The ID of the indicator. Maps to CustomIndicator::id. - @category: Which category the indicator is. Maps to CustomIndicator::category. - @status: The status of the indicator. Maps to CustomIndicator::status. - @icon_name: The name of the icon to use. Maps to CustomIndicator::icon-name. - @attention_icon_name: The name of the attention icon to use. Maps to CustomIndicator::attention-icon-name. - @menu: The menu for this indicator. Maps to CustomIndicator::menu + ApplicationIndicatorPrivate: + @id: The ID of the indicator. Maps to ApplicationIndicator::id. + @category: Which category the indicator is. Maps to ApplicationIndicator::category. + @status: The status of the indicator. Maps to ApplicationIndicator::status. + @icon_name: The name of the icon to use. Maps to ApplicationIndicator::icon-name. + @attention_icon_name: The name of the attention icon to use. Maps to ApplicationIndicator::attention-icon-name. + @menu: The menu for this indicator. Maps to ApplicationIndicator::menu @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be #NULL. All of the private data in an instance of a - custom indicator. + application indicator. */ -typedef struct _CustomIndicatorPrivate CustomIndicatorPrivate; -struct _CustomIndicatorPrivate { +typedef struct _ApplicationIndicatorPrivate ApplicationIndicatorPrivate; +struct _ApplicationIndicatorPrivate { /* Properties */ gchar * id; - CustomIndicatorCategory category; - CustomIndicatorStatus status; + ApplicationIndicatorCategory category; + ApplicationIndicatorStatus status; gchar * icon_name; gchar * attention_icon_name; DbusmenuServer * menu; @@ -81,38 +81,38 @@ enum { #define PROP_CONNECTED_S "connected" /* Private macro, shhhh! */ -#define CUSTOM_INDICATOR_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), CUSTOM_INDICATOR_TYPE, CustomIndicatorPrivate)) +#define APPLICATION_INDICATOR_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), APPLICATION_INDICATOR_TYPE, ApplicationIndicatorPrivate)) /* Boiler plate */ -static void custom_indicator_class_init (CustomIndicatorClass *klass); -static void custom_indicator_init (CustomIndicator *self); -static void custom_indicator_dispose (GObject *object); -static void custom_indicator_finalize (GObject *object); +static void application_indicator_class_init (ApplicationIndicatorClass *klass); +static void application_indicator_init (ApplicationIndicator *self); +static void application_indicator_dispose (GObject *object); +static void application_indicator_finalize (GObject *object); /* Property functions */ -static void custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static void application_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void application_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* Other stuff */ -static void check_connect (CustomIndicator * self); +static void check_connect (ApplicationIndicator * self); static void register_service_cb (DBusGProxy * proxy, GError * error, gpointer data); /* GObject type */ -G_DEFINE_TYPE (CustomIndicator, custom_indicator, G_TYPE_OBJECT); +G_DEFINE_TYPE (ApplicationIndicator, application_indicator, G_TYPE_OBJECT); static void -custom_indicator_class_init (CustomIndicatorClass *klass) +application_indicator_class_init (ApplicationIndicatorClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (CustomIndicatorPrivate)); + g_type_class_add_private (klass, sizeof (ApplicationIndicatorPrivate)); /* Clean up */ - object_class->dispose = custom_indicator_dispose; - object_class->finalize = custom_indicator_finalize; + object_class->dispose = application_indicator_dispose; + object_class->finalize = application_indicator_finalize; /* Property funcs */ - object_class->set_property = custom_indicator_set_property; - object_class->get_property = custom_indicator_get_property; + object_class->set_property = application_indicator_set_property; + object_class->get_property = application_indicator_get_property; /* Properties */ g_object_class_install_property(object_class, PROP_ID, @@ -133,8 +133,8 @@ custom_indicator_class_init (CustomIndicatorClass *klass) g_param_spec_enum(PROP_CATEGORY_ENUM_S, "Indicator Category", "The type of indicator that this represents. Please don't use 'other'. Defaults to 'Application Status'.", - CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY, - CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, + APPLICATION_INDICATOR_TYPE_INDICATOR_CATEGORY, + APPLICATION_INDICATOR_CATEGORY_APPLICATION_STATUS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(object_class, PROP_STATUS, @@ -148,8 +148,8 @@ custom_indicator_class_init (CustomIndicatorClass *klass) g_param_spec_enum(PROP_STATUS_ENUM_S, "Indicator Status", "Whether the indicator is shown or requests attention. Defaults to 'off'.", - CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS, - CUSTOM_INDICATOR_STATUS_PASSIVE, + APPLICATION_INDICATOR_TYPE_INDICATOR_STATUS, + APPLICATION_INDICATOR_STATUS_PASSIVE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(object_class, PROP_ICON_NAME, @@ -191,81 +191,81 @@ custom_indicator_class_init (CustomIndicatorClass *klass) /* Signals */ /** - CustomIndicator::new-icon: - @arg0: The #CustomIndicator object + ApplicationIndicator::new-icon: + @arg0: The #ApplicationIndicator object Signaled when there is a new icon set for the object. */ - signals[NEW_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ICON, + signals[NEW_ICON] = g_signal_new (APPLICATION_INDICATOR_SIGNAL_NEW_ICON, G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_icon), + G_STRUCT_OFFSET (ApplicationIndicatorClass, new_icon), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** - CustomIndicator::new-attention-icon: - @arg0: The #CustomIndicator object + ApplicationIndicator::new-attention-icon: + @arg0: The #ApplicationIndicator object Signaled when there is a new attention icon set for the object. */ - signals[NEW_ATTENTION_ICON] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, + signals[NEW_ATTENTION_ICON] = g_signal_new (APPLICATION_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_attention_icon), + G_STRUCT_OFFSET (ApplicationIndicatorClass, new_attention_icon), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** - CustomIndicator::new-status: - @arg0: The #CustomIndicator object - @arg1: The string value of the #CustomIndicatorStatus enum. + ApplicationIndicator::new-status: + @arg0: The #ApplicationIndicator object + @arg1: The string value of the #ApplicationIndicatorStatus enum. Signaled when the status of the indicator changes. */ - signals[NEW_STATUS] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_NEW_STATUS, + signals[NEW_STATUS] = g_signal_new (APPLICATION_INDICATOR_SIGNAL_NEW_STATUS, G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, new_status), + G_STRUCT_OFFSET (ApplicationIndicatorClass, new_status), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); /** - CustomIndicator::connection-changed: - @arg0: The #CustomIndicator object + ApplicationIndicator::connection-changed: + @arg0: The #ApplicationIndicator object @arg1: Whether we're connected or not Signaled when we connect to a watcher, or when it drops away. */ - signals[CONNECTION_CHANGED] = g_signal_new (CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED, + signals[CONNECTION_CHANGED] = g_signal_new (APPLICATION_INDICATOR_SIGNAL_CONNECTION_CHANGED, G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CustomIndicatorClass, connection_changed), + G_STRUCT_OFFSET (ApplicationIndicatorClass, connection_changed), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE); /* Initialize the object as a DBus type */ - dbus_g_object_type_install_info(CUSTOM_INDICATOR_TYPE, + dbus_g_object_type_install_info(APPLICATION_INDICATOR_TYPE, &dbus_glib__notification_item_server_object_info); return; } static void -custom_indicator_init (CustomIndicator *self) +application_indicator_init (ApplicationIndicator *self) { - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); priv->id = NULL; - priv->category = CUSTOM_INDICATOR_CATEGORY_OTHER; - priv->status = CUSTOM_INDICATOR_STATUS_PASSIVE; + priv->category = APPLICATION_INDICATOR_CATEGORY_OTHER; + priv->status = APPLICATION_INDICATOR_STATUS_PASSIVE; priv->icon_name = NULL; priv->attention_icon_name = NULL; priv->menu = NULL; @@ -277,7 +277,7 @@ custom_indicator_init (CustomIndicator *self) GError * error = NULL; 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("Unable to connect to the session bus when creating application indicator: %s", error->message); g_error_free(error); return; } @@ -292,15 +292,15 @@ custom_indicator_init (CustomIndicator *self) /* Free all objects, make sure that all the dbus signals are sent out before we shut this down. */ static void -custom_indicator_dispose (GObject *object) +application_indicator_dispose (GObject *object) { - CustomIndicator * self = CUSTOM_INDICATOR(object); + ApplicationIndicator * self = APPLICATION_INDICATOR(object); g_return_if_fail(self != NULL); - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); - if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { - custom_indicator_set_status(self, CUSTOM_INDICATOR_STATUS_PASSIVE); + if (priv->status != APPLICATION_INDICATOR_STATUS_PASSIVE) { + application_indicator_set_status(self, APPLICATION_INDICATOR_STATUS_PASSIVE); } if (priv->menu != NULL) { @@ -314,22 +314,22 @@ custom_indicator_dispose (GObject *object) priv->watcher_proxy = NULL; } - G_OBJECT_CLASS (custom_indicator_parent_class)->dispose (object); + G_OBJECT_CLASS (application_indicator_parent_class)->dispose (object); return; } /* Free all of the memory that we could be using in the object. */ static void -custom_indicator_finalize (GObject *object) +application_indicator_finalize (GObject *object) { - CustomIndicator * self = CUSTOM_INDICATOR(object); + ApplicationIndicator * self = APPLICATION_INDICATOR(object); g_return_if_fail(self != NULL); - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); - if (priv->status != CUSTOM_INDICATOR_STATUS_PASSIVE) { - g_warning("Finalizing Custom Status with the status set to: %d", priv->status); + if (priv->status != APPLICATION_INDICATOR_STATUS_PASSIVE) { + g_warning("Finalizing Application Status with the status set to: %d", priv->status); } if (priv->id != NULL) { @@ -347,7 +347,7 @@ custom_indicator_finalize (GObject *object) priv->attention_icon_name = NULL; } - G_OBJECT_CLASS (custom_indicator_parent_class)->finalize (object); + G_OBJECT_CLASS (application_indicator_parent_class)->finalize (object); return; } @@ -355,12 +355,12 @@ custom_indicator_finalize (GObject *object) /* Set some properties */ static void -custom_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +application_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - CustomIndicator * self = CUSTOM_INDICATOR(object); + ApplicationIndicator * self = APPLICATION_INDICATOR(object); g_return_if_fail(self != NULL); - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); switch (prop_id) { /* *********************** */ @@ -474,12 +474,12 @@ custom_indicator_set_property (GObject * object, guint prop_id, const GValue * v /* Function to fill our value with the property it's requesting. */ static void -custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +application_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { - CustomIndicator * self = CUSTOM_INDICATOR(object); + ApplicationIndicator * self = APPLICATION_INDICATOR(object); g_return_if_fail(self != NULL); - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); switch (prop_id) { /* *********************** */ @@ -593,9 +593,9 @@ custom_indicator_get_property (GObject * object, guint prop_id, GValue * value, connect to things. If we do, and we're not connected, it connects for us. */ static void -check_connect (CustomIndicator * self) +check_connect (ApplicationIndicator * self) { - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(self); + ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); /* We're alreadying connecting or trying to connect. */ if (priv->watcher_proxy != NULL) return; @@ -607,7 +607,7 @@ check_connect (CustomIndicator * self) GError * error = NULL; priv->watcher_proxy = dbus_g_proxy_new_for_name_owner(priv->connection, - INDICATOR_CUSTOM_DBUS_ADDR, + INDICATOR_APPLICATION_DBUS_ADDR, NOTIFICATION_WATCHER_DBUS_OBJ, NOTIFICATION_WATCHER_DBUS_IFACE, &error); @@ -626,7 +626,7 @@ check_connect (CustomIndicator * self) static void register_service_cb (DBusGProxy * proxy, GError * error, gpointer data) { - CustomIndicatorPrivate * priv = CUSTOM_INDICATOR_GET_PRIVATE(data); + ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(data); if (error != NULL) { g_warning("Unable to connect to the Notification Watcher: %s", error->message); @@ -642,14 +642,14 @@ register_service_cb (DBusGProxy * proxy, GError * error, gpointer data) /* ************************* */ /** - custom_indicator_set_id: - @ci: The #CustomIndicator object to use + application_indicator_set_id: + @ci: The #ApplicationIndicator object to use @id: ID to set for this indicator - Wrapper function for property #CustomIndicator::id. + Wrapper function for property #ApplicationIndicator::id. */ void -custom_indicator_set_id (CustomIndicator * ci, const gchar * id) +application_indicator_set_id (ApplicationIndicator * ci, const gchar * id) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -659,47 +659,47 @@ custom_indicator_set_id (CustomIndicator * ci, const gchar * id) } /** - custom_indicator_set_category: - @ci: The #CustomIndicator object to use + application_indicator_set_category: + @ci: The #ApplicationIndicator object to use @category: The category to set for this indicator - Wrapper function for property #CustomIndicator::category. + Wrapper function for property #ApplicationIndicator::category. */ void -custom_indicator_set_category (CustomIndicator * ci, CustomIndicatorCategory category) +application_indicator_set_category (ApplicationIndicator * ci, ApplicationIndicatorCategory category) { GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_value_init(&value, APPLICATION_INDICATOR_TYPE_INDICATOR_CATEGORY); g_value_set_enum(&value, category); g_object_set_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); return; } /** - custom_indicator_set_status: - @ci: The #CustomIndicator object to use + application_indicator_set_status: + @ci: The #ApplicationIndicator object to use @status: The status to set for this indicator - Wrapper function for property #CustomIndicator::status. + Wrapper function for property #ApplicationIndicator::status. */ void -custom_indicator_set_status (CustomIndicator * ci, CustomIndicatorStatus status) +application_indicator_set_status (ApplicationIndicator * ci, ApplicationIndicatorStatus status) { GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); + g_value_init(&value, APPLICATION_INDICATOR_TYPE_INDICATOR_STATUS); g_value_set_enum(&value, status); g_object_set_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); return; } /** - custom_indicator_set_icon: - @ci: The #CustomIndicator object to use + application_indicator_set_icon: + @ci: The #ApplicationIndicator object to use @icon_name: The name of the icon to set for this indicator - Wrapper function for property #CustomIndicator::icon. + Wrapper function for property #ApplicationIndicator::icon. */ -void custom_indicator_set_icon (CustomIndicator * ci, const gchar * icon_name) +void application_indicator_set_icon (ApplicationIndicator * ci, const gchar * icon_name) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -709,14 +709,14 @@ void custom_indicator_set_icon (CustomIndicator * ci, const gchar * icon_name) } /** - custom_indicator_set_attention_icon: - @ci: The #CustomIndicator object to use + application_indicator_set_attention_icon: + @ci: The #ApplicationIndicator object to use @icon_name: The name of the attention icon to set for this indicator - Wrapper function for property #CustomIndicator::attention-icon. + Wrapper function for property #ApplicationIndicator::attention-icon. */ void -custom_indicator_set_attention_icon (CustomIndicator * ci, const gchar * icon_name) +application_indicator_set_attention_icon (ApplicationIndicator * ci, const gchar * icon_name) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -726,14 +726,14 @@ custom_indicator_set_attention_icon (CustomIndicator * ci, const gchar * icon_na } /** - custom_indicator_set_menu: - @ci: The #CustomIndicator object to use + application_indicator_set_menu: + @ci: The #ApplicationIndicator object to use @menu: The object with the menu for the indicator - Wrapper function for property #CustomIndicator::menu. + Wrapper function for property #ApplicationIndicator::menu. */ void -custom_indicator_set_menu (CustomIndicator * ci, DbusmenuServer * menu) +application_indicator_set_menu (ApplicationIndicator * ci, DbusmenuServer * menu) { GValue value = {0}; g_value_init(&value, G_TYPE_OBJECT); @@ -743,15 +743,15 @@ custom_indicator_set_menu (CustomIndicator * ci, DbusmenuServer * menu) } /** - custom_indicator_get_id: - @ci: The #CustomIndicator object to use + application_indicator_get_id: + @ci: The #ApplicationIndicator object to use - Wrapper function for property #CustomIndicator::id. + Wrapper function for property #ApplicationIndicator::id. Return value: The current ID */ const gchar * -custom_indicator_get_id (CustomIndicator * ci) +application_indicator_get_id (ApplicationIndicator * ci) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -760,49 +760,49 @@ custom_indicator_get_id (CustomIndicator * ci) } /** - custom_indicator_get_category: - @ci: The #CustomIndicator object to use + application_indicator_get_category: + @ci: The #ApplicationIndicator object to use - Wrapper function for property #CustomIndicator::category. + Wrapper function for property #ApplicationIndicator::category. Return value: The current category. */ -CustomIndicatorCategory -custom_indicator_get_category (CustomIndicator * ci) +ApplicationIndicatorCategory +application_indicator_get_category (ApplicationIndicator * ci) { GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_value_init(&value, APPLICATION_INDICATOR_TYPE_INDICATOR_CATEGORY); g_object_get_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); return g_value_get_enum(&value); } /** - custom_indicator_get_status: - @ci: The #CustomIndicator object to use + application_indicator_get_status: + @ci: The #ApplicationIndicator object to use - Wrapper function for property #CustomIndicator::status. + Wrapper function for property #ApplicationIndicator::status. Return value: The current status. */ -CustomIndicatorStatus -custom_indicator_get_status (CustomIndicator * ci) +ApplicationIndicatorStatus +application_indicator_get_status (ApplicationIndicator * ci) { GValue value = {0}; - g_value_init(&value, CUSTOM_INDICATOR_TYPE_INDICATOR_STATUS); + g_value_init(&value, APPLICATION_INDICATOR_TYPE_INDICATOR_STATUS); g_object_get_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); return g_value_get_enum(&value); } /** - custom_indicator_get_icon: - @ci: The #CustomIndicator object to use + application_indicator_get_icon: + @ci: The #ApplicationIndicator object to use - Wrapper function for property #CustomIndicator::icon-name. + Wrapper function for property #ApplicationIndicator::icon-name. Return value: The current icon name. */ const gchar * -custom_indicator_get_icon (CustomIndicator * ci) +application_indicator_get_icon (ApplicationIndicator * ci) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -811,15 +811,15 @@ custom_indicator_get_icon (CustomIndicator * ci) } /** - custom_indicator_get_attention_icon: - @ci: The #CustomIndicator object to use + application_indicator_get_attention_icon: + @ci: The #ApplicationIndicator object to use - Wrapper function for property #CustomIndicator::attention-icon-name. + Wrapper function for property #ApplicationIndicator::attention-icon-name. Return value: The current attention icon name. */ const gchar * -custom_indicator_get_attention_icon (CustomIndicator * ci) +application_indicator_get_attention_icon (ApplicationIndicator * ci) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -828,15 +828,15 @@ custom_indicator_get_attention_icon (CustomIndicator * ci) } /** - custom_indicator_get_menu: - @ci: The #CustomIndicator object to use + application_indicator_get_menu: + @ci: The #ApplicationIndicator object to use - Wrapper function for property #CustomIndicator::menu. + Wrapper function for property #ApplicationIndicator::menu. Return value: The current menu being used. */ DbusmenuServer * -custom_indicator_get_menu (CustomIndicator * ci) +application_indicator_get_menu (ApplicationIndicator * ci) { GValue value = {0}; g_value_init(&value, G_TYPE_OBJECT); diff --git a/src/libappindicator/app-indicator.h b/src/libappindicator/app-indicator.h index 2e9045c..01b7239 100644 --- a/src/libappindicator/app-indicator.h +++ b/src/libappindicator/app-indicator.h @@ -1,5 +1,5 @@ -#ifndef __CUSTOM_INDICATOR_H__ -#define __CUSTOM_INDICATOR_H__ +#ifndef __APPLICATION_INDICATOR_H__ +#define __APPLICATION_INDICATOR_H__ #include #include @@ -7,135 +7,135 @@ G_BEGIN_DECLS -#define CUSTOM_INDICATOR_TYPE (custom_indicator_get_type ()) -#define CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicator)) -#define CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) -#define IS_CUSTOM_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_INDICATOR_TYPE)) -#define IS_CUSTOM_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_INDICATOR_TYPE)) -#define CUSTOM_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_INDICATOR_TYPE, CustomIndicatorClass)) +#define APPLICATION_INDICATOR_TYPE (application_indicator_get_type ()) +#define APPLICATION_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), APPLICATION_INDICATOR_TYPE, ApplicationIndicator)) +#define APPLICATION_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), APPLICATION_INDICATOR_TYPE, ApplicationIndicatorClass)) +#define IS_APPLICATION_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), APPLICATION_INDICATOR_TYPE)) +#define IS_APPLICATION_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), APPLICATION_INDICATOR_TYPE)) +#define APPLICATION_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), APPLICATION_INDICATOR_TYPE, ApplicationIndicatorClass)) -#define CUSTOM_INDICATOR_SIGNAL_NEW_ICON "new-icon" -#define CUSTOM_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" -#define CUSTOM_INDICATOR_SIGNAL_NEW_STATUS "new-status" -#define CUSTOM_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" +#define APPLICATION_INDICATOR_SIGNAL_NEW_ICON "new-icon" +#define APPLICATION_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" +#define APPLICATION_INDICATOR_SIGNAL_NEW_STATUS "new-status" +#define APPLICATION_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" /** - CustomIndicatorCategory: - @CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. - @CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. - @CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. - @CUSTOM_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. - @CUSTOM_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. + ApplicationIndicatorCategory: + @APPLICATION_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. + @APPLICATION_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. + @APPLICATION_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. + @APPLICATION_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. + @APPLICATION_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. The category provides grouping for the indicators so that users can find indicators that are similar together. */ -typedef enum { /*< prefix=CUSTOM_INDICATOR_CATEGORY >*/ - CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, - CUSTOM_INDICATOR_CATEGORY_COMMUNICATIONS, - CUSTOM_INDICATOR_CATEGORY_SYSTEM_SERVICES, - CUSTOM_INDICATOR_CATEGORY_HARDWARE, - CUSTOM_INDICATOR_CATEGORY_OTHER -} CustomIndicatorCategory; +typedef enum { /*< prefix=APPLICATION_INDICATOR_CATEGORY >*/ + APPLICATION_INDICATOR_CATEGORY_APPLICATION_STATUS, + APPLICATION_INDICATOR_CATEGORY_COMMUNICATIONS, + APPLICATION_INDICATOR_CATEGORY_SYSTEM_SERVICES, + APPLICATION_INDICATOR_CATEGORY_HARDWARE, + APPLICATION_INDICATOR_CATEGORY_OTHER +} ApplicationIndicatorCategory; /** - CustomIndicatorStatus: - @CUSTOM_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. - @CUSTOM_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. - @CUSTOM_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. + ApplicationIndicatorStatus: + @APPLICATION_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. + @APPLICATION_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. + @APPLICATION_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. These are the states that the indicator can be on in the user's panel. The indicator by default starts - in the state @CUSTOM_INDICATOR_STATUS_OFF and can be - shown by setting it to @CUSTOM_INDICATOR_STATUS_ON. + in the state @APPLICATION_INDICATOR_STATUS_OFF and can be + shown by setting it to @APPLICATION_INDICATOR_STATUS_ON. */ -typedef enum { /*< prefix=CUSTOM_INDICATOR_STATUS >*/ - CUSTOM_INDICATOR_STATUS_PASSIVE, - CUSTOM_INDICATOR_STATUS_ACTIVE, - CUSTOM_INDICATOR_STATUS_ATTENTION -} CustomIndicatorStatus; +typedef enum { /*< prefix=APPLICATION_INDICATOR_STATUS >*/ + APPLICATION_INDICATOR_STATUS_PASSIVE, + APPLICATION_INDICATOR_STATUS_ACTIVE, + APPLICATION_INDICATOR_STATUS_ATTENTION +} ApplicationIndicatorStatus; -typedef struct _CustomIndicator CustomIndicator; -typedef struct _CustomIndicatorClass CustomIndicatorClass; +typedef struct _ApplicationIndicator ApplicationIndicator; +typedef struct _ApplicationIndicatorClass ApplicationIndicatorClass; /** - CustomIndicatorClass: + ApplicationIndicatorClass: @parent_class: Mia familia - @new_icon: Slot for #CustomIndicator::new-icon. - @new_attention_icon: Slot for #CustomIndicator::new-attention-icon. - @new_status: Slot for #CustomIndicator::new-status. - @connection_changed: Slot for #CustomIndicator::connection-changed. - @custom_indicator_reserved_1: Reserved for future use. - @custom_indicator_reserved_2: Reserved for future use. - @custom_indicator_reserved_3: Reserved for future use. - @custom_indicator_reserved_4: Reserved for future use. - - The signals and external functions that make up the #CustomIndicator + @new_icon: Slot for #ApplicationIndicator::new-icon. + @new_attention_icon: Slot for #ApplicationIndicator::new-attention-icon. + @new_status: Slot for #ApplicationIndicator::new-status. + @connection_changed: Slot for #ApplicationIndicator::connection-changed. + @application_indicator_reserved_1: Reserved for future use. + @application_indicator_reserved_2: Reserved for future use. + @application_indicator_reserved_3: Reserved for future use. + @application_indicator_reserved_4: Reserved for future use. + + The signals and external functions that make up the #ApplicationIndicator class object. */ -struct _CustomIndicatorClass { +struct _ApplicationIndicatorClass { /* Parent */ GObjectClass parent_class; /* DBus Signals */ - void (* new_icon) (CustomIndicator * indicator, + void (* new_icon) (ApplicationIndicator * indicator, gpointer user_data); - void (* new_attention_icon) (CustomIndicator * indicator, + void (* new_attention_icon) (ApplicationIndicator * indicator, gpointer user_data); - void (* new_status) (CustomIndicator * indicator, + void (* new_status) (ApplicationIndicator * indicator, gchar * status_string, gpointer user_data); /* Local Signals */ - void (* connection_changed) (CustomIndicator * indicator, + void (* connection_changed) (ApplicationIndicator * indicator, gboolean connected, gpointer user_data); /* Reserved */ - void (*custom_indicator_reserved_1)(void); - void (*custom_indicator_reserved_2)(void); - void (*custom_indicator_reserved_3)(void); - void (*custom_indicator_reserved_4)(void); + void (*application_indicator_reserved_1)(void); + void (*application_indicator_reserved_2)(void); + void (*application_indicator_reserved_3)(void); + void (*application_indicator_reserved_4)(void); }; /** - CustomIndicator: + ApplicationIndicator: @parent: Parent object. - A custom indicator represents the values that are needed to show a + A application indicator represents the values that are needed to show a unique status in the panel for an application. In general, applications should try to fit in the other indicators that are available on the panel before using this. But, sometimes it is necissary. */ -struct _CustomIndicator { +struct _ApplicationIndicator { GObject parent; /* None. We're a very private object. */ }; /* GObject Stuff */ -GType custom_indicator_get_type (void); +GType application_indicator_get_type (void); /* Set properties */ -void custom_indicator_set_id (CustomIndicator * ci, - const gchar * id); -void custom_indicator_set_category (CustomIndicator * ci, - CustomIndicatorCategory category); -void custom_indicator_set_status (CustomIndicator * ci, - CustomIndicatorStatus status); -void custom_indicator_set_icon (CustomIndicator * ci, - const gchar * icon_name); -void custom_indicator_set_attention_icon (CustomIndicator * ci, - const gchar * icon_name); -void custom_indicator_set_menu (CustomIndicator * ci, - DbusmenuServer * menu); +void application_indicator_set_id (ApplicationIndicator * ci, + const gchar * id); +void application_indicator_set_category (ApplicationIndicator * ci, + ApplicationIndicatorCategory category); +void application_indicator_set_status (ApplicationIndicator * ci, + ApplicationIndicatorStatus status); +void application_indicator_set_icon (ApplicationIndicator * ci, + const gchar * icon_name); +void application_indicator_set_attention_icon (ApplicationIndicator * ci, + const gchar * icon_name); +void application_indicator_set_menu (ApplicationIndicator * ci, + DbusmenuServer * menu); /* Get properties */ -const gchar * custom_indicator_get_id (CustomIndicator * ci); -CustomIndicatorCategory custom_indicator_get_category (CustomIndicator * ci); -CustomIndicatorStatus custom_indicator_get_status (CustomIndicator * ci); -const gchar * custom_indicator_get_icon (CustomIndicator * ci); -const gchar * custom_indicator_get_attention_icon (CustomIndicator * ci); -DbusmenuServer * custom_indicator_get_menu (CustomIndicator * ci); +const gchar * application_indicator_get_id (ApplicationIndicator * ci); +ApplicationIndicatorCategory application_indicator_get_category (ApplicationIndicator * ci); +ApplicationIndicatorStatus application_indicator_get_status (ApplicationIndicator * ci); +const gchar * application_indicator_get_icon (ApplicationIndicator * ci); +const gchar * application_indicator_get_attention_icon (ApplicationIndicator * ci); +DbusmenuServer * application_indicator_get_menu (ApplicationIndicator * ci); G_END_DECLS -- cgit v1.2.3 From a7c70796808179a0033a01a436156f5d5087d39a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 13:11:17 -0600 Subject: Shortening the object names as well. People hate typing. --- src/libappindicator/app-indicator-enum-types.h.in | 8 +- src/libappindicator/app-indicator.c | 254 +++++++++++----------- src/libappindicator/app-indicator.h | 158 +++++++------- 3 files changed, 210 insertions(+), 210 deletions(-) (limited to 'src') diff --git a/src/libappindicator/app-indicator-enum-types.h.in b/src/libappindicator/app-indicator-enum-types.h.in index 1f48b41..b79446d 100644 --- a/src/libappindicator/app-indicator-enum-types.h.in +++ b/src/libappindicator/app-indicator-enum-types.h.in @@ -1,6 +1,6 @@ /*** BEGIN file-header ***/ -#ifndef __APPLICATION_INDICATOR_ENUM_TYPES_H__ -#define __APPLICATION_INDICATOR_ENUM_TYPES_H__ +#ifndef __APP_INDICATOR_ENUM_TYPES_H__ +#define __APP_INDICATOR_ENUM_TYPES_H__ #include @@ -12,7 +12,7 @@ G_BEGIN_DECLS G_END_DECLS -#endif /* __APPLICATION_INDICATOR_ENUM_TYPES_H__ */ +#endif /* __APP_INDICATOR_ENUM_TYPES_H__ */ /*** END file-tail ***/ /*** BEGIN file-production ***/ @@ -28,6 +28,6 @@ G_END_DECLS Return value: A registered type for the enum */ GType @enum_name@_get_type (void) G_GNUC_CONST; -#define APPLICATION_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) +#define APP_INDICATOR_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) /*** END value-header ***/ diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c index da8576e..89f77db 100644 --- a/src/libappindicator/app-indicator.c +++ b/src/libappindicator/app-indicator.c @@ -14,24 +14,24 @@ #include "dbus-shared.h" /** - ApplicationIndicatorPrivate: - @id: The ID of the indicator. Maps to ApplicationIndicator::id. - @category: Which category the indicator is. Maps to ApplicationIndicator::category. - @status: The status of the indicator. Maps to ApplicationIndicator::status. - @icon_name: The name of the icon to use. Maps to ApplicationIndicator::icon-name. - @attention_icon_name: The name of the attention icon to use. Maps to ApplicationIndicator::attention-icon-name. - @menu: The menu for this indicator. Maps to ApplicationIndicator::menu + AppIndicatorPrivate: + @id: The ID of the indicator. Maps to AppIndicator::id. + @category: Which category the indicator is. Maps to AppIndicator::category. + @status: The status of the indicator. Maps to AppIndicator::status. + @icon_name: The name of the icon to use. Maps to AppIndicator::icon-name. + @attention_icon_name: The name of the attention icon to use. Maps to AppIndicator::attention-icon-name. + @menu: The menu for this indicator. Maps to AppIndicator::menu @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be #NULL. All of the private data in an instance of a application indicator. */ -typedef struct _ApplicationIndicatorPrivate ApplicationIndicatorPrivate; -struct _ApplicationIndicatorPrivate { +typedef struct _AppIndicatorPrivate AppIndicatorPrivate; +struct _AppIndicatorPrivate { /* Properties */ gchar * id; - ApplicationIndicatorCategory category; - ApplicationIndicatorStatus status; + AppIndicatorCategory category; + AppIndicatorStatus status; gchar * icon_name; gchar * attention_icon_name; DbusmenuServer * menu; @@ -81,38 +81,38 @@ enum { #define PROP_CONNECTED_S "connected" /* Private macro, shhhh! */ -#define APPLICATION_INDICATOR_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), APPLICATION_INDICATOR_TYPE, ApplicationIndicatorPrivate)) +#define APP_INDICATOR_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), APP_INDICATOR_TYPE, AppIndicatorPrivate)) /* Boiler plate */ -static void application_indicator_class_init (ApplicationIndicatorClass *klass); -static void application_indicator_init (ApplicationIndicator *self); -static void application_indicator_dispose (GObject *object); -static void application_indicator_finalize (GObject *object); +static void app_indicator_class_init (AppIndicatorClass *klass); +static void app_indicator_init (AppIndicator *self); +static void app_indicator_dispose (GObject *object); +static void app_indicator_finalize (GObject *object); /* Property functions */ -static void application_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void application_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static void app_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* Other stuff */ -static void check_connect (ApplicationIndicator * self); +static void check_connect (AppIndicator * self); static void register_service_cb (DBusGProxy * proxy, GError * error, gpointer data); /* GObject type */ -G_DEFINE_TYPE (ApplicationIndicator, application_indicator, G_TYPE_OBJECT); +G_DEFINE_TYPE (AppIndicator, app_indicator, G_TYPE_OBJECT); static void -application_indicator_class_init (ApplicationIndicatorClass *klass) +app_indicator_class_init (AppIndicatorClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (ApplicationIndicatorPrivate)); + g_type_class_add_private (klass, sizeof (AppIndicatorPrivate)); /* Clean up */ - object_class->dispose = application_indicator_dispose; - object_class->finalize = application_indicator_finalize; + object_class->dispose = app_indicator_dispose; + object_class->finalize = app_indicator_finalize; /* Property funcs */ - object_class->set_property = application_indicator_set_property; - object_class->get_property = application_indicator_get_property; + object_class->set_property = app_indicator_set_property; + object_class->get_property = app_indicator_get_property; /* Properties */ g_object_class_install_property(object_class, PROP_ID, @@ -133,8 +133,8 @@ application_indicator_class_init (ApplicationIndicatorClass *klass) g_param_spec_enum(PROP_CATEGORY_ENUM_S, "Indicator Category", "The type of indicator that this represents. Please don't use 'other'. Defaults to 'Application Status'.", - APPLICATION_INDICATOR_TYPE_INDICATOR_CATEGORY, - APPLICATION_INDICATOR_CATEGORY_APPLICATION_STATUS, + APP_INDICATOR_TYPE_INDICATOR_CATEGORY, + APP_INDICATOR_CATEGORY_APPLICATION_STATUS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(object_class, PROP_STATUS, @@ -148,8 +148,8 @@ application_indicator_class_init (ApplicationIndicatorClass *klass) g_param_spec_enum(PROP_STATUS_ENUM_S, "Indicator Status", "Whether the indicator is shown or requests attention. Defaults to 'off'.", - APPLICATION_INDICATOR_TYPE_INDICATOR_STATUS, - APPLICATION_INDICATOR_STATUS_PASSIVE, + APP_INDICATOR_TYPE_INDICATOR_STATUS, + APP_INDICATOR_STATUS_PASSIVE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(object_class, PROP_ICON_NAME, @@ -191,81 +191,81 @@ application_indicator_class_init (ApplicationIndicatorClass *klass) /* Signals */ /** - ApplicationIndicator::new-icon: - @arg0: The #ApplicationIndicator object + AppIndicator::new-icon: + @arg0: The #AppIndicator object Signaled when there is a new icon set for the object. */ - signals[NEW_ICON] = g_signal_new (APPLICATION_INDICATOR_SIGNAL_NEW_ICON, + signals[NEW_ICON] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_ICON, G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationIndicatorClass, new_icon), + G_STRUCT_OFFSET (AppIndicatorClass, new_icon), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** - ApplicationIndicator::new-attention-icon: - @arg0: The #ApplicationIndicator object + AppIndicator::new-attention-icon: + @arg0: The #AppIndicator object Signaled when there is a new attention icon set for the object. */ - signals[NEW_ATTENTION_ICON] = g_signal_new (APPLICATION_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, + signals[NEW_ATTENTION_ICON] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationIndicatorClass, new_attention_icon), + G_STRUCT_OFFSET (AppIndicatorClass, new_attention_icon), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** - ApplicationIndicator::new-status: - @arg0: The #ApplicationIndicator object - @arg1: The string value of the #ApplicationIndicatorStatus enum. + AppIndicator::new-status: + @arg0: The #AppIndicator object + @arg1: The string value of the #AppIndicatorStatus enum. Signaled when the status of the indicator changes. */ - signals[NEW_STATUS] = g_signal_new (APPLICATION_INDICATOR_SIGNAL_NEW_STATUS, + signals[NEW_STATUS] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_STATUS, G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationIndicatorClass, new_status), + G_STRUCT_OFFSET (AppIndicatorClass, new_status), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); /** - ApplicationIndicator::connection-changed: - @arg0: The #ApplicationIndicator object + AppIndicator::connection-changed: + @arg0: The #AppIndicator object @arg1: Whether we're connected or not Signaled when we connect to a watcher, or when it drops away. */ - signals[CONNECTION_CHANGED] = g_signal_new (APPLICATION_INDICATOR_SIGNAL_CONNECTION_CHANGED, + signals[CONNECTION_CHANGED] = g_signal_new (APP_INDICATOR_SIGNAL_CONNECTION_CHANGED, G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationIndicatorClass, connection_changed), + G_STRUCT_OFFSET (AppIndicatorClass, connection_changed), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE); /* Initialize the object as a DBus type */ - dbus_g_object_type_install_info(APPLICATION_INDICATOR_TYPE, + dbus_g_object_type_install_info(APP_INDICATOR_TYPE, &dbus_glib__notification_item_server_object_info); return; } static void -application_indicator_init (ApplicationIndicator *self) +app_indicator_init (AppIndicator *self) { - ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); + AppIndicatorPrivate * priv = APP_INDICATOR_GET_PRIVATE(self); priv->id = NULL; - priv->category = APPLICATION_INDICATOR_CATEGORY_OTHER; - priv->status = APPLICATION_INDICATOR_STATUS_PASSIVE; + priv->category = APP_INDICATOR_CATEGORY_OTHER; + priv->status = APP_INDICATOR_STATUS_PASSIVE; priv->icon_name = NULL; priv->attention_icon_name = NULL; priv->menu = NULL; @@ -292,15 +292,15 @@ application_indicator_init (ApplicationIndicator *self) /* Free all objects, make sure that all the dbus signals are sent out before we shut this down. */ static void -application_indicator_dispose (GObject *object) +app_indicator_dispose (GObject *object) { - ApplicationIndicator * self = APPLICATION_INDICATOR(object); + AppIndicator * self = APP_INDICATOR(object); g_return_if_fail(self != NULL); - ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); + AppIndicatorPrivate * priv = APP_INDICATOR_GET_PRIVATE(self); - if (priv->status != APPLICATION_INDICATOR_STATUS_PASSIVE) { - application_indicator_set_status(self, APPLICATION_INDICATOR_STATUS_PASSIVE); + if (priv->status != APP_INDICATOR_STATUS_PASSIVE) { + app_indicator_set_status(self, APP_INDICATOR_STATUS_PASSIVE); } if (priv->menu != NULL) { @@ -314,21 +314,21 @@ application_indicator_dispose (GObject *object) priv->watcher_proxy = NULL; } - G_OBJECT_CLASS (application_indicator_parent_class)->dispose (object); + G_OBJECT_CLASS (app_indicator_parent_class)->dispose (object); return; } /* Free all of the memory that we could be using in the object. */ static void -application_indicator_finalize (GObject *object) +app_indicator_finalize (GObject *object) { - ApplicationIndicator * self = APPLICATION_INDICATOR(object); + AppIndicator * self = APP_INDICATOR(object); g_return_if_fail(self != NULL); - ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); + AppIndicatorPrivate * priv = APP_INDICATOR_GET_PRIVATE(self); - if (priv->status != APPLICATION_INDICATOR_STATUS_PASSIVE) { + if (priv->status != APP_INDICATOR_STATUS_PASSIVE) { g_warning("Finalizing Application Status with the status set to: %d", priv->status); } @@ -347,7 +347,7 @@ application_indicator_finalize (GObject *object) priv->attention_icon_name = NULL; } - G_OBJECT_CLASS (application_indicator_parent_class)->finalize (object); + G_OBJECT_CLASS (app_indicator_parent_class)->finalize (object); return; } @@ -355,12 +355,12 @@ application_indicator_finalize (GObject *object) /* Set some properties */ static void -application_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +app_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - ApplicationIndicator * self = APPLICATION_INDICATOR(object); + AppIndicator * self = APP_INDICATOR(object); g_return_if_fail(self != NULL); - ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); + AppIndicatorPrivate * priv = APP_INDICATOR_GET_PRIVATE(self); switch (prop_id) { /* *********************** */ @@ -474,12 +474,12 @@ application_indicator_set_property (GObject * object, guint prop_id, const GValu /* Function to fill our value with the property it's requesting. */ static void -application_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { - ApplicationIndicator * self = APPLICATION_INDICATOR(object); + AppIndicator * self = APP_INDICATOR(object); g_return_if_fail(self != NULL); - ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); + AppIndicatorPrivate * priv = APP_INDICATOR_GET_PRIVATE(self); switch (prop_id) { /* *********************** */ @@ -593,9 +593,9 @@ application_indicator_get_property (GObject * object, guint prop_id, GValue * va connect to things. If we do, and we're not connected, it connects for us. */ static void -check_connect (ApplicationIndicator * self) +check_connect (AppIndicator * self) { - ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(self); + AppIndicatorPrivate * priv = APP_INDICATOR_GET_PRIVATE(self); /* We're alreadying connecting or trying to connect. */ if (priv->watcher_proxy != NULL) return; @@ -626,7 +626,7 @@ check_connect (ApplicationIndicator * self) static void register_service_cb (DBusGProxy * proxy, GError * error, gpointer data) { - ApplicationIndicatorPrivate * priv = APPLICATION_INDICATOR_GET_PRIVATE(data); + AppIndicatorPrivate * priv = APP_INDICATOR_GET_PRIVATE(data); if (error != NULL) { g_warning("Unable to connect to the Notification Watcher: %s", error->message); @@ -642,14 +642,14 @@ register_service_cb (DBusGProxy * proxy, GError * error, gpointer data) /* ************************* */ /** - application_indicator_set_id: - @ci: The #ApplicationIndicator object to use + app_indicator_set_id: + @ci: The #AppIndicator object to use @id: ID to set for this indicator - Wrapper function for property #ApplicationIndicator::id. + Wrapper function for property #AppIndicator::id. */ void -application_indicator_set_id (ApplicationIndicator * ci, const gchar * id) +app_indicator_set_id (AppIndicator * ci, const gchar * id) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -659,47 +659,47 @@ application_indicator_set_id (ApplicationIndicator * ci, const gchar * id) } /** - application_indicator_set_category: - @ci: The #ApplicationIndicator object to use + app_indicator_set_category: + @ci: The #AppIndicator object to use @category: The category to set for this indicator - Wrapper function for property #ApplicationIndicator::category. + Wrapper function for property #AppIndicator::category. */ void -application_indicator_set_category (ApplicationIndicator * ci, ApplicationIndicatorCategory category) +app_indicator_set_category (AppIndicator * ci, AppIndicatorCategory category) { GValue value = {0}; - g_value_init(&value, APPLICATION_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_value_init(&value, APP_INDICATOR_TYPE_INDICATOR_CATEGORY); g_value_set_enum(&value, category); g_object_set_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); return; } /** - application_indicator_set_status: - @ci: The #ApplicationIndicator object to use + app_indicator_set_status: + @ci: The #AppIndicator object to use @status: The status to set for this indicator - Wrapper function for property #ApplicationIndicator::status. + Wrapper function for property #AppIndicator::status. */ void -application_indicator_set_status (ApplicationIndicator * ci, ApplicationIndicatorStatus status) +app_indicator_set_status (AppIndicator * ci, AppIndicatorStatus status) { GValue value = {0}; - g_value_init(&value, APPLICATION_INDICATOR_TYPE_INDICATOR_STATUS); + g_value_init(&value, APP_INDICATOR_TYPE_INDICATOR_STATUS); g_value_set_enum(&value, status); g_object_set_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); return; } /** - application_indicator_set_icon: - @ci: The #ApplicationIndicator object to use + app_indicator_set_icon: + @ci: The #AppIndicator object to use @icon_name: The name of the icon to set for this indicator - Wrapper function for property #ApplicationIndicator::icon. + Wrapper function for property #AppIndicator::icon. */ -void application_indicator_set_icon (ApplicationIndicator * ci, const gchar * icon_name) +void app_indicator_set_icon (AppIndicator * ci, const gchar * icon_name) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -709,14 +709,14 @@ void application_indicator_set_icon (ApplicationIndicator * ci, const gchar * ic } /** - application_indicator_set_attention_icon: - @ci: The #ApplicationIndicator object to use + app_indicator_set_attention_icon: + @ci: The #AppIndicator object to use @icon_name: The name of the attention icon to set for this indicator - Wrapper function for property #ApplicationIndicator::attention-icon. + Wrapper function for property #AppIndicator::attention-icon. */ void -application_indicator_set_attention_icon (ApplicationIndicator * ci, const gchar * icon_name) +app_indicator_set_attention_icon (AppIndicator * ci, const gchar * icon_name) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -726,14 +726,14 @@ application_indicator_set_attention_icon (ApplicationIndicator * ci, const gchar } /** - application_indicator_set_menu: - @ci: The #ApplicationIndicator object to use + app_indicator_set_menu: + @ci: The #AppIndicator object to use @menu: The object with the menu for the indicator - Wrapper function for property #ApplicationIndicator::menu. + Wrapper function for property #AppIndicator::menu. */ void -application_indicator_set_menu (ApplicationIndicator * ci, DbusmenuServer * menu) +app_indicator_set_menu (AppIndicator * ci, DbusmenuServer * menu) { GValue value = {0}; g_value_init(&value, G_TYPE_OBJECT); @@ -743,15 +743,15 @@ application_indicator_set_menu (ApplicationIndicator * ci, DbusmenuServer * menu } /** - application_indicator_get_id: - @ci: The #ApplicationIndicator object to use + app_indicator_get_id: + @ci: The #AppIndicator object to use - Wrapper function for property #ApplicationIndicator::id. + Wrapper function for property #AppIndicator::id. Return value: The current ID */ const gchar * -application_indicator_get_id (ApplicationIndicator * ci) +app_indicator_get_id (AppIndicator * ci) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -760,49 +760,49 @@ application_indicator_get_id (ApplicationIndicator * ci) } /** - application_indicator_get_category: - @ci: The #ApplicationIndicator object to use + app_indicator_get_category: + @ci: The #AppIndicator object to use - Wrapper function for property #ApplicationIndicator::category. + Wrapper function for property #AppIndicator::category. Return value: The current category. */ -ApplicationIndicatorCategory -application_indicator_get_category (ApplicationIndicator * ci) +AppIndicatorCategory +app_indicator_get_category (AppIndicator * ci) { GValue value = {0}; - g_value_init(&value, APPLICATION_INDICATOR_TYPE_INDICATOR_CATEGORY); + g_value_init(&value, APP_INDICATOR_TYPE_INDICATOR_CATEGORY); g_object_get_property(G_OBJECT(ci), PROP_CATEGORY_ENUM_S, &value); return g_value_get_enum(&value); } /** - application_indicator_get_status: - @ci: The #ApplicationIndicator object to use + app_indicator_get_status: + @ci: The #AppIndicator object to use - Wrapper function for property #ApplicationIndicator::status. + Wrapper function for property #AppIndicator::status. Return value: The current status. */ -ApplicationIndicatorStatus -application_indicator_get_status (ApplicationIndicator * ci) +AppIndicatorStatus +app_indicator_get_status (AppIndicator * ci) { GValue value = {0}; - g_value_init(&value, APPLICATION_INDICATOR_TYPE_INDICATOR_STATUS); + g_value_init(&value, APP_INDICATOR_TYPE_INDICATOR_STATUS); g_object_get_property(G_OBJECT(ci), PROP_STATUS_ENUM_S, &value); return g_value_get_enum(&value); } /** - application_indicator_get_icon: - @ci: The #ApplicationIndicator object to use + app_indicator_get_icon: + @ci: The #AppIndicator object to use - Wrapper function for property #ApplicationIndicator::icon-name. + Wrapper function for property #AppIndicator::icon-name. Return value: The current icon name. */ const gchar * -application_indicator_get_icon (ApplicationIndicator * ci) +app_indicator_get_icon (AppIndicator * ci) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -811,15 +811,15 @@ application_indicator_get_icon (ApplicationIndicator * ci) } /** - application_indicator_get_attention_icon: - @ci: The #ApplicationIndicator object to use + app_indicator_get_attention_icon: + @ci: The #AppIndicator object to use - Wrapper function for property #ApplicationIndicator::attention-icon-name. + Wrapper function for property #AppIndicator::attention-icon-name. Return value: The current attention icon name. */ const gchar * -application_indicator_get_attention_icon (ApplicationIndicator * ci) +app_indicator_get_attention_icon (AppIndicator * ci) { GValue value = {0}; g_value_init(&value, G_TYPE_STRING); @@ -828,15 +828,15 @@ application_indicator_get_attention_icon (ApplicationIndicator * ci) } /** - application_indicator_get_menu: - @ci: The #ApplicationIndicator object to use + app_indicator_get_menu: + @ci: The #AppIndicator object to use - Wrapper function for property #ApplicationIndicator::menu. + Wrapper function for property #AppIndicator::menu. Return value: The current menu being used. */ DbusmenuServer * -application_indicator_get_menu (ApplicationIndicator * ci) +app_indicator_get_menu (AppIndicator * ci) { GValue value = {0}; g_value_init(&value, G_TYPE_OBJECT); diff --git a/src/libappindicator/app-indicator.h b/src/libappindicator/app-indicator.h index 01b7239..c86d638 100644 --- a/src/libappindicator/app-indicator.h +++ b/src/libappindicator/app-indicator.h @@ -1,5 +1,5 @@ -#ifndef __APPLICATION_INDICATOR_H__ -#define __APPLICATION_INDICATOR_H__ +#ifndef __APP_INDICATOR_H__ +#define __APP_INDICATOR_H__ #include #include @@ -7,99 +7,99 @@ G_BEGIN_DECLS -#define APPLICATION_INDICATOR_TYPE (application_indicator_get_type ()) -#define APPLICATION_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), APPLICATION_INDICATOR_TYPE, ApplicationIndicator)) -#define APPLICATION_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), APPLICATION_INDICATOR_TYPE, ApplicationIndicatorClass)) -#define IS_APPLICATION_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), APPLICATION_INDICATOR_TYPE)) -#define IS_APPLICATION_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), APPLICATION_INDICATOR_TYPE)) -#define APPLICATION_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), APPLICATION_INDICATOR_TYPE, ApplicationIndicatorClass)) +#define APP_INDICATOR_TYPE (app_indicator_get_type ()) +#define APP_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), APP_INDICATOR_TYPE, AppIndicator)) +#define APP_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), APP_INDICATOR_TYPE, AppIndicatorClass)) +#define IS_APP_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), APP_INDICATOR_TYPE)) +#define IS_APP_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), APP_INDICATOR_TYPE)) +#define APP_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), APP_INDICATOR_TYPE, AppIndicatorClass)) -#define APPLICATION_INDICATOR_SIGNAL_NEW_ICON "new-icon" -#define APPLICATION_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" -#define APPLICATION_INDICATOR_SIGNAL_NEW_STATUS "new-status" -#define APPLICATION_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" +#define APP_INDICATOR_SIGNAL_NEW_ICON "new-icon" +#define APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" +#define APP_INDICATOR_SIGNAL_NEW_STATUS "new-status" +#define APP_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" /** - ApplicationIndicatorCategory: - @APPLICATION_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. - @APPLICATION_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. - @APPLICATION_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. - @APPLICATION_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. - @APPLICATION_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. + AppIndicatorCategory: + @APP_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. + @APP_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. + @APP_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. + @APP_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. + @APP_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. The category provides grouping for the indicators so that users can find indicators that are similar together. */ -typedef enum { /*< prefix=APPLICATION_INDICATOR_CATEGORY >*/ - APPLICATION_INDICATOR_CATEGORY_APPLICATION_STATUS, - APPLICATION_INDICATOR_CATEGORY_COMMUNICATIONS, - APPLICATION_INDICATOR_CATEGORY_SYSTEM_SERVICES, - APPLICATION_INDICATOR_CATEGORY_HARDWARE, - APPLICATION_INDICATOR_CATEGORY_OTHER -} ApplicationIndicatorCategory; +typedef enum { /*< prefix=APP_INDICATOR_CATEGORY >*/ + APP_INDICATOR_CATEGORY_APPLICATION_STATUS, + APP_INDICATOR_CATEGORY_COMMUNICATIONS, + APP_INDICATOR_CATEGORY_SYSTEM_SERVICES, + APP_INDICATOR_CATEGORY_HARDWARE, + APP_INDICATOR_CATEGORY_OTHER +} AppIndicatorCategory; /** - ApplicationIndicatorStatus: - @APPLICATION_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. - @APPLICATION_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. - @APPLICATION_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. + AppIndicatorStatus: + @APP_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. + @APP_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. + @APP_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. These are the states that the indicator can be on in the user's panel. The indicator by default starts - in the state @APPLICATION_INDICATOR_STATUS_OFF and can be - shown by setting it to @APPLICATION_INDICATOR_STATUS_ON. + in the state @APP_INDICATOR_STATUS_OFF and can be + shown by setting it to @APP_INDICATOR_STATUS_ON. */ -typedef enum { /*< prefix=APPLICATION_INDICATOR_STATUS >*/ - APPLICATION_INDICATOR_STATUS_PASSIVE, - APPLICATION_INDICATOR_STATUS_ACTIVE, - APPLICATION_INDICATOR_STATUS_ATTENTION -} ApplicationIndicatorStatus; +typedef enum { /*< prefix=APP_INDICATOR_STATUS >*/ + APP_INDICATOR_STATUS_PASSIVE, + APP_INDICATOR_STATUS_ACTIVE, + APP_INDICATOR_STATUS_ATTENTION +} AppIndicatorStatus; -typedef struct _ApplicationIndicator ApplicationIndicator; -typedef struct _ApplicationIndicatorClass ApplicationIndicatorClass; +typedef struct _AppIndicator AppIndicator; +typedef struct _AppIndicatorClass AppIndicatorClass; /** - ApplicationIndicatorClass: + AppIndicatorClass: @parent_class: Mia familia - @new_icon: Slot for #ApplicationIndicator::new-icon. - @new_attention_icon: Slot for #ApplicationIndicator::new-attention-icon. - @new_status: Slot for #ApplicationIndicator::new-status. - @connection_changed: Slot for #ApplicationIndicator::connection-changed. - @application_indicator_reserved_1: Reserved for future use. - @application_indicator_reserved_2: Reserved for future use. - @application_indicator_reserved_3: Reserved for future use. - @application_indicator_reserved_4: Reserved for future use. - - The signals and external functions that make up the #ApplicationIndicator + @new_icon: Slot for #AppIndicator::new-icon. + @new_attention_icon: Slot for #AppIndicator::new-attention-icon. + @new_status: Slot for #AppIndicator::new-status. + @connection_changed: Slot for #AppIndicator::connection-changed. + @app_indicator_reserved_1: Reserved for future use. + @app_indicator_reserved_2: Reserved for future use. + @app_indicator_reserved_3: Reserved for future use. + @app_indicator_reserved_4: Reserved for future use. + + The signals and external functions that make up the #AppIndicator class object. */ -struct _ApplicationIndicatorClass { +struct _AppIndicatorClass { /* Parent */ GObjectClass parent_class; /* DBus Signals */ - void (* new_icon) (ApplicationIndicator * indicator, + void (* new_icon) (AppIndicator * indicator, gpointer user_data); - void (* new_attention_icon) (ApplicationIndicator * indicator, + void (* new_attention_icon) (AppIndicator * indicator, gpointer user_data); - void (* new_status) (ApplicationIndicator * indicator, + void (* new_status) (AppIndicator * indicator, gchar * status_string, gpointer user_data); /* Local Signals */ - void (* connection_changed) (ApplicationIndicator * indicator, + void (* connection_changed) (AppIndicator * indicator, gboolean connected, gpointer user_data); /* Reserved */ - void (*application_indicator_reserved_1)(void); - void (*application_indicator_reserved_2)(void); - void (*application_indicator_reserved_3)(void); - void (*application_indicator_reserved_4)(void); + void (*app_indicator_reserved_1)(void); + void (*app_indicator_reserved_2)(void); + void (*app_indicator_reserved_3)(void); + void (*app_indicator_reserved_4)(void); }; /** - ApplicationIndicator: + AppIndicator: @parent: Parent object. A application indicator represents the values that are needed to show a @@ -107,35 +107,35 @@ struct _ApplicationIndicatorClass { should try to fit in the other indicators that are available on the panel before using this. But, sometimes it is necissary. */ -struct _ApplicationIndicator { +struct _AppIndicator { GObject parent; /* None. We're a very private object. */ }; /* GObject Stuff */ -GType application_indicator_get_type (void); +GType app_indicator_get_type (void); /* Set properties */ -void application_indicator_set_id (ApplicationIndicator * ci, - const gchar * id); -void application_indicator_set_category (ApplicationIndicator * ci, - ApplicationIndicatorCategory category); -void application_indicator_set_status (ApplicationIndicator * ci, - ApplicationIndicatorStatus status); -void application_indicator_set_icon (ApplicationIndicator * ci, - const gchar * icon_name); -void application_indicator_set_attention_icon (ApplicationIndicator * ci, - const gchar * icon_name); -void application_indicator_set_menu (ApplicationIndicator * ci, - DbusmenuServer * menu); +void app_indicator_set_id (AppIndicator * ci, + const gchar * id); +void app_indicator_set_category (AppIndicator * ci, + AppIndicatorCategory category); +void app_indicator_set_status (AppIndicator * ci, + AppIndicatorStatus status); +void app_indicator_set_icon (AppIndicator * ci, + const gchar * icon_name); +void app_indicator_set_attention_icon (AppIndicator * ci, + const gchar * icon_name); +void app_indicator_set_menu (AppIndicator * ci, + DbusmenuServer * menu); /* Get properties */ -const gchar * application_indicator_get_id (ApplicationIndicator * ci); -ApplicationIndicatorCategory application_indicator_get_category (ApplicationIndicator * ci); -ApplicationIndicatorStatus application_indicator_get_status (ApplicationIndicator * ci); -const gchar * application_indicator_get_icon (ApplicationIndicator * ci); -const gchar * application_indicator_get_attention_icon (ApplicationIndicator * ci); -DbusmenuServer * application_indicator_get_menu (ApplicationIndicator * ci); +const gchar * app_indicator_get_id (AppIndicator * ci); +AppIndicatorCategory app_indicator_get_category (AppIndicator * ci); +AppIndicatorStatus app_indicator_get_status (AppIndicator * ci); +const gchar * app_indicator_get_icon (AppIndicator * ci); +const gchar * app_indicator_get_attention_icon (AppIndicator * ci); +DbusmenuServer * app_indicator_get_menu (AppIndicator * ci); G_END_DECLS -- cgit v1.2.3