pidgin/plugins/disco/gtkdisco.c

changeset 27316
4bcca82b93c1
parent 27315
898c56e61aa1
parent 27311
513d105025ed
child 27317
8f895622e176
equal deleted inserted replaced
27315:898c56e61aa1 27316:4bcca82b93c1
34 #include "gtkdisco.h" 34 #include "gtkdisco.h"
35 #include "xmppdisco.h" 35 #include "xmppdisco.h"
36 36
37 GList *dialogs = NULL; 37 GList *dialogs = NULL;
38 38
39 struct _menu_cb_info {
40 PidginDiscoList *list;
41 XmppDiscoService *service;
42 };
43
44 enum { 39 enum {
45 PIXBUF_COLUMN = 0, 40 PIXBUF_COLUMN = 0,
46 NAME_COLUMN, 41 NAME_COLUMN,
47 DESCRIPTION_COLUMN, 42 DESCRIPTION_COLUMN,
48 SERVICE_COLUMN, 43 SERVICE_COLUMN,
122 gtk_widget_set_sensitive(dialog->browse_button, account != NULL); 117 gtk_widget_set_sensitive(dialog->browse_button, account != NULL);
123 } 118 }
124 119
125 static void register_button_cb(GtkButton *button, PidginDiscoDialog *dialog) 120 static void register_button_cb(GtkButton *button, PidginDiscoDialog *dialog)
126 { 121 {
127 struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "disco-info"); 122 XmppDiscoService *service = g_object_get_data(G_OBJECT(button), "service");
128 123 xmpp_disco_service_register(service);
129 xmpp_disco_service_register(info->service);
130 } 124 }
131 125
132 static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server) 126 static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server)
133 { 127 {
134 pidgin_disco_list_set_in_progress(pdl, FALSE); 128 pidgin_disco_list_set_in_progress(pdl, FALSE);
211 purple_connection_get_account(pc), NULL, NULL, pdl); 205 purple_connection_get_account(pc), NULL, NULL, pdl);
212 206
213 g_free(server); 207 g_free(server);
214 } 208 }
215 209
216 static void add_room_to_blist_cb(GtkButton *button, PidginDiscoDialog *dialog) 210 static void add_to_blist_cb(GtkButton *button, PidginDiscoDialog *dialog)
217 { 211 {
218 struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "disco-info"); 212 XmppDiscoService *service = g_object_get_data(G_OBJECT(button), "service");
219 PurpleAccount *account; 213 PurpleAccount *account;
220 const char *jid; 214 const char *jid;
221 215
222 g_return_if_fail(info != NULL); 216 g_return_if_fail(service != NULL);
223 217
224 account = purple_connection_get_account(info->list->pc); 218 account = purple_connection_get_account(service->list->pc);
225 jid = info->service->jid; 219 jid = service->jid;
226 220
227 if (info->service->type == XMPP_DISCO_SERVICE_TYPE_CHAT) 221 if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT)
228 purple_blist_request_add_chat(account, NULL, NULL, jid); 222 purple_blist_request_add_chat(account, NULL, NULL, jid);
229 else 223 else
230 purple_blist_request_add_buddy(account, jid, NULL, NULL); 224 purple_blist_request_add_buddy(account, jid, NULL, NULL);
231 } 225 }
232 226
234 selection_changed_cb(GtkTreeSelection *selection, PidginDiscoList *pdl) 228 selection_changed_cb(GtkTreeSelection *selection, PidginDiscoList *pdl)
235 { 229 {
236 XmppDiscoService *service; 230 XmppDiscoService *service;
237 GtkTreeIter iter; 231 GtkTreeIter iter;
238 GValue val; 232 GValue val;
239 static struct _menu_cb_info *info;
240 PidginDiscoDialog *dialog = pdl->dialog; 233 PidginDiscoDialog *dialog = pdl->dialog;
241 234
242 if (gtk_tree_selection_get_selected(selection, NULL, &iter)) { 235 if (gtk_tree_selection_get_selected(selection, NULL, &iter)) {
243 val.g_type = 0; 236 val.g_type = 0;
244 gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN, &val); 237 gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN, &val);
247 gtk_widget_set_sensitive(dialog->add_button, FALSE); 240 gtk_widget_set_sensitive(dialog->add_button, FALSE);
248 gtk_widget_set_sensitive(dialog->register_button, FALSE); 241 gtk_widget_set_sensitive(dialog->register_button, FALSE);
249 return; 242 return;
250 } 243 }
251 244
252 info = g_new0(struct _menu_cb_info, 1); 245 g_object_set_data(G_OBJECT(dialog->add_button), "service", service);
253 info->list = dialog->discolist; 246 g_object_set_data(G_OBJECT(dialog->register_button), "service", service);
254 info->service = service;
255
256 g_object_set_data_full(G_OBJECT(dialog->add_button), "disco-info",
257 info, g_free);
258 g_object_set_data(G_OBJECT(dialog->register_button), "disco-info", info);
259 247
260 gtk_widget_set_sensitive(dialog->add_button, service->flags & XMPP_DISCO_ADD); 248 gtk_widget_set_sensitive(dialog->add_button, service->flags & XMPP_DISCO_ADD);
261 gtk_widget_set_sensitive(dialog->register_button, service->flags & XMPP_DISCO_REGISTER); 249 gtk_widget_set_sensitive(dialog->register_button, service->flags & XMPP_DISCO_REGISTER);
262 } else { 250 } else {
263 gtk_widget_set_sensitive(dialog->add_button, FALSE); 251 gtk_widget_set_sensitive(dialog->add_button, FALSE);
613 dialog->add_button = 601 dialog->add_button =
614 pidgin_pixbuf_button_from_stock(_("_Add"), GTK_STOCK_ADD, 602 pidgin_pixbuf_button_from_stock(_("_Add"), GTK_STOCK_ADD,
615 PIDGIN_BUTTON_HORIZONTAL); 603 PIDGIN_BUTTON_HORIZONTAL);
616 gtk_box_pack_start(GTK_BOX(bbox), dialog->add_button, FALSE, FALSE, 0); 604 gtk_box_pack_start(GTK_BOX(bbox), dialog->add_button, FALSE, FALSE, 0);
617 g_signal_connect(G_OBJECT(dialog->add_button), "clicked", 605 g_signal_connect(G_OBJECT(dialog->add_button), "clicked",
618 G_CALLBACK(add_room_to_blist_cb), dialog); 606 G_CALLBACK(add_to_blist_cb), dialog);
619 gtk_widget_set_sensitive(dialog->add_button, FALSE); 607 gtk_widget_set_sensitive(dialog->add_button, FALSE);
620 gtk_widget_show(dialog->add_button); 608 gtk_widget_show(dialog->add_button);
621 609
622 /* close button */ 610 /* close button */
623 dialog->close_button = 611 dialog->close_button =

mercurial