diff src/multi.c @ 3060:4f2f12bf4408

[gaim-migrate @ 3074] Code cleanups by Robert McQueen. Michael Golden replaced the multiple per-account signon windows with a single signon window showing the status of all your accounts committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Sat, 16 Mar 2002 00:32:53 +0000
parents 626729653436
children 3b1dc99ef79e
line wrap: on
line diff
--- a/src/multi.c	Fri Mar 15 20:09:14 2002 +0000
+++ b/src/multi.c	Sat Mar 16 00:32:53 2002 +0000
@@ -37,6 +37,7 @@
 #include "pixmaps/tb_redo.xpm"
 #include "pixmaps/tb_undo.xpm"
 #include "pixmaps/tb_refresh.xpm"
+#include "pixmaps/no_icon.xpm"
 
 #define LOGIN_STEPS 5
 
@@ -89,6 +90,13 @@
 	return gc;
 }
 
+struct meter_window {
+		GtkWidget *window;
+		GtkTable *table;
+		gint rows;
+		gint active_count;
+	} *meter_win = NULL;
+
 void destroy_gaim_conn(struct gaim_connection *gc)
 {
 	GSList *g = gc->groups;
@@ -1032,12 +1040,44 @@
 
 struct signon_meter {
 	struct gaim_connection *gc;
-	GtkWidget *window;
+	GtkWidget *button;
 	GtkWidget *progress;
 	GtkWidget *status;
 };
 static GSList *meters = NULL;
 
+GtkWidget* create_meter_pixmap (GtkWidget *widget, struct gaim_connection *gc)
+{
+	GdkColormap *colormap;
+	GdkPixmap *gdkpixmap;
+	GdkBitmap *mask;
+	GtkWidget *pixmap;
+	GtkStyle *style;
+	char **xpm; 
+	
+	style = gtk_widget_get_style( widget );
+	
+	if (gc->prpl->list_icon)
+		if (gc->prpl->protocol ==  PROTO_OSCAR) 
+			/* This is such a bad hack to get the right icon
+			 * for OSCAR.  But it's pretty */
+			if (isdigit(*gc->username))
+				xpm = gc->prpl->list_icon(0);
+			else
+				xpm = gc->prpl->list_icon(0x10);
+		else 
+			xpm = gc->prpl->list_icon (0);
+	if (xpm == NULL)
+		xpm = (char **)no_icon_xpm;
+	
+	gdkpixmap = gdk_pixmap_create_from_xpm_d(widget->window, &mask, &style->bg[GTK_STATE_NORMAL], xpm);
+			
+	pixmap = gtk_pixmap_new (gdkpixmap, mask);
+	gdk_pixmap_unref (gdkpixmap);
+	gdk_bitmap_unref (mask);
+	return pixmap;
+}
+
 static struct signon_meter *find_signon_meter(struct gaim_connection *gc)
 {
 	GSList *m = meters;
@@ -1049,6 +1089,19 @@
 	return NULL;
 }
 
+void kill_meter(struct signon_meter *meter) {
+	gtk_widget_set_sensitive (meter->button, FALSE);
+	gtk_progress_bar_update(GTK_PROGRESS_BAR(meter->progress), 1);
+	gtk_statusbar_pop(GTK_STATUSBAR(meter->status), 1);
+	gtk_statusbar_push(GTK_STATUSBAR(meter->status), 1, "Done.");
+	meter_win->active_count--;
+	if (meter_win->active_count == 0) {
+		gtk_widget_destroy(meter_win->window);
+		g_free (meter_win);
+		meter_win = NULL;
+		}
+}
+
 void account_online(struct gaim_connection *gc)
 {
 	int i;
@@ -1056,7 +1109,7 @@
 
 	/* first we hide the login progress meter */
 	if (meter) {
-		gtk_widget_destroy(meter->window);
+		kill_meter(meter);
 		meters = g_slist_remove(meters, meter);
 		g_free(meter);
 	}
@@ -1122,7 +1175,7 @@
 	int i;
 	struct signon_meter *meter = find_signon_meter(gc);
 	if (meter) {
-		gtk_widget_destroy(meter->window);
+		kill_meter(meter);
 		meters = g_slist_remove(meters, meter);
 		g_free(meter);
 	}
@@ -1161,6 +1214,63 @@
 	return TRUE;
 }
 
+static struct signon_meter *register_meter(struct gaim_connection *gc, GtkWidget *widget, GtkTable *table, gint *rows)
+{
+	GtkWidget *graphic;
+	GtkWidget *label;
+	GtkWidget *nest_vbox;
+	GString *name_to_print;
+	struct signon_meter *meter;
+	
+	name_to_print = g_string_new(gc->username);
+	
+	meter = g_new0(struct signon_meter, 1);
+	
+	(*rows)++;
+	gtk_table_resize (table, *rows, 4);
+	
+	graphic = create_meter_pixmap( widget , gc);
+	
+	nest_vbox = gtk_vbox_new (FALSE, 0);
+	
+	name_to_print = g_string_prepend(name_to_print, "Signon: ");
+	label = gtk_label_new (name_to_print->str);
+	gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+		
+	meter->status = gtk_statusbar_new();
+	gtk_widget_set_usize(meter->status, 250, 0);
+	
+	meter->progress = gtk_progress_bar_new ();
+	
+	meter->button = gtk_button_new_with_label ("Cancel");
+	gtk_signal_connect (GTK_OBJECT (meter->button), "clicked", GTK_SIGNAL_FUNC (cancel_signon), meter);
+		
+	gtk_table_attach (GTK_TABLE (table), graphic, 0, 1, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
+	gtk_table_attach (GTK_TABLE (table), nest_vbox, 1, 2, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
+		gtk_box_pack_start (GTK_BOX (nest_vbox), GTK_WIDGET (label), FALSE, FALSE, 0);
+		gtk_box_pack_start (GTK_BOX (nest_vbox), GTK_WIDGET (meter->status), FALSE, FALSE, 0);
+	gtk_table_attach (GTK_TABLE (table), meter->progress, 2, 3, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
+	gtk_table_attach (GTK_TABLE (table), meter->button, 3, 4, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0);
+
+	gtk_widget_show_all (GTK_WIDGET (meter_win->window));
+	
+	meter_win->active_count++;
+	
+	return meter;
+}
+
+static void loop_cancel () {
+	GSList *m = meters;
+	struct signon_meter *meter = NULL;
+	
+	while (m) {
+		meter = (struct signon_meter *) (m->data);
+		meter->gc->wants_to_die = TRUE;
+		signoff((struct gaim_connection *) meter->gc);
+		m = meters;
+		}
+	}
+
 void set_login_progress(struct gaim_connection *gc, float howfar, char *message)
 {
 	struct signon_meter *meter = find_signon_meter(gc);
@@ -1168,49 +1278,47 @@
 	if (mainwindow)
 		gtk_widget_hide(mainwindow);
 
+	if (!meter_win) {
+		GtkWidget *cancel_button;
+		GtkWidget *vbox;
+		GString *name;
+						
+		meter_win = g_new0(struct meter_window, 1);
+		meter_win->rows=0;
+			
+		meter_win->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+		GAIM_DIALOG(meter_win->window);
+		gtk_window_set_policy(GTK_WINDOW(meter_win->window), 0, 0, 1);
+		gtk_window_set_wmclass(GTK_WINDOW(meter_win->window), "signon", "Gaim");
+		gtk_container_set_border_width(GTK_CONTAINER(meter_win->window), 5);
+		gtk_window_set_title (GTK_WINDOW (meter_win->window), "Gaim Account Signon");
+		gtk_widget_realize(meter_win->window);
+		aol_icon(meter_win->window->window);
+		
+		vbox = gtk_vbox_new (FALSE, 0);
+		gtk_container_add (GTK_CONTAINER (meter_win->window), GTK_WIDGET (vbox));
+
+		meter_win->table = (GtkTable *) gtk_table_new (1 , 4, FALSE);
+		gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (meter_win->table), FALSE, FALSE, 0);
+		gtk_container_set_border_width (GTK_CONTAINER (meter_win->table), 5);
+		gtk_table_set_row_spacings (GTK_TABLE (meter_win->table), 5);
+		gtk_table_set_col_spacings (GTK_TABLE (meter_win->table), 10);
+	
+		cancel_button = gtk_button_new_with_label ("Cancel All");
+    	gtk_signal_connect_object (GTK_OBJECT (cancel_button), "clicked", GTK_SIGNAL_FUNC (loop_cancel), NULL);
+		gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (cancel_button), FALSE, FALSE, 0);
+	
+		gtk_signal_connect (GTK_OBJECT (meter_win->window), "delete_event", GTK_SIGNAL_FUNC (meter_destroy), NULL);
+		}
+	
 	if (!meter) {
-		GtkWidget *box, *label, *button;
 		char buf[256];
 
-		meter = g_new0(struct signon_meter, 1);
+		meter = register_meter(gc, GTK_WIDGET (meter_win->window), GTK_TABLE (meter_win->table), (gint *)  &meter_win->rows);
 		meter->gc = gc;
 		meters = g_slist_append(meters, meter);
 
-		GAIM_DIALOG(meter->window);
-		gtk_window_set_policy(GTK_WINDOW(meter->window), 0, 0, 1);
-		gtk_window_set_wmclass(GTK_WINDOW(meter->window), "signon", "Gaim");
-		gtk_container_set_border_width(GTK_CONTAINER(meter->window), 5);
 		g_snprintf(buf, sizeof(buf), "%s Signing On (using %s)", gc->username, gc->prpl->name());
-		gtk_window_set_title(GTK_WINDOW(meter->window), buf);
-		gtk_signal_connect(GTK_OBJECT(meter->window), "delete_event",
-				   GTK_SIGNAL_FUNC(meter_destroy), meter);
-		gtk_widget_realize(meter->window);
-		aol_icon(meter->window->window);
-
-		box = gtk_vbox_new(FALSE, 5);
-		gtk_container_add(GTK_CONTAINER(meter->window), box);
-		gtk_widget_show(box);
-
-		label = gtk_label_new(buf);
-		gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
-		gtk_widget_show(label);
-
-		meter->progress = gtk_progress_bar_new();
-		gtk_widget_set_usize(meter->progress, 150, 0);
-		gtk_box_pack_start(GTK_BOX(box), meter->progress, FALSE, FALSE, 0);
-		gtk_widget_show(meter->progress);
-
-		meter->status = gtk_statusbar_new();
-		gtk_widget_set_usize(meter->status, 150, 0);
-		gtk_box_pack_start(GTK_BOX(box), meter->status, FALSE, FALSE, 0);
-		gtk_widget_show(meter->status);
-
-		button = gtk_button_new_with_label(_("Cancel"));
-		gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
-		gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(cancel_signon), meter);
-		gtk_widget_show(button);
-
-		gtk_widget_show(meter->window);
 	}
 
 	gtk_progress_bar_update(GTK_PROGRESS_BAR(meter->progress), howfar / LOGIN_STEPS);
@@ -1262,7 +1370,7 @@
 	kicks = g_slist_append(kicks, k);
 	gtk_signal_connect(GTK_OBJECT(k->dlg), "destroy", GTK_SIGNAL_FUNC(set_kick_null), k);
 	if (meter) {
-		gtk_widget_destroy(meter->window);
+		kill_meter(meter);
 		meters = g_slist_remove(meters, meter);
 		g_free(meter);
 	}