| 115 { |
115 { |
| 116 dialog->account = account; |
116 dialog->account = account; |
| 117 gtk_widget_set_sensitive(dialog->browse_button, account != NULL); |
117 gtk_widget_set_sensitive(dialog->browse_button, account != NULL); |
| 118 } |
118 } |
| 119 |
119 |
| 120 static void register_button_cb(GtkButton *button, PidginDiscoDialog *dialog) |
120 static void register_button_cb(GtkWidget *unused, PidginDiscoDialog *dialog) |
| 121 { |
121 { |
| 122 xmpp_disco_service_register(dialog->selected); |
122 xmpp_disco_service_register(dialog->selected); |
| 123 } |
123 } |
| 124 |
124 |
| 125 static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server) |
125 static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server) |
| 144 pdl->server = g_strdup(server); |
144 pdl->server = g_strdup(server); |
| 145 pidgin_disco_list_set_in_progress(pdl, TRUE); |
145 pidgin_disco_list_set_in_progress(pdl, TRUE); |
| 146 xmpp_disco_start(pdl); |
146 xmpp_disco_start(pdl); |
| 147 } |
147 } |
| 148 |
148 |
| 149 static void browse_button_cb(GtkButton *button, PidginDiscoDialog *dialog) |
149 static void browse_button_cb(GtkWidget *button, PidginDiscoDialog *dialog) |
| 150 { |
150 { |
| 151 PurpleConnection *pc; |
151 PurpleConnection *pc; |
| 152 PidginDiscoList *pdl; |
152 PidginDiscoList *pdl; |
| 153 const char *username; |
153 const char *username; |
| 154 const char *at, *slash; |
154 const char *at, *slash; |
| 204 purple_connection_get_account(pc), NULL, NULL, pdl); |
204 purple_connection_get_account(pc), NULL, NULL, pdl); |
| 205 |
205 |
| 206 g_free(server); |
206 g_free(server); |
| 207 } |
207 } |
| 208 |
208 |
| 209 static void add_to_blist_cb(GtkButton *button, PidginDiscoDialog *dialog) |
209 static void add_to_blist_cb(GtkWidget *unused, PidginDiscoDialog *dialog) |
| 210 { |
210 { |
| 211 XmppDiscoService *service = dialog->selected; |
211 XmppDiscoService *service = dialog->selected; |
| 212 PurpleAccount *account; |
212 PurpleAccount *account; |
| 213 const char *jid; |
213 const char *jid; |
| 214 |
214 |
| 219 |
219 |
| 220 if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT) |
220 if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT) |
| 221 purple_blist_request_add_chat(account, NULL, NULL, jid); |
221 purple_blist_request_add_chat(account, NULL, NULL, jid); |
| 222 else |
222 else |
| 223 purple_blist_request_add_buddy(account, jid, NULL, NULL); |
223 purple_blist_request_add_buddy(account, jid, NULL, NULL); |
| |
224 } |
| |
225 |
| |
226 static gboolean |
| |
227 service_click_cb(GtkTreeView *tree, GdkEventButton *event, gpointer user_data) |
| |
228 { |
| |
229 PidginDiscoList *pdl; |
| |
230 XmppDiscoService *service; |
| |
231 GtkWidget *menu; |
| |
232 |
| |
233 GtkTreePath *path; |
| |
234 GtkTreeIter iter; |
| |
235 GValue val; |
| |
236 |
| |
237 if (event->button != 3 || event->type != GDK_BUTTON_PRESS) |
| |
238 return FALSE; |
| |
239 |
| |
240 pdl = user_data; |
| |
241 |
| |
242 /* Figure out what was clicked */ |
| |
243 if (!gtk_tree_view_get_path_at_pos(tree, event->x, event->y, &path, |
| |
244 NULL, NULL, NULL)) |
| |
245 return FALSE; |
| |
246 gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &iter, path); |
| |
247 gtk_tree_path_free(path); |
| |
248 val.g_type = 0; |
| |
249 gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN, |
| |
250 &val); |
| |
251 service = g_value_get_pointer(&val); |
| |
252 |
| |
253 if (!service) |
| |
254 return FALSE; |
| |
255 |
| |
256 menu = gtk_menu_new(); |
| |
257 |
| |
258 if (service->flags & XMPP_DISCO_ADD) |
| |
259 pidgin_new_item_from_stock(menu, _("Add to Buddy List"), GTK_STOCK_ADD, |
| |
260 G_CALLBACK(add_to_blist_cb), pdl->dialog, |
| |
261 0, 0, NULL); |
| |
262 |
| |
263 if (service->flags & XMPP_DISCO_REGISTER) { |
| |
264 GtkWidget *item = pidgin_new_item(menu, _("Register")); |
| |
265 g_signal_connect(G_OBJECT(item), "activate", |
| |
266 G_CALLBACK(register_button_cb), pdl->dialog); |
| |
267 } |
| |
268 |
| |
269 gtk_widget_show_all(menu); |
| |
270 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, |
| |
271 event->time); |
| |
272 return FALSE; |
| 224 } |
273 } |
| 225 |
274 |
| 226 static void |
275 static void |
| 227 selection_changed_cb(GtkTreeSelection *selection, PidginDiscoList *pdl) |
276 selection_changed_cb(GtkTreeSelection *selection, PidginDiscoList *pdl) |
| 228 { |
277 { |
| 287 if (service->flags & XMPP_DISCO_BROWSE) |
336 if (service->flags & XMPP_DISCO_BROWSE) |
| 288 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(pdl->tree), path)) |
337 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(pdl->tree), path)) |
| 289 gtk_tree_view_collapse_row(GTK_TREE_VIEW(pdl->tree), path); |
338 gtk_tree_view_collapse_row(GTK_TREE_VIEW(pdl->tree), path); |
| 290 else |
339 else |
| 291 gtk_tree_view_expand_row(GTK_TREE_VIEW(pdl->tree), path, FALSE); |
340 gtk_tree_view_expand_row(GTK_TREE_VIEW(pdl->tree), path, FALSE); |
| |
341 else if (service->flags & XMPP_DISCO_REGISTER) |
| |
342 register_button_cb(NULL, pdl->dialog); |
| 292 else if (service->flags & XMPP_DISCO_ADD) |
343 else if (service->flags & XMPP_DISCO_ADD) |
| 293 add_to_blist_cb(GTK_BUTTON(pdl->dialog->add_button), pdl->dialog); |
344 add_to_blist_cb(NULL, pdl->dialog); |
| 294 else if (service->flags & XMPP_DISCO_REGISTER) |
|
| 295 register_button_cb(GTK_BUTTON(pdl->dialog->register_button), pdl->dialog); |
|
| 296 } |
345 } |
| 297 |
346 |
| 298 static void |
347 static void |
| 299 destroy_win_cb(GtkWidget *window, gpointer d) |
348 destroy_win_cb(GtkWidget *window, gpointer d) |
| 300 { |
349 { |
| 472 gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); |
521 gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); |
| 473 gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), DESCRIPTION_COLUMN); |
522 gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), DESCRIPTION_COLUMN); |
| 474 gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE); |
523 gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE); |
| 475 gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column); |
524 gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column); |
| 476 |
525 |
| |
526 g_signal_connect(G_OBJECT(pdl->tree), "button-press-event", G_CALLBACK(service_click_cb), pdl); |
| 477 g_signal_connect(G_OBJECT(pdl->tree), "row-expanded", G_CALLBACK(row_expanded_cb), pdl); |
527 g_signal_connect(G_OBJECT(pdl->tree), "row-expanded", G_CALLBACK(row_expanded_cb), pdl); |
| 478 g_signal_connect(G_OBJECT(pdl->tree), "row-activated", G_CALLBACK(row_activated_cb), pdl); |
528 g_signal_connect(G_OBJECT(pdl->tree), "row-activated", G_CALLBACK(row_activated_cb), pdl); |
| 479 |
529 |
| 480 pidgin_tooltip_setup_for_treeview(pdl->tree, pdl, |
530 pidgin_tooltip_setup_for_treeview(pdl->tree, pdl, |
| 481 disco_create_tooltip, |
531 disco_create_tooltip, |