From 8fa7b92aff19e9e944bccda838c1c326c127275a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 24 Nov 2009 21:51:43 -0600 Subject: Name changes --- autogen.sh | 2 +- configure.ac | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/autogen.sh b/autogen.sh index 5bdd6c1..6480bd3 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,6 +1,6 @@ #!/bin/sh -PKG_NAME="indicator-custom" +PKG_NAME="indicator-application" which gnome-autogen.sh || { echo "You need gnome-common from GNOME SVN" diff --git a/configure.ac b/configure.ac index d76aec8..4f1a1f6 100644 --- a/configure.ac +++ b/configure.ac @@ -1,11 +1,11 @@ -AC_INIT(indicator-custom, 0.0.1, ted@canonical.com) +AC_INIT(indicator-application, 0.0.1, ted@canonical.com) AC_COPYRIGHT([Copyright 2009 Canonical]) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-custom, 0.0.1) +AM_INIT_AUTOMAKE(indicator-application, 0.0.1) AM_MAINTAINER_MODE -- cgit v1.2.3 From f4d0952ef94f63d9bdce55d9e408802c538a1728 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 24 Nov 2009 21:52:40 -0600 Subject: Name changed --- data/Makefile.am | 6 +++--- data/indicator-application.service.in | 3 +++ data/indicator-custom.service.in | 3 --- 3 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 data/indicator-application.service.in delete mode 100644 data/indicator-custom.service.in diff --git a/data/Makefile.am b/data/Makefile.am index e93e589..cc1961b 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,11 +1,11 @@ dbus_servicesdir = $(DBUSSERVICEDIR) -dbus_services_DATA = indicator-custom.service +dbus_services_DATA = indicator-application.service %.service: %.service.in sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ -EXTRA_DIST = indicator-custom.service.in +EXTRA_DIST = indicator-application.service.in -CLEANFILES = indicator-custom.service +CLEANFILES = indicator-application.service diff --git a/data/indicator-application.service.in b/data/indicator-application.service.in new file mode 100644 index 0000000..83e430a --- /dev/null +++ b/data/indicator-application.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.ayatana.indicator.application +Exec=@libexecdir@/indicator-application-service diff --git a/data/indicator-custom.service.in b/data/indicator-custom.service.in deleted file mode 100644 index be64983..0000000 --- a/data/indicator-custom.service.in +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=org.ayatana.indicator.custom -Exec=@libexecdir@/indicator-custom-service -- 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(-) 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 e0cb52e69a8c48191d5c5a37df3fe710dcdb169d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 09:35:25 -0600 Subject: Another name change. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 4f1a1f6..2783f85 100644 --- a/configure.ac +++ b/configure.ac @@ -90,7 +90,7 @@ example/Makefile AC_MSG_NOTICE([ -Custom Indicator Configuration: +Application Indicator Configuration: Prefix: $prefix Indicator Dir: $INDICATORDIR -- 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 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(-) 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 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 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 fdd8e217404d994989962352ae06a9f8215d524f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 12:15:04 -0600 Subject: Ignoring happily again. --- .bzrignore | 53 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/.bzrignore b/.bzrignore index 672bbfe..4856033 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1,33 +1,33 @@ -data/indicator-custom.service +data/indicator-application.service compile -indicator-custom-[0-9].[0-9].[0-9].tar.gz +indicator-application-[0-9].[0-9].[0-9].tar.gz m4/ -src/indicator-custom-service -src/libcustom.la -src/libcustom_la-indicator-custom.lo +src/indicator-application-service +src/libappindicator.la +src/libappindicator_la-indicator-application.lo src/notification-item-client.h src/notification-item-server.h src/notification-watcher-client.h src/notification-watcher-server.h -src/libcustomindicator.la -src/libcustomindicator_la-custom-indicator.lo -src/libcustomindicator/custom-indicator-enum-types.h -src/libcustomindicator/custom-indicator-enum-types.c +src/libappindicator.la +src/libappindicator_la-application-indicator.lo +src/libappindicatorindicator/application-indicator-enum-types.h +src/libappindicatorindicator/application-indicator-enum-types.c src/stamp-enum-types -src/libcustomindicator_la-custom-indicator-enum-types.lo +src/libappindicator_la-application-indicator-enum-types.lo tests/.deps tests/.libs -tests/libcustomindicator-check-results.xml -tests/libcustomindicator-check-results.html -tests/test-libcustomindicator -tests/test-libcustomindicator-dbus-client -tests/test-libcustomindicator-dbus-server -tests/libcustomindicator-tests -tests/test-libcustomindicator-dbus -src/custom-service-client.h -src/custom-service-server.h -src/custom-service-marshal.c -src/custom-service-marshal.h +tests/libappindicator-check-results.xml +tests/libappindicator-check-results.html +tests/test-libappindicator +tests/test-libappindicator-dbus-client +tests/test-libappindicator-dbus-server +tests/libappindicator-tests +tests/test-libappindicator-dbus +src/application-service-client.h +src/application-service-server.h +src/application-service-marshal.c +src/application-service-marshal.h src/stamp-marshal src/dbus-properties-client.h src/dbus-properties-server.h @@ -35,5 +35,12 @@ tests/test-simple-app example/.deps example/.libs example/simple-client -src/libcustom_la-custom-service-marshal.lo -tests/libcustomindicator-tests-gtester +src/libappindicator_la-application-service-marshal.lo +tests/libappindicator-tests-gtester +src/libappindicator_la-app-indicator-enum-types.lo +src/libappindicator_la-app-indicator.lo +src/libapplication.la +src/libapplication_la-application-service-marshal.lo +src/libapplication_la-indicator-application.lo +src/libappindicator/app-indicator-enum-types.c +src/libappindicator/app-indicator-enum-types.h -- 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(-) 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. --- example/simple-client.c | 14 +- src/libappindicator/app-indicator-enum-types.h.in | 8 +- src/libappindicator/app-indicator.c | 254 +++++++++++----------- src/libappindicator/app-indicator.h | 158 +++++++------- 4 files changed, 217 insertions(+), 217 deletions(-) diff --git a/example/simple-client.c b/example/simple-client.c index f1f53e1..ff718dd 100644 --- a/example/simple-client.c +++ b/example/simple-client.c @@ -1,5 +1,5 @@ -#include "libcustomindicator/custom-indicator.h" +#include "libappindicator/app-indicator.h" #include "libdbusmenu-glib/server.h" #include "libdbusmenu-glib/menuitem.h" @@ -13,11 +13,11 @@ main (int argc, char ** argv) CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); g_assert(ci != NULL); - custom_indicator_set_id(ci, "example-simple-client"); - custom_indicator_set_category(ci, CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); - custom_indicator_set_icon(ci, "indicator-messages"); - custom_indicator_set_attention_icon(ci, "indicator-messages-new"); + app_indicator_set_id(ci, "example-simple-client"); + app_indicator_set_category(ci, CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); + app_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); + app_indicator_set_icon(ci, "indicator-messages"); + app_indicator_set_attention_icon(ci, "indicator-messages-new"); DbusmenuMenuitem * root = dbusmenu_menuitem_new(); @@ -32,7 +32,7 @@ main (int argc, char ** argv) DbusmenuServer * menuservice = dbusmenu_server_new ("/need/a/menu/path"); dbusmenu_server_set_root(menuservice, root); - custom_indicator_set_menu(ci, menuservice); + app_indicator_set_menu(ci, menuservice); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); 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 From 7cc02cf062998c6e8bc6caca4359ce5d45d6eb8a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 13:12:49 -0600 Subject: Migrating to the new 'app' world. --- example/Makefile.am | 2 +- example/simple-client.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/example/Makefile.am b/example/Makefile.am index 954b04e..f4f2ab2 100644 --- a/example/Makefile.am +++ b/example/Makefile.am @@ -16,4 +16,4 @@ simple_client_CFLAGS = \ simple_client_LDADD = \ $(INDICATOR_LIBS) \ - $(top_builddir)/src/libcustomindicator.la + $(top_builddir)/src/libappindicator.la diff --git a/example/simple-client.c b/example/simple-client.c index ff718dd..8103082 100644 --- a/example/simple-client.c +++ b/example/simple-client.c @@ -10,12 +10,12 @@ main (int argc, char ** argv) { g_type_init(); - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); + AppIndicator * ci = APP_INDICATOR(g_object_new(APP_INDICATOR_TYPE, NULL)); g_assert(ci != NULL); app_indicator_set_id(ci, "example-simple-client"); - app_indicator_set_category(ci, CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); - app_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); + app_indicator_set_category(ci, APP_INDICATOR_CATEGORY_APPLICATION_STATUS); + app_indicator_set_status(ci, APP_INDICATOR_STATUS_ACTIVE); app_indicator_set_icon(ci, "indicator-messages"); app_indicator_set_attention_icon(ci, "indicator-messages-new"); -- cgit v1.2.3 From 35d5c711028141dbca7907f550849b1bd1c8dfe7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 13:15:47 -0600 Subject: De-customizing the directory stuff. --- tests/Makefile.am | 70 +++---- tests/test-libappindicator-dbus-client.c | 272 ++++++++++++++++++++++++++++ tests/test-libappindicator-dbus-server.c | 44 +++++ tests/test-libappindicator.c | 163 +++++++++++++++++ tests/test-libcustomindicator-dbus-client.c | 272 ---------------------------- tests/test-libcustomindicator-dbus-server.c | 44 ----- tests/test-libcustomindicator.c | 163 ----------------- 7 files changed, 514 insertions(+), 514 deletions(-) create mode 100644 tests/test-libappindicator-dbus-client.c create mode 100644 tests/test-libappindicator-dbus-server.c create mode 100644 tests/test-libappindicator.c delete mode 100644 tests/test-libcustomindicator-dbus-client.c delete mode 100644 tests/test-libcustomindicator-dbus-server.c delete mode 100644 tests/test-libcustomindicator.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 0b771db..845b41c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,92 +1,92 @@ check_PROGRAMS = \ - test-libcustomindicator \ - test-libcustomindicator-dbus-client \ - test-libcustomindicator-dbus-server \ + test-libappindicator \ + test-libappindicator-dbus-client \ + test-libappindicator-dbus-server \ test-simple-app TESTS = DISTCLEANFILES = $(TESTS) ######################################### -## test-libcustomindicator +## test-libappindicator ######################################### -test_libcustomindicator_SOURCES = \ - test-libcustomindicator.c +test_libappindicator_SOURCES = \ + test-libappindicator.c -test_libcustomindicator_CFLAGS = \ +test_libappindicator_CFLAGS = \ $(INDICATOR_CFLAGS) \ -Wall -Werror \ -I$(top_srcdir)/src -test_libcustomindicator_LDADD = \ +test_libappindicator_LDADD = \ $(INDICATOR_LIBS) \ - $(top_builddir)/src/libcustomindicator.la + $(top_builddir)/src/libappindicator.la ######################################### -## test-libcustomindicator-dbus-client +## test-libappindicator-dbus-client ######################################### -test_libcustomindicator_dbus_client_SOURCES = \ +test_libappindicator_dbus_client_SOURCES = \ test-defines.h \ - test-libcustomindicator-dbus-client.c + test-libappindicator-dbus-client.c -test_libcustomindicator_dbus_client_CFLAGS = \ +test_libappindicator_dbus_client_CFLAGS = \ $(INDICATOR_CFLAGS) \ -Wall -Werror \ -I$(top_srcdir)/src -test_libcustomindicator_dbus_client_LDADD = \ +test_libappindicator_dbus_client_LDADD = \ $(INDICATOR_LIBS) \ - $(top_builddir)/src/libcustomindicator.la + $(top_builddir)/src/libappindicator.la ######################################### -## test-libcustomindicator-dbus-server +## test-libappindicator-dbus-server ######################################### -test_libcustomindicator_dbus_server_SOURCES = \ +test_libappindicator_dbus_server_SOURCES = \ test-defines.h \ - test-libcustomindicator-dbus-server.c + test-libappindicator-dbus-server.c -test_libcustomindicator_dbus_server_CFLAGS = \ +test_libappindicator_dbus_server_CFLAGS = \ $(INDICATOR_CFLAGS) \ -Wall -Werror \ -I$(top_srcdir)/src -test_libcustomindicator_dbus_server_LDADD = \ +test_libappindicator_dbus_server_LDADD = \ $(INDICATOR_LIBS) \ - $(top_builddir)/src/libcustomindicator.la + $(top_builddir)/src/libappindicator.la ######################################### ## Actual tests ######################################### -XML_REPORT = libcustomindicator-check-results.xml -HTML_REPORT = libcustomindicator-check-results.html +XML_REPORT = libappindicator-check-results.xml +HTML_REPORT = libappindicator-check-results.html -libcustomindicator-tests: libcustomindicator-tests-gtester Makefile.am +libappindicator-tests: libappindicator-tests-gtester Makefile.am @echo "#!/bin/sh" > $@ - @echo $(DBUS_RUNNER) --task ./libcustomindicator-tests-gtester >> $@ + @echo $(DBUS_RUNNER) --task ./libappindicator-tests-gtester >> $@ @chmod +x $@ -libcustomindicator-tests-gtester: test-libcustomindicator Makefile.am +libappindicator-tests-gtester: test-libappindicator Makefile.am @echo "#!/bin/sh" > $@ - @echo gtester -k --verbose -o=$(XML_REPORT) ./test-libcustomindicator >> $@ + @echo gtester -k --verbose -o=$(XML_REPORT) ./test-libappindicator >> $@ @chmod +x $@ -TESTS += libcustomindicator-tests -DISTCLEANFILES += $(XML_REPORT) $(HTML_REPORT) libcustomindicator-tests-gtester +TESTS += libappindicator-tests +DISTCLEANFILES += $(XML_REPORT) $(HTML_REPORT) libappindicator-tests-gtester DBUS_RUNNER=dbus-test-runner --dbus-config /usr/share/dbus-test-runner/session.conf -test-libcustomindicator-dbus: test-libcustomindicator-dbus-client test-libcustomindicator-dbus-server Makefile.am - @echo "#!/bin/sh" > test-libcustomindicator-dbus - @echo $(DBUS_RUNNER) --task ./test-libcustomindicator-dbus-client --task-name Client --task ./test-libcustomindicator-dbus-server --task-name Server --ignore-return >> test-libcustomindicator-dbus - @chmod +x test-libcustomindicator-dbus +test-libappindicator-dbus: test-libappindicator-dbus-client test-libappindicator-dbus-server Makefile.am + @echo "#!/bin/sh" > test-libappindicator-dbus + @echo $(DBUS_RUNNER) --task ./test-libappindicator-dbus-client --task-name Client --task ./test-libappindicator-dbus-server --task-name Server --ignore-return >> test-libappindicator-dbus + @chmod +x test-libappindicator-dbus -TESTS += test-libcustomindicator-dbus +TESTS += test-libappindicator-dbus ######################################### ## test-simple-app @@ -102,5 +102,5 @@ test_simple_app_CFLAGS = \ test_simple_app_LDADD = \ $(INDICATOR_LIBS) \ - $(top_builddir)/src/libcustomindicator.la + $(top_builddir)/src/libappindicator.la diff --git a/tests/test-libappindicator-dbus-client.c b/tests/test-libappindicator-dbus-client.c new file mode 100644 index 0000000..e0203c0 --- /dev/null +++ b/tests/test-libappindicator-dbus-client.c @@ -0,0 +1,272 @@ + +#include +#include +#include +#include "test-defines.h" + +static GMainLoop * mainloop = NULL; +static gboolean passed = TRUE; +static int propcount = 0; + +static void +check_propcount (void) +{ + if (propcount >= 6) { + g_main_loop_quit(mainloop); + } + return; +} + + +static void +prop_id_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) +{ + propcount++; + + GError * error = NULL; + GValue value = {0}; + + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + g_warning("Getting ID failed: %s", error->message); + g_error_free(error); + passed = FALSE; + check_propcount(); + return; + } + + if (g_strcmp0(TEST_ID, g_value_get_string(&value))) { + g_debug("Property ID Returned: FAILED"); + passed = FALSE; + } else { + g_debug("Property ID Returned: PASSED"); + } + + check_propcount(); + return; +} + +static void +prop_category_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) +{ + propcount++; + + GError * error = NULL; + GValue value = {0}; + + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + g_warning("Getting category failed: %s", error->message); + g_error_free(error); + passed = FALSE; + check_propcount(); + return; + } + + if (g_strcmp0(TEST_CATEGORY_S, g_value_get_string(&value))) { + g_debug("Property category Returned: FAILED"); + passed = FALSE; + } else { + g_debug("Property category Returned: PASSED"); + } + + check_propcount(); + return; +} + +static void +prop_status_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) +{ + propcount++; + + GError * error = NULL; + GValue value = {0}; + + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + g_warning("Getting status failed: %s", error->message); + g_error_free(error); + passed = FALSE; + check_propcount(); + return; + } + + if (g_strcmp0(TEST_STATE_S, g_value_get_string(&value))) { + g_debug("Property status Returned: FAILED"); + passed = FALSE; + } else { + g_debug("Property status Returned: PASSED"); + } + + check_propcount(); + return; +} + +static void +prop_icon_name_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) +{ + propcount++; + + GError * error = NULL; + GValue value = {0}; + + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + g_warning("Getting icon name failed: %s", error->message); + g_error_free(error); + passed = FALSE; + check_propcount(); + return; + } + + if (g_strcmp0(TEST_ICON_NAME, g_value_get_string(&value))) { + g_debug("Property icon name Returned: FAILED"); + passed = FALSE; + } else { + g_debug("Property icon name Returned: PASSED"); + } + + check_propcount(); + return; +} + +static void +prop_attention_icon_name_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) +{ + propcount++; + + GError * error = NULL; + GValue value = {0}; + + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + g_warning("Getting attention icon name failed: %s", error->message); + g_error_free(error); + passed = FALSE; + check_propcount(); + return; + } + + if (g_strcmp0(TEST_ATTENTION_ICON_NAME, g_value_get_string(&value))) { + g_debug("Property attention icon name Returned: FAILED"); + passed = FALSE; + } else { + g_debug("Property attention icon name Returned: PASSED"); + } + + check_propcount(); + return; +} + +static void +prop_menu_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) +{ + propcount++; + + GError * error = NULL; + GValue value = {0}; + + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + g_warning("Getting menu object failed: %s", error->message); + g_error_free(error); + passed = FALSE; + check_propcount(); + return; + } + + if (g_strcmp0(TEST_OBJECT, g_value_get_string(&value))) { + g_debug("Property menu object Returned: FAILED"); + passed = FALSE; + } else { + g_debug("Property menu object Returned: PASSED"); + } + + check_propcount(); + return; +} + +gboolean +kill_func (gpointer userdata) +{ + g_main_loop_quit(mainloop); + g_warning("Forced to Kill"); + passed = FALSE; + return FALSE; +} + +gint +main (gint argc, gchar * argv[]) +{ + g_type_init(); + + g_usleep(500000); + + 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); + return 1; + } + + DBusGProxy * props = dbus_g_proxy_new_for_name_owner(session_bus, + ":1.0", + "/need/a/path", + DBUS_INTERFACE_PROPERTIES, + &error); + if (error != NULL) { + g_error("Unable to get property proxy: %s", error->message); + return 1; + } + + dbus_g_proxy_begin_call (props, + "Get", + prop_id_cb, + NULL, NULL, + G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "Id", + G_TYPE_INVALID); + dbus_g_proxy_begin_call (props, + "Get", + prop_category_cb, + NULL, NULL, + G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "Category", + G_TYPE_INVALID); + dbus_g_proxy_begin_call (props, + "Get", + prop_status_cb, + NULL, NULL, + G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "Status", + G_TYPE_INVALID); + dbus_g_proxy_begin_call (props, + "Get", + prop_icon_name_cb, + NULL, NULL, + G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "IconName", + G_TYPE_INVALID); + dbus_g_proxy_begin_call (props, + "Get", + prop_attention_icon_name_cb, + NULL, NULL, + G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "AttentionIconName", + G_TYPE_INVALID); + dbus_g_proxy_begin_call (props, + "Get", + prop_menu_cb, + NULL, NULL, + G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "Menu", + G_TYPE_INVALID); + + g_timeout_add_seconds(2, kill_func, NULL); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + if (passed) { + g_debug("Quiting"); + return 0; + } else { + g_debug("Quiting as we're a failure"); + return 1; + } + return 0; +} diff --git a/tests/test-libappindicator-dbus-server.c b/tests/test-libappindicator-dbus-server.c new file mode 100644 index 0000000..2d61776 --- /dev/null +++ b/tests/test-libappindicator-dbus-server.c @@ -0,0 +1,44 @@ + +#include +#include +#include +#include +#include "test-defines.h" + +static GMainLoop * mainloop = NULL; + +gboolean +kill_func (gpointer userdata) +{ + g_main_loop_quit(mainloop); + return FALSE; +} + +gint +main (gint argc, gchar * argv[]) +{ + g_type_init(); + + g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL)))); + + DbusmenuServer * dms = dbusmenu_server_new(TEST_OBJECT); + + CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, + "id", TEST_ID, + "category-enum", TEST_CATEGORY, + "status-enum", TEST_STATE, + "icon-name", TEST_ICON_NAME, + "attention-icon-name", TEST_ATTENTION_ICON_NAME, + "menu-object", dms, + NULL)); + + g_timeout_add_seconds(2, kill_func, NULL); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + g_object_unref(G_OBJECT(ci)); + g_debug("Quiting"); + + return 0; +} diff --git a/tests/test-libappindicator.c b/tests/test-libappindicator.c new file mode 100644 index 0000000..c4342e8 --- /dev/null +++ b/tests/test-libappindicator.c @@ -0,0 +1,163 @@ + +#include +#include + +#include + +void +test_libcustomindicator_prop_signals_status_helper (CustomIndicator * ci, gchar * status, gboolean * signalactivated) +{ + *signalactivated = TRUE; + return; +} + +void +test_libcustomindicator_prop_signals_helper (CustomIndicator * ci, gboolean * signalactivated) +{ + *signalactivated = TRUE; + return; +} + +void +test_libcustomindicator_prop_signals (void) +{ + CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); + g_assert(ci != NULL); + + gboolean signaled = FALSE; + gulong handlerid; + + handlerid = 0; + handlerid = g_signal_connect(G_OBJECT(ci), "new-icon", G_CALLBACK(test_libcustomindicator_prop_signals_helper), &signaled); + g_assert(handlerid != 0); + + handlerid = 0; + handlerid = g_signal_connect(G_OBJECT(ci), "new-attention-icon", G_CALLBACK(test_libcustomindicator_prop_signals_helper), &signaled); + g_assert(handlerid != 0); + + handlerid = 0; + handlerid = g_signal_connect(G_OBJECT(ci), "new-status", G_CALLBACK(test_libcustomindicator_prop_signals_status_helper), &signaled); + g_assert(handlerid != 0); + + + signaled = FALSE; + custom_indicator_set_icon(ci, "bob"); + g_assert(signaled); + + signaled = FALSE; + custom_indicator_set_icon(ci, "bob"); + g_assert(!signaled); + + signaled = FALSE; + custom_indicator_set_icon(ci, "al"); + g_assert(signaled); + + + signaled = FALSE; + custom_indicator_set_attention_icon(ci, "bob"); + g_assert(signaled); + + signaled = FALSE; + custom_indicator_set_attention_icon(ci, "bob"); + g_assert(!signaled); + + signaled = FALSE; + custom_indicator_set_attention_icon(ci, "al"); + g_assert(signaled); + + + signaled = FALSE; + custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_PASSIVE); + g_assert(!signaled); + + signaled = FALSE; + custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); + g_assert(signaled); + + signaled = FALSE; + custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); + g_assert(!signaled); + + signaled = FALSE; + custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ATTENTION); + g_assert(signaled); + + return; +} + +void +test_libcustomindicator_init_set_props (void) +{ + CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); + g_assert(ci != NULL); + + custom_indicator_set_id(ci, "my-id"); + custom_indicator_set_category(ci, CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); + custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); + custom_indicator_set_icon(ci, "my-name"); + custom_indicator_set_attention_icon(ci, "my-attention-name"); + + g_assert(!g_strcmp0("my-id", custom_indicator_get_id(ci))); + g_assert(!g_strcmp0("my-name", custom_indicator_get_icon(ci))); + g_assert(!g_strcmp0("my-attention-name", custom_indicator_get_attention_icon(ci))); + g_assert(custom_indicator_get_status(ci) == CUSTOM_INDICATOR_STATUS_ACTIVE); + g_assert(custom_indicator_get_category(ci) == CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); + + g_object_unref(G_OBJECT(ci)); + return; +} + +void +test_libcustomindicator_init_with_props (void) +{ + CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, + "id", "my-id", + "category-enum", CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, + "status-enum", CUSTOM_INDICATOR_STATUS_ACTIVE, + "icon-name", "my-name", + "attention-icon-name", "my-attention-name", + NULL)); + g_assert(ci != NULL); + + g_assert(!g_strcmp0("my-id", custom_indicator_get_id(ci))); + g_assert(!g_strcmp0("my-name", custom_indicator_get_icon(ci))); + g_assert(!g_strcmp0("my-attention-name", custom_indicator_get_attention_icon(ci))); + g_assert(custom_indicator_get_status(ci) == CUSTOM_INDICATOR_STATUS_ACTIVE); + g_assert(custom_indicator_get_category(ci) == CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); + + g_object_unref(G_OBJECT(ci)); + return; +} + +void +test_libcustomindicator_init (void) +{ + CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); + g_assert(ci != NULL); + g_object_unref(G_OBJECT(ci)); + return; +} + +void +test_libcustomindicator_props_suite (void) +{ + g_test_add_func ("/indicator-custom/libcustomindicator/init", test_libcustomindicator_init); + g_test_add_func ("/indicator-custom/libcustomindicator/init_props", test_libcustomindicator_init_with_props); + g_test_add_func ("/indicator-custom/libcustomindicator/init_set_props", test_libcustomindicator_init_set_props); + g_test_add_func ("/indicator-custom/libcustomindicator/prop_signals", test_libcustomindicator_prop_signals); + + return; +} + +gint +main (gint argc, gchar * argv[]) +{ + g_type_init(); + g_test_init(&argc, &argv, NULL); + + /* Test suites */ + test_libcustomindicator_props_suite(); + + + return g_test_run (); +} diff --git a/tests/test-libcustomindicator-dbus-client.c b/tests/test-libcustomindicator-dbus-client.c deleted file mode 100644 index e0203c0..0000000 --- a/tests/test-libcustomindicator-dbus-client.c +++ /dev/null @@ -1,272 +0,0 @@ - -#include -#include -#include -#include "test-defines.h" - -static GMainLoop * mainloop = NULL; -static gboolean passed = TRUE; -static int propcount = 0; - -static void -check_propcount (void) -{ - if (propcount >= 6) { - g_main_loop_quit(mainloop); - } - return; -} - - -static void -prop_id_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting ID failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_ID, g_value_get_string(&value))) { - g_debug("Property ID Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property ID Returned: PASSED"); - } - - check_propcount(); - return; -} - -static void -prop_category_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting category failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_CATEGORY_S, g_value_get_string(&value))) { - g_debug("Property category Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property category Returned: PASSED"); - } - - check_propcount(); - return; -} - -static void -prop_status_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting status failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_STATE_S, g_value_get_string(&value))) { - g_debug("Property status Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property status Returned: PASSED"); - } - - check_propcount(); - return; -} - -static void -prop_icon_name_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting icon name failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_ICON_NAME, g_value_get_string(&value))) { - g_debug("Property icon name Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property icon name Returned: PASSED"); - } - - check_propcount(); - return; -} - -static void -prop_attention_icon_name_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting attention icon name failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_ATTENTION_ICON_NAME, g_value_get_string(&value))) { - g_debug("Property attention icon name Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property attention icon name Returned: PASSED"); - } - - check_propcount(); - return; -} - -static void -prop_menu_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting menu object failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_OBJECT, g_value_get_string(&value))) { - g_debug("Property menu object Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property menu object Returned: PASSED"); - } - - check_propcount(); - return; -} - -gboolean -kill_func (gpointer userdata) -{ - g_main_loop_quit(mainloop); - g_warning("Forced to Kill"); - passed = FALSE; - return FALSE; -} - -gint -main (gint argc, gchar * argv[]) -{ - g_type_init(); - - g_usleep(500000); - - 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); - return 1; - } - - DBusGProxy * props = dbus_g_proxy_new_for_name_owner(session_bus, - ":1.0", - "/need/a/path", - DBUS_INTERFACE_PROPERTIES, - &error); - if (error != NULL) { - g_error("Unable to get property proxy: %s", error->message); - return 1; - } - - dbus_g_proxy_begin_call (props, - "Get", - prop_id_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", - G_TYPE_STRING, "Id", - G_TYPE_INVALID); - dbus_g_proxy_begin_call (props, - "Get", - prop_category_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", - G_TYPE_STRING, "Category", - G_TYPE_INVALID); - dbus_g_proxy_begin_call (props, - "Get", - prop_status_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", - G_TYPE_STRING, "Status", - G_TYPE_INVALID); - dbus_g_proxy_begin_call (props, - "Get", - prop_icon_name_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", - G_TYPE_STRING, "IconName", - G_TYPE_INVALID); - dbus_g_proxy_begin_call (props, - "Get", - prop_attention_icon_name_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", - G_TYPE_STRING, "AttentionIconName", - G_TYPE_INVALID); - dbus_g_proxy_begin_call (props, - "Get", - prop_menu_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", - G_TYPE_STRING, "Menu", - G_TYPE_INVALID); - - g_timeout_add_seconds(2, kill_func, NULL); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - if (passed) { - g_debug("Quiting"); - return 0; - } else { - g_debug("Quiting as we're a failure"); - return 1; - } - return 0; -} diff --git a/tests/test-libcustomindicator-dbus-server.c b/tests/test-libcustomindicator-dbus-server.c deleted file mode 100644 index 2d61776..0000000 --- a/tests/test-libcustomindicator-dbus-server.c +++ /dev/null @@ -1,44 +0,0 @@ - -#include -#include -#include -#include -#include "test-defines.h" - -static GMainLoop * mainloop = NULL; - -gboolean -kill_func (gpointer userdata) -{ - g_main_loop_quit(mainloop); - return FALSE; -} - -gint -main (gint argc, gchar * argv[]) -{ - g_type_init(); - - g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL)))); - - DbusmenuServer * dms = dbusmenu_server_new(TEST_OBJECT); - - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, - "id", TEST_ID, - "category-enum", TEST_CATEGORY, - "status-enum", TEST_STATE, - "icon-name", TEST_ICON_NAME, - "attention-icon-name", TEST_ATTENTION_ICON_NAME, - "menu-object", dms, - NULL)); - - g_timeout_add_seconds(2, kill_func, NULL); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - g_object_unref(G_OBJECT(ci)); - g_debug("Quiting"); - - return 0; -} diff --git a/tests/test-libcustomindicator.c b/tests/test-libcustomindicator.c deleted file mode 100644 index c4342e8..0000000 --- a/tests/test-libcustomindicator.c +++ /dev/null @@ -1,163 +0,0 @@ - -#include -#include - -#include - -void -test_libcustomindicator_prop_signals_status_helper (CustomIndicator * ci, gchar * status, gboolean * signalactivated) -{ - *signalactivated = TRUE; - return; -} - -void -test_libcustomindicator_prop_signals_helper (CustomIndicator * ci, gboolean * signalactivated) -{ - *signalactivated = TRUE; - return; -} - -void -test_libcustomindicator_prop_signals (void) -{ - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); - g_assert(ci != NULL); - - gboolean signaled = FALSE; - gulong handlerid; - - handlerid = 0; - handlerid = g_signal_connect(G_OBJECT(ci), "new-icon", G_CALLBACK(test_libcustomindicator_prop_signals_helper), &signaled); - g_assert(handlerid != 0); - - handlerid = 0; - handlerid = g_signal_connect(G_OBJECT(ci), "new-attention-icon", G_CALLBACK(test_libcustomindicator_prop_signals_helper), &signaled); - g_assert(handlerid != 0); - - handlerid = 0; - handlerid = g_signal_connect(G_OBJECT(ci), "new-status", G_CALLBACK(test_libcustomindicator_prop_signals_status_helper), &signaled); - g_assert(handlerid != 0); - - - signaled = FALSE; - custom_indicator_set_icon(ci, "bob"); - g_assert(signaled); - - signaled = FALSE; - custom_indicator_set_icon(ci, "bob"); - g_assert(!signaled); - - signaled = FALSE; - custom_indicator_set_icon(ci, "al"); - g_assert(signaled); - - - signaled = FALSE; - custom_indicator_set_attention_icon(ci, "bob"); - g_assert(signaled); - - signaled = FALSE; - custom_indicator_set_attention_icon(ci, "bob"); - g_assert(!signaled); - - signaled = FALSE; - custom_indicator_set_attention_icon(ci, "al"); - g_assert(signaled); - - - signaled = FALSE; - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_PASSIVE); - g_assert(!signaled); - - signaled = FALSE; - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); - g_assert(signaled); - - signaled = FALSE; - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); - g_assert(!signaled); - - signaled = FALSE; - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ATTENTION); - g_assert(signaled); - - return; -} - -void -test_libcustomindicator_init_set_props (void) -{ - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); - g_assert(ci != NULL); - - custom_indicator_set_id(ci, "my-id"); - custom_indicator_set_category(ci, CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); - custom_indicator_set_icon(ci, "my-name"); - custom_indicator_set_attention_icon(ci, "my-attention-name"); - - g_assert(!g_strcmp0("my-id", custom_indicator_get_id(ci))); - g_assert(!g_strcmp0("my-name", custom_indicator_get_icon(ci))); - g_assert(!g_strcmp0("my-attention-name", custom_indicator_get_attention_icon(ci))); - g_assert(custom_indicator_get_status(ci) == CUSTOM_INDICATOR_STATUS_ACTIVE); - g_assert(custom_indicator_get_category(ci) == CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); - - g_object_unref(G_OBJECT(ci)); - return; -} - -void -test_libcustomindicator_init_with_props (void) -{ - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, - "id", "my-id", - "category-enum", CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, - "status-enum", CUSTOM_INDICATOR_STATUS_ACTIVE, - "icon-name", "my-name", - "attention-icon-name", "my-attention-name", - NULL)); - g_assert(ci != NULL); - - g_assert(!g_strcmp0("my-id", custom_indicator_get_id(ci))); - g_assert(!g_strcmp0("my-name", custom_indicator_get_icon(ci))); - g_assert(!g_strcmp0("my-attention-name", custom_indicator_get_attention_icon(ci))); - g_assert(custom_indicator_get_status(ci) == CUSTOM_INDICATOR_STATUS_ACTIVE); - g_assert(custom_indicator_get_category(ci) == CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); - - g_object_unref(G_OBJECT(ci)); - return; -} - -void -test_libcustomindicator_init (void) -{ - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); - g_assert(ci != NULL); - g_object_unref(G_OBJECT(ci)); - return; -} - -void -test_libcustomindicator_props_suite (void) -{ - g_test_add_func ("/indicator-custom/libcustomindicator/init", test_libcustomindicator_init); - g_test_add_func ("/indicator-custom/libcustomindicator/init_props", test_libcustomindicator_init_with_props); - g_test_add_func ("/indicator-custom/libcustomindicator/init_set_props", test_libcustomindicator_init_set_props); - g_test_add_func ("/indicator-custom/libcustomindicator/prop_signals", test_libcustomindicator_prop_signals); - - return; -} - -gint -main (gint argc, gchar * argv[]) -{ - g_type_init(); - g_test_init(&argc, &argv, NULL); - - /* Test suites */ - test_libcustomindicator_props_suite(); - - - return g_test_run (); -} -- cgit v1.2.3 From f0881be3b8f779e0411958e6637f8f29e5697cbb Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 30 Nov 2009 13:21:45 -0600 Subject: Changing the insides to remove the custom stuff. --- tests/test-defines.h | 4 +- tests/test-libappindicator-dbus-client.c | 14 ++--- tests/test-libappindicator-dbus-server.c | 18 +++--- tests/test-libappindicator.c | 94 ++++++++++++++++---------------- tests/test-simple-app.c | 14 ++--- 5 files changed, 72 insertions(+), 72 deletions(-) diff --git a/tests/test-defines.h b/tests/test-defines.h index 9d1fc26..11e7a24 100644 --- a/tests/test-defines.h +++ b/tests/test-defines.h @@ -2,9 +2,9 @@ #define TEST_ID "my-id" #define TEST_ICON_NAME "my-icon-name" #define TEST_ATTENTION_ICON_NAME "my-attention-icon-name" -#define TEST_STATE CUSTOM_INDICATOR_STATUS_ACTIVE +#define TEST_STATE APP_INDICATOR_STATUS_ACTIVE #define TEST_STATE_S "active" -#define TEST_CATEGORY CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS +#define TEST_CATEGORY APP_INDICATOR_CATEGORY_APPLICATION_STATUS #define TEST_CATEGORY_S "application-status" #define TEST_OBJECT "/an/object/path/to/use" diff --git a/tests/test-libappindicator-dbus-client.c b/tests/test-libappindicator-dbus-client.c index e0203c0..f8ed4b3 100644 --- a/tests/test-libappindicator-dbus-client.c +++ b/tests/test-libappindicator-dbus-client.c @@ -1,7 +1,7 @@ #include #include -#include +#include #include "test-defines.h" static GMainLoop * mainloop = NULL; @@ -217,42 +217,42 @@ main (gint argc, gchar * argv[]) "Get", prop_id_cb, NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", G_TYPE_STRING, "Id", G_TYPE_INVALID); dbus_g_proxy_begin_call (props, "Get", prop_category_cb, NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", G_TYPE_STRING, "Category", G_TYPE_INVALID); dbus_g_proxy_begin_call (props, "Get", prop_status_cb, NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", G_TYPE_STRING, "Status", G_TYPE_INVALID); dbus_g_proxy_begin_call (props, "Get", prop_icon_name_cb, NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", G_TYPE_STRING, "IconName", G_TYPE_INVALID); dbus_g_proxy_begin_call (props, "Get", prop_attention_icon_name_cb, NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", G_TYPE_STRING, "AttentionIconName", G_TYPE_INVALID); dbus_g_proxy_begin_call (props, "Get", prop_menu_cb, NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.custom.NotificationItem", + G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", G_TYPE_STRING, "Menu", G_TYPE_INVALID); diff --git a/tests/test-libappindicator-dbus-server.c b/tests/test-libappindicator-dbus-server.c index 2d61776..f7b8d9f 100644 --- a/tests/test-libappindicator-dbus-server.c +++ b/tests/test-libappindicator-dbus-server.c @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include "test-defines.h" static GMainLoop * mainloop = NULL; @@ -23,14 +23,14 @@ main (gint argc, gchar * argv[]) DbusmenuServer * dms = dbusmenu_server_new(TEST_OBJECT); - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, - "id", TEST_ID, - "category-enum", TEST_CATEGORY, - "status-enum", TEST_STATE, - "icon-name", TEST_ICON_NAME, - "attention-icon-name", TEST_ATTENTION_ICON_NAME, - "menu-object", dms, - NULL)); + AppIndicator * ci = APP_INDICATOR(g_object_new(APP_INDICATOR_TYPE, + "id", TEST_ID, + "category-enum", TEST_CATEGORY, + "status-enum", TEST_STATE, + "icon-name", TEST_ICON_NAME, + "attention-icon-name", TEST_ATTENTION_ICON_NAME, + "menu-object", dms, + NULL)); g_timeout_add_seconds(2, kill_func, NULL); diff --git a/tests/test-libappindicator.c b/tests/test-libappindicator.c index c4342e8..1d7c920 100644 --- a/tests/test-libappindicator.c +++ b/tests/test-libappindicator.c @@ -2,149 +2,149 @@ #include #include -#include +#include void -test_libcustomindicator_prop_signals_status_helper (CustomIndicator * ci, gchar * status, gboolean * signalactivated) +test_libappindicator_prop_signals_status_helper (AppIndicator * ci, gchar * status, gboolean * signalactivated) { *signalactivated = TRUE; return; } void -test_libcustomindicator_prop_signals_helper (CustomIndicator * ci, gboolean * signalactivated) +test_libappindicator_prop_signals_helper (AppIndicator * ci, gboolean * signalactivated) { *signalactivated = TRUE; return; } void -test_libcustomindicator_prop_signals (void) +test_libappindicator_prop_signals (void) { - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); + AppIndicator * ci = APP_INDICATOR(g_object_new(APP_INDICATOR_TYPE, NULL)); g_assert(ci != NULL); gboolean signaled = FALSE; gulong handlerid; handlerid = 0; - handlerid = g_signal_connect(G_OBJECT(ci), "new-icon", G_CALLBACK(test_libcustomindicator_prop_signals_helper), &signaled); + handlerid = g_signal_connect(G_OBJECT(ci), "new-icon", G_CALLBACK(test_libappindicator_prop_signals_helper), &signaled); g_assert(handlerid != 0); handlerid = 0; - handlerid = g_signal_connect(G_OBJECT(ci), "new-attention-icon", G_CALLBACK(test_libcustomindicator_prop_signals_helper), &signaled); + handlerid = g_signal_connect(G_OBJECT(ci), "new-attention-icon", G_CALLBACK(test_libappindicator_prop_signals_helper), &signaled); g_assert(handlerid != 0); handlerid = 0; - handlerid = g_signal_connect(G_OBJECT(ci), "new-status", G_CALLBACK(test_libcustomindicator_prop_signals_status_helper), &signaled); + handlerid = g_signal_connect(G_OBJECT(ci), "new-status", G_CALLBACK(test_libappindicator_prop_signals_status_helper), &signaled); g_assert(handlerid != 0); signaled = FALSE; - custom_indicator_set_icon(ci, "bob"); + app_indicator_set_icon(ci, "bob"); g_assert(signaled); signaled = FALSE; - custom_indicator_set_icon(ci, "bob"); + app_indicator_set_icon(ci, "bob"); g_assert(!signaled); signaled = FALSE; - custom_indicator_set_icon(ci, "al"); + app_indicator_set_icon(ci, "al"); g_assert(signaled); signaled = FALSE; - custom_indicator_set_attention_icon(ci, "bob"); + app_indicator_set_attention_icon(ci, "bob"); g_assert(signaled); signaled = FALSE; - custom_indicator_set_attention_icon(ci, "bob"); + app_indicator_set_attention_icon(ci, "bob"); g_assert(!signaled); signaled = FALSE; - custom_indicator_set_attention_icon(ci, "al"); + app_indicator_set_attention_icon(ci, "al"); g_assert(signaled); signaled = FALSE; - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_PASSIVE); + app_indicator_set_status(ci, APP_INDICATOR_STATUS_PASSIVE); g_assert(!signaled); signaled = FALSE; - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); + app_indicator_set_status(ci, APP_INDICATOR_STATUS_ACTIVE); g_assert(signaled); signaled = FALSE; - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); + app_indicator_set_status(ci, APP_INDICATOR_STATUS_ACTIVE); g_assert(!signaled); signaled = FALSE; - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ATTENTION); + app_indicator_set_status(ci, APP_INDICATOR_STATUS_ATTENTION); g_assert(signaled); return; } void -test_libcustomindicator_init_set_props (void) +test_libappindicator_init_set_props (void) { - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); + AppIndicator * ci = APP_INDICATOR(g_object_new(APP_INDICATOR_TYPE, NULL)); g_assert(ci != NULL); - custom_indicator_set_id(ci, "my-id"); - custom_indicator_set_category(ci, CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); - custom_indicator_set_status(ci, CUSTOM_INDICATOR_STATUS_ACTIVE); - custom_indicator_set_icon(ci, "my-name"); - custom_indicator_set_attention_icon(ci, "my-attention-name"); + app_indicator_set_id(ci, "my-id"); + app_indicator_set_category(ci, APP_INDICATOR_CATEGORY_APPLICATION_STATUS); + app_indicator_set_status(ci, APP_INDICATOR_STATUS_ACTIVE); + app_indicator_set_icon(ci, "my-name"); + app_indicator_set_attention_icon(ci, "my-attention-name"); - g_assert(!g_strcmp0("my-id", custom_indicator_get_id(ci))); - g_assert(!g_strcmp0("my-name", custom_indicator_get_icon(ci))); - g_assert(!g_strcmp0("my-attention-name", custom_indicator_get_attention_icon(ci))); - g_assert(custom_indicator_get_status(ci) == CUSTOM_INDICATOR_STATUS_ACTIVE); - g_assert(custom_indicator_get_category(ci) == CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); + g_assert(!g_strcmp0("my-id", app_indicator_get_id(ci))); + g_assert(!g_strcmp0("my-name", app_indicator_get_icon(ci))); + g_assert(!g_strcmp0("my-attention-name", app_indicator_get_attention_icon(ci))); + g_assert(app_indicator_get_status(ci) == APP_INDICATOR_STATUS_ACTIVE); + g_assert(app_indicator_get_category(ci) == APP_INDICATOR_CATEGORY_APPLICATION_STATUS); g_object_unref(G_OBJECT(ci)); return; } void -test_libcustomindicator_init_with_props (void) +test_libappindicator_init_with_props (void) { - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, + AppIndicator * ci = APP_INDICATOR(g_object_new(APP_INDICATOR_TYPE, "id", "my-id", - "category-enum", CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS, - "status-enum", CUSTOM_INDICATOR_STATUS_ACTIVE, + "category-enum", APP_INDICATOR_CATEGORY_APPLICATION_STATUS, + "status-enum", APP_INDICATOR_STATUS_ACTIVE, "icon-name", "my-name", "attention-icon-name", "my-attention-name", NULL)); g_assert(ci != NULL); - g_assert(!g_strcmp0("my-id", custom_indicator_get_id(ci))); - g_assert(!g_strcmp0("my-name", custom_indicator_get_icon(ci))); - g_assert(!g_strcmp0("my-attention-name", custom_indicator_get_attention_icon(ci))); - g_assert(custom_indicator_get_status(ci) == CUSTOM_INDICATOR_STATUS_ACTIVE); - g_assert(custom_indicator_get_category(ci) == CUSTOM_INDICATOR_CATEGORY_APPLICATION_STATUS); + g_assert(!g_strcmp0("my-id", app_indicator_get_id(ci))); + g_assert(!g_strcmp0("my-name", app_indicator_get_icon(ci))); + g_assert(!g_strcmp0("my-attention-name", app_indicator_get_attention_icon(ci))); + g_assert(app_indicator_get_status(ci) == APP_INDICATOR_STATUS_ACTIVE); + g_assert(app_indicator_get_category(ci) == APP_INDICATOR_CATEGORY_APPLICATION_STATUS); g_object_unref(G_OBJECT(ci)); return; } void -test_libcustomindicator_init (void) +test_libappindicator_init (void) { - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, NULL)); + AppIndicator * ci = APP_INDICATOR(g_object_new(APP_INDICATOR_TYPE, NULL)); g_assert(ci != NULL); g_object_unref(G_OBJECT(ci)); return; } void -test_libcustomindicator_props_suite (void) +test_libappindicator_props_suite (void) { - g_test_add_func ("/indicator-custom/libcustomindicator/init", test_libcustomindicator_init); - g_test_add_func ("/indicator-custom/libcustomindicator/init_props", test_libcustomindicator_init_with_props); - g_test_add_func ("/indicator-custom/libcustomindicator/init_set_props", test_libcustomindicator_init_set_props); - g_test_add_func ("/indicator-custom/libcustomindicator/prop_signals", test_libcustomindicator_prop_signals); + g_test_add_func ("/indicator-application/libappindicator/init", test_libappindicator_init); + g_test_add_func ("/indicator-application/libappindicator/init_props", test_libappindicator_init_with_props); + g_test_add_func ("/indicator-application/libappindicator/init_set_props", test_libappindicator_init_set_props); + g_test_add_func ("/indicator-application/libappindicator/prop_signals", test_libappindicator_prop_signals); return; } @@ -156,7 +156,7 @@ main (gint argc, gchar * argv[]) g_test_init(&argc, &argv, NULL); /* Test suites */ - test_libcustomindicator_props_suite(); + test_libappindicator_props_suite(); return g_test_run (); diff --git a/tests/test-simple-app.c b/tests/test-simple-app.c index 9e779ec..3484e9e 100644 --- a/tests/test-simple-app.c +++ b/tests/test-simple-app.c @@ -2,7 +2,7 @@ #include #include #include -#include +#include static GMainLoop * mainloop = NULL; @@ -15,12 +15,12 @@ main (int argc, char ** argv) DbusmenuMenuitem * dmi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(dmi, "label", "Bob"); - CustomIndicator * ci = CUSTOM_INDICATOR(g_object_new(CUSTOM_INDICATOR_TYPE, - "id", "test-application", - "status-enum", CUSTOM_INDICATOR_STATUS_ACTIVE, - "icon-name", "system-shutdown", - "menu-object", dms, - NULL)); + AppIndicator * ci = APP_INDICATOR(g_object_new(APP_INDICATOR_TYPE, + "id", "test-application", + "status-enum", APP_INDICATOR_STATUS_ACTIVE, + "icon-name", "system-shutdown", + "menu-object", dms, + NULL)); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); -- cgit v1.2.3