| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- 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.
|