diff src/gtkrequest.c @ 5496:b7c0be69c749

[gaim-migrate @ 5892] do_ask_dialog() will soon go the way of the something that goes away a lot. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Fri, 23 May 2003 00:48:20 +0000
parents 421020171808
children cce2d7868c78
line wrap: on
line diff
--- a/src/gtkrequest.c	Thu May 22 23:59:01 2003 +0000
+++ b/src/gtkrequest.c	Fri May 23 00:48:20 2003 +0000
@@ -77,6 +77,15 @@
 	gaim_request_close(GAIM_REQUEST_INPUT, data);
 }
 
+static void
+__action_response_cb(GtkDialog *dialog, gint id, GaimRequestData *data)
+{
+	if (id < data->cb_count && data->cbs[id] != NULL)
+		((GaimRequestActionCb)data->cbs[id])(id, data->user_data);
+
+	gaim_request_close(GAIM_REQUEST_INPUT, data);
+}
+
 #define STOCK_ITEMIZE(r, l) \
 	if (!strcmp((r), text)) \
 		return (l);
@@ -124,13 +133,6 @@
 	data->cbs[0] = ok_cb;
 	data->cbs[1] = cancel_cb;
 
-#if 0
-	data->dialog = dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-	gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
-	gtk_window_set_role(GTK_WINDOW(dialog), "input");
-	gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-#endif
-
 	/* Create the dialog. */
 	dialog = gtk_dialog_new_with_buttons("", NULL, 0,
 					     __text_to_stock(cancel_text), 1,
@@ -227,7 +229,7 @@
 						const char *secondary, unsigned int default_value,
 						const char *ok_text, GCallback ok_cb,
 						const char *cancel_text, GCallback cancel_cb,
-						void *user_data, va_list args)
+						void *user_data, size_t choice_count, va_list args)
 {
 	return NULL;
 }
@@ -235,9 +237,91 @@
 void *
 gaim_gtk_request_action(const char *title, const char *primary,
 						const char *secondary, unsigned int default_action,
-						void *user_data, va_list actions)
+						void *user_data, size_t action_count, va_list actions)
 {
-	return NULL;
+	GaimRequestData *data;
+	GtkWidget *dialog;
+	GtkWidget *vbox;
+	GtkWidget *hbox;
+	GtkWidget *label;
+	GtkWidget *img;
+	void **buttons;
+	char *label_text;
+	int i;
+
+	data            = g_new0(GaimRequestData, 1);
+	data->type      = GAIM_REQUEST_ACTION;
+	data->user_data = user_data;
+
+	data->cb_count = action_count;
+	data->cbs = g_new0(GCallback, action_count);
+
+	/* Reverse the buttons */
+	buttons = g_new0(void *, action_count * 2);
+
+	for (i = 0; i < action_count * 2; i += 2) {
+		buttons[(action_count * 2) - i - 2] = va_arg(actions, char *);
+		buttons[(action_count * 2) - i - 1] = va_arg(actions, GCallback);
+	}
+
+	/* Create the dialog. */
+	data->dialog = dialog = gtk_dialog_new();
+
+	for (i = 0; i < action_count; i++) {
+		gaim_debug(GAIM_DEBUG_MISC, "gtkrequest",
+				   "buttons[2 * %d] = '%s'\n",
+				   i, buttons[2 * i]);
+		gtk_dialog_add_button(GTK_DIALOG(dialog),
+							  __text_to_stock(buttons[2 * i]), i);
+
+		data->cbs[i] = buttons[2 * i + 1];
+	}
+
+	g_free(buttons);
+
+	g_signal_connect(G_OBJECT(dialog), "response",
+					 G_CALLBACK(__action_response_cb), data);
+
+	/* Setup the dialog */
+	gtk_container_set_border_width(GTK_CONTAINER(dialog), 6);
+	gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
+	gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
+	gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), 12);
+	gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), 6);
+
+	/* Setup the main horizontal box */
+	hbox = gtk_hbox_new(FALSE, 12);
+	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox);
+
+	/* Dialog icon. */
+	img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION,
+								   GTK_ICON_SIZE_DIALOG);
+	gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
+	gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
+
+	/* Vertical box */
+	vbox = gtk_vbox_new(FALSE, 12);
+
+	gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
+
+	/* Descriptive label */
+	label_text = g_strdup_printf("<span weight=\"bold\" size=\"larger\">"
+								 "%s</span>\n\n%s",
+								 primary, (secondary ? secondary : ""));
+
+	label = gtk_label_new(NULL);
+
+	gtk_label_set_markup(GTK_LABEL(label), label_text);
+	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+	gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
+
+	g_free(label_text);
+
+	/* Show everything. */
+	gtk_widget_show_all(dialog);
+
+	return data;
 }
 
 void