From 802b10555a5d2fe6bdbbe34cba873cf9dd60050e Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Thu, 23 Aug 2012 16:09:57 +0200 Subject: Make the panel plugin reconnect to the service when it restarts --- src/indicator-messages.c | 92 +++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 36 deletions(-) (limited to 'src/indicator-messages.c') diff --git a/src/indicator-messages.c b/src/indicator-messages.c index 946da55..b3166f5 100644 --- a/src/indicator-messages.c +++ b/src/indicator-messages.c @@ -61,6 +61,7 @@ struct _IndicatorMessages { GMenu *menu_wrapper; GMenuModel *menu; GtkWidget *image; + GtkWidget *gtkmenu; gchar *accessible_desc; }; @@ -75,6 +76,9 @@ static void indicator_messages_class_init (IndicatorMessagesClass *klass); static void indicator_messages_init (IndicatorMessages *self); static void indicator_messages_dispose (GObject *object); static void indicator_messages_finalize (GObject *object); +static void service_connection_changed (IndicatorServiceManager *sm, + gboolean connected, + gpointer user_data); static GtkImage * get_image (IndicatorObject * io); static GtkMenu * get_menu (IndicatorObject * io); static const gchar * get_accessible_desc (IndicatorObject * io); @@ -110,40 +114,14 @@ indicator_messages_class_init (IndicatorMessagesClass *klass) static void indicator_messages_init (IndicatorMessages *self) { - GDBusConnection *bus; - GError *error = NULL; - - /* Default values */ - self->service = NULL; - - /* Complex stuff */ self->service = indicator_service_manager_new_version(INDICATOR_MESSAGES_DBUS_NAME, 1); + g_signal_connect (self->service, "connection-change", + G_CALLBACK (service_connection_changed), self); - bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); - if (!bus) { - g_warning ("error connecting to the session bus: %s", error->message); - g_error_free (error); - return; - } - - self->actions = G_ACTION_GROUP (g_dbus_action_group_get (bus, - INDICATOR_MESSAGES_DBUS_NAME, - INDICATOR_MESSAGES_DBUS_OBJECT)); - - self->menu = G_MENU_MODEL (g_dbus_menu_model_get (bus, - INDICATOR_MESSAGES_DBUS_NAME, - INDICATOR_MESSAGES_DBUS_OBJECT)); - - g_signal_connect (self->menu, "items-changed", G_CALLBACK (menu_items_changed), self); + self->menu_wrapper = g_object_ref_sink (g_menu_new ()); + self->gtkmenu = gtk_menu_new_from_model (G_MENU_MODEL (self->menu_wrapper)); self->image = g_object_ref_sink (gtk_image_new ()); - gtk_widget_show (self->image); - update_root_item (self); - - self->menu_wrapper = g_menu_new (); - update_menu (self); - - g_object_unref (bus); /* make sure custom menu item types are registered (so that * gtk_model_new_from_menu can pick them up */ @@ -162,6 +140,7 @@ indicator_messages_dispose (GObject *object) g_clear_object (&self->menu_wrapper); g_clear_object (&self->actions); g_clear_object (&self->menu); + g_clear_object (&self->gtkmenu); g_clear_object (&self->image); G_OBJECT_CLASS (indicator_messages_parent_class)->dispose (object); @@ -184,11 +163,56 @@ indicator_messages_finalize (GObject *object) /* Functions */ +static void service_connection_changed (IndicatorServiceManager *sm, + gboolean connected, + gpointer user_data) +{ + IndicatorMessages *self = user_data; + GDBusConnection *bus; + GError *error = NULL; + + g_clear_object (&self->actions); + if (self->menu != NULL) { + g_signal_handlers_disconnect_by_func (self->menu, menu_items_changed, self); + g_clear_object (&self->menu); + } + if (g_menu_model_get_n_items (G_MENU_MODEL (self->menu_wrapper)) == 1) + g_menu_remove (self->menu_wrapper, 0); + + if (connected == FALSE) + return; + + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (!bus) { + g_warning ("error connecting to the session bus: %s", error->message); + g_error_free (error); + return; + } + + self->actions = G_ACTION_GROUP (g_dbus_action_group_get (bus, + INDICATOR_MESSAGES_DBUS_NAME, + INDICATOR_MESSAGES_DBUS_OBJECT)); + gtk_widget_insert_action_group (self->gtkmenu, + get_name_hint (INDICATOR_OBJECT (self)), + self->actions); + + self->menu = G_MENU_MODEL (g_dbus_menu_model_get (bus, + INDICATOR_MESSAGES_DBUS_NAME, + INDICATOR_MESSAGES_DBUS_OBJECT)); + g_signal_connect (self->menu, "items-changed", G_CALLBACK (menu_items_changed), self); + + update_root_item (self); + update_menu (self); + + g_object_unref (bus); +} + static GtkImage * get_image (IndicatorObject * io) { IndicatorMessages *self = INDICATOR_MESSAGES (io); + gtk_widget_show (self->image); return GTK_IMAGE (self->image); } @@ -196,12 +220,8 @@ static GtkMenu * get_menu (IndicatorObject * io) { IndicatorMessages *self = INDICATOR_MESSAGES (io); - GtkWidget *menu; - - menu = gtk_menu_new_from_model (G_MENU_MODEL (self->menu_wrapper)); - gtk_widget_insert_action_group (menu, get_name_hint (io), self->actions); - return GTK_MENU (menu); + return GTK_MENU (self->gtkmenu); } static const gchar * @@ -269,7 +289,7 @@ update_menu (IndicatorMessages *self) GMenuModel *popup; GMenuItem *item; - if (g_menu_model_get_n_items (self->menu) == 0) + if (self->menu == NULL || g_menu_model_get_n_items (self->menu) == 0) return; popup = g_menu_model_get_item_link (self->menu, 0, G_MENU_LINK_SUBMENU); -- cgit v1.2.3 From d79f11b267f7aebf3d306f7cf7a980a4070881a7 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Sat, 25 Aug 2012 16:11:41 +0200 Subject: Fix a memory leak and potential crash: ref_sink the widget, not the GMenu --- src/indicator-messages.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/indicator-messages.c') diff --git a/src/indicator-messages.c b/src/indicator-messages.c index b3166f5..f211ff8 100644 --- a/src/indicator-messages.c +++ b/src/indicator-messages.c @@ -118,8 +118,9 @@ indicator_messages_init (IndicatorMessages *self) g_signal_connect (self->service, "connection-change", G_CALLBACK (service_connection_changed), self); - self->menu_wrapper = g_object_ref_sink (g_menu_new ()); + self->menu_wrapper = g_menu_new (); self->gtkmenu = gtk_menu_new_from_model (G_MENU_MODEL (self->menu_wrapper)); + g_object_ref_sink (self->gtkmenu); self->image = g_object_ref_sink (gtk_image_new ()); -- cgit v1.2.3 From 2e6208ec6802d1686701ad0f2a665d155a1e1e58 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 27 Aug 2012 08:37:25 +0200 Subject: Remove unused #include --- src/indicator-messages.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src/indicator-messages.c') diff --git a/src/indicator-messages.c b/src/indicator-messages.c index f211ff8..7625aa1 100644 --- a/src/indicator-messages.c +++ b/src/indicator-messages.c @@ -32,7 +32,6 @@ with this program. If not, see . #include #include -#include #include #include "dbus-data.h" -- cgit v1.2.3 From 98f03a9d7d29ba2531d098f99c7f72b844f8213e Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 27 Aug 2012 11:53:58 +0200 Subject: Bring back the blue icon when a source is drawing attention --- src/indicator-messages.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'src/indicator-messages.c') diff --git a/src/indicator-messages.c b/src/indicator-messages.c index f211ff8..4f5a012 100644 --- a/src/indicator-messages.c +++ b/src/indicator-messages.c @@ -90,6 +90,10 @@ static void menu_items_changed (GMenuModel *menu, gint removed, gint added, gpointer user_data); +static void messages_state_changed (GActionGroup *action_group, + gchar *action_name, + GVariant *value, + gpointer user_data); G_DEFINE_TYPE (IndicatorMessages, indicator_messages, INDICATOR_OBJECT_TYPE); @@ -172,7 +176,10 @@ static void service_connection_changed (IndicatorServiceManager *sm, GDBusConnection *bus; GError *error = NULL; - g_clear_object (&self->actions); + if (self->actions != NULL) { + g_signal_handlers_disconnect_by_func (self->actions, messages_state_changed, self); + g_clear_object (&self->actions); + } if (self->menu != NULL) { g_signal_handlers_disconnect_by_func (self->menu, menu_items_changed, self); g_clear_object (&self->menu); @@ -196,6 +203,8 @@ static void service_connection_changed (IndicatorServiceManager *sm, gtk_widget_insert_action_group (self->gtkmenu, get_name_hint (INDICATOR_OBJECT (self)), self->actions); + g_signal_connect (self->actions, "action-state-changed::messages", + G_CALLBACK (messages_state_changed), self); self->menu = G_MENU_MODEL (g_dbus_menu_model_get (bus, INDICATOR_MESSAGES_DBUS_NAME, @@ -323,3 +332,19 @@ menu_items_changed (GMenuModel *menu, update_menu (self); } } + +static void +messages_state_changed (GActionGroup *action_group, + gchar *action_name, + GVariant *value, + gpointer user_data) +{ + IndicatorMessages *self = user_data; + + g_return_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)); + + if (g_variant_get_boolean (value)) + gtk_image_set_from_icon_name (GTK_IMAGE (self->image), "indicator-messages-new", GTK_ICON_SIZE_MENU); + else + gtk_image_set_from_icon_name (GTK_IMAGE (self->image), "indicator-messages", GTK_ICON_SIZE_MENU); +} -- cgit v1.2.3 From fab67a704ed6f189014a1988e641194e0f4babb1 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 27 Aug 2012 15:38:04 +0200 Subject: Show icons on status menu items This introduces IdoMenuItem, a GtkCheckMenuItem that can also show icons. This should go into libido at some point. Also, Im{App,Source}MenuItem could derive from it so that the GMenuItem-setting logic is only in one place. --- src/indicator-messages.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/indicator-messages.c') diff --git a/src/indicator-messages.c b/src/indicator-messages.c index 7625aa1..714a962 100644 --- a/src/indicator-messages.c +++ b/src/indicator-messages.c @@ -36,6 +36,7 @@ with this program. If not, see . #include "dbus-data.h" +#include "ido-menu-item.h" #include "im-app-menu-item.h" #include "im-source-menu-item.h" @@ -125,6 +126,7 @@ indicator_messages_init (IndicatorMessages *self) /* make sure custom menu item types are registered (so that * gtk_model_new_from_menu can pick them up */ + ido_menu_item_get_type (); im_app_menu_item_get_type (); im_source_menu_item_get_type (); } -- cgit v1.2.3