test_widgets.mod 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. MODULE test_widgets ;
  2. (*
  3. m2-GTK4 test - widget graph + signal + state round-trip.
  4. Builds label/button inside a box, wires "clicked" to a handler that
  5. updates the label, then emits "clicked" three times with
  6. g_signal_emit_by_name() and reads the label text back through
  7. CStrToM2(). This exercises GtkBox, GtkLabel, GtkButton, the signal
  8. helper and the C-string helper together. Requires a display.
  9. *)
  10. FROM Gio IMPORT g_application_run, g_application_quit;
  11. FROM GtkApplication IMPORT gtk_application_new;
  12. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child;
  13. FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
  14. FROM GtkEnums IMPORT GtkVertical;
  15. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text, gtk_label_get_text;
  16. FROM GtkButton IMPORT gtk_button_new_with_label;
  17. FROM GObject IMPORT g_signal_emit_by_name;
  18. FROM GtkUtils IMPORT IntToStr, Connect, CStrToM2;
  19. FROM SYSTEM IMPORT ADDRESS, ADR;
  20. FROM libc IMPORT printf;
  21. CONST
  22. AppId = "org.example.m2gtk4.TestWidgets";
  23. VAR
  24. app, label, button: ADDRESS;
  25. clicks: INTEGER;
  26. passed: BOOLEAN;
  27. (* void clicked(GtkButton *button, gpointer user_data) *)
  28. PROCEDURE OnClicked (b: ADDRESS; data: ADDRESS);
  29. VAR
  30. text: ARRAY [0..31] OF CHAR;
  31. BEGIN
  32. INC(clicks);
  33. IntToStr(clicks, text);
  34. gtk_label_set_text(label, text)
  35. END OnClicked;
  36. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  37. VAR
  38. window, box: ADDRESS;
  39. got: ARRAY [0..31] OF CHAR;
  40. i: INTEGER;
  41. BEGIN
  42. clicks := 0;
  43. passed := TRUE;
  44. label := gtk_label_new("0");
  45. button := gtk_button_new_with_label("+1");
  46. Connect(button, "clicked", ADR(OnClicked), NIL);
  47. box := gtk_box_new(GtkVertical, 6);
  48. gtk_box_append(box, label);
  49. gtk_box_append(box, button);
  50. window := gtk_application_window_new(application);
  51. gtk_window_set_child(window, box);
  52. FOR i := 1 TO 3 DO
  53. g_signal_emit_by_name(button, "clicked")
  54. END;
  55. CStrToM2(gtk_label_get_text(label), got);
  56. IF (clicks # 3) OR (got[0] # '3') OR (got[1] # 0C) THEN
  57. printf("clicks=%d label=[%s]\n", clicks, got);
  58. passed := FALSE
  59. END;
  60. g_application_quit(application)
  61. END OnActivate;
  62. VAR
  63. rc: INTEGER;
  64. BEGIN
  65. app := gtk_application_new(AppId, 0);
  66. IF app = NIL THEN
  67. printf("test_widgets: FAIL (no app)\n");
  68. HALT(1)
  69. END;
  70. Connect(app, "activate", ADR(OnActivate), NIL);
  71. rc := g_application_run(app, 0, NIL);
  72. IF passed THEN
  73. printf("test_widgets: PASS\n");
  74. HALT(0)
  75. ELSE
  76. printf("test_widgets: FAIL\n");
  77. HALT(1)
  78. END
  79. END test_widgets.