MODULE media ; (* m2-GTK4 example - media: a GdkTexture shown in a GtkPicture. Generates a PNG with Cairo at run time, loads it as a texture and displays it; a GtkVideo widget is added as a placeholder. Build: make examples Run: ./build/examples/media *) 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 GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing; FROM GtkEnums IMPORT GtkVertical; FROM GtkPicture IMPORT gtk_picture_new, gtk_picture_set_paintable; FROM GtkVideo IMPORT gtk_video_new; FROM GdkTexture IMPORT gdk_texture_new_from_filename; FROM GError IMPORT GError; FROM Cairo IMPORT cairo_image_surface_create, cairo_create, cairo_destroy, cairo_surface_destroy, cairo_set_source_rgb, cairo_rectangle, cairo_fill, cairo_surface_write_to_png, CairoFormatARGB32; FROM GtkClosures IMPORT Connect2; FROM GtkUtils IMPORT ClearError; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Media"; PngPath = "/tmp/opencode/m2media_demo.png"; PROCEDURE MakePng; VAR surface, cr: ADDRESS; BEGIN surface := cairo_image_surface_create(CairoFormatARGB32, 200, 120); cr := cairo_create(surface); cairo_set_source_rgb(cr, 0.16, 0.50, 0.72); cairo_rectangle(cr, 0.0, 0.0, 200.0, 120.0); cairo_fill(cr); cairo_destroy(cr); cairo_surface_write_to_png(surface, PngPath); cairo_surface_destroy(surface) END MakePng; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, picture, video, texture: ADDRESS; err: GError; BEGIN MakePng(); err := NIL; texture := gdk_texture_new_from_filename(PngPath, err); picture := gtk_picture_new(); IF texture # NIL THEN gtk_picture_set_paintable(picture, texture) ELSE printf("could not load %s\n", PngPath); ClearError(err) END; video := gtk_video_new(); box := gtk_box_new(GtkVertical, 8); gtk_box_set_spacing(box, 8); gtk_box_append(box, picture); gtk_box_append(box, video); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Media"); gtk_window_set_default_size(window, 320, 320); gtk_window_set_child(window, box); 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 media.