MODULE test_drawing ; (* m2-GTK4 test - GtkDrawingArea with a Cairo draw callback. Presents a window with a drawing area and checks (from a timeout, once it has been drawn) that the callback ran. Requires a display. *) FROM Gio IMPORT g_application_run, g_application_quit; FROM GtkApplication IMPORT gtk_application_new; FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child, gtk_window_present; FROM GtkDrawingArea IMPORT gtk_drawing_area_new, gtk_drawing_area_set_content_width, gtk_drawing_area_set_content_height, gtk_drawing_area_get_content_width, gtk_drawing_area_get_content_height, gtk_drawing_area_set_draw_func; FROM Cairo IMPORT cairo_set_source_rgb, cairo_rectangle, cairo_fill; FROM GtkUtils IMPORT Connect; FROM GLib IMPORT g_timeout_add, GSourceRemove; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.TestDrawing"; VAR app: ADDRESS; passed, drew: BOOLEAN; (* void draw(GtkDrawingArea *area, cairo_t *cr, int w, int h, gpointer data) *) PROCEDURE Draw (area: ADDRESS; cr: ADDRESS; width, height: INTEGER; data: ADDRESS); BEGIN drew := TRUE; cairo_set_source_rgb(cr, 0.90, 0.30, 0.20); cairo_rectangle(cr, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height)); cairo_fill(cr); cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); cairo_rectangle(cr, 20.0, 20.0, 60.0, 40.0); cairo_fill(cr) END Draw; PROCEDURE AfterMap (data: ADDRESS) : INTEGER; BEGIN IF NOT drew THEN printf("draw callback did not run\n"); passed := FALSE END; g_application_quit(app); RETURN GSourceRemove END AfterMap; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, area: ADDRESS; ok: BOOLEAN; BEGIN ok := TRUE; drew := FALSE; area := gtk_drawing_area_new(); gtk_drawing_area_set_content_width(area, 200); gtk_drawing_area_set_content_height(area, 120); IF gtk_drawing_area_get_content_width(area) # 200 THEN printf("content width wrong\n"); ok := FALSE END; IF gtk_drawing_area_get_content_height(area) # 120 THEN printf("content height wrong\n"); ok := FALSE END; gtk_drawing_area_set_draw_func(area, ADR(Draw), NIL, NIL); window := gtk_application_window_new(application); gtk_window_set_child(window, area); gtk_window_present(window); passed := ok; g_timeout_add(300, AfterMap, NIL) END OnActivate; VAR rc: INTEGER; BEGIN passed := FALSE; app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("test_drawing: FAIL (no app)\n"); HALT(1) END; Connect(app, "activate", ADR(OnActivate), NIL); rc := g_application_run(app, 0, NIL); IF passed THEN printf("test_drawing: PASS\n"); HALT(0) ELSE printf("test_drawing: FAIL\n"); HALT(1) END END test_drawing.