MODULE test_gestures ; (* m2-GTK4 test - event controllers and gestures. Adds several gestures to a widget, checks the controller properties, connects a 5-argument "pressed" handler to a GtkGestureClick and emits the signal to verify the callback ABI. Requires a display. *) FROM Gio IMPORT g_application_run, g_application_quit; FROM GtkApplication IMPORT gtk_application_new; FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child; FROM GtkBox IMPORT gtk_box_new, gtk_box_append; FROM GtkLabel IMPORT gtk_label_new; FROM GtkEnums IMPORT GtkVertical, GtkHorizontal; FROM GtkWidget IMPORT gtk_widget_add_controller; FROM GtkEventController IMPORT gtk_event_controller_set_propagation_phase, gtk_event_controller_get_propagation_phase, gtk_event_controller_set_name, GtkPhaseBubble, gtk_event_controller_motion_new; FROM GtkGestures IMPORT gtk_gesture_click_new, gtk_gesture_drag_new, gtk_gesture_swipe_new, gtk_gesture_zoom_new, gtk_gesture_rotate_new, gtk_gesture_pan_new, gtk_gesture_long_press_new, gtk_gesture_single_set_button, gtk_gesture_single_get_button; FROM GObject IMPORT g_signal_connect_data, g_signal_emit_by_name, GConnectDefault; FROM GtkUtils IMPORT Connect; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.TestGestures"; VAR app: ADDRESS; passed: BOOLEAN; gotN: INTEGER; gotX, gotY: REAL; (* void pressed(GtkGestureClick *g, int n_press, double x, double y, gpointer u) *) PROCEDURE OnPressed (g: ADDRESS; n_press: INTEGER; x, y: REAL; user: ADDRESS); BEGIN gotN := n_press; gotX := x; gotY := y END OnPressed; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, click, drag, swipe, zoom, rotate, pan, longpress, motion: ADDRESS; ex, ey: REAL; ok: BOOLEAN; BEGIN ok := TRUE; gotN := 0; gotX := 0.0; gotY := 0.0; box := gtk_box_new(GtkVertical, 4); click := gtk_gesture_click_new(); IF click = NIL THEN printf("click NIL\n"); ok := FALSE END; gtk_widget_add_controller(box, click); gtk_event_controller_set_propagation_phase(click, GtkPhaseBubble); IF gtk_event_controller_get_propagation_phase(click) # GtkPhaseBubble THEN printf("propagation phase wrong\n"); ok := FALSE END; gtk_event_controller_set_name(click, "click-1"); gtk_gesture_single_set_button(click, 1); IF gtk_gesture_single_get_button(click) # 1 THEN printf("gesture button wrong\n"); ok := FALSE END; drag := gtk_gesture_drag_new(); swipe := gtk_gesture_swipe_new(); zoom := gtk_gesture_zoom_new(); rotate := gtk_gesture_rotate_new(); pan := gtk_gesture_pan_new(GtkHorizontal); longpress := gtk_gesture_long_press_new(); motion := gtk_event_controller_motion_new(); gtk_widget_add_controller(box, drag); gtk_widget_add_controller(box, swipe); gtk_widget_add_controller(box, zoom); gtk_widget_add_controller(box, rotate); gtk_widget_add_controller(box, pan); gtk_widget_add_controller(box, longpress); gtk_widget_add_controller(box, motion); IF (drag = NIL) OR (swipe = NIL) OR (zoom = NIL) OR (rotate = NIL) OR (pan = NIL) OR (longpress = NIL) OR (motion = NIL) THEN printf("a gesture is NIL\n"); ok := FALSE END; g_signal_connect_data(click, "pressed", ADR(OnPressed), NIL, NIL, GConnectDefault); ex := 10.0; ey := 20.0; g_signal_emit_by_name(click, "pressed", 1, ex, ey); IF gotN # 1 THEN printf("n_press wrong\n"); ok := FALSE END; IF ABS(gotX - 10.0) > 0.001 THEN printf("x wrong\n"); ok := FALSE END; IF ABS(gotY - 20.0) > 0.001 THEN printf("y wrong\n"); ok := FALSE END; gtk_box_append(box, gtk_label_new("gestures")); window := gtk_application_window_new(application); gtk_window_set_child(window, box); passed := ok; g_application_quit(application) END OnActivate; VAR rc: INTEGER; BEGIN passed := FALSE; app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("test_gestures: FAIL (no app)\n"); HALT(1) END; Connect(app, "activate", ADR(OnActivate), NIL); rc := g_application_run(app, 0, NIL); IF passed THEN printf("test_gestures: PASS\n"); HALT(0) ELSE printf("test_gestures: FAIL\n"); HALT(1) END END test_gestures.