diff src/prefs.c @ 1:2846a03bda67

[gaim-migrate @ 10] The other missing files :) committer: Tailor Script <tailor@pidgin.im>
author Rob Flynn <gaim@robflynn.com>
date Thu, 23 Mar 2000 03:13:54 +0000
parents
children effb8a20de26
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/prefs.c	Thu Mar 23 03:13:54 2000 +0000
@@ -0,0 +1,1050 @@
+/*
+ * gaim
+ *
+ * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <string.h>
+#include <sys/time.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gtk/gtk.h>
+#include "gaim.h"
+#include "proxy.h"
+
+struct prefs_data *pd = NULL;
+struct debug_window *dw = NULL;
+
+GtkWidget *debugbutton;
+
+struct chat_page {
+	GtkWidget *list1;
+	GtkWidget *list2;
+};
+
+
+char debug_buff[BUF_LONG];
+
+void do_chat_page(GtkWidget *page);
+
+void list_clicked( GtkWidget *widget, struct away_message *a);
+void list_unclicked( GtkWidget *widget, struct away_message *a);
+
+
+void remove_away_message(GtkWidget *widget, void *dummy)
+{
+	GList *i;
+	struct away_message *a;
+
+	i = GTK_LIST(pd->away_list)->selection;
+
+	a = gtk_object_get_user_data(GTK_OBJECT(i->data));
+
+	rem_away_mess(NULL, a);
+}
+
+void away_list_clicked( GtkWidget *widget, struct away_message *a)
+{
+	gchar buffer[2048];
+	guint text_len;
+
+	pd->cur_message = a;
+
+	/* Get proper Length */
+	text_len = gtk_text_get_length(GTK_TEXT(pd->away_text));
+	pd->edited_message = gtk_editable_get_chars(GTK_EDITABLE(pd->away_text), 0, text_len);
+
+	/* Clear the Box */
+	gtk_text_set_point(GTK_TEXT(pd->away_text), 0 );
+	gtk_text_forward_delete (GTK_TEXT(pd->away_text), text_len); 
+
+	/* Fill the text box with new message */
+	strcpy(buffer, a->message);
+	gtk_text_insert(GTK_TEXT(pd->away_text), NULL, NULL, NULL, buffer, -1);
+
+
+}
+
+void away_list_unclicked( GtkWidget *widget, struct away_message *a)
+{
+        if (pd == NULL)
+                return;
+	strcpy(a->message, pd->edited_message);
+	save_prefs();
+}
+
+
+void set_option(GtkWidget *w, int *option)
+{
+	*option = !(*option);
+}
+
+void set_display_option(GtkWidget *w, int *option)
+{
+        display_options = display_options ^ (int)option;
+	save_prefs();
+}
+
+void set_sound_option(GtkWidget *w, int *option)
+{
+	sound_options = sound_options ^ (int)option;
+	save_prefs();
+}
+
+void set_font_option(GtkWidget *w, int *option)
+{
+	font_options = font_options ^ (int)option;
+
+	update_font_buttons();	
+
+	save_prefs();
+}
+
+void set_general_option(GtkWidget *w, int *option)
+{
+	general_options = general_options ^ (int)option;
+
+       	if ((int)option == OPT_GEN_SHOW_LAGMETER)
+       		update_lagometer(-1);
+       	if ((int)option == OPT_GEN_LOG_ALL)
+       		update_log_convs();
+	save_prefs();
+
+	/*
+        if (data == &show_grp_nums)
+		update_num_groups();
+	if (data == &showidle || data == &showpix)
+		update_show_idlepix();
+	if (data == &button_pix)
+                update_button_pix();
+        if (data == &transparent)
+                update_transparency();
+          */
+        
+}
+
+
+static gint debug_delete(GtkWidget *w, GdkEvent *event, void *dummy)
+{
+	if(debugbutton && (general_options & OPT_GEN_DEBUG))
+	{
+		gtk_button_clicked(GTK_BUTTON(debugbutton));
+	}
+	g_free(dw);
+	dw=NULL;
+	return FALSE;
+
+}
+
+static gint handle_delete(GtkWidget *w, GdkEvent *event, void *dummy)
+{
+	guint text_len;
+	struct away_message *a;
+
+
+        if (pd->cur_message) {
+        
+		a = pd->cur_message;
+
+
+		/* Get proper Length and grab data */
+		text_len = gtk_text_get_length(GTK_TEXT(pd->away_text));
+		pd->edited_message = gtk_editable_get_chars(GTK_EDITABLE(pd->away_text), 0, text_len);
+
+		/* Store the data for later use */
+		strcpy(a->message, pd->edited_message);
+
+	}
+	
+	save_prefs();
+
+	if (event == NULL)
+	{
+		gtk_widget_destroy(pd->window);
+		debugbutton=NULL;
+	}
+	g_free(pd);
+	pd = NULL;
+
+	
+        return FALSE;
+}
+
+static int
+manualentry_key_pressed(GtkWidget *w, GdkEvent *event, void *dummy)
+{
+        g_snprintf(web_command, sizeof(web_command), "%s", gtk_entry_get_text(GTK_ENTRY(pd->browser_entry)));
+        save_prefs();
+	return TRUE;
+}
+
+static int
+connection_key_pressed(GtkWidget *w, GdkEvent *event, void *dummy)
+{
+	g_snprintf(aim_host, sizeof(aim_host), "%s", gtk_entry_get_text(GTK_ENTRY(pd->aim_host_entry)));
+	sscanf(gtk_entry_get_text(GTK_ENTRY(pd->aim_port_entry)), "%d", &aim_port);
+	g_snprintf(proxy_host, sizeof(proxy_host), "%s", gtk_entry_get_text(GTK_ENTRY(pd->http_proxy_host_entry)));
+	sscanf(gtk_entry_get_text(GTK_ENTRY(pd->http_proxy_port_entry)), "%d", &proxy_port);
+
+	g_snprintf(login_host, sizeof(login_host), "%s", gtk_entry_get_text(GTK_ENTRY(pd->login_host_entry)));
+	sscanf(gtk_entry_get_text(GTK_ENTRY(pd->login_port_entry)), "%d", &login_port);	
+	save_prefs();
+	return TRUE;
+}
+
+
+
+                   
+static void set_browser(GtkWidget *w, int *data)
+{
+	web_browser = (int)data;
+        if (web_browser != BROWSER_MANUAL) {
+                if (pd->browser_entry)
+                        gtk_widget_set_sensitive(pd->browser_entry, FALSE);
+        } else {
+                if (pd->browser_entry)
+                        gtk_widget_set_sensitive(pd->browser_entry, TRUE);
+        }
+        
+        if (web_browser != BROWSER_NETSCAPE) {
+                if (pd->nwbutton)
+                        gtk_widget_set_sensitive(pd->nwbutton, FALSE);
+        } else {
+                if (pd->nwbutton)
+                        gtk_widget_set_sensitive(pd->nwbutton, TRUE);
+        }
+        
+
+        save_prefs();
+}
+
+static void set_connect(GtkWidget *w, int *data)
+{
+	proxy_type = (int)data;
+	if (proxy_type == PROXY_HTTP) {
+                if (pd->http_proxy_host_entry)
+                        gtk_widget_set_sensitive(pd->http_proxy_host_entry, TRUE);
+		if (pd->http_proxy_port_entry)
+			gtk_widget_set_sensitive(pd->http_proxy_port_entry, TRUE);
+
+	} else {
+                if (pd->http_proxy_host_entry)
+                        gtk_widget_set_sensitive(pd->http_proxy_host_entry, FALSE);
+		if (pd->http_proxy_port_entry)
+			gtk_widget_set_sensitive(pd->http_proxy_port_entry, FALSE);
+
+	}
+        
+        save_prefs();
+}
+
+static void set_idle(GtkWidget *w, int *data)
+{
+	report_idle = (int)data;
+        save_prefs();
+}
+
+
+GtkWidget *gaim_button(const char *text, int *options, int option, GtkWidget *page)
+{
+	GtkWidget *button;
+	button = gtk_check_button_new_with_label(text);
+	gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button), (*options & option));
+	gtk_box_pack_start(GTK_BOX(page), button, FALSE, FALSE, 0);
+
+	if (options == &font_options)
+		gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_font_option), (int *)option);
+
+	if (options == &sound_options)
+		gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_sound_option), (int *)option);
+	if (options == &display_options)
+		gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_display_option), (int *)option);
+
+	if (options == &general_options)
+		gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_general_option), (int *)option);
+	gtk_widget_show(button);
+
+	return button;
+}
+
+
+void build_prefs()
+{
+	GtkWidget *bbox;
+	GtkWidget *vbox;
+	GtkWidget *hbox;
+        GtkWidget *hbox2;
+        GtkWidget *idlebox;
+        GtkWidget *idleframe;
+        GtkWidget *genbox;
+	GtkWidget *fontbox;
+	GtkWidget *fontframe;
+	GtkWidget *appbox;
+	GtkWidget *away_topbox;
+	GtkWidget *away_botbox;
+	GtkWidget *add_away;
+	GtkWidget *remove_away;
+	GtkWidget *close;
+	GtkWidget *notebook;
+	GtkWidget *sound_page;
+	/* GtkWidget *debug_page; */
+	GtkWidget *general_page;
+	GtkWidget *appearance_page;
+	GtkWidget *chat_page;
+        GtkWidget *browser_page;
+        GtkWidget *connection_page;
+        GtkWidget *label;
+        GtkWidget *browseropt;
+        GtkWidget *connectopt;
+        GtkWidget *idleopt;
+	        
+        GList *awy = away_messages;
+        struct away_message *a;
+        GtkWidget *sw;
+	GtkWidget *sw2;
+	GtkWidget *away_page;
+
+	GtkWidget *list_item;
+
+	gchar buffer[64];
+
+
+	if (!pd)
+                pd = g_new0(struct prefs_data, 1);
+
+	pd->window = gtk_window_new(GTK_WINDOW_DIALOG);
+        gtk_widget_realize(pd->window);
+	aol_icon(pd->window->window);
+	gtk_container_border_width(GTK_CONTAINER(pd->window), 10);
+	gtk_window_set_title(GTK_WINDOW(pd->window), "Gaim - Preferences");
+	
+        vbox = gtk_vbox_new(FALSE, 5);
+        gtk_container_add(GTK_CONTAINER(pd->window), vbox);
+
+	/* Notebooks */
+	notebook = gtk_notebook_new();
+	gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 5);
+
+
+	/* General page */
+	general_page = gtk_hbox_new(FALSE, 0);
+	label = gtk_label_new("General");
+	gtk_widget_show(label);
+        gtk_notebook_append_page(GTK_NOTEBOOK(notebook), general_page, label);
+
+        genbox = gtk_vbox_new(FALSE, 5);
+        idleframe = gtk_frame_new("Idle");
+        idlebox = gtk_vbox_new(FALSE, 5);
+
+        gtk_box_pack_start(GTK_BOX(general_page), genbox, TRUE, TRUE, 5);
+        gtk_box_pack_start(GTK_BOX(general_page), idleframe, TRUE, TRUE, 5);
+        gtk_container_add(GTK_CONTAINER(idleframe), idlebox);
+
+        
+	gaim_button("Enter sends message", &general_options, OPT_GEN_ENTER_SENDS, genbox);
+	gaim_button("Auto-login", &general_options, OPT_GEN_AUTO_LOGIN, genbox);
+	gaim_button("Log All Conversations", &general_options, OPT_GEN_LOG_ALL, genbox);
+	gaim_button("Strip HTML from log files", &general_options, OPT_GEN_STRIP_HTML, genbox);
+#ifdef USE_APPLET
+	gaim_button("Automatically Show Buddy List", &applet_buddy_auto_show, genbox);
+#endif
+	gaim_button("Raise windows when message recieved", &general_options, OPT_GEN_POPUP_WINDOWS, genbox);
+        gaim_button("Send URLs as links", &general_options, OPT_GEN_SEND_LINKS, genbox);
+	gaim_button("Show Lag-O-Meter", &general_options, OPT_GEN_SHOW_LAGMETER, genbox);
+        gaim_button("Save some window size/positions", &general_options, OPT_GEN_SAVED_WINDOWS, genbox);
+        gaim_button("Ignore new conversations when away", &general_options, OPT_GEN_DISCARD_WHEN_AWAY, genbox);
+        debugbutton = gaim_button("Enable debug mode", &general_options, OPT_GEN_DEBUG, genbox);
+
+
+        idleopt = gtk_radio_button_new_with_label(NULL, "No Idle");
+        gtk_box_pack_start(GTK_BOX(idlebox), idleopt, FALSE, FALSE, 0);
+        gtk_signal_connect(GTK_OBJECT(idleopt), "clicked", GTK_SIGNAL_FUNC(set_idle), (void *)IDLE_NONE);
+	gtk_widget_show(idleopt);
+        if (report_idle == IDLE_NONE)
+                gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(idleopt), TRUE);
+
+        idleopt = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(idleopt)), "GAIM Use");
+        gtk_box_pack_start(GTK_BOX(idlebox), idleopt, FALSE, FALSE, 0);
+        gtk_signal_connect(GTK_OBJECT(idleopt), "clicked", GTK_SIGNAL_FUNC(set_idle), (void *)IDLE_GAIM);
+	gtk_widget_show(idleopt);
+        if (report_idle == IDLE_GAIM)
+                gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(idleopt), TRUE);
+
+/*        idleopt = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(idleopt)), "X Use");
+        gtk_box_pack_start(GTK_BOX(idlebox), idleopt, FALSE, FALSE, 0);
+        gtk_signal_connect(GTK_OBJECT(idleopt), "clicked", GTK_SIGNAL_FUNC(set_idle), (void *)IDLE_SYSTEM);
+	gtk_widget_show(idleopt);
+        if (report_idle == IDLE_SYSTEM)
+                gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(idleopt), TRUE);
+*/
+        
+        gtk_widget_show(general_page);
+        gtk_widget_show(genbox);
+        gtk_widget_show(idlebox);
+        gtk_widget_show(idleframe);
+
+
+//        gtk_signal_connect_object( GTK_OBJECT(debugbutton), "clicked", GTK_SIGNAL_FUNC(show_debug), NULL);
+
+        /* Connection */
+        
+        connection_page = gtk_vbox_new(FALSE, 0);
+        label = gtk_label_new("Connection");
+        gtk_widget_show(label);
+	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), connection_page, label);
+
+	hbox = gtk_hbox_new(FALSE, 0);
+	label = gtk_label_new("TOC Host:");
+	gtk_widget_show(label);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+        pd->aim_host_entry = gtk_entry_new();
+        gtk_widget_show(pd->aim_host_entry);
+	gtk_box_pack_start(GTK_BOX(hbox), pd->aim_host_entry, FALSE, FALSE, 0);
+
+	label = gtk_label_new("Port:");
+	gtk_widget_show(label);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+        pd->aim_port_entry = gtk_entry_new();
+        gtk_widget_show(pd->aim_port_entry);
+	gtk_box_pack_start(GTK_BOX(hbox), pd->aim_port_entry, FALSE, FALSE, 0);
+	gtk_widget_show(hbox);
+	
+	gtk_box_pack_start(GTK_BOX(connection_page), hbox, FALSE, FALSE, 0);
+	gtk_entry_set_text(GTK_ENTRY(pd->aim_host_entry), aim_host);
+
+	g_snprintf(buffer, sizeof(buffer), "%d", aim_port);
+	gtk_entry_set_text(GTK_ENTRY(pd->aim_port_entry), buffer);
+        
+        hbox2 = gtk_hbox_new(FALSE, 0);
+        label = gtk_label_new("Login Host:");
+        gtk_widget_show(label);
+        gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 5);
+        pd->login_host_entry = gtk_entry_new();
+        gtk_widget_show(pd->login_host_entry);
+        gtk_box_pack_start(GTK_BOX(hbox2), pd->login_host_entry, FALSE, FALSE, 0);
+
+        label = gtk_label_new("Port:");
+        gtk_widget_show(label);
+        gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 5);
+        pd->login_port_entry = gtk_entry_new();
+        gtk_widget_show(pd->login_port_entry);
+        gtk_box_pack_start(GTK_BOX(hbox2), pd->login_port_entry, FALSE, FALSE, 0);
+        gtk_widget_show(hbox2);
+
+        gtk_box_pack_start(GTK_BOX(connection_page), hbox2, FALSE, FALSE, 0);
+        gtk_entry_set_text(GTK_ENTRY(pd->login_host_entry), login_host);
+
+        g_snprintf(buffer, sizeof(buffer), "%d", login_port);
+        gtk_entry_set_text(GTK_ENTRY(pd->login_port_entry), buffer);
+
+        connectopt = gtk_radio_button_new_with_label(NULL, "No Proxy");
+        gtk_box_pack_start(GTK_BOX(connection_page), connectopt, FALSE, FALSE, 0);
+        gtk_signal_connect(GTK_OBJECT(connectopt), "clicked", GTK_SIGNAL_FUNC(set_connect), (void *)PROXY_NONE);
+	gtk_widget_show(connectopt);
+        if (proxy_type == PROXY_NONE)
+                gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(connectopt), TRUE);
+
+        connectopt = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(connectopt)), "HTTP Proxy");
+        gtk_box_pack_start(GTK_BOX(connection_page), connectopt, FALSE, FALSE, 0);
+        gtk_signal_connect(GTK_OBJECT(connectopt), "clicked", GTK_SIGNAL_FUNC(set_connect), (void *)PROXY_HTTP);
+	gtk_widget_show(connectopt);
+	if (proxy_type == PROXY_HTTP)
+                gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(connectopt), TRUE);
+
+
+	hbox = gtk_hbox_new(FALSE, 0);
+	label = gtk_label_new("Proxy Host:");
+	gtk_widget_show(label);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+        pd->http_proxy_host_entry = gtk_entry_new();
+        gtk_widget_show(pd->http_proxy_host_entry);
+	gtk_box_pack_start(GTK_BOX(hbox), pd->http_proxy_host_entry, FALSE, FALSE, 0);
+
+	label = gtk_label_new("Port:");
+	gtk_widget_show(label);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+        pd->http_proxy_port_entry = gtk_entry_new();
+        gtk_widget_show(pd->http_proxy_port_entry);
+	gtk_box_pack_start(GTK_BOX(hbox), pd->http_proxy_port_entry, FALSE, FALSE, 0);
+	gtk_widget_show(hbox);
+	
+	gtk_box_pack_start(GTK_BOX(connection_page), hbox, FALSE, FALSE, 0);
+	gtk_entry_set_text(GTK_ENTRY(pd->http_proxy_host_entry), proxy_host);
+
+	g_snprintf(buffer, sizeof(buffer), "%d", proxy_port);
+	gtk_entry_set_text(GTK_ENTRY(pd->http_proxy_port_entry), buffer);
+
+
+	gtk_widget_show(connection_page);
+
+
+	if (proxy_type == PROXY_HTTP) {
+                if (pd->http_proxy_host_entry)
+                        gtk_widget_set_sensitive(pd->http_proxy_host_entry, TRUE);
+		if (pd->http_proxy_port_entry)
+			gtk_widget_set_sensitive(pd->http_proxy_port_entry, TRUE);
+
+	} else {
+                if (pd->http_proxy_host_entry)
+                        gtk_widget_set_sensitive(pd->http_proxy_host_entry, FALSE);
+		if (pd->http_proxy_port_entry)
+			gtk_widget_set_sensitive(pd->http_proxy_port_entry, FALSE);
+
+	}
+
+	
+
+	gtk_signal_connect(GTK_OBJECT(pd->aim_host_entry), "focus_out_event", GTK_SIGNAL_FUNC(connection_key_pressed), NULL);
+        gtk_signal_connect(GTK_OBJECT(pd->aim_port_entry), "focus_out_event", GTK_SIGNAL_FUNC(connection_key_pressed), NULL);
+	gtk_signal_connect(GTK_OBJECT(pd->login_host_entry), "focus_out_event", GTK_SIGNAL_FUNC(connection_key_pressed), NULL);
+	gtk_signal_connect(GTK_OBJECT(pd->login_port_entry), "focus_out_event", GTK_SIGNAL_FUNC(connection_key_pressed), NULL);
+	gtk_signal_connect(GTK_OBJECT(pd->http_proxy_host_entry), "focus_out_event", GTK_SIGNAL_FUNC(connection_key_pressed), NULL);
+        gtk_signal_connect(GTK_OBJECT(pd->http_proxy_port_entry), "focus_out_event", GTK_SIGNAL_FUNC(connection_key_pressed), NULL);
+
+	
+	/* Away */
+	
+        a = awaymessage;
+        pd->cur_message = NULL;
+        pd->nwbutton = NULL;
+        pd->browser_entry = NULL;
+        
+	away_page = gtk_vbox_new(FALSE, 0);
+	away_topbox = gtk_hbox_new(FALSE, 0);
+	away_botbox = gtk_hbox_new(FALSE, 0);
+
+	label = gtk_label_new("Away");
+	gtk_widget_show(label);
+	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), away_page, label);
+	gtk_widget_show(away_page);
+
+	sw2 = gtk_scrolled_window_new(NULL, NULL);
+    	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw2),
+				       GTK_POLICY_AUTOMATIC,
+				       GTK_POLICY_AUTOMATIC);
+	gtk_widget_show(sw2);
+
+	pd->away_list = gtk_list_new();
+	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), pd->away_list);
+	gtk_box_pack_start(GTK_BOX(away_topbox), sw2, TRUE, TRUE, 0);
+
+	sw = gtk_scrolled_window_new(NULL, NULL);
+    	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
+				       GTK_POLICY_AUTOMATIC,
+				       GTK_POLICY_AUTOMATIC);
+	gtk_widget_show(sw);
+    
+	pd->away_text = gtk_text_new(NULL, NULL);
+	gtk_container_add(GTK_CONTAINER(sw), pd->away_text);
+	gtk_box_pack_start(GTK_BOX(away_topbox), sw, TRUE, TRUE, 0);
+	gtk_text_set_word_wrap(GTK_TEXT(pd->away_text), TRUE);
+	gtk_text_set_editable(GTK_TEXT(pd->away_text), TRUE );
+
+	add_away = gtk_button_new_with_label("Create Message");
+	gtk_signal_connect(GTK_OBJECT(add_away), "clicked", GTK_SIGNAL_FUNC(create_away_mess), NULL);
+	gtk_box_pack_start(GTK_BOX(away_botbox), add_away, TRUE, FALSE, 5);
+
+	remove_away = gtk_button_new_with_label("Remove Message");
+	gtk_signal_connect(GTK_OBJECT(remove_away), "clicked", GTK_SIGNAL_FUNC(remove_away_message), NULL);
+	gtk_box_pack_start(GTK_BOX(away_botbox), remove_away, TRUE, FALSE, 5);
+
+	gtk_box_pack_start(GTK_BOX(away_page), away_topbox, TRUE, TRUE, 0);
+	gtk_box_pack_start(GTK_BOX(away_page), away_botbox, FALSE, FALSE, 0);
+
+	gtk_widget_show(add_away);
+	gtk_widget_show(remove_away);
+	gtk_widget_show(pd->away_list);
+	gtk_widget_show(pd->away_text);
+	gtk_widget_show(away_topbox);
+	gtk_widget_show(away_botbox);
+    
+	if (awy != NULL) {
+		a = (struct away_message *)awy->data;
+		g_snprintf(buffer, sizeof(buffer), "%s", a->message);
+		gtk_text_insert(GTK_TEXT(pd->away_text), NULL, NULL, NULL, buffer, -1);
+	}
+
+        while(awy) {
+		a = (struct away_message *)awy->data;
+		label = gtk_label_new(a->name);
+		list_item = gtk_list_item_new();
+		gtk_container_add(GTK_CONTAINER(list_item), label);
+		gtk_signal_connect(GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(away_list_clicked), a);
+		gtk_signal_connect(GTK_OBJECT(list_item), "deselect", GTK_SIGNAL_FUNC(away_list_unclicked), a);
+		gtk_object_set_user_data(GTK_OBJECT(list_item), a);
+               
+		gtk_widget_show(label);
+		gtk_container_add(GTK_CONTAINER(pd->away_list), list_item);
+		gtk_widget_show(list_item);
+	
+		awy = awy->next;
+
+	}
+       
+	/* Sound */
+	sound_page = gtk_vbox_new(FALSE, 0);
+	label = gtk_label_new("Sounds");
+	gtk_widget_show(label);
+	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), sound_page, label);
+        gaim_button("Sound when buddy logs in", &sound_options, OPT_SOUND_LOGIN, sound_page);
+	gaim_button("Sound when buddy logs out", &sound_options, OPT_SOUND_LOGOUT, sound_page);
+        gaim_button("Sound when message is received", &sound_options, OPT_SOUND_RECV, sound_page);
+	gaim_button("Sound when message is sent", &sound_options, OPT_SOUND_SEND, sound_page);
+        gaim_button("Sound when first message is received", &sound_options, OPT_SOUND_FIRST_RCV, sound_page);
+        gaim_button("Sound when message is received if away", &sound_options, OPT_SOUND_WHEN_AWAY, sound_page);
+        gtk_widget_show(sound_page);
+
+
+        /* Browser */
+        browser_page = gtk_vbox_new(FALSE, 0);
+
+        label = gtk_label_new("Browser");
+        gtk_widget_show(label);
+        
+
+        gtk_notebook_append_page(GTK_NOTEBOOK(notebook), browser_page, label);
+        browseropt = gtk_radio_button_new_with_label(NULL, "Netscape");
+        gtk_box_pack_start(GTK_BOX(browser_page), browseropt, FALSE, FALSE, 0);
+        gtk_signal_connect(GTK_OBJECT(browseropt), "clicked", GTK_SIGNAL_FUNC(set_browser), (void *)BROWSER_NETSCAPE);
+	gtk_widget_show(browseropt);
+        if (web_browser == BROWSER_NETSCAPE)
+                gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(browseropt), TRUE);
+
+        browseropt = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(browseropt)), "KFM (The KDE browser)");
+        gtk_box_pack_start(GTK_BOX(browser_page), browseropt, FALSE, FALSE, 0);
+        gtk_signal_connect(GTK_OBJECT(browseropt), "clicked", GTK_SIGNAL_FUNC(set_browser), (void *)BROWSER_KFM);
+	gtk_widget_show(browseropt);
+	if (web_browser == BROWSER_KFM)
+                gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(browseropt), TRUE);
+
+
+        browseropt = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(browseropt)), "Internal HTML widget (Quite likely a bad idea!)");
+        gtk_box_pack_start(GTK_BOX(browser_page), browseropt, FALSE, FALSE, 0);
+        gtk_signal_connect(GTK_OBJECT(browseropt), "clicked", GTK_SIGNAL_FUNC(set_browser), (void *)BROWSER_INTERNAL);
+	gtk_widget_show(browseropt);
+	if (web_browser == BROWSER_INTERNAL)
+                gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(browseropt), TRUE);
+
+        
+        browseropt = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(browseropt)), "Manual");
+        gtk_box_pack_start(GTK_BOX(browser_page), browseropt, FALSE, FALSE, 0);
+        gtk_signal_connect(GTK_OBJECT(browseropt), "clicked", GTK_SIGNAL_FUNC(set_browser), (void *)BROWSER_MANUAL);
+        gtk_widget_show(browseropt);
+	if (web_browser == BROWSER_MANUAL)
+                gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(browseropt), TRUE);
+
+
+        pd->browser_entry = gtk_entry_new();
+        gtk_widget_show(pd->browser_entry);
+
+        gtk_box_pack_start(GTK_BOX(browser_page), pd->browser_entry, FALSE, FALSE, 0);
+        gtk_entry_set_text(GTK_ENTRY(pd->browser_entry), web_command);
+
+	pd->nwbutton = gaim_button("Pop up new window by default", &general_options, OPT_GEN_BROWSER_POPUP, browser_page);
+	gtk_widget_show(browser_page);
+
+        gtk_signal_connect(GTK_OBJECT(pd->browser_entry), "focus_out_event", GTK_SIGNAL_FUNC(manualentry_key_pressed), NULL);
+
+        
+
+        if (web_browser != BROWSER_MANUAL) {
+                gtk_widget_set_sensitive(pd->browser_entry, FALSE);
+        } else {
+                gtk_widget_set_sensitive(pd->browser_entry, TRUE);
+        }
+        
+        if (web_browser != BROWSER_NETSCAPE) {
+                gtk_widget_set_sensitive(pd->nwbutton, FALSE);
+        } else {
+                gtk_widget_set_sensitive(pd->nwbutton, TRUE);
+        }
+        
+
+
+
+	/* Appearance */
+	appearance_page = gtk_hbox_new(FALSE, 0);
+        label = gtk_label_new("Appearance");
+        gtk_widget_show(label);
+	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), appearance_page, label);
+	appbox = gtk_vbox_new(FALSE, 5);
+	fontframe = gtk_frame_new("Font Properties");
+	fontbox = gtk_vbox_new(FALSE, 5);
+
+	gtk_box_pack_start(GTK_BOX(appearance_page), appbox, TRUE, TRUE, 5);
+	gtk_box_pack_start(GTK_BOX(appearance_page), fontframe, TRUE, TRUE, 5);
+	gtk_container_add(GTK_CONTAINER(fontframe), fontbox);
+
+	gaim_button("Show time on messages", &display_options, OPT_DISP_SHOW_TIME, appbox);
+	gaim_button("Show numbers in groups", &display_options, OPT_DISP_SHOW_GRPNUM, appbox );
+	gaim_button("Show buddy-type pixmaps", &display_options, OPT_DISP_SHOW_PIXMAPS, appbox );
+	gaim_button("Show idle times", &display_options, OPT_DISP_SHOW_IDLETIME, appbox );
+	gaim_button("Show button pixmaps", &display_options, OPT_DISP_SHOW_BUTTON_XPM, appbox );
+	gaim_button("Ignore incoming colours", &display_options, OPT_DISP_IGNORE_COLOUR, appbox );
+#if 0
+	gaim_button("Transparent text window (experimental)", &transparent, appbox );
+#endif
+	gaim_button("Show logon/logoffs in conversation windows", &display_options, OPT_DISP_SHOW_LOGON, appbox );
+	
+	
+	gaim_button("Bold Text", &font_options, OPT_FONT_BOLD, fontbox);
+	gaim_button("Italics Text", &font_options, OPT_FONT_ITALIC, fontbox);
+	gaim_button("Underlined Text", &font_options, OPT_FONT_UNDERLINE, fontbox);
+	gaim_button("Strike Text", &font_options, OPT_FONT_STRIKE, fontbox);
+
+	gtk_widget_show(appearance_page);
+	gtk_widget_show(fontbox);
+	gtk_widget_show(fontframe);
+	gtk_widget_show(appbox);	
+
+
+	/* Buddy Chats */
+	chat_page = gtk_vbox_new(FALSE, 0);
+	label = gtk_label_new("Buddy Chats");
+
+	gtk_widget_show(label);
+	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), chat_page, label);
+	
+	do_chat_page(chat_page);
+	gtk_widget_show(chat_page);
+	
+	bbox = gtk_hbox_new(FALSE, 5);
+	close = gtk_button_new_with_label("Close");
+	
+	/* Pack the button(s) in the button box */
+	gtk_box_pack_end(GTK_BOX(bbox), close, FALSE, FALSE, 5);
+	gtk_box_pack_start(GTK_BOX(vbox),bbox, FALSE, FALSE, 5);
+
+	gtk_widget_show(notebook);
+        gtk_widget_show(close);
+
+	gtk_widget_show(bbox);
+	gtk_widget_show(vbox);
+
+	gtk_signal_connect(GTK_OBJECT(close), "clicked", GTK_SIGNAL_FUNC(handle_delete), NULL);
+        gtk_signal_connect(GTK_OBJECT(pd->window),"delete_event", GTK_SIGNAL_FUNC(handle_delete), NULL);
+
+}
+
+void show_prefs()
+{
+	if (!pd || !pd->window)
+		build_prefs();
+	gtk_widget_show(pd->window);
+}
+void add_chat(GtkWidget *w, struct chat_page *cp)
+{
+	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 (!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_prefs();
+	
+
+}
+
+void remove_chat(GtkWidget *w, struct chat_page *cp)
+{
+	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_prefs();
+}
+
+void refresh_list(GtkWidget *w, struct chat_page *cp)
+{
+	char *text = grab_url("http://www.aol.com/community/chat/allchats.html");
+	char *c;
+	int len = strlen(text);
+	GtkWidget *item;
+	GList *items = GTK_LIST(cp->list1)->children;
+	struct chat_room *cr;
+	c = 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 (!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);
+}
+
+
+
+void do_chat_page(GtkWidget *page)
+{
+	GtkWidget *table;
+	GtkWidget *rem_button, *add_button, *ref_button;
+	GtkWidget *list1, *list2;
+	GtkWidget *label;
+	GtkWidget *sw1, *sw2;
+	GtkWidget *item;
+	struct chat_page *cp = g_new0(struct chat_page, 1);
+	GList *crs = chat_rooms;
+	GList *items = NULL;
+	struct chat_room *cr;
+
+	table = gtk_table_new(4, 2, FALSE);
+	gtk_widget_show(table);
+	
+
+	gtk_box_pack_start(GTK_BOX(page), 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 = gtk_button_new_with_label("Refresh");
+	add_button = gtk_button_new_with_label("Add");
+	rem_button = gtk_button_new_with_label("Remove");
+	gtk_widget_show(list1);
+	gtk_widget_show(sw1);
+	gtk_widget_show(list2);
+	gtk_widget_show(sw2);
+	gtk_widget_show(ref_button);
+	gtk_widget_show(add_button);
+	gtk_widget_show(rem_button);
+
+	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);
+}
+
+
+	
+
+
+void debug_print(char *chars)
+{
+	if(general_options & OPT_GEN_DEBUG)
+            gtk_text_insert(GTK_TEXT(dw->entry),NULL, NULL, NULL, chars, strlen(chars));
+#ifdef DEBUG
+        printf("%s\n", chars);
+#endif
+}
+
+
+void build_debug()
+{
+	GtkWidget *scroll;
+	GtkWidget *box;
+	if (!dw)
+		dw = g_new0(struct debug_window, 1);
+
+	box = gtk_hbox_new(FALSE,0);
+	dw->window = gtk_window_new(GTK_WINDOW_DIALOG);
+	gtk_window_set_title(GTK_WINDOW(dw->window), "GAIM debug output window");
+	gtk_container_add(GTK_CONTAINER(dw->window), box);
+	dw->entry = gtk_text_new(NULL,NULL);
+	gtk_widget_set_usize(dw->entry, 500, 200);
+	scroll = gtk_vscrollbar_new(GTK_TEXT(dw->entry)->vadj);
+	gtk_box_pack_start(GTK_BOX(box), dw->entry, TRUE,TRUE,0);
+	gtk_box_pack_end(GTK_BOX(box), scroll,FALSE,FALSE,0);
+	gtk_widget_show(dw->entry);
+	gtk_widget_show(scroll);
+	gtk_widget_show(box);
+	gtk_signal_connect(GTK_OBJECT(dw->window),"delete_event", GTK_SIGNAL_FUNC(debug_delete), NULL);
+	gtk_widget_show(dw->window);
+}
+
+
+
+void show_debug(GtkObject * object)
+{
+	if((general_options & OPT_GEN_DEBUG)) {
+                if(!dw || !dw->window)
+                        build_debug();
+                gtk_widget_show(dw->window);
+        } else {
+                gtk_widget_destroy(dw->window);
+                dw->window = NULL;
+	}
+}
+