diff src/prpl.c @ 1333:b332d8f46b84

[gaim-migrate @ 1343] oo, a fun new register button. oh yeah, and the buddy list stuff got moved back from toc.c to buddy.c. isn't that nice. now you can remove toc.c and rvous.c, comment out one line in prpl.c, and get rid of toc altogether. but you won't do that. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Wed, 20 Dec 2000 13:24:48 +0000
parents 46c09828e929
children 04874e92af24
line wrap: on
line diff
--- a/src/prpl.c	Wed Dec 20 11:36:40 2000 +0000
+++ b/src/prpl.c	Wed Dec 20 13:24:48 2000 +0000
@@ -23,12 +23,18 @@
 
 #include "pixmaps/ok.xpm"
 #include "pixmaps/cancel.xpm"
+#include "pixmaps/close.xpm"
+#include "pixmaps/register.xpm"
 
 extern void toc_init(struct prpl *);
 extern void oscar_init(struct prpl *);
 
 GSList *protocols = NULL;
 
+static GtkWidget *regdialog = NULL;
+static GtkWidget *regbox = NULL;
+static struct prpl *regprpl = NULL;
+
 struct prpl *find_prpl(int prot)
 {
 	GSList *e = protocols;
@@ -58,6 +64,8 @@
 	if ((old = find_prpl(p->protocol)) == NULL)
 		unload_protocol(old);
 	protocols = g_slist_insert_sorted(protocols, p, (GCompareFunc)proto_compare);
+	if (regdialog)
+		gtk_widget_destroy(regdialog);
 }
 
 void unload_protocol(struct prpl *p)
@@ -84,9 +92,7 @@
 void static_proto_init()
 {
 	load_protocol(toc_init);
-#ifndef DYNAMIC_OSCAR
 	load_protocol(oscar_init);
-#endif
 }
 
 static void des_win(GtkWidget *a, GtkWidget *b)
@@ -94,12 +100,12 @@
 	gtk_widget_destroy(b);
 }
 
-static int rem_win(GtkObject * a, GtkWidget *b)
+static void rem_win(GtkWidget *a, GtkWidget *b)
 {
-	gpointer d = gtk_object_get_user_data(a);
-	gtk_signal_disconnect_by_data(GTK_OBJECT(b), d);
+	void *d = gtk_object_get_user_data(GTK_OBJECT(a));
+	if (d)
+		gtk_signal_disconnect_by_data(GTK_OBJECT(b), d);
 	gtk_widget_destroy(b);
-	return TRUE;
 }
 
 void do_ask_dialog(const char *text, void *data, void *doit, void *dont)
@@ -142,3 +148,126 @@
 
 	gtk_widget_show_all(window);
 }
+
+static void delete_reg(gpointer a, gpointer b)
+{
+	GtkWidget *tmp = regdialog;
+	if (regdialog) {
+		regdialog = NULL;
+		gtk_widget_destroy(tmp);
+	}
+}
+
+static void reg_prpl(gpointer a, struct prpl *p)
+{
+	while (GTK_BOX(regbox)->children)
+		gtk_container_remove(GTK_CONTAINER(regbox),
+				     ((GtkBoxChild *)GTK_BOX(regbox)->children->data)->widget);
+	regprpl = p;
+	(*regprpl->draw_new_user)(regbox);
+}
+
+static void do_reg(gpointer a, gpointer b)
+{
+	if (regprpl->do_new_user)
+		(*regprpl->do_new_user)();
+}
+
+void register_user(gpointer a, gpointer b)
+{
+	GSList *pr = protocols;
+	struct prpl *p = NULL, *q;
+	GtkWidget *box;
+	GtkWidget *frame;
+	GtkWidget *vbox;
+	GtkWidget *hbox;
+	GtkWidget *label;
+	GtkWidget *optmenu;
+	GtkWidget *menu;
+	GtkWidget *opt;
+	GtkWidget *button;
+
+	if (regdialog)
+		return;
+
+	while (pr) {
+		p = pr->data;
+		if (p->draw_new_user)
+			break;
+		pr = pr->next;
+		p = NULL;
+	}
+	if (p == NULL)
+		/* this should never happen because I said so. Hi mom. */
+		return;
+	pr = protocols;
+
+	regdialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_wmclass(GTK_WINDOW(regdialog), "registration", "Gaim");
+	gtk_container_set_border_width(GTK_CONTAINER(regdialog), 5);
+	gtk_window_set_title(GTK_WINDOW(regdialog), _("Gaim - New User Registration"));
+	gtk_signal_connect(GTK_OBJECT(regdialog), "destroy", GTK_SIGNAL_FUNC(delete_reg), NULL);
+	gtk_widget_realize(regdialog);
+	aol_icon(regdialog->window);
+
+	box = gtk_vbox_new(FALSE, 5);
+	gtk_container_add(GTK_CONTAINER(regdialog), box);
+	gtk_widget_show(box);
+
+	frame = gtk_frame_new(_("New User Registration"));
+	gtk_box_pack_start(GTK_BOX(box), frame, FALSE, FALSE, 5);
+	gtk_widget_show(frame);
+
+	vbox = gtk_vbox_new(FALSE, 5);
+	gtk_container_add(GTK_CONTAINER(frame), vbox);
+	gtk_widget_show(vbox);
+
+	hbox = gtk_hbox_new(FALSE, 5);
+	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
+	gtk_widget_show(hbox);
+
+	label = gtk_label_new(_("Register new user for"));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+	gtk_widget_show(label);
+
+	optmenu = gtk_option_menu_new();
+	gtk_box_pack_start(GTK_BOX(hbox), optmenu, FALSE, FALSE, 5);
+	gtk_widget_show(optmenu);
+
+	menu = gtk_menu_new();
+
+	while (pr) {
+		q = pr->data;
+		if (q->draw_new_user) {
+			opt = gtk_menu_item_new_with_label((*q->name)());
+			gtk_signal_connect(GTK_OBJECT(opt), "activate", GTK_SIGNAL_FUNC(reg_prpl), q);
+			gtk_menu_append(GTK_MENU(menu), opt);
+			gtk_widget_show(opt);
+		}
+		pr = pr->next;
+	}
+
+	gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu);
+	gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), 0);
+	regprpl = p;
+
+	regbox = gtk_vbox_new(FALSE, 5);
+	gtk_box_pack_start(GTK_BOX(vbox), regbox, FALSE, FALSE, 5);
+	gtk_widget_show(regbox);
+
+	(*regprpl->draw_new_user)(regbox);
+
+	hbox = gtk_hbox_new(FALSE, 5);
+	gtk_box_pack_end(GTK_BOX(box), hbox, FALSE, FALSE, 5);
+	gtk_widget_show(hbox);
+
+	button = picture_button(regdialog, _("Close"), close_xpm);
+	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5);
+	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(delete_reg), NULL);
+
+	button = picture_button(regdialog, _("Register"), register_xpm);
+	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5);
+	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(do_reg), NULL);
+
+	gtk_widget_show(regdialog);
+}