diff plugins/chatlist.c @ 2241:a0ee02e861b9

[gaim-migrate @ 2251] bah. i can't believe i did this. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Sat, 08 Sep 2001 08:05:00 +0000
parents
children 4ecc9a9a75d8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/chatlist.c	Sat Sep 08 08:05:00 2001 +0000
@@ -0,0 +1,464 @@
+#define GAIM_PLUGINS
+
+#include "pixmaps/cancel.xpm"
+#include "pixmaps/refresh.xpm"
+#include "pixmaps/gnome_add.xpm"
+#include "pixmaps/gnome_remove.xpm"
+
+#include "proxy.h"
+#include "gaim.h"
+
+#include <stdlib.h>
+
+struct chat_page {
+	GtkWidget *list1;
+	GtkWidget *list2;
+};
+
+struct chat_room {
+	char name[80];
+	int exchange;
+};
+
+static GtkWidget *item = NULL; /* this is the parent tree */
+static GList *chat_rooms = NULL;
+
+static GtkWidget *parent = NULL; /* this is the config thing where you can see the list */
+static struct chat_page *cp = NULL;
+
+static void des_item()
+{
+	if (item)
+		gtk_widget_destroy(item);
+	item = NULL;
+}
+
+static void handle_click_chat(GtkWidget *widget, GdkEventButton * event, struct chat_room *cr)
+{
+	if (event->type == GDK_2BUTTON_PRESS && event->button == 1) {
+		GList *m = g_list_append(NULL, cr->name);
+		int *x = g_new0(int, 1);
+		*x = cr->exchange;
+		m = g_list_append(m, x);
+		serv_join_chat(connections->data, m);
+		g_free(x);
+		g_list_free(m);
+	}
+}
+
+static void setup_buddy_chats()
+{
+	GList *crs = chat_rooms;
+	GtkWidget *tree;
+
+	if (!blist)
+		return;
+
+	if (item)
+		gtk_tree_remove_item(GTK_TREE(buddies), item);
+	item = NULL;
+
+	if (!chat_rooms)
+		return;
+
+	item = gtk_tree_item_new_with_label(_("Buddy Chat"));
+	gtk_signal_connect(GTK_OBJECT(item), "destroy", GTK_SIGNAL_FUNC(des_item), NULL);
+	gtk_tree_append(GTK_TREE(buddies), item);
+	gtk_tree_item_expand(GTK_TREE_ITEM(item));
+	gtk_widget_show(item);
+
+	tree = gtk_tree_new();
+	gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), tree);
+	gtk_widget_show(tree);
+
+	while (crs) {
+		struct chat_room *cr = (struct chat_room *)crs->data;
+		GtkWidget *titem = gtk_tree_item_new_with_label(cr->name);
+		gtk_object_set_user_data(GTK_OBJECT(titem), cr);
+		gtk_tree_append(GTK_TREE(tree), titem);
+		gtk_widget_show(titem);
+		gtk_signal_connect(GTK_OBJECT(titem), "button_press_event",
+				   GTK_SIGNAL_FUNC(handle_click_chat), cr);
+		crs = crs->next;
+	}
+}
+
+static void save_chat_prefs()
+{
+	FILE *f;
+	char path[1024];
+	char *x = gaim_user_dir();
+	GList *crs = chat_rooms;
+
+	g_snprintf(path, sizeof(path), "%s/%s", x, "chats");
+	f = fopen(path, "w");
+	if (!f) {
+		g_free(x);
+		return;
+	}
+	while (crs) {
+		struct chat_room *cr = crs->data;
+		crs = crs->next;
+		fprintf(f, "%s\n%d\n", cr->name, cr->exchange);
+	}
+	fclose(f);
+}
+
+static void restore_chat_prefs()
+{
+	FILE *f;
+	char path[1024];
+	char *x = gaim_user_dir();
+	char buf[1024];
+
+	g_snprintf(path, sizeof(path), "%s/%s", x, "chats");
+	f = fopen(path, "r");
+	if (!f) {
+		g_free(x);
+		return;
+	}
+	while (fgets(buf, 1024, f)) {
+		struct chat_room *cr = g_new0(struct chat_room, 1);
+		g_snprintf(cr->name, sizeof(cr->name), "%s", buf);
+		if (!fgets(buf, 1024, f)) {
+			g_free(cr);
+			break;
+		}
+		cr->exchange = atoi(buf);
+		chat_rooms = g_list_append(chat_rooms, cr);
+	}
+	fclose(f);
+	setup_buddy_chats();
+}
+
+static void ref_list_callback(gpointer data, char *text)
+{
+	char *c;
+	int len;
+	GtkWidget *item;
+	GList *items = GTK_LIST(cp->list1)->children;
+	struct chat_room *cr;
+	c = text;
+
+	if (!text)
+		return;
+
+	len = strlen(text);
+
+	while (items) {
+		g_free(gtk_object_get_user_data(GTK_OBJECT(items->data)));
+		items = items->next;
+	}
+
+	items = NULL;
+
+	gtk_list_clear_items(GTK_LIST(cp->list1), 0, -1);
+
+	item = gtk_list_item_new_with_label(_("Gaim Chat"));
+	cr = g_new0(struct chat_room, 1);
+	strcpy(cr->name, _("Gaim Chat"));
+	cr->exchange = 4;
+	gtk_object_set_user_data(GTK_OBJECT(item), cr);
+	gtk_widget_show(item);
+
+	items = g_list_append(NULL, item);
+
+	while (c) {
+		if (c - text > len - 30)
+			break;	/* assume no chat rooms 30 from end, padding */
+		if (!g_strncasecmp(AOL_SRCHSTR, c, strlen(AOL_SRCHSTR))) {
+			char *t;
+			int len = 0;
+			int exchange;
+			char *name = NULL;
+
+			c += strlen(AOL_SRCHSTR);
+			t = c;
+			while (t) {
+				len++;
+				name = g_realloc(name, len);
+				if (*t == '+')
+					name[len - 1] = ' ';
+				else if (*t == '&') {
+					name[len - 1] = 0;
+					sscanf(t, "&Exchange=%d", &exchange);
+					c = t + strlen("&Exchange=x");
+					break;
+				} else
+					name[len - 1] = *t;
+				t++;
+			}
+			cr = g_new0(struct chat_room, 1);
+			strcpy(cr->name, name);
+			cr->exchange = exchange;
+			item = gtk_list_item_new_with_label(name);
+			gtk_widget_show(item);
+			items = g_list_append(items, item);
+			gtk_object_set_user_data(GTK_OBJECT(item), cr);
+			g_free(name);
+		}
+		c++;
+	}
+	gtk_list_append_items(GTK_LIST(cp->list1), items);
+	g_free(text);
+}
+
+static void refresh_list(GtkWidget *w, gpointer *m)
+{
+	grab_url("http://www.aol.com/community/chat/allchats.html", ref_list_callback, NULL);
+}
+
+static void add_chat(GtkWidget *w, gpointer *m)
+{
+	GList *sel = GTK_LIST(cp->list1)->selection;
+	struct chat_room *cr, *cr2;
+	GList *crs = chat_rooms;
+	GtkWidget *item;
+
+	if (sel) {
+		cr = (struct chat_room *)gtk_object_get_user_data(GTK_OBJECT(sel->data));
+	} else
+		return;
+
+	while (crs) {
+		cr2 = (struct chat_room *)crs->data;
+		if (!g_strcasecmp(cr->name, cr2->name))
+			 return;
+		crs = crs->next;
+	}
+	item = gtk_list_item_new_with_label(cr->name);
+	cr2 = g_new0(struct chat_room, 1);
+	strcpy(cr2->name, cr->name);
+	cr2->exchange = cr->exchange;
+	gtk_object_set_user_data(GTK_OBJECT(item), cr2);
+	gtk_widget_show(item);
+	sel = g_list_append(NULL, item);
+	gtk_list_append_items(GTK_LIST(cp->list2), sel);
+	chat_rooms = g_list_append(chat_rooms, cr2);
+
+	setup_buddy_chats();
+	save_chat_prefs();
+}
+
+static void remove_chat(GtkWidget *w, gpointer *m)
+{
+	GList *sel = GTK_LIST(cp->list2)->selection;
+	struct chat_room *cr;
+	GList *crs;
+	GtkWidget *item;
+
+	if (sel) {
+		item = (GtkWidget *)sel->data;
+		cr = (struct chat_room *)gtk_object_get_user_data(GTK_OBJECT(item));
+	} else
+		return;
+
+	chat_rooms = g_list_remove(chat_rooms, cr);
+
+
+	gtk_list_clear_items(GTK_LIST(cp->list2), 0, -1);
+
+	if (g_list_length(chat_rooms) == 0)
+		chat_rooms = NULL;
+
+	crs = chat_rooms;
+
+	while (crs) {
+		cr = (struct chat_room *)crs->data;
+		item = gtk_list_item_new_with_label(cr->name);
+		gtk_object_set_user_data(GTK_OBJECT(item), cr);
+		gtk_widget_show(item);
+		gtk_list_append_items(GTK_LIST(cp->list2), g_list_append(NULL, item));
+
+
+		crs = crs->next;
+	}
+
+	setup_buddy_chats();
+	save_chat_prefs();
+}
+
+static void parent_destroy()
+{
+	if (parent)
+		gtk_widget_destroy(parent);
+	parent = NULL;
+}
+
+void gaim_plugin_config()
+{
+	GtkWidget *vbox;
+	GtkWidget *frame;
+	GtkWidget *box;
+	GtkWidget *table;
+	GtkWidget *rem_button, *add_button, *ref_button;
+	GtkWidget *list1, *list2;
+	GtkWidget *label;
+	GtkWidget *sw1, *sw2;
+	GtkWidget *item;
+	GtkWidget *hbox;
+	GtkWidget *button;
+	GList *crs = chat_rooms;
+	GList *items = NULL;
+	struct chat_room *cr;
+
+	if (parent) {
+		gtk_widget_show(parent);
+		return;
+	}
+
+	if (cp)
+		g_free(cp);
+	cp = g_new0(struct chat_page, 1);
+
+	parent = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+	gtk_widget_set_usize(parent, 300, 400);
+	gtk_window_set_title(GTK_WINDOW(parent), "Chat Rooms");
+	gtk_window_set_wmclass(GTK_WINDOW(parent), "chatlist", "Gaim");
+	gtk_widget_realize(parent);
+	aol_icon(parent->window);
+	gtk_signal_connect(GTK_OBJECT(parent), "destroy",
+			   GTK_SIGNAL_FUNC(parent_destroy), NULL);
+
+	vbox = gtk_vbox_new(FALSE, 0);
+	gtk_container_add(GTK_CONTAINER(parent), vbox);
+	gtk_widget_show(vbox);
+
+	hbox = gtk_hbox_new(FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
+	gtk_widget_show(hbox);
+
+	button = picture_button(parent, _("Close"), cancel_xpm);
+	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5);
+	gtk_signal_connect(GTK_OBJECT(button), "clicked",
+			   GTK_SIGNAL_FUNC(parent_destroy), NULL);
+
+	frame = gtk_frame_new(_("Chat Rooms"));
+	gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 5);
+	gtk_widget_show(frame);
+
+	box = gtk_vbox_new(FALSE, 5);
+	gtk_container_set_border_width(GTK_CONTAINER(box), 5);
+	gtk_container_add(GTK_CONTAINER(frame), box);
+	gtk_widget_show(box);
+
+	table = gtk_table_new(4, 2, FALSE);
+	gtk_widget_show(table);
+
+	gtk_box_pack_start(GTK_BOX(box), table, TRUE, TRUE, 0);
+
+	list1 = gtk_list_new();
+	list2 = gtk_list_new();
+	sw1 = gtk_scrolled_window_new(NULL, NULL);
+	sw2 = gtk_scrolled_window_new(NULL, NULL);
+
+	ref_button = picture_button(parent, _("Refresh"), refresh_xpm);
+	add_button = picture_button(parent, _("Add"), gnome_add_xpm);
+	rem_button = picture_button(parent, _("Remove"), gnome_remove_xpm);
+	gtk_widget_show(list1);
+	gtk_widget_show(sw1);
+	gtk_widget_show(list2);
+	gtk_widget_show(sw2);
+
+	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw1), list1);
+	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), list2);
+
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw1),
+				       GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw2),
+				       GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+
+	cp->list1 = list1;
+	cp->list2 = list2;
+
+	gtk_signal_connect(GTK_OBJECT(ref_button), "clicked", GTK_SIGNAL_FUNC(refresh_list), cp);
+	gtk_signal_connect(GTK_OBJECT(rem_button), "clicked", GTK_SIGNAL_FUNC(remove_chat), cp);
+	gtk_signal_connect(GTK_OBJECT(add_button), "clicked", GTK_SIGNAL_FUNC(add_chat), cp);
+
+
+
+	label = gtk_label_new(_("List of available chats"));
+	gtk_widget_show(label);
+
+	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), ref_button, 0, 1, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), sw1, 0, 1, 2, 3,
+			 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5);
+	gtk_table_attach(GTK_TABLE(table), add_button, 0, 1, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0);
+
+
+	label = gtk_label_new(_("List of subscribed chats"));
+	gtk_widget_show(label);
+
+	gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), sw2, 1, 2, 2, 3,
+			 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 5);
+	gtk_table_attach(GTK_TABLE(table), rem_button, 1, 2, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0);
+
+
+	item = gtk_list_item_new_with_label(_("Gaim Chat"));
+	cr = g_new0(struct chat_room, 1);
+	strcpy(cr->name, _("Gaim Chat"));
+	cr->exchange = 4;
+	gtk_object_set_user_data(GTK_OBJECT(item), cr);
+	gtk_widget_show(item);
+	gtk_list_append_items(GTK_LIST(list1), g_list_append(NULL, item));
+
+
+	while (crs) {
+		cr = (struct chat_room *)crs->data;
+		item = gtk_list_item_new_with_label(cr->name);
+		gtk_object_set_user_data(GTK_OBJECT(item), cr);
+		gtk_widget_show(item);
+		items = g_list_append(items, item);
+
+		crs = crs->next;
+	}
+
+	gtk_list_append_items(GTK_LIST(list2), items);
+
+	gtk_widget_show(parent);
+}
+
+static void handle_signon(struct gaim_connection *gc)
+{
+	setup_buddy_chats();
+}
+
+char *gaim_plugin_init(GModule *m)
+{
+	restore_chat_prefs();
+	gaim_signal_connect(m, event_signon, handle_signon, NULL);
+	return NULL;
+}
+
+void gaim_plugin_remove()
+{
+	if (parent)
+		gtk_widget_destroy(parent);
+	parent = NULL;
+
+	if (item)
+		gtk_tree_remove_item(GTK_TREE(buddies), item);
+	item = NULL;
+
+	while (chat_rooms) {
+		g_free(chat_rooms->data);
+		chat_rooms = g_list_remove(chat_rooms, chat_rooms->data);
+	}
+
+	if (cp)
+		g_free(cp);
+	cp = NULL;
+}
+
+char *name()
+{
+	return "Chat List";
+}
+
+char *description()
+{
+	return "Allows you to add chat rooms to your buddy list. Click the configure button to choose"
+		" which rooms.";
+}