pidgin/gtkutils.c

branch
cpw.qulogic.gtk3
changeset 32939
0907cfb3cc0a
parent 32809
5f024465ef89
parent 32936
03b440305f19
child 33021
3dc4b2cdba7f
child 33132
24afd2b22579
equal deleted inserted replaced
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

mercurial