diff options
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-chat.c | 3 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-menu.c | 71 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-menu.h | 3 |
3 files changed, 75 insertions, 2 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c index 72e906079..b696963ac 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -3590,7 +3590,8 @@ empathy_chat_get_contact_menu (EmpathyChat *chat) menu = empathy_contact_menu_new (priv->remote_contact, EMPATHY_CONTACT_FEATURE_CALL | EMPATHY_CONTACT_FEATURE_LOG | - EMPATHY_CONTACT_FEATURE_INFO); + EMPATHY_CONTACT_FEATURE_INFO | + EMPATHY_CONTACT_FEATURE_BLOCK); } return menu; diff --git a/libempathy-gtk/empathy-contact-menu.c b/libempathy-gtk/empathy-contact-menu.c index 3bf415746..03e0db3aa 100644 --- a/libempathy-gtk/empathy-contact-menu.c +++ b/libempathy-gtk/empathy-contact-menu.c @@ -40,6 +40,8 @@ #include "empathy-ui-utils.h" #include "empathy-share-my-desktop.h" +static GtkWidget *empathy_contact_block_menu_item_new (EmpathyContact *); + GtkWidget * empathy_contact_menu_new (EmpathyContact *contact, EmpathyContactFeatureFlags features) @@ -139,6 +141,19 @@ empathy_contact_menu_new (EmpathyContact *contact, gtk_widget_show (item); } + /* Separator & Block */ + if (features & EMPATHY_CONTACT_FEATURE_BLOCK && + (item = empathy_contact_block_menu_item_new (contact)) != NULL) { + GtkWidget *sep; + + sep = gtk_separator_menu_item_new (); + gtk_menu_shell_append (shell, sep); + gtk_widget_show (sep); + + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + return menu; } @@ -214,6 +229,62 @@ empathy_contact_add_menu_item_new (EmpathyContact *contact) } static void +empathy_contact_block_menu_item_toggled (GtkCheckMenuItem *item, + EmpathyContact *contact) +{ + EmpathyContactManager *manager; + gboolean blocked; + + manager = empathy_contact_manager_dup_singleton (); + blocked = gtk_check_menu_item_get_active (item); + + empathy_contact_list_set_blocked (EMPATHY_CONTACT_LIST (manager), + contact, blocked); + + g_object_unref (manager); +} + +static GtkWidget * +empathy_contact_block_menu_item_new (EmpathyContact *contact) +{ + GtkWidget *item; + EmpathyContactManager *manager; + TpConnection *connection; + EmpathyContactListFlags flags; + gboolean blocked; + + g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + + if (!empathy_contact_manager_initialized ()) { + return NULL; + } + + manager = empathy_contact_manager_dup_singleton (); + connection = empathy_contact_get_connection (contact); + + flags = empathy_contact_manager_get_flags_for_connection (manager, + connection); + + if (!(flags & EMPATHY_CONTACT_LIST_CAN_BLOCK)) { + return NULL; + } + + item = gtk_check_menu_item_new_with_mnemonic (_("_Block Contact")); + /* FIXME: this doesn't always get updated immediately */ + blocked = empathy_contact_list_get_blocked ( + EMPATHY_CONTACT_LIST (manager), + contact); + + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), blocked); + + g_signal_connect (item, "toggled", + G_CALLBACK (empathy_contact_block_menu_item_toggled), + contact); + + return item; +} + +static void empathy_contact_chat_menu_item_activated (GtkMenuItem *item, EmpathyContact *contact) { diff --git a/libempathy-gtk/empathy-contact-menu.h b/libempathy-gtk/empathy-contact-menu.h index 2e0247420..35d6479e6 100644 --- a/libempathy-gtk/empathy-contact-menu.h +++ b/libempathy-gtk/empathy-contact-menu.h @@ -37,7 +37,8 @@ typedef enum { EMPATHY_CONTACT_FEATURE_INFO = 1 << 4, EMPATHY_CONTACT_FEATURE_FAVOURITE = 1 << 5, EMPATHY_CONTACT_FEATURE_FT = 1 << 6, - EMPATHY_CONTACT_FEATURE_ALL = (1 << 7) - 1, + EMPATHY_CONTACT_FEATURE_BLOCK = 1 << 7, + EMPATHY_CONTACT_FEATURE_ALL = (1 << 8) - 1, } EmpathyContactFeatureFlags; GtkWidget * empathy_contact_menu_new (EmpathyContact *contact, |