| 230 } |
230 } |
| 231 |
231 |
| 232 static void |
232 static void |
| 233 field_choice_menu_cb(GtkComboBox *menu, PurpleRequestField *field) |
233 field_choice_menu_cb(GtkComboBox *menu, PurpleRequestField *field) |
| 234 { |
234 { |
| 235 purple_request_field_choice_set_value(field, |
235 int active = gtk_combo_box_get_active(menu); |
| 236 gtk_combo_box_get_active(menu)); |
236 gpointer *values = g_object_get_data(G_OBJECT(menu), "values"); |
| |
237 |
| |
238 g_return_if_fail(values != NULL); |
| |
239 g_return_if_fail(active >= 0); |
| |
240 |
| |
241 purple_request_field_choice_set_value(field, values[active]); |
| 237 } |
242 } |
| 238 |
243 |
| 239 static void |
244 static void |
| 240 field_choice_option_cb(GtkRadioButton *button, PurpleRequestField *field) |
245 field_choice_option_cb(GtkRadioButton *button, PurpleRequestField *field) |
| 241 { |
246 { |
| 242 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) |
247 int active; |
| 243 purple_request_field_choice_set_value(field, |
248 gpointer *values = g_object_get_data(G_OBJECT(g_object_get_data( |
| 244 (g_slist_length(gtk_radio_button_get_group(button)) - |
249 G_OBJECT(button), "box")), "values"); |
| 245 g_slist_index(gtk_radio_button_get_group(button), button)) - 1); |
250 |
| |
251 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) |
| |
252 return; |
| |
253 |
| |
254 active = (g_slist_length(gtk_radio_button_get_group(button)) - |
| |
255 g_slist_index(gtk_radio_button_get_group(button), button)) - 1; |
| |
256 |
| |
257 g_return_if_fail(values != NULL); |
| |
258 g_return_if_fail(active >= 0); |
| |
259 |
| |
260 purple_request_field_choice_set_value(field, values[active]); |
| 246 } |
261 } |
| 247 |
262 |
| 248 static void |
263 static void |
| 249 field_account_cb(GObject *w, PurpleAccount *account, PurpleRequestField *field) |
264 field_account_cb(GObject *w, PurpleAccount *account, PurpleRequestField *field) |
| 250 { |
265 { |
| 307 STOCK_ITEMIZE(_("Alias"), PIDGIN_STOCK_ALIAS); |
322 STOCK_ITEMIZE(_("Alias"), PIDGIN_STOCK_ALIAS); |
| 308 |
323 |
| 309 return text; |
324 return text; |
| 310 } |
325 } |
| 311 |
326 |
| |
327 static gchar * |
| |
328 pidgin_request_escape(PurpleRequestCommonParameters *cpar, const gchar *text) |
| |
329 { |
| |
330 if (text == NULL) |
| |
331 return NULL; |
| |
332 |
| |
333 if (purple_request_cpar_is_html(cpar)) { |
| |
334 gboolean valid; |
| |
335 |
| |
336 valid = pango_parse_markup(text, -1, 0, NULL, NULL, NULL, NULL); |
| |
337 |
| |
338 if (valid) |
| |
339 return g_strdup(text); |
| |
340 else { |
| |
341 purple_debug_error("pidgin", "Passed label text is not " |
| |
342 "a valid markup. Falling back to plain text."); |
| |
343 } |
| |
344 } |
| |
345 |
| |
346 return g_markup_escape_text(text, -1); |
| |
347 } |
| |
348 |
| |
349 static GtkWidget * |
| |
350 pidgin_request_dialog_icon(PurpleRequestCommonParameters *cpar) |
| |
351 { |
| |
352 GtkWidget *img = NULL; |
| |
353 PurpleRequestIconType icon_type; |
| |
354 gconstpointer icon_data; |
| |
355 gsize icon_size; |
| |
356 const gchar *icon_stock = PIDGIN_STOCK_DIALOG_QUESTION; |
| |
357 |
| |
358 /* Dialog icon. */ |
| |
359 icon_data = purple_request_cpar_get_custom_icon(cpar, &icon_size); |
| |
360 if (icon_data) { |
| |
361 GdkPixbuf *pixbuf; |
| |
362 |
| |
363 pixbuf = pidgin_pixbuf_from_data(icon_data, icon_size); |
| |
364 if (pixbuf) { |
| |
365 /* scale the image if it is too large */ |
| |
366 int width = gdk_pixbuf_get_width(pixbuf); |
| |
367 int height = gdk_pixbuf_get_height(pixbuf); |
| |
368 if (width > 128 || height > 128) { |
| |
369 int scaled_width = width > height ? |
| |
370 128 : (128 * width) / height; |
| |
371 int scaled_height = height > width ? |
| |
372 128 : (128 * height) / width; |
| |
373 GdkPixbuf *scaled; |
| |
374 |
| |
375 purple_debug_info("pidgin", "dialog icon was " |
| |
376 "too large, scaling it down"); |
| |
377 |
| |
378 scaled = gdk_pixbuf_scale_simple(pixbuf, |
| |
379 scaled_width, scaled_height, |
| |
380 GDK_INTERP_BILINEAR); |
| |
381 if (scaled) { |
| |
382 g_object_unref(pixbuf); |
| |
383 pixbuf = scaled; |
| |
384 } |
| |
385 } |
| |
386 img = gtk_image_new_from_pixbuf(pixbuf); |
| |
387 g_object_unref(pixbuf); |
| |
388 } else { |
| |
389 purple_debug_info("pidgin", |
| |
390 "failed to parse dialog icon"); |
| |
391 } |
| |
392 } |
| |
393 |
| |
394 if (img) |
| |
395 return img; |
| |
396 |
| |
397 icon_type = purple_request_cpar_get_icon(cpar); |
| |
398 switch (icon_type) |
| |
399 { |
| |
400 case PURPLE_REQUEST_ICON_REQUEST: |
| |
401 icon_stock = PIDGIN_STOCK_DIALOG_QUESTION; |
| |
402 break; |
| |
403 case PURPLE_REQUEST_ICON_DIALOG: |
| |
404 case PURPLE_REQUEST_ICON_INFO: |
| |
405 icon_stock = PIDGIN_STOCK_DIALOG_INFO; |
| |
406 break; |
| |
407 case PURPLE_REQUEST_ICON_WARNING: |
| |
408 icon_stock = PIDGIN_STOCK_DIALOG_WARNING; |
| |
409 break; |
| |
410 case PURPLE_REQUEST_ICON_ERROR: |
| |
411 icon_stock = PIDGIN_STOCK_DIALOG_ERROR; |
| |
412 break; |
| |
413 /* intentionally no default value */ |
| |
414 } |
| |
415 |
| |
416 img = gtk_image_new_from_stock(icon_stock, |
| |
417 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); |
| |
418 |
| |
419 if (img || icon_type == PURPLE_REQUEST_ICON_REQUEST) |
| |
420 return img; |
| |
421 |
| |
422 return gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, |
| |
423 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); |
| |
424 } |
| |
425 |
| 312 static void * |
426 static void * |
| 313 pidgin_request_input(const char *title, const char *primary, |
427 pidgin_request_input(const char *title, const char *primary, |
| 314 const char *secondary, const char *default_value, |
428 const char *secondary, const char *default_value, |
| 315 gboolean multiline, gboolean masked, gchar *hint, |
429 gboolean multiline, gboolean masked, gchar *hint, |
| 316 const char *ok_text, GCallback ok_cb, |
430 const char *ok_text, GCallback ok_cb, |
| 317 const char *cancel_text, GCallback cancel_cb, |
431 const char *cancel_text, GCallback cancel_cb, |
| 318 PurpleAccount *account, const char *who, PurpleConversation *conv, |
432 PurpleRequestCommonParameters *cpar, |
| 319 void *user_data) |
433 void *user_data) |
| 320 { |
434 { |
| 321 PidginRequestData *data; |
435 PidginRequestData *data; |
| 322 GtkWidget *dialog; |
436 GtkWidget *dialog; |
| 323 GtkWidget *vbox; |
437 GtkWidget *vbox; |
| 363 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); |
477 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); |
| 364 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), |
478 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), |
| 365 hbox); |
479 hbox); |
| 366 |
480 |
| 367 /* Dialog icon. */ |
481 /* Dialog icon. */ |
| 368 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, |
482 img = pidgin_request_dialog_icon(cpar); |
| 369 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); |
|
| 370 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
483 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
| 371 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
484 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
| 372 |
485 |
| 373 /* Vertical box */ |
486 /* Vertical box */ |
| 374 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); |
487 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); |
| 375 |
488 |
| 376 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); |
489 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); |
| 377 |
490 |
| 378 pidgin_widget_decorate_account(hbox, account); |
491 pidgin_widget_decorate_account(hbox, purple_request_cpar_get_account(cpar)); |
| 379 |
492 |
| 380 /* Descriptive label */ |
493 /* Descriptive label */ |
| 381 primary_esc = (primary != NULL) ? g_markup_escape_text(primary, -1) : NULL; |
494 primary_esc = pidgin_request_escape(cpar, primary); |
| 382 secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL; |
495 secondary_esc = pidgin_request_escape(cpar, secondary); |
| 383 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" |
496 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" |
| 384 "%s</span>%s%s" : "%s%s%s"), |
497 "%s</span>%s%s" : "%s%s%s"), |
| 385 (primary ? primary_esc : ""), |
498 (primary ? primary_esc : ""), |
| 386 ((primary && secondary) ? "\n\n" : ""), |
499 ((primary && secondary) ? "\n\n" : ""), |
| 387 (secondary ? secondary_esc : "")); |
500 (secondary ? secondary_esc : "")); |
| 466 return data; |
579 return data; |
| 467 } |
580 } |
| 468 |
581 |
| 469 static void * |
582 static void * |
| 470 pidgin_request_choice(const char *title, const char *primary, |
583 pidgin_request_choice(const char *title, const char *primary, |
| 471 const char *secondary, int default_value, |
584 const char *secondary, gpointer default_value, const char *ok_text, |
| 472 const char *ok_text, GCallback ok_cb, |
585 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, |
| 473 const char *cancel_text, GCallback cancel_cb, |
586 PurpleRequestCommonParameters *cpar, void *user_data, va_list args) |
| 474 PurpleAccount *account, const char *who, PurpleConversation *conv, |
|
| 475 void *user_data, va_list args) |
|
| 476 { |
587 { |
| 477 PidginRequestData *data; |
588 PidginRequestData *data; |
| 478 GtkWidget *dialog; |
589 GtkWidget *dialog; |
| 479 GtkWidget *vbox, *vbox2; |
590 GtkWidget *vbox, *vbox2; |
| 480 GtkWidget *hbox; |
591 GtkWidget *hbox; |
| 524 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); |
635 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); |
| 525 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), |
636 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), |
| 526 hbox); |
637 hbox); |
| 527 |
638 |
| 528 /* Dialog icon. */ |
639 /* Dialog icon. */ |
| 529 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, |
640 img = pidgin_request_dialog_icon(cpar); |
| 530 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); |
|
| 531 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
641 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
| 532 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
642 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
| 533 |
643 |
| 534 pidgin_widget_decorate_account(hbox, account); |
644 pidgin_widget_decorate_account(hbox, purple_request_cpar_get_account(cpar)); |
| 535 |
645 |
| 536 /* Vertical box */ |
646 /* Vertical box */ |
| 537 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); |
647 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); |
| 538 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); |
648 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); |
| 539 |
649 |
| 540 /* Descriptive label */ |
650 /* Descriptive label */ |
| 541 primary_esc = (primary != NULL) ? g_markup_escape_text(primary, -1) : NULL; |
651 primary_esc = pidgin_request_escape(cpar, primary); |
| 542 secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL; |
652 secondary_esc = pidgin_request_escape(cpar, secondary); |
| 543 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" |
653 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" |
| 544 "%s</span>%s%s" : "%s%s%s"), |
654 "%s</span>%s%s" : "%s%s%s"), |
| 545 (primary ? primary_esc : ""), |
655 (primary ? primary_esc : ""), |
| 546 ((primary && secondary) ? "\n\n" : ""), |
656 ((primary && secondary) ? "\n\n" : ""), |
| 547 (secondary ? secondary_esc : "")); |
657 (secondary ? secondary_esc : "")); |
| 558 g_free(label_text); |
668 g_free(label_text); |
| 559 |
669 |
| 560 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
670 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| 561 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0); |
671 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0); |
| 562 while ((radio_text = va_arg(args, char*))) { |
672 while ((radio_text = va_arg(args, char*))) { |
| 563 int resp = va_arg(args, int); |
673 gpointer resp = va_arg(args, gpointer); |
| 564 radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), radio_text); |
674 radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), radio_text); |
| 565 gtk_box_pack_start(GTK_BOX(vbox2), radio, FALSE, FALSE, 0); |
675 gtk_box_pack_start(GTK_BOX(vbox2), radio, FALSE, FALSE, 0); |
| 566 g_object_set_data(G_OBJECT(radio), "choice_id", GINT_TO_POINTER(resp)); |
676 g_object_set_data(G_OBJECT(radio), "choice_value", resp); |
| 567 if (resp == default_value) |
677 if (resp == default_value) |
| 568 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); |
678 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); |
| 569 } |
679 } |
| 570 |
680 |
| 571 g_object_set_data(G_OBJECT(dialog), "radio", radio); |
681 g_object_set_data(G_OBJECT(dialog), "radio", radio); |
| 577 |
687 |
| 578 return data; |
688 return data; |
| 579 } |
689 } |
| 580 |
690 |
| 581 static void * |
691 static void * |
| 582 pidgin_request_action_with_icon(const char *title, const char *primary, |
692 pidgin_request_action(const char *title, const char *primary, |
| 583 const char *secondary, int default_action, |
693 const char *secondary, int default_action, |
| 584 PurpleAccount *account, const char *who, |
694 PurpleRequestCommonParameters *cpar, void *user_data, |
| 585 PurpleConversation *conv, gconstpointer icon_data, |
695 size_t action_count, va_list actions) |
| 586 gsize icon_size, |
|
| 587 void *user_data, size_t action_count, va_list actions) |
|
| 588 { |
696 { |
| 589 PidginRequestData *data; |
697 PidginRequestData *data; |
| 590 GtkWidget *dialog; |
698 GtkWidget *dialog; |
| 591 GtkWidget *vbox; |
699 GtkWidget *vbox; |
| 592 GtkWidget *hbox; |
700 GtkWidget *hbox; |
| 647 /* Setup the main horizontal box */ |
755 /* Setup the main horizontal box */ |
| 648 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); |
756 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); |
| 649 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), |
757 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), |
| 650 hbox); |
758 hbox); |
| 651 |
759 |
| 652 /* Dialog icon. */ |
760 img = pidgin_request_dialog_icon(cpar); |
| 653 if (icon_data) { |
|
| 654 GdkPixbuf *pixbuf = pidgin_pixbuf_from_data(icon_data, icon_size); |
|
| 655 if (pixbuf) { |
|
| 656 /* scale the image if it is too large */ |
|
| 657 int width = gdk_pixbuf_get_width(pixbuf); |
|
| 658 int height = gdk_pixbuf_get_height(pixbuf); |
|
| 659 if (width > 128 || height > 128) { |
|
| 660 int scaled_width = width > height ? 128 : (128 * width) / height; |
|
| 661 int scaled_height = height > width ? 128 : (128 * height) / width; |
|
| 662 GdkPixbuf *scaled = |
|
| 663 gdk_pixbuf_scale_simple(pixbuf, scaled_width, scaled_height, |
|
| 664 GDK_INTERP_BILINEAR); |
|
| 665 |
|
| 666 purple_debug_info("pidgin", |
|
| 667 "dialog icon was too large, scaled it down\n"); |
|
| 668 if (scaled) { |
|
| 669 g_object_unref(pixbuf); |
|
| 670 pixbuf = scaled; |
|
| 671 } |
|
| 672 } |
|
| 673 img = gtk_image_new_from_pixbuf(pixbuf); |
|
| 674 g_object_unref(pixbuf); |
|
| 675 } else { |
|
| 676 purple_debug_info("pidgin", "failed to parse dialog icon\n"); |
|
| 677 } |
|
| 678 } |
|
| 679 |
|
| 680 if (!img) { |
|
| 681 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, |
|
| 682 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); |
|
| 683 } |
|
| 684 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
761 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
| 685 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
762 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
| 686 |
763 |
| 687 /* Vertical box */ |
764 /* Vertical box */ |
| 688 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); |
765 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); |
| 689 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); |
766 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); |
| 690 |
767 |
| 691 pidgin_widget_decorate_account(hbox, account); |
768 pidgin_widget_decorate_account(hbox, |
| |
769 purple_request_cpar_get_account(cpar)); |
| 692 |
770 |
| 693 /* Descriptive label */ |
771 /* Descriptive label */ |
| 694 primary_esc = (primary != NULL) ? g_markup_escape_text(primary, -1) : NULL; |
772 primary_esc = pidgin_request_escape(cpar, primary); |
| 695 secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL; |
773 secondary_esc = pidgin_request_escape(cpar, secondary); |
| 696 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" |
774 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" |
| 697 "%s</span>%s%s" : "%s%s%s"), |
775 "%s</span>%s%s" : "%s%s%s"), |
| 698 (primary ? primary_esc : ""), |
776 (primary ? primary_esc : ""), |
| 699 ((primary && secondary) ? "\n\n" : ""), |
777 ((primary && secondary) ? "\n\n" : ""), |
| 700 (secondary ? secondary_esc : "")); |
778 (secondary ? secondary_esc : "")); |
| 728 pidgin_auto_parent_window(dialog); |
806 pidgin_auto_parent_window(dialog); |
| 729 |
807 |
| 730 gtk_widget_show_all(dialog); |
808 gtk_widget_show_all(dialog); |
| 731 |
809 |
| 732 return data; |
810 return data; |
| 733 } |
|
| 734 |
|
| 735 static void * |
|
| 736 pidgin_request_action(const char *title, const char *primary, |
|
| 737 const char *secondary, int default_action, |
|
| 738 PurpleAccount *account, const char *who, PurpleConversation *conv, |
|
| 739 void *user_data, size_t action_count, va_list actions) |
|
| 740 { |
|
| 741 return pidgin_request_action_with_icon(title, primary, secondary, |
|
| 742 default_action, account, who, conv, NULL, 0, user_data, action_count, |
|
| 743 actions); |
|
| 744 } |
811 } |
| 745 |
812 |
| 746 static void |
813 static void |
| 747 req_entry_field_changed_cb(GtkWidget *entry, PurpleRequestField *field) |
814 req_entry_field_changed_cb(GtkWidget *entry, PurpleRequestField *field) |
| 748 { |
815 { |
| 953 |
1020 |
| 954 static GtkWidget * |
1021 static GtkWidget * |
| 955 create_choice_field(PurpleRequestField *field) |
1022 create_choice_field(PurpleRequestField *field) |
| 956 { |
1023 { |
| 957 GtkWidget *widget; |
1024 GtkWidget *widget; |
| 958 GList *labels = purple_request_field_choice_get_labels(field); |
1025 GList *elements = purple_request_field_choice_get_elements(field); |
| 959 int num_labels = g_list_length(labels); |
1026 int num_labels = g_list_length(elements) / 2; |
| 960 GList *l; |
1027 GList *l; |
| 961 |
1028 gpointer *values = g_new(gpointer, num_labels); |
| |
1029 gpointer default_value; |
| |
1030 int i, default_index = -1; |
| |
1031 |
| |
1032 default_value = purple_request_field_choice_get_default_value(field); |
| 962 if (num_labels > 5) |
1033 if (num_labels > 5) |
| 963 { |
1034 { |
| 964 widget = gtk_combo_box_text_new(); |
1035 widget = gtk_combo_box_text_new(); |
| 965 |
1036 |
| 966 for (l = labels; l != NULL; l = l->next) |
1037 i = 0; |
| |
1038 l = elements; |
| |
1039 while (l != NULL) |
| 967 { |
1040 { |
| 968 const char *text = l->data; |
1041 const char *text; |
| |
1042 gpointer *value; |
| |
1043 |
| |
1044 text = l->data; |
| |
1045 l = g_list_next(l); |
| |
1046 value = l->data; |
| |
1047 l = g_list_next(l); |
| |
1048 |
| 969 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget), text); |
1049 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget), text); |
| |
1050 if (value == default_value) |
| |
1051 default_index = i; |
| |
1052 values[i++] = value; |
| 970 } |
1053 } |
| 971 |
1054 |
| 972 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), |
1055 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), default_index); |
| 973 purple_request_field_choice_get_default_value(field)); |
|
| 974 |
1056 |
| 975 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
1057 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
| 976 |
1058 |
| 977 g_signal_connect(G_OBJECT(widget), "changed", |
1059 g_signal_connect(G_OBJECT(widget), "changed", |
| 978 G_CALLBACK(field_choice_menu_cb), field); |
1060 G_CALLBACK(field_choice_menu_cb), field); |
| 980 else |
1062 else |
| 981 { |
1063 { |
| 982 GtkWidget *box; |
1064 GtkWidget *box; |
| 983 GtkWidget *first_radio = NULL; |
1065 GtkWidget *first_radio = NULL; |
| 984 GtkWidget *radio; |
1066 GtkWidget *radio; |
| 985 gint i; |
|
| 986 |
1067 |
| 987 if (num_labels == 2) |
1068 if (num_labels == 2) |
| 988 box = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
1069 box = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| 989 else |
1070 else |
| 990 box = gtk_vbox_new(FALSE, 0); |
1071 box = gtk_vbox_new(FALSE, 0); |
| 991 |
1072 |
| 992 widget = box; |
1073 widget = box; |
| 993 |
1074 |
| 994 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
1075 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
| 995 |
1076 |
| 996 for (l = labels, i = 0; l != NULL; l = l->next, i++) |
1077 i = 0; |
| |
1078 l = elements; |
| |
1079 while (l != NULL) |
| 997 { |
1080 { |
| 998 const char *text = l->data; |
1081 const char *text; |
| |
1082 gpointer *value; |
| |
1083 |
| |
1084 text = l->data; |
| |
1085 l = g_list_next(l); |
| |
1086 value = l->data; |
| |
1087 l = g_list_next(l); |
| 999 |
1088 |
| 1000 radio = gtk_radio_button_new_with_label_from_widget( |
1089 radio = gtk_radio_button_new_with_label_from_widget( |
| 1001 GTK_RADIO_BUTTON(first_radio), text); |
1090 GTK_RADIO_BUTTON(first_radio), text); |
| |
1091 g_object_set_data(G_OBJECT(radio), "box", box); |
| 1002 |
1092 |
| 1003 if (first_radio == NULL) |
1093 if (first_radio == NULL) |
| 1004 first_radio = radio; |
1094 first_radio = radio; |
| 1005 |
1095 |
| 1006 if (i == purple_request_field_choice_get_default_value(field)) |
1096 if (value == default_value) |
| 1007 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); |
1097 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); |
| |
1098 values[i++] = value; |
| 1008 |
1099 |
| 1009 gtk_box_pack_start(GTK_BOX(box), radio, TRUE, TRUE, 0); |
1100 gtk_box_pack_start(GTK_BOX(box), radio, TRUE, TRUE, 0); |
| 1010 gtk_widget_show(radio); |
1101 gtk_widget_show(radio); |
| 1011 |
1102 |
| 1012 g_signal_connect(G_OBJECT(radio), "toggled", |
1103 g_signal_connect(G_OBJECT(radio), "toggled", |
| 1013 G_CALLBACK(field_choice_option_cb), field); |
1104 G_CALLBACK(field_choice_option_cb), field); |
| 1014 } |
1105 } |
| 1015 } |
1106 } |
| |
1107 |
| |
1108 g_object_set_data_full(G_OBJECT(widget), "values", values, g_free); |
| 1016 |
1109 |
| 1017 return widget; |
1110 return widget; |
| 1018 } |
1111 } |
| 1019 |
1112 |
| 1020 static GtkWidget * |
1113 static GtkWidget * |
| 1219 #endif |
1312 #endif |
| 1220 } |
1313 } |
| 1221 |
1314 |
| 1222 static void * |
1315 static void * |
| 1223 pidgin_request_fields(const char *title, const char *primary, |
1316 pidgin_request_fields(const char *title, const char *primary, |
| 1224 const char *secondary, PurpleRequestFields *fields, |
1317 const char *secondary, PurpleRequestFields *fields, const char *ok_text, |
| 1225 const char *ok_text, GCallback ok_cb, |
1318 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, |
| 1226 const char *cancel_text, GCallback cancel_cb, |
1319 PurpleRequestCommonParameters *cpar, void *user_data) |
| 1227 PurpleAccount *account, const char *who, PurpleConversation *conv, |
|
| 1228 void *user_data) |
|
| 1229 { |
1320 { |
| 1230 PidginRequestData *data; |
1321 PidginRequestData *data; |
| 1231 GtkWidget *win; |
1322 GtkWidget *win; |
| 1232 GtkWidget *vbox; |
1323 GtkWidget *vbox; |
| 1233 GtkWidget *vbox2; |
1324 GtkWidget *vbox2; |
| 1272 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); |
1363 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); |
| 1273 gtk_container_add(GTK_CONTAINER(pidgin_dialog_get_vbox(GTK_DIALOG(win))), hbox); |
1364 gtk_container_add(GTK_CONTAINER(pidgin_dialog_get_vbox(GTK_DIALOG(win))), hbox); |
| 1274 gtk_widget_show(hbox); |
1365 gtk_widget_show(hbox); |
| 1275 |
1366 |
| 1276 /* Dialog icon. */ |
1367 /* Dialog icon. */ |
| 1277 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, |
1368 img = pidgin_request_dialog_icon(cpar); |
| 1278 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); |
|
| 1279 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
1369 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
| 1280 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
1370 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
| 1281 gtk_widget_show(img); |
1371 gtk_widget_show(img); |
| 1282 |
1372 |
| 1283 /* Cancel button */ |
1373 /* Cancel button */ |
| 1288 button = pidgin_dialog_add_button(GTK_DIALOG(win), text_to_stock(ok_text), G_CALLBACK(multifield_ok_cb), data); |
1378 button = pidgin_dialog_add_button(GTK_DIALOG(win), text_to_stock(ok_text), G_CALLBACK(multifield_ok_cb), data); |
| 1289 data->ok_button = button; |
1379 data->ok_button = button; |
| 1290 gtk_widget_set_can_default(button, TRUE); |
1380 gtk_widget_set_can_default(button, TRUE); |
| 1291 gtk_window_set_default(GTK_WINDOW(win), button); |
1381 gtk_window_set_default(GTK_WINDOW(win), button); |
| 1292 |
1382 |
| 1293 pidgin_widget_decorate_account(hbox, account); |
1383 pidgin_widget_decorate_account(hbox, |
| |
1384 purple_request_cpar_get_account(cpar)); |
| 1294 |
1385 |
| 1295 /* Setup the vbox */ |
1386 /* Setup the vbox */ |
| 1296 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); |
1387 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); |
| 1297 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); |
1388 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); |
| 1298 gtk_widget_show(vbox); |
1389 gtk_widget_show(vbox); |
| 1299 |
1390 |
| 1300 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
1391 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
| 1301 |
1392 |
| 1302 if(primary) { |
1393 if(primary) { |
| 1303 primary_esc = g_markup_escape_text(primary, -1); |
1394 primary_esc = pidgin_request_escape(cpar, primary); |
| 1304 label_text = g_strdup_printf( |
1395 label_text = g_strdup_printf( |
| 1305 "<span weight=\"bold\" size=\"larger\">%s</span>", primary_esc); |
1396 "<span weight=\"bold\" size=\"larger\">%s</span>", primary_esc); |
| 1306 g_free(primary_esc); |
1397 g_free(primary_esc); |
| 1307 label = gtk_label_new(NULL); |
1398 label = gtk_label_new(NULL); |
| 1308 |
1399 |
| 1616 } |
1707 } |
| 1617 if ((data->u.file.savedialog == TRUE) && |
1708 if ((data->u.file.savedialog == TRUE) && |
| 1618 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { |
1709 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { |
| 1619 purple_request_action(data, NULL, _("That file already exists"), |
1710 purple_request_action(data, NULL, _("That file already exists"), |
| 1620 _("Would you like to overwrite it?"), 0, |
1711 _("Would you like to overwrite it?"), 0, |
| 1621 NULL, NULL, NULL, |
1712 NULL, |
| 1622 data, 2, |
1713 data, 2, |
| 1623 _("Overwrite"), G_CALLBACK(file_yes_no_cb), |
1714 _("Overwrite"), G_CALLBACK(file_yes_no_cb), |
| 1624 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); |
1715 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); |
| 1625 } else |
1716 } else |
| 1626 file_yes_no_cb(data, 1); |
1717 file_yes_no_cb(data, 1); |
| 1627 } |
1718 } |
| 1628 |
1719 |
| 1629 static void * |
1720 static void * |
| 1630 pidgin_request_file(const char *title, const char *filename, |
1721 pidgin_request_file(const char *title, const char *filename, |
| 1631 gboolean savedialog, |
1722 gboolean savedialog, GCallback ok_cb, GCallback cancel_cb, |
| 1632 GCallback ok_cb, GCallback cancel_cb, |
1723 PurpleRequestCommonParameters *cpar, void *user_data) |
| 1633 PurpleAccount *account, const char *who, PurpleConversation *conv, |
|
| 1634 void *user_data) |
|
| 1635 { |
1724 { |
| 1636 PidginRequestData *data; |
1725 PidginRequestData *data; |
| 1637 GtkWidget *filesel; |
1726 GtkWidget *filesel; |
| 1638 #ifdef _WIN32 |
1727 #ifdef _WIN32 |
| 1639 const gchar *current_folder; |
1728 const gchar *current_folder; |
| 1788 g_free(data); |
1876 g_free(data); |
| 1789 } |
1877 } |
| 1790 |
1878 |
| 1791 static PurpleRequestUiOps ops = |
1879 static PurpleRequestUiOps ops = |
| 1792 { |
1880 { |
| |
1881 PURPLE_REQUEST_FEATURE_HTML, |
| 1793 pidgin_request_input, |
1882 pidgin_request_input, |
| 1794 pidgin_request_choice, |
1883 pidgin_request_choice, |
| 1795 pidgin_request_action, |
1884 pidgin_request_action, |
| 1796 pidgin_request_fields, |
1885 pidgin_request_fields, |
| 1797 pidgin_request_file, |
1886 pidgin_request_file, |
| 1798 pidgin_close_request, |
1887 pidgin_close_request, |
| 1799 pidgin_request_folder, |
1888 pidgin_request_folder, |
| 1800 pidgin_request_action_with_icon, |
1889 NULL, |
| 1801 NULL, |
1890 NULL, |
| 1802 NULL, |
1891 NULL, |
| 1803 NULL |
1892 NULL |
| 1804 }; |
1893 }; |
| 1805 |
1894 |