test_gestures.mod 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. MODULE test_gestures ;
  2. (*
  3. m2-GTK4 test - event controllers and gestures.
  4. Adds several gestures to a widget, checks the controller properties,
  5. connects a 5-argument "pressed" handler to a GtkGestureClick and emits
  6. the signal to verify the callback ABI. Requires a display.
  7. *)
  8. FROM Gio IMPORT g_application_run, g_application_quit;
  9. FROM GtkApplication IMPORT gtk_application_new;
  10. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child;
  11. FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
  12. FROM GtkLabel IMPORT gtk_label_new;
  13. FROM GtkEnums IMPORT GtkVertical, GtkHorizontal;
  14. FROM GtkWidget IMPORT gtk_widget_add_controller;
  15. FROM GtkEventController IMPORT gtk_event_controller_set_propagation_phase,
  16. gtk_event_controller_get_propagation_phase, gtk_event_controller_set_name,
  17. GtkPhaseBubble, gtk_event_controller_motion_new;
  18. FROM GtkGestures IMPORT gtk_gesture_click_new, gtk_gesture_drag_new,
  19. gtk_gesture_swipe_new, gtk_gesture_zoom_new, gtk_gesture_rotate_new,
  20. gtk_gesture_pan_new, gtk_gesture_long_press_new,
  21. gtk_gesture_single_set_button, gtk_gesture_single_get_button;
  22. FROM GObject IMPORT g_signal_connect_data, g_signal_emit_by_name,
  23. GConnectDefault;
  24. FROM GtkUtils IMPORT Connect;
  25. FROM SYSTEM IMPORT ADDRESS, ADR;
  26. FROM libc IMPORT printf;
  27. CONST
  28. AppId = "org.example.m2gtk4.TestGestures";
  29. VAR
  30. app: ADDRESS;
  31. passed: BOOLEAN;
  32. gotN: INTEGER;
  33. gotX, gotY: REAL;
  34. (* void pressed(GtkGestureClick *g, int n_press, double x, double y, gpointer u) *)
  35. PROCEDURE OnPressed (g: ADDRESS; n_press: INTEGER; x, y: REAL; user: ADDRESS);
  36. BEGIN
  37. gotN := n_press;
  38. gotX := x;
  39. gotY := y
  40. END OnPressed;
  41. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  42. VAR
  43. window, box, click, drag, swipe, zoom, rotate, pan, longpress, motion: ADDRESS;
  44. ex, ey: REAL;
  45. ok: BOOLEAN;
  46. BEGIN
  47. ok := TRUE;
  48. gotN := 0;
  49. gotX := 0.0;
  50. gotY := 0.0;
  51. box := gtk_box_new(GtkVertical, 4);
  52. click := gtk_gesture_click_new();
  53. IF click = NIL THEN printf("click NIL\n"); ok := FALSE END;
  54. gtk_widget_add_controller(box, click);
  55. gtk_event_controller_set_propagation_phase(click, GtkPhaseBubble);
  56. IF gtk_event_controller_get_propagation_phase(click) # GtkPhaseBubble THEN
  57. printf("propagation phase wrong\n"); ok := FALSE
  58. END;
  59. gtk_event_controller_set_name(click, "click-1");
  60. gtk_gesture_single_set_button(click, 1);
  61. IF gtk_gesture_single_get_button(click) # 1 THEN
  62. printf("gesture button wrong\n"); ok := FALSE
  63. END;
  64. drag := gtk_gesture_drag_new();
  65. swipe := gtk_gesture_swipe_new();
  66. zoom := gtk_gesture_zoom_new();
  67. rotate := gtk_gesture_rotate_new();
  68. pan := gtk_gesture_pan_new(GtkHorizontal);
  69. longpress := gtk_gesture_long_press_new();
  70. motion := gtk_event_controller_motion_new();
  71. gtk_widget_add_controller(box, drag);
  72. gtk_widget_add_controller(box, swipe);
  73. gtk_widget_add_controller(box, zoom);
  74. gtk_widget_add_controller(box, rotate);
  75. gtk_widget_add_controller(box, pan);
  76. gtk_widget_add_controller(box, longpress);
  77. gtk_widget_add_controller(box, motion);
  78. IF (drag = NIL) OR (swipe = NIL) OR (zoom = NIL) OR (rotate = NIL)
  79. OR (pan = NIL) OR (longpress = NIL) OR (motion = NIL) THEN
  80. printf("a gesture is NIL\n"); ok := FALSE
  81. END;
  82. g_signal_connect_data(click, "pressed", ADR(OnPressed), NIL, NIL,
  83. GConnectDefault);
  84. ex := 10.0;
  85. ey := 20.0;
  86. g_signal_emit_by_name(click, "pressed", 1, ex, ey);
  87. IF gotN # 1 THEN printf("n_press wrong\n"); ok := FALSE END;
  88. IF ABS(gotX - 10.0) > 0.001 THEN printf("x wrong\n"); ok := FALSE END;
  89. IF ABS(gotY - 20.0) > 0.001 THEN printf("y wrong\n"); ok := FALSE END;
  90. gtk_box_append(box, gtk_label_new("gestures"));
  91. window := gtk_application_window_new(application);
  92. gtk_window_set_child(window, box);
  93. passed := ok;
  94. g_application_quit(application)
  95. END OnActivate;
  96. VAR
  97. rc: INTEGER;
  98. BEGIN
  99. passed := FALSE;
  100. app := gtk_application_new(AppId, 0);
  101. IF app = NIL THEN
  102. printf("test_gestures: FAIL (no app)\n");
  103. HALT(1)
  104. END;
  105. Connect(app, "activate", ADR(OnActivate), NIL);
  106. rc := g_application_run(app, 0, NIL);
  107. IF passed THEN
  108. printf("test_gestures: PASS\n");
  109. HALT(0)
  110. ELSE
  111. printf("test_gestures: FAIL\n");
  112. HALT(1)
  113. END
  114. END test_gestures.