aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy-gtk/empathy-contact-menu.c43
-rw-r--r--src/empathy-chat-window.c7
2 files changed, 47 insertions, 3 deletions
diff --git a/libempathy-gtk/empathy-contact-menu.c b/libempathy-gtk/empathy-contact-menu.c
index 03e0db3aa..e03444ac9 100644
--- a/libempathy-gtk/empathy-contact-menu.c
+++ b/libempathy-gtk/empathy-contact-menu.c
@@ -232,15 +232,57 @@ 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;
+
manager = empathy_contact_manager_dup_singleton ();
blocked = gtk_check_menu_item_get_active (item);
+ if (blocked) {
+ /* confirm the user really wishes to block the contact */
+ int res;
+ GtkWidget *parent, *dialog;
+
+ /* 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");
+ dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
+ _("Block %s?"),
+ empathy_contact_get_id (contact));
+
+ gtk_message_dialog_format_secondary_text (
+ GTK_MESSAGE_DIALOG (dialog),
+ _("Are you sure you want to block the contact %s?"),
+ empathy_contact_get_id (contact));
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ _("Block"), GTK_RESPONSE_REJECT,
+ NULL);
+
+ res = gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+ if (res != GTK_RESPONSE_REJECT)
+ goto finally;
+ }
+
empathy_contact_list_set_blocked (EMPATHY_CONTACT_LIST (manager),
contact, blocked);
+ /* update the toggle with the blocked status */
+ block_signal++;
+ gtk_check_menu_item_set_active (item, blocked);
+ block_signal--;
+
+finally:
g_object_unref (manager);
}
@@ -270,7 +312,6 @@ empathy_contact_block_menu_item_new (EmpathyContact *contact)
}
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);
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index 799a8254d..73856adde 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -417,12 +417,15 @@ chat_window_contact_menu_update (EmpathyChatWindowPriv *priv,
if (orig_submenu == NULL || !gtk_widget_get_visible (orig_submenu)) {
submenu = empathy_chat_get_contact_menu (priv->current_chat);
+
+ /* gtk_menu_attach_to_widget() doesn't behave nicely here */
+ g_object_set_data (G_OBJECT (submenu), "window", priv->dialog);
+
if (submenu != NULL) {
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu), submenu);
gtk_widget_show (menu);
gtk_widget_set_sensitive (menu, TRUE);
- }
- else {
+ } else {
gtk_widget_set_sensitive (menu, FALSE);
}
} else {