I'm not sure if the shaders created by init_shaders() are deleted
automatically when the widget's window is closed. This change
deletes them on the GtkWidget's unrealize event.
---
 board3d/GLwidget.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/board3d/GLwidget.c b/board3d/GLwidget.c
index 95ad2650..feaef0e9 100644
--- a/board3d/GLwidget.c
+++ b/board3d/GLwidget.c
@@ -333,6 +333,19 @@ realize_event(GtkWidget* widget, const GLWidgetData* 
glwData)
        gtk_widget_queue_draw(widget);
 }
 
+static void
+unrealize_event(GtkWidget* self, gpointer user_data)
+{
+       GLWidgetMakeCurrent(self);
+
+       if (glIsProgram(basicShader.shader)) {
+               glDeleteProgram(basicShader.shader);
+       }
+       if (glIsProgram(mainShader.shader)) {
+               glDeleteProgram(mainShader.shader);
+       }
+}
+
 static void
 resize_event(GtkGLArea* widget, gint UNUSED(width), gint UNUSED(height), const 
GLWidgetData* glwData)
 {
@@ -407,8 +420,10 @@ GtkWidget* GLWidgetCreate(RealizeCB realizeCB, ConfigureCB 
configureCB, ExposeCB
        glwData->configureCB = configureCB;
        glwData->exposeCB = exposeCB;
 
-       if (realizeCB != NULL)
+       if (realizeCB != NULL) {
                g_signal_connect(G_OBJECT(pw), "realize", 
G_CALLBACK(realize_event), glwData);
+               g_signal_connect(G_OBJECT(pw), "unrealize", 
G_CALLBACK(unrealize_event), NULL);
+       }
        if (configureCB != NULL)
                g_signal_connect(G_OBJECT(pw), "resize", 
G_CALLBACK(resize_event), glwData);
        if (exposeCB != NULL)
-- 
2.34.1


Reply via email to