summaryrefslogtreecommitdiff
path: root/pidgin/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'pidgin/plugins')
-rw-r--r--pidgin/plugins/disco/gtkdisco.c367
-rw-r--r--pidgin/plugins/disco/gtkdisco.h28
-rw-r--r--pidgin/plugins/disco/meson.build6
-rw-r--r--pidgin/plugins/disco/resources/disco.ui248
-rw-r--r--pidgin/plugins/disco/resources/xmppdisco.gresource.xml6
-rw-r--r--pidgin/plugins/disco/xmppdisco.c2
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);