MODULE test_snapshot ; (* m2-GTK4 test - a GdkPaintable whose snapshot uses GtkSnapshot and Graphene from Modula-2 (via the shim). 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 GtkPicture IMPORT gtk_picture_new, gtk_picture_set_paintable; FROM GtkWidget IMPORT gtk_widget_set_size_request; FROM M2GtkShim IMPORT m2_snapshot_paintable_new; FROM GtkSnapshot IMPORT gtk_snapshot_append_color, gtk_snapshot_append_cairo; FROM Graphene IMPORT GrapheneRect, graphene_rect_init; FROM Gdk IMPORT GdkRGBA; FROM Cairo IMPORT cairo_set_source_rgb, cairo_rectangle, cairo_fill, cairo_destroy; FROM GLib IMPORT g_timeout_add, GSourceRemove; FROM GtkUtils IMPORT Connect; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.TestSnapshot"; VAR app: ADDRESS; passed, drew: BOOLEAN; (* void draw(GtkSnapshot *snapshot, int width, int height, gpointer user) *) PROCEDURE Draw (snapshot: ADDRESS; width, height: INTEGER; user: ADDRESS); VAR rect: GrapheneRect; color: GdkRGBA; cr: ADDRESS; BEGIN drew := TRUE; graphene_rect_init(rect, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height)); color.red := 0.16; color.green := 0.50; color.blue := 0.72; color.alpha := 1.0; gtk_snapshot_append_color(snapshot, color, rect); cr := gtk_snapshot_append_cairo(snapshot, rect); IF cr # NIL THEN cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); cairo_rectangle(cr, 8.0, 8.0, 24.0, 24.0); cairo_fill(cr); cairo_destroy(cr) END END Draw; PROCEDURE AfterMap (data: ADDRESS) : INTEGER; BEGIN IF NOT drew THEN printf("snapshot draw did not run\n"); passed := FALSE END; g_application_quit(app); RETURN GSourceRemove END AfterMap; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, picture, paintable: ADDRESS; BEGIN drew := FALSE; paintable := m2_snapshot_paintable_new(ADR(Draw), 80, 60, NIL, NIL); picture := gtk_picture_new(); gtk_picture_set_paintable(picture, paintable); gtk_widget_set_size_request(picture, 80, 60); window := gtk_application_window_new(application); gtk_window_set_child(window, picture); gtk_window_present(window); passed := TRUE; 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_snapshot: 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_snapshot: PASS\n"); HALT(0) ELSE printf("test_snapshot: FAIL\n"); HALT(1) END END test_snapshot.