--- a/pidgin/gtkroomlist.c Thu Jun 10 19:24:05 2021 -0500
+++ b/pidgin/gtkroomlist.c Thu Jun 10 21:21:48 2021 -0500
@@ -66,14 +66,6 @@
GHashTable *cats; /* Meow. */
gint num_rooms, total_rooms;
- PangoLayout *tip_layout;
- PangoLayout *tip_name_layout;
@@ -361,62 +353,19 @@
-#define TOOLTIP_BORDER 12
-pidgin_roomlist_paint_tooltip(GtkWidget *widget, cairo_t *cr, gpointer user_data)
+pidgin_roomlist_query_tooltip(GtkWidget *widget, int x, int y, + gboolean keyboard_mode, GtkTooltip *tooltip, - PurpleRoomlist *list = user_data;
+ PurpleRoomlist *list = data; PidginRoomlist *grl = NULL;
- int current_height, max_width;
- GtkStyleContext *context;
- grl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
- dir = gtk_widget_get_direction(GTK_WIDGET(grl->tree));
- context = gtk_widget_get_style_context(grl->tipwindow);
- gtk_style_context_add_class(context, GTK_STYLE_CLASS_TOOLTIP);
- max_text_width = MAX(grl->tip_width, grl->tip_name_width);
- max_width = TOOLTIP_BORDER + SMALL_SPACE + max_text_width + TOOLTIP_BORDER;
- if (dir == GTK_TEXT_DIR_RTL) {
- gtk_render_layout(context, cr,
- max_width - (TOOLTIP_BORDER + SMALL_SPACE) - PANGO_PIXELS(600000),
- gtk_render_layout(context, cr,
- TOOLTIP_BORDER + SMALL_SPACE,
- if (dir != GTK_TEXT_DIR_RTL) {
- gtk_render_layout(context, cr,
- TOOLTIP_BORDER + SMALL_SPACE,
- current_height + grl->tip_name_height,
- gtk_render_layout(context, cr,
- max_width - (TOOLTIP_BORDER + SMALL_SPACE) - PANGO_PIXELS(600000),
- current_height + grl->tip_name_height,
-static gboolean pidgin_roomlist_create_tip(PurpleRoomlist *list, GtkTreePath *path)
- PidginRoomlist *grl = NULL;
+ GtkTreePath *path = NULL; PurpleRoomlistRoom *room;
- gchar *name, *tmp, *node_name;
GString *tooltip_text = NULL;
@@ -424,43 +373,78 @@
grl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
- if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), grl->tip_rect.x, grl->tip_rect.y + (grl->tip_rect.height/2),
- &path, NULL, NULL, NULL))
- gtk_tree_model_get_iter(GTK_TREE_MODEL(grl->model), &iter, path);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + if (!gtk_tree_selection_get_selected(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); - gtk_tree_model_get_value(GTK_TREE_MODEL(grl->model), &iter, ROOM_COLUMN, &val);
+ gtk_tree_model_get_value(GTK_TREE_MODEL(grl->model), &iter, ROOM_COLUMN, room = g_value_get_pointer(&val);
- if (!room || !(purple_roomlist_room_get_room_type(room) & PURPLE_ROOMLIST_ROOMTYPE_ROOM))
+ !(purple_roomlist_room_get_room_type(room) & PURPLE_ROOMLIST_ROOMTYPE_ROOM)) + 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); - l = purple_roomlist_room_get_fields(room),
- k = purple_roomlist_get_fields(list);
- l && k; j++, l = l->next, k = k->next)
+ l = purple_roomlist_room_get_fields(room), + k = purple_roomlist_get_fields(list); + j++, l = l->next, k = k->next) PurpleRoomlistField *f = k->data;
- if (purple_roomlist_field_get_hidden(f))
+ if (purple_roomlist_field_get_hidden(f)) { label = g_markup_escape_text(purple_roomlist_field_get_label(f), -1);
switch (purple_roomlist_field_get_field_type(f)) {
case PURPLE_ROOMLIST_FIELD_BOOL:
- g_string_append_printf(tooltip_text, "%s<b>%s:</b> %s", first ? "" : "\n", label, l->data ? "True" : "False");
+ g_string_append_printf( + tooltip_text, "%s<b>%s:</b> %s", first ? "" : "\n", label, + l->data ? "True" : "False"); case PURPLE_ROOMLIST_FIELD_INT:
- g_string_append_printf(tooltip_text, "%s<b>%s:</b> %d", first ? "" : "\n", label, GPOINTER_TO_INT(l->data));
+ g_string_append_printf( + tooltip_text, "%s<b>%s:</b> %d", first ? "" : "\n", label, + GPOINTER_TO_INT(l->data)); case PURPLE_ROOMLIST_FIELD_STRING:
tmp = g_markup_escape_text((char *)l->data, -1);
- g_string_append_printf(tooltip_text, "%s<b>%s:</b> %s", first ? "" : "\n", label, tmp);
+ g_string_append_printf( + tooltip_text, "%s<b>%s:</b> %s", first ? "" : "\n", label, @@ -468,53 +452,11 @@
- grl->tip_layout = gtk_widget_create_pango_layout(grl->tipwindow, NULL);
- grl->tip_name_layout = gtk_widget_create_pango_layout(grl->tipwindow, NULL);
- tmp = g_markup_escape_text(name, -1);
- node_name = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", tmp);
- pango_layout_set_markup(grl->tip_layout, tooltip_text->str, -1);
- pango_layout_set_wrap(grl->tip_layout, PANGO_WRAP_WORD);
- pango_layout_set_width(grl->tip_layout, 600000);
- pango_layout_get_size (grl->tip_layout, &grl->tip_width, &grl->tip_height);
- grl->tip_width = PANGO_PIXELS(grl->tip_width);
- grl->tip_height = PANGO_PIXELS(grl->tip_height);
- pango_layout_set_markup(grl->tip_name_layout, node_name, -1);
- pango_layout_set_wrap(grl->tip_name_layout, PANGO_WRAP_WORD);
- pango_layout_set_width(grl->tip_name_layout, 600000);
- pango_layout_get_size (grl->tip_name_layout, &grl->tip_name_width, &grl->tip_name_height);
- grl->tip_name_width = PANGO_PIXELS(grl->tip_name_width) + SMALL_SPACE;
- grl->tip_name_height = MAX(PANGO_PIXELS(grl->tip_name_height), SMALL_SPACE);
+ 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);
- g_string_free(tooltip_text, TRUE);
-pidgin_roomlist_create_tooltip(GtkWidget *widget, GtkTreePath *path,
- gpointer data, int *w, int *h)
- PurpleRoomlist *list = data;
- PidginRoomlist *grl = NULL;
- grl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
- grl->tipwindow = widget;
- if (!pidgin_roomlist_create_tip(data, path))
- *w = TOOLTIP_BORDER + SMALL_SPACE +
- MAX(grl->tip_width, grl->tip_name_width) + TOOLTIP_BORDER;
- *h = TOOLTIP_BORDER + grl->tip_height + grl->tip_name_height
@@ -789,9 +731,9 @@
g_signal_connect(G_OBJECT(tree), "motion-notify-event", G_CALLBACK(row_motion_cb), list);
g_signal_connect(G_OBJECT(tree), "leave-notify-event", G_CALLBACK(row_leave_cb), list);
- pidgin_tooltip_setup_for_treeview(tree, list,
- pidgin_roomlist_create_tooltip,
- pidgin_roomlist_paint_tooltip);
+ gtk_widget_set_has_tooltip(tree, TRUE); + g_signal_connect(G_OBJECT(tree), "query-tooltip", + G_CALLBACK(pidgin_roomlist_query_tooltip), list); /* Enable CTRL+F searching */
gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree), NAME_COLUMN);