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