Windows, GL renderer: Each time a popover is shown, memory usage climbs by roughly ~20MB (and isn't freed)
- GTK4 version: MSVC 4.8.1
- GSK Renderer: GL (though, when specifying
GSK_RENDERER=vulkan
,GL
is still used according to GTK Inspector's "Global" page)
#include <gtk-4.0/gtk/gtk.h>
#include <stdio.h>
GtkBox* container;
static void
popover_closed(GtkPopover* self)
{
// Clean up remaining reference to the popover
gtk_box_remove(container, GTK_WIDGET(self));
}
static void
pressed(GtkGestureClick* self, gint n_press, gdouble x, gdouble y, gpointer user_data)
{
GtkPopover* popover = GTK_POPOVER(gtk_popover_new());
gtk_box_insert_child_after(container, GTK_WIDGET(popover), NULL);
gtk_popover_set_child(popover, gtk_button_new());
gtk_popover_popup(popover);
g_signal_connect(popover, "closed", G_CALLBACK(popover_closed), NULL);
}
static void
activate(GtkApplication* app,
gpointer user_data)
{
GtkWindow* window = GTK_WINDOW(gtk_application_window_new(app));
gtk_window_set_title(window, "Window");
gtk_window_set_default_size(window, 200, 200);
container = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
GtkLabel* label = GTK_LABEL(gtk_label_new("click me"));
gtk_box_insert_child_after(container, GTK_WIDGET(label), NULL);
gtk_window_set_child(window, GTK_WIDGET(container));
GtkGestureClick* click_gesture = GTK_GESTURE_CLICK(gtk_gesture_click_new());
gtk_widget_add_controller(GTK_WIDGET(label), GTK_EVENT_CONTROLLER(click_gesture));
g_signal_connect(click_gesture, "pressed", G_CALLBACK(pressed), NULL);
gtk_window_present(window);
}
int
main(int argc,
char** argv)
{
GtkApplication* app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
Note that specifying GSK_RENDERER=cairo
works around the leak (or, at least, makes it small enough that it's hard to notice).
This is likely related to #4307 (closed)
Edited by Mitchell Hentges