MODULE gestures ; (* m2-GTK4 example - gestures on a drawing area. A GtkGestureClick reports the click position and a GtkGestureDrag reports the drag offset, both in a label. Demonstrates connecting signals with the exact C callback signatures. Build: make examples Run: ./build/examples/gestures *) 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 GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing; FROM GtkEnums IMPORT GtkVertical; FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text; 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 GtkWidget IMPORT gtk_widget_add_controller; FROM GtkGestures IMPORT gtk_gesture_click_new, gtk_gesture_drag_new; FROM Cairo IMPORT cairo_set_source_rgb, cairo_rectangle, cairo_fill; FROM GObject IMPORT g_signal_connect_data, GConnectDefault; FROM GtkUtils IMPORT Connect, IntToStr, StrAppend; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Gestures"; VAR label: ADDRESS; PROCEDURE Show (kind: ARRAY OF CHAR; a, b: REAL); VAR num: ARRAY [0..15] OF CHAR; line: ARRAY [0..63] OF CHAR; BEGIN line[0] := 0C; StrAppend(line, kind); IntToStr(TRUNC(a), num); StrAppend(line, num); StrAppend(line, ", "); IntToStr(TRUNC(b), num); StrAppend(line, num); gtk_label_set_text(label, line) END Show; (* void pressed(GtkGestureClick *g, int n, double x, double y, gpointer u) *) PROCEDURE OnPressed (g: ADDRESS; n_press: INTEGER; x, y: REAL; user: ADDRESS); BEGIN Show("click at ", x, y) END OnPressed; (* void drag-update(GtkGestureDrag *g, double ox, double oy, gpointer u) *) PROCEDURE OnDragUpdate (g: ADDRESS; offset_x, offset_y: REAL; user: ADDRESS); BEGIN Show("drag offset ", offset_x, offset_y) END OnDragUpdate; PROCEDURE Draw (area: ADDRESS; cr: ADDRESS; width, height: INTEGER; data: ADDRESS); BEGIN cairo_set_source_rgb(cr, 0.90, 0.93, 0.98); cairo_rectangle(cr, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height)); cairo_fill(cr) END Draw; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, area, click, drag: ADDRESS; BEGIN area := gtk_drawing_area_new(); gtk_drawing_area_set_content_width(area, 320); gtk_drawing_area_set_content_height(area, 200); gtk_drawing_area_set_draw_func(area, ADR(Draw), NIL, NIL); click := gtk_gesture_click_new(); g_signal_connect_data(click, "pressed", ADR(OnPressed), NIL, NIL, GConnectDefault); gtk_widget_add_controller(area, click); drag := gtk_gesture_drag_new(); g_signal_connect_data(drag, "drag-update", ADR(OnDragUpdate), NIL, NIL, GConnectDefault); gtk_widget_add_controller(area, drag); label := gtk_label_new("click or drag the area"); box := gtk_box_new(GtkVertical, 10); gtk_box_set_spacing(box, 10); gtk_box_append(box, area); gtk_box_append(box, label); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Gestures"); gtk_window_set_default_size(window, 360, 260); gtk_window_set_child(window, box); 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; Connect(app, "activate", ADR(OnActivate), NIL); g_application_run(app, 0, NIL) END gestures.