test_inputs.mod 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. MODULE test_inputs ;
  2. (*
  3. m2-GTK4 test - the input widgets and their get/set + signals.
  4. Exercises GtkEntry/GtkEditable, GtkCheckButton, GtkSwitch, GtkScale
  5. and GtkRange: sets values, reads them back, then emits the signals
  6. programmatically and checks the handlers ran. Requires a display.
  7. *)
  8. FROM Gio IMPORT g_application_run, g_application_quit;
  9. FROM GtkApplication IMPORT gtk_application_new;
  10. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child;
  11. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  12. FROM GtkEnums IMPORT GtkVertical, GtkHorizontal;
  13. FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_set_placeholder_text,
  14. gtk_entry_get_text_length;
  15. FROM GtkEditable IMPORT gtk_editable_set_text, gtk_editable_get_text,
  16. gtk_editable_set_editable, gtk_editable_get_editable;
  17. FROM GtkCheckButton IMPORT gtk_check_button_new_with_label,
  18. gtk_check_button_set_active, gtk_check_button_get_active;
  19. FROM GtkSwitch IMPORT gtk_switch_new, gtk_switch_set_active,
  20. gtk_switch_get_active, gtk_switch_set_state, gtk_switch_get_state;
  21. FROM GtkScale IMPORT gtk_scale_new_with_range, gtk_scale_set_digits;
  22. FROM GtkRange IMPORT gtk_range_set_value, gtk_range_get_value;
  23. FROM GObject IMPORT g_signal_emit_by_name;
  24. FROM GtkUtils IMPORT Connect, CStrToM2;
  25. FROM SYSTEM IMPORT ADDRESS, ADR;
  26. FROM libc IMPORT printf;
  27. CONST
  28. AppId = "org.example.m2gtk4.TestInputs";
  29. VAR
  30. app, entry, check, sw, scale: ADDRESS;
  31. entryChanged, toggled, valueChanged: BOOLEAN;
  32. passed: BOOLEAN;
  33. PROCEDURE OnChanged (editable: ADDRESS; data: ADDRESS);
  34. BEGIN
  35. entryChanged := TRUE
  36. END OnChanged;
  37. PROCEDURE OnToggled (button: ADDRESS; data: ADDRESS);
  38. BEGIN
  39. toggled := TRUE
  40. END OnToggled;
  41. PROCEDURE OnValue (range: ADDRESS; data: ADDRESS);
  42. BEGIN
  43. valueChanged := TRUE
  44. END OnValue;
  45. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  46. VAR
  47. window, box: ADDRESS;
  48. got: ARRAY [0..63] OF CHAR;
  49. ok: BOOLEAN;
  50. BEGIN
  51. ok := TRUE;
  52. entryChanged := FALSE;
  53. toggled := FALSE;
  54. valueChanged := FALSE;
  55. (* --- GtkEntry / GtkEditable --- *)
  56. entry := gtk_entry_new();
  57. gtk_entry_set_placeholder_text(entry, "name");
  58. Connect(entry, "changed", ADR(OnChanged), NIL);
  59. gtk_editable_set_text(entry, "hello");
  60. CStrToM2(gtk_editable_get_text(entry), got);
  61. IF (got[0] # 'h') OR (got[4] # 'o') OR (got[5] # 0C) THEN
  62. printf("entry text wrong: [%s]\n", got);
  63. ok := FALSE
  64. END;
  65. IF gtk_entry_get_text_length(entry) # 5 THEN
  66. printf("entry length wrong\n");
  67. ok := FALSE
  68. END;
  69. gtk_editable_set_editable(entry, 0);
  70. IF gtk_editable_get_editable(entry) # 0 THEN
  71. printf("editable flag wrong\n");
  72. ok := FALSE
  73. END;
  74. (* --- GtkCheckButton --- *)
  75. check := gtk_check_button_new_with_label("Enable");
  76. Connect(check, "toggled", ADR(OnToggled), NIL);
  77. gtk_check_button_set_active(check, 1);
  78. IF gtk_check_button_get_active(check) # 1 THEN
  79. printf("check active wrong\n");
  80. ok := FALSE
  81. END;
  82. (* --- GtkSwitch --- *)
  83. sw := gtk_switch_new();
  84. gtk_switch_set_active(sw, 1);
  85. IF gtk_switch_get_active(sw) # 1 THEN
  86. printf("switch active wrong\n");
  87. ok := FALSE
  88. END;
  89. gtk_switch_set_state(sw, 0);
  90. IF gtk_switch_get_state(sw) # 0 THEN
  91. printf("switch state wrong\n");
  92. ok := FALSE
  93. END;
  94. (* --- GtkScale / GtkRange --- *)
  95. scale := gtk_scale_new_with_range(GtkHorizontal, 0.0, 10.0, 1.0);
  96. gtk_scale_set_digits(scale, 1);
  97. Connect(scale, "value-changed", ADR(OnValue), NIL);
  98. gtk_range_set_value(scale, 4.0);
  99. IF ABS(gtk_range_get_value(scale) - 4.0) > 0.001 THEN
  100. printf("scale value wrong\n");
  101. ok := FALSE
  102. END;
  103. (* the setters may already have emitted; emit explicitly to be sure *)
  104. g_signal_emit_by_name(entry, "changed");
  105. g_signal_emit_by_name(check, "toggled");
  106. g_signal_emit_by_name(scale, "value-changed");
  107. IF NOT entryChanged THEN printf("changed did not fire\n"); ok := FALSE END;
  108. IF NOT toggled THEN printf("toggled did not fire\n"); ok := FALSE END;
  109. IF NOT valueChanged THEN printf("value-changed did not fire\n"); ok := FALSE END;
  110. (* assemble everything to exercise the container path too *)
  111. box := gtk_box_new(GtkVertical, 6);
  112. gtk_box_set_spacing(box, 6);
  113. gtk_box_append(box, entry);
  114. gtk_box_append(box, check);
  115. gtk_box_append(box, sw);
  116. gtk_box_append(box, scale);
  117. window := gtk_application_window_new(application);
  118. gtk_window_set_child(window, box);
  119. passed := ok;
  120. g_application_quit(application)
  121. END OnActivate;
  122. VAR
  123. rc: INTEGER;
  124. BEGIN
  125. passed := FALSE;
  126. app := gtk_application_new(AppId, 0);
  127. IF app = NIL THEN
  128. printf("test_inputs: FAIL (no app)\n");
  129. HALT(1)
  130. END;
  131. Connect(app, "activate", ADR(OnActivate), NIL);
  132. rc := g_application_run(app, 0, NIL);
  133. IF passed THEN
  134. printf("test_inputs: PASS\n");
  135. HALT(0)
  136. ELSE
  137. printf("test_inputs: FAIL\n");
  138. HALT(1)
  139. END
  140. END test_inputs.