--- a/pidgin/gtkroomlist.c Mon Jan 23 20:55:34 2023 -0600
+++ b/pidgin/gtkroomlist.c Mon Jan 23 23:27:47 2023 -0600
@@ -47,8 +47,9 @@
GtkWidget *account_widget;
- GtkTreeSelection *tree_selection;
+ GtkSingleSelection *selection; + GtkFilterListModel *filter; @@ -56,8 +57,6 @@
PurpleRoomlist *roomlist;
@@ -69,34 +68,12 @@
PidginRoomlistDialog *dialog;
/******************************************************************************
*****************************************************************************/
-static PurpleRoomlistRoom *
-pidgin_roomlist_get_selected(PidginRoomlistDialog *dialog)
- GtkTreeModel *model = NULL;
- PurpleRoomlistRoom *room = NULL;
- if(gtk_tree_selection_get_selected(dialog->tree_selection, &model, &iter)) {
- gtk_tree_model_get(model, &iter, ROOM_COLUMN, &room, -1);
pidgin_roomlist_close(PidginRoomlistDialog *dialog)
@@ -153,8 +130,7 @@
gtk_widget_set_sensitive(dialog->account_widget, FALSE);
- gtk_tree_view_set_model(GTK_TREE_VIEW(dialog->tree),
- GTK_TREE_MODEL(rl->model));
+ gtk_filter_list_model_set_model(dialog->filter, G_LIST_MODEL(rl->model)); /* some protocols (not bundled with libpurple) finish getting their
* room list immediately */
@@ -194,9 +170,8 @@
account = purple_roomlist_get_account(dialog->roomlist);
gc = purple_account_get_connection(account);
- room = pidgin_roomlist_get_selected(dialog);
- g_return_if_fail(room != NULL);
+ room = gtk_single_selection_get_selected_item(dialog->selection); + g_return_if_fail(PURPLE_IS_ROOMLIST_ROOM(room)); protocol = purple_connection_get_protocol(gc);
@@ -214,34 +189,13 @@
-_search_func(GtkTreeModel *model, gint column, const gchar *key,
- GtkTreeIter *iter, G_GNUC_UNUSED gpointer search_data)
- gchar *name, *fold, *fkey;
- gtk_tree_model_get(model, iter, column, &name, -1);
- fold = g_utf8_casefold(name, -1);
- fkey = g_utf8_casefold(key, -1);
- result = (g_strstr_len(fold, strlen(fold), fkey) == NULL);
pidgin_roomlist_join(PidginRoomlistDialog *dialog)
PurpleRoomlistRoom *room = NULL;
- room = pidgin_roomlist_get_selected(dialog);
+ room = gtk_single_selection_get_selected_item(dialog->selection); + if(PURPLE_IS_ROOMLIST_ROOM(room)) { purple_roomlist_join_room(dialog->roomlist, room);
@@ -332,36 +286,37 @@
PIDGIN_ROOMLIST_UI_DATA);
g_clear_object(&rl->model);
- g_object_unref(dialog->roomlist);
- dialog->roomlist = NULL;
+ g_clear_object(&dialog->roomlist); -selection_changed_cb(GtkTreeSelection *selection,
- PidginRoomlistDialog *dialog)
+selection_changed_cb(GtkSelectionModel *self, G_GNUC_UNUSED guint position, + G_GNUC_UNUSED guint n_items, gpointer data) + PidginRoomlistDialog *dialog = data; + guint index = GTK_INVALID_LIST_POSITION; - found = gtk_tree_selection_get_selected(selection, NULL, NULL);
+ /* The passed in position and n_items gives the *range* of selections that + * have changed, so just re-query it exactly since GtkSingleSelection has + index = gtk_single_selection_get_selected(GTK_SINGLE_SELECTION(self)); + found = index != GTK_INVALID_LIST_POSITION; gtk_widget_set_sensitive(dialog->add_button, found);
gtk_widget_set_sensitive(dialog->join_button, found);
-row_activated_cb(G_GNUC_UNUSED GtkTreeView *tv, GtkTreePath *path,
- G_GNUC_UNUSED GtkTreeViewColumn *arg2, gpointer data)
+row_activated_cb(GtkColumnView *self, guint position, gpointer data) PidginRoomlistDialog *dialog = data;
- PidginRoomlist *grl = NULL;
- PurpleRoomlistRoom *room;
+ PurpleRoomlistRoom *room = NULL; + GtkSelectionModel *model = NULL; - grl = g_object_get_data(G_OBJECT(dialog->roomlist), PIDGIN_ROOMLIST_UI_DATA);
- gtk_tree_model_get_iter(GTK_TREE_MODEL(grl->model), &iter, path);
- gtk_tree_model_get(GTK_TREE_MODEL(grl->model), &iter, ROOM_COLUMN, &room, -1);
+ model = gtk_column_view_get_model(self); + room = g_list_model_get_item(G_LIST_MODEL(model), position); if(PURPLE_IS_ROOMLIST_ROOM(room)) {
purple_roomlist_join_room(dialog->roomlist, room);
@@ -370,81 +325,6 @@
-room_click_cb(G_GNUC_UNUSED GtkGestureClick *self, gint n_press, gdouble x,
- gdouble y, gpointer data)
- PidginRoomlistDialog *dialog = data;
- if(!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(dialog->tree), (gint)x,
- (gint)y, NULL, NULL, NULL, NULL))
- gtk_popover_set_pointing_to(GTK_POPOVER(dialog->popover),
- &(const GdkRectangle){(int)x, (int)y, 0, 0});
- gtk_popover_popup(GTK_POPOVER(dialog->popover));
-pidgin_roomlist_query_tooltip(GtkWidget *widget, int x, int y,
- gboolean keyboard_mode, GtkTooltip *tooltip,
- PidginRoomlistDialog *dialog = data;
- PidginRoomlist *grl = NULL;
- GtkTreePath *path = NULL;
- GString *tooltip_text = NULL;
- grl = g_object_get_data(G_OBJECT(dialog->roomlist), PIDGIN_ROOMLIST_UI_DATA);
- if (!gtk_tree_selection_get_selected(dialog->tree_selection, NULL, &iter)) {
- path = gtk_tree_model_get_path(GTK_TREE_MODEL(grl->model), &iter);
- gtk_tree_view_convert_widget_to_bin_window_coords(GTK_TREE_VIEW(widget),
- gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bx, by, &path,
- if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(grl->model), &iter, path)) {
- gtk_tree_path_free(path);
- tooltip_text = g_string_new("");
- gtk_tree_model_get(GTK_TREE_MODEL(grl->model), &iter, NAME_COLUMN, &name, -1);
- tmp = g_markup_escape_text(name, -1);
- g_string_append_printf(
- tooltip_text, "<span size='x-large' weight='bold'>%s</span>\n", tmp);
- gtk_tooltip_set_markup(tooltip, tooltip_text->str);
- gtk_tree_view_set_tooltip_row(GTK_TREE_VIEW(widget), tooltip, path);
- g_string_free(tooltip_text, TRUE);
- gtk_tree_path_free(path);
account_filter_func(gpointer item, G_GNUC_UNUSED gpointer data) {
PurpleProtocol *protocol = NULL;
@@ -488,9 +368,11 @@
gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
+ gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog, gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
@@ -503,19 +385,14 @@
gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
- gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
gtk_widget_class_bind_template_callback(widget_class, close_request_cb);
gtk_widget_class_bind_template_callback(widget_class, row_activated_cb);
- gtk_widget_class_bind_template_callback(widget_class, room_click_cb);
gtk_widget_class_bind_template_callback(widget_class,
dialog_select_account_cb);
gtk_widget_class_bind_template_callback(widget_class,
gtk_widget_class_bind_template_callback(widget_class,
- pidgin_roomlist_query_tooltip);
- gtk_widget_class_bind_template_callback(widget_class,
pidgin_roomlist_response_cb);
@@ -533,9 +410,6 @@
- gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(self->tree),
- _search_func, NULL, NULL);
/* Now setup our actions. */
group = g_simple_action_group_new();
g_action_map_add_action_entries(G_ACTION_MAP(group), actions,
@@ -602,8 +476,6 @@
pidgin_roomlist_add_room(PurpleRoomlist *list, PurpleRoomlistRoom *room) {
PidginRoomlist *rl = NULL;
rl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
@@ -616,18 +488,7 @@
rl->dialog->pg_needs_pulse = TRUE;
- gtk_tree_store_append(rl->model, &iter, NULL);
- path = gtk_tree_model_get_path(GTK_TREE_MODEL(rl->model), &iter);
- gtk_tree_path_free(path);
- NAME_COLUMN, purple_roomlist_room_get_name(room),
- DESCRIPTION_COLUMN, purple_roomlist_room_get_description(room),
+ g_list_store_append(rl->model, room); @@ -662,8 +523,7 @@
g_object_set_data_full(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA, rl,
- rl->model = gtk_tree_store_new(3, G_TYPE_OBJECT, G_TYPE_STRING,
+ rl->model = g_list_store_new(PURPLE_TYPE_ROOMLIST_ROOM); g_signal_connect(list, "notify::in-progress",
G_CALLBACK(pidgin_roomlist_in_progress), rl);