Mercurial > pidgin.yaz
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