| 32823:f179695f60cb | 32939:0907cfb3cc0a |
|---|---|
| 69 #include "gtkutils.h" | 69 #include "gtkutils.h" |
| 70 #include "gtkwebview.h" | 70 #include "gtkwebview.h" |
| 71 #include "gtkwebviewtoolbar.h" | 71 #include "gtkwebviewtoolbar.h" |
| 72 #include "pidgin/minidialog.h" | 72 #include "pidgin/minidialog.h" |
| 73 | 73 |
| 74 #if !GTK_CHECK_VERSION(2,18,0) | |
| 75 #define gtk_widget_get_visible(x) GTK_WIDGET_VISIBLE(x) | |
| 76 #define gtk_widget_is_sensitive(x) GTK_WIDGET_IS_SENSITIVE(x) | |
| 77 #endif | |
| 78 | |
| 79 enum { | |
| 80 AOP_ICON_COLUMN, | |
| 81 AOP_NAME_COLUMN, | |
| 82 AOP_DATA_COLUMN, | |
| 83 AOP_COLUMN_COUNT | |
| 84 }; | |
| 85 | |
| 74 typedef struct { | 86 typedef struct { |
| 75 GtkWidget *menu; | 87 GtkTreeModel *model; |
| 76 gint default_item; | 88 gint default_item; |
| 77 } AopMenu; | 89 } AopMenu; |
| 78 | 90 |
| 79 static guint accels_save_timer = 0; | 91 static guint accels_save_timer = 0; |
| 80 static GSList *registered_url_handlers = NULL; | 92 static GSList *registered_url_handlers = NULL; |
| 379 gboolean sensitivity; | 391 gboolean sensitivity; |
| 380 | 392 |
| 381 if (to_toggle == NULL) | 393 if (to_toggle == NULL) |
| 382 return; | 394 return; |
| 383 | 395 |
| 384 sensitivity = GTK_WIDGET_IS_SENSITIVE(to_toggle); | 396 sensitivity = gtk_widget_is_sensitive(to_toggle); |
| 385 | 397 |
| 386 gtk_widget_set_sensitive(to_toggle, !sensitivity); | 398 gtk_widget_set_sensitive(to_toggle, !sensitivity); |
| 387 } | 399 } |
| 388 | 400 |
| 389 void | 401 void |
| 396 for (i=0; i < data->len; i++) { | 408 for (i=0; i < data->len; i++) { |
| 397 element = g_ptr_array_index(data,i); | 409 element = g_ptr_array_index(data,i); |
| 398 if (element == NULL) | 410 if (element == NULL) |
| 399 continue; | 411 continue; |
| 400 | 412 |
| 401 sensitivity = GTK_WIDGET_IS_SENSITIVE(element); | 413 sensitivity = gtk_widget_is_sensitive(element); |
| 402 | 414 |
| 403 gtk_widget_set_sensitive(element, !sensitivity); | 415 gtk_widget_set_sensitive(element, !sensitivity); |
| 404 } | 416 } |
| 405 } | 417 } |
| 406 | 418 |
| 408 pidgin_toggle_showhide(GtkWidget *widget, GtkWidget *to_toggle) | 420 pidgin_toggle_showhide(GtkWidget *widget, GtkWidget *to_toggle) |
| 409 { | 421 { |
| 410 if (to_toggle == NULL) | 422 if (to_toggle == NULL) |
| 411 return; | 423 return; |
| 412 | 424 |
| 413 if (GTK_WIDGET_VISIBLE(to_toggle)) | 425 if (gtk_widget_get_visible(to_toggle)) |
| 414 gtk_widget_hide(to_toggle); | 426 gtk_widget_hide(to_toggle); |
| 415 else | 427 else |
| 416 gtk_widget_show(to_toggle); | 428 gtk_widget_show(to_toggle); |
| 417 } | 429 } |
| 418 | 430 |
| 609 | 621 |
| 610 return vbox; | 622 return vbox; |
| 611 } | 623 } |
| 612 | 624 |
| 613 static gpointer | 625 static gpointer |
| 614 aop_option_menu_get_selected(GtkWidget *optmenu, GtkWidget **p_item) | 626 aop_option_menu_get_selected(GtkWidget *optmenu) |
| 615 { | 627 { |
| 616 GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); | 628 gpointer data = NULL; |
| 617 GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu)); | 629 GtkTreeIter iter; |
| 618 if (p_item) | 630 |
| 619 (*p_item) = item; | 631 g_return_val_if_fail(optmenu != NULL, NULL); |
| 620 return item ? g_object_get_data(G_OBJECT(item), "aop_per_item_data") : NULL; | 632 |
| 633 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(optmenu), &iter)) | |
| 634 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)), | |
| 635 &iter, AOP_DATA_COLUMN, &data, -1); | |
| 636 | |
| 637 return data; | |
| 621 } | 638 } |
| 622 | 639 |
| 623 static void | 640 static void |
| 624 aop_menu_cb(GtkWidget *optmenu, GCallback cb) | 641 aop_menu_cb(GtkWidget *optmenu, GCallback cb) |
| 625 { | 642 { |
| 626 GtkWidget *item; | |
| 627 gpointer per_item_data; | |
| 628 | |
| 629 per_item_data = aop_option_menu_get_selected(optmenu, &item); | |
| 630 | |
| 631 if (cb != NULL) { | 643 if (cb != NULL) { |
| 632 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data")); | 644 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(optmenu, |
| 633 } | 645 aop_option_menu_get_selected(optmenu), |
| 634 } | 646 g_object_get_data(G_OBJECT(optmenu), "user_data")); |
| 635 | 647 } |
| 636 static GtkWidget * | 648 } |
| 637 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data, const char *data) | 649 |
| 638 { | 650 static void |
| 639 GtkWidget *item; | 651 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu) |
| 640 GtkWidget *hbox; | 652 { |
| 641 GtkWidget *image; | 653 gtk_combo_box_set_model(GTK_COMBO_BOX(optmenu), new_aop_menu->model); |
| 642 GtkWidget *label; | 654 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), new_aop_menu->default_item); |
| 643 | 655 g_free(new_aop_menu); |
| 644 item = gtk_menu_item_new(); | |
| 645 gtk_widget_show(item); | |
| 646 | |
| 647 hbox = gtk_hbox_new(FALSE, 4); | |
| 648 gtk_widget_show(hbox); | |
| 649 | |
| 650 /* Create the image */ | |
| 651 if (pixbuf == NULL) | |
| 652 image = gtk_image_new(); | |
| 653 else | |
| 654 image = gtk_image_new_from_pixbuf(pixbuf); | |
| 655 gtk_widget_show(image); | |
| 656 | |
| 657 if (sg) | |
| 658 gtk_size_group_add_widget(sg, image); | |
| 659 | |
| 660 /* Create the label */ | |
| 661 label = gtk_label_new (lbl); | |
| 662 gtk_widget_show (label); | |
| 663 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); | |
| 664 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); | |
| 665 | |
| 666 gtk_container_add(GTK_CONTAINER(item), hbox); | |
| 667 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); | |
| 668 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); | |
| 669 | |
| 670 g_object_set_data(G_OBJECT (item), data, per_item_data); | |
| 671 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data); | |
| 672 | |
| 673 pidgin_set_accessible_label(item, label); | |
| 674 | |
| 675 return item; | |
| 676 } | 656 } |
| 677 | 657 |
| 678 static GdkPixbuf * | 658 static GdkPixbuf * |
| 679 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account) | 659 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account) |
| 680 { | 660 { |
| 711 } | 691 } |
| 712 | 692 |
| 713 static GtkWidget * | 693 static GtkWidget * |
| 714 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) | 694 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) |
| 715 { | 695 { |
| 716 GtkWidget *optmenu; | 696 GtkWidget *optmenu = NULL; |
| 717 | 697 GtkCellRenderer *cr = NULL; |
| 718 optmenu = gtk_option_menu_new(); | 698 |
| 699 optmenu = gtk_combo_box_new(); | |
| 719 gtk_widget_show(optmenu); | 700 gtk_widget_show(optmenu); |
| 720 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), aop_menu->menu); | 701 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_pixbuf_new(), FALSE); |
| 721 | 702 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "pixbuf", AOP_ICON_COLUMN); |
| 722 if (aop_menu->default_item != -1) | 703 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_text_new(), TRUE); |
| 723 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), aop_menu->default_item); | 704 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "text", AOP_NAME_COLUMN); |
| 724 | 705 |
| 725 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", aop_menu, (GDestroyNotify)g_free); | 706 aop_option_menu_replace_menu(optmenu, aop_menu); |
| 726 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); | 707 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); |
| 727 | 708 |
| 728 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb); | 709 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb); |
| 729 | 710 |
| 730 return optmenu; | 711 return optmenu; |
| 731 } | |
| 732 | |
| 733 static void | |
| 734 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu) | |
| 735 { | |
| 736 if (gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu))) | |
| 737 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu)); | |
| 738 | |
| 739 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), new_aop_menu->menu); | |
| 740 | |
| 741 if (new_aop_menu->default_item != -1) | |
| 742 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), new_aop_menu->default_item); | |
| 743 | |
| 744 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free); | |
| 745 } | 712 } |
| 746 | 713 |
| 747 static void | 714 static void |
| 748 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data) | 715 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data) |
| 749 { | 716 { |
| 750 guint idx; | 717 GtkTreeModel *model; |
| 751 GList *llItr = NULL; | 718 GtkTreeIter iter; |
| 752 | 719 gpointer iter_data; |
| 753 for (idx = 0, llItr = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))->children; | 720 model = gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)); |
| 754 llItr != NULL; | 721 if (gtk_tree_model_get_iter_first(model, &iter)) { |
| 755 llItr = llItr->next, idx++) { | 722 do { |
| 756 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) { | 723 gtk_tree_model_get(model, &iter, AOP_DATA_COLUMN, &iter_data, -1); |
| 757 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); | 724 if (iter_data == data) { |
| 758 break; | 725 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(optmenu), &iter); |
| 759 } | 726 return; |
| 727 } | |
| 728 } while (gtk_tree_model_iter_next(model, &iter)); | |
| 760 } | 729 } |
| 761 } | 730 } |
| 762 | 731 |
| 763 static AopMenu * | 732 static AopMenu * |
| 764 create_protocols_menu(const char *default_proto_id) | 733 create_protocols_menu(const char *default_proto_id) |
| 765 { | 734 { |
| 766 AopMenu *aop_menu = NULL; | 735 AopMenu *aop_menu = NULL; |
| 767 PurplePlugin *plugin; | 736 PurplePlugin *plugin; |
| 768 GdkPixbuf *pixbuf = NULL; | 737 GdkPixbuf *pixbuf = NULL; |
| 769 GtkSizeGroup *sg; | 738 GtkTreeIter iter; |
| 739 GtkListStore *ls; | |
| 770 GList *p; | 740 GList *p; |
| 771 const char *gtalk_name = NULL, *facebook_name = NULL; | |
| 772 int i; | 741 int i; |
| 773 | 742 |
| 743 ls = gtk_list_store_new(AOP_COLUMN_COUNT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); | |
| 744 | |
| 774 aop_menu = g_malloc0(sizeof(AopMenu)); | 745 aop_menu = g_malloc0(sizeof(AopMenu)); |
| 775 aop_menu->default_item = -1; | 746 aop_menu->default_item = 0; |
| 776 aop_menu->menu = gtk_menu_new(); | 747 aop_menu->model = GTK_TREE_MODEL(ls); |
| 777 gtk_widget_show(aop_menu->menu); | |
| 778 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
| 779 | |
| 780 if (purple_find_prpl("prpl-jabber")) { | |
| 781 gtalk_name = _("Google Talk"); | |
| 782 facebook_name = _("Facebook (XMPP)"); | |
| 783 } | |
| 784 | 748 |
| 785 for (p = purple_plugins_get_protocols(), i = 0; | 749 for (p = purple_plugins_get_protocols(), i = 0; |
| 786 p != NULL; | 750 p != NULL; |
| 787 p = p->next, i++) { | 751 p = p->next, i++) { |
| 788 | 752 |
| 789 plugin = (PurplePlugin *)p->data; | 753 plugin = (PurplePlugin *)p->data; |
| 790 | 754 |
| 791 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { | |
| 792 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", | |
| 793 "16", "google-talk.png", NULL); | |
| 794 GtkWidget *item; | |
| 795 | |
| 796 pixbuf = pidgin_pixbuf_new_from_file(filename); | |
| 797 g_free(filename); | |
| 798 | |
| 799 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), | |
| 800 item = aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber", "protocol")); | |
| 801 g_object_set_data(G_OBJECT(item), "fakegoogle", GINT_TO_POINTER(1)); | |
| 802 | |
| 803 if (pixbuf) | |
| 804 g_object_unref(pixbuf); | |
| 805 | |
| 806 gtalk_name = NULL; | |
| 807 i++; | |
| 808 } | |
| 809 | |
| 810 if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) { | |
| 811 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", | |
| 812 "16", "facebook.png", NULL); | |
| 813 GtkWidget *item; | |
| 814 | |
| 815 pixbuf = pidgin_pixbuf_new_from_file(filename); | |
| 816 g_free(filename); | |
| 817 | |
| 818 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), | |
| 819 item = aop_menu_item_new(sg, pixbuf, facebook_name, "prpl-jabber", "protocol")); | |
| 820 g_object_set_data(G_OBJECT(item), "fakefacebook", GINT_TO_POINTER(1)); | |
| 821 | |
| 822 if (pixbuf) | |
| 823 g_object_unref(pixbuf); | |
| 824 | |
| 825 facebook_name = NULL; | |
| 826 i++; | |
| 827 } | |
| 828 | |
| 829 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); | 755 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); |
| 830 | 756 |
| 831 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), | 757 gtk_list_store_append(ls, &iter); |
| 832 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id, "protocol")); | 758 gtk_list_store_set(ls, &iter, |
| 759 AOP_ICON_COLUMN, pixbuf, | |
| 760 AOP_NAME_COLUMN, plugin->info->name, | |
| 761 AOP_DATA_COLUMN, plugin->info->id, | |
| 762 -1); | |
| 833 | 763 |
| 834 if (pixbuf) | 764 if (pixbuf) |
| 835 g_object_unref(pixbuf); | 765 g_object_unref(pixbuf); |
| 836 | 766 |
| 837 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) | 767 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) |
| 838 aop_menu->default_item = i; | 768 aop_menu->default_item = i; |
| 839 } | 769 } |
| 840 | |
| 841 g_object_unref(sg); | |
| 842 | 770 |
| 843 return aop_menu; | 771 return aop_menu; |
| 844 } | 772 } |
| 845 | 773 |
| 846 GtkWidget * | 774 GtkWidget * |
| 851 } | 779 } |
| 852 | 780 |
| 853 const char * | 781 const char * |
| 854 pidgin_protocol_option_menu_get_selected(GtkWidget *optmenu) | 782 pidgin_protocol_option_menu_get_selected(GtkWidget *optmenu) |
| 855 { | 783 { |
| 856 return (const char *)aop_option_menu_get_selected(optmenu, NULL); | 784 return (const char *)aop_option_menu_get_selected(optmenu); |
| 857 } | 785 } |
| 858 | 786 |
| 859 PurpleAccount * | 787 PurpleAccount * |
| 860 pidgin_account_option_menu_get_selected(GtkWidget *optmenu) | 788 pidgin_account_option_menu_get_selected(GtkWidget *optmenu) |
| 861 { | 789 { |
| 862 return (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); | 790 return (PurpleAccount *)aop_option_menu_get_selected(optmenu); |
| 863 } | 791 } |
| 864 | 792 |
| 865 static AopMenu * | 793 static AopMenu * |
| 866 create_account_menu(PurpleAccount *default_account, | 794 create_account_menu(PurpleAccount *default_account, |
| 867 PurpleFilterAccountFunc filter_func, gboolean show_all) | 795 PurpleFilterAccountFunc filter_func, gboolean show_all) |
| 869 AopMenu *aop_menu = NULL; | 797 AopMenu *aop_menu = NULL; |
| 870 PurpleAccount *account; | 798 PurpleAccount *account; |
| 871 GdkPixbuf *pixbuf = NULL; | 799 GdkPixbuf *pixbuf = NULL; |
| 872 GList *list; | 800 GList *list; |
| 873 GList *p; | 801 GList *p; |
| 874 GtkSizeGroup *sg; | 802 GtkListStore *ls; |
| 803 GtkTreeIter iter; | |
| 875 int i; | 804 int i; |
| 876 char buf[256]; | 805 char buf[256]; |
| 877 | 806 |
| 878 if (show_all) | 807 if (show_all) |
| 879 list = purple_accounts_get_all(); | 808 list = purple_accounts_get_all(); |
| 880 else | 809 else |
| 881 list = purple_connections_get_all(); | 810 list = purple_connections_get_all(); |
| 882 | 811 |
| 812 ls = gtk_list_store_new(AOP_COLUMN_COUNT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); | |
| 813 | |
| 883 aop_menu = g_malloc0(sizeof(AopMenu)); | 814 aop_menu = g_malloc0(sizeof(AopMenu)); |
| 884 aop_menu->default_item = -1; | 815 aop_menu->default_item = 0; |
| 885 aop_menu->menu = gtk_menu_new(); | 816 aop_menu->model = GTK_TREE_MODEL(ls); |
| 886 gtk_widget_show(aop_menu->menu); | |
| 887 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
| 888 | 817 |
| 889 for (p = list, i = 0; p != NULL; p = p->next, i++) { | 818 for (p = list, i = 0; p != NULL; p = p->next, i++) { |
| 890 if (show_all) | 819 if (show_all) |
| 891 account = (PurpleAccount *)p->data; | 820 account = (PurpleAccount *)p->data; |
| 892 else { | 821 else { |
| 917 g_snprintf(buf, sizeof(buf), "%s (%s)", | 846 g_snprintf(buf, sizeof(buf), "%s (%s)", |
| 918 purple_account_get_username(account), | 847 purple_account_get_username(account), |
| 919 purple_account_get_protocol_name(account)); | 848 purple_account_get_protocol_name(account)); |
| 920 } | 849 } |
| 921 | 850 |
| 922 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), | 851 gtk_list_store_append(ls, &iter); |
| 923 aop_menu_item_new(sg, pixbuf, buf, account, "account")); | 852 gtk_list_store_set(ls, &iter, |
| 853 AOP_ICON_COLUMN, pixbuf, | |
| 854 AOP_NAME_COLUMN, buf, | |
| 855 AOP_DATA_COLUMN, account, | |
| 856 -1); | |
| 924 | 857 |
| 925 if (pixbuf) | 858 if (pixbuf) |
| 926 g_object_unref(pixbuf); | 859 g_object_unref(pixbuf); |
| 927 | 860 |
| 928 if (default_account && account == default_account) | 861 if (default_account && account == default_account) |
| 929 aop_menu->default_item = i; | 862 aop_menu->default_item = i; |
| 930 } | 863 } |
| 931 | |
| 932 g_object_unref(sg); | |
| 933 | 864 |
| 934 return aop_menu; | 865 return aop_menu; |
| 935 } | 866 } |
| 936 | 867 |
| 937 static void | 868 static void |
| 939 { | 870 { |
| 940 gboolean show_all; | 871 gboolean show_all; |
| 941 PurpleAccount *account; | 872 PurpleAccount *account; |
| 942 PurpleFilterAccountFunc filter_func; | 873 PurpleFilterAccountFunc filter_func; |
| 943 | 874 |
| 944 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); | 875 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu); |
| 945 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all")); | 876 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all")); |
| 946 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func"); | 877 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func"); |
| 947 | 878 |
| 948 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all)); | 879 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all)); |
| 949 } | 880 } |
| 1963 } | 1894 } |
| 1964 purple_menu_action_free(act); | 1895 purple_menu_action_free(act); |
| 1965 return menuitem; | 1896 return menuitem; |
| 1966 } | 1897 } |
| 1967 | 1898 |
| 1899 enum { | |
| 1900 COMPLETION_DISPLAYED_COLUMN, /* displayed completion value */ | |
| 1901 COMPLETION_BUDDY_COLUMN, /* buddy name */ | |
| 1902 COMPLETION_NORMALIZED_COLUMN, /* UTF-8 normalized & casefolded buddy name */ | |
| 1903 COMPLETION_COMPARISON_COLUMN, /* UTF-8 normalized & casefolded value for comparison */ | |
| 1904 COMPLETION_ACCOUNT_COLUMN, /* account */ | |
| 1905 COMPLETION_COLUMN_COUNT | |
| 1906 }; | |
| 1907 | |
| 1968 typedef struct | 1908 typedef struct |
| 1969 { | 1909 { |
| 1970 GtkWidget *entry; | 1910 GtkWidget *entry; |
| 1971 GtkWidget *accountopt; | 1911 GtkWidget *accountopt; |
| 1972 | 1912 |
| 1982 GtkTreeModel *model; | 1922 GtkTreeModel *model; |
| 1983 GValue val1; | 1923 GValue val1; |
| 1984 GValue val2; | 1924 GValue val2; |
| 1985 const char *tmp; | 1925 const char *tmp; |
| 1986 | 1926 |
| 1987 model = gtk_entry_completion_get_model (completion); | 1927 model = gtk_entry_completion_get_model(completion); |
| 1988 | 1928 |
| 1989 val1.g_type = 0; | 1929 val1.g_type = 0; |
| 1990 gtk_tree_model_get_value(model, iter, 2, &val1); | 1930 gtk_tree_model_get_value(model, iter, COMPLETION_NORMALIZED_COLUMN, &val1); |
| 1991 tmp = g_value_get_string(&val1); | 1931 tmp = g_value_get_string(&val1); |
| 1992 if (tmp != NULL && purple_str_has_prefix(tmp, key)) | 1932 if (tmp != NULL && purple_str_has_prefix(tmp, key)) |
| 1993 { | 1933 { |
| 1994 g_value_unset(&val1); | 1934 g_value_unset(&val1); |
| 1995 return TRUE; | 1935 return TRUE; |
| 1996 } | 1936 } |
| 1997 g_value_unset(&val1); | 1937 g_value_unset(&val1); |
| 1998 | 1938 |
| 1999 val2.g_type = 0; | 1939 val2.g_type = 0; |
| 2000 gtk_tree_model_get_value(model, iter, 3, &val2); | 1940 gtk_tree_model_get_value(model, iter, COMPLETION_COMPARISON_COLUMN, &val2); |
| 2001 tmp = g_value_get_string(&val2); | 1941 tmp = g_value_get_string(&val2); |
| 2002 if (tmp != NULL && purple_str_has_prefix(tmp, key)) | 1942 if (tmp != NULL && purple_str_has_prefix(tmp, key)) |
| 2003 { | 1943 { |
| 2004 g_value_unset(&val2); | 1944 g_value_unset(&val2); |
| 2005 return TRUE; | 1945 return TRUE; |
| 2015 GValue val; | 1955 GValue val; |
| 2016 GtkWidget *optmenu = data->accountopt; | 1956 GtkWidget *optmenu = data->accountopt; |
| 2017 PurpleAccount *account; | 1957 PurpleAccount *account; |
| 2018 | 1958 |
| 2019 val.g_type = 0; | 1959 val.g_type = 0; |
| 2020 gtk_tree_model_get_value(model, iter, 1, &val); | 1960 gtk_tree_model_get_value(model, iter, COMPLETION_BUDDY_COLUMN, &val); |
| 2021 gtk_entry_set_text(GTK_ENTRY(data->entry), g_value_get_string(&val)); | 1961 gtk_entry_set_text(GTK_ENTRY(data->entry), g_value_get_string(&val)); |
| 2022 g_value_unset(&val); | 1962 g_value_unset(&val); |
| 2023 | 1963 |
| 2024 gtk_tree_model_get_value(model, iter, 4, &val); | 1964 gtk_tree_model_get_value(model, iter, COMPLETION_ACCOUNT_COLUMN, &val); |
| 2025 account = g_value_get_pointer(&val); | 1965 account = g_value_get_pointer(&val); |
| 2026 g_value_unset(&val); | 1966 g_value_unset(&val); |
| 2027 | 1967 |
| 2028 if (account == NULL) | 1968 if (account == NULL) |
| 2029 return TRUE; | 1969 return TRUE; |
| 2056 tmp = g_utf8_casefold(tmp2, -1); | 1996 tmp = g_utf8_casefold(tmp2, -1); |
| 2057 g_free(tmp2); | 1997 g_free(tmp2); |
| 2058 | 1998 |
| 2059 gtk_list_store_append(store, &iter); | 1999 gtk_list_store_append(store, &iter); |
| 2060 gtk_list_store_set(store, &iter, | 2000 gtk_list_store_set(store, &iter, |
| 2061 0, completion_entry, | 2001 COMPLETION_DISPLAYED_COLUMN, completion_entry, |
| 2062 1, buddyname, | 2002 COMPLETION_BUDDY_COLUMN, buddyname, |
| 2063 2, normalized_buddyname, | 2003 COMPLETION_NORMALIZED_COLUMN, normalized_buddyname, |
| 2064 3, tmp, | 2004 COMPLETION_COMPARISON_COLUMN, tmp, |
| 2065 4, account, | 2005 COMPLETION_ACCOUNT_COLUMN, account, |
| 2066 -1); | 2006 -1); |
| 2067 g_free(completion_entry); | 2007 g_free(completion_entry); |
| 2068 g_free(tmp); | 2008 g_free(tmp); |
| 2069 completion_added = TRUE; | 2009 completion_added = TRUE; |
| 2070 } | 2010 } |
| 2081 tmp = g_utf8_casefold(tmp2, -1); | 2021 tmp = g_utf8_casefold(tmp2, -1); |
| 2082 g_free(tmp2); | 2022 g_free(tmp2); |
| 2083 | 2023 |
| 2084 gtk_list_store_append(store, &iter); | 2024 gtk_list_store_append(store, &iter); |
| 2085 gtk_list_store_set(store, &iter, | 2025 gtk_list_store_set(store, &iter, |
| 2086 0, completion_entry, | 2026 COMPLETION_DISPLAYED_COLUMN, completion_entry, |
| 2087 1, buddyname, | 2027 COMPLETION_BUDDY_COLUMN, buddyname, |
| 2088 2, normalized_buddyname, | 2028 COMPLETION_NORMALIZED_COLUMN, normalized_buddyname, |
| 2089 3, tmp, | 2029 COMPLETION_COMPARISON_COLUMN, tmp, |
| 2090 4, account, | 2030 COMPLETION_ACCOUNT_COLUMN, account, |
| 2091 -1); | 2031 -1); |
| 2092 g_free(completion_entry); | 2032 g_free(completion_entry); |
| 2093 g_free(tmp); | 2033 g_free(tmp); |
| 2094 completion_added = TRUE; | 2034 completion_added = TRUE; |
| 2095 } | 2035 } |
| 2097 | 2037 |
| 2098 if (completion_added == FALSE) { | 2038 if (completion_added == FALSE) { |
| 2099 /* Add the buddy's name. */ | 2039 /* Add the buddy's name. */ |
| 2100 gtk_list_store_append(store, &iter); | 2040 gtk_list_store_append(store, &iter); |
| 2101 gtk_list_store_set(store, &iter, | 2041 gtk_list_store_set(store, &iter, |
| 2102 0, buddyname, | 2042 COMPLETION_DISPLAYED_COLUMN, buddyname, |
| 2103 1, buddyname, | 2043 COMPLETION_BUDDY_COLUMN, buddyname, |
| 2104 2, normalized_buddyname, | 2044 COMPLETION_NORMALIZED_COLUMN, normalized_buddyname, |
| 2105 3, NULL, | 2045 COMPLETION_COMPARISON_COLUMN, NULL, |
| 2106 4, account, | 2046 COMPLETION_ACCOUNT_COLUMN, account, |
| 2107 -1); | 2047 -1); |
| 2108 } | 2048 } |
| 2109 | 2049 |
| 2110 g_free(normalized_buddyname); | 2050 g_free(normalized_buddyname); |
| 2111 } | 2051 } |
| 2199 GtkListStore *store; | 2139 GtkListStore *store; |
| 2200 | 2140 |
| 2201 GtkEntryCompletion *completion; | 2141 GtkEntryCompletion *completion; |
| 2202 | 2142 |
| 2203 data = g_new0(PidginCompletionData, 1); | 2143 data = g_new0(PidginCompletionData, 1); |
| 2204 store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); | 2144 store = gtk_list_store_new(COMPLETION_COLUMN_COUNT, G_TYPE_STRING, |
| 2145 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, | |
| 2146 G_TYPE_POINTER); | |
| 2205 | 2147 |
| 2206 data->entry = entry; | 2148 data->entry = entry; |
| 2207 data->accountopt = accountopt; | 2149 data->accountopt = accountopt; |
| 2208 if (filter_func == NULL) { | 2150 if (filter_func == NULL) { |
| 2209 data->filter_func = pidgin_screenname_autocomplete_default_filter; | 2151 data->filter_func = pidgin_screenname_autocomplete_default_filter; |
| 2216 | 2158 |
| 2217 add_completion_list(data); | 2159 add_completion_list(data); |
| 2218 | 2160 |
| 2219 /* Sort the completion list by buddy name */ | 2161 /* Sort the completion list by buddy name */ |
| 2220 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), | 2162 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), |
| 2221 1, GTK_SORT_ASCENDING); | 2163 COMPLETION_BUDDY_COLUMN, |
| 2164 GTK_SORT_ASCENDING); | |
| 2222 | 2165 |
| 2223 completion = gtk_entry_completion_new(); | 2166 completion = gtk_entry_completion_new(); |
| 2224 gtk_entry_completion_set_match_func(completion, buddyname_completion_match_func, NULL, NULL); | 2167 gtk_entry_completion_set_match_func(completion, buddyname_completion_match_func, NULL, NULL); |
| 2225 | 2168 |
| 2226 g_signal_connect(G_OBJECT(completion), "match-selected", | 2169 g_signal_connect(G_OBJECT(completion), "match-selected", |
| 2230 g_object_unref(completion); | 2173 g_object_unref(completion); |
| 2231 | 2174 |
| 2232 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store)); | 2175 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store)); |
| 2233 g_object_unref(store); | 2176 g_object_unref(store); |
| 2234 | 2177 |
| 2235 gtk_entry_completion_set_text_column(completion, 0); | 2178 gtk_entry_completion_set_text_column(completion, COMPLETION_DISPLAYED_COLUMN); |
| 2236 | 2179 |
| 2237 purple_signal_connect(purple_connections_get_handle(), "signed-on", entry, | 2180 purple_signal_connect(purple_connections_get_handle(), "signed-on", entry, |
| 2238 PURPLE_CALLBACK(repopulate_autocomplete), data); | 2181 PURPLE_CALLBACK(repopulate_autocomplete), data); |
| 2239 purple_signal_connect(purple_connections_get_handle(), "signed-off", entry, | 2182 purple_signal_connect(purple_connections_get_handle(), "signed-off", entry, |
| 2240 PURPLE_CALLBACK(repopulate_autocomplete), data); | 2183 PURPLE_CALLBACK(repopulate_autocomplete), data); |
| 3065 time_t value; | 3008 time_t value; |
| 3066 | 3009 |
| 3067 windows = g_list_delete_link(windows, windows); | 3010 windows = g_list_delete_link(windows, windows); |
| 3068 | 3011 |
| 3069 if (window == widget || | 3012 if (window == widget || |
| 3070 !GTK_WIDGET_VISIBLE(window)) | 3013 !gtk_widget_get_visible(window)) |
| 3071 continue; | 3014 continue; |
| 3072 | 3015 |
| 3073 if (!gdk_property_get(window->window, _WindowTime, _Cardinal, 0, sizeof(time_t), FALSE, | 3016 if (!gdk_property_get(window->window, _WindowTime, _Cardinal, 0, sizeof(time_t), FALSE, |
| 3074 NULL, NULL, &al, &data)) | 3017 NULL, NULL, &al, &data)) |
| 3075 continue; | 3018 continue; |
| 3119 while (windows) { | 3062 while (windows) { |
| 3120 GtkWidget *window = windows->data; | 3063 GtkWidget *window = windows->data; |
| 3121 windows = g_list_delete_link(windows, windows); | 3064 windows = g_list_delete_link(windows, windows); |
| 3122 | 3065 |
| 3123 if (window == widget || | 3066 if (window == widget || |
| 3124 !GTK_WIDGET_VISIBLE(window)) { | 3067 !gtk_widget_get_visible(window)) { |
| 3125 continue; | 3068 continue; |
| 3126 } | 3069 } |
| 3127 | 3070 |
| 3128 if (gtk_window_has_toplevel_focus(GTK_WINDOW(window)) || | 3071 if (gtk_window_has_toplevel_focus(GTK_WINDOW(window)) || |
| 3129 (menu && menu == window->window)) { | 3072 (menu && menu == window->window)) { |
| 3760 gtk_imhtml_class_register_protocol("https://", NULL, NULL); | 3703 gtk_imhtml_class_register_protocol("https://", NULL, NULL); |
| 3761 gtk_imhtml_class_register_protocol("ftp://", NULL, NULL); | 3704 gtk_imhtml_class_register_protocol("ftp://", NULL, NULL); |
| 3762 gtk_imhtml_class_register_protocol("mailto:", NULL, NULL); | 3705 gtk_imhtml_class_register_protocol("mailto:", NULL, NULL); |
| 3763 gtk_imhtml_class_register_protocol("gopher://", NULL, NULL); | 3706 gtk_imhtml_class_register_protocol("gopher://", NULL, NULL); |
| 3764 } | 3707 } |
| 3765 |