Mercurial > pidgin
comparison src/gtkblist.c @ 8940:b875f5d57b81
[gaim-migrate @ 9710]
Gray out the Join a Chat menu item when no online accounts support chats.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 16 May 2004 00:06:25 +0000 |
parents | 19885cb8a24c |
children | 6d7b403b11bb |
comparison
equal
deleted
inserted
replaced
8939:19885cb8a24c | 8940:b875f5d57b81 |
---|---|
645 g_hash_table_destroy(components); | 645 g_hash_table_destroy(components); |
646 } | 646 } |
647 } | 647 } |
648 | 648 |
649 static void | 649 static void |
650 do_joinchat(GtkWidget *dialog, int id, GaimGtkJoinChatData *info) | |
651 { | |
652 switch(id) | |
653 { | |
654 case GTK_RESPONSE_OK: | |
655 do_join_chat(info); | |
656 | |
657 break; | |
658 } | |
659 | |
660 gtk_widget_destroy(GTK_WIDGET(dialog)); | |
661 g_list_free(info->entries); | |
662 g_free(info); | |
663 } | |
664 | |
665 static void | |
650 rebuild_joinchat_entries(GaimGtkJoinChatData *data) | 666 rebuild_joinchat_entries(GaimGtkJoinChatData *data) |
651 { | 667 { |
652 GaimConnection *gc; | 668 GaimConnection *gc; |
653 GList *list, *tmp; | 669 GList *list, *tmp; |
654 struct proto_chat_entry *pce; | 670 struct proto_chat_entry *pce; |
732 | 748 |
733 gtk_widget_show_all(data->entries_box); | 749 gtk_widget_show_all(data->entries_box); |
734 } | 750 } |
735 | 751 |
736 static void | 752 static void |
737 join_chat_select_account_cb(GObject *w, GaimAccount *account, | 753 joinchat_select_account_cb(GObject *w, GaimAccount *account, |
738 GaimGtkJoinChatData *data) | 754 GaimGtkJoinChatData *data) |
739 { | 755 { |
740 if (gaim_account_get_protocol(data->account) == | 756 if (gaim_account_get_protocol(data->account) == |
741 gaim_account_get_protocol(account)) | 757 gaim_account_get_protocol(account)) |
742 { | 758 { |
748 rebuild_joinchat_entries(data); | 764 rebuild_joinchat_entries(data); |
749 } | 765 } |
750 } | 766 } |
751 | 767 |
752 static gboolean | 768 static gboolean |
753 join_chat_check_account_func(GaimAccount *account) | 769 joinchat_account_filter_func(GaimAccount *account) |
754 { | 770 { |
755 GaimConnection *gc = gaim_account_get_connection(account); | 771 GaimConnection *gc = gaim_account_get_connection(account); |
756 | 772 GaimPluginProtocolInfo *prpl_info = NULL; |
757 return (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL); | 773 |
758 } | 774 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
759 | 775 |
760 static void | 776 return (prpl_info->chat_info != NULL); |
761 do_joinchat(GtkWidget *dialog, int id, GaimGtkJoinChatData *info) | 777 } |
762 { | 778 |
763 switch(id) | 779 gboolean |
764 { | 780 gaim_gtk_blist_joinchat_is_showable() |
765 case GTK_RESPONSE_OK: | 781 { |
766 do_join_chat(info); | 782 GList *c; |
767 | 783 GaimConnection *gc; |
768 break; | 784 |
769 } | 785 for (c = gaim_connections_get_all(); c != NULL; c = c->next) { |
770 | 786 gc = c->data; |
771 gtk_widget_destroy(GTK_WIDGET(dialog)); | 787 |
772 g_list_free(info->entries); | 788 if (joinchat_account_filter_func(gaim_connection_get_account(gc))) |
773 g_free(info); | 789 return TRUE; |
790 } | |
791 | |
792 return FALSE; | |
774 } | 793 } |
775 | 794 |
776 void | 795 void |
777 gaim_gtk_blist_show_join_chat(void) | 796 gaim_gtk_blist_joinchat_show(void) |
778 { | 797 { |
779 GtkWidget *hbox, *vbox; | 798 GtkWidget *hbox, *vbox; |
780 GtkWidget *rowbox; | 799 GtkWidget *rowbox; |
781 GtkWidget *label; | 800 GtkWidget *label; |
782 GList *c; | |
783 GaimGtkBuddyList *gtkblist; | 801 GaimGtkBuddyList *gtkblist; |
784 GtkWidget *img = NULL; | 802 GtkWidget *img = NULL; |
785 GaimConnection *gc = NULL; | |
786 GaimGtkJoinChatData *data = NULL; | 803 GaimGtkJoinChatData *data = NULL; |
787 int numaccounts = 0; | |
788 | |
789 /* Count how many protocols support chat */ | |
790 for (c = gaim_connections_get_all(); c != NULL; c = c->next) | |
791 { | |
792 gc = c->data; | |
793 | |
794 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat) | |
795 numaccounts++; | |
796 } | |
797 | |
798 if (numaccounts <= 0) | |
799 { | |
800 gaim_notify_error(NULL, NULL, | |
801 _("You are not currently signed on with any " | |
802 "protocols that have the ability to chat."), | |
803 NULL); | |
804 | |
805 return; | |
806 } | |
807 | 804 |
808 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | 805 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); |
809 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, | 806 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, |
810 GTK_ICON_SIZE_DIALOG); | 807 GTK_ICON_SIZE_DIALOG); |
811 data = g_new0(GaimGtkJoinChatData, 1); | 808 data = g_new0(GaimGtkJoinChatData, 1); |
841 rowbox = gtk_hbox_new(FALSE, 12); | 838 rowbox = gtk_hbox_new(FALSE, 12); |
842 gtk_box_pack_start(GTK_BOX(vbox), rowbox, TRUE, TRUE, 0); | 839 gtk_box_pack_start(GTK_BOX(vbox), rowbox, TRUE, TRUE, 0); |
843 | 840 |
844 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | 841 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
845 | 842 |
846 if (numaccounts > 1) | 843 label = gtk_label_new_with_mnemonic(_("_Account:")); |
847 { | 844 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
848 label = gtk_label_new_with_mnemonic(_("_Account:")); | 845 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); |
849 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | 846 gtk_size_group_add_widget(data->sg, label); |
850 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | 847 |
851 gtk_size_group_add_widget(data->sg, label); | 848 data->account_menu = gaim_gtk_account_option_menu_new(NULL, FALSE, |
852 | 849 G_CALLBACK(joinchat_select_account_cb), |
853 data->account_menu = gaim_gtk_account_option_menu_new(NULL, FALSE, | 850 joinchat_account_filter_func, data); |
854 G_CALLBACK(join_chat_select_account_cb), | 851 gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); |
855 join_chat_check_account_func, data); | 852 gtk_label_set_mnemonic_widget(GTK_LABEL(label), |
856 gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); | 853 GTK_WIDGET(data->account_menu)); |
857 gtk_label_set_mnemonic_widget(GTK_LABEL(label), | 854 gaim_set_accessible_label (data->account_menu, label); |
858 GTK_WIDGET(data->account_menu)); | |
859 gaim_set_accessible_label (data->account_menu, label); | |
860 } | |
861 | 855 |
862 data->entries_box = gtk_vbox_new(FALSE, 5); | 856 data->entries_box = gtk_vbox_new(FALSE, 5); |
863 gtk_container_add(GTK_CONTAINER(vbox), data->entries_box); | 857 gtk_container_add(GTK_CONTAINER(vbox), data->entries_box); |
864 gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); | 858 gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); |
865 | 859 |
866 for (c = gaim_connections_get_all(); c != NULL; c = c->next) | 860 data->account = gaim_gtk_account_option_menu_get_selected(data->account_menu); |
867 { | 861 |
868 gc = c->data; | |
869 | |
870 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat) | |
871 break; | |
872 } | |
873 data->account = gaim_connection_get_account(gc); | |
874 rebuild_joinchat_entries(data); | 862 rebuild_joinchat_entries(data); |
875 | 863 |
876 g_signal_connect(G_OBJECT(data->window), "response", | 864 g_signal_connect(G_OBJECT(data->window), "response", |
877 G_CALLBACK(do_joinchat), data); | 865 G_CALLBACK(do_joinchat), data); |
878 | 866 |
894 if (GAIM_BLIST_NODE_IS_CHAT(node)) { | 882 if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
895 serv_join_chat(((GaimChat *)node)->account->gc, ((GaimChat *)node)->components); | 883 serv_join_chat(((GaimChat *)node)->account->gc, ((GaimChat *)node)->components); |
896 return; | 884 return; |
897 } | 885 } |
898 } | 886 } |
899 gaim_gtk_blist_show_join_chat(); | 887 gaim_gtk_blist_joinchat_show(); |
900 } | 888 } |
901 | 889 |
902 static void gtk_blist_button_away_cb(GtkWidget *w, gpointer data) | 890 static void gtk_blist_button_away_cb(GtkWidget *w, gpointer data) |
903 { | 891 { |
904 gtk_menu_popup(GTK_MENU(awaymenu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME); | 892 gtk_menu_popup(GTK_MENU(awaymenu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME); |
2309 static GtkItemFactoryEntry blist_menu[] = | 2297 static GtkItemFactoryEntry blist_menu[] = |
2310 { | 2298 { |
2311 /* Buddies menu */ | 2299 /* Buddies menu */ |
2312 { N_("/_Buddies"), NULL, NULL, 0, "<Branch>" }, | 2300 { N_("/_Buddies"), NULL, NULL, 0, "<Branch>" }, |
2313 { N_("/Buddies/New Instant _Message..."), "<CTL>M", show_im_dialog, 0, "<StockItem>", GAIM_STOCK_IM }, | 2301 { N_("/Buddies/New Instant _Message..."), "<CTL>M", show_im_dialog, 0, "<StockItem>", GAIM_STOCK_IM }, |
2314 { N_("/Buddies/Join a _Chat..."), "<CTL>C", gaim_gtk_blist_show_join_chat, 0, "<StockItem>", GAIM_STOCK_CHAT }, | 2302 { N_("/Buddies/Join a _Chat..."), "<CTL>C", gaim_gtk_blist_joinchat_show, 0, "<StockItem>", GAIM_STOCK_CHAT }, |
2315 { N_("/Buddies/Get User _Info..."), "<CTL>I", show_info_dialog, 0, "<StockItem>", GAIM_STOCK_INFO }, | 2303 { N_("/Buddies/Get User _Info..."), "<CTL>I", show_info_dialog, 0, "<StockItem>", GAIM_STOCK_INFO }, |
2316 { N_("/Buddies/View User _Log..."), "<CTL>L", show_log_dialog, 0, "<StockItem>" }, | 2304 { N_("/Buddies/View User _Log..."), "<CTL>L", show_log_dialog, 0, "<StockItem>" }, |
2317 { "/Buddies/sep1", NULL, NULL, 0, "<Separator>" }, | 2305 { "/Buddies/sep1", NULL, NULL, 0, "<Separator>" }, |
2318 { N_("/Buddies/Show _Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, "<CheckItem>"}, | 2306 { N_("/Buddies/Show _Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, "<CheckItem>"}, |
2319 { N_("/Buddies/Show _Empty Groups"), NULL, gaim_gtk_blist_show_empty_groups_cb, 1, "<CheckItem>"}, | 2307 { N_("/Buddies/Show _Empty Groups"), NULL, gaim_gtk_blist_show_empty_groups_cb, 1, "<CheckItem>"}, |
2887 GaimGtkBuddyList *gtkblist = GAIM_GTK_BLIST(blist); | 2875 GaimGtkBuddyList *gtkblist = GAIM_GTK_BLIST(blist); |
2888 GtkWidget *widget; | 2876 GtkWidget *widget; |
2889 | 2877 |
2890 gaim_gtk_blist_update_protocol_actions(); | 2878 gaim_gtk_blist_update_protocol_actions(); |
2891 gaim_gtkpounce_menu_build(gtkblist->bpmenu); | 2879 gaim_gtkpounce_menu_build(gtkblist->bpmenu); |
2880 | |
2881 /* Make menu items sensitive/insensitive where appropriate */ | |
2882 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Buddies/Join a Chat...")); | |
2883 gtk_widget_set_sensitive(widget, gaim_gtk_blist_joinchat_is_showable()); | |
2892 | 2884 |
2893 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Room List")); | 2885 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Room List")); |
2894 gtk_widget_set_sensitive(widget, gaim_gtk_roomlist_is_showable()); | 2886 gtk_widget_set_sensitive(widget, gaim_gtk_roomlist_is_showable()); |
2895 | 2887 |
2896 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Privacy")); | 2888 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Privacy")); |