X-Git-Url: http://cgit.babelmonkeys.de/?p=jubjub.git;a=blobdiff_plain;f=src%2Fgui%2Fgtk%2FJubGtkRosterUI.m;h=e7e36f723a86fa53a1ca67ca533e3dbcd12e9abd;hp=dcd6f7d8b42553d6e50049a3ea1a39739f366417;hb=d1b8b63cec7450040b2799e192aeab7ada5afaa8;hpb=218ec083210906f0ece9ad9aa266f1d73fccb192 diff --git a/src/gui/gtk/JubGtkRosterUI.m b/src/gui/gtk/JubGtkRosterUI.m index dcd6f7d..e7e36f7 100644 --- a/src/gui/gtk/JubGtkRosterUI.m +++ b/src/gui/gtk/JubGtkRosterUI.m @@ -69,7 +69,6 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, void (^block)(gint) = user_data; block(response_id); [block release]; - gtk_widget_destroy(GTK_WIDGET(dialog)); } @implementation JubGtkRosterUI @@ -84,6 +83,9 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, _groupMap = [[OFMapTable alloc] initWithKeyFunctions: keyFunctions valueFunctions: rowRefFunctions]; + _subDialogMap = [[OFMapTable alloc] + initWithKeyFunctions: keyFunctions + valueFunctions: gObjectFunctions]; _contactMap = [[OFMutableDictionary alloc] init]; _client = [client retain]; @@ -134,6 +136,7 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, { [_client.avatarManager setDelegate: nil]; [_client.contactManager removeDelegate: self]; + [_subDialogMap release]; [_groupMap release]; [_contactMap release]; [_client release]; @@ -143,6 +146,19 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, [super dealloc]; } +- (void)Jub_closeSubscribeDialogForRosterItem: (XMPPRosterItem*)rosterItem +{ + // Close subscripton dialogs, answered on another client + GtkDialog *dialog; + OFString *subscription = rosterItem.subscription; + OFString *bareJID = [rosterItem.JID bareJID]; + + if (([subscription isEqual: @"from"] || + [subscription isEqual: @"both"]) && + (dialog = [_subDialogMap valueForKey: bareJID]) != NULL) + gtk_dialog_response(dialog, GTK_RESPONSE_NONE); +} + /* Roster Delegate methods */ - (void)Jub_addRosterItem: (XMPPRosterItem*)item group: (OFString*)group @@ -266,6 +282,8 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, Jub_addRosterItem:group:) withObject: rosterItem withObject: group]; + + [self Jub_closeSubscribeDialogForRosterItem: rosterItem]; } - (void)contactManager: (XMPPContactManager*)manager @@ -288,11 +306,15 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, didReceiveSubscriptionRequest: (XMPPPresence*)presence { XMPPJID *JID = presence.from; + OFString *bareJID = [JID bareJID]; OFString *message = [OFString stringWithFormat: @"%@ would like " - @"to subscribe to your presence.", JID]; - of_log(@"%@", message); + @"to subscribe to your presence.", bareJID]; g_idle_add_block(^{ GtkWidget *dialog, *content_area, *label; + + if ([_subDialogMap valueForKey: JID] != NULL) + return; + dialog = gtk_dialog_new_with_buttons("Subscription Request", GTK_WINDOW(_roster_window), GTK_DIALOG_DESTROY_WITH_PARENT, "Accept", GTK_RESPONSE_ACCEPT, @@ -301,6 +323,7 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), [message UTF8String]); + gtk_container_add(GTK_CONTAINER(content_area), label); g_signal_connect(dialog, "response", G_CALLBACK(dialog_response_callback), @@ -309,9 +332,13 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, [manager sendSubscribedToJID: JID]; else if (response_id == GTK_RESPONSE_REJECT) [manager sendUnsubscribedToJID: JID]; + [_subDialogMap removeValueForKey: bareJID]; + gtk_widget_destroy(GTK_WIDGET(dialog)); } copy]); - gtk_container_add(GTK_CONTAINER(content_area), label); + [_subDialogMap setValue: dialog + forKey: bareJID]; + gtk_widget_show_all(dialog); }); } @@ -319,6 +346,8 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, - (void)contact: (XMPPContact*)contact willUpdateWithRosterItem: (XMPPRosterItem*)rosterItem; { + [self Jub_closeSubscribeDialogForRosterItem: rosterItem]; + // Remove contact from old set of groups XMPPRosterItem *oldItem = contact.rosterItem; OFArray *groups = oldItem.groups;