| 279 purple_blist_request_add_buddy(account, jid, NULL, NULL); |
279 purple_blist_request_add_buddy(account, jid, NULL, NULL); |
| 280 } |
280 } |
| 281 } |
281 } |
| 282 |
282 |
| 283 static gboolean |
283 static gboolean |
| 284 service_click_cb(GtkTreeView *tree, GdkEventButton *event, gpointer user_data) |
284 service_click_cb(G_GNUC_UNUSED GtkGestureClick *click, |
| 285 { |
285 G_GNUC_UNUSED gint n_press, |
| 286 PidginDiscoDialog *dialog = user_data; |
286 gdouble x, gdouble y, gpointer data) |
| |
287 { |
| |
288 PidginDiscoDialog *dialog = data; |
| 287 XmppDiscoService *service; |
289 XmppDiscoService *service; |
| 288 |
290 |
| 289 GtkTreePath *path; |
291 GtkTreePath *path; |
| 290 GtkTreeIter iter; |
292 GtkTreeIter iter; |
| 291 GValue val; |
293 GValue val; |
| 292 |
294 |
| 293 GdkRectangle rect; |
295 GdkRectangle rect; |
| 294 |
296 |
| 295 if (!gdk_event_triggers_context_menu((GdkEvent *)event)) { |
|
| 296 return FALSE; |
|
| 297 } |
|
| 298 |
|
| 299 /* Figure out what was clicked */ |
297 /* Figure out what was clicked */ |
| 300 if (!gtk_tree_view_get_path_at_pos(tree, event->x, event->y, &path, |
298 if (!gtk_tree_view_get_path_at_pos(dialog->tree, (gint)x, (gint)y, &path, |
| 301 NULL, NULL, NULL)) |
299 NULL, NULL, NULL)) |
| 302 { |
300 { |
| 303 return FALSE; |
301 return FALSE; |
| 304 } |
302 } |
| 305 gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path); |
303 gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path); |
| 306 gtk_tree_path_free(path); |
304 gtk_tree_path_free(path); |
| 312 if (!service) { |
310 if (!service) { |
| 313 return FALSE; |
311 return FALSE; |
| 314 } |
312 } |
| 315 |
313 |
| 316 gtk_tree_view_convert_bin_window_to_widget_coords(dialog->tree, |
314 gtk_tree_view_convert_bin_window_to_widget_coords(dialog->tree, |
| 317 (gint)event->x, |
315 (gint)x, (gint)y, |
| 318 (gint)event->y, |
|
| 319 &rect.x, &rect.y); |
316 &rect.x, &rect.y); |
| 320 rect.width = rect.height = 1; |
317 rect.width = rect.height = 1; |
| 321 |
318 |
| 322 gtk_popover_set_pointing_to(GTK_POPOVER(dialog->popover), &rect); |
319 gtk_popover_set_pointing_to(GTK_POPOVER(dialog->popover), &rect); |
| 323 gtk_popover_popup(GTK_POPOVER(dialog->popover)); |
320 gtk_popover_popup(GTK_POPOVER(dialog->popover)); |
| 426 PidginDiscoDialog *dialog = data; |
423 PidginDiscoDialog *dialog = data; |
| 427 |
424 |
| 428 pidgin_disco_list_set_in_progress(dialog->discolist, FALSE); |
425 pidgin_disco_list_set_in_progress(dialog->discolist, FALSE); |
| 429 } |
426 } |
| 430 |
427 |
| 431 static void close_button_cb(GtkButton *button, PidginDiscoDialog *dialog) |
|
| 432 { |
|
| 433 gtk_widget_destroy(GTK_WIDGET(dialog)); |
|
| 434 } |
|
| 435 |
|
| 436 static gboolean |
428 static gboolean |
| 437 disco_query_tooltip(GtkWidget *widget, int x, int y, gboolean keyboard_mode, |
429 disco_query_tooltip(GtkWidget *widget, int x, int y, gboolean keyboard_mode, |
| 438 GtkTooltip *tooltip, gpointer data) |
430 GtkTooltip *tooltip, gpointer data) |
| 439 { |
431 { |
| 440 PidginDiscoDialog *dialog = data; |
432 PidginDiscoDialog *dialog = data; |
| 563 void pidgin_disco_dialogs_destroy_all(void) |
555 void pidgin_disco_dialogs_destroy_all(void) |
| 564 { |
556 { |
| 565 while (dialogs) { |
557 while (dialogs) { |
| 566 GtkWidget *dialog = dialogs->data; |
558 GtkWidget *dialog = dialogs->data; |
| 567 |
559 |
| 568 gtk_widget_destroy(dialog); |
560 gtk_window_destroy(GTK_WINDOW(dialog)); |
| 569 /* destroy_win_cb removes the dialog from the list */ |
561 /* destroy_win_cb removes the dialog from the list */ |
| 570 } |
562 } |
| 571 } |
563 } |
| 572 |
564 |
| 573 /****************************************************************************** |
565 /****************************************************************************** |
| 592 tree); |
584 tree); |
| 593 gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, |
585 gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, |
| 594 model); |
586 model); |
| 595 gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, |
587 gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, |
| 596 popover); |
588 popover); |
| 597 gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, |
|
| 598 popover_menu); |
|
| 599 |
589 |
| 600 gtk_widget_class_bind_template_callback(widget_class, destroy_win_cb); |
590 gtk_widget_class_bind_template_callback(widget_class, destroy_win_cb); |
| 601 gtk_widget_class_bind_template_callback(widget_class, close_button_cb); |
|
| 602 gtk_widget_class_bind_template_callback(widget_class, |
591 gtk_widget_class_bind_template_callback(widget_class, |
| 603 dialog_select_account_cb); |
592 dialog_select_account_cb); |
| 604 gtk_widget_class_bind_template_callback(widget_class, row_activated_cb); |
593 gtk_widget_class_bind_template_callback(widget_class, row_activated_cb); |
| 605 gtk_widget_class_bind_template_callback(widget_class, row_expanded_cb); |
594 gtk_widget_class_bind_template_callback(widget_class, row_expanded_cb); |
| 606 gtk_widget_class_bind_template_callback(widget_class, service_click_cb); |
595 gtk_widget_class_bind_template_callback(widget_class, service_click_cb); |
| 658 g_action_map_lookup_action(action_map, "add")); |
647 g_action_map_lookup_action(action_map, "add")); |
| 659 g_simple_action_set_enabled(dialog->add_action, FALSE); |
648 g_simple_action_set_enabled(dialog->add_action, FALSE); |
| 660 |
649 |
| 661 gtk_widget_insert_action_group(GTK_WIDGET(dialog), "disco", |
650 gtk_widget_insert_action_group(GTK_WIDGET(dialog), "disco", |
| 662 G_ACTION_GROUP(action_group)); |
651 G_ACTION_GROUP(action_group)); |
| 663 |
|
| 664 gtk_popover_bind_model(GTK_POPOVER(dialog->popover), dialog->popover_menu, |
|
| 665 NULL); |
|
| 666 } |
652 } |
| 667 |
653 |
| 668 /****************************************************************************** |
654 /****************************************************************************** |
| 669 * Public API |
655 * Public API |
| 670 *****************************************************************************/ |
656 *****************************************************************************/ |
| 677 |
663 |
| 678 PidginDiscoDialog * |
664 PidginDiscoDialog * |
| 679 pidgin_disco_dialog_new(void) |
665 pidgin_disco_dialog_new(void) |
| 680 { |
666 { |
| 681 PidginDiscoDialog *dialog = g_object_new(PIDGIN_TYPE_DISCO_DIALOG, NULL); |
667 PidginDiscoDialog *dialog = g_object_new(PIDGIN_TYPE_DISCO_DIALOG, NULL); |
| 682 gtk_widget_show_all(GTK_WIDGET(dialog)); |
668 gtk_widget_show(GTK_WIDGET(dialog)); |
| 683 return dialog; |
669 return dialog; |
| 684 } |
670 } |
| 685 |
671 |
| 686 void pidgin_disco_add_service(PidginDiscoList *pdl, XmppDiscoService *service, XmppDiscoService *parent) |
672 void pidgin_disco_add_service(PidginDiscoList *pdl, XmppDiscoService *service, XmppDiscoService *parent) |
| 687 { |
673 { |