counter.mod 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. MODULE counter ;
  2. (*
  3. m2-GTK4 example - a button that updates a label.
  4. Demonstrates the widget/layout set (GtkWindow > GtkBox > label &
  5. button) and a "clicked" signal handler that mutates Modula-2 state.
  6. Build: make examples
  7. Run: ./build/examples/counter
  8. *)
  9. FROM Gio IMPORT g_application_run;
  10. FROM GtkApplication IMPORT gtk_application_new;
  11. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
  12. gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
  13. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  14. FROM GtkEnums IMPORT GtkVertical;
  15. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
  16. FROM GtkButton IMPORT gtk_button_new_with_label;
  17. FROM GtkUtils IMPORT IntToStr, Connect;
  18. FROM SYSTEM IMPORT ADDRESS, ADR;
  19. FROM libc IMPORT printf;
  20. CONST
  21. AppId = "org.example.m2gtk4.Counter";
  22. VAR
  23. label: ADDRESS;
  24. count: INTEGER;
  25. (* void clicked(GtkButton *button, gpointer user_data) *)
  26. PROCEDURE OnClicked (button: ADDRESS; data: ADDRESS);
  27. VAR
  28. text: ARRAY [0..31] OF CHAR;
  29. BEGIN
  30. INC(count);
  31. IntToStr(count, text);
  32. gtk_label_set_text(label, text)
  33. END OnClicked;
  34. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  35. VAR
  36. window, box, button: ADDRESS;
  37. text: ARRAY [0..31] OF CHAR;
  38. BEGIN
  39. window := gtk_application_window_new(application);
  40. gtk_window_set_title(window, "m2-GTK4 Counter");
  41. gtk_window_set_default_size(window, 320, 180);
  42. box := gtk_box_new(GtkVertical, 12);
  43. gtk_box_set_spacing(box, 12);
  44. count := 0;
  45. IntToStr(count, text);
  46. label := gtk_label_new(text);
  47. gtk_box_append(box, label);
  48. button := gtk_button_new_with_label("Click me");
  49. Connect(button, "clicked", ADR(OnClicked), NIL);
  50. gtk_box_append(box, button);
  51. gtk_window_set_child(window, box);
  52. gtk_window_present(window)
  53. END OnActivate;
  54. VAR
  55. app: ADDRESS;
  56. BEGIN
  57. app := gtk_application_new(AppId, 0);
  58. IF app = NIL THEN
  59. printf("gtk_application_new failed\n");
  60. HALT(1)
  61. END;
  62. Connect(app, "activate", ADR(OnActivate), NIL);
  63. g_application_run(app, 0, NIL)
  64. END counter.