MODULE gl ; (* m2-GTK4 example - OpenGL in a GtkGLArea. A GtkGLArea with auto-render; the "render" callback clears the framebuffer to a colour. Build: make examples Run: ./build/examples/gl *) FROM Gio IMPORT g_application_run; FROM GtkApplication IMPORT gtk_application_new; FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title, gtk_window_set_default_size, gtk_window_set_child, gtk_window_present; FROM GtkGLArea IMPORT gtk_gl_area_new, gtk_gl_area_set_auto_render, gtk_gl_area_set_has_depth_buffer; FROM GL IMPORT glClear, glClearColor, GLColorBufferBit; FROM GObject IMPORT g_signal_connect_data, GConnectDefault; FROM GtkClosures IMPORT Connect2; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Gl"; (* gboolean render(GtkGLArea *area, GdkGLContext *context, gpointer user) *) PROCEDURE OnRender (area: ADDRESS; context: ADDRESS; user: ADDRESS) : INTEGER; BEGIN glClearColor(0.16, 0.50, 0.72, 1.0); glClear(GLColorBufferBit); RETURN 1 END OnRender; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, area: ADDRESS; BEGIN area := gtk_gl_area_new(); gtk_gl_area_set_auto_render(area, 1); gtk_gl_area_set_has_depth_buffer(area, 1); g_signal_connect_data(area, "render", ADR(OnRender), NIL, NIL, GConnectDefault); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 GL"); gtk_window_set_default_size(window, 400, 300); gtk_window_set_child(window, area); gtk_window_present(window) END OnActivate; VAR app: ADDRESS; BEGIN app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("gtk_application_new failed\n"); HALT(1) END; Connect2(app, "activate", OnActivate, NIL); g_application_run(app, 0, NIL) END gl.