pidgin/gtkblist.c

changeset 27115
c9b55e795bf3
parent 26871
d62964222795
child 27196
e5e4a0f2eaa9
child 27215
e26cd0c884ed
equal deleted inserted replaced
27114:63f35ec28622 27115:c9b55e795bf3
73 #define HEADLINE_CLOSE_SIZE 11 73 #define HEADLINE_CLOSE_SIZE 11
74 74
75 typedef struct 75 typedef struct
76 { 76 {
77 PurpleAccount *account; 77 PurpleAccount *account;
78
79 GtkWidget *window; 78 GtkWidget *window;
79 GtkBox *vbox;
80 GtkWidget *account_menu;
81 GtkSizeGroup *sg;
82 } PidginBlistRequestData;
83
84 typedef struct
85 {
86 PidginBlistRequestData rq_data;
80 GtkWidget *combo; 87 GtkWidget *combo;
81 GtkWidget *entry; 88 GtkWidget *entry;
82 GtkWidget *entry_for_alias; 89 GtkWidget *entry_for_alias;
83 GtkWidget *account_box;
84 90
85 } PidginAddBuddyData; 91 } PidginAddBuddyData;
86 92
87 typedef struct 93 typedef struct
88 { 94 {
89 PurpleAccount *account; 95 PidginBlistRequestData rq_data;
90 gchar *default_chat_name; 96 gchar *default_chat_name;
91 97 GList *entries;
92 GtkWidget *window; 98 } PidginChatData;
93 GtkWidget *account_menu; 99
100 typedef struct
101 {
102 PidginChatData chat_data;
103
94 GtkWidget *alias_entry; 104 GtkWidget *alias_entry;
95 GtkWidget *group_combo; 105 GtkWidget *group_combo;
96 GtkWidget *entries_box;
97 GtkSizeGroup *sg;
98 GtkWidget *autojoin; 106 GtkWidget *autojoin;
99 GtkWidget *persistent; 107 GtkWidget *persistent;
100
101 GList *entries;
102
103 } PidginAddChatData; 108 } PidginAddChatData;
104
105 typedef struct
106 {
107 PurpleAccount *account;
108
109 GtkWidget *window;
110 GtkWidget *account_menu;
111 GtkWidget *entries_box;
112 GtkSizeGroup *sg;
113
114 GList *entries;
115 } PidginJoinChatData;
116 109
117 typedef struct 110 typedef struct
118 { 111 {
119 /** Used to hold error minidialogs. Gets packed 112 /** Used to hold error minidialogs. Gets packed
120 * inside PidginBuddyList.error_buttons 113 * inside PidginBuddyList.error_buttons
866 { 859 {
867 purple_notify_uri(NULL, PURPLE_WEBSITE "documentation"); 860 purple_notify_uri(NULL, PURPLE_WEBSITE "documentation");
868 } 861 }
869 862
870 static void 863 static void
871 do_join_chat(PidginJoinChatData *data) 864 do_join_chat(PidginChatData *data)
872 { 865 {
873 if (data) 866 if (data)
874 { 867 {
875 GHashTable *components = 868 GHashTable *components =
876 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); 869 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
892 g_strdup(g_object_get_data(tmp->data, "identifier")), 885 g_strdup(g_object_get_data(tmp->data, "identifier")),
893 g_strdup(gtk_entry_get_text(tmp->data))); 886 g_strdup(gtk_entry_get_text(tmp->data)));
894 } 887 }
895 } 888 }
896 889
897 chat = purple_chat_new(data->account, NULL, components); 890 chat = purple_chat_new(data->rq_data.account, NULL, components);
898 gtk_blist_join_chat(chat); 891 gtk_blist_join_chat(chat);
899 purple_blist_remove_chat(chat); 892 purple_blist_remove_chat(chat);
900 } 893 }
901 } 894 }
902 895
903 static void 896 static void
904 do_joinchat(GtkWidget *dialog, int id, PidginJoinChatData *info) 897 do_joinchat(GtkWidget *dialog, int id, PidginChatData *info)
905 { 898 {
906 switch(id) 899 switch(id)
907 { 900 {
908 case GTK_RESPONSE_OK: 901 case GTK_RESPONSE_OK:
909 do_join_chat(info); 902 do_join_chat(info);
910 break; 903 break;
911 904
912 case 1: 905 case 1:
913 pidgin_roomlist_dialog_show_with_account(info->account); 906 pidgin_roomlist_dialog_show_with_account(info->rq_data.account);
914 return; 907 return;
915 908
916 break; 909 break;
917 } 910 }
918 911
924 /* 917 /*
925 * Check the values of all the text entry boxes. If any required input 918 * Check the values of all the text entry boxes. If any required input
926 * strings are empty then don't allow the user to click on "OK." 919 * strings are empty then don't allow the user to click on "OK."
927 */ 920 */
928 static void 921 static void
929 joinchat_set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data) 922 set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data)
930 { 923 {
931 PurplePluginProtocolInfo *prpl_info; 924 PurplePluginProtocolInfo *prpl_info;
932 PurpleConnection *gc; 925 PurpleConnection *gc;
933 PidginJoinChatData *data; 926 PidginChatData *data;
934 GList *tmp; 927 GList *tmp;
935 const char *text; 928 const char *text;
936 gboolean required; 929 gboolean required;
937 gboolean sensitive = TRUE; 930 gboolean sensitive = TRUE;
938 931
947 if (required && (*text == '\0')) 940 if (required && (*text == '\0'))
948 sensitive = FALSE; 941 sensitive = FALSE;
949 } 942 }
950 } 943 }
951 944
952 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_OK, sensitive); 945 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window), GTK_RESPONSE_OK, sensitive);
953 946
954 gc = purple_account_get_connection(data->account); 947 gc = purple_account_get_connection(data->rq_data.account);
955 prpl_info = (gc != NULL) ? PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl) : NULL; 948 prpl_info = (gc != NULL) ? PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl) : NULL;
956 sensitive = (prpl_info != NULL && prpl_info->roomlist_get_list != NULL); 949 sensitive = (prpl_info != NULL && prpl_info->roomlist_get_list != NULL);
957 950
958 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), 1, sensitive); 951 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window), 1, sensitive);
959 } 952 }
960 953
961 static void 954 static void
962 pidgin_blist_update_privacy_cb(PurpleBuddy *buddy) 955 pidgin_blist_update_privacy_cb(PurpleBuddy *buddy)
963 { 956 {
965 if (ui_data == NULL || ui_data->row == NULL) 958 if (ui_data == NULL || ui_data->row == NULL)
966 return; 959 return;
967 pidgin_blist_update_buddy(purple_get_blist(), PURPLE_BLIST_NODE(buddy), TRUE); 960 pidgin_blist_update_buddy(purple_get_blist(), PURPLE_BLIST_NODE(buddy), TRUE);
968 } 961 }
969 962
963 static gboolean
964 chat_account_filter_func(PurpleAccount *account)
965 {
966 PurpleConnection *gc = purple_account_get_connection(account);
967 PurplePluginProtocolInfo *prpl_info = NULL;
968
969 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
970
971 return (prpl_info->chat_info != NULL);
972 }
973
974 gboolean
975 pidgin_blist_joinchat_is_showable()
976 {
977 GList *c;
978 PurpleConnection *gc;
979
980 for (c = purple_connections_get_all(); c != NULL; c = c->next) {
981 gc = c->data;
982
983 if (chat_account_filter_func(purple_connection_get_account(gc)))
984 return TRUE;
985 }
986
987 return FALSE;
988 }
989
990 static GtkWidget *
991 make_blist_request_dialog(PidginBlistRequestData *data, PurpleAccount *account,
992 const char *title, const char *window_role, const char *label_text,
993 GCallback callback_func, PurpleFilterAccountFunc filter_func,
994 GCallback response_cb)
995 {
996 GtkWidget *label;
997 GtkWidget *img;
998 GtkWidget *hbox;
999 GtkWidget *vbox;
1000 GtkWindow *blist_window;
1001 PidginBuddyList *gtkblist;
1002
1003 data->account = account;
1004
1005 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION,
1006 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
1007
1008 gtkblist = PIDGIN_BLIST(purple_get_blist());
1009 blist_window = gtkblist ? GTK_WINDOW(gtkblist->window) : NULL;
1010
1011 data->window = gtk_dialog_new_with_buttons(title,
1012 blist_window, GTK_DIALOG_NO_SEPARATOR,
1013 NULL);
1014
1015 gtk_window_set_transient_for(GTK_WINDOW(data->window), blist_window);
1016 gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK);
1017 gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE);
1018 gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE);
1019 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER);
1020 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE);
1021 gtk_window_set_role(GTK_WINDOW(data->window), window_role);
1022
1023 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
1024 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox);
1025 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
1026 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
1027
1028 vbox = gtk_vbox_new(FALSE, 5);
1029 gtk_container_add(GTK_CONTAINER(hbox), vbox);
1030
1031 label = gtk_label_new(label_text);
1032
1033 gtk_widget_set_size_request(label, 400, -1);
1034 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
1035 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
1036 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
1037
1038 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
1039
1040 data->account_menu = pidgin_account_option_menu_new(account, FALSE,
1041 callback_func, filter_func, data);
1042 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_ccount"), data->sg, data->account_menu, TRUE, NULL);
1043
1044 data->vbox = GTK_BOX(gtk_vbox_new(FALSE, 5));
1045 gtk_container_set_border_width(GTK_CONTAINER(data->vbox), 0);
1046 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(data->vbox), FALSE, FALSE, 0);
1047
1048 g_signal_connect(G_OBJECT(data->window), "response", response_cb, data);
1049
1050 g_object_unref(data->sg);
1051
1052 return vbox;
1053 }
1054
970 static void 1055 static void
971 rebuild_joinchat_entries(PidginJoinChatData *data) 1056 rebuild_chat_entries(PidginChatData *data, const char *default_chat_name)
972 { 1057 {
973 PurpleConnection *gc; 1058 PurpleConnection *gc;
974 GList *list = NULL, *tmp; 1059 GList *list = NULL, *tmp;
975 GHashTable *defaults = NULL; 1060 GHashTable *defaults = NULL;
976 struct proto_chat_entry *pce; 1061 struct proto_chat_entry *pce;
977 gboolean focus = TRUE; 1062 gboolean focus = TRUE;
978 1063
979 g_return_if_fail(data->account != NULL); 1064 g_return_if_fail(data->rq_data.account != NULL);
980 1065
981 gc = purple_account_get_connection(data->account); 1066 gc = purple_account_get_connection(data->rq_data.account);
982 1067
983 gtk_container_foreach(GTK_CONTAINER(data->entries_box), (GtkCallback)gtk_widget_destroy, NULL); 1068 gtk_container_foreach(GTK_CONTAINER(data->rq_data.vbox), (GtkCallback)gtk_widget_destroy, NULL);
984 1069
985 g_list_free(data->entries); 1070 g_list_free(data->entries);
986 data->entries = NULL; 1071 data->entries = NULL;
987 1072
988 if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL) 1073 if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL)
989 list = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc); 1074 list = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc);
990 1075
991 if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) 1076 if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL)
992 defaults = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, NULL); 1077 defaults = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, default_chat_name);
993 1078
994 for (tmp = list; tmp; tmp = tmp->next) 1079 for (tmp = list; tmp; tmp = tmp->next)
995 { 1080 {
996 GtkWidget *input; 1081 GtkWidget *input;
997 1082
1002 GtkObject *adjust; 1087 GtkObject *adjust;
1003 adjust = gtk_adjustment_new(pce->min, pce->min, pce->max, 1088 adjust = gtk_adjustment_new(pce->min, pce->min, pce->max,
1004 1, 10, 10); 1089 1, 10, 10);
1005 input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); 1090 input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0);
1006 gtk_widget_set_size_request(input, 50, -1); 1091 gtk_widget_set_size_request(input, 50, -1);
1007 pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL); 1092 pidgin_add_widget_to_vbox(GTK_BOX(data->rq_data.vbox), pce->label, data->rq_data.sg, input, FALSE, NULL);
1008 } 1093 }
1009 else 1094 else
1010 { 1095 {
1011 char *value; 1096 char *value;
1012 input = gtk_entry_new(); 1097 input = gtk_entry_new();
1020 #if !GTK_CHECK_VERSION(2,16,0) 1105 #if !GTK_CHECK_VERSION(2,16,0)
1021 if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*') 1106 if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*')
1022 gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR); 1107 gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR);
1023 #endif /* Less than GTK+ 2.16 */ 1108 #endif /* Less than GTK+ 2.16 */
1024 } 1109 }
1025 pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL); 1110 pidgin_add_widget_to_vbox(data->rq_data.vbox, pce->label, data->rq_data.sg, input, TRUE, NULL);
1026 g_signal_connect(G_OBJECT(input), "changed", 1111 g_signal_connect(G_OBJECT(input), "changed",
1027 G_CALLBACK(joinchat_set_sensitive_if_input_cb), data); 1112 G_CALLBACK(set_sensitive_if_input_cb), data);
1028 } 1113 }
1029 1114
1030 /* Do the following for any type of input widget */ 1115 /* Do the following for any type of input widget */
1031 if (focus) 1116 if (focus)
1032 { 1117 {
1043 1128
1044 g_list_free(list); 1129 g_list_free(list);
1045 g_hash_table_destroy(defaults); 1130 g_hash_table_destroy(defaults);
1046 1131
1047 /* Set whether the "OK" button should be clickable initially */ 1132 /* Set whether the "OK" button should be clickable initially */
1048 joinchat_set_sensitive_if_input_cb(NULL, data); 1133 set_sensitive_if_input_cb(NULL, data);
1049 1134
1050 gtk_widget_show_all(data->entries_box); 1135 gtk_widget_show_all(GTK_WIDGET(data->rq_data.vbox));
1051 } 1136 }
1052 1137
1053 static void 1138 static void
1054 joinchat_select_account_cb(GObject *w, PurpleAccount *account, 1139 chat_select_account_cb(GObject *w, PurpleAccount *account,
1055 PidginJoinChatData *data) 1140 PidginChatData *data)
1056 { 1141 {
1057 data->account = account; 1142 if (strcmp(purple_account_get_protocol_id(data->rq_data.account),
1058 rebuild_joinchat_entries(data); 1143 purple_account_get_protocol_id(account)) == 0)
1059 } 1144 {
1060 1145 data->rq_data.account = account;
1061 static gboolean 1146 }
1062 chat_account_filter_func(PurpleAccount *account) 1147 else
1063 { 1148 {
1064 PurpleConnection *gc = purple_account_get_connection(account); 1149 data->rq_data.account = account;
1065 PurplePluginProtocolInfo *prpl_info = NULL; 1150 rebuild_chat_entries(data, data->default_chat_name);
1066 1151 }
1067 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
1068
1069 return (prpl_info->chat_info != NULL);
1070 }
1071
1072 gboolean
1073 pidgin_blist_joinchat_is_showable()
1074 {
1075 GList *c;
1076 PurpleConnection *gc;
1077
1078 for (c = purple_connections_get_all(); c != NULL; c = c->next) {
1079 gc = c->data;
1080
1081 if (chat_account_filter_func(purple_connection_get_account(gc)))
1082 return TRUE;
1083 }
1084
1085 return FALSE;
1086 } 1152 }
1087 1153
1088 void 1154 void
1089 pidgin_blist_joinchat_show(void) 1155 pidgin_blist_joinchat_show(void)
1090 { 1156 {
1091 GtkWidget *hbox, *vbox; 1157 PidginChatData *data = NULL;
1092 GtkWidget *label; 1158
1093 PidginBuddyList *gtkblist; 1159 data = g_new0(PidginChatData, 1);
1094 GtkWidget *img = NULL; 1160
1095 PidginJoinChatData *data = NULL; 1161 make_blist_request_dialog((PidginBlistRequestData *)data, NULL,
1096 1162 _("Join a Chat"), "join_chat",
1097 gtkblist = purple_blist_get_ui_data(); 1163 _("Please enter the appropriate information about the chat "
1098 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, 1164 "you would like to join.\n"),
1099 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); 1165 G_CALLBACK(chat_select_account_cb),
1100 data = g_new0(PidginJoinChatData, 1); 1166 chat_account_filter_func, (GCallback)do_joinchat);
1101 1167 gtk_dialog_add_buttons(GTK_DIALOG(data->rq_data.window),
1102 data->window = gtk_dialog_new_with_buttons(_("Join a Chat"),
1103 NULL, GTK_DIALOG_NO_SEPARATOR,
1104 _("Room _List"), 1, 1168 _("Room _List"), 1,
1105 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 1169 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1106 PIDGIN_STOCK_CHAT, GTK_RESPONSE_OK, NULL); 1170 PIDGIN_STOCK_CHAT, GTK_RESPONSE_OK, NULL);
1107 gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); 1171 data->default_chat_name = NULL;
1108 gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE); 1172 data->rq_data.account = pidgin_account_option_menu_get_selected(data->rq_data.account_menu);
1109 gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); 1173
1110 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER); 1174 rebuild_chat_entries(data, NULL);
1111 gtk_container_set_border_width( 1175
1112 GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE); 1176 gtk_widget_show_all(data->rq_data.window);
1113 gtk_window_set_role(GTK_WINDOW(data->window), "join_chat");
1114
1115 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
1116 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox);
1117 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
1118 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
1119
1120 vbox = gtk_vbox_new(FALSE, 5);
1121 gtk_container_set_border_width(GTK_CONTAINER(vbox), 0);
1122 gtk_container_add(GTK_CONTAINER(hbox), vbox);
1123
1124 label = gtk_label_new(_("Please enter the appropriate information "
1125 "about the chat you would like to join.\n"));
1126 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
1127 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
1128 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
1129
1130 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
1131
1132 data->account_menu = pidgin_account_option_menu_new(NULL, FALSE,
1133 G_CALLBACK(joinchat_select_account_cb),
1134 chat_account_filter_func, data);
1135
1136 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL);
1137
1138 data->entries_box = gtk_vbox_new(FALSE, 5);
1139 gtk_container_add(GTK_CONTAINER(vbox), data->entries_box);
1140 gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0);
1141
1142 data->account = pidgin_account_option_menu_get_selected(data->account_menu);
1143
1144 rebuild_joinchat_entries(data);
1145
1146 g_signal_connect(G_OBJECT(data->window), "response",
1147 G_CALLBACK(do_joinchat), data);
1148
1149 g_object_unref(data->sg);
1150
1151 gtk_widget_show_all(data->window);
1152 } 1177 }
1153 1178
1154 static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) 1179 static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
1155 { 1180 {
1156 PurpleBlistNode *node; 1181 PurpleBlistNode *node;
6732 static void 6757 static void
6733 add_buddy_select_account_cb(GObject *w, PurpleAccount *account, 6758 add_buddy_select_account_cb(GObject *w, PurpleAccount *account,
6734 PidginAddBuddyData *data) 6759 PidginAddBuddyData *data)
6735 { 6760 {
6736 /* Save our account */ 6761 /* Save our account */
6737 data->account = account; 6762 data->rq_data.account = account;
6738 } 6763 }
6739 6764
6740 static void 6765 static void
6741 destroy_add_buddy_dialog_cb(GtkWidget *win, PidginAddBuddyData *data) 6766 destroy_add_buddy_dialog_cb(GtkWidget *win, PidginAddBuddyData *data)
6742 { 6767 {
6745 6770
6746 static void 6771 static void
6747 add_buddy_cb(GtkWidget *w, int resp, PidginAddBuddyData *data) 6772 add_buddy_cb(GtkWidget *w, int resp, PidginAddBuddyData *data)
6748 { 6773 {
6749 const char *grp, *who, *whoalias; 6774 const char *grp, *who, *whoalias;
6775 PurpleAccount *account;
6750 PurpleGroup *g; 6776 PurpleGroup *g;
6751 PurpleBuddy *b; 6777 PurpleBuddy *b;
6752 PurpleConversation *c; 6778 PurpleConversation *c;
6753 PurpleBuddyIcon *icon; 6779 PurpleBuddyIcon *icon;
6754 6780
6757 who = gtk_entry_get_text(GTK_ENTRY(data->entry)); 6783 who = gtk_entry_get_text(GTK_ENTRY(data->entry));
6758 grp = pidgin_text_combo_box_entry_get_text(data->combo); 6784 grp = pidgin_text_combo_box_entry_get_text(data->combo);
6759 whoalias = gtk_entry_get_text(GTK_ENTRY(data->entry_for_alias)); 6785 whoalias = gtk_entry_get_text(GTK_ENTRY(data->entry_for_alias));
6760 if (*whoalias == '\0') 6786 if (*whoalias == '\0')
6761 whoalias = NULL; 6787 whoalias = NULL;
6788
6789 account = data->rq_data.account;
6762 6790
6763 g = NULL; 6791 g = NULL;
6764 if ((grp != NULL) && (*grp != '\0')) 6792 if ((grp != NULL) && (*grp != '\0'))
6765 { 6793 {
6766 if ((g = purple_find_group(grp)) == NULL) 6794 if ((g = purple_find_group(grp)) == NULL)
6767 { 6795 {
6768 g = purple_group_new(grp); 6796 g = purple_group_new(grp);
6769 purple_blist_add_group(g, NULL); 6797 purple_blist_add_group(g, NULL);
6770 } 6798 }
6771 6799
6772 b = purple_find_buddy_in_group(data->account, who, g); 6800 b = purple_find_buddy_in_group(account, who, g);
6773 } 6801 }
6774 else if ((b = purple_find_buddy(data->account, who)) != NULL) 6802 else if ((b = purple_find_buddy(account, who)) != NULL)
6775 { 6803 {
6776 g = purple_buddy_get_group(b); 6804 g = purple_buddy_get_group(b);
6777 } 6805 }
6778 6806
6779 if (b == NULL) 6807 if (b == NULL)
6780 { 6808 {
6781 b = purple_buddy_new(data->account, who, whoalias); 6809 b = purple_buddy_new(account, who, whoalias);
6782 purple_blist_add_buddy(b, NULL, g, NULL); 6810 purple_blist_add_buddy(b, NULL, g, NULL);
6783 } 6811 }
6784 6812
6785 purple_account_add_buddy(data->account, b); 6813 purple_account_add_buddy(account, b);
6786 6814
6787 /* Offer to merge people with the same alias. */ 6815 /* Offer to merge people with the same alias. */
6788 if (whoalias != NULL && g != NULL) 6816 if (whoalias != NULL && g != NULL)
6789 gtk_blist_auto_personize((PurpleBlistNode *)g, whoalias); 6817 gtk_blist_auto_personize((PurpleBlistNode *)g, whoalias);
6790 6818
6801 * local list. We need a new, non-gtk file that calls both 6829 * local list. We need a new, non-gtk file that calls both
6802 * purple_account_add_buddy and purple_blist_add_buddy(). 6830 * purple_account_add_buddy and purple_blist_add_buddy().
6803 * Or something. --Mark 6831 * Or something. --Mark
6804 */ 6832 */
6805 6833
6806 c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, data->account); 6834 c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, data->rq_data.account);
6807 if (c != NULL) { 6835 if (c != NULL) {
6808 icon = purple_conv_im_get_icon(PURPLE_CONV_IM(c)); 6836 icon = purple_conv_im_get_icon(PURPLE_CONV_IM(c));
6809 if (icon != NULL) 6837 if (icon != NULL)
6810 purple_buddy_icon_update(icon); 6838 purple_buddy_icon_update(icon);
6811 } 6839 }
6812 } 6840 }
6813 6841
6814 gtk_widget_destroy(data->window); 6842 gtk_widget_destroy(data->rq_data.window);
6815 } 6843 }
6816 6844
6817 static void 6845 static void
6818 pidgin_blist_request_add_buddy(PurpleAccount *account, const char *username, 6846 pidgin_blist_request_add_buddy(PurpleAccount *account, const char *username,
6819 const char *group, const char *alias) 6847 const char *group, const char *alias)
6820 { 6848 {
6821 GtkWidget *table;
6822 GtkWidget *label;
6823 GtkWidget *hbox;
6824 GtkWidget *vbox;
6825 GtkWidget *img;
6826 PidginBuddyList *gtkblist;
6827 PidginAddBuddyData *data = g_new0(PidginAddBuddyData, 1); 6849 PidginAddBuddyData *data = g_new0(PidginAddBuddyData, 1);
6828 6850
6829 data->account = 6851 make_blist_request_dialog((PidginBlistRequestData *)data,
6830 (account != NULL 6852 (account != NULL
6831 ? account 6853 ? account : purple_connection_get_account(purple_connections_get_all()->data)),
6832 : purple_connection_get_account(purple_connections_get_all()->data)); 6854 _("Add Buddy"), "add_buddy",
6833 6855 _("Add a buddy.\n"),
6834 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, 6856 G_CALLBACK(add_buddy_select_account_cb), NULL,
6835 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); 6857 G_CALLBACK(add_buddy_cb));
6836 6858 gtk_dialog_add_buttons(GTK_DIALOG(data->rq_data.window),
6837 gtkblist = PIDGIN_BLIST(purple_get_blist());
6838
6839 data->window = gtk_dialog_new_with_buttons(_("Add Buddy"),
6840 gtkblist ? GTK_WINDOW(gtkblist->window) : NULL, GTK_DIALOG_NO_SEPARATOR,
6841 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 6859 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
6842 GTK_STOCK_ADD, GTK_RESPONSE_OK, 6860 GTK_STOCK_ADD, GTK_RESPONSE_OK,
6843 NULL); 6861 NULL);
6844 6862
6845 if (gtkblist) 6863 g_signal_connect(G_OBJECT(data->rq_data.window), "destroy",
6846 gtk_window_set_transient_for(GTK_WINDOW(data->window), GTK_WINDOW(gtkblist->window));
6847 gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK);
6848 gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE);
6849 gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE);
6850 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER);
6851 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE);
6852 gtk_window_set_role(GTK_WINDOW(data->window), "add_buddy");
6853 gtk_window_set_type_hint(GTK_WINDOW(data->window),
6854 GDK_WINDOW_TYPE_HINT_DIALOG);
6855
6856 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
6857 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox);
6858 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
6859 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
6860
6861 vbox = gtk_vbox_new(FALSE, 0);
6862 gtk_container_add(GTK_CONTAINER(hbox), vbox);
6863
6864 g_signal_connect(G_OBJECT(data->window), "destroy",
6865 G_CALLBACK(destroy_add_buddy_dialog_cb), data); 6864 G_CALLBACK(destroy_add_buddy_dialog_cb), data);
6866 6865
6867 label = gtk_label_new(_("Add a buddy.\n"));
6868 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
6869 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
6870
6871 table = gtk_table_new(4, 2, FALSE);
6872 gtk_table_set_row_spacings(GTK_TABLE(table), 5);
6873 gtk_table_set_col_spacings(GTK_TABLE(table), 5);
6874 gtk_container_set_border_width(GTK_CONTAINER(table), 0);
6875 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
6876
6877 data->account_box = pidgin_account_option_menu_new(account, FALSE,
6878 G_CALLBACK(add_buddy_select_account_cb), NULL, data);
6879
6880 gtk_table_attach_defaults(GTK_TABLE(table), data->account_box, 0, 2, 0, 1);
6881
6882 label = gtk_label_new_with_mnemonic(_("Buddy's _username:"));
6883 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
6884 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
6885
6886 data->entry = gtk_entry_new(); 6866 data->entry = gtk_entry_new();
6887 gtk_table_attach_defaults(GTK_TABLE(table), data->entry, 1, 2, 1, 2); 6867
6868 pidgin_add_widget_to_vbox(data->rq_data.vbox, _("Buddy's _username:"),
6869 data->rq_data.sg, data->entry, TRUE, NULL);
6888 gtk_widget_grab_focus(data->entry); 6870 gtk_widget_grab_focus(data->entry);
6889 6871
6890 if (username != NULL) 6872 if (username != NULL)
6891 gtk_entry_set_text(GTK_ENTRY(data->entry), username); 6873 gtk_entry_set_text(GTK_ENTRY(data->entry), username);
6892 else 6874 else
6893 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), 6875 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window),
6894 GTK_RESPONSE_OK, FALSE); 6876 GTK_RESPONSE_OK, FALSE);
6895 6877
6896 gtk_entry_set_activates_default (GTK_ENTRY(data->entry), TRUE); 6878 gtk_entry_set_activates_default (GTK_ENTRY(data->entry), TRUE);
6897 gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->entry);
6898 pidgin_set_accessible_label (data->entry, label);
6899 6879
6900 g_signal_connect(G_OBJECT(data->entry), "changed", 6880 g_signal_connect(G_OBJECT(data->entry), "changed",
6901 G_CALLBACK(pidgin_set_sensitive_if_input), 6881 G_CALLBACK(pidgin_set_sensitive_if_input),
6902 data->window); 6882 data->rq_data.window);
6903
6904 label = gtk_label_new_with_mnemonic(_("(Optional) A_lias:"));
6905 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
6906 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3);
6907 6883
6908 data->entry_for_alias = gtk_entry_new(); 6884 data->entry_for_alias = gtk_entry_new();
6909 gtk_table_attach_defaults(GTK_TABLE(table), 6885 pidgin_add_widget_to_vbox(data->rq_data.vbox, _("(Optional) A_lias:"),
6910 data->entry_for_alias, 1, 2, 2, 3); 6886 data->rq_data.sg, data->entry_for_alias, TRUE,
6887 NULL);
6911 6888
6912 if (alias != NULL) 6889 if (alias != NULL)
6913 gtk_entry_set_text(GTK_ENTRY(data->entry_for_alias), alias); 6890 gtk_entry_set_text(GTK_ENTRY(data->entry_for_alias), alias);
6914 6891
6915 if (username != NULL) 6892 if (username != NULL)
6916 gtk_widget_grab_focus(GTK_WIDGET(data->entry_for_alias)); 6893 gtk_widget_grab_focus(GTK_WIDGET(data->entry_for_alias));
6917 6894
6918 gtk_entry_set_activates_default (GTK_ENTRY(data->entry_for_alias), TRUE);
6919 gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->entry_for_alias);
6920 pidgin_set_accessible_label (data->entry_for_alias, label);
6921
6922 label = gtk_label_new_with_mnemonic(_("Add buddy to _group:"));
6923 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
6924 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4);
6925
6926 data->combo = pidgin_text_combo_box_entry_new(group, groups_tree()); 6895 data->combo = pidgin_text_combo_box_entry_new(group, groups_tree());
6927 gtk_table_attach_defaults(GTK_TABLE(table), data->combo, 1, 2, 3, 4); 6896 pidgin_add_widget_to_vbox(data->rq_data.vbox, _("Add buddy to _group:"),
6928 gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_BIN(data->combo)->child); 6897 data->rq_data.sg, data->combo, TRUE, NULL);
6929 pidgin_set_accessible_label (data->combo, label); 6898
6930 6899 gtk_widget_show_all(data->rq_data.window);
6931 g_signal_connect(G_OBJECT(data->window), "response",
6932 G_CALLBACK(add_buddy_cb), data);
6933
6934 gtk_widget_show_all(data->window);
6935 } 6900 }
6936 6901
6937 static void 6902 static void
6938 add_chat_cb(GtkWidget *w, PidginAddChatData *data) 6903 add_chat_cb(GtkWidget *w, PidginAddChatData *data)
6939 { 6904 {
6945 const char *value; 6910 const char *value;
6946 6911
6947 components = g_hash_table_new_full(g_str_hash, g_str_equal, 6912 components = g_hash_table_new_full(g_str_hash, g_str_equal,
6948 g_free, g_free); 6913 g_free, g_free);
6949 6914
6950 for (tmp = data->entries; tmp; tmp = tmp->next) 6915 for (tmp = data->chat_data.entries; tmp; tmp = tmp->next)
6951 { 6916 {
6952 if (g_object_get_data(tmp->data, "is_spin")) 6917 if (g_object_get_data(tmp->data, "is_spin"))
6953 { 6918 {
6954 g_hash_table_replace(components, 6919 g_hash_table_replace(components,
6955 g_strdup(g_object_get_data(tmp->data, "identifier")), 6920 g_strdup(g_object_get_data(tmp->data, "identifier")),
6964 g_strdup(g_object_get_data(tmp->data, "identifier")), 6929 g_strdup(g_object_get_data(tmp->data, "identifier")),
6965 g_strdup(value)); 6930 g_strdup(value));
6966 } 6931 }
6967 } 6932 }
6968 6933
6969 chat = purple_chat_new(data->account, 6934 chat = purple_chat_new(data->chat_data.rq_data.account,
6970 gtk_entry_get_text(GTK_ENTRY(data->alias_entry)), 6935 gtk_entry_get_text(GTK_ENTRY(data->alias_entry)),
6971 components); 6936 components);
6972 6937
6973 group_name = pidgin_text_combo_box_entry_get_text(data->group_combo); 6938 group_name = pidgin_text_combo_box_entry_get_text(data->group_combo);
6974 6939
6988 purple_blist_node_set_bool((PurpleBlistNode*)chat, "gtk-autojoin", TRUE); 6953 purple_blist_node_set_bool((PurpleBlistNode*)chat, "gtk-autojoin", TRUE);
6989 6954
6990 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->persistent))) 6955 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->persistent)))
6991 purple_blist_node_set_bool((PurpleBlistNode*)chat, "gtk-persistent", TRUE); 6956 purple_blist_node_set_bool((PurpleBlistNode*)chat, "gtk-persistent", TRUE);
6992 6957
6993 gtk_widget_destroy(data->window); 6958 gtk_widget_destroy(data->chat_data.rq_data.window);
6994 g_free(data->default_chat_name); 6959 g_free(data->chat_data.default_chat_name);
6995 g_list_free(data->entries); 6960 g_list_free(data->chat_data.entries);
6996 g_free(data); 6961 g_free(data);
6997 } 6962 }
6998 6963
6999 static void 6964 static void
7000 add_chat_resp_cb(GtkWidget *w, int resp, PidginAddChatData *data) 6965 add_chat_resp_cb(GtkWidget *w, int resp, PidginAddChatData *data)
7003 { 6968 {
7004 add_chat_cb(NULL, data); 6969 add_chat_cb(NULL, data);
7005 } 6970 }
7006 else if (resp == 1) 6971 else if (resp == 1)
7007 { 6972 {
7008 pidgin_roomlist_dialog_show_with_account(data->account); 6973 pidgin_roomlist_dialog_show_with_account(data->chat_data.rq_data.account);
7009 } 6974 }
7010 else 6975 else
7011 { 6976 {
7012 gtk_widget_destroy(data->window); 6977 gtk_widget_destroy(data->chat_data.rq_data.window);
7013 g_free(data->default_chat_name); 6978 g_free(data->chat_data.default_chat_name);
7014 g_list_free(data->entries); 6979 g_list_free(data->chat_data.entries);
7015 g_free(data); 6980 g_free(data);
7016 }
7017 }
7018
7019 /*
7020 * Check the values of all the text entry boxes. If any required input
7021 * strings are empty then don't allow the user to click on "OK."
7022 */
7023 static void
7024 addchat_set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data)
7025 {
7026 PurplePluginProtocolInfo *prpl_info;
7027 PurpleConnection *gc;
7028 PidginAddChatData *data;
7029 GList *tmp;
7030 const char *text;
7031 gboolean required;
7032 gboolean sensitive = TRUE;
7033
7034 data = user_data;
7035
7036 for (tmp = data->entries; tmp != NULL; tmp = tmp->next)
7037 {
7038 if (!g_object_get_data(tmp->data, "is_spin"))
7039 {
7040 required = GPOINTER_TO_INT(g_object_get_data(tmp->data, "required"));
7041 text = gtk_entry_get_text(tmp->data);
7042 if (required && (*text == '\0'))
7043 sensitive = FALSE;
7044 }
7045 }
7046
7047 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_OK, sensitive);
7048
7049 gc = purple_account_get_connection(data->account);
7050 prpl_info = (gc != NULL) ? PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl) : NULL;
7051 sensitive = (prpl_info != NULL && prpl_info->roomlist_get_list != NULL);
7052
7053 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), 1, sensitive);
7054 }
7055
7056 static void
7057 rebuild_addchat_entries(PidginAddChatData *data)
7058 {
7059 PurpleConnection *gc;
7060 GList *list = NULL, *tmp;
7061 GHashTable *defaults = NULL;
7062 struct proto_chat_entry *pce;
7063 gboolean focus = TRUE;
7064
7065 g_return_if_fail(data->account != NULL);
7066
7067 gc = purple_account_get_connection(data->account);
7068
7069 gtk_container_foreach(GTK_CONTAINER(data->entries_box), (GtkCallback)gtk_widget_destroy, NULL);
7070
7071 g_list_free(data->entries);
7072
7073 data->entries = NULL;
7074
7075 if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL)
7076 list = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc);
7077
7078 if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL)
7079 defaults = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, data->default_chat_name);
7080
7081 for (tmp = list; tmp; tmp = tmp->next)
7082 {
7083 GtkWidget *input;
7084
7085 pce = tmp->data;
7086
7087 if (pce->is_int)
7088 {
7089 GtkObject *adjust;
7090 adjust = gtk_adjustment_new(pce->min, pce->min, pce->max,
7091 1, 10, 10);
7092 input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0);
7093 gtk_widget_set_size_request(input, 50, -1);
7094 pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL);
7095 }
7096 else
7097 {
7098 char *value;
7099 input = gtk_entry_new();
7100 gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE);
7101 value = g_hash_table_lookup(defaults, pce->identifier);
7102 if (value != NULL)
7103 gtk_entry_set_text(GTK_ENTRY(input), value);
7104 if (pce->secret)
7105 {
7106 gtk_entry_set_visibility(GTK_ENTRY(input), FALSE);
7107 #if !GTK_CHECK_VERSION(2,16,0)
7108 if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*')
7109 gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR);
7110 #endif /* Less than GTK+ 2.16 */
7111 }
7112 pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL);
7113 g_signal_connect(G_OBJECT(input), "changed",
7114 G_CALLBACK(addchat_set_sensitive_if_input_cb), data);
7115 }
7116
7117 /* Do the following for any type of input widget */
7118 if (focus)
7119 {
7120 gtk_widget_grab_focus(input);
7121 focus = FALSE;
7122 }
7123 g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier);
7124 g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int));
7125 g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required));
7126 data->entries = g_list_append(data->entries, input);
7127
7128 g_free(pce);
7129 }
7130
7131 g_list_free(list);
7132 g_hash_table_destroy(defaults);
7133
7134 /* Set whether the "OK" button should be clickable initially */
7135 addchat_set_sensitive_if_input_cb(NULL, data);
7136
7137 gtk_widget_show_all(data->entries_box);
7138 }
7139
7140 static void
7141 addchat_select_account_cb(GObject *w, PurpleAccount *account,
7142 PidginAddChatData *data)
7143 {
7144 if (strcmp(purple_account_get_protocol_id(data->account),
7145 purple_account_get_protocol_id(account)) == 0)
7146 {
7147 data->account = account;
7148 }
7149 else
7150 {
7151 data->account = account;
7152 rebuild_addchat_entries(data);
7153 } 6981 }
7154 } 6982 }
7155 6983
7156 static void 6984 static void
7157 pidgin_blist_request_add_chat(PurpleAccount *account, PurpleGroup *group, 6985 pidgin_blist_request_add_chat(PurpleAccount *account, PurpleGroup *group,
7158 const char *alias, const char *name) 6986 const char *alias, const char *name)
7159 { 6987 {
7160 PidginAddChatData *data; 6988 PidginAddChatData *data;
7161 PidginBuddyList *gtkblist;
7162 GList *l; 6989 GList *l;
7163 PurpleConnection *gc; 6990 PurpleConnection *gc;
7164 GtkWidget *label; 6991 GtkBox *vbox;
7165 GtkWidget *hbox;
7166 GtkWidget *vbox;
7167 GtkWidget *img;
7168 6992
7169 if (account != NULL) { 6993 if (account != NULL) {
7170 gc = purple_account_get_connection(account); 6994 gc = purple_account_get_connection(account);
7171 6995
7172 if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat == NULL) { 6996 if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat == NULL) {
7191 return; 7015 return;
7192 } 7016 }
7193 } 7017 }
7194 7018
7195 data = g_new0(PidginAddChatData, 1); 7019 data = g_new0(PidginAddChatData, 1);
7196 data->account = account; 7020 vbox = GTK_BOX(make_blist_request_dialog((PidginBlistRequestData *)data, account,
7197 data->default_chat_name = g_strdup(name); 7021 _("Add Chat"), "add_chat",
7198 7022 _("Please enter an alias, and the appropriate information "
7199 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, 7023 "about the chat you would like to add to your buddy list.\n"),
7200 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); 7024 G_CALLBACK(chat_select_account_cb), chat_account_filter_func,
7201 7025 G_CALLBACK(add_chat_resp_cb)));
7202 gtkblist = PIDGIN_BLIST(purple_get_blist()); 7026 gtk_dialog_add_buttons(GTK_DIALOG(data->chat_data.rq_data.window),
7203 7027 _("Room List"), 1,
7204 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
7205
7206 data->window = gtk_dialog_new_with_buttons(_("Add Chat"),
7207 gtkblist ? GTK_WINDOW(gtkblist->window) : NULL, GTK_DIALOG_NO_SEPARATOR,
7208 _("Room _List"), 1,
7209 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 7028 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
7210 GTK_STOCK_ADD, GTK_RESPONSE_OK, 7029 GTK_STOCK_ADD, GTK_RESPONSE_OK,
7211 NULL); 7030 NULL);
7212 7031
7213 if (gtkblist) 7032 data->chat_data.default_chat_name = g_strdup(name);
7214 gtk_window_set_transient_for(GTK_WINDOW(data->window), GTK_WINDOW(gtkblist->window)); 7033
7215 gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); 7034 rebuild_chat_entries((PidginChatData *)data, name);
7216 gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE);
7217 gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE);
7218 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER);
7219 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE);
7220 gtk_window_set_role(GTK_WINDOW(data->window), "add_chat");
7221 gtk_window_set_type_hint(GTK_WINDOW(data->window),
7222 GDK_WINDOW_TYPE_HINT_DIALOG);
7223
7224 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
7225 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox);
7226 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
7227 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
7228
7229 vbox = gtk_vbox_new(FALSE, 5);
7230 gtk_container_add(GTK_CONTAINER(hbox), vbox);
7231
7232 label = gtk_label_new(
7233 _("Please enter an alias, and the appropriate information "
7234 "about the chat you would like to add to your buddy list.\n"));
7235 gtk_widget_set_size_request(label, 400, -1);
7236 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
7237 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
7238 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
7239
7240 data->account_menu = pidgin_account_option_menu_new(account, FALSE,
7241 G_CALLBACK(addchat_select_account_cb),
7242 chat_account_filter_func, data);
7243 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL);
7244
7245 data->entries_box = gtk_vbox_new(FALSE, 5);
7246 gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0);
7247 gtk_box_pack_start(GTK_BOX(vbox), data->entries_box, TRUE, TRUE, 0);
7248
7249 rebuild_addchat_entries(data);
7250 7035
7251 data->alias_entry = gtk_entry_new(); 7036 data->alias_entry = gtk_entry_new();
7252 if (alias != NULL) 7037 if (alias != NULL)
7253 gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias); 7038 gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias);
7254 gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE); 7039 gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE);
7255 7040
7256 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_lias:"), data->sg, data->alias_entry, TRUE, NULL); 7041 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_lias:"),
7042 data->chat_data.rq_data.sg, data->alias_entry,
7043 TRUE, NULL);
7257 if (name != NULL) 7044 if (name != NULL)
7258 gtk_widget_grab_focus(data->alias_entry); 7045 gtk_widget_grab_focus(data->alias_entry);
7259 7046
7260 data->group_combo = pidgin_text_combo_box_entry_new(group ? group->name : NULL, groups_tree()); 7047 data->group_combo = pidgin_text_combo_box_entry_new(group ? group->name : NULL, groups_tree());
7261 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Group:"), data->sg, data->group_combo, TRUE, NULL); 7048 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Group:"),
7049 data->chat_data.rq_data.sg, data->group_combo,
7050 TRUE, NULL);
7262 7051
7263 data->autojoin = gtk_check_button_new_with_mnemonic(_("Auto_join when account becomes online.")); 7052 data->autojoin = gtk_check_button_new_with_mnemonic(_("Auto_join when account becomes online."));
7264 data->persistent = gtk_check_button_new_with_mnemonic(_("_Remain in chat after window is closed.")); 7053 data->persistent = gtk_check_button_new_with_mnemonic(_("_Remain in chat after window is closed."));
7265 gtk_box_pack_start(GTK_BOX(vbox), data->autojoin, FALSE, FALSE, 0); 7054 gtk_box_pack_start(GTK_BOX(vbox), data->autojoin, FALSE, FALSE, 0);
7266 gtk_box_pack_start(GTK_BOX(vbox), data->persistent, FALSE, FALSE, 0); 7055 gtk_box_pack_start(GTK_BOX(vbox), data->persistent, FALSE, FALSE, 0);
7267 7056
7268 g_signal_connect(G_OBJECT(data->window), "response", 7057 gtk_widget_show_all(data->chat_data.rq_data.window);
7269 G_CALLBACK(add_chat_resp_cb), data);
7270
7271 gtk_widget_show_all(data->window);
7272 } 7058 }
7273 7059
7274 static void 7060 static void
7275 add_group_cb(PurpleConnection *gc, const char *group_name) 7061 add_group_cb(PurpleConnection *gc, const char *group_name)
7276 { 7062 {
8193 gtk_widget_show(menuitem); 7979 gtk_widget_show(menuitem);
8194 } 7980 }
8195 if (activeitem) 7981 if (activeitem)
8196 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(activeitem), TRUE); 7982 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(activeitem), TRUE);
8197 } 7983 }
8198

mercurial