MODULE drawing ; (* m2-GTK4 example - drawing with GtkDrawingArea, Cairo and Pango. Draws a filled circle, a line and a Pango text layout. Build: make examples Run: ./build/examples/drawing *) 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 GtkDrawingArea IMPORT gtk_drawing_area_new, gtk_drawing_area_set_content_width, gtk_drawing_area_set_content_height, gtk_drawing_area_set_draw_func; FROM Cairo IMPORT cairo_set_source_rgb, cairo_rectangle, cairo_fill, cairo_arc, cairo_set_line_width, cairo_stroke, cairo_move_to, cairo_line_to; FROM Pango IMPORT pango_font_description_from_string, pango_font_description_free, pango_layout_set_text, pango_layout_set_font_description; FROM PangoCairo IMPORT pango_cairo_create_layout, pango_cairo_show_layout; FROM GObject IMPORT g_object_unref; FROM GtkClosures IMPORT Connect2; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Drawing"; PROCEDURE Draw (area: ADDRESS; cr: ADDRESS; width, height: INTEGER; data: ADDRESS); VAR layout, desc: ADDRESS; BEGIN cairo_set_source_rgb(cr, 0.95, 0.95, 0.97); cairo_rectangle(cr, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height)); cairo_fill(cr); cairo_set_source_rgb(cr, 0.20, 0.50, 0.90); cairo_arc(cr, 80.0, 80.0, 50.0, 0.0, 6.2831853); cairo_fill(cr); cairo_set_source_rgb(cr, 0.90, 0.20, 0.20); cairo_set_line_width(cr, 6.0); cairo_move_to(cr, 150.0, 40.0); cairo_line_to(cr, 330.0, 140.0); cairo_stroke(cr); layout := pango_cairo_create_layout(cr); desc := pango_font_description_from_string("Sans Bold 18"); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_set_text(layout, "Cairo + Pango from Modula-2", -1); cairo_set_source_rgb(cr, 0.10, 0.10, 0.10); cairo_move_to(cr, 20.0, 160.0); pango_cairo_show_layout(cr, layout); g_object_unref(layout) END Draw; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, area: ADDRESS; BEGIN area := gtk_drawing_area_new(); gtk_drawing_area_set_content_width(area, 360); gtk_drawing_area_set_content_height(area, 200); gtk_drawing_area_set_draw_func(area, ADR(Draw), NIL, NIL); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Drawing"); gtk_window_set_default_size(window, 400, 240); 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 drawing.