gtk_widget_translate_coordinates doesn't not return meaningful value across different surface.
Steps to reproduce
- Create gtk application window
- Create GtkPopover
- call gtk_widget_translate_coordinates between GtkPopover and Gtk application window.
Current behavior
Returns (0,0) while the actual position can be obtained from underlying gdk popup surface.
Expected outcome
Returns the correct value.
Version information
Gtk 4.8.2
Additional information
Test program:
#include <gtk/gtk.h>
GtkWidget *window;
GtkWidget *button;
GtkWidget *popover;
static void phase1(GtkWidget *widget, gpointer data) {
popover = gtk_popover_new();
auto *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_halign(box, GTK_ALIGN_CENTER);
gtk_widget_set_valign(box, GTK_ALIGN_CENTER);
gtk_popover_set_child(GTK_POPOVER(popover), box);
auto *button = gtk_button_new_with_label("Button");
gtk_box_append(GTK_BOX(box), button);
GdkRectangle rect = {100, 100, 10, 10};
gtk_popover_set_pointing_to(GTK_POPOVER(popover), &rect);
gtk_widget_set_parent(popover, window);
gtk_popover_present(GTK_POPOVER(popover));
gtk_widget_show(popover);
g_timeout_add_once(
2000,
(GSourceOnceFunc) +
[]() {
g_warning("TIMEOUT");
double px, py;
gtk_widget_translate_coordinates(popover, window, 0, 0, &px, &py);
g_warning("popover against window: %lf, %lf", px, py);
},
nullptr);
}
static void activate(GtkApplication *app, gpointer user_data) {
GtkWidget *box;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Window");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_halign(box, GTK_ALIGN_CENTER);
gtk_widget_set_valign(box, GTK_ALIGN_CENTER);
gtk_window_set_child(GTK_WINDOW(window), box);
button = gtk_button_new_with_label("Step1");
g_signal_connect(button, "clicked", G_CALLBACK(phase1), NULL);
gtk_box_append(GTK_BOX(box), button);
gtk_widget_show(window);
}
int main(int argc, char *argv[]) {
GtkApplication *app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}