diff -r 1c25eac61c19 -r bf7c5e88e5e7 pidgin/pidgintooltip.c --- a/pidgin/pidgintooltip.c Tue Jun 08 01:45:21 2021 -0500 +++ b/pidgin/pidgintooltip.c Thu Jun 10 17:18:56 2021 -0500 @@ -42,15 +42,8 @@ GtkWidget *widget; gpointer userdata; PidginTooltipPaint paint_tooltip; - union { - struct { - PidginTooltipCreateForTree create_tooltip; - GtkTreePath *path; - } treeview; - struct { - PidginTooltipCreate create_tooltip; - } widget; - } common; + PidginTooltipCreateForTree create_tooltip; + GtkTreePath *path; } PidginTooltipData; static void @@ -70,8 +63,9 @@ static void destroy_tooltip_data(PidginTooltipData *data) { - if (data->common.treeview.path) - gtk_tree_path_free(data->common.treeview.path); + if (data->path) { + gtk_tree_path_free(data->path); + } pidgin_tooltip_destroy(); g_free(data); } @@ -221,53 +215,35 @@ static void reset_data_treepath(PidginTooltipData *data) { - gtk_tree_path_free(data->common.treeview.path); - data->common.treeview.path = NULL; + gtk_tree_path_free(data->path); + data->path = NULL; } -static void -pidgin_tooltip_draw(PidginTooltipData *data) +static gboolean +pidgin_tooltip_timeout(gpointer userdata) { - GtkWidget *tipwindow; - int w, h; - - pidgin_tooltip_destroy(); - - pidgin_tooltip.widget = gtk_widget_get_toplevel(data->widget); - pidgin_tooltip.tipwindow = tipwindow = setup_tooltip_window(); - pidgin_tooltip.paint_tooltip = data->paint_tooltip; - - if (!data->common.widget.create_tooltip(tipwindow, data->userdata, &w, &h)) { - if (tipwindow == pidgin_tooltip.tipwindow) - pidgin_tooltip_destroy(); - return; - } - - setup_tooltip_window_position(data->userdata, w, h); -} - -static void -pidgin_tooltip_draw_tree(PidginTooltipData *data) -{ + PidginTooltipData *data = (PidginTooltipData *)userdata; GtkWidget *tipwindow; GtkTreePath *path = NULL; int w, h; + pidgin_tooltip.timeout = 0; + if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(data->widget), pidgin_tooltip.tip_rect.x, pidgin_tooltip.tip_rect.y + (pidgin_tooltip.tip_rect.height/2), &path, NULL, NULL, NULL)) { pidgin_tooltip_destroy(); - return; + return FALSE; } - if (data->common.treeview.path) { - if (gtk_tree_path_compare(data->common.treeview.path, path) == 0) { + if (data->path) { + if (gtk_tree_path_compare(data->path, path) == 0) { gtk_tree_path_free(path); - return; + return FALSE; } - gtk_tree_path_free(data->common.treeview.path); - data->common.treeview.path = NULL; + gtk_tree_path_free(data->path); + data->path = NULL; } pidgin_tooltip_destroy(); @@ -276,29 +252,19 @@ pidgin_tooltip.tipwindow = tipwindow = setup_tooltip_window(); pidgin_tooltip.paint_tooltip = data->paint_tooltip; - if (!data->common.treeview.create_tooltip(tipwindow, path, data->userdata, &w, &h)) { + if (!data->create_tooltip(tipwindow, path, data->userdata, &w, &h)) { if (tipwindow == pidgin_tooltip.tipwindow) pidgin_tooltip_destroy(); gtk_tree_path_free(path); - return; + return FALSE; } setup_tooltip_window_position(data->userdata, w, h); - data->common.treeview.path = path; + data->path = path; g_signal_connect_swapped(G_OBJECT(pidgin_tooltip.tipwindow), "destroy", G_CALLBACK(reset_data_treepath), data); -} -static gboolean -pidgin_tooltip_timeout(gpointer data) -{ - PidginTooltipData *tdata = data; - pidgin_tooltip.timeout = 0; - if (GTK_IS_TREE_VIEW(tdata->widget)) - pidgin_tooltip_draw_tree(data); - else - pidgin_tooltip_draw(data); return FALSE; } @@ -349,7 +315,7 @@ PidginTooltipData *tdata = g_new0(PidginTooltipData, 1); tdata->widget = tree; tdata->userdata = userdata; - tdata->common.treeview.create_tooltip = create_tooltip; + tdata->create_tooltip = create_tooltip; tdata->paint_tooltip = paint_tooltip; g_signal_connect(G_OBJECT(tree), "motion-notify-event", G_CALLBACK(row_motion_cb), tdata); @@ -358,33 +324,3 @@ g_signal_connect_swapped(G_OBJECT(tree), "destroy", G_CALLBACK(destroy_tooltip_data), tdata); return TRUE; } - -static gboolean -widget_motion_cb(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - initialize_tooltip_delay(); - - pidgin_tooltip_destroy(); - if (!enable_tooltips) - return FALSE; - - pidgin_tooltip.timeout = g_timeout_add(tooltip_delay, (GSourceFunc)pidgin_tooltip_timeout, data); - return FALSE; -} - -gboolean pidgin_tooltip_setup_for_widget(GtkWidget *widget, gpointer userdata, - PidginTooltipCreate create_tooltip, PidginTooltipPaint paint_tooltip) -{ - PidginTooltipData *wdata = g_new0(PidginTooltipData, 1); - wdata->widget = widget; - wdata->userdata = userdata; - wdata->common.widget.create_tooltip = create_tooltip; - wdata->paint_tooltip = paint_tooltip; - - g_signal_connect(G_OBJECT(widget), "motion-notify-event", G_CALLBACK(widget_motion_cb), wdata); - g_signal_connect(G_OBJECT(widget), "leave-notify-event", G_CALLBACK(widget_leave_cb), NULL); - g_signal_connect(G_OBJECT(widget), "scroll-event", G_CALLBACK(widget_leave_cb), NULL); - g_signal_connect_swapped(G_OBJECT(widget), "destroy", G_CALLBACK(destroy_tooltip_data), wdata); - return TRUE; -} -