From 82dee9414fc6ae41006f1664c1be0636a15ca4dd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 13 Jan 2009 14:18:47 -0600 Subject: Making it so that the indicators all have unique IDs --- libindicate/indicator.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'libindicate/indicator.c') diff --git a/libindicate/indicator.c b/libindicate/indicator.c index e16492d..8121ceb 100644 --- a/libindicate/indicator.c +++ b/libindicate/indicator.c @@ -59,10 +59,9 @@ indicate_indicator_init (IndicateIndicator * indicator) { g_debug("Indicator Object Initialized."); - indicator->id = 0; indicator->is_visible = FALSE; - indicator->server = indicate_server_ref_default(); + indicator->id = indicate_server_get_next_id(indicator->server); indicate_server_add_indicator(indicator->server, indicator); return; -- cgit v1.2.3 From 1c7343c65ff2951229e028edaeffee25dd4482f9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 13 Jan 2009 14:55:06 -0600 Subject: Man, a lot of work for messing up one explaination point. --- libindicate/indicator.c | 4 ++++ libindicate/server.c | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'libindicate/indicator.c') diff --git a/libindicate/indicator.c b/libindicate/indicator.c index 8121ceb..119a479 100644 --- a/libindicate/indicator.c +++ b/libindicate/indicator.c @@ -99,6 +99,8 @@ indicate_indicator_show (IndicateIndicator * indicator) indicator->is_visible = TRUE; g_signal_emit(indicator, signals[SHOW], 0, TRUE); + + return; } void @@ -110,6 +112,8 @@ indicate_indicator_hide (IndicateIndicator * indicator) indicator->is_visible = FALSE; g_signal_emit(indicator, signals[HIDE], 0, TRUE); + + return; } gboolean diff --git a/libindicate/server.c b/libindicate/server.c index 8c0f956..08b6849 100644 --- a/libindicate/server.c +++ b/libindicate/server.c @@ -268,11 +268,12 @@ static void count_by_type (IndicateIndicator * indicator, count_by_t * cbt) { g_return_if_fail(INDICATE_IS_INDICATOR(indicator)); - if (indicate_indicator_is_visible(indicator)) { + if (!indicate_indicator_is_visible(indicator)) { return; } const gchar * type = indicate_indicator_get_indicator_type(indicator); + /* g_debug("Looking for indicator of type '%s' and have type '%s'", cbt->type, type); */ if (type == NULL && cbt->type == NULL) { cbt->count++; @@ -287,6 +288,7 @@ count_by_type (IndicateIndicator * indicator, count_by_t * cbt) static gboolean get_indicator_count_by_type (IndicateServer * server, gchar * type, guint * count, GError **error) { + /* g_debug("get_indicator_count_by_type: '%s'", type); */ count_by_t cbt; cbt.type = type; cbt.count = 0; -- cgit v1.2.3 From 4670fee8fe07e67098788396d4d124181d2ecd38 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 13 Jan 2009 15:43:14 -0600 Subject: Adding in a display function and a list by type. --- libindicate/indicator.c | 9 +++++++++ libindicate/indicator.h | 2 ++ libindicate/server.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 59 insertions(+), 1 deletion(-) (limited to 'libindicate/indicator.c') diff --git a/libindicate/indicator.c b/libindicate/indicator.c index 119a479..5d45c93 100644 --- a/libindicate/indicator.c +++ b/libindicate/indicator.c @@ -142,4 +142,13 @@ indicate_indicator_get_indicator_type (IndicateIndicator * indicator) return NULL; } +void +indicate_indicator_user_display (IndicateIndicator * indicator) +{ + if (!indicator->is_visible) { + return; + } + g_signal_emit(indicator, signals[USER_DISPLAY], 0, TRUE); + return; +} diff --git a/libindicate/indicator.h b/libindicate/indicator.h index 2a15e3b..45c4128 100644 --- a/libindicate/indicator.h +++ b/libindicate/indicator.h @@ -65,6 +65,8 @@ guint indicate_indicator_get_id (IndicateIndicator * indicator); * subclass and exported through this pretty function */ const gchar * indicate_indicator_get_indicator_type (IndicateIndicator * indicator); +void indicate_indicator_user_display (IndicateIndicator * indicator); + G_END_DECLS #endif /* INDICATE_INDICATOR_H_INCLUDED__ */ diff --git a/libindicate/server.c b/libindicate/server.c index 08b6849..01e9e35 100644 --- a/libindicate/server.c +++ b/libindicate/server.c @@ -13,6 +13,7 @@ enum { NO_GET_INDICATOR_PROPERTY_GROUP, NO_GET_INDICATOR_PROPERTIES, NO_SHOW_INDICATOR_TO_USER, + INVALID_INDICATOR_ID, LAST_ERROR }; @@ -331,6 +332,35 @@ get_indicator_list (IndicateServer * server, GArray ** indicators, GError ** err static gboolean get_indicator_list_by_type (IndicateServer * server, gchar * type, guint ** indicators, GError ** error) { + g_return_val_if_fail(INDICATE_IS_SERVER(server), TRUE); + + IndicateServerClass * class = INDICATE_SERVER_GET_CLASS(server); + g_return_val_if_fail(class->get_indicator_count != NULL, TRUE); + + if (type != NULL && type[0] == '\0') { + type = NULL; + } + + /* Can't be larger than this and it's not worth the reallocation + for the small number we have. The memory isn't worth the time. */ + *indicators = g_array_sized_new(FALSE, FALSE, sizeof(guint), g_slist_length(server->indicators) - server->num_hidden); + + GSList * iter; + int i; + for (iter = server->indicators, i = 0; iter != NULL; iter = iter->next) { + IndicateIndicator * indicator = INDICATE_INDICATOR(iter->data); + if (indicate_indicator_is_visible(indicator)) { + const gchar * itype = indicate_indicator_get_indicator_type(indicator); + guint id = indicate_indicator_get_id(indicator); + + if (type == NULL && itype == NULL) { + g_array_insert_val(*indicators, i++, id); + } else if (type == NULL || itype == NULL) { + } else if (!strcmp(type, itype)) { + g_array_insert_val(*indicators, i++, id); + } + } + } return TRUE; } @@ -359,8 +389,25 @@ get_indicator_properties (IndicateServer * server, guint id, gchar *** propertie static gboolean show_indicator_to_user (IndicateServer * server, guint id, GError ** error) { + g_return_val_if_fail(INDICATE_IS_SERVER(server), TRUE); - return TRUE; + GSList * iter; + for (iter = server->indicators; iter != NULL; iter = iter->next) { + IndicateIndicator * indicator = INDICATE_INDICATOR(iter->data); + if (indicate_indicator_get_id(indicator) == id) { + indicate_indicator_user_display(indicator); + return TRUE; + } + } + + if (error) { + g_set_error(error, + indicate_server_error_quark(), + INVALID_INDICATOR_ID, + "show_indicator_id can't be done on and invalid ID: %d", + id); + } + return FALSE; } -- cgit v1.2.3 From cb3ce99f56585ff6f4c5b9ca2fe1e6b1eb7a972c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 13 Jan 2009 23:23:58 -0600 Subject: Adding in some properties to the mix --- libindicate/indicator.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ libindicate/indicator.h | 9 +++++ 2 files changed, 98 insertions(+) (limited to 'libindicate/indicator.c') diff --git a/libindicate/indicator.c b/libindicate/indicator.c index 5d45c93..8caf8e4 100644 --- a/libindicate/indicator.c +++ b/libindicate/indicator.c @@ -16,6 +16,9 @@ static guint signals[LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE (IndicateIndicator, indicate_indicator, G_TYPE_OBJECT); static void indicate_indicator_finalize (GObject * object); +static void set_property (IndicateIndicator * indicator, const gchar * key, const gchar * data); +static const gchar * get_property (IndicateIndicator * indicator, const gchar * key); +static GPtrArray * list_properties (IndicateIndicator * indicator); /* Functions */ @@ -51,6 +54,11 @@ indicate_indicator_class_init (IndicateIndicatorClass * class) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + class->get_type = NULL; + class->set_property = set_property; + class->get_property = get_property; + class->list_properties = list_properties; + return; } @@ -60,6 +68,10 @@ indicate_indicator_init (IndicateIndicator * indicator) g_debug("Indicator Object Initialized."); indicator->is_visible = FALSE; + + indicator->properties = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + + indicator->server = indicate_server_ref_default(); indicator->id = indicate_server_get_next_id(indicator->server); indicate_server_add_indicator(indicator->server, indicator); @@ -152,3 +164,80 @@ indicate_indicator_user_display (IndicateIndicator * indicator) g_signal_emit(indicator, signals[USER_DISPLAY], 0, TRUE); return; } + +void +indicate_indicator_set_property (IndicateIndicator * indicator, const gchar * key, const gchar * data) +{ + IndicateIndicatorClass * class = INDICATE_INDICATOR_GET_CLASS(indicator); + if (class->set_property == NULL) { + return; + } + + return class->set_property(indicator, key, data); +} + +const gchar * +indicate_indicator_get_property (IndicateIndicator * indicator, const gchar * key) +{ + IndicateIndicatorClass * class = INDICATE_INDICATOR_GET_CLASS(indicator); + if (class->get_property == NULL) { + return NULL; + } + + return class->get_property(indicator, key); +} + +GPtrArray * +indicate_indicator_list_properties (IndicateIndicator * indicator) +{ + IndicateIndicatorClass * class = INDICATE_INDICATOR_GET_CLASS(indicator); + if (class->list_properties == NULL) { + return g_ptr_array_new(); + } + + return class->list_properties(indicator); +} + +static void +set_property (IndicateIndicator * indicator, const gchar * key, const gchar * data) +{ + g_return_if_fail(INDICATE_IS_INDICATOR(indicator)); + + if (key != NULL && !strcmp(key, "type")) { + g_warning("Trying to set the 'type' of an indicator which should be done through subclassing."); + return; + } + + g_hash_table_insert(indicator->properties, g_strdup(key), g_strdup(data)); + // TODO: Signal + return; +} + +static const gchar * +get_property (IndicateIndicator * indicator, const gchar * key) +{ + g_return_val_if_fail(INDICATE_IS_INDICATOR(indicator), NULL); + + if (key != NULL && !strcmp(key, "type")) { + return indicate_indicator_get_indicator_type(indicator); + } + + // TODO: Think about whether we should be strdup'ing this. Seems like overkill, but might not be. + return (const gchar *)g_hash_table_lookup(indicator->properties, key); +} + +static GPtrArray * +list_properties (IndicateIndicator * indicator) +{ + g_return_val_if_fail(INDICATE_IS_INDICATOR(indicator), g_ptr_array_new()); + + GList * keys = g_hash_table_get_keys(indicator->properties); + GPtrArray * properties = g_ptr_array_sized_new(g_list_length(keys) + 1); + + g_ptr_array_add(properties, g_strdup("type")); + for (; keys != NULL; keys = keys->next) { + g_ptr_array_add(properties, g_strdup(keys->data)); + } + + return properties; +} diff --git a/libindicate/indicator.h b/libindicate/indicator.h index 45c4128..91f08a7 100644 --- a/libindicate/indicator.h +++ b/libindicate/indicator.h @@ -33,6 +33,7 @@ struct _IndicateIndicator { guint id; gboolean is_visible; IndicateServer * server; + GHashTable * properties; }; struct _IndicateIndicatorClass { @@ -43,6 +44,9 @@ struct _IndicateIndicatorClass { void (*user_display) (IndicateIndicator * indicator, gpointer data); const gchar * (*get_type) (IndicateIndicator * indicator); + void (*set_property) (IndicateIndicator * indicator, const gchar * key, const gchar * data); + const gchar * (*get_property) (IndicateIndicator * indicator, const gchar * key); + GPtrArray * (*list_properties) (IndicateIndicator * indicator); }; GType indicate_indicator_get_type(void) G_GNUC_CONST; @@ -67,6 +71,11 @@ const gchar * indicate_indicator_get_indicator_type (IndicateIndicator * indicat void indicate_indicator_user_display (IndicateIndicator * indicator); +/* Properties handling */ +void indicate_indicator_set_property (IndicateIndicator * indicator, const gchar * key, const gchar * data); +const gchar * indicate_indicator_get_property (IndicateIndicator * indicator, const gchar * key); +GPtrArray * indicate_indicator_list_properties (IndicateIndicator * indicator); + G_END_DECLS #endif /* INDICATE_INDICATOR_H_INCLUDED__ */ -- cgit v1.2.3