diff options
Diffstat (limited to 'pidgin/plugins')
-rw-r--r-- | pidgin/plugins/disco/gtkdisco.c | 367 | ||||
-rw-r--r-- | pidgin/plugins/disco/gtkdisco.h | 28 | ||||
-rw-r--r-- | pidgin/plugins/disco/meson.build | 6 | ||||
-rw-r--r-- | pidgin/plugins/disco/resources/disco.ui | 248 | ||||
-rw-r--r-- | pidgin/plugins/disco/resources/xmppdisco.gresource.xml | 6 | ||||
-rw-r--r-- | pidgin/plugins/disco/xmppdisco.c | 2 |
6 files changed, 433 insertions, 224 deletions
diff --git a/pidgin/plugins/disco/gtkdisco.c b/pidgin/plugins/disco/gtkdisco.c index d258085fe3..d60e2fca3c 100644 --- a/pidgin/plugins/disco/gtkdisco.c +++ b/pidgin/plugins/disco/gtkdisco.c @@ -53,11 +53,6 @@ pidgin_disco_list_destroy(PidginDiscoList *list) if (list->dialog && list->dialog->discolist == list) list->dialog->discolist = NULL; - if (list->tree) { - gtk_widget_destroy(list->tree); - list->tree = NULL; - } - g_free((gchar*)list->server); g_free(list); } @@ -93,13 +88,13 @@ void pidgin_disco_list_set_in_progress(PidginDiscoList *list, gboolean in_progre list->in_progress = in_progress; if (in_progress) { - gtk_widget_set_sensitive(dialog->account_widget, FALSE); + gtk_widget_set_sensitive(dialog->account_chooser, FALSE); gtk_widget_set_sensitive(dialog->stop_button, TRUE); gtk_widget_set_sensitive(dialog->browse_button, FALSE); } else { gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(dialog->progress), 0.0); - gtk_widget_set_sensitive(dialog->account_widget, TRUE); + gtk_widget_set_sensitive(dialog->account_chooser, TRUE); gtk_widget_set_sensitive(dialog->stop_button, FALSE); gtk_widget_set_sensitive(dialog->browse_button, TRUE); @@ -151,8 +146,6 @@ pidgin_disco_load_icon(XmppDiscoService *service, const char *size) return pixbuf; } -static void pidgin_disco_create_tree(PidginDiscoList *pdl); - static void dialog_select_account_cb(GtkWidget *chooser, PidginDiscoDialog *dialog) { @@ -161,13 +154,8 @@ dialog_select_account_cb(GtkWidget *chooser, PidginDiscoDialog *dialog) dialog->account = account; gtk_widget_set_sensitive(dialog->browse_button, account != NULL); - if (change && dialog->discolist) { - if (dialog->discolist->tree) { - gtk_widget_destroy(dialog->discolist->tree); - dialog->discolist->tree = NULL; - } - pidgin_disco_list_unref(dialog->discolist); - dialog->discolist = NULL; + if (change) { + g_clear_pointer(&dialog->discolist, pidgin_disco_list_unref); } } @@ -219,13 +207,8 @@ static void browse_button_cb(GtkWidget *button, PidginDiscoDialog *dialog) gtk_widget_set_sensitive(dialog->add_button, FALSE); gtk_widget_set_sensitive(dialog->register_button, FALSE); - if (dialog->discolist != NULL) { - if (dialog->discolist->tree) { - gtk_widget_destroy(dialog->discolist->tree); - dialog->discolist->tree = NULL; - } - pidgin_disco_list_unref(dialog->discolist); - } + g_clear_pointer(&dialog->discolist, pidgin_disco_list_unref); + gtk_tree_store_clear(dialog->model); pdl = dialog->discolist = g_new0(PidginDiscoList, 1); pdl->services = g_hash_table_new_full(NULL, NULL, NULL, @@ -235,10 +218,8 @@ static void browse_button_cb(GtkWidget *button, PidginDiscoDialog *dialog) pidgin_disco_list_ref(pdl); pdl->dialog = dialog; - pidgin_disco_create_tree(pdl); - if (dialog->account_widget) - gtk_widget_set_sensitive(dialog->account_widget, FALSE); + gtk_widget_set_sensitive(dialog->account_chooser, FALSE); username = purple_account_get_username(dialog->account); at = strchr(username, '@'); @@ -285,7 +266,7 @@ static void add_to_blist_cb(GtkWidget *unused, PidginDiscoDialog *dialog) static gboolean service_click_cb(GtkTreeView *tree, GdkEventButton *event, gpointer user_data) { - PidginDiscoList *pdl; + PidginDiscoDialog *dialog = user_data; XmppDiscoService *service; GtkWidget *menu; @@ -296,17 +277,15 @@ service_click_cb(GtkTreeView *tree, GdkEventButton *event, gpointer user_data) if (!gdk_event_triggers_context_menu((GdkEvent *)event)) return FALSE; - pdl = user_data; - /* Figure out what was clicked */ if (!gtk_tree_view_get_path_at_pos(tree, event->x, event->y, &path, NULL, NULL, NULL)) return FALSE; - gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &iter, path); + gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path); gtk_tree_path_free(path); val.g_type = 0; - gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN, - &val); + gtk_tree_model_get_value(GTK_TREE_MODEL(dialog->model), &iter, + SERVICE_COLUMN, &val); service = g_value_get_pointer(&val); if (!service) @@ -314,15 +293,16 @@ service_click_cb(GtkTreeView *tree, GdkEventButton *event, gpointer user_data) menu = gtk_menu_new(); - if (service->flags & XMPP_DISCO_ADD) + if (service->flags & XMPP_DISCO_ADD) { pidgin_new_menu_item(menu, _("Add to Buddy List"), NULL, - G_CALLBACK(add_to_blist_cb), pdl->dialog); + G_CALLBACK(add_to_blist_cb), dialog); + } if (service->flags & XMPP_DISCO_REGISTER) { GtkWidget *item = pidgin_new_menu_item(menu, _("Register"), NULL, NULL, NULL); g_signal_connect(G_OBJECT(item), "activate", - G_CALLBACK(register_button_cb), pdl->dialog); + G_CALLBACK(register_button_cb), dialog); } gtk_widget_show_all(menu); @@ -331,15 +311,15 @@ service_click_cb(GtkTreeView *tree, GdkEventButton *event, gpointer user_data) } static void -selection_changed_cb(GtkTreeSelection *selection, PidginDiscoList *pdl) +selection_changed_cb(GtkTreeSelection *selection, PidginDiscoDialog *dialog) { GtkTreeIter iter; GValue val; - PidginDiscoDialog *dialog = pdl->dialog; if (gtk_tree_selection_get_selected(selection, NULL, &iter)) { val.g_type = 0; - gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN, &val); + gtk_tree_model_get_value(GTK_TREE_MODEL(dialog->model), &iter, + SERVICE_COLUMN, &val); dialog->selected = g_value_get_pointer(&val); if (!dialog->selected) { gtk_widget_set_sensitive(dialog->add_button, FALSE); @@ -359,15 +339,13 @@ static void row_expanded_cb(GtkTreeView *tree, GtkTreeIter *arg1, GtkTreePath *rg2, gpointer user_data) { - PidginDiscoList *pdl; + PidginDiscoDialog *dialog = user_data; XmppDiscoService *service; GValue val; - pdl = user_data; - val.g_type = 0; - gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), arg1, SERVICE_COLUMN, - &val); + gtk_tree_model_get_value(GTK_TREE_MODEL(dialog->model), arg1, + SERVICE_COLUMN, &val); service = g_value_get_pointer(&val); xmpp_disco_service_expand(service); } @@ -378,34 +356,41 @@ row_activated_cb(GtkTreeView *tree_view, GtkTreeViewColumn *column, gpointer user_data) { - PidginDiscoList *pdl = user_data; + PidginDiscoDialog *dialog = user_data; GtkTreeIter iter; XmppDiscoService *service; GValue val; - if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &iter, path)) + if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, + path)) { return; + } val.g_type = 0; - gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN, - &val); + gtk_tree_model_get_value(GTK_TREE_MODEL(dialog->model), &iter, + SERVICE_COLUMN, &val); service = g_value_get_pointer(&val); - if (service->flags & XMPP_DISCO_BROWSE) - if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(pdl->tree), path)) - gtk_tree_view_collapse_row(GTK_TREE_VIEW(pdl->tree), path); - else - gtk_tree_view_expand_row(GTK_TREE_VIEW(pdl->tree), path, FALSE); - else if (service->flags & XMPP_DISCO_REGISTER) - register_button_cb(NULL, pdl->dialog); - else if (service->flags & XMPP_DISCO_ADD) - add_to_blist_cb(NULL, pdl->dialog); + if (service->flags & XMPP_DISCO_BROWSE) { + if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(dialog->tree), + path)) { + gtk_tree_view_collapse_row(GTK_TREE_VIEW(dialog->tree), + path); + } else { + gtk_tree_view_expand_row(GTK_TREE_VIEW(dialog->tree), + path, FALSE); + } + } else if (service->flags & XMPP_DISCO_REGISTER) { + register_button_cb(NULL, dialog); + } else if (service->flags & XMPP_DISCO_ADD) { + add_to_blist_cb(NULL, dialog); + } } static void -destroy_win_cb(GtkWidget *window, gpointer d) +destroy_win_cb(GtkWidget *window, G_GNUC_UNUSED gpointer data) { - PidginDiscoDialog *dialog = d; + PidginDiscoDialog *dialog = PIDGIN_DISCO_DIALOG(window); PidginDiscoList *list = dialog->discolist; if (dialog->prompt_handle) @@ -420,8 +405,7 @@ destroy_win_cb(GtkWidget *window, gpointer d) pidgin_disco_list_unref(list); } - dialogs = g_list_remove(dialogs, d); - g_free(dialog); + dialogs = g_list_remove(dialogs, dialog); } static void stop_button_cb(GtkButton *button, PidginDiscoDialog *dialog) @@ -431,9 +415,7 @@ static void stop_button_cb(GtkButton *button, PidginDiscoDialog *dialog) static void close_button_cb(GtkButton *button, PidginDiscoDialog *dialog) { - GtkWidget *window = dialog->window; - - gtk_widget_destroy(window); + gtk_widget_destroy(GTK_WIDGET(dialog)); } static gboolean account_filter_func(PurpleAccount *account) @@ -455,7 +437,7 @@ static gboolean disco_create_tooltip(GtkWidget *tipwindow, GtkTreePath *path, gpointer data, int *w, int *h) { - PidginDiscoList *pdl = data; + PidginDiscoDialog *dialog = data; GtkTreeIter iter; PangoLayout *layout; int width, height; @@ -464,12 +446,14 @@ disco_create_tooltip(GtkWidget *tipwindow, GtkTreePath *path, const char *type = NULL; char *markup, *jid, *name, *desc = NULL; - if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &iter, path)) + if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, + path)) { return FALSE; + } val.g_type = 0; - gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN, - &val); + gtk_tree_model_get_value(GTK_TREE_MODEL(dialog->model), &iter, + SERVICE_COLUMN, &val); service = g_value_get_pointer(&val); if (!service) return FALSE; @@ -531,69 +515,6 @@ disco_create_tooltip(GtkWidget *tipwindow, GtkTreePath *path, return TRUE; } -static void pidgin_disco_create_tree(PidginDiscoList *pdl) -{ - GtkCellRenderer *text_renderer, *pixbuf_renderer; - GtkTreeViewColumn *column; - GtkTreeSelection *selection; - - pdl->model = gtk_tree_store_new(NUM_OF_COLUMNS, - GDK_TYPE_PIXBUF, /* PIXBUF_COLUMN */ - G_TYPE_STRING, /* NAME_COLUMN */ - G_TYPE_STRING, /* DESCRIPTION_COLUMN */ - G_TYPE_POINTER /* SERVICE_COLUMN */ - ); - - pdl->tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pdl->model)); - - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pdl->tree)); - g_signal_connect(G_OBJECT(selection), "changed", - G_CALLBACK(selection_changed_cb), pdl); - - g_object_unref(pdl->model); - - gtk_container_add(GTK_CONTAINER(pdl->dialog->sw), pdl->tree); - gtk_widget_show(pdl->tree); - - text_renderer = gtk_cell_renderer_text_new(); - pixbuf_renderer = gtk_cell_renderer_pixbuf_new(); - - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Name")); - - gtk_tree_view_column_pack_start(column, pixbuf_renderer, FALSE); - gtk_tree_view_column_set_attributes(column, pixbuf_renderer, - "pixbuf", PIXBUF_COLUMN, NULL); - - gtk_tree_view_column_pack_start(column, text_renderer, TRUE); - gtk_tree_view_column_set_attributes(column, text_renderer, - "text", NAME_COLUMN, NULL); - - gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(column), - GTK_TREE_VIEW_COLUMN_GROW_ONLY); - gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); - gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), NAME_COLUMN); - gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE); - gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column); - - column = gtk_tree_view_column_new_with_attributes(_("Description"), text_renderer, - "text", DESCRIPTION_COLUMN, NULL); - gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(column), - GTK_TREE_VIEW_COLUMN_GROW_ONLY); - gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); - gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), DESCRIPTION_COLUMN); - gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE); - gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column); - - g_signal_connect(G_OBJECT(pdl->tree), "button-press-event", G_CALLBACK(service_click_cb), pdl); - g_signal_connect(G_OBJECT(pdl->tree), "row-expanded", G_CALLBACK(row_expanded_cb), pdl); - g_signal_connect(G_OBJECT(pdl->tree), "row-activated", G_CALLBACK(row_activated_cb), pdl); - - pidgin_tooltip_setup_for_treeview(pdl->tree, pdl, - disco_create_tooltip, - disco_paint_tooltip); -} - void pidgin_disco_signed_off_cb(PurpleConnection *pc) { GList *node; @@ -606,10 +527,7 @@ void pidgin_disco_signed_off_cb(PurpleConnection *pc) if (list->in_progress) pidgin_disco_list_set_in_progress(list, FALSE); - if (list->tree) { - gtk_widget_destroy(list->tree); - list->tree = NULL; - } + gtk_tree_store_clear(dialog->model); pidgin_disco_list_unref(list); dialog->discolist = NULL; @@ -617,7 +535,7 @@ void pidgin_disco_signed_off_cb(PurpleConnection *pc) gtk_widget_set_sensitive( dialog->browse_button, pidgin_account_chooser_get_selected( - dialog->account_widget) != NULL); + dialog->account_chooser) != NULL); gtk_widget_set_sensitive(dialog->register_button, FALSE); gtk_widget_set_sensitive(dialog->add_button, FALSE); @@ -628,92 +546,103 @@ void pidgin_disco_signed_off_cb(PurpleConnection *pc) void pidgin_disco_dialogs_destroy_all(void) { while (dialogs) { - PidginDiscoDialog *dialog = dialogs->data; + GtkWidget *dialog = dialogs->data; - gtk_widget_destroy(dialog->window); + gtk_widget_destroy(dialog); /* destroy_win_cb removes the dialog from the list */ } } -PidginDiscoDialog *pidgin_disco_dialog_new(void) -{ - PidginDiscoDialog *dialog; - GtkWidget *window, *vbox, *vbox2, *bbox; +/****************************************************************************** + * GObject implementation + *****************************************************************************/ - dialog = g_new0(PidginDiscoDialog, 1); - dialogs = g_list_prepend(dialogs, dialog); +G_DEFINE_DYNAMIC_TYPE(PidginDiscoDialog, pidgin_disco_dialog, GTK_TYPE_DIALOG) - /* Create the window. */ - dialog->window = window = pidgin_create_dialog(_("Service Discovery"), PIDGIN_HIG_BORDER, "service discovery", TRUE); +static void +pidgin_disco_dialog_class_init(PidginDiscoDialogClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); + + gtk_widget_class_set_template_from_resource( + widget_class, "/im/pidgin/Pidgin/Plugin/XMPPDisco/disco.ui"); + + gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, + account_chooser); + gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, + progress); + gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, + stop_button); + gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, + browse_button); + gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, + register_button); + gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, + add_button); + gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, + tree); + gtk_widget_class_bind_template_child(widget_class, PidginDiscoDialog, + model); + + gtk_widget_class_bind_template_callback(widget_class, destroy_win_cb); + gtk_widget_class_bind_template_callback(widget_class, stop_button_cb); + gtk_widget_class_bind_template_callback(widget_class, browse_button_cb); + gtk_widget_class_bind_template_callback(widget_class, + register_button_cb); + gtk_widget_class_bind_template_callback(widget_class, add_to_blist_cb); + gtk_widget_class_bind_template_callback(widget_class, close_button_cb); + gtk_widget_class_bind_template_callback(widget_class, + dialog_select_account_cb); + gtk_widget_class_bind_template_callback(widget_class, row_activated_cb); + gtk_widget_class_bind_template_callback(widget_class, row_expanded_cb); + gtk_widget_class_bind_template_callback(widget_class, service_click_cb); + gtk_widget_class_bind_template_callback(widget_class, + selection_changed_cb); +} - g_signal_connect(G_OBJECT(window), "destroy", - G_CALLBACK(destroy_win_cb), dialog); +static void +pidgin_disco_dialog_class_finalize(PidginDiscoDialogClass *klass) +{ +} - /* Create the parent vbox for everything. */ - vbox = pidgin_dialog_get_vbox_with_properties(GTK_DIALOG(window), FALSE, PIDGIN_HIG_BORDER); +static void +pidgin_disco_dialog_init(PidginDiscoDialog *dialog) +{ + dialogs = g_list_prepend(dialogs, dialog); - vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, PIDGIN_HIG_BORDER); - gtk_container_add(GTK_CONTAINER(vbox), vbox2); - gtk_widget_show(vbox2); + gtk_widget_init_template(GTK_WIDGET(dialog)); /* accounts dropdown list */ - dialog->account_widget = pidgin_account_chooser_new(NULL, FALSE); pidgin_account_chooser_set_filter_func( - PIDGIN_ACCOUNT_CHOOSER(dialog->account_widget), + PIDGIN_ACCOUNT_CHOOSER(dialog->account_chooser), account_filter_func); - g_signal_connect(dialog->account_widget, "changed", - G_CALLBACK(dialog_select_account_cb), dialog); dialog->account = - pidgin_account_chooser_get_selected(dialog->account_widget); - pidgin_add_widget_to_vbox(GTK_BOX(vbox2), _("_Account:"), NULL, dialog->account_widget, TRUE, NULL); - - /* scrolled window */ - dialog->sw = pidgin_make_scrollable(NULL, GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, 250); - gtk_box_pack_start(GTK_BOX(vbox2), dialog->sw, TRUE, TRUE, 0); - - /* progress bar */ - dialog->progress = gtk_progress_bar_new(); - gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(dialog->progress), 0.1); - gtk_box_pack_start(GTK_BOX(vbox2), dialog->progress, FALSE, FALSE, 0); - gtk_widget_show(dialog->progress); - - /* button box */ - bbox = pidgin_dialog_get_action_area(GTK_DIALOG(window)); - gtk_box_set_spacing(GTK_BOX(bbox), PIDGIN_HIG_BOX_SPACE); - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); - - /* stop button */ - dialog->stop_button = - pidgin_dialog_add_button(GTK_DIALOG(window), _("_Stop"), - G_CALLBACK(stop_button_cb), dialog); - gtk_widget_set_sensitive(dialog->stop_button, FALSE); + pidgin_account_chooser_get_selected(dialog->account_chooser); /* browse button */ - dialog->browse_button = - pidgin_dialog_add_button(GTK_DIALOG(window), _("_Browse"), - G_CALLBACK(browse_button_cb), dialog); gtk_widget_set_sensitive(dialog->browse_button, dialog->account != NULL); - /* register button */ - dialog->register_button = - pidgin_dialog_add_button(GTK_DIALOG(dialog->window), _("Register"), - G_CALLBACK(register_button_cb), dialog); - gtk_widget_set_sensitive(dialog->register_button, FALSE); - - /* add button */ - dialog->add_button = - pidgin_dialog_add_button(GTK_DIALOG(dialog->window), _("_Add"), - G_CALLBACK(add_to_blist_cb), dialog); - gtk_widget_set_sensitive(dialog->add_button, FALSE); + pidgin_tooltip_setup_for_treeview(GTK_WIDGET(dialog->tree), dialog, + disco_create_tooltip, + disco_paint_tooltip); +} - /* close button */ - dialog->close_button = - pidgin_dialog_add_button(GTK_DIALOG(window), _("_Close"), - G_CALLBACK(close_button_cb), dialog); +/****************************************************************************** + * Public API + *****************************************************************************/ - /* show the dialog window and return the dialog */ - gtk_widget_show(dialog->window); +void +pidgin_disco_dialog_register(PurplePlugin *plugin) +{ + pidgin_disco_dialog_register_type(G_TYPE_MODULE(plugin)); +} +PidginDiscoDialog * +pidgin_disco_dialog_new(void) +{ + PidginDiscoDialog *dialog = + g_object_new(PIDGIN_TYPE_DISCO_DIALOG, NULL); + gtk_widget_show_all(GTK_WIDGET(dialog)); return dialog; } @@ -741,14 +670,17 @@ void pidgin_disco_add_service(PidginDiscoList *pdl, XmppDiscoService *service, X rr = g_hash_table_lookup(pdl->services, parent); path = gtk_tree_row_reference_get_path(rr); if (path) { - gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &parent_iter, path); + gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), + &parent_iter, path); gtk_tree_path_free(path); - if (gtk_tree_model_iter_children(GTK_TREE_MODEL(pdl->model), &child, - &parent_iter)) { + if (gtk_tree_model_iter_children( + GTK_TREE_MODEL(dialog->model), &child, + &parent_iter)) { PidginDiscoList *tmp; - gtk_tree_model_get(GTK_TREE_MODEL(pdl->model), &child, - SERVICE_COLUMN, &tmp, -1); + gtk_tree_model_get( + GTK_TREE_MODEL(dialog->model), &child, + SERVICE_COLUMN, &tmp, -1); if (!tmp) append = FALSE; } @@ -757,35 +689,36 @@ void pidgin_disco_add_service(PidginDiscoList *pdl, XmppDiscoService *service, X if (service == NULL) { if (parent != NULL && !append) - gtk_tree_store_remove(pdl->model, &child); + gtk_tree_store_remove(dialog->model, &child); return; } - if (append) - gtk_tree_store_append(pdl->model, &iter, (parent ? &parent_iter : NULL)); - else + if (append) { + gtk_tree_store_append(dialog->model, &iter, + (parent ? &parent_iter : NULL)); + } else { iter = child; + } if (service->flags & XMPP_DISCO_BROWSE) { GtkTreeRowReference *rr; GtkTreePath *path; - gtk_tree_store_append(pdl->model, &child, &iter); + gtk_tree_store_append(dialog->model, &child, &iter); - path = gtk_tree_model_get_path(GTK_TREE_MODEL(pdl->model), &iter); - rr = gtk_tree_row_reference_new(GTK_TREE_MODEL(pdl->model), path); + path = gtk_tree_model_get_path(GTK_TREE_MODEL(dialog->model), + &iter); + rr = gtk_tree_row_reference_new(GTK_TREE_MODEL(dialog->model), + path); g_hash_table_insert(pdl->services, service, rr); gtk_tree_path_free(path); } pixbuf = pidgin_disco_load_icon(service, "16"); - gtk_tree_store_set(pdl->model, &iter, - PIXBUF_COLUMN, pixbuf, - NAME_COLUMN, service->name, - DESCRIPTION_COLUMN, service->description, - SERVICE_COLUMN, service, - -1); + gtk_tree_store_set(dialog->model, &iter, PIXBUF_COLUMN, pixbuf, + NAME_COLUMN, service->name, DESCRIPTION_COLUMN, + service->description, SERVICE_COLUMN, service, -1); if (pixbuf) g_object_unref(pixbuf); diff --git a/pidgin/plugins/disco/gtkdisco.h b/pidgin/plugins/disco/gtkdisco.h index 0c1aaba73a..b27977e9f1 100644 --- a/pidgin/plugins/disco/gtkdisco.h +++ b/pidgin/plugins/disco/gtkdisco.h @@ -22,31 +22,39 @@ #ifndef PIDGIN_XMPP_DISCO_UI_H #define PIDGIN_XMPP_DISCO_UI_H -typedef struct _PidginDiscoDialog PidginDiscoDialog; +#include <gtk/gtk.h> + typedef struct _PidginDiscoList PidginDiscoList; #include "xmppdisco.h" +G_BEGIN_DECLS + struct _PidginDiscoDialog { - GtkWidget *window; - GtkWidget *account_widget; + GtkDialog parent; + + GtkWidget *account_chooser; - GtkWidget *sw; GtkWidget *progress; GtkWidget *stop_button; GtkWidget *browse_button; GtkWidget *register_button; GtkWidget *add_button; - GtkWidget *close_button; XmppDiscoService *selected; + GtkTreeView *tree; + GtkTreeStore *model; PurpleAccount *account; PidginDiscoList *discolist; gpointer *prompt_handle; }; +#define PIDGIN_TYPE_DISCO_DIALOG (pidgin_disco_dialog_get_type()) +G_DECLARE_FINAL_TYPE(PidginDiscoDialog, pidgin_disco_dialog, PIDGIN, + DISCO_DIALOG, GtkDialog) + struct _PidginDiscoList { PurpleConnection *pc; gboolean in_progress; @@ -56,12 +64,15 @@ struct _PidginDiscoList { guint fetch_count; PidginDiscoDialog *dialog; - GtkTreeStore *model; - GtkWidget *tree; GHashTable *services; }; /** + * Registers dynamic GObjects. + */ +void pidgin_disco_dialog_register(PurplePlugin *plugin); + +/** * Shows a new service discovery dialog. */ PidginDiscoDialog *pidgin_disco_dialog_new(void); @@ -79,4 +90,7 @@ PidginDiscoList *pidgin_disco_list_ref(PidginDiscoList *list); void pidgin_disco_list_unref(PidginDiscoList *list); void pidgin_disco_list_set_in_progress(PidginDiscoList *list, gboolean in_progress); + +G_END_DECLS + #endif /* PIDGIN_XMPP_DISCO_UI_H */ diff --git a/pidgin/plugins/disco/meson.build b/pidgin/plugins/disco/meson.build index ef944ad2c7..df49be8667 100644 --- a/pidgin/plugins/disco/meson.build +++ b/pidgin/plugins/disco/meson.build @@ -6,6 +6,12 @@ xmppdisco_SOURCES = [ ] if PLUGINS + xmppdisco_resource = gnome.compile_resources('xmppdiscoresources', + 'resources/xmppdisco.gresource.xml', + source_dir : 'resources', + c_name : 'xmppdisco') + xmppdisco_SOURCES += xmppdisco_resource + xmppdisco = library('xmppdisco', xmppdisco_SOURCES, dependencies : [libpurple_dep, libpidgin_dep, glib], name_prefix : '', diff --git a/pidgin/plugins/disco/resources/disco.ui b/pidgin/plugins/disco/resources/disco.ui new file mode 100644 index 0000000000..0a1921db01 --- /dev/null +++ b/pidgin/plugins/disco/resources/disco.ui @@ -0,0 +1,248 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface> + <requires lib="gtk+" version="3.18"/> + <requires lib="pidgin" version="3.0"/> + <object class="GtkTreeStore" id="model"> + <columns> + <!-- column-name pixbuf --> + <column type="GdkPixbuf"/> + <!-- column-name name --> + <column type="gchararray"/> + <!-- column-name description --> + <column type="gchararray"/> + <!-- column-name service --> + <column type="gpointer"/> + </columns> + </object> + <template class="PidginDiscoDialog" parent="GtkDialog"> + <property name="can_focus">False</property> + <property name="title" translatable="yes">Service Discovery</property> + <property name="role">service discovery</property> + <property name="type_hint">dialog</property> + <signal name="destroy" handler="destroy_win_cb" swapped="no"/> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">2</property> + <child internal-child="action_area"> + <object class="GtkButtonBox"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="stop_button"> + <property name="label" translatable="yes">_Stop</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="stop_button_cb" object="PidginDiscoDialog" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="browse_button"> + <property name="label" translatable="yes">_Browse</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="browse_button_cb" object="PidginDiscoDialog" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="register_button"> + <property name="label" translatable="yes">Register</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="register_button_cb" object="PidginDiscoDialog" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="add_button"> + <property name="label" translatable="yes">_Add</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="add_to_blist_cb" object="PidginDiscoDialog" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="close_button"> + <property name="label" translatable="yes">_Close</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="close_button_cb" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">_Account:</property> + <property name="use_underline">True</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="PidginAccountChooser" id="account_chooser"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <signal name="changed" handler="dialog_select_account_cb" object="PidginDiscoDialog" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">always</property> + <property name="vscrollbar_policy">always</property> + <property name="shadow_type">in</property> + <property name="min_content_height">250</property> + <child> + <object class="GtkTreeView" id="tree"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="model">model</property> + <signal name="button-press-event" handler="service_click_cb" object="PidginDiscoDialog" swapped="no"/> + <signal name="row-activated" handler="row_activated_cb" object="PidginDiscoDialog" swapped="no"/> + <signal name="row-expanded" handler="row_expanded_cb" object="PidginDiscoDialog" swapped="no"/> + <child internal-child="selection"> + <object class="GtkTreeSelection"> + <signal name="changed" handler="selection_changed_cb" swapped="no"/> + </object> + </child> + <child> + <object class="GtkTreeViewColumn"> + <property name="resizable">True</property> + <property name="title" translatable="yes">Name</property> + <property name="reorderable">True</property> + <property name="sort_column_id">1</property> + <child> + <object class="GtkCellRendererPixbuf"/> + <attributes> + <attribute name="pixbuf">0</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererText"/> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn"> + <property name="resizable">True</property> + <property name="title" translatable="yes">Description</property> + <property name="reorderable">True</property> + <property name="sort_column_id">2</property> + <child> + <object class="GtkCellRendererText"/> + <attributes> + <attribute name="text">2</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkProgressBar" id="progress"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </template> +</interface> diff --git a/pidgin/plugins/disco/resources/xmppdisco.gresource.xml b/pidgin/plugins/disco/resources/xmppdisco.gresource.xml new file mode 100644 index 0000000000..99d91727d9 --- /dev/null +++ b/pidgin/plugins/disco/resources/xmppdisco.gresource.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<gresources> + <gresource prefix="/im/pidgin/Pidgin/Plugin/XMPPDisco/"> + <file compressed="true">disco.ui</file> + </gresource> +</gresources> diff --git a/pidgin/plugins/disco/xmppdisco.c b/pidgin/plugins/disco/xmppdisco.c index 4ba65d3ad8..8404afd302 100644 --- a/pidgin/plugins/disco/xmppdisco.c +++ b/pidgin/plugins/disco/xmppdisco.c @@ -649,6 +649,8 @@ plugin_load(PurplePlugin *plugin, GError **error) return FALSE; } + pidgin_disco_dialog_register(plugin); + purple_signal_connect(purple_connections_get_handle(), "signing-off", plugin, PURPLE_CALLBACK(signed_off_cb), NULL); |