diff src/dialogs.c @ 2773:a0fd8f91e294

[gaim-migrate @ 2786] SPAM!!! All recipients of the email generated by this commit each owe me $125 per email sent, plus a $75 handling fee for all messages combined. Or was that supposed to be the other way around. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Tue, 20 Nov 2001 01:01:22 +0000
parents 477a035d81e5
children 501de8a3b09f
line wrap: on
line diff
--- a/src/dialogs.c	Mon Nov 19 23:32:04 2001 +0000
+++ b/src/dialogs.c	Tue Nov 20 01:01:22 2001 +0000
@@ -172,11 +172,30 @@
 };
 
 struct info_dlg {
+	struct gaim_connection *gc;
+	char *who;
 	GtkWidget *window;
 	GtkWidget *text;
-	GtkWidget *close;
 };
-
+static GSList *info_dlgs = NULL;
+
+static struct info_dlg *find_info_dlg(struct gaim_connection *gc, char *who)
+{
+	GSList *i = info_dlgs;
+	while (i) {
+		struct info_dlg *d = i->data;
+		i = i->next;
+		if (d->gc != gc)
+			continue;
+		if (d->who == NULL)
+			continue;
+		if (!who)
+			continue;
+		if (!g_strcasecmp(normalize(who), d->who))
+			return d;
+	}
+	return NULL;
+}
 
 struct set_info_dlg {
 	GtkWidget *window;
@@ -1732,6 +1751,9 @@
 
 static void info_dlg_free(GtkWidget *b, struct info_dlg *d)
 {
+	if (g_slist_find(info_dlgs, d))
+		info_dlgs = g_slist_remove(info_dlgs, d);
+	g_free(d->who);
 	g_free(d);
 }
 
@@ -1750,7 +1772,7 @@
 	return NULL;
 }
 
-void g_show_info_text(char *info, ...)
+void g_show_info_text(struct gaim_connection *gc, char *who, gboolean away, char *info, ...)
 {
 	GtkWidget *ok;
 	GtkWidget *label;
@@ -1761,41 +1783,48 @@
 	char *more_info;
 	va_list ap;
 
-	struct info_dlg *b = g_new0(struct info_dlg, 1);
-
-	va_start(ap, info);
-
-	GAIM_DIALOG(b->window);
-	gtk_window_set_title(GTK_WINDOW(b->window), "Gaim");
-	gtk_container_border_width(GTK_CONTAINER(b->window), 5);
-	bbox = gtk_vbox_new(FALSE, 5);
-	gtk_container_add(GTK_CONTAINER(b->window), bbox);
-	gtk_widget_realize(GTK_WIDGET(b->window));
-	ok = picture_button(b->window, _("OK"), ok_xpm);
-	gtk_signal_connect(GTK_OBJECT(b->window), "destroy", GTK_SIGNAL_FUNC(destroy_dialog), b->window);
-	gtk_signal_connect(GTK_OBJECT(b->window), "destroy", GTK_SIGNAL_FUNC(info_dlg_free), b);
-	gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(destroy_dialog), b->window);
-
-	label = gtk_label_new(_("Below are the results of your search: "));
-
-	sw = gtk_scrolled_window_new(NULL, NULL);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
-	text = gtk_imhtml_new(NULL, NULL);
-	b->text = text;
-	gtk_container_add(GTK_CONTAINER(sw), text);
-
-	GTK_LAYOUT(text)->hadjustment->step_increment = 10.0;
-	GTK_LAYOUT(text)->vadjustment->step_increment = 10.0;
-	gtk_widget_set_usize(sw, 300, 250);
-	gtk_imhtml_set_img_handler(GTK_IMHTML(text), info_img_handler);
-	gaim_setup_imhtml(text);
-
-	gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(bbox), sw, TRUE, TRUE, 0);
-	gtk_box_pack_start(GTK_BOX(bbox), ok, FALSE, FALSE, 0);
-
-	aol_icon(b->window->window);
-	gtk_widget_show_all(b->window);
+	struct info_dlg *b = find_info_dlg(gc, who);
+	if (!b && away)
+		return;
+	if (!b) {
+		b = g_new0(struct info_dlg, 1);
+		b->gc = gc;
+		b->who = who ? g_strdup(normalize(who)) : NULL;
+		info_dlgs = g_slist_append(info_dlgs, b);
+
+		GAIM_DIALOG(b->window);
+		gtk_window_set_title(GTK_WINDOW(b->window), "Gaim");
+		gtk_container_border_width(GTK_CONTAINER(b->window), 5);
+		gtk_widget_realize(GTK_WIDGET(b->window));
+		gtk_signal_connect(GTK_OBJECT(b->window), "destroy", GTK_SIGNAL_FUNC(info_dlg_free), b);
+		aol_icon(b->window->window);
+
+		bbox = gtk_vbox_new(FALSE, 5);
+		gtk_container_add(GTK_CONTAINER(b->window), bbox);
+
+		label = gtk_label_new(_("Below are the results of your search: "));
+		gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
+
+		sw = gtk_scrolled_window_new(NULL, NULL);
+		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+		gtk_box_pack_start(GTK_BOX(bbox), sw, TRUE, TRUE, 0);
+
+		text = gtk_imhtml_new(NULL, NULL);
+		b->text = text;
+		gtk_container_add(GTK_CONTAINER(sw), text);
+		GTK_LAYOUT(text)->hadjustment->step_increment = 10.0;
+		GTK_LAYOUT(text)->vadjustment->step_increment = 10.0;
+		gtk_widget_set_usize(sw, 300, 250);
+		gtk_imhtml_set_img_handler(GTK_IMHTML(text), info_img_handler);
+		gaim_setup_imhtml(text);
+
+		ok = picture_button(b->window, _("OK"), ok_xpm);
+		gtk_signal_connect_object(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),
+					  GTK_OBJECT(b->window));
+		gtk_box_pack_start(GTK_BOX(bbox), ok, FALSE, FALSE, 0);
+
+		gtk_widget_show_all(b->window);
+	}
 
 	if (convo_options & OPT_CONVO_IGNORE_COLOUR)
 		options ^= GTK_IMHTML_NO_COLOURS;
@@ -1807,13 +1836,20 @@
 	options ^= GTK_IMHTML_NO_TITLE;
 	options ^= GTK_IMHTML_NO_NEWLINE;
 	options ^= GTK_IMHTML_NO_SCROLL;
+
 	gtk_imhtml_append_text(GTK_IMHTML(b->text), info, options);
+
+	va_start(ap, info);
 	while ((more_info = va_arg(ap, char *)) != NULL)
 		 gtk_imhtml_append_text(GTK_IMHTML(b->text), more_info, options);
 	va_end(ap);
+
 	gtk_imhtml_append_text(GTK_IMHTML(b->text), "<BR>", 0);
 
-	gtk_adjustment_set_value(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(sw)), 0);
+	if (away)
+		info_dlgs = g_slist_remove(info_dlgs, b);
+	else
+		serv_get_away(gc, who);
 }
 
 /*------------------------------------------------------------------------*/