src/gtkpounce.c

changeset 5032
2276c67b0243
child 5051
17caa7e7287c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gtkpounce.c	Sat Apr 05 10:14:21 2003 +0000
@@ -0,0 +1,772 @@
+/**
+ * @file gtkpounce.h GTK+ buddy pounce API
+ *
+ * gaim
+ *
+ * Copyright (C) 2003, Christian Hammond <chipx86@gnupdate.org>
+ * 
+ * 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 "gaim.h"
+#include "gtkpounce.h"
+#include "gtklist.h"
+#include "prpl.h"
+#include "sound.h"
+
+struct gaim_gtkpounce_dialog
+{
+	/* Pounce data */
+	struct gaim_pounce  *pounce;
+	struct gaim_account *account;
+
+	/* The window */
+	GtkWidget *window;
+
+	/* Pounce Who */
+	GtkWidget *account_menu;
+	GtkWidget *buddy_entry;
+
+	/* Pounce When */
+	GtkWidget *signon;
+	GtkWidget *signoff;
+	GtkWidget *away;
+	GtkWidget *away_return;
+	GtkWidget *idle;
+	GtkWidget *idle_return;
+	GtkWidget *typing;
+	GtkWidget *stop_typing;
+
+	/* Pounce Action */
+	GtkWidget *open_win;
+	GtkWidget *popup;
+	GtkWidget *send_msg;
+	GtkWidget *send_msg_entry;
+	GtkWidget *exec_cmd;
+	GtkWidget *exec_cmd_entry;
+	GtkWidget *play_sound;
+	GtkWidget *play_sound_entry;
+
+	GtkWidget *save_pounce;
+};
+
+/**************************************************************************
+ * Callbacks
+ **************************************************************************/
+static gint
+delete_win_cb(GtkWidget *w, GdkEventAny *e,
+			  struct gaim_gtkpounce_dialog *dialog)
+{
+	gtk_widget_destroy(dialog->window);
+	g_free(dialog);
+
+	return TRUE;
+}
+
+static void
+cancel_cb(GtkWidget *w, struct gaim_gtkpounce_dialog *dialog)
+{
+	delete_win_cb(NULL, NULL, dialog);
+}
+
+
+static void
+save_pounce_cb(GtkWidget *w, struct gaim_gtkpounce_dialog *dialog)
+{
+	const char *name;
+	const char *message, *command, *sound;
+	struct gaim_buddy_list *blist;
+	struct gaim_gtk_buddy_list *gtkblist;
+	GaimPounceEvent events = GAIM_POUNCE_NONE;
+	GaimGtkPounceAction actions = GAIM_GTKPOUNCE_NONE;
+	gboolean save;
+
+	name = gtk_entry_get_text(GTK_ENTRY(dialog->buddy_entry));
+
+	if (*name == '\0') {
+		do_error_dialog(_("Please enter a buddy to pounce."), NULL, GAIM_ERROR);
+		return;
+	}
+
+	/* Events */
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->signon)))
+		events |= GAIM_POUNCE_SIGNON;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->signoff)))
+		events |= GAIM_POUNCE_SIGNOFF;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->away)))
+		events |= GAIM_POUNCE_AWAY;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->away_return)))
+		events |= GAIM_POUNCE_AWAY_RETURN;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->idle)))
+		events |= GAIM_POUNCE_IDLE;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->idle_return)))
+		events |= GAIM_POUNCE_IDLE_RETURN;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->typing)))
+		events |= GAIM_POUNCE_TYPING;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->stop_typing)))
+		events |= GAIM_POUNCE_TYPING_STOPPED;
+
+
+	/* Actions */
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->open_win)))
+		actions |= GAIM_GTKPOUNCE_OPEN_WIN;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->popup)))
+		actions |= GAIM_GTKPOUNCE_POPUP;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->send_msg)))
+		actions |= GAIM_GTKPOUNCE_SEND_MSG;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->exec_cmd)))
+		actions |= GAIM_GTKPOUNCE_EXEC_CMD;
+
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->play_sound)))
+		actions |= GAIM_GTKPOUNCE_PLAY_SOUND;
+
+	save = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->save_pounce));
+
+	/* Data fields */
+	message = gtk_entry_get_text(GTK_ENTRY(dialog->send_msg_entry));
+	command = gtk_entry_get_text(GTK_ENTRY(dialog->exec_cmd_entry));
+	sound   = gtk_entry_get_text(GTK_ENTRY(dialog->play_sound_entry));
+
+	if (*message == '\0') message = NULL;
+	if (*command == '\0') command = NULL;
+	if (*sound   == '\0') sound   = NULL;
+
+	if (dialog->pounce == NULL)
+	{
+		gaim_gtkpounce_new(dialog->account, name, events, actions,
+						   message, command, sound, save);
+	}
+	else
+	{
+		struct gaim_gtkpounce_data *pounce_data;
+
+		gaim_pounce_set_events(dialog->pounce, events);
+		gaim_pounce_set_pouncer(dialog->pounce, dialog->account);
+		gaim_pounce_set_pouncee(dialog->pounce, name);
+
+		pounce_data = GAIM_GTKPOUNCE(dialog->pounce);
+
+		if (pounce_data->message != NULL) g_free(pounce_data->message);
+		if (pounce_data->command != NULL) g_free(pounce_data->command);
+		if (pounce_data->sound   != NULL) g_free(pounce_data->sound);
+
+		pounce_data->message = (message == NULL ? NULL : g_strdup(message));
+		pounce_data->command = (command == NULL ? NULL : g_strdup(command));
+		pounce_data->sound   = (sound   == NULL ? NULL : g_strdup(sound));
+
+		pounce_data->actions = actions;
+		pounce_data->save    = save;
+	}
+
+	delete_win_cb(NULL, NULL, dialog);
+
+	/* Rebuild the pounce menu */
+	blist = gaim_get_blist();
+
+	if (GAIM_IS_GTK_BLIST(blist))
+	{
+		gtkblist = GAIM_GTK_BLIST(blist);
+
+		gaim_gtkpounce_menu_build(gtkblist->bpmenu);
+	}
+
+	save_prefs();
+}
+
+static GtkWidget *
+pounce_choose_cb(GtkWidget *item, struct gaim_gtkpounce_dialog *dialog)
+{
+	dialog->account = g_object_get_data(G_OBJECT(item), "user_data");
+}
+
+static GtkWidget *
+pounce_user_menu(struct gaim_gtkpounce_dialog *dialog)
+{
+	struct gaim_account *account;
+	struct prpl *prpl;
+	GtkWidget *opt_menu;
+	GtkWidget *menu;
+	GtkWidget *item;
+	GSList *l;
+	char buf[2048];
+	int count, place;
+
+	opt_menu = gtk_option_menu_new();
+	menu = gtk_menu_new();
+
+	for (l = gaim_accounts, count = 0; l != NULL; l = l->next, count++) {
+		account = (struct gaim_account *)l->data;
+
+		prpl = (struct prpl *)find_prpl(account->protocol);
+
+		g_snprintf(buf, sizeof(buf), "%s (%s)", account->username,
+				   (prpl && prpl->name) ? prpl->name : _("Unknown"));
+
+		item = gtk_menu_item_new_with_label(buf);
+		g_object_set_data(G_OBJECT(item), "user_data", account);
+
+		g_signal_connect(G_OBJECT(item), "activate",
+						 G_CALLBACK(pounce_choose_cb), dialog);
+
+		gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+		gtk_widget_show(item);
+
+		if (dialog->account == account) {
+			gtk_menu_item_activate(GTK_MENU_ITEM(item));
+			place = count;
+		}
+	}
+
+	gtk_option_menu_set_menu(GTK_OPTION_MENU(opt_menu), menu);
+	gtk_option_menu_set_history(GTK_OPTION_MENU(opt_menu), place);
+
+	return opt_menu;
+}
+
+static void
+pounce_cb(struct gaim_pounce *pounce, GaimPounceEvent events, void *data)
+{
+	struct gaim_conversation *conv;
+	struct gaim_account *account;
+	struct gaim_gtkpounce_data *pounce_data;
+	const char *pouncee;
+
+	pounce_data = (struct gaim_gtkpounce_data *)data;
+	pouncee     = gaim_pounce_get_pouncee(pounce);
+	account     = gaim_pounce_get_pouncer(pounce);
+
+	if (pounce_data->actions & GAIM_GTKPOUNCE_OPEN_WIN) {
+		conv = gaim_find_conversation(pouncee);
+
+		if (conv == NULL)
+			conv = gaim_conversation_new(GAIM_CONV_IM, account, pouncee);
+	}
+
+	if (pounce_data->actions & GAIM_GTKPOUNCE_POPUP) {
+		char tmp[1024];
+
+		g_snprintf(tmp, sizeof(tmp),
+				   (events & GAIM_POUNCE_TYPING) ? _("%s has started typing to you") :
+				   (events & GAIM_POUNCE_SIGNON) ? _("%s has signed on") :
+				   (events & GAIM_POUNCE_IDLE_RETURN) ? _("%s has returned from being idle") :
+				   (events & GAIM_POUNCE_AWAY_RETURN) ? _("%s has returned from being away") :
+				   (events & GAIM_POUNCE_TYPING_STOPPED) ? _("%s has stopped typing to you") :
+				   (events & GAIM_POUNCE_SIGNOFF) ? _("%s has signed off") :
+				   (events & GAIM_POUNCE_IDLE) ? _("%s has become idle") :
+				   (events & GAIM_POUNCE_AWAY) ? _("%s has gone away.") :
+				   _("Unknown pounce event. Please report this!"),
+				   pouncee);
+
+		do_error_dialog(tmp, NULL, GAIM_INFO);
+	}
+
+	if (pounce_data->actions & GAIM_GTKPOUNCE_SEND_MSG &&
+		*pounce_data->message != '\0') {
+
+		conv = gaim_find_conversation(pouncee);
+
+		if (conv == NULL)
+			conv = gaim_conversation_new(GAIM_CONV_IM, account, pouncee);
+
+		gaim_conversation_write(conv, NULL, pounce_data->message, -1,
+								WFLAG_SEND, time(NULL));
+
+		serv_send_im(account->gc, (char *)pouncee, pounce_data->message, -1, 0);
+	}
+
+	if (pounce_data->actions & GAIM_GTKPOUNCE_EXEC_CMD &&
+		*pounce_data->command != '\0') {
+#ifndef _WIN32
+		int pid = fork();
+
+		if (pid == 0) {
+			char *args[4];
+
+			args[0] = "sh";
+			args[1] = "-c";
+			args[2] = pounce_data->command;
+			args[3] = NULL;
+
+			execvp(args[0], args);
+
+			_exit(0);
+		}
+#endif /* _WIN32 */
+	}
+
+	if (pounce_data->actions & GAIM_GTKPOUNCE_PLAY_SOUND) {
+		if (*pounce_data->sound != '\0')
+			gaim_sound_play_file(pounce_data->sound);
+		else
+			gaim_sound_play_event(GAIM_SOUND_POUNCE_DEFAULT);
+	}
+
+	if (!pounce_data->save)
+		gaim_pounce_destroy(pounce);
+}
+
+static void
+free_pounce(void *data)
+{
+	struct gaim_gtkpounce_data *pounce_data;
+	struct gaim_buddy_list *blist;
+	struct gaim_gtk_buddy_list *gtkblist;
+
+	pounce_data = (struct gaim_gtkpounce_data *)data;
+
+	if (pounce_data->message != NULL) g_free(pounce_data->message);
+	if (pounce_data->command != NULL) g_free(pounce_data->command);
+	if (pounce_data->sound   != NULL) g_free(pounce_data->sound);
+
+	g_free(data);
+
+	/* Rebuild the pounce menu */
+	blist = gaim_get_blist();
+
+	if (GAIM_IS_GTK_BLIST(blist))
+	{
+		gtkblist = GAIM_GTK_BLIST(blist);
+
+		gaim_gtkpounce_menu_build(gtkblist->bpmenu);
+	}
+
+	save_prefs();
+}
+
+struct gaim_pounce *
+gaim_gtkpounce_new(struct gaim_account *pouncer, const char *pouncee,
+				   GaimPounceEvent events, GaimGtkPounceAction actions,
+				   const char *message, const char *command,
+				   const char *sound, gboolean save)
+{
+	struct gaim_gtkpounce_data *data;
+
+	data = g_new0(struct gaim_gtkpounce_data, 1);
+
+	data->actions = actions;
+
+	if (message != NULL) data->message = g_strdup(message);
+	if (command != NULL) data->command = g_strdup(command);
+	if (sound   != NULL) data->sound   = g_strdup(sound);
+
+	data->save = save;
+
+	return gaim_pounce_new(pouncer, pouncee, events, pounce_cb, data,
+						   free_pounce);
+}
+
+void
+gaim_gtkpounce_dialog_show(struct buddy *buddy,
+						   struct gaim_pounce *cur_pounce)
+{
+	struct gaim_gtkpounce_dialog *dialog;
+	GtkWidget *window;
+	GtkWidget *label;
+	GtkWidget *bbox;
+	GtkWidget *vbox1, *vbox2;
+	GtkWidget *hbox;
+	GtkWidget *button;
+	GtkWidget *frame;
+	GtkWidget *table;
+	GtkWidget *optmenu;
+	GtkWidget *sep;
+	GtkSizeGroup *sg;
+
+	dialog = g_new0(struct gaim_gtkpounce_dialog, 1);
+
+	if (cur_pounce != NULL) {
+		dialog->pounce  = cur_pounce;
+		dialog->account = gaim_pounce_get_pouncer(cur_pounce);
+	}
+	else if (buddy != NULL) {
+		dialog->pounce  = NULL;
+		dialog->account = buddy->account;
+	}
+	else {
+		dialog->pounce  = NULL;
+		dialog->account = gaim_accounts->data;
+	}
+
+	sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
+	/* Create the window. */
+	dialog->window = window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
+	gtk_window_set_role(GTK_WINDOW(window), "buddy_pounce");
+	gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+	gtk_window_set_title(GTK_WINDOW(window),
+						 (cur_pounce == NULL
+						  ? _("New Buddy Pounce") : _("Edit Buddy Pounce")));
+
+	gtk_container_set_border_width(GTK_CONTAINER(window), 12);
+	gtk_widget_realize(window);
+
+	g_signal_connect(G_OBJECT(window), "delete_event",
+					 G_CALLBACK(delete_win_cb), dialog);
+
+	/* Create the parent vbox for everything. */
+	vbox1 = gtk_vbox_new(FALSE, 12);
+	gtk_container_add(GTK_CONTAINER(window), vbox1);
+	gtk_widget_show(vbox1);
+
+	/* Create the vbox that will contain all the prefs stuff. */
+	vbox2 = gtk_vbox_new(FALSE, 18);
+	gtk_box_pack_start(GTK_BOX(vbox1), vbox2, TRUE, TRUE, 0);
+
+	/* Create the "Pounce Who" frame. */
+	frame = make_frame(vbox2, _("Pounce Who"));
+
+	/* Account: */
+	hbox = gtk_hbox_new(FALSE, 6);
+	gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+	gtk_widget_show(hbox);
+
+	label = gtk_label_new_with_mnemonic(_("_Account:"));
+	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_widget_show(label);
+	gtk_size_group_add_widget(sg, label);
+
+	dialog->account_menu = pounce_user_menu(dialog);
+	gtk_box_pack_start(GTK_BOX(hbox), dialog->account_menu, FALSE, FALSE, 0);
+	gtk_widget_show(dialog->account_menu);
+
+	/* Buddy: */
+	hbox = gtk_hbox_new(FALSE, 6);
+	gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+	gtk_widget_show(hbox);
+
+	label = gtk_label_new_with_mnemonic(_("_Buddy Name:"));
+	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_widget_show(label);
+	gtk_size_group_add_widget(sg, label);
+
+	dialog->buddy_entry = gtk_entry_new();
+	gtk_box_pack_start(GTK_BOX(hbox), dialog->buddy_entry, TRUE, TRUE, 0);
+	gtk_widget_show(dialog->buddy_entry);
+
+	if (cur_pounce != NULL) {
+		gtk_entry_set_text(GTK_ENTRY(dialog->buddy_entry),
+						   gaim_pounce_get_pouncee(cur_pounce));
+	}
+	else if (buddy != NULL) {
+		gtk_entry_set_text(GTK_ENTRY(dialog->buddy_entry), buddy->name);
+	}
+
+	/* Create the "Pounce When" frame. */
+	frame = make_frame(vbox2, _("Pounce When"));
+
+	table = gtk_table_new(2, 4, FALSE);
+	gtk_container_add(GTK_CONTAINER(frame), table);
+	gtk_table_set_col_spacings(GTK_TABLE(table), 12);
+	gtk_widget_show(table);
+
+	dialog->signon =
+		gtk_check_button_new_with_label(_("Sign on"));
+	dialog->signoff =
+		gtk_check_button_new_with_label(_("Sign off"));
+	dialog->away =
+		gtk_check_button_new_with_label(_("Away"));
+	dialog->away_return =
+		gtk_check_button_new_with_label(_("Return from away"));
+	dialog->idle =
+		gtk_check_button_new_with_label(_("Idle"));
+	dialog->idle_return =
+		gtk_check_button_new_with_label(_("Return from idle"));
+	dialog->typing =
+		gtk_check_button_new_with_label(_("Buddy starts typing"));
+	dialog->stop_typing =
+		gtk_check_button_new_with_label(_("Buddy stops typing"));
+
+	gtk_table_attach(GTK_TABLE(table), dialog->signon,      0, 1, 0, 1,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->signoff,     1, 2, 0, 1,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->away,        0, 1, 1, 2,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->away_return, 1, 2, 1, 2,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->idle,        0, 1, 2, 3,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->idle_return, 1, 2, 2, 3,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->typing,      0, 1, 3, 4,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->stop_typing, 1, 2, 3, 4,
+					 GTK_FILL, 0, 0, 0);
+
+	gtk_widget_show(dialog->signon);
+	gtk_widget_show(dialog->signoff);
+	gtk_widget_show(dialog->away);
+	gtk_widget_show(dialog->away_return);
+	gtk_widget_show(dialog->idle);
+	gtk_widget_show(dialog->idle_return);
+	gtk_widget_show(dialog->typing);
+	gtk_widget_show(dialog->stop_typing);
+
+	/* Create the "Pounce Action" frame. */
+	frame = make_frame(vbox2, _("Pounce Action"));
+
+	table = gtk_table_new(2, 5, FALSE);
+	gtk_container_add(GTK_CONTAINER(frame), table);
+	gtk_table_set_col_spacings(GTK_TABLE(table), 12);
+	gtk_widget_show(table);
+
+	dialog->open_win = gtk_check_button_new_with_label(_("Open an IM window"));
+	dialog->popup = gtk_check_button_new_with_label(_("Popup notification"));
+	dialog->send_msg = gtk_check_button_new_with_label(_("Send a message"));
+	dialog->exec_cmd = gtk_check_button_new_with_label(_("Execute a command"));
+	dialog->play_sound = gtk_check_button_new_with_label(_("Play a Sound"));
+
+	dialog->send_msg_entry   = gtk_entry_new();
+	dialog->exec_cmd_entry   = gtk_entry_new();
+	dialog->play_sound_entry = gtk_entry_new();
+
+	gtk_widget_set_sensitive(dialog->send_msg_entry,   FALSE);
+	gtk_widget_set_sensitive(dialog->exec_cmd_entry,   FALSE);
+	gtk_widget_set_sensitive(dialog->play_sound_entry, FALSE);
+
+	gtk_table_attach(GTK_TABLE(table), dialog->open_win,         0, 1, 0, 1,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->popup,            0, 1, 1, 2,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->send_msg,         0, 1, 2, 3,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->send_msg_entry,   1, 2, 2, 3,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->exec_cmd,         0, 1, 3, 4,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->exec_cmd_entry,   1, 2, 3, 4,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->play_sound,       0, 1, 4, 5,
+					 GTK_FILL, 0, 0, 0);
+	gtk_table_attach(GTK_TABLE(table), dialog->play_sound_entry, 1, 2, 4, 5,
+					 GTK_FILL, 0, 0, 0);
+
+	gtk_widget_show(dialog->open_win);
+	gtk_widget_show(dialog->popup);
+	gtk_widget_show(dialog->send_msg);
+	gtk_widget_show(dialog->send_msg_entry);
+	gtk_widget_show(dialog->exec_cmd);
+	gtk_widget_show(dialog->exec_cmd_entry);
+	gtk_widget_show(dialog->play_sound);
+	gtk_widget_show(dialog->play_sound_entry);
+
+	g_signal_connect(G_OBJECT(dialog->send_msg), "clicked",
+					 G_CALLBACK(gaim_gtk_toggle_sensitive),
+					 dialog->send_msg_entry);
+	g_signal_connect(G_OBJECT(dialog->exec_cmd), "clicked",
+					 G_CALLBACK(gaim_gtk_toggle_sensitive),
+					 dialog->exec_cmd_entry);
+	g_signal_connect(G_OBJECT(dialog->play_sound), "clicked",
+					 G_CALLBACK(gaim_gtk_toggle_sensitive),
+					 dialog->play_sound_entry);
+
+	g_signal_connect(G_OBJECT(dialog->send_msg_entry), "activate",
+					 G_CALLBACK(save_pounce_cb), dialog);
+	g_signal_connect(G_OBJECT(dialog->exec_cmd_entry), "activate",
+					 G_CALLBACK(save_pounce_cb), dialog);
+	g_signal_connect(G_OBJECT(dialog->play_sound_entry), "activate",
+					 G_CALLBACK(save_pounce_cb), dialog);
+
+	/* Now the last part, where we have the Save checkbox */
+	dialog->save_pounce = gtk_check_button_new_with_mnemonic(
+		_("_Save this pounce after activation"));
+
+	gtk_box_pack_start(GTK_BOX(vbox2), dialog->save_pounce, FALSE, FALSE, 0);
+
+	/* Separator... */
+	sep = gtk_hseparator_new();
+	gtk_box_pack_start(GTK_BOX(vbox1), sep, FALSE, FALSE, 0);
+	gtk_widget_show(sep);
+
+	/* Now the button box! */
+	bbox = gtk_hbutton_box_new();
+	gtk_box_set_spacing(GTK_BOX(bbox), 6);
+	gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+	gtk_box_pack_end(GTK_BOX(vbox1), bbox, FALSE, FALSE, 0);
+	gtk_widget_show(bbox);
+
+	/* Cancel button */
+	button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+	gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
+	gtk_widget_show(button);
+
+	g_signal_connect(G_OBJECT(button), "clicked",
+					 G_CALLBACK(cancel_cb), dialog);
+
+	/* OK button */
+	button = gtk_button_new_from_stock(GTK_STOCK_OK);
+	gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
+	gtk_widget_show(button);
+	
+	g_signal_connect(G_OBJECT(button), "clicked",
+					 G_CALLBACK(save_pounce_cb), dialog);
+
+	/* Set the values of stuff. */
+	if (cur_pounce != NULL) {
+		GaimPounceEvent events;
+		GaimGtkPounceAction actions;
+		struct gaim_gtkpounce_data *pounce_data;
+
+		pounce_data = GAIM_GTKPOUNCE(cur_pounce);
+		events      = gaim_pounce_get_events(cur_pounce);
+		actions     = pounce_data->actions;
+
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->signon),
+									(events & GAIM_POUNCE_SIGNON));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->signoff),
+									(events & GAIM_POUNCE_SIGNOFF));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->away),
+									(events & GAIM_POUNCE_AWAY));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->away_return),
+									(events & GAIM_POUNCE_AWAY_RETURN));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->idle),
+									(events & GAIM_POUNCE_IDLE));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->idle_return),
+									(events & GAIM_POUNCE_IDLE_RETURN));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->typing),
+									(events & GAIM_POUNCE_TYPING));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->stop_typing),
+									(events & GAIM_POUNCE_TYPING_STOPPED));
+
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->open_win),
+									(actions & GAIM_GTKPOUNCE_OPEN_WIN));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->popup),
+									(actions & GAIM_GTKPOUNCE_POPUP));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->send_msg),
+									(actions & GAIM_GTKPOUNCE_SEND_MSG));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->exec_cmd),
+									(actions & GAIM_GTKPOUNCE_EXEC_CMD));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->play_sound),
+									(actions & GAIM_GTKPOUNCE_PLAY_SOUND));
+
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->save_pounce),
+									 pounce_data->save);
+
+		gtk_entry_set_text(GTK_ENTRY(dialog->send_msg_entry),
+						   pounce_data->message);
+		gtk_entry_set_text(GTK_ENTRY(dialog->exec_cmd_entry),
+						   pounce_data->command);
+		gtk_entry_set_text(GTK_ENTRY(dialog->play_sound_entry),
+						   pounce_data->sound);
+	}
+	else {
+		/* Set some defaults */
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->send_msg), TRUE);
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->signon), TRUE);
+	}
+
+	gtk_widget_show_all(vbox2);
+	gtk_widget_show(window);
+}
+
+static void
+new_pounce_cb(GtkWidget *w, struct buddy *b)
+{
+	gaim_gtkpounce_dialog_show(b, NULL);
+}
+
+static void
+edit_pounce_cb(GtkWidget *w, struct gaim_pounce *pounce)
+{
+	struct buddy *buddy;
+
+	buddy = gaim_find_buddy(gaim_pounce_get_pouncer(pounce),
+							gaim_pounce_get_pouncee(pounce));
+
+	gaim_gtkpounce_dialog_show(buddy, pounce);
+}
+
+void
+gaim_gtkpounce_menu_build(GtkWidget *menu)
+{
+	GtkWidget *remmenu, *submenu, *item;
+	GList *l;
+	GList *bp;
+	struct gaim_pounce *pounce;
+	const char *buddy;
+
+	for (l = gtk_container_get_children(GTK_CONTAINER(menu));
+		 l != NULL;
+		 l = l->next) {
+
+		gtk_widget_destroy(GTK_WIDGET(l->data));
+	}
+
+	/* "New Buddy Pounce" */
+	item = gtk_menu_item_new_with_label(_("New Buddy Pounce"));
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+	gtk_widget_show(item);
+	g_signal_connect(G_OBJECT(item), "activate",
+					 G_CALLBACK(new_pounce_cb), NULL);
+
+	/* "Remove Buddy Pounce" */
+	item = gtk_menu_item_new_with_label(_("Remove Buddy Pounce"));
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+
+	/* "Remove Buddy Pounce" menu */
+	remmenu = gtk_menu_new();
+
+	for (bp = gaim_get_pounces(); bp != NULL; bp = bp->next) {
+		pounce = (struct gaim_pounce *)bp->data;
+		buddy = gaim_pounce_get_pouncee(pounce);
+
+		item = gtk_menu_item_new_with_label(buddy);
+		gtk_menu_shell_append(GTK_MENU_SHELL(remmenu), item);
+		gtk_widget_show(item);
+
+		g_signal_connect(G_OBJECT(item), "activate",
+						 G_CALLBACK(edit_pounce_cb), pounce);
+	}
+
+	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), remmenu);
+	gtk_widget_show(remmenu);
+	gtk_widget_show(item);
+
+	/* Separator */
+	item = gtk_separator_menu_item_new();
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+	gtk_widget_show(item);
+
+	/* Pounces */
+	for (bp = gaim_get_pounces(); bp != NULL; bp = bp->next) {
+		struct gaim_gtkpounce_data *pounce_data;
+
+		pounce = (struct gaim_pounce *)bp->data;
+		buddy = gaim_pounce_get_pouncee(pounce);
+
+		pounce_data = GAIM_GTKPOUNCE(pounce);
+
+		item = gtk_menu_item_new_with_label(buddy);
+		gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+		gtk_widget_show(item);
+
+		g_signal_connect(G_OBJECT(item), "activate",
+						 G_CALLBACK(edit_pounce_cb), pounce);
+	}
+}
+

mercurial