From b687b3aefb3b7a231d18dea06ca511b990049487 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jan 2009 16:07:22 -0600 Subject: Changing to showing the inicator and make it so that we dont' crash right now. --- libindicate/indicator.c | 16 ++++++++++++++++ libindicate/indicator.h | 2 ++ libindicate/tests/indicate-and-crash.c | 4 ++-- 3 files changed, 20 insertions(+), 2 deletions(-) (limited to 'libindicate') diff --git a/libindicate/indicator.c b/libindicate/indicator.c index 2db8468..3e168c9 100644 --- a/libindicate/indicator.c +++ b/libindicate/indicator.c @@ -4,6 +4,8 @@ /* Signals */ enum { + HIDE, + SHOW, USER_DISPLAY, LAST_SIGNAL }; @@ -65,3 +67,17 @@ indicate_indicator_new (void) return indicator; } +void +indicate_indicator_show (IndicateIndicator * indicator) +{ + + +} + +void +indicate_indicator_hide (IndicateIndicator * indicator) +{ + + +} + diff --git a/libindicate/indicator.h b/libindicate/indicator.h index 77fd82f..976e4b6 100644 --- a/libindicate/indicator.h +++ b/libindicate/indicator.h @@ -33,6 +33,8 @@ struct _IndicateIndicator { struct _IndicateIndicatorClass { GObjectClass parent_class; + void (*hide) (IndicateIndicator * indicator, gpointer data); + void (*show) (IndicateIndicator * indicator, gpointer data); void (*user_display) (IndicateIndicator * indicator, gpointer data); gchar * (*get_type) (IndicateIndicator * indicator); diff --git a/libindicate/tests/indicate-and-crash.c b/libindicate/tests/indicate-and-crash.c index 1886a24..fbc32b0 100644 --- a/libindicate/tests/indicate-and-crash.c +++ b/libindicate/tests/indicate-and-crash.c @@ -10,9 +10,9 @@ main (int argc, char ** argv) g_type_init(); IndicateIndicator * indicator = indicate_indicator_new(); - indicate_server_show(indicator->server); + indicator_show(indicator->server); - g_timeout_add_seconds(15, crashfunc, NULL); + //g_timeout_add_seconds(15, crashfunc, NULL); g_main_loop_run(g_main_loop_new(NULL, FALSE)); -- cgit v1.2.3 From 3d55f9063f2ee1a1a472f5a7b0b4bfa4a798b1f9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jan 2009 16:17:25 -0600 Subject: Basic show hide support in the indicator --- libindicate/indicator.c | 22 +++++++++++++++++++--- libindicate/indicator.h | 2 ++ libindicate/tests/indicate-and-crash.c | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) (limited to 'libindicate') diff --git a/libindicate/indicator.c b/libindicate/indicator.c index 3e168c9..43eac55 100644 --- a/libindicate/indicator.c +++ b/libindicate/indicator.c @@ -33,6 +33,20 @@ indicate_indicator_class_init (IndicateIndicatorClass * class) NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + signals[HIDE] = g_signal_new(INDICATE_INDICATOR_SIGNAL_HIDE, + G_TYPE_FROM_CLASS(class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(IndicateIndicatorClass, hide), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals[SHOW] = g_signal_new(INDICATE_INDICATOR_SIGNAL_SHOW, + G_TYPE_FROM_CLASS(class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(IndicateIndicatorClass, show), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); return; } @@ -70,14 +84,16 @@ indicate_indicator_new (void) void indicate_indicator_show (IndicateIndicator * indicator) { + if (indicator->server) { + indicate_server_show(indicator->server); + } - + g_signal_emit(indicator, signals[SHOW], NULL, G_TYPE_NONE); } void indicate_indicator_hide (IndicateIndicator * indicator) { - - + g_signal_emit(indicator, signals[HIDE], NULL, G_TYPE_NONE); } diff --git a/libindicate/indicator.h b/libindicate/indicator.h index 976e4b6..cfa93aa 100644 --- a/libindicate/indicator.h +++ b/libindicate/indicator.h @@ -16,6 +16,8 @@ /* This is a signal that signals to the indicator that the user * has done an action where they'd like this indicator to be * displayed. */ +#define INDICATE_INDICATOR_SIGNAL_HIDE "hide" +#define INDICATE_INDICATOR_SIGNAL_SHOW "show" #define INDICATE_INDICATOR_SIGNAL_DISPLAY "user-display" typedef struct _IndicateIndicator IndicateIndicator; diff --git a/libindicate/tests/indicate-and-crash.c b/libindicate/tests/indicate-and-crash.c index fbc32b0..3cf3968 100644 --- a/libindicate/tests/indicate-and-crash.c +++ b/libindicate/tests/indicate-and-crash.c @@ -10,7 +10,7 @@ main (int argc, char ** argv) g_type_init(); IndicateIndicator * indicator = indicate_indicator_new(); - indicator_show(indicator->server); + indicate_indicator_show(indicator->server); //g_timeout_add_seconds(15, crashfunc, NULL); -- cgit v1.2.3 From 2dc2f266359d30841fa2970dba0265cb22556b89 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jan 2009 16:38:46 -0600 Subject: Clean up the signal handlers and fixing the call in the test function. Now we're to the point of showing the way I think things should be. --- libindicate/indicator.c | 8 ++++++-- libindicate/server.c | 3 +++ libindicate/tests/indicate-and-crash.c | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) (limited to 'libindicate') diff --git a/libindicate/indicator.c b/libindicate/indicator.c index 43eac55..a319af2 100644 --- a/libindicate/indicator.c +++ b/libindicate/indicator.c @@ -21,6 +21,8 @@ static void indicate_indicator_finalize (GObject * object); static void indicate_indicator_class_init (IndicateIndicatorClass * class) { + g_debug("Indicator Class Initialized."); + GObjectClass * gobj; gobj = G_OBJECT_CLASS(class); @@ -54,6 +56,8 @@ indicate_indicator_class_init (IndicateIndicatorClass * class) static void indicate_indicator_init (IndicateIndicator * indicator) { + g_debug("Indicator Object Initialized."); + indicator->id = 0; indicator->server = indicate_server_ref_default(); @@ -88,12 +92,12 @@ indicate_indicator_show (IndicateIndicator * indicator) indicate_server_show(indicator->server); } - g_signal_emit(indicator, signals[SHOW], NULL, G_TYPE_NONE); + g_signal_emit(indicator, signals[SHOW], 0, TRUE); } void indicate_indicator_hide (IndicateIndicator * indicator) { - g_signal_emit(indicator, signals[HIDE], NULL, G_TYPE_NONE); + g_signal_emit(indicator, signals[HIDE], 0, TRUE); } diff --git a/libindicate/server.c b/libindicate/server.c index dd4513a..95c0a2c 100644 --- a/libindicate/server.c +++ b/libindicate/server.c @@ -44,6 +44,7 @@ static gboolean show_indicator_to_user (IndicateServer * server, guint id, GErro static void indicate_server_class_init (IndicateServerClass * class) { + g_debug("Server Class Initialized"); GObjectClass * gobj; gobj = G_OBJECT_CLASS(class); @@ -90,6 +91,8 @@ indicate_server_class_init (IndicateServerClass * class) static void indicate_server_init (IndicateServer * server) { + g_debug("Server Object Initialized"); + server->path = g_strdup("/org/freedesktop/indicate"); server->indicators = NULL; diff --git a/libindicate/tests/indicate-and-crash.c b/libindicate/tests/indicate-and-crash.c index 3cf3968..3cf4428 100644 --- a/libindicate/tests/indicate-and-crash.c +++ b/libindicate/tests/indicate-and-crash.c @@ -10,7 +10,7 @@ main (int argc, char ** argv) g_type_init(); IndicateIndicator * indicator = indicate_indicator_new(); - indicate_indicator_show(indicator->server); + indicate_indicator_show(indicator); //g_timeout_add_seconds(15, crashfunc, NULL); -- cgit v1.2.3 From 514837a37737b049827008f7685de9d49c4034ba Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jan 2009 17:15:43 -0600 Subject: Fleshing out the whole show and hide thing. We should also be signalling when indicators are added or removed from the server. --- libindicate/indicator.c | 39 +++++++++++++++++++++++++++++++++++++++ libindicate/indicator.h | 7 +++++-- libindicate/server.c | 36 ++++++++++++++++++++++++++++++++++++ libindicate/server.h | 3 +++ 4 files changed, 83 insertions(+), 2 deletions(-) (limited to 'libindicate') diff --git a/libindicate/indicator.c b/libindicate/indicator.c index a319af2..e16492d 100644 --- a/libindicate/indicator.c +++ b/libindicate/indicator.c @@ -1,5 +1,6 @@ #include "glib.h" +#include "glib/gmessages.h" #include "indicator.h" /* Signals */ @@ -59,6 +60,7 @@ indicate_indicator_init (IndicateIndicator * indicator) g_debug("Indicator Object Initialized."); indicator->id = 0; + indicator->is_visible = FALSE; indicator->server = indicate_server_ref_default(); indicate_server_add_indicator(indicator->server, indicator); @@ -88,16 +90,53 @@ indicate_indicator_new (void) void indicate_indicator_show (IndicateIndicator * indicator) { + if (indicator->is_visible) { + return; + } + if (indicator->server) { indicate_server_show(indicator->server); } + indicator->is_visible = TRUE; g_signal_emit(indicator, signals[SHOW], 0, TRUE); } void indicate_indicator_hide (IndicateIndicator * indicator) { + if (!indicator->is_visible) { + return; + } + + indicator->is_visible = FALSE; g_signal_emit(indicator, signals[HIDE], 0, TRUE); } +gboolean +indicate_indicator_is_visible (IndicateIndicator * indicator) +{ + return indicator->is_visible; +} + +guint +indicate_indicator_get_id (IndicateIndicator * indicator) +{ + g_return_val_if_fail(INDICATE_IS_INDICATOR(indicator), 0); + return indicator->id; +} + +const gchar * +indicate_indicator_get_indicator_type (IndicateIndicator * indicator) +{ + g_return_val_if_fail(INDICATE_IS_INDICATOR(indicator), NULL); + IndicateIndicatorClass * class = INDICATE_INDICATOR_GET_CLASS(indicator); + + if (class->get_type != NULL) { + return INDICATE_INDICATOR_GET_CLASS(indicator)->get_type(indicator); + } + + return NULL; +} + + diff --git a/libindicate/indicator.h b/libindicate/indicator.h index cfa93aa..3c8efc8 100644 --- a/libindicate/indicator.h +++ b/libindicate/indicator.h @@ -11,7 +11,7 @@ #define INDICATE_IS_INDICATOR(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), INDICATE_TYPE_INDICATOR)) #define INDICATE_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), INDICATE_TYPE_INDICATOR, IndicateIndicatorClass)) #define INDICATE_IS_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), INDICATE_TYPE_INDICATOR)) -#define INDICATE_INDICATOR_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), INDICATE_TYPE_INDICATOR, IndicateIndicatorCLass)) +#define INDICATE_INDICATOR_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), INDICATE_TYPE_INDICATOR, IndicateIndicatorClass)) /* This is a signal that signals to the indicator that the user * has done an action where they'd like this indicator to be @@ -29,6 +29,7 @@ struct _IndicateIndicator { GObject parent; guint id; + gboolean is_visible; IndicateServer * server; }; @@ -39,7 +40,7 @@ struct _IndicateIndicatorClass { void (*show) (IndicateIndicator * indicator, gpointer data); void (*user_display) (IndicateIndicator * indicator, gpointer data); - gchar * (*get_type) (IndicateIndicator * indicator); + const gchar * (*get_type) (IndicateIndicator * indicator); }; IndicateIndicator * indicate_indicator_new (void); @@ -51,6 +52,8 @@ void indicate_indicator_set_property (IndicateIndicator * indicator, const gchar void indicate_indicator_show (IndicateIndicator * indicator); void indicate_indicator_hide (IndicateIndicator * indicator); +gboolean indicate_indicator_is_visible (IndicateIndicator * indicator); + /* Every entry has an ID, here's how to get it */ guint indicate_indicator_get_id (IndicateIndicator * indicator); diff --git a/libindicate/server.c b/libindicate/server.c index 95c0a2c..17db3dc 100644 --- a/libindicate/server.c +++ b/libindicate/server.c @@ -95,6 +95,7 @@ indicate_server_init (IndicateServer * server) server->path = g_strdup("/org/freedesktop/indicate"); server->indicators = NULL; + server->num_hidden = 0; return; } @@ -136,11 +137,37 @@ indicate_server_show (IndicateServer * server) return; } +static void +indicator_show_cb (IndicateIndicator * indicator, IndicateServer * server) +{ + server->num_hidden--; + g_signal_emit(server, signals[INDICATOR_ADDED], 0, indicate_indicator_get_id(indicator), indicate_indicator_get_indicator_type(indicator), TRUE); + return; +} + +static void +indicator_hide_cb (IndicateIndicator * indicator, IndicateServer * server) +{ + server->num_hidden++; + g_signal_emit(server, signals[INDICATOR_REMOVED], 0, indicate_indicator_get_id(indicator), indicate_indicator_get_indicator_type(indicator), TRUE); + return; +} + void indicate_server_add_indicator (IndicateServer * server, IndicateIndicator * indicator) { g_object_ref(indicator); server->indicators = g_slist_prepend(server->indicators, indicator); + + if (!indicate_indicator_is_visible(indicator)) { + server->num_hidden++; + } else { + g_signal_emit(server, signals[INDICATOR_ADDED], 0, indicate_indicator_get_id(indicator), indicate_indicator_get_indicator_type(indicator), TRUE); + } + + g_signal_connect(indicator, INDICATE_INDICATOR_SIGNAL_SHOW, indicator_show_cb, server); + g_signal_connect(indicator, INDICATE_INDICATOR_SIGNAL_HIDE, indicator_hide_cb, server); + return; } @@ -148,6 +175,15 @@ void indicate_server_remove_indicator (IndicateServer * server, IndicateIndicator * indicator) { server->indicators = g_slist_remove(server->indicators, indicator); + if (indicate_indicator_is_visible(indicator)) { + g_signal_emit(server, signals[INDICATOR_REMOVED], 0, indicate_indicator_get_id(indicator), indicate_indicator_get_indicator_type(indicator), TRUE); + } else { + server->num_hidden--; + } + + g_signal_handlers_disconnect_by_func(indicator, indicator_show_cb, server); + g_signal_handlers_disconnect_by_func(indicator, indicator_hide_cb, server); + g_object_unref(indicator); return; } diff --git a/libindicate/server.h b/libindicate/server.h index 78c4d4b..486252c 100644 --- a/libindicate/server.h +++ b/libindicate/server.h @@ -22,6 +22,9 @@ struct _IndicateServer { gchar * path; GSList * indicators; + + // TODO: Should have a more robust way to track this, but this'll work for now + guint num_hidden; }; typedef struct _IndicateServerClass IndicateServerClass; -- cgit v1.2.3 From cd4f548dd5427b48706b29c17a8ea67d6360afd8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jan 2009 17:22:47 -0600 Subject: Whoo Hoo, we can count --- libindicate/server.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'libindicate') diff --git a/libindicate/server.c b/libindicate/server.c index 17db3dc..48f1c71 100644 --- a/libindicate/server.c +++ b/libindicate/server.c @@ -230,6 +230,11 @@ get_desktop (IndicateServer * server, gchar ** desktop_path, GError **error) static gboolean get_indicator_count (IndicateServer * server, guint * count, GError **error) { + guint lstcnt = g_slist_length(server->indicators); + + g_return_val_if_fail(server->num_hidden < lstcnt, TRUE); + + *count = lstcnt - server->num_hidden; return TRUE; } -- cgit v1.2.3