test_actions.mod 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. MODULE test_actions ;
  2. (*
  3. m2-GTK4 test - actions, action maps, menus and accelerators.
  4. Creates app-scoped GSimpleActions, activates one and checks the
  5. handler ran, round-trips a stateful boolean action's state through a
  6. GVariant, builds a GMenu/GMenuModel, and instantiates a
  7. GtkApplicationWindow + GtkPopoverMenuBar. Requires a display.
  8. *)
  9. FROM Gio IMPORT g_application_run, g_application_quit;
  10. FROM GtkApplication IMPORT gtk_application_new;
  11. FROM GtkApplicationWindow IMPORT gtk_application_window_new,
  12. gtk_application_window_get_show_menubar,
  13. gtk_application_window_set_show_menubar;
  14. FROM GSimpleAction IMPORT g_simple_action_new, g_simple_action_new_stateful,
  15. g_simple_action_set_state;
  16. FROM GActionMap IMPORT g_action_map_add_action, g_action_map_lookup_action;
  17. FROM GAction IMPORT g_action_activate, g_action_get_state;
  18. FROM GMenu IMPORT g_menu_new, g_menu_append, g_menu_append_submenu;
  19. FROM GMenuModel IMPORT g_menu_model_get_n_items;
  20. FROM GtkPopoverMenuBar IMPORT gtk_popover_menu_bar_new_from_model,
  21. gtk_popover_menu_bar_get_menu_model;
  22. FROM GVariant IMPORT g_variant_new_boolean, g_variant_get_boolean,
  23. g_variant_unref;
  24. FROM GtkUtils IMPORT Connect, SetAccel;
  25. FROM SYSTEM IMPORT ADDRESS, ADR;
  26. FROM libc IMPORT printf;
  27. CONST
  28. AppId = "org.example.m2gtk4.TestActions";
  29. VAR
  30. app: ADDRESS;
  31. passed: BOOLEAN;
  32. activated: INTEGER;
  33. PROCEDURE OnHello (action: ADDRESS; param: ADDRESS; data: ADDRESS);
  34. BEGIN
  35. INC(activated)
  36. END OnHello;
  37. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  38. VAR
  39. window, helloAction, flagAction, menu, submenu, bar: ADDRESS;
  40. state: ADDRESS;
  41. ok: BOOLEAN;
  42. n: INTEGER;
  43. BEGIN
  44. ok := TRUE;
  45. activated := 0;
  46. (* --- app-scoped parameterless action --- *)
  47. helloAction := g_simple_action_new("hello", NIL);
  48. Connect(helloAction, "activate", ADR(OnHello), NIL);
  49. g_action_map_add_action(application, helloAction);
  50. IF g_action_map_lookup_action(application, "hello") # helloAction THEN
  51. printf("lookup_action wrong\n");
  52. ok := FALSE
  53. END;
  54. g_action_activate(helloAction, NIL);
  55. IF activated # 1 THEN
  56. printf("activate did not fire\n");
  57. ok := FALSE
  58. END;
  59. (* --- stateful boolean action, GVariant round-trip --- *)
  60. flagAction := g_simple_action_new_stateful("flag", NIL,
  61. g_variant_new_boolean(0));
  62. g_action_map_add_action(application, flagAction);
  63. state := g_action_get_state(flagAction);
  64. IF g_variant_get_boolean(state) # 0 THEN
  65. printf("initial state wrong\n");
  66. ok := FALSE
  67. END;
  68. g_variant_unref(state);
  69. g_simple_action_set_state(flagAction, g_variant_new_boolean(1));
  70. state := g_action_get_state(flagAction);
  71. IF g_variant_get_boolean(state) # 1 THEN
  72. printf("updated state wrong\n");
  73. ok := FALSE
  74. END;
  75. g_variant_unref(state);
  76. (* --- GMenu / GMenuModel --- *)
  77. submenu := g_menu_new();
  78. g_menu_append(submenu, "Hello", "app.hello");
  79. g_menu_append(submenu, "Flag", "app.flag");
  80. menu := g_menu_new();
  81. g_menu_append_submenu(menu, "Test", submenu);
  82. n := g_menu_model_get_n_items(menu);
  83. IF n # 1 THEN
  84. printf("menubar item count wrong: %d\n", n);
  85. ok := FALSE
  86. END;
  87. IF g_menu_model_get_n_items(submenu) # 2 THEN
  88. printf("submenu item count wrong\n");
  89. ok := FALSE
  90. END;
  91. bar := gtk_popover_menu_bar_new_from_model(menu);
  92. IF (bar = NIL) OR (gtk_popover_menu_bar_get_menu_model(bar) # menu) THEN
  93. printf("popover menu bar wrong\n");
  94. ok := FALSE
  95. END;
  96. (* --- GtkApplicationWindow + accelerators --- *)
  97. window := gtk_application_window_new(application);
  98. gtk_application_window_set_show_menubar(window, 0);
  99. IF gtk_application_window_get_show_menubar(window) # 0 THEN
  100. printf("show_menubar round-trip wrong\n");
  101. ok := FALSE
  102. END;
  103. SetAccel(application, "app.hello", "<primary>h");
  104. SetAccel(application, "app.flag", "<primary>f");
  105. passed := ok;
  106. g_application_quit(application)
  107. END OnActivate;
  108. VAR
  109. rc: INTEGER;
  110. BEGIN
  111. passed := FALSE;
  112. app := gtk_application_new(AppId, 0);
  113. IF app = NIL THEN
  114. printf("test_actions: FAIL (no app)\n");
  115. HALT(1)
  116. END;
  117. Connect(app, "activate", ADR(OnActivate), NIL);
  118. rc := g_application_run(app, 0, NIL);
  119. IF passed THEN
  120. printf("test_actions: PASS\n");
  121. HALT(0)
  122. ELSE
  123. printf("test_actions: FAIL\n");
  124. HALT(1)
  125. END
  126. END test_actions.