| 178 { |
178 { |
| 179 GtkWindow *wnd = NULL; |
179 GtkWindow *wnd = NULL; |
| 180 |
180 |
| 181 wnd = GTK_WINDOW(gtk_dialog_new()); |
181 wnd = GTK_WINDOW(gtk_dialog_new()); |
| 182 pidgin_window_init(wnd, title, border_width, role, resizable); |
182 pidgin_window_init(wnd, title, border_width, role, resizable); |
| 183 g_object_set(G_OBJECT(wnd), "has-separator", FALSE, NULL); |
|
| 184 |
183 |
| 185 return GTK_WIDGET(wnd); |
184 return GTK_WIDGET(wnd); |
| 186 } |
185 } |
| 187 |
186 |
| 188 GtkWidget * |
187 GtkWidget * |
| 189 pidgin_dialog_get_vbox_with_properties(GtkDialog *dialog, gboolean homogeneous, gint spacing) |
188 pidgin_dialog_get_vbox_with_properties(GtkDialog *dialog, gboolean homogeneous, gint spacing) |
| 190 { |
189 { |
| 191 GtkBox *vbox = GTK_BOX(GTK_DIALOG(dialog)->vbox); |
190 GtkBox *vbox = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); |
| 192 gtk_box_set_homogeneous(vbox, homogeneous); |
191 gtk_box_set_homogeneous(vbox, homogeneous); |
| 193 gtk_box_set_spacing(vbox, spacing); |
192 gtk_box_set_spacing(vbox, spacing); |
| 194 return GTK_WIDGET(vbox); |
193 return GTK_WIDGET(vbox); |
| 195 } |
194 } |
| 196 |
195 |
| 197 GtkWidget *pidgin_dialog_get_vbox(GtkDialog *dialog) |
196 GtkWidget *pidgin_dialog_get_vbox(GtkDialog *dialog) |
| 198 { |
197 { |
| 199 return GTK_DIALOG(dialog)->vbox; |
198 return gtk_dialog_get_content_area(GTK_DIALOG(dialog)); |
| 200 } |
199 } |
| 201 |
200 |
| 202 GtkWidget *pidgin_dialog_get_action_area(GtkDialog *dialog) |
201 GtkWidget *pidgin_dialog_get_action_area(GtkDialog *dialog) |
| 203 { |
202 { |
| 204 return GTK_DIALOG(dialog)->action_area; |
203 return gtk_dialog_get_action_area(GTK_DIALOG(dialog)); |
| 205 } |
204 } |
| 206 |
205 |
| 207 GtkWidget *pidgin_dialog_add_button(GtkDialog *dialog, const char *label, |
206 GtkWidget *pidgin_dialog_add_button(GtkDialog *dialog, const char *label, |
| 208 GCallback callback, gpointer callbackdata) |
207 GCallback callback, gpointer callbackdata) |
| 209 { |
208 { |
| 520 |
519 |
| 521 return vbox; |
520 return vbox; |
| 522 } |
521 } |
| 523 |
522 |
| 524 static gpointer |
523 static gpointer |
| 525 aop_option_menu_get_selected(GtkWidget *optmenu, GtkWidget **p_item) |
524 aop_option_menu_get_selected(GtkWidget *optmenu) |
| 526 { |
525 { |
| 527 GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); |
526 gpointer data = NULL; |
| 528 GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu)); |
527 GtkTreeIter iter; |
| 529 if (p_item) |
528 |
| 530 (*p_item) = item; |
529 g_return_val_if_fail(optmenu != NULL, NULL); |
| 531 return item ? g_object_get_data(G_OBJECT(item), "aop_per_item_data") : NULL; |
530 |
| |
531 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(optmenu), &iter)) |
| |
532 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)), &iter, 2, &data, -1); |
| |
533 |
| |
534 return data; |
| 532 } |
535 } |
| 533 |
536 |
| 534 static void |
537 static void |
| 535 aop_menu_cb(GtkWidget *optmenu, GCallback cb) |
538 aop_menu_cb(GtkWidget *optmenu, GCallback cb) |
| 536 { |
539 { |
| 537 GtkWidget *item; |
|
| 538 gpointer per_item_data; |
|
| 539 |
|
| 540 per_item_data = aop_option_menu_get_selected(optmenu, &item); |
|
| 541 |
|
| 542 if (cb != NULL) { |
540 if (cb != NULL) { |
| 543 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data")); |
541 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(optmenu, |
| 544 } |
542 aop_option_menu_get_selected(optmenu), |
| 545 } |
543 g_object_get_data(G_OBJECT(optmenu), "user_data")); |
| 546 |
544 } |
| 547 static GtkWidget * |
545 } |
| 548 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data, const char *data) |
546 |
| 549 { |
547 static void |
| 550 GtkWidget *item; |
548 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu) |
| 551 GtkWidget *hbox; |
549 { |
| 552 GtkWidget *image; |
550 gtk_combo_box_set_model(GTK_COMBO_BOX(optmenu), new_aop_menu->model); |
| 553 GtkWidget *label; |
551 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), new_aop_menu->default_item); |
| 554 |
552 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free); |
| 555 item = gtk_menu_item_new(); |
|
| 556 gtk_widget_show(item); |
|
| 557 |
|
| 558 hbox = gtk_hbox_new(FALSE, 4); |
|
| 559 gtk_widget_show(hbox); |
|
| 560 |
|
| 561 /* Create the image */ |
|
| 562 if (pixbuf == NULL) |
|
| 563 image = gtk_image_new(); |
|
| 564 else |
|
| 565 image = gtk_image_new_from_pixbuf(pixbuf); |
|
| 566 gtk_widget_show(image); |
|
| 567 |
|
| 568 if (sg) |
|
| 569 gtk_size_group_add_widget(sg, image); |
|
| 570 |
|
| 571 /* Create the label */ |
|
| 572 label = gtk_label_new (lbl); |
|
| 573 gtk_widget_show (label); |
|
| 574 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); |
|
| 575 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); |
|
| 576 |
|
| 577 gtk_container_add(GTK_CONTAINER(item), hbox); |
|
| 578 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); |
|
| 579 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); |
|
| 580 |
|
| 581 g_object_set_data(G_OBJECT (item), data, per_item_data); |
|
| 582 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data); |
|
| 583 |
|
| 584 pidgin_set_accessible_label(item, label); |
|
| 585 |
|
| 586 return item; |
|
| 587 } |
553 } |
| 588 |
554 |
| 589 static GdkPixbuf * |
555 static GdkPixbuf * |
| 590 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account) |
556 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account) |
| 591 { |
557 { |
| 622 } |
588 } |
| 623 |
589 |
| 624 static GtkWidget * |
590 static GtkWidget * |
| 625 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) |
591 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) |
| 626 { |
592 { |
| 627 GtkWidget *optmenu; |
593 GtkWidget *optmenu = NULL; |
| 628 |
594 GtkCellRenderer *cr = NULL; |
| 629 optmenu = gtk_option_menu_new(); |
595 |
| |
596 optmenu = gtk_combo_box_new(); |
| 630 gtk_widget_show(optmenu); |
597 gtk_widget_show(optmenu); |
| 631 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), aop_menu->menu); |
598 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_pixbuf_new(), FALSE); |
| 632 |
599 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "pixbuf", 0); |
| 633 if (aop_menu->default_item != -1) |
600 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_text_new(), TRUE); |
| 634 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), aop_menu->default_item); |
601 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "text", 1); |
| 635 |
602 |
| 636 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", aop_menu, (GDestroyNotify)g_free); |
603 aop_option_menu_replace_menu(optmenu, aop_menu); |
| |
604 if (aop_menu->default_item == -1) |
| |
605 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), 0); |
| 637 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); |
606 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); |
| 638 |
607 |
| 639 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb); |
608 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb); |
| 640 |
609 |
| 641 return optmenu; |
610 return optmenu; |
| 642 } |
|
| 643 |
|
| 644 static void |
|
| 645 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu) |
|
| 646 { |
|
| 647 if (gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu))) |
|
| 648 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu)); |
|
| 649 |
|
| 650 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), new_aop_menu->menu); |
|
| 651 |
|
| 652 if (new_aop_menu->default_item != -1) |
|
| 653 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), new_aop_menu->default_item); |
|
| 654 |
|
| 655 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free); |
|
| 656 } |
611 } |
| 657 |
612 |
| 658 static void |
613 static void |
| 659 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data) |
614 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data) |
| 660 { |
615 { |
| 661 guint idx; |
616 GtkTreeModel *model; |
| 662 GList *llItr = NULL; |
617 GtkTreeIter iter; |
| 663 |
618 gpointer iter_data; |
| 664 for (idx = 0, llItr = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))->children; |
619 model = gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)); |
| 665 llItr != NULL; |
620 if (gtk_tree_model_get_iter_first(model, &iter)) { |
| 666 llItr = llItr->next, idx++) { |
621 do { |
| 667 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) { |
622 gtk_tree_model_get(model, &iter, 2, &iter_data, -1); |
| 668 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); |
623 if (iter_data == data) { |
| 669 break; |
624 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(optmenu), &iter); |
| 670 } |
625 return; |
| |
626 } |
| |
627 } while (gtk_tree_model_iter_next(model, &iter)); |
| 671 } |
628 } |
| 672 } |
629 } |
| 673 |
630 |
| 674 static AopMenu * |
631 static AopMenu * |
| 675 create_protocols_menu(const char *default_proto_id) |
632 create_protocols_menu(const char *default_proto_id) |
| 676 { |
633 { |
| 677 AopMenu *aop_menu = NULL; |
634 AopMenu *aop_menu = NULL; |
| 678 PurplePlugin *plugin; |
635 PurplePlugin *plugin; |
| 679 GdkPixbuf *pixbuf = NULL; |
636 GdkPixbuf *pixbuf = NULL; |
| 680 GtkSizeGroup *sg; |
637 GtkTreeIter iter; |
| |
638 GtkListStore *ls; |
| 681 GList *p; |
639 GList *p; |
| 682 const char *gtalk_name = NULL, *facebook_name = NULL; |
640 const char *gtalk_name = NULL, *facebook_name = NULL; |
| 683 int i; |
641 int i; |
| 684 |
642 |
| |
643 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); |
| |
644 |
| 685 aop_menu = g_malloc0(sizeof(AopMenu)); |
645 aop_menu = g_malloc0(sizeof(AopMenu)); |
| 686 aop_menu->default_item = -1; |
646 aop_menu->default_item = -1; |
| 687 aop_menu->menu = gtk_menu_new(); |
647 aop_menu->model = GTK_TREE_MODEL(ls); |
| 688 gtk_widget_show(aop_menu->menu); |
|
| 689 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
|
| 690 |
648 |
| 691 if (purple_find_prpl("prpl-jabber")) { |
649 if (purple_find_prpl("prpl-jabber")) { |
| 692 gtalk_name = _("Google Talk"); |
650 gtalk_name = _("Google Talk"); |
| 693 facebook_name = _("Facebook (XMPP)"); |
651 facebook_name = _("Facebook (XMPP)"); |
| 694 } |
652 } |
| 700 plugin = (PurplePlugin *)p->data; |
658 plugin = (PurplePlugin *)p->data; |
| 701 |
659 |
| 702 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { |
660 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { |
| 703 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
661 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
| 704 "16", "google-talk.png", NULL); |
662 "16", "google-talk.png", NULL); |
| 705 GtkWidget *item; |
|
| 706 |
|
| 707 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
663 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
| 708 g_free(filename); |
664 g_free(filename); |
| 709 |
665 |
| 710 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
666 gtk_list_store_append(ls, &iter); |
| 711 item = aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber", "protocol")); |
667 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, gtalk_name, 2, "prpl-jabber", -1); |
| 712 g_object_set_data(G_OBJECT(item), "fakegoogle", GINT_TO_POINTER(1)); |
|
| 713 |
668 |
| 714 if (pixbuf) |
669 if (pixbuf) |
| 715 g_object_unref(pixbuf); |
670 g_object_unref(pixbuf); |
| 716 |
671 |
| 717 gtalk_name = NULL; |
672 gtalk_name = NULL; |
| 719 } |
674 } |
| 720 |
675 |
| 721 if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) { |
676 if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) { |
| 722 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
677 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", |
| 723 "16", "facebook.png", NULL); |
678 "16", "facebook.png", NULL); |
| 724 GtkWidget *item; |
|
| 725 |
|
| 726 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
679 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
| 727 g_free(filename); |
680 g_free(filename); |
| 728 |
681 |
| 729 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
682 gtk_list_store_append(ls, &iter); |
| 730 item = aop_menu_item_new(sg, pixbuf, facebook_name, "prpl-jabber", "protocol")); |
683 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, facebook_name, 2, "prpl-jabber", -1); |
| 731 g_object_set_data(G_OBJECT(item), "fakefacebook", GINT_TO_POINTER(1)); |
|
| 732 |
684 |
| 733 if (pixbuf) |
685 if (pixbuf) |
| 734 g_object_unref(pixbuf); |
686 g_object_unref(pixbuf); |
| 735 |
687 |
| 736 facebook_name = NULL; |
688 facebook_name = NULL; |
| 737 i++; |
689 i++; |
| 738 } |
690 } |
| 739 |
691 |
| 740 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); |
692 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); |
| 741 |
693 |
| 742 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
694 gtk_list_store_append(ls, &iter); |
| 743 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id, "protocol")); |
695 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, plugin->info->name, 2, plugin->info->id, -1); |
| 744 |
696 |
| 745 if (pixbuf) |
697 if (pixbuf) |
| 746 g_object_unref(pixbuf); |
698 g_object_unref(pixbuf); |
| 747 |
699 |
| 748 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) |
700 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) |
| 749 aop_menu->default_item = i; |
701 aop_menu->default_item = i; |
| 750 } |
702 } |
| 751 |
|
| 752 g_object_unref(sg); |
|
| 753 |
|
| 754 return aop_menu; |
703 return aop_menu; |
| 755 } |
704 } |
| 756 |
705 |
| 757 GtkWidget * |
706 GtkWidget * |
| 758 pidgin_protocol_option_menu_new(const char *id, GCallback cb, |
707 pidgin_protocol_option_menu_new(const char *id, GCallback cb, |
| 780 AopMenu *aop_menu = NULL; |
729 AopMenu *aop_menu = NULL; |
| 781 PurpleAccount *account; |
730 PurpleAccount *account; |
| 782 GdkPixbuf *pixbuf = NULL; |
731 GdkPixbuf *pixbuf = NULL; |
| 783 GList *list; |
732 GList *list; |
| 784 GList *p; |
733 GList *p; |
| 785 GtkSizeGroup *sg; |
734 GtkListStore *ls; |
| |
735 GtkTreeIter iter; |
| 786 int i; |
736 int i; |
| 787 char buf[256]; |
737 char buf[256]; |
| 788 |
738 |
| 789 if (show_all) |
739 if (show_all) |
| 790 list = purple_accounts_get_all(); |
740 list = purple_accounts_get_all(); |
| 791 else |
741 else |
| 792 list = purple_connections_get_all(); |
742 list = purple_connections_get_all(); |
| 793 |
743 |
| |
744 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); |
| |
745 |
| 794 aop_menu = g_malloc0(sizeof(AopMenu)); |
746 aop_menu = g_malloc0(sizeof(AopMenu)); |
| 795 aop_menu->default_item = -1; |
747 aop_menu->default_item = -1; |
| 796 aop_menu->menu = gtk_menu_new(); |
748 aop_menu->model = GTK_TREE_MODEL(ls); |
| 797 gtk_widget_show(aop_menu->menu); |
|
| 798 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
|
| 799 |
749 |
| 800 for (p = list, i = 0; p != NULL; p = p->next, i++) { |
750 for (p = list, i = 0; p != NULL; p = p->next, i++) { |
| 801 if (show_all) |
751 if (show_all) |
| 802 account = (PurpleAccount *)p->data; |
752 account = (PurpleAccount *)p->data; |
| 803 else { |
753 else { |
| 828 g_snprintf(buf, sizeof(buf), "%s (%s)", |
778 g_snprintf(buf, sizeof(buf), "%s (%s)", |
| 829 purple_account_get_username(account), |
779 purple_account_get_username(account), |
| 830 purple_account_get_protocol_name(account)); |
780 purple_account_get_protocol_name(account)); |
| 831 } |
781 } |
| 832 |
782 |
| 833 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), |
783 gtk_list_store_append(ls, &iter); |
| 834 aop_menu_item_new(sg, pixbuf, buf, account, "account")); |
784 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, buf, 2, account, -1); |
| 835 |
785 |
| 836 if (pixbuf) |
786 if (pixbuf) |
| 837 g_object_unref(pixbuf); |
787 g_object_unref(pixbuf); |
| 838 |
788 |
| 839 if (default_account && account == default_account) |
789 if (default_account && account == default_account) |
| 840 aop_menu->default_item = i; |
790 aop_menu->default_item = i; |
| 841 } |
791 } |
| 842 |
|
| 843 g_object_unref(sg); |
|
| 844 |
|
| 845 return aop_menu; |
792 return aop_menu; |
| 846 } |
793 } |
| 847 |
794 |
| 848 static void |
795 static void |
| 849 regenerate_account_menu(GtkWidget *optmenu) |
796 regenerate_account_menu(GtkWidget *optmenu) |
| 850 { |
797 { |
| 851 gboolean show_all; |
798 gboolean show_all; |
| 852 PurpleAccount *account; |
799 PurpleAccount *account; |
| 853 PurpleFilterAccountFunc filter_func; |
800 PurpleFilterAccountFunc filter_func; |
| 854 |
801 |
| 855 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); |
802 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu); |
| 856 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all")); |
803 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all")); |
| 857 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func"); |
804 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func"); |
| 858 |
805 |
| 859 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all)); |
806 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all)); |
| 860 } |
807 } |
| 1431 GtkWidget *widget = GTK_WIDGET(data); |
1360 GtkWidget *widget = GTK_WIDGET(data); |
| 1432 GtkTreeView *tv = GTK_TREE_VIEW(data); |
1361 GtkTreeView *tv = GTK_TREE_VIEW(data); |
| 1433 GtkTreePath *path; |
1362 GtkTreePath *path; |
| 1434 GtkTreeViewColumn *col; |
1363 GtkTreeViewColumn *col; |
| 1435 GdkRectangle rect; |
1364 GdkRectangle rect; |
| 1436 gint ythickness = GTK_WIDGET(menu)->style->ythickness; |
1365 gint ythickness = gtk_widget_get_style(GTK_WIDGET(menu))->ythickness; |
| 1437 |
1366 |
| 1438 gdk_window_get_origin (widget->window, x, y); |
1367 gdk_window_get_origin (gtk_widget_get_window(widget), x, y); |
| 1439 gtk_tree_view_get_cursor (tv, &path, &col); |
1368 gtk_tree_view_get_cursor (tv, &path, &col); |
| 1440 gtk_tree_view_get_cell_area (tv, path, col, &rect); |
1369 gtk_tree_view_get_cell_area (tv, path, col, &rect); |
| 1441 |
1370 |
| 1442 *x += rect.x+rect.width; |
1371 *x += rect.x+rect.width; |
| 1443 *y += rect.y+rect.height+ythickness; |
1372 *y += rect.y+rect.height+ythickness; |
| 2191 void pidgin_set_cursor(GtkWidget *widget, GdkCursorType cursor_type) |
2122 void pidgin_set_cursor(GtkWidget *widget, GdkCursorType cursor_type) |
| 2192 { |
2123 { |
| 2193 GdkCursor *cursor; |
2124 GdkCursor *cursor; |
| 2194 |
2125 |
| 2195 g_return_if_fail(widget != NULL); |
2126 g_return_if_fail(widget != NULL); |
| 2196 if (widget->window == NULL) |
2127 if (gtk_widget_get_window(widget) == NULL) |
| 2197 return; |
2128 return; |
| 2198 |
2129 |
| 2199 cursor = gdk_cursor_new(cursor_type); |
2130 cursor = gdk_cursor_new(cursor_type); |
| 2200 gdk_window_set_cursor(widget->window, cursor); |
2131 gdk_window_set_cursor(gtk_widget_get_window(widget), cursor); |
| 2201 gdk_cursor_unref(cursor); |
2132 gdk_cursor_unref(cursor); |
| 2202 |
2133 |
| 2203 gdk_display_flush(gdk_drawable_get_display(GDK_DRAWABLE(widget->window))); |
2134 gdk_display_flush(gdk_window_get_display(gtk_widget_get_window(widget))); |
| 2204 } |
2135 } |
| 2205 |
2136 |
| 2206 void pidgin_clear_cursor(GtkWidget *widget) |
2137 void pidgin_clear_cursor(GtkWidget *widget) |
| 2207 { |
2138 { |
| 2208 g_return_if_fail(widget != NULL); |
2139 g_return_if_fail(widget != NULL); |
| 2209 if (widget->window == NULL) |
2140 if (gtk_widget_get_window(widget) == NULL) |
| 2210 return; |
2141 return; |
| 2211 |
2142 |
| 2212 gdk_window_set_cursor(widget->window, NULL); |
2143 gdk_window_set_cursor(gtk_widget_get_window(widget), NULL); |
| 2213 } |
2144 } |
| 2214 |
2145 |
| 2215 struct _icon_chooser { |
2146 struct _icon_chooser { |
| 2216 GtkWidget *icon_filesel; |
2147 GtkWidget *icon_filesel; |
| 2217 GtkWidget *icon_preview; |
2148 GtkWidget *icon_preview; |
| 2894 style->text_aa[GTK_STATE_NORMAL].blue >> 8); |
2825 style->text_aa[GTK_STATE_NORMAL].blue >> 8); |
| 2895 return dim_grey_string; |
2826 return dim_grey_string; |
| 2896 } |
2827 } |
| 2897 |
2828 |
| 2898 static void |
2829 static void |
| 2899 combo_box_changed_cb(GtkComboBox *combo_box, GtkEntry *entry) |
2830 combo_box_changed_cb(GtkComboBoxText *combo_box, GtkEntry *entry) |
| 2900 { |
2831 { |
| 2901 char *text = gtk_combo_box_get_active_text(combo_box); |
2832 char *text = gtk_combo_box_text_get_active_text(combo_box); |
| 2902 gtk_entry_set_text(entry, text ? text : ""); |
2833 gtk_entry_set_text(entry, text ? text : ""); |
| 2903 g_free(text); |
2834 g_free(text); |
| 2904 } |
2835 } |
| 2905 |
2836 |
| 2906 static gboolean |
2837 static gboolean |
| 2907 entry_key_pressed_cb(GtkWidget *entry, GdkEventKey *key, GtkComboBox *combo) |
2838 entry_key_pressed_cb(GtkWidget *entry, GdkEventKey *key, GtkComboBoxText *combo) |
| 2908 { |
2839 { |
| 2909 if (key->keyval == GDK_Down || key->keyval == GDK_Up) { |
2840 if (key->keyval == GDK_KEY_Down || key->keyval == GDK_KEY_Up) { |
| 2910 gtk_combo_box_popup(combo); |
2841 gtk_combo_box_popup(GTK_COMBO_BOX(combo)); |
| 2911 return TRUE; |
2842 return TRUE; |
| 2912 } |
2843 } |
| 2913 return FALSE; |
2844 return FALSE; |
| 2914 } |
2845 } |
| 2915 |
2846 |
| 2916 GtkWidget * |
2847 GtkWidget * |
| 2917 pidgin_text_combo_box_entry_new(const char *default_item, GList *items) |
2848 pidgin_text_combo_box_entry_new(const char *default_item, GList *items) |
| 2918 { |
2849 { |
| 2919 GtkComboBox *ret = NULL; |
2850 GtkComboBoxText *ret = NULL; |
| 2920 GtkWidget *the_entry = NULL; |
2851 GtkWidget *the_entry = NULL; |
| 2921 |
2852 |
| 2922 ret = GTK_COMBO_BOX(gtk_combo_box_entry_new_text()); |
2853 ret = GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new_with_entry()); |
| 2923 the_entry = gtk_entry_new(); |
2854 the_entry = gtk_entry_new(); |
| 2924 gtk_container_add(GTK_CONTAINER(ret), the_entry); |
2855 gtk_container_add(GTK_CONTAINER(ret), the_entry); |
| 2925 |
2856 |
| 2926 if (default_item) |
2857 if (default_item) |
| 2927 gtk_entry_set_text(GTK_ENTRY(the_entry), default_item); |
2858 gtk_entry_set_text(GTK_ENTRY(the_entry), default_item); |
| 2928 |
2859 |
| 2929 for (; items != NULL ; items = items->next) { |
2860 for (; items != NULL ; items = items->next) { |
| 2930 char *text = items->data; |
2861 char *text = items->data; |
| 2931 if (text && *text) |
2862 if (text && *text) |
| 2932 gtk_combo_box_append_text(ret, text); |
2863 gtk_combo_box_text_append_text(ret, text); |
| 2933 } |
2864 } |
| 2934 |
2865 |
| 2935 g_signal_connect(G_OBJECT(ret), "changed", (GCallback)combo_box_changed_cb, the_entry); |
2866 g_signal_connect(G_OBJECT(ret), "changed", (GCallback)combo_box_changed_cb, the_entry); |
| 2936 g_signal_connect_after(G_OBJECT(the_entry), "key-press-event", G_CALLBACK(entry_key_pressed_cb), ret); |
2867 g_signal_connect_after(G_OBJECT(the_entry), "key-press-event", G_CALLBACK(entry_key_pressed_cb), ret); |
| 2937 |
2868 |
| 2938 return GTK_WIDGET(ret); |
2869 return GTK_WIDGET(ret); |
| 2939 } |
2870 } |
| 2940 |
2871 |
| 2941 const char *pidgin_text_combo_box_entry_get_text(GtkWidget *widget) |
2872 const char *pidgin_text_combo_box_entry_get_text(GtkWidget *widget) |
| 2942 { |
2873 { |
| 2943 return gtk_entry_get_text(GTK_ENTRY(GTK_BIN((widget))->child)); |
2874 return gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((widget))))); |
| 2944 } |
2875 } |
| 2945 |
2876 |
| 2946 void pidgin_text_combo_box_entry_set_text(GtkWidget *widget, const char *text) |
2877 void pidgin_text_combo_box_entry_set_text(GtkWidget *widget, const char *text) |
| 2947 { |
2878 { |
| 2948 gtk_entry_set_text(GTK_ENTRY(GTK_BIN((widget))->child), (text)); |
2879 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((widget)))), (text)); |
| 2949 } |
2880 } |
| 2950 |
2881 |
| 2951 GtkWidget * |
2882 GtkWidget * |
| 2952 pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label) |
2883 pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label) |
| 2953 { |
2884 { |