gestures.mod 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. MODULE gestures ;
  2. (*
  3. m2-GTK4 example - gestures on a drawing area.
  4. A GtkGestureClick reports the click position and a GtkGestureDrag
  5. reports the drag offset, both in a label. Demonstrates connecting
  6. signals with the exact C callback signatures.
  7. Build: make examples
  8. Run: ./build/examples/gestures
  9. *)
  10. FROM Gio IMPORT g_application_run;
  11. FROM GtkApplication IMPORT gtk_application_new;
  12. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
  13. gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
  14. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  15. FROM GtkEnums IMPORT GtkVertical;
  16. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
  17. FROM GtkDrawingArea IMPORT gtk_drawing_area_new,
  18. gtk_drawing_area_set_content_width,
  19. gtk_drawing_area_set_content_height, gtk_drawing_area_set_draw_func;
  20. FROM GtkWidget IMPORT gtk_widget_add_controller;
  21. FROM GtkGestures IMPORT gtk_gesture_click_new, gtk_gesture_drag_new;
  22. FROM Cairo IMPORT cairo_set_source_rgb, cairo_rectangle, cairo_fill;
  23. FROM GObject IMPORT g_signal_connect_data, GConnectDefault;
  24. FROM GtkUtils IMPORT Connect, IntToStr, StrAppend;
  25. FROM SYSTEM IMPORT ADDRESS, ADR;
  26. FROM libc IMPORT printf;
  27. CONST
  28. AppId = "org.example.m2gtk4.Gestures";
  29. VAR
  30. label: ADDRESS;
  31. PROCEDURE Show (kind: ARRAY OF CHAR; a, b: REAL);
  32. VAR
  33. num: ARRAY [0..15] OF CHAR;
  34. line: ARRAY [0..63] OF CHAR;
  35. BEGIN
  36. line[0] := 0C;
  37. StrAppend(line, kind);
  38. IntToStr(TRUNC(a), num);
  39. StrAppend(line, num);
  40. StrAppend(line, ", ");
  41. IntToStr(TRUNC(b), num);
  42. StrAppend(line, num);
  43. gtk_label_set_text(label, line)
  44. END Show;
  45. (* void pressed(GtkGestureClick *g, int n, double x, double y, gpointer u) *)
  46. PROCEDURE OnPressed (g: ADDRESS; n_press: INTEGER; x, y: REAL; user: ADDRESS);
  47. BEGIN
  48. Show("click at ", x, y)
  49. END OnPressed;
  50. (* void drag-update(GtkGestureDrag *g, double ox, double oy, gpointer u) *)
  51. PROCEDURE OnDragUpdate (g: ADDRESS; offset_x, offset_y: REAL; user: ADDRESS);
  52. BEGIN
  53. Show("drag offset ", offset_x, offset_y)
  54. END OnDragUpdate;
  55. PROCEDURE Draw (area: ADDRESS; cr: ADDRESS; width, height: INTEGER;
  56. data: ADDRESS);
  57. BEGIN
  58. cairo_set_source_rgb(cr, 0.90, 0.93, 0.98);
  59. cairo_rectangle(cr, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height));
  60. cairo_fill(cr)
  61. END Draw;
  62. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  63. VAR
  64. window, box, area, click, drag: ADDRESS;
  65. BEGIN
  66. area := gtk_drawing_area_new();
  67. gtk_drawing_area_set_content_width(area, 320);
  68. gtk_drawing_area_set_content_height(area, 200);
  69. gtk_drawing_area_set_draw_func(area, ADR(Draw), NIL, NIL);
  70. click := gtk_gesture_click_new();
  71. g_signal_connect_data(click, "pressed", ADR(OnPressed), NIL, NIL,
  72. GConnectDefault);
  73. gtk_widget_add_controller(area, click);
  74. drag := gtk_gesture_drag_new();
  75. g_signal_connect_data(drag, "drag-update", ADR(OnDragUpdate), NIL, NIL,
  76. GConnectDefault);
  77. gtk_widget_add_controller(area, drag);
  78. label := gtk_label_new("click or drag the area");
  79. box := gtk_box_new(GtkVertical, 10);
  80. gtk_box_set_spacing(box, 10);
  81. gtk_box_append(box, area);
  82. gtk_box_append(box, label);
  83. window := gtk_application_window_new(application);
  84. gtk_window_set_title(window, "m2-GTK4 Gestures");
  85. gtk_window_set_default_size(window, 360, 260);
  86. gtk_window_set_child(window, box);
  87. gtk_window_present(window)
  88. END OnActivate;
  89. VAR
  90. app: ADDRESS;
  91. BEGIN
  92. app := gtk_application_new(AppId, 0);
  93. IF app = NIL THEN
  94. printf("gtk_application_new failed\n");
  95. HALT(1)
  96. END;
  97. Connect(app, "activate", ADR(OnActivate), NIL);
  98. g_application_run(app, 0, NIL)
  99. END gestures.