comparison pidgin/gtkutils.c @ 32696:763d65f3f758

explicit merge of '6ab9f5ff810acde3c06a2add7b8df2bd75cce6e3' and '7a0bb807afc9c1c3f2aaa7143fc5d1e3dc7c6ee8' to branch 'im.pidgin.cpw.qulogic.gtk3'
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Fri, 23 Dec 2011 06:58:52 +0000
parents 420aef349806 3538e783b98c
children b961222cf067
comparison
equal deleted inserted replaced
32418:466efc330d3d 32696:763d65f3f758
68 #include "gtkthemes.h" 68 #include "gtkthemes.h"
69 #include "gtkutils.h" 69 #include "gtkutils.h"
70 #include "gtkwebview.h" 70 #include "gtkwebview.h"
71 #include "pidgin/minidialog.h" 71 #include "pidgin/minidialog.h"
72 72
73 #if !GTK_CHECK_VERSION(2,18,0)
74 #define gtk_widget_get_visible(x) GTK_WIDGET_VISIBLE(x)
75 #define gtk_widget_is_sensitive(x) GTK_WIDGET_IS_SENSITIVE(x)
76 #endif
77
73 typedef struct { 78 typedef struct {
74 GtkWidget *menu; 79 GtkTreeModel *model;
75 gint default_item; 80 gint default_item;
76 } AopMenu; 81 } AopMenu;
77 82
78 static guint accels_save_timer = 0; 83 static guint accels_save_timer = 0;
79 static GSList *registered_url_handlers = NULL; 84 static GSList *registered_url_handlers = NULL;
354 gboolean sensitivity; 359 gboolean sensitivity;
355 360
356 if (to_toggle == NULL) 361 if (to_toggle == NULL)
357 return; 362 return;
358 363
359 sensitivity = GTK_WIDGET_IS_SENSITIVE(to_toggle); 364 sensitivity = gtk_widget_is_sensitive(to_toggle);
360 365
361 gtk_widget_set_sensitive(to_toggle, !sensitivity); 366 gtk_widget_set_sensitive(to_toggle, !sensitivity);
362 } 367 }
363 368
364 void 369 void
371 for (i=0; i < data->len; i++) { 376 for (i=0; i < data->len; i++) {
372 element = g_ptr_array_index(data,i); 377 element = g_ptr_array_index(data,i);
373 if (element == NULL) 378 if (element == NULL)
374 continue; 379 continue;
375 380
376 sensitivity = GTK_WIDGET_IS_SENSITIVE(element); 381 sensitivity = gtk_widget_is_sensitive(element);
377 382
378 gtk_widget_set_sensitive(element, !sensitivity); 383 gtk_widget_set_sensitive(element, !sensitivity);
379 } 384 }
380 } 385 }
381 386
383 pidgin_toggle_showhide(GtkWidget *widget, GtkWidget *to_toggle) 388 pidgin_toggle_showhide(GtkWidget *widget, GtkWidget *to_toggle)
384 { 389 {
385 if (to_toggle == NULL) 390 if (to_toggle == NULL)
386 return; 391 return;
387 392
388 if (GTK_WIDGET_VISIBLE(to_toggle)) 393 if (gtk_widget_get_visible(to_toggle))
389 gtk_widget_hide(to_toggle); 394 gtk_widget_hide(to_toggle);
390 else 395 else
391 gtk_widget_show(to_toggle); 396 gtk_widget_show(to_toggle);
392 } 397 }
393 398
584 589
585 return vbox; 590 return vbox;
586 } 591 }
587 592
588 static gpointer 593 static gpointer
589 aop_option_menu_get_selected(GtkWidget *optmenu, GtkWidget **p_item) 594 aop_option_menu_get_selected(GtkWidget *optmenu)
590 { 595 {
591 GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); 596 gpointer data = NULL;
592 GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu)); 597 GtkTreeIter iter;
593 if (p_item) 598
594 (*p_item) = item; 599 g_return_val_if_fail(optmenu != NULL, NULL);
595 return item ? g_object_get_data(G_OBJECT(item), "aop_per_item_data") : NULL; 600
601 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(optmenu), &iter))
602 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)), &iter, 2, &data, -1);
603
604 return data;
596 } 605 }
597 606
598 static void 607 static void
599 aop_menu_cb(GtkWidget *optmenu, GCallback cb) 608 aop_menu_cb(GtkWidget *optmenu, GCallback cb)
600 { 609 {
601 GtkWidget *item;
602 gpointer per_item_data;
603
604 per_item_data = aop_option_menu_get_selected(optmenu, &item);
605
606 if (cb != NULL) { 610 if (cb != NULL) {
607 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(item, per_item_data, g_object_get_data(G_OBJECT(optmenu), "user_data")); 611 ((void (*)(GtkWidget *, gpointer, gpointer))cb)(optmenu,
608 } 612 aop_option_menu_get_selected(optmenu),
609 } 613 g_object_get_data(G_OBJECT(optmenu), "user_data"));
610 614 }
611 static GtkWidget * 615 }
612 aop_menu_item_new(GtkSizeGroup *sg, GdkPixbuf *pixbuf, const char *lbl, gpointer per_item_data, const char *data) 616
613 { 617 static void
614 GtkWidget *item; 618 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu)
615 GtkWidget *hbox; 619 {
616 GtkWidget *image; 620 gtk_combo_box_set_model(GTK_COMBO_BOX(optmenu), new_aop_menu->model);
617 GtkWidget *label; 621 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), new_aop_menu->default_item);
618 622 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free);
619 item = gtk_menu_item_new();
620 gtk_widget_show(item);
621
622 hbox = gtk_hbox_new(FALSE, 4);
623 gtk_widget_show(hbox);
624
625 /* Create the image */
626 if (pixbuf == NULL)
627 image = gtk_image_new();
628 else
629 image = gtk_image_new_from_pixbuf(pixbuf);
630 gtk_widget_show(image);
631
632 if (sg)
633 gtk_size_group_add_widget(sg, image);
634
635 /* Create the label */
636 label = gtk_label_new (lbl);
637 gtk_widget_show (label);
638 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
639 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
640
641 gtk_container_add(GTK_CONTAINER(item), hbox);
642 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
643 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
644
645 g_object_set_data(G_OBJECT (item), data, per_item_data);
646 g_object_set_data(G_OBJECT (item), "aop_per_item_data", per_item_data);
647
648 pidgin_set_accessible_label(item, label);
649
650 return item;
651 } 623 }
652 624
653 static GdkPixbuf * 625 static GdkPixbuf *
654 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account) 626 pidgin_create_prpl_icon_from_prpl(PurplePlugin *prpl, PidginPrplIconSize size, PurpleAccount *account)
655 { 627 {
686 } 658 }
687 659
688 static GtkWidget * 660 static GtkWidget *
689 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data) 661 aop_option_menu_new(AopMenu *aop_menu, GCallback cb, gpointer user_data)
690 { 662 {
691 GtkWidget *optmenu; 663 GtkWidget *optmenu = NULL;
692 664 GtkCellRenderer *cr = NULL;
693 optmenu = gtk_option_menu_new(); 665
666 optmenu = gtk_combo_box_new();
694 gtk_widget_show(optmenu); 667 gtk_widget_show(optmenu);
695 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), aop_menu->menu); 668 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_pixbuf_new(), FALSE);
696 669 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "pixbuf", 0);
697 if (aop_menu->default_item != -1) 670 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(optmenu), cr = gtk_cell_renderer_text_new(), TRUE);
698 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), aop_menu->default_item); 671 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(optmenu), cr, "text", 1);
699 672
700 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", aop_menu, (GDestroyNotify)g_free); 673 aop_option_menu_replace_menu(optmenu, aop_menu);
674 if (aop_menu->default_item == -1)
675 gtk_combo_box_set_active(GTK_COMBO_BOX(optmenu), 0);
701 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); 676 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data);
702 677
703 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb); 678 g_signal_connect(G_OBJECT(optmenu), "changed", G_CALLBACK(aop_menu_cb), cb);
704 679
705 return optmenu; 680 return optmenu;
706 }
707
708 static void
709 aop_option_menu_replace_menu(GtkWidget *optmenu, AopMenu *new_aop_menu)
710 {
711 if (gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))
712 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu));
713
714 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), new_aop_menu->menu);
715
716 if (new_aop_menu->default_item != -1)
717 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), new_aop_menu->default_item);
718
719 g_object_set_data_full(G_OBJECT(optmenu), "aop_menu", new_aop_menu, (GDestroyNotify)g_free);
720 } 681 }
721 682
722 static void 683 static void
723 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data) 684 aop_option_menu_select_by_data(GtkWidget *optmenu, gpointer data)
724 { 685 {
725 guint idx; 686 GtkTreeModel *model;
726 GList *llItr = NULL; 687 GtkTreeIter iter;
727 688 gpointer iter_data;
728 for (idx = 0, llItr = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)))->children; 689 model = gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu));
729 llItr != NULL; 690 if (gtk_tree_model_get_iter_first(model, &iter)) {
730 llItr = llItr->next, idx++) { 691 do {
731 if (data == g_object_get_data(G_OBJECT(llItr->data), "aop_per_item_data")) { 692 gtk_tree_model_get(model, &iter, 2, &iter_data, -1);
732 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), idx); 693 if (iter_data == data) {
733 break; 694 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(optmenu), &iter);
734 } 695 return;
696 }
697 } while (gtk_tree_model_iter_next(model, &iter));
735 } 698 }
736 } 699 }
737 700
738 static AopMenu * 701 static AopMenu *
739 create_protocols_menu(const char *default_proto_id) 702 create_protocols_menu(const char *default_proto_id)
740 { 703 {
741 AopMenu *aop_menu = NULL; 704 AopMenu *aop_menu = NULL;
742 PurplePlugin *plugin; 705 PurplePlugin *plugin;
743 GdkPixbuf *pixbuf = NULL; 706 GdkPixbuf *pixbuf = NULL;
744 GtkSizeGroup *sg; 707 GtkTreeIter iter;
708 GtkListStore *ls;
745 GList *p; 709 GList *p;
746 const char *gtalk_name = NULL, *facebook_name = NULL; 710 const char *gtalk_name = NULL, *facebook_name = NULL;
747 int i; 711 int i;
748 712
713 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
714
749 aop_menu = g_malloc0(sizeof(AopMenu)); 715 aop_menu = g_malloc0(sizeof(AopMenu));
750 aop_menu->default_item = -1; 716 aop_menu->default_item = -1;
751 aop_menu->menu = gtk_menu_new(); 717 aop_menu->model = GTK_TREE_MODEL(ls);
752 gtk_widget_show(aop_menu->menu);
753 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
754 718
755 if (purple_find_prpl("prpl-jabber")) { 719 if (purple_find_prpl("prpl-jabber")) {
756 gtalk_name = _("Google Talk"); 720 gtalk_name = _("Google Talk");
757 facebook_name = _("Facebook (XMPP)"); 721 facebook_name = _("Facebook (XMPP)");
758 } 722 }
764 plugin = (PurplePlugin *)p->data; 728 plugin = (PurplePlugin *)p->data;
765 729
766 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) { 730 if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) {
767 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", 731 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
768 "16", "google-talk.png", NULL); 732 "16", "google-talk.png", NULL);
769 GtkWidget *item;
770
771 pixbuf = pidgin_pixbuf_new_from_file(filename); 733 pixbuf = pidgin_pixbuf_new_from_file(filename);
772 g_free(filename); 734 g_free(filename);
773 735
774 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 736 gtk_list_store_append(ls, &iter);
775 item = aop_menu_item_new(sg, pixbuf, gtalk_name, "prpl-jabber", "protocol")); 737 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, gtalk_name, 2, "prpl-jabber", -1);
776 g_object_set_data(G_OBJECT(item), "fakegoogle", GINT_TO_POINTER(1));
777 738
778 if (pixbuf) 739 if (pixbuf)
779 g_object_unref(pixbuf); 740 g_object_unref(pixbuf);
780 741
781 gtalk_name = NULL; 742 gtalk_name = NULL;
783 } 744 }
784 745
785 if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) { 746 if (facebook_name && strcmp(facebook_name, plugin->info->name) < 0) {
786 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", 747 char *filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols",
787 "16", "facebook.png", NULL); 748 "16", "facebook.png", NULL);
788 GtkWidget *item;
789 749
790 pixbuf = pidgin_pixbuf_new_from_file(filename); 750 pixbuf = pidgin_pixbuf_new_from_file(filename);
791 g_free(filename); 751 g_free(filename);
792 752
793 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 753 gtk_list_store_append(ls, &iter);
794 item = aop_menu_item_new(sg, pixbuf, facebook_name, "prpl-jabber", "protocol")); 754 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, facebook_name, 2, "prpl-jabber", -1);
795 g_object_set_data(G_OBJECT(item), "fakefacebook", GINT_TO_POINTER(1));
796 755
797 if (pixbuf) 756 if (pixbuf)
798 g_object_unref(pixbuf); 757 g_object_unref(pixbuf);
799 758
800 facebook_name = NULL; 759 facebook_name = NULL;
801 i++; 760 i++;
802 } 761 }
803 762
804 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL); 763 pixbuf = pidgin_create_prpl_icon_from_prpl(plugin, PIDGIN_PRPL_ICON_SMALL, NULL);
805 764
806 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 765 gtk_list_store_append(ls, &iter);
807 aop_menu_item_new(sg, pixbuf, plugin->info->name, plugin->info->id, "protocol")); 766 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, plugin->info->name, 2, plugin->info->id, -1);
808 767
809 if (pixbuf) 768 if (pixbuf)
810 g_object_unref(pixbuf); 769 g_object_unref(pixbuf);
811 770
812 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id)) 771 if (default_proto_id != NULL && !strcmp(plugin->info->id, default_proto_id))
813 aop_menu->default_item = i; 772 aop_menu->default_item = i;
814 } 773 }
815
816 g_object_unref(sg);
817
818 return aop_menu; 774 return aop_menu;
819 } 775 }
820 776
821 GtkWidget * 777 GtkWidget *
822 pidgin_protocol_option_menu_new(const char *id, GCallback cb, 778 pidgin_protocol_option_menu_new(const char *id, GCallback cb,
826 } 782 }
827 783
828 const char * 784 const char *
829 pidgin_protocol_option_menu_get_selected(GtkWidget *optmenu) 785 pidgin_protocol_option_menu_get_selected(GtkWidget *optmenu)
830 { 786 {
831 return (const char *)aop_option_menu_get_selected(optmenu, NULL); 787 return (const char *)aop_option_menu_get_selected(optmenu);
832 } 788 }
833 789
834 PurpleAccount * 790 PurpleAccount *
835 pidgin_account_option_menu_get_selected(GtkWidget *optmenu) 791 pidgin_account_option_menu_get_selected(GtkWidget *optmenu)
836 { 792 {
837 return (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); 793 return (PurpleAccount *)aop_option_menu_get_selected(optmenu);
838 } 794 }
839 795
840 static AopMenu * 796 static AopMenu *
841 create_account_menu(PurpleAccount *default_account, 797 create_account_menu(PurpleAccount *default_account,
842 PurpleFilterAccountFunc filter_func, gboolean show_all) 798 PurpleFilterAccountFunc filter_func, gboolean show_all)
844 AopMenu *aop_menu = NULL; 800 AopMenu *aop_menu = NULL;
845 PurpleAccount *account; 801 PurpleAccount *account;
846 GdkPixbuf *pixbuf = NULL; 802 GdkPixbuf *pixbuf = NULL;
847 GList *list; 803 GList *list;
848 GList *p; 804 GList *p;
849 GtkSizeGroup *sg; 805 GtkListStore *ls;
806 GtkTreeIter iter;
850 int i; 807 int i;
851 char buf[256]; 808 char buf[256];
852 809
853 if (show_all) 810 if (show_all)
854 list = purple_accounts_get_all(); 811 list = purple_accounts_get_all();
855 else 812 else
856 list = purple_connections_get_all(); 813 list = purple_connections_get_all();
857 814
815 ls = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
816
858 aop_menu = g_malloc0(sizeof(AopMenu)); 817 aop_menu = g_malloc0(sizeof(AopMenu));
859 aop_menu->default_item = -1; 818 aop_menu->default_item = -1;
860 aop_menu->menu = gtk_menu_new(); 819 aop_menu->model = GTK_TREE_MODEL(ls);
861 gtk_widget_show(aop_menu->menu);
862 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
863 820
864 for (p = list, i = 0; p != NULL; p = p->next, i++) { 821 for (p = list, i = 0; p != NULL; p = p->next, i++) {
865 if (show_all) 822 if (show_all)
866 account = (PurpleAccount *)p->data; 823 account = (PurpleAccount *)p->data;
867 else { 824 else {
892 g_snprintf(buf, sizeof(buf), "%s (%s)", 849 g_snprintf(buf, sizeof(buf), "%s (%s)",
893 purple_account_get_username(account), 850 purple_account_get_username(account),
894 purple_account_get_protocol_name(account)); 851 purple_account_get_protocol_name(account));
895 } 852 }
896 853
897 gtk_menu_shell_append(GTK_MENU_SHELL(aop_menu->menu), 854 gtk_list_store_append(ls, &iter);
898 aop_menu_item_new(sg, pixbuf, buf, account, "account")); 855 gtk_list_store_set(ls, &iter, 0, pixbuf, 1, buf, 2, account, -1);
899 856
900 if (pixbuf) 857 if (pixbuf)
901 g_object_unref(pixbuf); 858 g_object_unref(pixbuf);
902 859
903 if (default_account && account == default_account) 860 if (default_account && account == default_account)
904 aop_menu->default_item = i; 861 aop_menu->default_item = i;
905 } 862 }
906
907 g_object_unref(sg);
908
909 return aop_menu; 863 return aop_menu;
910 } 864 }
911 865
912 static void 866 static void
913 regenerate_account_menu(GtkWidget *optmenu) 867 regenerate_account_menu(GtkWidget *optmenu)
914 { 868 {
915 gboolean show_all; 869 gboolean show_all;
916 PurpleAccount *account; 870 PurpleAccount *account;
917 PurpleFilterAccountFunc filter_func; 871 PurpleFilterAccountFunc filter_func;
918 872
919 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu, NULL); 873 account = (PurpleAccount *)aop_option_menu_get_selected(optmenu);
920 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all")); 874 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), "show_all"));
921 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func"); 875 filter_func = g_object_get_data(G_OBJECT(optmenu), "filter_func");
922 876
923 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all)); 877 aop_option_menu_replace_menu(optmenu, create_account_menu(account, filter_func, show_all));
924 } 878 }
3040 time_t value; 2994 time_t value;
3041 2995
3042 windows = g_list_delete_link(windows, windows); 2996 windows = g_list_delete_link(windows, windows);
3043 2997
3044 if (window == widget || 2998 if (window == widget ||
3045 !GTK_WIDGET_VISIBLE(window)) 2999 !gtk_widget_get_visible(window))
3046 continue; 3000 continue;
3047 3001
3048 if (!gdk_property_get(window->window, _WindowTime, _Cardinal, 0, sizeof(time_t), FALSE, 3002 if (!gdk_property_get(window->window, _WindowTime, _Cardinal, 0, sizeof(time_t), FALSE,
3049 NULL, NULL, &al, &data)) 3003 NULL, NULL, &al, &data))
3050 continue; 3004 continue;
3094 while (windows) { 3048 while (windows) {
3095 GtkWidget *window = windows->data; 3049 GtkWidget *window = windows->data;
3096 windows = g_list_delete_link(windows, windows); 3050 windows = g_list_delete_link(windows, windows);
3097 3051
3098 if (window == widget || 3052 if (window == widget ||
3099 !GTK_WIDGET_VISIBLE(window)) { 3053 !gtk_widget_get_visible(window)) {
3100 continue; 3054 continue;
3101 } 3055 }
3102 3056
3103 if (gtk_window_has_toplevel_focus(GTK_WINDOW(window)) || 3057 if (gtk_window_has_toplevel_focus(GTK_WINDOW(window)) ||
3104 (menu && menu == window->window)) { 3058 (menu && menu == window->window)) {
3735 gtk_imhtml_class_register_protocol("https://", NULL, NULL); 3689 gtk_imhtml_class_register_protocol("https://", NULL, NULL);
3736 gtk_imhtml_class_register_protocol("ftp://", NULL, NULL); 3690 gtk_imhtml_class_register_protocol("ftp://", NULL, NULL);
3737 gtk_imhtml_class_register_protocol("mailto:", NULL, NULL); 3691 gtk_imhtml_class_register_protocol("mailto:", NULL, NULL);
3738 gtk_imhtml_class_register_protocol("gopher://", NULL, NULL); 3692 gtk_imhtml_class_register_protocol("gopher://", NULL, NULL);
3739 } 3693 }
3740