From 2df3947686d42b4c7c7c26c7fb059f5a8d794c2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Thu, 16 Oct 2014 16:11:01 +0300 Subject: [PATCH] user-menu: don't allow to unselect presence --- gnome-panel/panel-menu-items.c | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/gnome-panel/panel-menu-items.c b/gnome-panel/panel-menu-items.c index 74c30e1..82521c2 100644 --- a/gnome-panel/panel-menu-items.c +++ b/gnome-panel/panel-menu-items.c @@ -96,6 +96,7 @@ struct _PanelDesktopMenuItemPrivate { GtkIconSize icon_size; #ifdef HAVE_TELEPATHY_GLIB + GSList *presence_group; GList *presence_items; guint presence_changed_id; TpAccountManager *account_manager; @@ -104,14 +105,17 @@ struct _PanelDesktopMenuItemPrivate { #ifdef HAVE_TELEPATHY_GLIB static void -panel_menu_item_activate_presence (GtkWidget *menuitem, - TpAccountManager *account_manager) +panel_menu_item_toggled_presence (GtkWidget *menuitem, + TpAccountManager *account_manager) { PanelSessionManagerPresenceType presence_type; TpConnectionPresenceType tp_presence_type; const char *status; char *message; + if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem))) + return; + presence_type = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem), "panel-menu-presence")); @@ -146,7 +150,7 @@ free_message: } static GtkWidget * -panel_menu_item_presence_new (TpAccountManager *account_manager, +panel_menu_item_presence_new (PanelDesktopMenuItem *desktop_item, PanelSessionManagerPresenceType presence_type, const char *name, const char *icon, @@ -154,12 +158,13 @@ panel_menu_item_presence_new (TpAccountManager *account_manager, { GtkWidget *item; - if (!account_manager) + if (!desktop_item->priv->account_manager) return NULL; - item = gtk_check_menu_item_new (); + item = gtk_radio_menu_item_new (desktop_item->priv->presence_group); + desktop_item->priv->presence_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (item)); + setup_menuitem (item, GTK_ICON_SIZE_INVALID, NULL, name); - gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM (item), TRUE); /* TODO: we need to add an icon at the right of this CheckMenuItem */ #if 0 @@ -174,9 +179,9 @@ panel_menu_item_presence_new (TpAccountManager *account_manager, g_object_set_data (G_OBJECT (item), "panel-menu-presence", GINT_TO_POINTER (presence_type)); - g_signal_connect (item, "activate", - G_CALLBACK (panel_menu_item_activate_presence), - account_manager); + g_signal_connect (item, "toggled", + G_CALLBACK (panel_menu_item_toggled_presence), + desktop_item->priv->account_manager); g_signal_connect (G_OBJECT (item), "button_press_event", G_CALLBACK (menu_dummy_button_press_event), NULL); @@ -1329,7 +1334,7 @@ panel_desktop_menu_item_create_menu (PanelDesktopMenuItem *desktop_item, #ifdef HAVE_TELEPATHY_GLIB desktop_item->priv->account_manager = tp_account_manager_dup (); - item = panel_menu_item_presence_new (desktop_item->priv->account_manager, + item = panel_menu_item_presence_new (desktop_item, PANEL_SESSION_MANAGER_PRESENCE_AVAILABLE, _("Available"), PANEL_ICON_USER_AVAILABLE, TRUE); @@ -1339,7 +1344,7 @@ panel_desktop_menu_item_create_menu (PanelDesktopMenuItem *desktop_item, added = TRUE; } - item = panel_menu_item_presence_new (desktop_item->priv->account_manager, + item = panel_menu_item_presence_new (desktop_item, PANEL_SESSION_MANAGER_PRESENCE_BUSY, _("Busy"), PANEL_ICON_USER_BUSY, TRUE); @@ -1537,6 +1542,7 @@ panel_desktop_menu_item_init (PanelDesktopMenuItem *menuitem) menuitem->priv = PANEL_DESKTOP_MENU_ITEM_GET_PRIVATE (menuitem); #ifdef HAVE_TELEPATHY_GLIB + menuitem->priv->presence_group = NULL; menuitem->priv->presence_items = NULL; menuitem->priv->presence_changed_id = 0; menuitem->priv->account_manager = NULL; @@ -1644,12 +1650,12 @@ panel_desktop_menu_item_on_presence_changed (PanelSessionManager *ma for_presence = GPOINTER_TO_INT (g_object_get_data (object, "panel-menu-presence")); g_signal_handlers_block_by_func (object, - panel_menu_item_activate_presence, + panel_menu_item_toggled_presence, desktop_item->priv->account_manager); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (object), - for_presence == presence_type); + if (for_presence == presence_type) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (object), TRUE); g_signal_handlers_unblock_by_func (object, - panel_menu_item_activate_presence, + panel_menu_item_toggled_presence, desktop_item->priv->account_manager); } } -- 2.1.0