Mercurial > pidgin
comparison src/gtkutils.c @ 6391:4b2d8d7d0118
[gaim-migrate @ 6896]
All account drop-down menus now auto-update when accounts are signed on or
off. Neat, huh?
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Wed, 06 Aug 2003 09:43:11 +0000 |
parents | 9dd4bb3cf1df |
children | bda4b264806a |
comparison
equal
deleted
inserted
replaced
6390:7788dd90cfe7 | 6391:4b2d8d7d0118 |
---|---|
741 if (cb != NULL) | 741 if (cb != NULL) |
742 ((void (*)(GtkWidget *, GaimAccount *, gpointer))cb)(item, account, | 742 ((void (*)(GtkWidget *, GaimAccount *, gpointer))cb)(item, account, |
743 user_data); | 743 user_data); |
744 } | 744 } |
745 | 745 |
746 GtkWidget * | 746 static void |
747 gaim_gtk_account_option_menu_new(GaimAccount *default_account, | 747 create_account_menu(GtkWidget *optmenu, GaimAccount *default_account, |
748 gboolean show_all, GCallback cb, | 748 gboolean show_all) |
749 gpointer user_data) | |
750 { | 749 { |
751 GaimAccount *account; | 750 GaimAccount *account; |
752 GList *list; | |
753 GtkWidget *hbox; | |
754 GtkWidget *label; | |
755 GtkWidget *optmenu; | |
756 GtkWidget *menu; | 751 GtkWidget *menu; |
757 GtkWidget *item; | 752 GtkWidget *item; |
758 GtkWidget *image; | 753 GtkWidget *image; |
754 GtkWidget *hbox; | |
755 GtkWidget *label; | |
759 GdkPixbuf *pixbuf; | 756 GdkPixbuf *pixbuf; |
760 GdkPixbuf *scale; | 757 GdkPixbuf *scale; |
758 GList *list; | |
761 GList *p; | 759 GList *p; |
762 GtkSizeGroup *sg; | 760 GtkSizeGroup *sg; |
763 char *filename; | 761 char *filename; |
764 const char *proto_name; | 762 const char *proto_name; |
765 char buf[256]; | 763 char buf[256]; |
766 int i, selected_index = -1; | 764 int i, selected_index = -1; |
767 | 765 |
768 optmenu = gtk_option_menu_new(); | |
769 gtk_widget_show(optmenu); | |
770 | |
771 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); | |
772 | |
773 menu = gtk_menu_new(); | |
774 gtk_widget_show(menu); | |
775 | |
776 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
777 | |
778 if (show_all) | 766 if (show_all) |
779 list = gaim_accounts_get_all(); | 767 list = gaim_accounts_get_all(); |
780 else | 768 else |
781 list = gaim_connections_get_all(); | 769 list = gaim_connections_get_all(); |
782 | 770 |
783 gaim_debug(GAIM_DEBUG_INFO, "gtkutils", "Populating menu\n"); | 771 menu = gtk_menu_new(); |
772 gtk_widget_show(menu); | |
773 | |
774 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
784 | 775 |
785 for (p = list, i = 0; p != NULL; p = p->next, i++) { | 776 for (p = list, i = 0; p != NULL; p = p->next, i++) { |
786 GaimPluginProtocolInfo *prpl_info = NULL; | 777 GaimPluginProtocolInfo *prpl_info = NULL; |
787 GaimPlugin *plugin; | 778 GaimPlugin *plugin; |
788 | 779 |
791 else { | 782 else { |
792 GaimConnection *gc = (GaimConnection *)p->data; | 783 GaimConnection *gc = (GaimConnection *)p->data; |
793 | 784 |
794 account = gaim_connection_get_account(gc); | 785 account = gaim_connection_get_account(gc); |
795 } | 786 } |
796 | |
797 gaim_debug(GAIM_DEBUG_INFO, "gtkutils", "Adding item.\n"); | |
798 | 787 |
799 plugin = gaim_find_prpl(gaim_account_get_protocol(account)); | 788 plugin = gaim_find_prpl(gaim_account_get_protocol(account)); |
800 | 789 |
801 if (plugin != NULL) | 790 if (plugin != NULL) |
802 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(plugin); | 791 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(plugin); |
857 | 846 |
858 if (default_account != NULL && account == default_account) | 847 if (default_account != NULL && account == default_account) |
859 selected_index = i; | 848 selected_index = i; |
860 } | 849 } |
861 | 850 |
862 gaim_debug(GAIM_DEBUG_INFO, "gtkutils", "Done populating menu\n"); | 851 g_object_unref(sg); |
863 | 852 |
864 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); | 853 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); |
865 | 854 |
855 /* Set the place we should be at. */ | |
866 if (selected_index != -1) | 856 if (selected_index != -1) |
867 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), selected_index); | 857 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), selected_index); |
868 | 858 } |
859 | |
860 static void | |
861 account_menu_sign_on_off_cb(GaimConnection *gc, GtkWidget *optmenu) | |
862 { | |
863 GtkWidget *menu; | |
864 GtkWidget *item; | |
865 gboolean show_all; | |
866 GaimAccount *account; | |
867 | |
868 menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); | |
869 item = gtk_menu_get_active(GTK_MENU(menu)); | |
870 account = g_object_get_data(G_OBJECT(item), "account"); | |
871 | |
872 show_all = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(optmenu), | |
873 "show_all")); | |
874 | |
875 gtk_option_menu_remove_menu(GTK_OPTION_MENU(optmenu)); | |
876 | |
877 create_account_menu(optmenu, account, show_all); | |
878 } | |
879 | |
880 static gboolean | |
881 account_menu_destroyed_cb(GtkWidget *optmenu, GdkEvent *event, | |
882 void *user_data) | |
883 { | |
884 gaim_signal_disconnect(optmenu, event_signon, account_menu_sign_on_off_cb); | |
885 gaim_signal_disconnect(optmenu, event_signoff, account_menu_sign_on_off_cb); | |
886 | |
887 return FALSE; | |
888 } | |
889 | |
890 GtkWidget * | |
891 gaim_gtk_account_option_menu_new(GaimAccount *default_account, | |
892 gboolean show_all, GCallback cb, | |
893 gpointer user_data) | |
894 { | |
895 GtkWidget *optmenu; | |
896 | |
897 /* Create the option menu */ | |
898 optmenu = gtk_option_menu_new(); | |
899 gtk_widget_show(optmenu); | |
900 | |
901 g_signal_connect(G_OBJECT(optmenu), "destroy", | |
902 G_CALLBACK(account_menu_destroyed_cb), NULL); | |
903 | |
904 /* Register the gaim sign on/off event callbacks. */ | |
905 gaim_signal_connect(optmenu, event_signon, | |
906 account_menu_sign_on_off_cb, optmenu); | |
907 gaim_signal_connect(optmenu, event_signoff, | |
908 account_menu_sign_on_off_cb, optmenu); | |
909 | |
910 /* Set some data. */ | |
911 g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); | |
912 g_object_set_data(G_OBJECT(optmenu), "show_all", GINT_TO_POINTER(show_all)); | |
913 | |
914 /* Create and set the actual menu. */ | |
915 create_account_menu(optmenu, default_account, show_all); | |
916 | |
917 /* And now the last callback. */ | |
869 g_signal_connect(G_OBJECT(optmenu), "changed", | 918 g_signal_connect(G_OBJECT(optmenu), "changed", |
870 G_CALLBACK(account_menu_cb), cb); | 919 G_CALLBACK(account_menu_cb), cb); |
871 | 920 |
872 g_object_unref(sg); | |
873 | |
874 return optmenu; | 921 return optmenu; |
875 } | 922 } |
876 | 923 |
877 gboolean gaim_gtk_check_if_dir(const char *path, GtkFileSelection *filesel) | 924 gboolean |
925 gaim_gtk_check_if_dir(const char *path, GtkFileSelection *filesel) | |
878 { | 926 { |
879 char *dirname; | 927 char *dirname; |
880 | 928 |
881 if (g_file_test(path, G_FILE_TEST_IS_DIR)) { | 929 if (g_file_test(path, G_FILE_TEST_IS_DIR)) { |
882 /* append a / if needed */ | 930 /* append a / if needed */ |