test_drawing.mod 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. MODULE test_drawing ;
  2. (*
  3. m2-GTK4 test - GtkDrawingArea with a Cairo draw callback.
  4. Presents a window with a drawing area and checks (from a timeout,
  5. once it has been drawn) that the callback ran. Requires a display.
  6. *)
  7. FROM Gio IMPORT g_application_run, g_application_quit;
  8. FROM GtkApplication IMPORT gtk_application_new;
  9. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child,
  10. gtk_window_present;
  11. FROM GtkDrawingArea IMPORT gtk_drawing_area_new,
  12. gtk_drawing_area_set_content_width, gtk_drawing_area_set_content_height,
  13. gtk_drawing_area_get_content_width, gtk_drawing_area_get_content_height,
  14. gtk_drawing_area_set_draw_func;
  15. FROM Cairo IMPORT cairo_set_source_rgb, cairo_rectangle, cairo_fill;
  16. FROM GtkUtils IMPORT Connect;
  17. FROM GLib IMPORT g_timeout_add, GSourceRemove;
  18. FROM SYSTEM IMPORT ADDRESS, ADR;
  19. FROM libc IMPORT printf;
  20. CONST
  21. AppId = "org.example.m2gtk4.TestDrawing";
  22. VAR
  23. app: ADDRESS;
  24. passed, drew: BOOLEAN;
  25. (* void draw(GtkDrawingArea *area, cairo_t *cr, int w, int h, gpointer data) *)
  26. PROCEDURE Draw (area: ADDRESS; cr: ADDRESS; width, height: INTEGER;
  27. data: ADDRESS);
  28. BEGIN
  29. drew := TRUE;
  30. cairo_set_source_rgb(cr, 0.90, 0.30, 0.20);
  31. cairo_rectangle(cr, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height));
  32. cairo_fill(cr);
  33. cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
  34. cairo_rectangle(cr, 20.0, 20.0, 60.0, 40.0);
  35. cairo_fill(cr)
  36. END Draw;
  37. PROCEDURE AfterMap (data: ADDRESS) : INTEGER;
  38. BEGIN
  39. IF NOT drew THEN
  40. printf("draw callback did not run\n");
  41. passed := FALSE
  42. END;
  43. g_application_quit(app);
  44. RETURN GSourceRemove
  45. END AfterMap;
  46. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  47. VAR
  48. window, area: ADDRESS;
  49. ok: BOOLEAN;
  50. BEGIN
  51. ok := TRUE;
  52. drew := FALSE;
  53. area := gtk_drawing_area_new();
  54. gtk_drawing_area_set_content_width(area, 200);
  55. gtk_drawing_area_set_content_height(area, 120);
  56. IF gtk_drawing_area_get_content_width(area) # 200 THEN
  57. printf("content width wrong\n"); ok := FALSE
  58. END;
  59. IF gtk_drawing_area_get_content_height(area) # 120 THEN
  60. printf("content height wrong\n"); ok := FALSE
  61. END;
  62. gtk_drawing_area_set_draw_func(area, ADR(Draw), NIL, NIL);
  63. window := gtk_application_window_new(application);
  64. gtk_window_set_child(window, area);
  65. gtk_window_present(window);
  66. passed := ok;
  67. g_timeout_add(300, AfterMap, NIL)
  68. END OnActivate;
  69. VAR
  70. rc: INTEGER;
  71. BEGIN
  72. passed := FALSE;
  73. app := gtk_application_new(AppId, 0);
  74. IF app = NIL THEN
  75. printf("test_drawing: FAIL (no app)\n");
  76. HALT(1)
  77. END;
  78. Connect(app, "activate", ADR(OnActivate), NIL);
  79. rc := g_application_run(app, 0, NIL);
  80. IF passed THEN
  81. printf("test_drawing: PASS\n");
  82. HALT(0)
  83. ELSE
  84. printf("test_drawing: FAIL\n");
  85. HALT(1)
  86. END
  87. END test_drawing.