changeset 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 966c4e460ebb
children 9349de0706e6
files ChangeLog plugins/mailchk.c src/buddy.c src/buddy_chat.c src/conversation.c src/gaim.h src/multi.c src/prefs.c src/server.c src/sound.c
diffstat 10 files changed, 251 insertions(+), 193 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Mar 15 20:09:14 2002 +0000
+++ b/ChangeLog	Sat Mar 16 00:32:53 2002 +0000
@@ -3,6 +3,9 @@
 version 0.55:
 	* Better Jabber list management when using multiple
 	  resources (Thanks Jim Seymour)
+	* Various sound cleanups (Thanks Robert McQueen)
+	* Login process shown in single window (Thanks Michael 
+	  Golden)
 	
 version 0.54 (03/14/2002):
 	* Compiles without GdkPixbuf again
--- a/plugins/mailchk.c	Fri Mar 15 20:09:14 2002 +0000
+++ b/plugins/mailchk.c	Sat Mar 16 00:32:53 2002 +0000
@@ -69,7 +69,7 @@
 	}
 
 	if (count & NEW_MAIL)
-		play_sound(POUNCE_DEFAULT);
+		play_sound(SND_POUNCE_DEFAULT);
 
 	if (count & UNREAD_MAIL)
 		gtk_label_set_text(GTK_LABEL(mail), "You have new mail!");
--- a/src/buddy.c	Fri Mar 15 20:09:14 2002 +0000
+++ b/src/buddy.c	Sat Mar 16 00:32:53 2002 +0000
@@ -1559,7 +1559,7 @@
 				if (strlen(b->sound))
 					play_file(b->sound);
 				else
-					play_sound(POUNCE_DEFAULT);
+					play_sound(SND_POUNCE_DEFAULT);
 			}
 
 			if (!(b->options & OPT_POUNCE_SAVE))
@@ -2155,7 +2155,7 @@
 		}
 		if (b->present == 1) {
 			if (bs->sound != 2)
-				play_sound(BUDDY_ARRIVE);
+				play_sound(SND_BUDDY_ARRIVE);
 			pm = gdk_pixmap_create_from_xpm_d(blist->window, &bm,
 							  NULL, (char **)login_icon_xpm);
 			gtk_widget_hide(bs->pix);
@@ -2218,7 +2218,7 @@
 				   buddies that have already signed
 				   off */
 		if (bs->sound != 1)
-			play_sound(BUDDY_LEAVE);
+			play_sound(SND_BUDDY_LEAVE);
 
 		bs->connlist = g_slist_remove(bs->connlist, gc);
 		update_num_group(gs);
--- a/src/buddy_chat.c	Fri Mar 15 20:09:14 2002 +0000
+++ b/src/buddy_chat.c	Sat Mar 16 00:32:53 2002 +0000
@@ -706,16 +706,16 @@
 	if (!(flag & WFLAG_WHISPER)) {
 		str = g_strdup(normalize (who));
 		if (!g_strcasecmp(str, normalize(b->gc->username))) {
-			if (b->makesound && (sound_options & OPT_SOUND_CHAT_YOU_SAY))
-				play_sound(CHAT_YOU_SAY);
+			if (b->makesound)
+				play_sound(SND_CHAT_YOU_SAY);
 			flag |= WFLAG_SEND;
 		} else if (!g_strcasecmp(str, normalize(b->gc->displayname))) {
-			if (b->makesound && (sound_options & OPT_SOUND_CHAT_YOU_SAY))
-				play_sound(CHAT_YOU_SAY);
+			if (b->makesound)
+				play_sound(SND_CHAT_YOU_SAY);
 			flag |= WFLAG_SEND;
 		} else {
-			if (b->makesound && (sound_options & OPT_SOUND_CHAT_SAY))
-				play_sound(CHAT_SAY);
+			if (b->makesound)
+				play_sound(SND_CHAT_SAY);
 			flag |= WFLAG_RECV;
 		}
 		g_free(str);
@@ -923,8 +923,8 @@
 		   g_list_length(b->in_room) == 1 ? "person" : "people");
 	gtk_label_set_text(GTK_LABEL(b->count), tmp);
 
-	if (b->makesound && (sound_options & OPT_SOUND_CHAT_JOIN))
-		play_sound(CHAT_JOIN);
+	if (b->makesound)
+		play_sound(SND_CHAT_JOIN);
 
 	if (chat_options & OPT_CHAT_LOGON) {
 		g_snprintf(tmp, sizeof(tmp), _("%s entered the room."), name);
@@ -1035,8 +1035,8 @@
 		   g_list_length(b->in_room) == 1 ? "person" : "people");
 	gtk_label_set_text(GTK_LABEL(b->count), tmp);
 
-	if (b->makesound && (sound_options & OPT_SOUND_CHAT_PART))
-		play_sound(CHAT_LEAVE);
+	if (b->makesound)
+		play_sound(SND_CHAT_LEAVE);
 
 	if (chat_options & OPT_CHAT_LOGON) {
 		if (reason && *reason)
--- a/src/conversation.c	Fri Mar 15 20:09:14 2002 +0000
+++ b/src/conversation.c	Sat Mar 16 00:32:53 2002 +0000
@@ -1183,8 +1183,8 @@
 						write_to_conv(c, bigbuf, WFLAG_SEND, NULL, time(NULL), length);
 					else
 						write_to_conv(c, buffy, WFLAG_SEND, NULL, time(NULL), -1);
-					if (c->makesound && (sound_options & OPT_SOUND_SEND))
-						play_sound(SEND);
+					if (c->makesound)
+						play_sound(SND_SEND);
 					if (im_options & OPT_IM_POPDOWN)
 						gtk_widget_hide(c->window);
 					
@@ -1196,8 +1196,8 @@
 				err =serv_send_im(c->gc, c->name, buffy, -1, imflags);
 				if (err > 0) { 
 					write_to_conv(c, buf, WFLAG_SEND, NULL, time(NULL), -1);
-					if (c->makesound && (sound_options & OPT_SOUND_SEND))
-						play_sound(SEND);
+					if (c->makesound)
+						play_sound(SND_SEND);
 					if (im_options & OPT_IM_POPDOWN)
 						gtk_widget_hide(c->window);
 				}
--- a/src/gaim.h	Fri Mar 15 20:09:14 2002 +0000
+++ b/src/gaim.h	Sat Mar 16 00:32:53 2002 +0000
@@ -279,19 +279,29 @@
 #define OPT_SOUND_ESD			0x00010000
 #define OPT_SOUND_CMD			0x00020000
 
-#define BUDDY_ARRIVE 0
-#define BUDDY_LEAVE 1
-#define RECEIVE 2
-#define FIRST_RECEIVE 3
-#define SEND 4
-#define CHAT_JOIN 5
-#define CHAT_LEAVE 6
-#define CHAT_YOU_SAY 7
-#define CHAT_SAY 8
-#define POUNCE_DEFAULT 9
+/* remember to also change the struct in sound.c */
+#define SND_BUDDY_ARRIVE 0
+#define SND_BUDDY_LEAVE 1
+#define SND_RECEIVE 2
+#define SND_FIRST_RECEIVE 3
+#define SND_SEND 4
+#define SND_CHAT_JOIN 5
+#define SND_CHAT_LEAVE 6
+#define SND_CHAT_YOU_SAY 7
+#define SND_CHAT_SAY 8
+#define SND_POUNCE_DEFAULT 9
 #define NUM_SOUNDS 10
 extern char *sound_file[NUM_SOUNDS];
 
+/* global sound struct */
+struct sound_struct {
+	char *label;
+	guint opt;
+	unsigned char *snd;
+	size_t snd_size;
+};
+extern struct sound_struct sounds[];
+
 extern guint away_options;
 #define OPT_AWAY_DISCARD		0x00000001
 #define OPT_AWAY_BACK_ON_IM		0x00000002
--- 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);
 	}
--- a/src/prefs.c	Fri Mar 15 20:09:14 2002 +0000
+++ b/src/prefs.c	Sat Mar 16 00:32:53 2002 +0000
@@ -1484,6 +1484,8 @@
 	guint32 tmp_sound = sound_options;
 	if (!(sound_options & OPT_SOUND_WHEN_AWAY))
 		sound_options ^= OPT_SOUND_WHEN_AWAY;
+	if (!(sound_options & sounds[snd].opt))
+		sound_options ^= sounds[snd].opt;
 	play_sound(snd);
 	sound_options = tmp_sound;
 }
@@ -1525,7 +1527,7 @@
 	gdk_window_raise(sounddialog->window);
 }
 
-static void sound_entry(char *label, int opt, GtkWidget *box, int snd)
+static void sound_entry(GtkWidget *box, int snd)
 {
 	GtkWidget *hbox;
 	GtkWidget *entry;
@@ -1535,7 +1537,7 @@
 	gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
 	gtk_widget_show(hbox);
 
-	gaim_button(label, &sound_options, opt, hbox);
+	gaim_button(sounds[snd].label, &sound_options, sounds[snd].opt, hbox);
 
 	button = gtk_button_new_with_label(_("Test"));
 	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 3);
@@ -1599,7 +1601,7 @@
 	GtkWidget *omenu;
 	GtkWidget *menu;
 	GtkWidget *opt;
-	int i=1, driver=0;
+	int i=1, driver=0, j;
 
 	parent = prefdialog->parent;
 	gtk_widget_destroy(prefdialog);
@@ -1648,7 +1650,7 @@
 	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
 	gtk_widget_show(hbox);
 
-	label = gtk_label_new(_("Sound Player:"));
+	label = gtk_label_new(_("Sound method"));
 	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
 	gtk_widget_show(label);
 
@@ -1718,15 +1720,11 @@
 	gtk_box_pack_start(GTK_BOX(hbox), omenu, FALSE, FALSE, 5);
 	gtk_widget_show_all(omenu);
 
-	sep = gtk_hseparator_new();
-	gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0);
-	gtk_widget_show(sep);
-
 	hbox = gtk_hbox_new(TRUE, 5);
 	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
 	gtk_widget_show(hbox);
 
-	label = gtk_label_new(_("Command to play sound files\n(%s for filename)"));
+	label = gtk_label_new(_("Sound command\n(%s for filename)"));
 	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
 	gtk_widget_show(label);
 
@@ -1738,7 +1736,7 @@
 	gtk_widget_set_sensitive(sndcmd, (OPT_SOUND_CMD & sound_options));
 	gtk_widget_show(sndcmd);
 
-	frame = gtk_frame_new(_("Events"));
+	frame = gtk_frame_new(_("Sound played when:"));
 	gtk_box_pack_start(GTK_BOX(box), frame, FALSE, FALSE, 5);
 	gtk_widget_show(frame);
 
@@ -1746,26 +1744,20 @@
 	gtk_container_add(GTK_CONTAINER(frame), vbox);
 	gtk_widget_show(vbox);
 
-	sound_entry(_("Sound when buddy logs in"), OPT_SOUND_LOGIN, vbox, BUDDY_ARRIVE);
-	sound_entry(_("Sound when buddy logs out"), OPT_SOUND_LOGOUT, vbox, BUDDY_LEAVE);
-
-	sep = gtk_hseparator_new();
-	gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 5);
-	gtk_widget_show(sep);
-
-	sound_entry(_("Sound when received message begins conversation"), OPT_SOUND_FIRST_RCV, vbox,
-		    FIRST_RECEIVE);
-	sound_entry(_("Sound when message is received"), OPT_SOUND_RECV, vbox, RECEIVE);
-	sound_entry(_("Sound when message is sent"), OPT_SOUND_SEND, vbox, SEND);
-
-	sep = gtk_hseparator_new();
-	gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 5);
-	gtk_widget_show(sep);
-
-	sound_entry(_("Sound in chat rooms when people enter"), OPT_SOUND_CHAT_JOIN, vbox, CHAT_JOIN);
-	sound_entry(_("Sound in chat rooms when people leave"), OPT_SOUND_CHAT_PART, vbox, CHAT_LEAVE);
-	sound_entry(_("Sound in chat rooms when you talk"), OPT_SOUND_CHAT_YOU_SAY, vbox, CHAT_YOU_SAY);
-	sound_entry(_("Sound in chat rooms when others talk"), OPT_SOUND_CHAT_SAY, vbox, CHAT_SAY);
+	for (j=0; j < NUM_SOUNDS; j++) {
+		/* no entry for the buddy pounce sound, it's configurable per-pounce */
+		if (j == SND_POUNCE_DEFAULT)
+			continue;
+
+		/* seperators before SND_RECEIVE and SND_CHAT_JOIN */
+		if ((j == SND_RECEIVE) || (j == SND_CHAT_JOIN)) {
+			sep = gtk_hseparator_new();
+			gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 5);
+			gtk_widget_show(sep);
+		}
+
+		sound_entry(vbox, j);
+	}
 
 	gtk_widget_show(prefdialog);
 }
--- a/src/server.c	Fri Mar 15 20:09:14 2002 +0000
+++ b/src/server.c	Sat Mar 16 00:32:53 2002 +0000
@@ -584,9 +584,9 @@
 				set_convo_gc(cnv, gc);
 			}
 			if (new_conv && (sound_options & OPT_SOUND_FIRST_RCV))
-				play_sound(FIRST_RECEIVE);
-			else if (cnv->makesound && (sound_options & OPT_SOUND_RECV))
-				play_sound(RECEIVE);
+				play_sound(SND_FIRST_RECEIVE);
+			else if (cnv->makesound)
+				play_sound(SND_RECEIVE);
 
 			write_to_conv(cnv, message, away | WFLAG_RECV, NULL, mtime, len);
 		}
@@ -645,9 +645,9 @@
 			set_convo_gc(cnv, gc);
 		}
 		if (new_conv && (sound_options & OPT_SOUND_FIRST_RCV))
-			play_sound(FIRST_RECEIVE);
-		else if (cnv->makesound && (sound_options & OPT_SOUND_RECV))
-			play_sound(RECEIVE);
+			play_sound(SND_FIRST_RECEIVE);
+		else if (cnv->makesound)
+			play_sound(SND_RECEIVE);
 
 		set_convo_name(cnv, name);
 
--- a/src/sound.c	Fri Mar 15 20:09:14 2002 +0000
+++ b/src/sound.c	Sat Mar 16 00:32:53 2002 +0000
@@ -52,6 +52,22 @@
 #include "sounds/Receive.h"
 #include "sounds/RedAlert.h"
 
+/* label and opt are null for the buddy pounce because it's configured *
+ * per pounce. NULL option means it doesn't get displayed in the sound *
+ * preferences box */
+struct sound_struct sounds[NUM_SOUNDS] = {
+	N_("Buddy logs in"), OPT_SOUND_LOGIN, BuddyArrive, sizeof(BuddyArrive),
+	N_("Buddy logs out"), OPT_SOUND_LOGOUT, BuddyLeave, sizeof(BuddyLeave),
+	N_("Message recieved begins conversation"), OPT_SOUND_FIRST_RCV, Receive, sizeof(Receive),
+	N_("Message recieved"), OPT_SOUND_RECV, Receive, sizeof(Receive),
+	N_("Message sent"), OPT_SOUND_SEND, Send, sizeof(Send),
+	N_("Person enters chat"), OPT_SOUND_CHAT_JOIN, BuddyArrive, sizeof(BuddyArrive),
+	N_("Person leaves chat"), OPT_SOUND_CHAT_PART, BuddyLeave, sizeof(BuddyLeave),
+	N_("You talk in chat"), OPT_SOUND_CHAT_YOU_SAY, Send, sizeof(Send),
+	N_("Others talk in chat"), OPT_SOUND_CHAT_SAY, Receive, sizeof(Receive),
+	NULL, NULL, &RedAlert, sizeof(RedAlert)
+};
+
 static int check_dev(char *dev)
 {
 	struct stat stat_buf;
@@ -396,6 +412,10 @@
 		return;
 	}
 
+	else if (sound_options & OPT_SOUND_NORMAL) {
+		debug_printf("attempting to play audio file with internal method -- this is unlikely to work");
+	}
+
 	pid = fork();
 
 	if (pid < 0)
@@ -522,98 +542,23 @@
 
 void play_sound(int sound)
 {
-
 	if (awaymessage && !(sound_options & OPT_SOUND_WHEN_AWAY))
 		return;
 
-	switch (sound) {
-	case BUDDY_ARRIVE:
-		if ((sound_options & OPT_SOUND_LOGIN) && logins_not_muted) {
-			if (sound_file[BUDDY_ARRIVE]) {
-				play_file(sound_file[BUDDY_ARRIVE]);
-			} else {
-				play(BuddyArrive, sizeof(BuddyArrive));
-			}
-		}
-		break;
-	case BUDDY_LEAVE:
-		if (sound_options & OPT_SOUND_LOGOUT) {
-			if (sound_file[BUDDY_LEAVE]) {
-				play_file(sound_file[BUDDY_LEAVE]);
-			} else {
-				play(BuddyLeave, sizeof(BuddyLeave));
-			}
-		}
-		break;
-	case FIRST_RECEIVE:
-		if (sound_options & OPT_SOUND_FIRST_RCV) {
-			if (sound_file[FIRST_RECEIVE]) {
-				play_file(sound_file[FIRST_RECEIVE]);
-			} else {
-				play(Receive, sizeof(Receive));
-			}
-		}
-		break;
-	case RECEIVE:
-		if (sound_options & OPT_SOUND_RECV) {
-			if (sound_file[RECEIVE]) {
-				play_file(sound_file[RECEIVE]);
-			} else {
-				play(Receive, sizeof(Receive));
-			}
-		}
-		break;
-	case SEND:
-		if (sound_options & OPT_SOUND_SEND) {
-			if (sound_file[SEND]) {
-				play_file(sound_file[SEND]);
-			} else {
-				play(Send, sizeof(Send));
-			}
+	if ((sound == SND_BUDDY_ARRIVE) && !logins_not_muted)
+		return;
+
+	if (sound >= NUM_SOUNDS) {
+		debug_printf("sorry old fruit... can't say I know that sound: ", sound);
+		return;
+	}
+
+	/* check NULL for sounds that don't have an option, ie buddy pounce */
+	if ((sound_options & sounds[sound].opt) || (sounds[sound].opt == NULL)) {
+		if (sound_file[sound]) {
+			play_file(sound_file[sound]);
+		} else {
+			play(sounds[sound].snd, sounds[sound].snd_size);
 		}
-		break;
-	case CHAT_JOIN:
-		if (sound_options & OPT_SOUND_CHAT_JOIN) {
-			if (sound_file[CHAT_JOIN]) {
-				play_file(sound_file[CHAT_JOIN]);
-			} else {
-				play(BuddyArrive, sizeof(BuddyArrive));
-			}
-		}
-		break;
-	case CHAT_LEAVE:
-		if (sound_options & OPT_SOUND_CHAT_PART) {
-			if (sound_file[CHAT_LEAVE]) {
-				play_file(sound_file[CHAT_LEAVE]);
-			} else {
-				play(BuddyLeave, sizeof(BuddyLeave));
-			}
-		}
-		break;
-	case CHAT_YOU_SAY:
-		if (sound_options & OPT_SOUND_CHAT_YOU_SAY) {
-			if (sound_file[CHAT_YOU_SAY]) {
-				play_file(sound_file[CHAT_YOU_SAY]);
-			} else {
-				play(Send, sizeof(Send));
-			}
-		}
-		break;
-	case CHAT_SAY:
-		if (sound_options & OPT_SOUND_CHAT_SAY) {
-			if (sound_file[CHAT_SAY]) {
-				play_file(sound_file[CHAT_SAY]);
-			} else {
-				play(Receive, sizeof(Receive));
-			}
-		}
-		break;
-	case POUNCE_DEFAULT:
-		if (sound_file[POUNCE_DEFAULT]) {
-			play_file(sound_file[POUNCE_DEFAULT]);
-		} else {
-			play(RedAlert, sizeof(RedAlert));
-		}
-		break;
 	}
 }