From e16fd98511c81dceef2f063fe7a67f384713a8bc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 4 Sep 2009 17:14:23 -0500 Subject: Defining the max number of indicators and telling the server about it. --- src/app-menu-item.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/app-menu-item.c') diff --git a/src/app-menu-item.c b/src/app-menu-item.c index feb780d..ecb5b5d 100644 --- a/src/app-menu-item.c +++ b/src/app-menu-item.c @@ -27,6 +27,7 @@ with this program. If not, see . #include #include #include "app-menu-item.h" +#include "dbus-data.h" enum { COUNT_CHANGED, @@ -173,6 +174,7 @@ app_menu_item_new (IndicateListener * listener, IndicateListenerServer * server) indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_SERVER_DISPLAY); indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_SERVER_SIGNAL); + indicate_listener_set_server_max_indicators(listener, server, MAX_NUMBER_OF_INDICATORS); return self; } -- cgit v1.2.3 From 13108917542ba7a92759f311f02530a24f36dc06 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 4 Sep 2009 22:18:46 -0500 Subject: We don't need to be tracking the added and removed signals for indicators anymore. --- src/app-menu-item.c | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) (limited to 'src/app-menu-item.c') diff --git a/src/app-menu-item.c b/src/app-menu-item.c index ecb5b5d..5107540 100644 --- a/src/app-menu-item.c +++ b/src/app-menu-item.c @@ -61,8 +61,6 @@ static void app_menu_item_finalize (GObject *object); static void activate_cb (AppMenuItem * self, gpointer data); static void type_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data); static void desktop_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data); -static void indicator_added_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * type, gpointer data); -static void indicator_removed_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * type, gpointer data); static void update_label (AppMenuItem * self); @@ -121,9 +119,6 @@ app_menu_item_dispose (GObject *object) AppMenuItem * self = APP_MENU_ITEM(object); AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self); - g_signal_handlers_disconnect_by_func(G_OBJECT(priv->listener), G_CALLBACK(indicator_added_cb), self); - g_signal_handlers_disconnect_by_func(G_OBJECT(priv->listener), G_CALLBACK(indicator_removed_cb), self); - g_object_unref(priv->listener); G_OBJECT_CLASS (app_menu_item_parent_class)->dispose (object); @@ -164,9 +159,6 @@ app_menu_item_new (IndicateListener * listener, IndicateListenerServer * server) priv->server = server; /* Can not ref as not real GObject */ - g_signal_connect(G_OBJECT(listener), INDICATE_LISTENER_SIGNAL_INDICATOR_ADDED, G_CALLBACK(indicator_added_cb), self); - g_signal_connect(G_OBJECT(listener), INDICATE_LISTENER_SIGNAL_INDICATOR_REMOVED, G_CALLBACK(indicator_removed_cb), self); - indicate_listener_server_get_type(listener, server, type_cb, self); indicate_listener_server_get_desktop(listener, server, desktop_cb, self); @@ -270,46 +262,6 @@ activate_cb (AppMenuItem * self, gpointer data) return; } -static void -indicator_added_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * type, gpointer data) -{ - g_return_if_fail(IS_APP_MENU_ITEM(data)); - AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(data); - - if (g_strcmp0(INDICATE_LISTENER_SERVER_DBUS_NAME(server), INDICATE_LISTENER_SERVER_DBUS_NAME(priv->server))) { - /* Not us */ - return; - } - - priv->unreadcount++; - - update_label(APP_MENU_ITEM(data)); - g_signal_emit(G_OBJECT(data), signals[COUNT_CHANGED], 0, priv->unreadcount, TRUE); - - return; -} - -static void -indicator_removed_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * type, gpointer data) -{ - AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(data); - - if (g_strcmp0(INDICATE_LISTENER_SERVER_DBUS_NAME(server), INDICATE_LISTENER_SERVER_DBUS_NAME(priv->server))) { - /* Not us */ - return; - } - - /* Should never happen, but let's have some protection on that */ - if (priv->unreadcount > 0) { - priv->unreadcount--; - } - - update_label(APP_MENU_ITEM(data)); - g_signal_emit(G_OBJECT(data), signals[COUNT_CHANGED], 0, priv->unreadcount, TRUE); - - return; -} - guint app_menu_item_get_count (AppMenuItem * appitem) { -- cgit v1.2.3 From 3e060f4b38af60b843984ed67dd898b87fe6350b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 4 Sep 2009 22:32:49 -0500 Subject: Removing the count on the label boolean as we're detecting that differently now. --- src/app-menu-item.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) (limited to 'src/app-menu-item.c') diff --git a/src/app-menu-item.c b/src/app-menu-item.c index 5107540..5df4e97 100644 --- a/src/app-menu-item.c +++ b/src/app-menu-item.c @@ -48,7 +48,6 @@ struct _AppMenuItemPrivate GAppInfo * appinfo; gchar * desktop; guint unreadcount; - gboolean count_on_label; }; #define APP_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), APP_MENU_ITEM_TYPE, AppMenuItemPrivate)) @@ -107,8 +106,6 @@ app_menu_item_init (AppMenuItem *self) priv->appinfo = NULL; priv->desktop = NULL; priv->unreadcount = 0; - priv->count_on_label = FALSE; - return; } @@ -189,16 +186,9 @@ type_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * v priv->type = g_strdup(value); - if (!(!g_strcmp0(priv->type, "message.instant") || !g_strcmp0(priv->type, "message.micro") || !g_strcmp0(priv->type, "message.im"))) { - /* For IM and Microblogging we want the individual items, not a count */ - priv->count_on_label = TRUE; - update_label(self); - - indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_COUNT); - } else { - indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_DISPLAY); - indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_SIGNAL); - } + indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_COUNT); + indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_DISPLAY); + indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_SIGNAL); return; } @@ -208,7 +198,7 @@ update_label (AppMenuItem * self) { AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self); - if (priv->count_on_label && !priv->unreadcount < 1) { + if (priv->unreadcount > 0) { /* TRANSLATORS: This is the name of the program and the number of indicators. So it would read something like "Mail Client (5)" */ gchar * label = g_strdup_printf(_("%s (%d)"), app_menu_item_get_name(self), priv->unreadcount); -- cgit v1.2.3 From 6533f296498545bc4b46590cea25707228869ce0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 4 Sep 2009 23:55:52 -0500 Subject: Replacing type with count --- src/app-menu-item.c | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) (limited to 'src/app-menu-item.c') diff --git a/src/app-menu-item.c b/src/app-menu-item.c index 5df4e97..b20c426 100644 --- a/src/app-menu-item.c +++ b/src/app-menu-item.c @@ -24,6 +24,7 @@ with this program. If not, see . #include "config.h" #endif +#include #include #include #include "app-menu-item.h" @@ -58,7 +59,7 @@ static void app_menu_item_init (AppMenuItem *self); static void app_menu_item_dispose (GObject *object); static void app_menu_item_finalize (GObject *object); static void activate_cb (AppMenuItem * self, gpointer data); -static void type_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data); +static void count_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data); static void desktop_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data); static void update_label (AppMenuItem * self); @@ -156,41 +157,19 @@ app_menu_item_new (IndicateListener * listener, IndicateListenerServer * server) priv->server = server; /* Can not ref as not real GObject */ - indicate_listener_server_get_type(listener, server, type_cb, self); indicate_listener_server_get_desktop(listener, server, desktop_cb, self); + indicate_listener_server_get_count(listener, server, count_cb, self); g_signal_connect(G_OBJECT(self), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), NULL); indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_SERVER_DISPLAY); indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_SERVER_SIGNAL); - indicate_listener_set_server_max_indicators(listener, server, MAX_NUMBER_OF_INDICATORS); - - return self; -} - -static void -type_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data) -{ - AppMenuItem * self = APP_MENU_ITEM(data); - AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self); - - if (priv->type != NULL) { - g_free(priv->type); - priv->type = NULL; - } - - if (value == NULL) { - g_warning("Type value is NULL, that shouldn't really happen"); - return; - } - - priv->type = g_strdup(value); - indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_COUNT); indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_DISPLAY); indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_SIGNAL); + indicate_listener_set_server_max_indicators(listener, server, MAX_NUMBER_OF_INDICATORS); - return; + return self; } static void @@ -211,6 +190,28 @@ update_label (AppMenuItem * self) return; } +/* Callback for getting the count property off + of the server. */ +static void +count_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data) +{ + AppMenuItem * self = APP_MENU_ITEM(data); + AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self); + + int count = atoi(value); + if (priv->unreadcount != count) { + priv->unreadcount = count; + update_label(self); + g_signal_emit(G_OBJECT(self), signals[COUNT_CHANGED], 0, priv->unreadcount, TRUE); + } + + return; +} + +/* Callback for when we ask the server for the path + to it's desktop file. We then turn it into an + app structure and start sucking data out of it. + Mostly the name. */ static void desktop_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data) { -- cgit v1.2.3 From a081622756ff3cecfa42d6f623ae69c5806c5bcd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sat, 5 Sep 2009 11:08:59 -0500 Subject: Setting up the listener signal to make it so that we know when the count changes. Using the property call back and just calling that function. --- src/app-menu-item.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) (limited to 'src/app-menu-item.c') diff --git a/src/app-menu-item.c b/src/app-menu-item.c index b20c426..ba71ef5 100644 --- a/src/app-menu-item.c +++ b/src/app-menu-item.c @@ -59,12 +59,12 @@ static void app_menu_item_init (AppMenuItem *self); static void app_menu_item_dispose (GObject *object); static void app_menu_item_finalize (GObject *object); static void activate_cb (AppMenuItem * self, gpointer data); +static void count_changed (IndicateListener * listener, IndicateListenerServer * server, guint count, gpointer data); static void count_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data); static void desktop_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data); static void update_label (AppMenuItem * self); - - +/* GObject Boilerplate */ G_DEFINE_TYPE (AppMenuItem, app_menu_item, DBUSMENU_TYPE_MENUITEM); static void @@ -152,11 +152,17 @@ app_menu_item_new (IndicateListener * listener, IndicateListenerServer * server) AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self); + /* Copy the listener so we can use it later */ priv->listener = listener; g_object_ref(G_OBJECT(listener)); - priv->server = server; + /* Can not ref as not real GObject */ + priv->server = server; + + /* Set up listener signals */ + g_signal_connect(G_OBJECT(listener), INDICATE_LISTENER_SIGNAL_SERVER_COUNT_CHANGED, G_CALLBACK(count_changed), self); + /* Get the values we care about from the server */ indicate_listener_server_get_desktop(listener, server, desktop_cb, self); indicate_listener_server_get_count(listener, server, count_cb, self); @@ -190,15 +196,16 @@ update_label (AppMenuItem * self) return; } -/* Callback for getting the count property off - of the server. */ -static void -count_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data) +/* Callback to the signal that the server count + has changed to a new value. This checks to see if + it's actually changed and if so signals everyone and + updates the label. */ +static void +count_changed (IndicateListener * listener, IndicateListenerServer * server, guint count, gpointer data) { AppMenuItem * self = APP_MENU_ITEM(data); AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self); - int count = atoi(value); if (priv->unreadcount != count) { priv->unreadcount = count; update_label(self); @@ -208,6 +215,20 @@ count_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * return; } +/* Callback for getting the count property off + of the server. */ +static void +count_cb (IndicateListener * listener, IndicateListenerServer * server, gchar * value, gpointer data) +{ + g_return_if_fail(value != NULL); + g_return_if_fail(value[0] != '\0'); + + int count = atoi(value); + count_changed(listener, server, count, data); + + return; +} + /* Callback for when we ask the server for the path to it's desktop file. We then turn it into an app structure and start sucking data out of it. -- cgit v1.2.3