diff options
author | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-02-11 17:31:32 +0800 |
---|---|---|
committer | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-02-11 17:31:32 +0800 |
commit | 17e69195176edfa854e1d62cc3e6bd322128ce37 (patch) | |
tree | a185577dea98d680827db4ab4021b50e16bf1b58 /libempathy-gtk/empathy-contact-menu.c | |
parent | d23ec3dc8820592c390adec4de712a570a3c06c7 (diff) | |
parent | 49a44a405f845bdb1cb76c6d0b073c257342bf53 (diff) | |
download | gsoc2013-empathy-17e69195176edfa854e1d62cc3e6bd322128ce37.tar gsoc2013-empathy-17e69195176edfa854e1d62cc3e6bd322128ce37.tar.gz gsoc2013-empathy-17e69195176edfa854e1d62cc3e6bd322128ce37.tar.bz2 gsoc2013-empathy-17e69195176edfa854e1d62cc3e6bd322128ce37.tar.lz gsoc2013-empathy-17e69195176edfa854e1d62cc3e6bd322128ce37.tar.xz gsoc2013-empathy-17e69195176edfa854e1d62cc3e6bd322128ce37.tar.zst gsoc2013-empathy-17e69195176edfa854e1d62cc3e6bd322128ce37.zip |
Merge branch 'contact-blocking-3' into gnome-2-34
Diffstat (limited to 'libempathy-gtk/empathy-contact-menu.c')
-rw-r--r-- | libempathy-gtk/empathy-contact-menu.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/libempathy-gtk/empathy-contact-menu.c b/libempathy-gtk/empathy-contact-menu.c index bbd4ecc8e..9984de42d 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) @@ -137,6 +139,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; } @@ -212,6 +227,84 @@ empathy_contact_add_menu_item_new (EmpathyContact *contact) } static void +empathy_contact_block_menu_item_toggled (GtkCheckMenuItem *item, + EmpathyContact *contact) +{ + static guint block_signal = 0; + EmpathyContactManager *manager; + gboolean blocked; + + if (block_signal > 0) + return; + + blocked = gtk_check_menu_item_get_active (item); + + if (blocked) { + /* confirm the user really wishes to block the contact */ + GtkWidget *parent; + + /* gtk_menu_get_attach_widget() doesn't behave properly here + * for some reason */ + parent = g_object_get_data ( + G_OBJECT (gtk_widget_get_parent (GTK_WIDGET (item))), + "window"); + + if (!empathy_block_contact_dialog_show (GTK_WINDOW (parent), + contact, NULL)) + return; + } + + manager = empathy_contact_manager_dup_singleton (); + empathy_contact_list_set_blocked (EMPATHY_CONTACT_LIST (manager), + contact, blocked); + g_object_unref (manager); + + /* update the toggle with the blocked status */ + block_signal++; + gtk_check_menu_item_set_active (item, blocked); + block_signal--; +} + +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")); + 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) { |