aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk/empathy-contact-menu.c
diff options
context:
space:
mode:
authorDanielle Madeley <danielle.madeley@collabora.co.uk>2011-02-11 17:31:32 +0800
committerDanielle Madeley <danielle.madeley@collabora.co.uk>2011-02-11 17:31:32 +0800
commit17e69195176edfa854e1d62cc3e6bd322128ce37 (patch)
treea185577dea98d680827db4ab4021b50e16bf1b58 /libempathy-gtk/empathy-contact-menu.c
parentd23ec3dc8820592c390adec4de712a570a3c06c7 (diff)
parent49a44a405f845bdb1cb76c6d0b073c257342bf53 (diff)
downloadgsoc2013-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.c93
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)
{