snapshot.mod 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. MODULE snapshot ;
  2. (*
  3. m2-GTK4 example - a custom GdkPaintable drawn with GtkSnapshot and
  4. Graphene from Modula-2 (via the shim).
  5. Build: make examples
  6. Run: ./build/examples/snapshot
  7. *)
  8. FROM Gio IMPORT g_application_run;
  9. FROM GtkApplication IMPORT gtk_application_new;
  10. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
  11. gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
  12. FROM GtkPicture IMPORT gtk_picture_new, gtk_picture_set_paintable;
  13. FROM GtkWidget IMPORT gtk_widget_set_size_request;
  14. FROM M2GtkShim IMPORT m2_snapshot_paintable_new;
  15. FROM GtkSnapshot IMPORT gtk_snapshot_append_color,
  16. gtk_snapshot_append_cairo;
  17. FROM Graphene IMPORT GrapheneRect, graphene_rect_init;
  18. FROM Gdk IMPORT GdkRGBA;
  19. FROM Cairo IMPORT cairo_set_source_rgb, cairo_arc, cairo_fill, cairo_destroy;
  20. FROM GtkClosures IMPORT Connect2;
  21. FROM SYSTEM IMPORT ADDRESS, ADR;
  22. FROM libc IMPORT printf;
  23. CONST
  24. AppId = "org.example.m2gtk4.Snapshot";
  25. PROCEDURE Draw (snapshot: ADDRESS; width, height: INTEGER; user: ADDRESS);
  26. VAR
  27. rect: GrapheneRect;
  28. color: GdkRGBA;
  29. cr: ADDRESS;
  30. BEGIN
  31. graphene_rect_init(rect, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height));
  32. color.red := 0.12;
  33. color.green := 0.16;
  34. color.blue := 0.22;
  35. color.alpha := 1.0;
  36. gtk_snapshot_append_color(snapshot, color, rect);
  37. cr := gtk_snapshot_append_cairo(snapshot, rect);
  38. IF cr # NIL THEN
  39. cairo_set_source_rgb(cr, 0.20, 0.60, 0.90);
  40. cairo_arc(cr, VAL(REAL, width) / 2.0, VAL(REAL, height) / 2.0, 60.0,
  41. 0.0, 6.2831853);
  42. cairo_fill(cr);
  43. cairo_destroy(cr)
  44. END
  45. END Draw;
  46. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  47. VAR
  48. window, picture, paintable: ADDRESS;
  49. BEGIN
  50. paintable := m2_snapshot_paintable_new(ADR(Draw), 240, 160, NIL, NIL);
  51. picture := gtk_picture_new();
  52. gtk_picture_set_paintable(picture, paintable);
  53. gtk_widget_set_size_request(picture, 240, 160);
  54. window := gtk_application_window_new(application);
  55. gtk_window_set_title(window, "m2-GTK4 Snapshot");
  56. gtk_window_set_default_size(window, 280, 200);
  57. gtk_window_set_child(window, picture);
  58. gtk_window_present(window)
  59. END OnActivate;
  60. VAR
  61. app: ADDRESS;
  62. BEGIN
  63. app := gtk_application_new(AppId, 0);
  64. IF app = NIL THEN
  65. printf("gtk_application_new failed\n");
  66. HALT(1)
  67. END;
  68. Connect2(app, "activate", OnActivate, NIL);
  69. g_application_run(app, 0, NIL)
  70. END snapshot.