MODULE snapshot ; (* m2-GTK4 example - a custom GdkPaintable drawn with GtkSnapshot and Graphene from Modula-2 (via the shim). Build: make examples Run: ./build/examples/snapshot *) 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 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_arc, cairo_fill, cairo_destroy; FROM GtkClosures IMPORT Connect2; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Snapshot"; PROCEDURE Draw (snapshot: ADDRESS; width, height: INTEGER; user: ADDRESS); VAR rect: GrapheneRect; color: GdkRGBA; cr: ADDRESS; BEGIN graphene_rect_init(rect, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height)); color.red := 0.12; color.green := 0.16; color.blue := 0.22; 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, 0.20, 0.60, 0.90); cairo_arc(cr, VAL(REAL, width) / 2.0, VAL(REAL, height) / 2.0, 60.0, 0.0, 6.2831853); cairo_fill(cr); cairo_destroy(cr) END END Draw; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, picture, paintable: ADDRESS; BEGIN paintable := m2_snapshot_paintable_new(ADR(Draw), 240, 160, NIL, NIL); picture := gtk_picture_new(); gtk_picture_set_paintable(picture, paintable); gtk_widget_set_size_request(picture, 240, 160); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Snapshot"); gtk_window_set_default_size(window, 280, 200); gtk_window_set_child(window, picture); 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 snapshot.