@gtkx/testing 1.6.0 → 2.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +47 -44
  2. package/dist/accessible-native.d.ts +1 -1
  3. package/dist/accessible-native.d.ts.map +1 -1
  4. package/dist/accessible-native.js +29 -8
  5. package/dist/accessible-native.js.map +1 -1
  6. package/dist/build-queries.d.ts +9 -9
  7. package/dist/build-queries.d.ts.map +1 -1
  8. package/dist/build-queries.js +2 -1
  9. package/dist/build-queries.js.map +1 -1
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +1 -3
  12. package/dist/config.js.map +1 -1
  13. package/dist/fire-event.d.ts +3 -3
  14. package/dist/fire-event.d.ts.map +1 -1
  15. package/dist/fire-event.js +14 -4
  16. package/dist/fire-event.js.map +1 -1
  17. package/dist/matchers.d.ts +52 -56
  18. package/dist/matchers.d.ts.map +1 -1
  19. package/dist/matchers.js +4 -16
  20. package/dist/matchers.js.map +1 -1
  21. package/dist/queries.d.ts +37 -133
  22. package/dist/queries.d.ts.map +1 -1
  23. package/dist/queries.js +48 -136
  24. package/dist/queries.js.map +1 -1
  25. package/dist/query-helpers.d.ts +2 -2
  26. package/dist/query-helpers.d.ts.map +1 -1
  27. package/dist/query-helpers.js +10 -3
  28. package/dist/query-helpers.js.map +1 -1
  29. package/dist/render.d.ts.map +1 -1
  30. package/dist/render.js +4 -0
  31. package/dist/render.js.map +1 -1
  32. package/dist/role-helpers.d.ts +1 -1
  33. package/dist/role-helpers.d.ts.map +1 -1
  34. package/dist/role-helpers.js +2 -1
  35. package/dist/role-helpers.js.map +1 -1
  36. package/dist/screenshot.d.ts +1 -1
  37. package/dist/screenshot.d.ts.map +1 -1
  38. package/dist/screenshot.js +26 -8
  39. package/dist/screenshot.js.map +1 -1
  40. package/dist/suggestions.d.ts +1 -1
  41. package/dist/suggestions.d.ts.map +1 -1
  42. package/dist/suggestions.js +3 -1
  43. package/dist/suggestions.js.map +1 -1
  44. package/dist/traversal.d.ts +4 -4
  45. package/dist/traversal.d.ts.map +1 -1
  46. package/dist/traversal.js +25 -7
  47. package/dist/traversal.js.map +1 -1
  48. package/dist/types.d.ts +10 -10
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/types.js.map +1 -1
  51. package/dist/user-event/adjustment.d.ts +2 -14
  52. package/dist/user-event/adjustment.d.ts.map +1 -1
  53. package/dist/user-event/adjustment.js +2 -14
  54. package/dist/user-event/adjustment.js.map +1 -1
  55. package/dist/user-event/click.d.ts +20 -45
  56. package/dist/user-event/click.d.ts.map +1 -1
  57. package/dist/user-event/click.js +31 -50
  58. package/dist/user-event/click.js.map +1 -1
  59. package/dist/user-event/controller.d.ts +5 -5
  60. package/dist/user-event/controller.d.ts.map +1 -1
  61. package/dist/user-event/controller.js +5 -2
  62. package/dist/user-event/controller.js.map +1 -1
  63. package/dist/user-event/gesture.d.ts +9 -43
  64. package/dist/user-event/gesture.d.ts.map +1 -1
  65. package/dist/user-event/gesture.js +9 -43
  66. package/dist/user-event/gesture.js.map +1 -1
  67. package/dist/user-event/index.d.ts +38 -107
  68. package/dist/user-event/index.d.ts.map +1 -1
  69. package/dist/user-event/index.js +29 -30
  70. package/dist/user-event/index.js.map +1 -1
  71. package/dist/user-event/keyboard.d.ts +1 -1
  72. package/dist/user-event/keyboard.d.ts.map +1 -1
  73. package/dist/user-event/keyboard.js +24 -3
  74. package/dist/user-event/keyboard.js.map +1 -1
  75. package/dist/user-event/list-row-click.d.ts +1 -1
  76. package/dist/user-event/list-row-click.d.ts.map +1 -1
  77. package/dist/user-event/list-row-click.js +2 -1
  78. package/dist/user-event/list-row-click.js.map +1 -1
  79. package/dist/user-event/pointer.d.ts.map +1 -1
  80. package/dist/user-event/pointer.js +9 -11
  81. package/dist/user-event/pointer.js.map +1 -1
  82. package/dist/user-event/selection.d.ts +4 -20
  83. package/dist/user-event/selection.d.ts.map +1 -1
  84. package/dist/user-event/selection.js +11 -23
  85. package/dist/user-event/selection.js.map +1 -1
  86. package/dist/user-event/text.d.ts +5 -34
  87. package/dist/user-event/text.d.ts.map +1 -1
  88. package/dist/user-event/text.js +5 -34
  89. package/dist/user-event/text.js.map +1 -1
  90. package/dist/wait-for.d.ts +2 -2
  91. package/dist/wait-for.d.ts.map +1 -1
  92. package/dist/wait-for.js +6 -4
  93. package/dist/wait-for.js.map +1 -1
  94. package/dist/widget-accessible-properties.d.ts +4 -3
  95. package/dist/widget-accessible-properties.d.ts.map +1 -1
  96. package/dist/widget-accessible-properties.js +38 -51
  97. package/dist/widget-accessible-properties.js.map +1 -1
  98. package/dist/widget-getters.d.ts +7 -9
  99. package/dist/widget-getters.d.ts.map +1 -1
  100. package/dist/widget-getters.js.map +1 -1
  101. package/dist/widget-target.d.ts +4 -0
  102. package/dist/widget-target.d.ts.map +1 -0
  103. package/dist/widget-target.js +9 -0
  104. package/dist/widget-target.js.map +1 -0
  105. package/package.json +17 -10
  106. package/src/accessible-native.ts +45 -9
  107. package/src/build-queries.ts +60 -30
  108. package/src/config.ts +1 -3
  109. package/src/fire-event.ts +32 -8
  110. package/src/matchers.ts +63 -85
  111. package/src/queries.ts +94 -156
  112. package/src/query-helpers.ts +17 -9
  113. package/src/render.tsx +7 -2
  114. package/src/role-helpers.ts +3 -1
  115. package/src/screenshot.ts +49 -8
  116. package/src/suggestions.ts +3 -1
  117. package/src/traversal.ts +35 -11
  118. package/src/types.ts +14 -10
  119. package/src/user-event/adjustment.ts +2 -14
  120. package/src/user-event/click.ts +40 -58
  121. package/src/user-event/controller.ts +8 -5
  122. package/src/user-event/gesture.ts +9 -43
  123. package/src/user-event/index.ts +149 -132
  124. package/src/user-event/keyboard.ts +33 -4
  125. package/src/user-event/list-row-click.ts +2 -2
  126. package/src/user-event/pointer.ts +11 -15
  127. package/src/user-event/selection.ts +15 -25
  128. package/src/user-event/text.ts +5 -34
  129. package/src/wait-for.ts +9 -6
  130. package/src/widget-accessible-properties.ts +61 -69
  131. package/src/widget-getters.ts +11 -13
  132. package/src/widget-target.ts +11 -0
@@ -1,17 +1,16 @@
1
1
  import { delay } from "../timers.js";
2
+ import { requireWidget } from "../widget-target.js";
2
3
  import { scroll, slide } from "./adjustment.js";
3
4
  import { click, dblClick, tripleClick } from "./click.js";
4
- import { drag, dragAndDrop, drop, hover, longPress, rotate, swipe, unhover, zoom } from "./gesture.js";
5
+ import { drag, dragAndDrop, drop, hover, longPress, rotate, swipe, unhover, zoom, } from "./gesture.js";
5
6
  import { keyboard, tab } from "./keyboard.js";
6
7
  import { pointer } from "./pointer.js";
7
8
  import { deselectOptions, selectOptions } from "./selection.js";
8
9
  import { createInitialState } from "./state.js";
9
10
  import { clear, copy, cut, paste, type } from "./text.js";
10
- /**
11
- * High-level helpers that drive widgets by dispatching the same events and gestures GTK4 delivers
12
- * when someone clicks, types, or drags. Call `setup` for an instance with its own keyboard and
13
- * pointer state.
14
- */
11
+ const onWidget = (helper) => (target, ...args) => helper(requireWidget(target), ...args);
12
+ const onWidgetPair = (helper) => (source, target, ...args) => helper(requireWidget(source), requireWidget(target), ...args);
13
+ /** User interactions that dispatch GTK events and gestures. */
15
14
  const userEvent = {
16
15
  ...createInstance(createInitialState(), {}),
17
16
  setup: (options) => createInstance(createInitialState(), options ?? {}),
@@ -29,30 +28,30 @@ function createInstance(state, options) {
29
28
  };
30
29
  return {
31
30
  setup: (overrides) => createInstance(state, { ...options, ...overrides }),
32
- click: after(click),
33
- dblClick: after(dblClick),
34
- tripleClick: after(tripleClick),
35
- tab: after(tab),
36
- type: after(type),
37
- clear: after(clear),
38
- copy: after(copy),
39
- cut: after(cut),
40
- paste: after(paste),
41
- selectOptions: after(selectOptions),
42
- deselectOptions: after(deselectOptions),
43
- hover: after(hover),
44
- unhover: after(unhover),
45
- rotate: after(rotate),
46
- zoom: after(zoom),
47
- swipe: after(swipe),
48
- longPress: after(longPress),
49
- drag: after(drag),
50
- drop: after(drop),
51
- dragAndDrop: after(dragAndDrop),
52
- slide: after(slide),
53
- scroll: after(scroll),
54
- keyboard: after((widget, input) => keyboard(state, widget, input)),
55
- pointer: after((widget, input) => pointer(state, widget, input)),
31
+ click: after(onWidget(click)),
32
+ dblClick: after(onWidget(dblClick)),
33
+ tripleClick: after(onWidget(tripleClick)),
34
+ tab: after(onWidget(tab)),
35
+ type: after(onWidget(type)),
36
+ clear: after(onWidget(clear)),
37
+ copy: after(onWidget(copy)),
38
+ cut: after(onWidget(cut)),
39
+ paste: after(onWidget(paste)),
40
+ selectOptions: after(onWidget(selectOptions)),
41
+ deselectOptions: after(onWidget(deselectOptions)),
42
+ hover: after(onWidget(hover)),
43
+ unhover: after(onWidget(unhover)),
44
+ rotate: after(onWidget(rotate)),
45
+ zoom: after(onWidget(zoom)),
46
+ swipe: after(onWidget(swipe)),
47
+ longPress: after(onWidget(longPress)),
48
+ drag: after(onWidget(drag)),
49
+ drop: after(onWidget(drop)),
50
+ dragAndDrop: after(onWidgetPair(dragAndDrop)),
51
+ slide: after(onWidget(slide)),
52
+ scroll: after(onWidget(scroll)),
53
+ keyboard: after(onWidget((widget, input) => keyboard(state, widget, input))),
54
+ pointer: after(onWidget((widget, input) => pointer(state, widget, input))),
56
55
  };
57
56
  }
58
57
  export { resetClipboard } from "./text.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user-event/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { delay } from \"../timers.js\";\nimport { scroll, slide } from \"./adjustment.js\";\nimport { click, dblClick, tripleClick } from \"./click.js\";\nimport { drag, dragAndDrop, drop, hover, longPress, rotate, swipe, unhover, zoom } from \"./gesture.js\";\nimport { keyboard, tab } from \"./keyboard.js\";\nimport { pointer, type PointerInput } from \"./pointer.js\";\nimport { deselectOptions, selectOptions } from \"./selection.js\";\nimport { createInitialState, type UserEventState } from \"./state.js\";\nimport { clear, copy, cut, paste, type } from \"./text.js\";\n\n/** Options shared by every helper on a {@link UserEvent} instance. */\ntype UserEventOptions = {\n /** Milliseconds to wait after each helper resolves; null, the default, waits not at all. */\n delay?: number | null | undefined;\n};\n\n/**\n * The set of user interaction helpers exposed by {@link userEvent}, covering clicks, typing,\n * keyboard, pointer, gestures, selection, and scrolling.\n */\ntype UserEvent = {\n /**\n * Returns a fresh instance whose helpers share one keyboard and pointer state, so held modifiers\n * and buttons carry across its calls but not across instances.\n */\n setup: (options?: UserEventOptions) => UserEvent;\n /**\n * Activates a widget that neither claims the click nor carries a click gesture of its own, and\n * otherwise presses and releases outwards from the clicked widget through every widget carrying\n * a click gesture, stopping at the first button or indexed child. A list box row or flow box\n * child receives its click gesture at the clicked position, passes one on to the gestures its\n * container carries, and is then activated, or exclusively selected when its container does not\n * activate on a single click. The press also stops at a widget whose click GTK4 implements\n * itself, where the gestures that widget carries of its own still take the press and the same\n * outcome is then applied through GTK's own public action: a list, grid, or column-view row is\n * focused and selected, and activated as well when its view activates on a single click; an\n * expandable tree expander that is itself the clicked widget toggles its expansion; a notebook\n * tab, clicked directly or through its label, focuses its notebook and switches to its page; a\n * column header sorts by its column. A column-view cell and the row carrying the column headers\n * stand in the way of the click rather than taking it, so a click on either reaches the row or\n * the view behind it.\n */\n click: typeof click;\n /**\n * Delivers a two-press click gesture along the same path a single click takes, without trying\n * activation first, activating a list box row or flow box child on that path and replacing its\n * container's selection whether or not that container activates on a single click. A widget\n * whose click GTK4 implements itself receives that outcome once per press, so a row is selected\n * and activated by the second press, a tree expander ends back where it started, a notebook tab\n * stays on the page the first press opened, and a column header inverts its order after sorting.\n */\n dblClick: typeof dblClick;\n /**\n * Delivers a three-press click gesture the same way a double click is delivered, applying the\n * same outcome to a list box row or flow box child, and applying the outcome GTK4 implements\n * itself once per press to a row, tree expander, notebook tab, or column header.\n */\n tripleClick: typeof tripleClick;\n /** Moves focus within the widget's root, forward by default and backward with `isShiftHeld`. */\n tab: typeof tab;\n /**\n * Focuses an editable widget the way clicking into it does, leaving its text unselected, applies\n * any initial selection, and inserts the text at the cursor, deleting the text the widget has\n * selected first, the way GTK4 does.\n */\n type: typeof type;\n /** Focuses an editable widget and deletes its whole text, leaving nothing selected. */\n clear: typeof clear;\n /** Writes an editable widget's current selection to the clipboard. */\n copy: typeof copy;\n /** Writes an editable widget's current selection to the clipboard and deletes it. */\n cut: typeof cut;\n /**\n * Inserts the given text, or the clipboard's text, at an editable widget's cursor, deleting the\n * text the widget has selected first, the way GTK4 does.\n */\n paste: typeof paste;\n /**\n * Selects the items at those positions in a view or drop-down, or selects the indexed children of\n * a list box or flow box through their container, without activating them.\n */\n selectOptions: typeof selectOptions;\n /** Unselects the items at those positions, leaving list box and flow box children unactivated. */\n deselectOptions: typeof deselectOptions;\n /** Emits a motion `enter` on the widget, adding a motion controller when it has none. */\n hover: typeof hover;\n /** Emits a motion `leave` on the widget, adding a motion controller when it has none. */\n unhover: typeof unhover;\n /** Emits `angle-changed` on the widget's rotate gestures. */\n rotate: typeof rotate;\n /** Emits `scale-changed` on the widget's zoom gestures. */\n zoom: typeof zoom;\n /** Emits `swipe` with the given velocity on the widget's swipe gestures. */\n swipe: typeof swipe;\n /** Emits `pressed` at the given point on the widget's long-press gestures. */\n longPress: typeof longPress;\n /** Runs a begin, update, and end sequence on the widget's drag gestures, ending at the given offset. */\n drag: typeof drag;\n /** Emits `drop` with the given content on the widget's drop targets. */\n drop: typeof drop;\n /** Requires a drag source on the source widget, then emits `drop` with the content on the target's drop targets. */\n dragAndDrop: typeof dragAndDrop;\n /** Emits a jump `change-value` on a Gtk.Range so it moves to the given value. */\n slide: typeof slide;\n /** Adds the delta to the adjustments of the widget itself, or of its nearest scrollable ancestor. */\n scroll: typeof scroll;\n /**\n * Sends a key sequence along the chain GTK4 propagates a key event through: the application's\n * accelerators first, then the capture-phase controllers from the root down to the event widget,\n * the event widget's target-phase controllers, and the bubble-phase controllers from it back up\n * to the root, so a key controller or shortcut controller a container or window above the widget\n * carries receives the key too, each in the phase it declares. The event widget is the editable\n * delegate GTK4 focuses when the widget has one, the `Gtk.Text` inside a `Gtk.Entry` for\n * instance, so the delegate stands ahead of the widget in the chain. A shortcut controller whose\n * scope is not local runs where it registered instead, the root for a global one and the nearest\n * `Gtk.ShortcutManager` for a managed one, so it fires wherever focus sits inside that subtree\n * and never at its own widget, while a shortcut whose widget is insensitive or unmapped stays\n * inert wherever it sits. The first controller that handles a press ends the chain, and a\n * `Gdk.KEY_Return` press none of them handled reaches an editable widget's activate handler.\n * Built-in key bindings take part, since GTK4 carries them on a shortcut controller: a\n * `Gtk.Text`'s arrow keys or a `Gtk.TextView`'s undo can consume a press before an ancestor\n * sees it. Key controllers GTK4 attaches itself are the exception, since they read a GDK event\n * that off-screen synthesis cannot produce, so only the key controllers the tree connected a\n * `key-pressed` or `key-released` handler to take part. Held modifiers carry across calls.\n */\n keyboard: (widget: Gtk.Widget, input: string) => Promise<void>;\n /**\n * Applies a pointer token to the click gestures the widget already carries, tracking whether the\n * left button is held across calls. On a widget whose click GTK4 implements itself, the release\n * also applies GTK's own outcome, the way {@link UserEvent.click} does, and a column-view cell\n * or the row carrying the column headers passes the token to the row or view behind it.\n */\n pointer: (widget: Gtk.Widget, input: PointerInput) => Promise<void>;\n};\n\n/**\n * High-level helpers that drive widgets by dispatching the same events and gestures GTK4 delivers\n * when someone clicks, types, or drags. Call `setup` for an instance with its own keyboard and\n * pointer state.\n */\nconst userEvent: UserEvent = {\n ...createInstance(createInitialState(), {}),\n setup: (options?: UserEventOptions): UserEvent => createInstance(createInitialState(), options ?? {}),\n};\n\nconst settle = (ms: number | null | undefined): Promise<void> => {\n if (ms === null || ms === undefined) {\n return Promise.resolve();\n }\n\n return delay(ms);\n};\n\nfunction createInstance(state: UserEventState, options: UserEventOptions): UserEvent {\n const after =\n <Args extends unknown[]>(helper: (...args: Args) => Promise<void>) =>\n async (...args: Args): Promise<void> => {\n await helper(...args);\n await settle(options.delay);\n };\n\n return {\n setup: (overrides?: UserEventOptions): UserEvent => createInstance(state, { ...options, ...overrides }),\n click: after(click),\n dblClick: after(dblClick),\n tripleClick: after(tripleClick),\n tab: after(tab),\n type: after(type),\n clear: after(clear),\n copy: after(copy),\n cut: after(cut),\n paste: after(paste),\n selectOptions: after(selectOptions),\n deselectOptions: after(deselectOptions),\n hover: after(hover),\n unhover: after(unhover),\n rotate: after(rotate),\n zoom: after(zoom),\n swipe: after(swipe),\n longPress: after(longPress),\n drag: after(drag),\n drop: after(drop),\n dragAndDrop: after(dragAndDrop),\n slide: after(slide),\n scroll: after(scroll),\n keyboard: after((widget: Gtk.Widget, input: string): Promise<void> => keyboard(state, widget, input)),\n pointer: after((widget: Gtk.Widget, input: PointerInput): Promise<void> => pointer(state, widget, input)),\n };\n}\n\nexport type { ScrollDelta } from \"./adjustment.js\";\nexport type { DragOffset, DragOptions, DropContent, DropOptions } from \"./gesture.js\";\nexport type { TabOptions } from \"./keyboard.js\";\nexport type { PointerInput } from \"./pointer.js\";\nexport type { TypeOptions } from \"./text.js\";\nexport { resetClipboard } from \"./text.js\";\nexport { userEvent, type UserEvent, type UserEventOptions };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user-event/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { delay } from \"../timers.js\";\nimport { requireWidget } from \"../widget-target.js\";\nimport { scroll, slide } from \"./adjustment.js\";\nimport { click, dblClick, tripleClick } from \"./click.js\";\nimport {\n drag,\n dragAndDrop,\n drop,\n hover,\n longPress,\n rotate,\n swipe,\n unhover,\n zoom,\n} from \"./gesture.js\";\nimport { keyboard, tab } from \"./keyboard.js\";\nimport { pointer, type PointerInput } from \"./pointer.js\";\nimport { deselectOptions, selectOptions } from \"./selection.js\";\nimport { createInitialState, type UserEventState } from \"./state.js\";\nimport { clear, copy, cut, paste, type } from \"./text.js\";\n\n/** Options shared by every helper on a {@link UserEvent} instance. */\ntype UserEventOptions = {\n /** Milliseconds to wait after each helper resolves; null, the default, waits not at all. */\n delay?: number | null | undefined;\n};\n\n/** User interactions exposed by {@link userEvent}. */\ntype UserEvent = {\n /** Creates an instance with shared keyboard and pointer state. */\n setup: (options?: UserEventOptions) => UserEvent;\n /** Activates or presses and releases a widget. */\n click: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof click> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Delivers a double-click gesture. */\n dblClick: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof dblClick> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Delivers a triple-click gesture. */\n tripleClick: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof tripleClick> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Moves focus forward or backward within the root. */\n tab: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof tab> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Types into an editable widget. */\n type: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof type> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Deletes all text from an editable widget. */\n clear: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof clear> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Copies the current selection. */\n copy: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof copy> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Cuts the current selection. */\n cut: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof cut> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Pastes text or clipboard contents. */\n paste: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof paste> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Selects positions without activating them. */\n selectOptions: typeof selectOptions;\n /** Unselects positions without activating them. */\n deselectOptions: typeof deselectOptions;\n /** Emits a motion `enter` on the widget, adding a motion controller when it has none. */\n hover: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof hover> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Emits a motion `leave` on the widget, adding a motion controller when it has none. */\n unhover: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof unhover> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Emits `angle-changed` on the widget's rotate gestures. */\n rotate: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof rotate> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Emits `scale-changed` on the widget's zoom gestures. */\n zoom: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof zoom> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Emits `swipe` with the given velocity on the widget's swipe gestures. */\n swipe: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof swipe> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Emits `pressed` at the given point on the widget's long-press gestures. */\n longPress: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof longPress> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Runs a begin, update, and end sequence on the widget's drag gestures, ending at the given offset. */\n drag: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof drag> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Emits `drop` with the given content on the widget's drop targets. */\n drop: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof drop> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Requires a drag source on the source widget, then emits `drop` with the content on the target's drop targets. */\n dragAndDrop: (\n source: Gtk.Accessible,\n target: Gtk.Accessible,\n ...args: Parameters<typeof dragAndDrop> extends [Gtk.Widget, Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Emits a jump `change-value` on a Gtk.Range so it moves to the given value. */\n slide: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof slide> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Adds the delta to the adjustments of the widget itself, or of its nearest scrollable ancestor. */\n scroll: (\n widget: Gtk.Accessible,\n ...args: Parameters<typeof scroll> extends [Gtk.Widget, ...infer Args] ? Args : never\n ) => Promise<void>;\n /** Sends a key sequence through GTK's propagation chain. */\n keyboard: (widget: Gtk.Accessible, input: string) => Promise<void>;\n /** Applies a pointer token while preserving held-button state. */\n pointer: (widget: Gtk.Accessible, input: PointerInput) => Promise<void>;\n};\n\nconst onWidget =\n <Args extends unknown[]>(helper: (widget: Gtk.Widget, ...args: Args) => Promise<void>) =>\n (target: Gtk.Accessible, ...args: Args): Promise<void> =>\n helper(requireWidget(target), ...args);\n\nconst onWidgetPair =\n <Args extends unknown[]>(helper: (source: Gtk.Widget, target: Gtk.Widget, ...args: Args) => Promise<void>) =>\n (source: Gtk.Accessible, target: Gtk.Accessible, ...args: Args): Promise<void> =>\n helper(requireWidget(source), requireWidget(target), ...args);\n\n/** User interactions that dispatch GTK events and gestures. */\nconst userEvent: UserEvent = {\n ...createInstance(createInitialState(), {}),\n setup: (options?: UserEventOptions): UserEvent => createInstance(createInitialState(), options ?? {}),\n};\n\nconst settle = (ms: number | null | undefined): Promise<void> => {\n if (ms === null || ms === undefined) {\n return Promise.resolve();\n }\n\n return delay(ms);\n};\n\nfunction createInstance(state: UserEventState, options: UserEventOptions): UserEvent {\n const after =\n <Args extends unknown[]>(helper: (...args: Args) => Promise<void>) =>\n async (...args: Args): Promise<void> => {\n await helper(...args);\n await settle(options.delay);\n };\n\n return {\n setup: (overrides?: UserEventOptions): UserEvent => createInstance(state, { ...options, ...overrides }),\n click: after(onWidget(click)),\n dblClick: after(onWidget(dblClick)),\n tripleClick: after(onWidget(tripleClick)),\n tab: after(onWidget(tab)),\n type: after(onWidget(type)),\n clear: after(onWidget(clear)),\n copy: after(onWidget(copy)),\n cut: after(onWidget(cut)),\n paste: after(onWidget(paste)),\n selectOptions: after(onWidget(selectOptions)),\n deselectOptions: after(onWidget(deselectOptions)),\n hover: after(onWidget(hover)),\n unhover: after(onWidget(unhover)),\n rotate: after(onWidget(rotate)),\n zoom: after(onWidget(zoom)),\n swipe: after(onWidget(swipe)),\n longPress: after(onWidget(longPress)),\n drag: after(onWidget(drag)),\n drop: after(onWidget(drop)),\n dragAndDrop: after(onWidgetPair(dragAndDrop)),\n slide: after(onWidget(slide)),\n scroll: after(onWidget(scroll)),\n keyboard: after(\n onWidget((widget: Gtk.Widget, input: string): Promise<void> => keyboard(state, widget, input)),\n ),\n pointer: after(\n onWidget((widget: Gtk.Widget, input: PointerInput): Promise<void> => pointer(state, widget, input)),\n ),\n };\n}\n\nexport type { ScrollDelta } from \"./adjustment.js\";\nexport type { DragOffset, DragOptions, DropContent, DropOptions } from \"./gesture.js\";\nexport type { TabOptions } from \"./keyboard.js\";\nexport type { PointerInput } from \"./pointer.js\";\nexport type { TypeOptions } from \"./text.js\";\nexport { resetClipboard } from \"./text.js\";\nexport { userEvent, type UserEvent, type UserEventOptions };\n"]}
@@ -5,7 +5,7 @@ type TabOptions = {
5
5
  /** Move focus backward instead of forward. */
6
6
  isShiftHeld?: boolean;
7
7
  };
8
- /** Moves focus within the widget's root, forward by default and backward when `isShiftHeld` is set. */
8
+ /** Moves focus within the widget's root. */
9
9
  declare const tab: (widget: Gtk.Widget, options?: TabOptions) => Promise<void>;
10
10
  declare const keyboard: (state: UserEventState, widget: Gtk.Widget, input: string) => Promise<void>;
11
11
  export { tab, keyboard, type TabOptions };
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,mCAAmC;AACnC,KAAK,UAAU,GAAG;IACd,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAqDF,uGAAuG;AACvG,QAAA,MAAM,GAAG,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,UAAU,UAAU,KAAG,OAAO,CAAC,IAAI,CAQ9D,CAAC;AAsUP,QAAA,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAKnF,CAAC;AAEP,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,mCAAmC;AACnC,KAAK,UAAU,GAAG;IACd,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAsDF,4CAA4C;AAC5C,QAAA,MAAM,GAAG,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,UAAU,UAAU,KAAG,OAAO,CAAC,IAAI,CAQ9D,CAAC;AAkWP,QAAA,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAKnF,CAAC;AAEP,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,CAAC"}
@@ -49,7 +49,7 @@ const MODIFIER_KEYVAL_TO_MASK = {
49
49
  [Gdk.KEY_Meta_L]: Gdk.ModifierType.META_MASK,
50
50
  [Gdk.KEY_Meta_R]: Gdk.ModifierType.META_MASK,
51
51
  };
52
- /** Moves focus within the widget's root, forward by default and backward when `isShiftHeld` is set. */
52
+ /** Moves focus within the widget's root. */
53
53
  const tab = (widget, options) => wrapEvent(widget, () => {
54
54
  const direction = options?.isShiftHeld ? Gtk.DirectionType.TAB_BACKWARD : Gtk.DirectionType.TAB_FORWARD;
55
55
  const root = widget.getRoot();
@@ -255,8 +255,29 @@ const didStopHandlePress = (stop, keyval, modifiers) => {
255
255
  }
256
256
  return controller.emit("key-pressed", keyval, 0, modifiers);
257
257
  };
258
- const didHandlePress = (widget, keyval, modifiers) => didDispatchApplicationAccels(widget, keyval, modifiers) ||
259
- keyPropagationChain(widget).some((stop) => didStopHandlePress(stop, keyval, modifiers));
258
+ const keyTargetFor = (widget) => {
259
+ const root = widget.getRoot();
260
+ return { root, focus: root instanceof Gtk.Window ? root.getFocus() : null };
261
+ };
262
+ const isKeyTargetInvalidated = (widget, target) => {
263
+ const current = keyTargetFor(widget);
264
+ return current.root !== target.root || current.focus !== target.focus || !widget.getMapped();
265
+ };
266
+ const didHandlePress = (widget, keyval, modifiers) => {
267
+ const target = keyTargetFor(widget);
268
+ if (didDispatchApplicationAccels(widget, keyval, modifiers)) {
269
+ return true;
270
+ }
271
+ if (isKeyTargetInvalidated(widget, target)) {
272
+ return true;
273
+ }
274
+ for (const stop of keyPropagationChain(widget)) {
275
+ if (didStopHandlePress(stop, keyval, modifiers) || isKeyTargetInvalidated(widget, target)) {
276
+ return true;
277
+ }
278
+ }
279
+ return false;
280
+ };
260
281
  const emitKeyReleased = (widget, keyval, modifiers) => {
261
282
  for (const stop of keyPropagationChain(widget)) {
262
283
  if (stop.controller instanceof Gtk.EventControllerKey) {
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { hasSignalListener } from \"@gtkx/runtime/internal\";\nimport type { UserEventState } from \"./state.js\";\nimport { getEditableDelegate } from \"../editable.js\";\nimport { fireEvent } from \"../fire-event.js\";\nimport { ancestors, descendants } from \"../traversal.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** Options for `userEvent.tab`. */\ntype TabOptions = {\n /** Move focus backward instead of forward. */\n isShiftHeld?: boolean;\n};\n\ntype KeyAction = { keyval: number; isPress: boolean };\ntype ParseStep = { actions: KeyAction[]; next: number };\ntype KeyStopController = Gtk.EventControllerKey | Gtk.ShortcutController;\ntype KeyStop = { widget: Gtk.Widget; controller: KeyStopController };\n\nconst KEY_MAP: Record<string, number> = {\n Enter: Gdk.KEY_Return,\n Tab: Gdk.KEY_Tab,\n Escape: Gdk.KEY_Escape,\n Backspace: Gdk.KEY_BackSpace,\n Delete: Gdk.KEY_Delete,\n ArrowUp: Gdk.KEY_Up,\n ArrowDown: Gdk.KEY_Down,\n ArrowLeft: Gdk.KEY_Left,\n ArrowRight: Gdk.KEY_Right,\n Home: Gdk.KEY_Home,\n End: Gdk.KEY_End,\n PageUp: Gdk.KEY_Page_Up,\n PageDown: Gdk.KEY_Page_Down,\n Space: Gdk.KEY_space,\n Shift: Gdk.KEY_Shift_L,\n Control: Gdk.KEY_Control_L,\n Alt: Gdk.KEY_Alt_L,\n Meta: Gdk.KEY_Meta_L,\n F1: Gdk.KEY_F1,\n F2: Gdk.KEY_F2,\n F3: Gdk.KEY_F3,\n F4: Gdk.KEY_F4,\n F5: Gdk.KEY_F5,\n F6: Gdk.KEY_F6,\n F7: Gdk.KEY_F7,\n F8: Gdk.KEY_F8,\n F9: Gdk.KEY_F9,\n F10: Gdk.KEY_F10,\n F11: Gdk.KEY_F11,\n F12: Gdk.KEY_F12,\n};\n\nconst KEY_CONTROLLER_SIGNALS = [\"key-pressed\", \"key-released\"];\n\nconst MODIFIER_KEYVAL_TO_MASK: Record<number, number> = {\n [Gdk.KEY_Shift_L]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Shift_R]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Control_L]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Control_R]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Alt_L]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Alt_R]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Meta_L]: Gdk.ModifierType.META_MASK,\n [Gdk.KEY_Meta_R]: Gdk.ModifierType.META_MASK,\n};\n\n/** Moves focus within the widget's root, forward by default and backward when `isShiftHeld` is set. */\nconst tab = (widget: Gtk.Widget, options?: TabOptions): Promise<void> =>\n wrapEvent(widget, () => {\n const direction = options?.isShiftHeld ? Gtk.DirectionType.TAB_BACKWARD : Gtk.DirectionType.TAB_FORWARD;\n const root = widget.getRoot();\n\n if (root) {\n root.childFocus(direction);\n }\n });\n\nconst parseKeyToken = (token: string): { keyval: number; isPress: boolean; isRelease: boolean } => {\n let keyName = token;\n let isPress = true;\n let isRelease = true;\n\n if (keyName.startsWith(\"/\")) {\n keyName = keyName.slice(1);\n isPress = false;\n } else if (keyName.endsWith(\">\")) {\n keyName = keyName.slice(0, -1);\n isRelease = false;\n }\n\n const keyval = KEY_MAP[keyName];\n\n if (keyval === undefined) {\n throw new Error(`Unknown key: {${keyName}}`);\n }\n\n return { keyval, isPress, isRelease };\n};\n\nconst parseCharAt = (input: string, i: number): ParseStep => {\n const keyval = input.codePointAt(i) ?? 0;\n\n return {\n actions: [\n { keyval, isPress: true },\n { keyval, isPress: false },\n ],\n next: i + 1,\n };\n};\n\nconst parseBraceAt = (input: string, i: number): ParseStep | null => {\n const endBrace = input.indexOf(\"}\", i);\n\n if (endBrace === -1) {\n return null;\n }\n\n const { keyval, isPress, isRelease } = parseKeyToken(input.slice(i + 1, endBrace));\n const actions: KeyAction[] = [];\n\n if (isPress) {\n actions.push({ keyval, isPress: true });\n }\n\n if (isRelease) {\n actions.push({ keyval, isPress: false });\n }\n\n return { actions, next: endBrace + 1 };\n};\n\nconst parseStepAt = (input: string, i: number): ParseStep | null =>\n input[i] === \"{\" ? parseBraceAt(input, i) : parseCharAt(input, i);\n\nconst parseKeyboardInput = (input: string): KeyAction[] => {\n const actions: KeyAction[] = [];\n let i = 0;\n\n while (i < input.length) {\n const step = parseStepAt(input, i);\n\n if (step === null) {\n break;\n }\n\n actions.push(...step.actions);\n i = step.next;\n }\n\n return actions;\n};\n\nconst updateModifierState = (state: UserEventState, action: KeyAction): void => {\n const mask = MODIFIER_KEYVAL_TO_MASK[action.keyval];\n\n if (!mask) {\n return;\n }\n\n if (action.isPress) {\n state.modifierState |= mask;\n } else {\n state.modifierState &= ~mask;\n }\n};\n\nconst isTriggerMatch = (\n trigger: Gtk.ShortcutTrigger | null,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (trigger instanceof Gtk.KeyvalTrigger) {\n return trigger.getKeyval() === keyval && trigger.getModifiers() === modifiers;\n }\n\n if (trigger instanceof Gtk.AlternativeTrigger) {\n return (\n isTriggerMatch(trigger.getFirst(), keyval, modifiers) ||\n isTriggerMatch(trigger.getSecond(), keyval, modifiers)\n );\n }\n\n return false;\n};\n\nconst controllersOn = function* (widget: Gtk.Widget): Generator<Gtk.EventController> {\n const controllers = widget.observeControllers();\n const count = controllers.getNItems();\n\n for (let i = 0; i < count; i++) {\n const controller = controllers.getItem(i);\n\n if (controller instanceof Gtk.EventController) {\n yield controller;\n }\n }\n};\n\nconst hasShortcut = (controller: Gtk.ShortcutController, shortcut: Gtk.Shortcut): boolean => {\n const count = controller.getNItems();\n\n for (let i = 0; i < count; i++) {\n if (controller.getItem(i) === shortcut) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isManagingShortcut = (controller: Gtk.EventController, shortcut: Gtk.Shortcut): boolean =>\n controller instanceof Gtk.ShortcutController &&\n controller.getScope() !== Gtk.ShortcutScope.LOCAL &&\n hasShortcut(controller, shortcut);\n\nconst managedShortcutHost = (manager: Gtk.Widget, shortcut: Gtk.Shortcut): Gtk.Widget | null => {\n for (const current of [manager, ...descendants(manager)]) {\n if (controllersOn(current).some((controller) => isManagingShortcut(controller, shortcut))) {\n return current;\n }\n }\n\n return null;\n};\n\nconst isMovingFocus = (action: Gtk.ShortcutAction): boolean =>\n action instanceof Gtk.SignalAction && action.getSignalName() === \"move-focus\";\n\nconst isShortcutLive = (host: Gtk.Widget): boolean => host.isSensitive() && host.getMapped();\n\nconst didRunShortcutAction = (shortcut: Gtk.Shortcut, host: Gtk.Widget): boolean => {\n const action = shortcut.getAction();\n\n if (action === null || isMovingFocus(action) || !isShortcutLive(host)) {\n return false;\n }\n\n return action.activate(0 as Gtk.ShortcutActionFlags, host, shortcut.getArguments());\n};\n\nconst didActivateShortcut = (\n shortcut: Gtk.Shortcut,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (!isTriggerMatch(shortcut.getTrigger(), keyval, modifiers)) {\n return false;\n }\n\n return didRunShortcutAction(shortcut, managedShortcutHost(widget, shortcut) ?? widget);\n};\n\nconst didActivateMatchingShortcut = (\n controller: Gtk.ShortcutController,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: number,\n): boolean => {\n const count = controller.getNItems();\n\n for (let j = 0; j < count; j++) {\n const shortcut = controller.getItem(j);\n\n if (!(shortcut instanceof Gtk.Shortcut)) {\n continue;\n }\n\n if (didActivateShortcut(shortcut, widget, keyval, modifiers)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isAccelMatch = (accel: string, keyval: number, modifiers: Gdk.ModifierType): boolean => {\n const [isParsed, accelKeyval, accelModifiers] = Gtk.acceleratorParse(accel);\n\n return isParsed && accelKeyval === keyval && accelModifiers === modifiers;\n};\n\nconst hasMatchingAccel = (\n application: Gtk.Application,\n detailedActionName: string,\n keyval: number,\n modifiers: number,\n): boolean =>\n application.getAccelsForAction(detailedActionName).some((accel) => isAccelMatch(accel, keyval, modifiers));\n\nconst didActivateDetailedAction = (window: Gtk.Window, detailedActionName: string): boolean => {\n const [isParsed, actionName, target] = Gio.Action.parseDetailedName(detailedActionName);\n\n return isParsed && window.activateAction(actionName, target);\n};\n\nconst didDispatchAccelsOnWindow = (window: Gtk.Window, keyval: number, modifiers: number): boolean => {\n const application = window.getApplication();\n\n if (!application) {\n return false;\n }\n\n for (const detailedActionName of application.listActionDescriptions()) {\n if (hasMatchingAccel(application, detailedActionName, keyval, modifiers)) {\n return didActivateDetailedAction(window, detailedActionName);\n }\n }\n\n return false;\n};\n\nconst didDispatchApplicationAccels = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const root = widget.getRoot();\n\n return root instanceof Gtk.Window && didDispatchAccelsOnWindow(root, keyval, modifiers);\n};\n\nconst isKeyStopController = (controller: Gtk.EventController): controller is KeyStopController => {\n if (controller instanceof Gtk.ShortcutController) {\n return controller.getScope() === Gtk.ShortcutScope.LOCAL;\n }\n\n return controller instanceof Gtk.EventControllerKey && hasSignalListener(controller, KEY_CONTROLLER_SIGNALS);\n};\n\nconst keyStopsInPhase = (widget: Gtk.Widget, phase: Gtk.PropagationPhase): KeyStop[] => {\n const stops: KeyStop[] = [];\n\n for (const controller of controllersOn(widget)) {\n if (controller.getPropagationPhase() === phase && isKeyStopController(controller)) {\n stops.push({ widget, controller });\n }\n }\n\n return stops;\n};\n\nconst propagationChain = (widget: Gtk.Widget): Gtk.Widget[] => {\n const delegate = getEditableDelegate(widget);\n const below = delegate === null ? [] : [delegate];\n\n return [...below, widget, ...ancestors(widget)];\n};\n\nconst keyPropagationChain = (widget: Gtk.Widget): KeyStop[] => {\n const chain = propagationChain(widget);\n const [eventWidget = widget] = chain;\n\n return [\n ...chain.toReversed().flatMap((current) => keyStopsInPhase(current, Gtk.PropagationPhase.CAPTURE)),\n ...keyStopsInPhase(eventWidget, Gtk.PropagationPhase.TARGET),\n ...chain.flatMap((current) => keyStopsInPhase(current, Gtk.PropagationPhase.BUBBLE)),\n ];\n};\n\nconst didStopHandlePress = (stop: KeyStop, keyval: number, modifiers: Gdk.ModifierType): boolean => {\n const { controller, widget } = stop;\n\n if (controller instanceof Gtk.ShortcutController) {\n return didActivateMatchingShortcut(controller, widget, keyval, modifiers);\n }\n\n return controller.emit(\"key-pressed\", keyval, 0, modifiers);\n};\n\nconst didHandlePress = (widget: Gtk.Widget, keyval: number, modifiers: Gdk.ModifierType): boolean =>\n didDispatchApplicationAccels(widget, keyval, modifiers) ||\n keyPropagationChain(widget).some((stop) => didStopHandlePress(stop, keyval, modifiers));\n\nconst emitKeyReleased = (widget: Gtk.Widget, keyval: number, modifiers: Gdk.ModifierType): void => {\n for (const stop of keyPropagationChain(widget)) {\n if (stop.controller instanceof Gtk.EventControllerKey) {\n stop.controller.emit(\"key-released\", keyval, 0, modifiers);\n }\n }\n};\n\nconst applyKeyPress = async (widget: Gtk.Widget, keyval: number, modifiers: Gdk.ModifierType): Promise<void> => {\n if (didHandlePress(widget, keyval, modifiers)) {\n return;\n }\n\n if (keyval === Gdk.KEY_Return && widget instanceof Gtk.Editable) {\n await fireEvent(widget, \"activate\");\n }\n};\n\nconst applyKeyAction = async (widget: Gtk.Widget, state: UserEventState, action: KeyAction): Promise<void> => {\n updateModifierState(state, action);\n\n if (action.isPress) {\n await applyKeyPress(widget, action.keyval, state.modifierState);\n\n return;\n }\n\n emitKeyReleased(widget, action.keyval, state.modifierState);\n};\n\nconst keyboard = (state: UserEventState, widget: Gtk.Widget, input: string): Promise<void> =>\n wrapEvent(widget, async () => {\n for (const action of parseKeyboardInput(input)) {\n await applyKeyAction(widget, state, action);\n }\n });\n\nexport { tab, keyboard, type TabOptions };\n"]}
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { hasSignalListener } from \"@gtkx/runtime/internal\";\nimport type { UserEventState } from \"./state.js\";\nimport { getEditableDelegate } from \"../editable.js\";\nimport { fireEvent } from \"../fire-event.js\";\nimport { ancestors, descendants } from \"../traversal.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** Options for `userEvent.tab`. */\ntype TabOptions = {\n /** Move focus backward instead of forward. */\n isShiftHeld?: boolean;\n};\n\ntype KeyAction = { keyval: number; isPress: boolean };\ntype ParseStep = { actions: KeyAction[]; next: number };\ntype KeyStopController = Gtk.EventControllerKey | Gtk.ShortcutController;\ntype KeyStop = { widget: Gtk.Widget; controller: KeyStopController };\ntype KeyTarget = { root: Gtk.Root | null; focus: Gtk.Widget | null };\n\nconst KEY_MAP: Record<string, number> = {\n Enter: Gdk.KEY_Return,\n Tab: Gdk.KEY_Tab,\n Escape: Gdk.KEY_Escape,\n Backspace: Gdk.KEY_BackSpace,\n Delete: Gdk.KEY_Delete,\n ArrowUp: Gdk.KEY_Up,\n ArrowDown: Gdk.KEY_Down,\n ArrowLeft: Gdk.KEY_Left,\n ArrowRight: Gdk.KEY_Right,\n Home: Gdk.KEY_Home,\n End: Gdk.KEY_End,\n PageUp: Gdk.KEY_Page_Up,\n PageDown: Gdk.KEY_Page_Down,\n Space: Gdk.KEY_space,\n Shift: Gdk.KEY_Shift_L,\n Control: Gdk.KEY_Control_L,\n Alt: Gdk.KEY_Alt_L,\n Meta: Gdk.KEY_Meta_L,\n F1: Gdk.KEY_F1,\n F2: Gdk.KEY_F2,\n F3: Gdk.KEY_F3,\n F4: Gdk.KEY_F4,\n F5: Gdk.KEY_F5,\n F6: Gdk.KEY_F6,\n F7: Gdk.KEY_F7,\n F8: Gdk.KEY_F8,\n F9: Gdk.KEY_F9,\n F10: Gdk.KEY_F10,\n F11: Gdk.KEY_F11,\n F12: Gdk.KEY_F12,\n};\n\nconst KEY_CONTROLLER_SIGNALS = [\"key-pressed\", \"key-released\"];\n\nconst MODIFIER_KEYVAL_TO_MASK: Record<number, number> = {\n [Gdk.KEY_Shift_L]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Shift_R]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Control_L]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Control_R]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Alt_L]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Alt_R]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Meta_L]: Gdk.ModifierType.META_MASK,\n [Gdk.KEY_Meta_R]: Gdk.ModifierType.META_MASK,\n};\n\n/** Moves focus within the widget's root. */\nconst tab = (widget: Gtk.Widget, options?: TabOptions): Promise<void> =>\n wrapEvent(widget, () => {\n const direction = options?.isShiftHeld ? Gtk.DirectionType.TAB_BACKWARD : Gtk.DirectionType.TAB_FORWARD;\n const root = widget.getRoot();\n\n if (root) {\n root.childFocus(direction);\n }\n });\n\nconst parseKeyToken = (token: string): { keyval: number; isPress: boolean; isRelease: boolean } => {\n let keyName = token;\n let isPress = true;\n let isRelease = true;\n\n if (keyName.startsWith(\"/\")) {\n keyName = keyName.slice(1);\n isPress = false;\n } else if (keyName.endsWith(\">\")) {\n keyName = keyName.slice(0, -1);\n isRelease = false;\n }\n\n const keyval = KEY_MAP[keyName];\n\n if (keyval === undefined) {\n throw new Error(`Unknown key: {${keyName}}`);\n }\n\n return { keyval, isPress, isRelease };\n};\n\nconst parseCharAt = (input: string, i: number): ParseStep => {\n const keyval = input.codePointAt(i) ?? 0;\n\n return {\n actions: [\n { keyval, isPress: true },\n { keyval, isPress: false },\n ],\n next: i + 1,\n };\n};\n\nconst parseBraceAt = (input: string, i: number): ParseStep | null => {\n const endBrace = input.indexOf(\"}\", i);\n\n if (endBrace === -1) {\n return null;\n }\n\n const { keyval, isPress, isRelease } = parseKeyToken(input.slice(i + 1, endBrace));\n const actions: KeyAction[] = [];\n\n if (isPress) {\n actions.push({ keyval, isPress: true });\n }\n\n if (isRelease) {\n actions.push({ keyval, isPress: false });\n }\n\n return { actions, next: endBrace + 1 };\n};\n\nconst parseStepAt = (input: string, i: number): ParseStep | null =>\n input[i] === \"{\" ? parseBraceAt(input, i) : parseCharAt(input, i);\n\nconst parseKeyboardInput = (input: string): KeyAction[] => {\n const actions: KeyAction[] = [];\n let i = 0;\n\n while (i < input.length) {\n const step = parseStepAt(input, i);\n\n if (step === null) {\n break;\n }\n\n actions.push(...step.actions);\n i = step.next;\n }\n\n return actions;\n};\n\nconst updateModifierState = (state: UserEventState, action: KeyAction): void => {\n const mask = MODIFIER_KEYVAL_TO_MASK[action.keyval];\n\n if (!mask) {\n return;\n }\n\n if (action.isPress) {\n state.modifierState |= mask;\n } else {\n state.modifierState &= ~mask;\n }\n};\n\nconst isTriggerMatch = (\n trigger: Gtk.ShortcutTrigger | null,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (trigger instanceof Gtk.KeyvalTrigger) {\n return trigger.getKeyval() === keyval && trigger.getModifiers() === modifiers;\n }\n\n if (trigger instanceof Gtk.AlternativeTrigger) {\n return (\n isTriggerMatch(trigger.getFirst(), keyval, modifiers) ||\n isTriggerMatch(trigger.getSecond(), keyval, modifiers)\n );\n }\n\n return false;\n};\n\nconst controllersOn = function* (widget: Gtk.Widget): Generator<Gtk.EventController> {\n const controllers = widget.observeControllers();\n const count = controllers.getNItems();\n\n for (let i = 0; i < count; i++) {\n const controller = controllers.getItem(i);\n\n if (controller instanceof Gtk.EventController) {\n yield controller;\n }\n }\n};\n\nconst hasShortcut = (controller: Gtk.ShortcutController, shortcut: Gtk.Shortcut): boolean => {\n const count = controller.getNItems();\n\n for (let i = 0; i < count; i++) {\n if (controller.getItem(i) === shortcut) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isManagingShortcut = (controller: Gtk.EventController, shortcut: Gtk.Shortcut): boolean =>\n controller instanceof Gtk.ShortcutController &&\n controller.getScope() !== Gtk.ShortcutScope.LOCAL &&\n hasShortcut(controller, shortcut);\n\nconst managedShortcutHost = (manager: Gtk.Widget, shortcut: Gtk.Shortcut): Gtk.Widget | null => {\n for (const current of [manager, ...descendants(manager)]) {\n if (controllersOn(current).some((controller) => isManagingShortcut(controller, shortcut))) {\n return current;\n }\n }\n\n return null;\n};\n\nconst isMovingFocus = (action: Gtk.ShortcutAction): boolean =>\n action instanceof Gtk.SignalAction && action.getSignalName() === \"move-focus\";\n\nconst isShortcutLive = (host: Gtk.Widget): boolean => host.isSensitive() && host.getMapped();\n\nconst didRunShortcutAction = (shortcut: Gtk.Shortcut, host: Gtk.Widget): boolean => {\n const action = shortcut.getAction();\n\n if (action === null || isMovingFocus(action) || !isShortcutLive(host)) {\n return false;\n }\n\n return action.activate(0 as Gtk.ShortcutActionFlags, host, shortcut.getArguments());\n};\n\nconst didActivateShortcut = (\n shortcut: Gtk.Shortcut,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (!isTriggerMatch(shortcut.getTrigger(), keyval, modifiers)) {\n return false;\n }\n\n return didRunShortcutAction(shortcut, managedShortcutHost(widget, shortcut) ?? widget);\n};\n\nconst didActivateMatchingShortcut = (\n controller: Gtk.ShortcutController,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: number,\n): boolean => {\n const count = controller.getNItems();\n\n for (let j = 0; j < count; j++) {\n const shortcut = controller.getItem(j);\n\n if (!(shortcut instanceof Gtk.Shortcut)) {\n continue;\n }\n\n if (didActivateShortcut(shortcut, widget, keyval, modifiers)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isAccelMatch = (accel: string, keyval: number, modifiers: Gdk.ModifierType): boolean => {\n const [isParsed, accelKeyval, accelModifiers] = Gtk.acceleratorParse(accel);\n\n return isParsed && accelKeyval === keyval && accelModifiers === modifiers;\n};\n\nconst hasMatchingAccel = (\n application: Gtk.Application,\n detailedActionName: string,\n keyval: number,\n modifiers: number,\n): boolean =>\n application.getAccelsForAction(detailedActionName).some((accel) => isAccelMatch(accel, keyval, modifiers));\n\nconst didActivateDetailedAction = (window: Gtk.Window, detailedActionName: string): boolean => {\n const [isParsed, actionName, target] = Gio.Action.parseDetailedName(detailedActionName);\n\n return isParsed && window.activateAction(actionName, target);\n};\n\nconst didDispatchAccelsOnWindow = (window: Gtk.Window, keyval: number, modifiers: number): boolean => {\n const application = window.getApplication();\n\n if (!application) {\n return false;\n }\n\n for (const detailedActionName of application.listActionDescriptions()) {\n if (hasMatchingAccel(application, detailedActionName, keyval, modifiers)) {\n return didActivateDetailedAction(window, detailedActionName);\n }\n }\n\n return false;\n};\n\nconst didDispatchApplicationAccels = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const root = widget.getRoot();\n\n return root instanceof Gtk.Window && didDispatchAccelsOnWindow(root, keyval, modifiers);\n};\n\nconst isKeyStopController = (controller: Gtk.EventController): controller is KeyStopController => {\n if (controller instanceof Gtk.ShortcutController) {\n return controller.getScope() === Gtk.ShortcutScope.LOCAL;\n }\n\n return controller instanceof Gtk.EventControllerKey && hasSignalListener(controller, KEY_CONTROLLER_SIGNALS);\n};\n\nconst keyStopsInPhase = (widget: Gtk.Widget, phase: Gtk.PropagationPhase): KeyStop[] => {\n const stops: KeyStop[] = [];\n\n for (const controller of controllersOn(widget)) {\n if (controller.getPropagationPhase() === phase && isKeyStopController(controller)) {\n stops.push({ widget, controller });\n }\n }\n\n return stops;\n};\n\nconst propagationChain = (widget: Gtk.Widget): Gtk.Widget[] => {\n const delegate = getEditableDelegate(widget);\n const below = delegate === null ? [] : [delegate];\n\n return [...below, widget, ...ancestors(widget)];\n};\n\nconst keyPropagationChain = (widget: Gtk.Widget): KeyStop[] => {\n const chain = propagationChain(widget);\n const [eventWidget = widget] = chain;\n\n return [\n ...chain.toReversed().flatMap((current) => keyStopsInPhase(current, Gtk.PropagationPhase.CAPTURE)),\n ...keyStopsInPhase(eventWidget, Gtk.PropagationPhase.TARGET),\n ...chain.flatMap((current) => keyStopsInPhase(current, Gtk.PropagationPhase.BUBBLE)),\n ];\n};\n\nconst didStopHandlePress = (stop: KeyStop, keyval: number, modifiers: Gdk.ModifierType): boolean => {\n const { controller, widget } = stop;\n\n if (controller instanceof Gtk.ShortcutController) {\n return didActivateMatchingShortcut(controller, widget, keyval, modifiers);\n }\n\n return controller.emit(\"key-pressed\", keyval, 0, modifiers);\n};\n\nconst keyTargetFor = (widget: Gtk.Widget): KeyTarget => {\n const root = widget.getRoot();\n\n return { root, focus: root instanceof Gtk.Window ? root.getFocus() : null };\n};\n\nconst isKeyTargetInvalidated = (widget: Gtk.Widget, target: KeyTarget): boolean => {\n const current = keyTargetFor(widget);\n\n return current.root !== target.root || current.focus !== target.focus || !widget.getMapped();\n};\n\nconst didHandlePress = (widget: Gtk.Widget, keyval: number, modifiers: Gdk.ModifierType): boolean => {\n const target = keyTargetFor(widget);\n\n if (didDispatchApplicationAccels(widget, keyval, modifiers)) {\n return true;\n }\n\n if (isKeyTargetInvalidated(widget, target)) {\n return true;\n }\n\n for (const stop of keyPropagationChain(widget)) {\n if (didStopHandlePress(stop, keyval, modifiers) || isKeyTargetInvalidated(widget, target)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst emitKeyReleased = (widget: Gtk.Widget, keyval: number, modifiers: Gdk.ModifierType): void => {\n for (const stop of keyPropagationChain(widget)) {\n if (stop.controller instanceof Gtk.EventControllerKey) {\n stop.controller.emit(\"key-released\", keyval, 0, modifiers);\n }\n }\n};\n\nconst applyKeyPress = async (widget: Gtk.Widget, keyval: number, modifiers: Gdk.ModifierType): Promise<void> => {\n if (didHandlePress(widget, keyval, modifiers)) {\n return;\n }\n\n if (keyval === Gdk.KEY_Return && widget instanceof Gtk.Editable) {\n await fireEvent(widget, \"activate\");\n }\n};\n\nconst applyKeyAction = async (widget: Gtk.Widget, state: UserEventState, action: KeyAction): Promise<void> => {\n updateModifierState(state, action);\n\n if (action.isPress) {\n await applyKeyPress(widget, action.keyval, state.modifierState);\n\n return;\n }\n\n emitKeyReleased(widget, action.keyval, state.modifierState);\n};\n\nconst keyboard = (state: UserEventState, widget: Gtk.Widget, input: string): Promise<void> =>\n wrapEvent(widget, async () => {\n for (const action of parseKeyboardInput(input)) {\n await applyKeyAction(widget, state, action);\n }\n });\n\nexport { tab, keyboard, type TabOptions };\n"]}
@@ -1,4 +1,4 @@
1
- import type * as Gtk from "@gtkx/gi/gtk";
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
2
  declare const applyRowClick: (row: Gtk.Widget, nPress: number) => void;
3
3
  export { applyRowClick };
4
4
  //# sourceMappingURL=list-row-click.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-row-click.d.ts","sourceRoot":"","sources":["../../src/user-event/list-row-click.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AA+CzC,QAAA,MAAM,aAAa,GAAI,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,KAAG,IAIxD,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"list-row-click.d.ts","sourceRoot":"","sources":["../../src/user-event/list-row-click.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AA8CpC,QAAA,MAAM,aAAa,GAAI,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,KAAG,IAIxD,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import * as GLib from "@gtkx/gi/glib";
2
+ import * as Gtk from "@gtkx/gi/gtk";
2
3
  import { ancestors } from "../traversal.js";
3
4
  import { callBooleanGetter, hasWidgetMethod } from "../widget-getters.js";
4
5
  const SELECT_ACTION = "listitem.select";
@@ -26,7 +27,7 @@ const applyRowPress = (row, press) => {
26
27
  }
27
28
  selectRow(row);
28
29
  if (isRowActivatedByPress(row, press)) {
29
- row.activate();
30
+ Gtk.Widget.prototype.activate.call(row);
30
31
  }
31
32
  };
32
33
  const applyRowClick = (row, nPress) => {
@@ -1 +1 @@
1
- {"version":3,"file":"list-row-click.js","sourceRoot":"","sources":["../../src/user-event/list-row-click.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,aAAa,GAAG,iBAAiB,CAAC;AACxC,MAAM,4BAA4B,GAAG,wBAAwB,CAAC;AAC9D,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,OAAO,GAAG,CAAC,GAAe,EAAqB,EAAE;IACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,eAAe,CAAC,QAAQ,EAAE,4BAA4B,CAAC,EAAE,CAAC;YAC1D,OAAO,QAAQ,CAAC;QACpB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,GAAe,EAAW,EAAE;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1B,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,4BAA4B,CAAC,IAAI,KAAK,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAe,EAAQ,EAAE;IACxC,GAAG,CAAC,cAAc,CACd,aAAa,EACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAC1F,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,GAAe,EAAE,KAAa,EAAW,EAAE,CACtE,KAAK,KAAK,kBAAkB,IAAI,2BAA2B,CAAC,GAAG,CAAC,CAAC;AAErE,MAAM,aAAa,GAAG,CAAC,GAAe,EAAE,KAAa,EAAQ,EAAE;IAC3D,IAAI,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;QACxB,GAAG,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,CAAC;IAEf,IAAI,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACnB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,GAAe,EAAE,MAAc,EAAQ,EAAE;IAC5D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport * as GLib from \"@gtkx/gi/glib\";\nimport { ancestors } from \"../traversal.js\";\nimport { callBooleanGetter, hasWidgetMethod } from \"../widget-getters.js\";\n\nconst SELECT_ACTION = \"listitem.select\";\nconst SINGLE_CLICK_ACTIVATE_GETTER = \"getSingleClickActivate\";\nconst DOUBLE_CLICK_PRESS = 2;\n\nconst viewFor = (row: Gtk.Widget): Gtk.Widget | null => {\n for (const ancestor of ancestors(row)) {\n if (hasWidgetMethod(ancestor, SINGLE_CLICK_ACTIVATE_GETTER)) {\n return ancestor;\n }\n }\n\n return null;\n};\n\nconst isViewSingleClickActivating = (row: Gtk.Widget): boolean => {\n const view = viewFor(row);\n\n return view === null ? false : callBooleanGetter(view, SINGLE_CLICK_ACTIVATE_GETTER) ?? false;\n};\n\nconst selectRow = (row: Gtk.Widget): void => {\n row.activateAction(\n SELECT_ACTION,\n GLib.Variant.newTuple([GLib.Variant.newBoolean(false), GLib.Variant.newBoolean(false)]),\n );\n};\n\nconst isRowActivatedByPress = (row: Gtk.Widget, press: number): boolean =>\n press === DOUBLE_CLICK_PRESS || isViewSingleClickActivating(row);\n\nconst applyRowPress = (row: Gtk.Widget, press: number): void => {\n if (row.getFocusOnClick()) {\n row.grabFocus();\n }\n\n selectRow(row);\n\n if (isRowActivatedByPress(row, press)) {\n row.activate();\n }\n};\n\nconst applyRowClick = (row: Gtk.Widget, nPress: number): void => {\n for (let press = 1; press <= nPress; press++) {\n applyRowPress(row, press);\n }\n};\n\nexport { applyRowClick };\n"]}
1
+ {"version":3,"file":"list-row-click.js","sourceRoot":"","sources":["../../src/user-event/list-row-click.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,aAAa,GAAG,iBAAiB,CAAC;AACxC,MAAM,4BAA4B,GAAG,wBAAwB,CAAC;AAC9D,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,OAAO,GAAG,CAAC,GAAe,EAAqB,EAAE;IACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,eAAe,CAAC,QAAQ,EAAE,4BAA4B,CAAC,EAAE,CAAC;YAC1D,OAAO,QAAQ,CAAC;QACpB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,GAAe,EAAW,EAAE;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1B,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,4BAA4B,CAAC,IAAI,KAAK,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAe,EAAQ,EAAE;IACxC,GAAG,CAAC,cAAc,CACd,aAAa,EACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAC1F,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,GAAe,EAAE,KAAa,EAAW,EAAE,CACtE,KAAK,KAAK,kBAAkB,IAAI,2BAA2B,CAAC,GAAG,CAAC,CAAC;AAErE,MAAM,aAAa,GAAG,CAAC,GAAe,EAAE,KAAa,EAAQ,EAAE;IAC3D,IAAI,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;QACxB,GAAG,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,CAAC;IAEf,IAAI,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,GAAe,EAAE,MAAc,EAAQ,EAAE;IAC5D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import * as GLib from \"@gtkx/gi/glib\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { ancestors } from \"../traversal.js\";\nimport { callBooleanGetter, hasWidgetMethod } from \"../widget-getters.js\";\n\nconst SELECT_ACTION = \"listitem.select\";\nconst SINGLE_CLICK_ACTIVATE_GETTER = \"getSingleClickActivate\";\nconst DOUBLE_CLICK_PRESS = 2;\n\nconst viewFor = (row: Gtk.Widget): Gtk.Widget | null => {\n for (const ancestor of ancestors(row)) {\n if (hasWidgetMethod(ancestor, SINGLE_CLICK_ACTIVATE_GETTER)) {\n return ancestor;\n }\n }\n\n return null;\n};\n\nconst isViewSingleClickActivating = (row: Gtk.Widget): boolean => {\n const view = viewFor(row);\n\n return view === null ? false : callBooleanGetter(view, SINGLE_CLICK_ACTIVATE_GETTER) ?? false;\n};\n\nconst selectRow = (row: Gtk.Widget): void => {\n row.activateAction(\n SELECT_ACTION,\n GLib.Variant.newTuple([GLib.Variant.newBoolean(false), GLib.Variant.newBoolean(false)]),\n );\n};\n\nconst isRowActivatedByPress = (row: Gtk.Widget, press: number): boolean =>\n press === DOUBLE_CLICK_PRESS || isViewSingleClickActivating(row);\n\nconst applyRowPress = (row: Gtk.Widget, press: number): void => {\n if (row.getFocusOnClick()) {\n row.grabFocus();\n }\n\n selectRow(row);\n\n if (isRowActivatedByPress(row, press)) {\n Gtk.Widget.prototype.activate.call(row);\n }\n};\n\nconst applyRowClick = (row: Gtk.Widget, nPress: number): void => {\n for (let press = 1; press <= nPress; press++) {\n applyRowPress(row, press);\n }\n};\n\nexport { applyRowClick };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;;GAGG;AACH,KAAK,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;AAoE9F,QAAA,MAAM,OAAO,GAAI,OAAO,cAAc,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAGxF,CAAC;AAEP,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;;GAGG;AACH,KAAK,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;AAiE9F,QAAA,MAAM,OAAO,GAAI,OAAO,cAAc,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAGxF,CAAC;AAEP,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,CAAC"}
@@ -1,6 +1,6 @@
1
- import { clickGestures, emitClickPhase, getAuthoredClickGestures } from "./click.js";
1
+ import { directClickFor, emitSitePhase } from "./click.js";
2
2
  import { wrapEvent } from "./event-wrapper.js";
3
- import { isClickTransparent, nativeClickFor } from "./native-click.js";
3
+ import { isClickTransparent } from "./native-click.js";
4
4
  const PRESS_INPUTS = new Set(["[MouseLeft>]", "down"]);
5
5
  const RELEASE_INPUTS = new Set(["[/MouseLeft]", "up"]);
6
6
  const CLICK_INPUTS = new Set(["[MouseLeft]", "click"]);
@@ -15,20 +15,18 @@ const pointerWidgetFor = (widget) => {
15
15
  }
16
16
  return current;
17
17
  };
18
- const pointerGesturesFor = (widget, native) => native === null ? clickGestures(widget) : getAuthoredClickGestures(widget);
19
18
  const pointerTargetFor = (widget) => {
20
19
  const target = pointerWidgetFor(widget);
21
- const native = nativeClickFor(target, true);
22
- return { widget: target, gestures: pointerGesturesFor(target, native), native };
20
+ return { widget: target, click: directClickFor(target) };
23
21
  };
24
- const pressPointer = ({ widget, gestures }) => {
25
- emitClickPhase(widget, gestures, 1, "pressed");
22
+ const pressPointer = ({ click }) => {
23
+ emitSitePhase(click.sites, 1, "pressed");
26
24
  };
27
- const releasePointer = ({ widget, gestures, native }) => {
28
- emitClickPhase(widget, gestures, 1, "released");
29
- native?.(widget, 1);
25
+ const releasePointer = ({ widget, click }) => {
26
+ emitSitePhase(click.sites, 1, "released");
27
+ click.outcome?.(widget, 1);
30
28
  };
31
- const isPointerPressable = (target) => target.native !== null || target.gestures.length > 0;
29
+ const isPointerPressable = (target) => target.click.outcome !== null || target.click.sites.some((site) => site.gestures.length > 0);
32
30
  const applyPointerInput = (widget, state, input) => {
33
31
  const target = pointerTargetFor(widget);
34
32
  if (CLICK_INPUTS.has(input)) {
@@ -1 +1 @@
1
- {"version":3,"file":"pointer.js","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { NativeClick } from \"./native-click.js\";\nimport type { UserEventState } from \"./state.js\";\nimport { clickGestures, emitClickPhase, getAuthoredClickGestures } from \"./click.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\nimport { isClickTransparent, nativeClickFor } from \"./native-click.js\";\n\n/**\n * A pointer action token: a full click (`click`, `[MouseLeft]`), a button press (`down`,\n * `[MouseLeft>]`), or a button release (`up`, `[/MouseLeft]`).\n */\ntype PointerInput = \"click\" | \"down\" | \"up\" | \"[MouseLeft]\" | \"[MouseLeft>]\" | \"[/MouseLeft]\";\ntype PointerTarget = { widget: Gtk.Widget; gestures: Gtk.GestureClick[]; native: NativeClick | null };\n\nconst PRESS_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft>]\", \"down\"]);\nconst RELEASE_INPUTS: Set<PointerInput> = new Set([\"[/MouseLeft]\", \"up\"]);\nconst CLICK_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft]\", \"click\"]);\n\nconst pointerWidgetFor = (widget: Gtk.Widget): Gtk.Widget => {\n let current = widget;\n\n while (isClickTransparent(current)) {\n const parent = current.getParent();\n\n if (parent === null) {\n return current;\n }\n\n current = parent;\n }\n\n return current;\n};\n\nconst pointerGesturesFor = (widget: Gtk.Widget, native: NativeClick | null): Gtk.GestureClick[] =>\n native === null ? clickGestures(widget) : getAuthoredClickGestures(widget);\n\nconst pointerTargetFor = (widget: Gtk.Widget): PointerTarget => {\n const target = pointerWidgetFor(widget);\n const native = nativeClickFor(target, true);\n\n return { widget: target, gestures: pointerGesturesFor(target, native), native };\n};\n\nconst pressPointer = ({ widget, gestures }: PointerTarget): void => {\n emitClickPhase(widget, gestures, 1, \"pressed\");\n};\n\nconst releasePointer = ({ widget, gestures, native }: PointerTarget): void => {\n emitClickPhase(widget, gestures, 1, \"released\");\n native?.(widget, 1);\n};\n\nconst isPointerPressable = (target: PointerTarget): boolean => target.native !== null || target.gestures.length > 0;\n\nconst applyPointerInput = (widget: Gtk.Widget, state: UserEventState, input: PointerInput): void => {\n const target = pointerTargetFor(widget);\n\n if (CLICK_INPUTS.has(input)) {\n pressPointer(target);\n releasePointer(target);\n state.isMouseLeftDown = false;\n\n return;\n }\n\n if (PRESS_INPUTS.has(input) && !state.isMouseLeftDown && isPointerPressable(target)) {\n pressPointer(target);\n state.isMouseLeftDown = true;\n\n return;\n }\n\n if (RELEASE_INPUTS.has(input) && state.isMouseLeftDown) {\n releasePointer(target);\n state.isMouseLeftDown = false;\n }\n};\n\nconst pointer = (state: UserEventState, widget: Gtk.Widget, input: PointerInput): Promise<void> =>\n wrapEvent(widget, () => {\n applyPointerInput(widget, state, input);\n });\n\nexport { pointer, type PointerInput };\n"]}
1
+ {"version":3,"file":"pointer.js","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { UserEventState } from \"./state.js\";\nimport { type DirectClick, directClickFor, emitSitePhase } from \"./click.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\nimport { isClickTransparent } from \"./native-click.js\";\n\n/**\n * A pointer action token: a full click (`click`, `[MouseLeft]`), a button press (`down`,\n * `[MouseLeft>]`), or a button release (`up`, `[/MouseLeft]`).\n */\ntype PointerInput = \"click\" | \"down\" | \"up\" | \"[MouseLeft]\" | \"[MouseLeft>]\" | \"[/MouseLeft]\";\ntype PointerTarget = { widget: Gtk.Widget; click: DirectClick };\n\nconst PRESS_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft>]\", \"down\"]);\nconst RELEASE_INPUTS: Set<PointerInput> = new Set([\"[/MouseLeft]\", \"up\"]);\nconst CLICK_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft]\", \"click\"]);\n\nconst pointerWidgetFor = (widget: Gtk.Widget): Gtk.Widget => {\n let current = widget;\n\n while (isClickTransparent(current)) {\n const parent = current.getParent();\n\n if (parent === null) {\n return current;\n }\n\n current = parent;\n }\n\n return current;\n};\n\nconst pointerTargetFor = (widget: Gtk.Widget): PointerTarget => {\n const target = pointerWidgetFor(widget);\n\n return { widget: target, click: directClickFor(target) };\n};\n\nconst pressPointer = ({ click }: PointerTarget): void => {\n emitSitePhase(click.sites, 1, \"pressed\");\n};\n\nconst releasePointer = ({ widget, click }: PointerTarget): void => {\n emitSitePhase(click.sites, 1, \"released\");\n click.outcome?.(widget, 1);\n};\n\nconst isPointerPressable = (target: PointerTarget): boolean =>\n target.click.outcome !== null || target.click.sites.some((site) => site.gestures.length > 0);\n\nconst applyPointerInput = (widget: Gtk.Widget, state: UserEventState, input: PointerInput): void => {\n const target = pointerTargetFor(widget);\n\n if (CLICK_INPUTS.has(input)) {\n pressPointer(target);\n releasePointer(target);\n state.isMouseLeftDown = false;\n\n return;\n }\n\n if (PRESS_INPUTS.has(input) && !state.isMouseLeftDown && isPointerPressable(target)) {\n pressPointer(target);\n state.isMouseLeftDown = true;\n\n return;\n }\n\n if (RELEASE_INPUTS.has(input) && state.isMouseLeftDown) {\n releasePointer(target);\n state.isMouseLeftDown = false;\n }\n};\n\nconst pointer = (state: UserEventState, widget: Gtk.Widget, input: PointerInput): Promise<void> =>\n wrapEvent(widget, () => {\n applyPointerInput(widget, state, input);\n });\n\nexport { pointer, type PointerInput };\n"]}
@@ -1,23 +1,7 @@
1
1
  import * as Gtk from "@gtkx/gi/gtk";
2
- /**
3
- * Selects the items at the given positions through a list, grid, or column view's selection model,
4
- * by setting the selected position of a widget with the COMBO_BOX role, or by selecting the indexed
5
- * children of a list box or flow box through their container. An empty array clears a view's
6
- * selection. The children are never activated, so no row-activated handler runs.
7
- *
8
- * @throws When a view has no selection model, when a COMBO_BOX-role widget is given more than one
9
- * position or exposes no `setSelected`, or when the widget's role is none of COMBO_BOX, GRID, or
10
- * LIST.
11
- */
12
- declare const selectOptions: (widget: Gtk.Widget, values: number | number[]) => Promise<void>;
13
- /**
14
- * Unselects the items at the given positions in a list, grid, or column view, or unselects the
15
- * indexed children of a list box or flow box through their container. A child that is not selected
16
- * is left alone, and no child is activated.
17
- *
18
- * @throws When a view has no selection model, when the widget's role is none of COMBO_BOX, GRID, or
19
- * LIST, or when it exposes no indexed children.
20
- */
21
- declare const deselectOptions: (widget: Gtk.Widget, values: number | number[]) => Promise<void>;
2
+ /** Selects positions without activating them. */
3
+ declare const selectOptions: (widget: Gtk.Accessible, values: number | number[]) => Promise<void>;
4
+ /** Unselects positions without activating them. */
5
+ declare const deselectOptions: (widget: Gtk.Accessible, values: number | number[]) => Promise<void>;
22
6
  export { selectOptions, deselectOptions };
23
7
  //# sourceMappingURL=selection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AA6JpC;;;;;;;;;GASG;AACH,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACd,CAAC;AAoBtE;;;;;;;GAOG;AACH,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACZ,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAmKpC,iDAAiD;AACjD,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,UAAU,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACH,CAAC;AAoBrF,mDAAmD;AACnD,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,UAAU,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACD,CAAC;AAEzF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC"}
@@ -8,9 +8,7 @@ const SELECTABLE_ROLES = new Set([
8
8
  Gtk.AccessibleRole.GRID,
9
9
  Gtk.AccessibleRole.LIST,
10
10
  ]);
11
- const isSelectable = (widget) => {
12
- return SELECTABLE_ROLES.has(widget.getAccessibleRole());
13
- };
11
+ const isSelectable = (widget) => SELECTABLE_ROLES.has(widget.getAccessibleRole());
14
12
  const selectListViewItems = (selectionModel, positions, isExclusive) => {
15
13
  if (positions.length === 0) {
16
14
  selectionModel.unselectRange(0, selectionModel.getNItems());
@@ -94,17 +92,14 @@ const runSelectionEvent = (widget, values, inListView, byRole) => wrapEvent(widg
94
92
  }
95
93
  byRole(widget, valueArray);
96
94
  });
97
- /**
98
- * Selects the items at the given positions through a list, grid, or column view's selection model,
99
- * by setting the selected position of a widget with the COMBO_BOX role, or by selecting the indexed
100
- * children of a list box or flow box through their container. An empty array clears a view's
101
- * selection. The children are never activated, so no row-activated handler runs.
102
- *
103
- * @throws When a view has no selection model, when a COMBO_BOX-role widget is given more than one
104
- * position or exposes no `setSelected`, or when the widget's role is none of COMBO_BOX, GRID, or
105
- * LIST.
106
- */
107
- const selectOptions = (widget, values) => runSelectionEvent(widget, values, selectInListView, selectByRole);
95
+ const requireWidget = (target) => {
96
+ if (!(target instanceof Gtk.Widget)) {
97
+ throw new TypeError("Cannot select options on a non-widget accessible");
98
+ }
99
+ return target;
100
+ };
101
+ /** Selects positions without activating them. */
102
+ const selectOptions = (widget, values) => runSelectionEvent(requireWidget(widget), values, selectInListView, selectByRole);
108
103
  const deselectInListView = (widget, valueArray) => {
109
104
  const selectionModel = requireSelectionModel(widget, "deselect");
110
105
  for (const pos of valueArray) {
@@ -118,14 +113,7 @@ const deselectByRole = (widget, valueArray) => {
118
113
  }
119
114
  applyIndexedChildren(widget, valueArray, unselectChildRow);
120
115
  };
121
- /**
122
- * Unselects the items at the given positions in a list, grid, or column view, or unselects the
123
- * indexed children of a list box or flow box through their container. A child that is not selected
124
- * is left alone, and no child is activated.
125
- *
126
- * @throws When a view has no selection model, when the widget's role is none of COMBO_BOX, GRID, or
127
- * LIST, or when it exposes no indexed children.
128
- */
129
- const deselectOptions = (widget, values) => runSelectionEvent(widget, values, deselectInListView, deselectByRole);
116
+ /** Unselects positions without activating them. */
117
+ const deselectOptions = (widget, values) => runSelectionEvent(requireWidget(widget), values, deselectInListView, deselectByRole);
130
118
  export { selectOptions, deselectOptions };
131
119
  //# sourceMappingURL=selection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { getCallableMethod } from \"../widget-getters.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\nimport {\n getChildAtIndex,\n hasIndexedChildren,\n isChildSelected,\n selectContainerChild,\n unselectContainerChild,\n} from \"./indexed-children.js\";\n\ntype CollectionWidget = Gtk.ListView | Gtk.GridView | Gtk.ColumnView;\ntype IndexedChildAction = (container: Gtk.Widget, child: Gtk.Widget) => void;\n\nconst SELECTABLE_ROLES: Set<Gtk.AccessibleRole> = new Set([\n Gtk.AccessibleRole.COMBO_BOX,\n Gtk.AccessibleRole.GRID,\n Gtk.AccessibleRole.LIST,\n]);\n\nconst isSelectable = (widget: Gtk.Widget): boolean => {\n return SELECTABLE_ROLES.has(widget.getAccessibleRole());\n};\n\nconst selectListViewItems = (\n selectionModel: Gtk.SelectionModel,\n positions: number[],\n isExclusive: boolean,\n): void => {\n if (positions.length === 0) {\n selectionModel.unselectRange(0, selectionModel.getNItems());\n\n return;\n }\n\n const [first] = positions;\n\n if (isExclusive && first !== undefined && positions.length === 1) {\n selectionModel.selectItem(first, true);\n\n return;\n }\n\n const nItems = selectionModel.getNItems();\n const selected = Gtk.Bitset.newEmpty();\n const mask = Gtk.Bitset.newRange(0, nItems);\n\n for (const pos of positions) {\n selected.add(pos);\n }\n\n selectionModel.setSelection(selected, mask);\n};\n\nconst isListView = (widget: Gtk.Widget): widget is CollectionWidget =>\n widget instanceof Gtk.ListView || widget instanceof Gtk.GridView || widget instanceof Gtk.ColumnView;\n\nconst getIndexSelector = (widget: Gtk.Widget): ((position: number) => void) | null =>\n getCallableMethod<[number], unknown>(widget, \"setSelected\");\n\nconst selectDropDownOption = (widget: Gtk.Widget, valueArray: number[]): void => {\n const setSelected = getIndexSelector(widget);\n\n if (!setSelected) {\n throw new TypeError(\"Cannot select options: the COMBO_BOX role needs a widget exposing setSelected\");\n }\n\n if (valueArray.length > 1) {\n throw new Error(\"Cannot select multiple options: a drop-down only supports single selection\");\n }\n\n const [selection] = valueArray;\n\n if (selection !== undefined) {\n setSelected(selection);\n }\n};\n\nconst unselectChildRow = (container: Gtk.Widget, child: Gtk.Widget): void => {\n if (isChildSelected(child)) {\n unselectContainerChild(container, child);\n }\n};\n\nconst applyIndexedChildren = (widget: Gtk.Widget, valueArray: number[], apply: IndexedChildAction): void => {\n for (const value of valueArray) {\n const child = getChildAtIndex(widget, value);\n\n if (child) {\n apply(widget, child);\n }\n }\n};\n\nconst requireSelectionModel = (\n widget: CollectionWidget,\n verb: string,\n): Gtk.SelectionModel => {\n const selectionModel = widget.getModel();\n\n if (selectionModel === null) {\n throw new Error(`Cannot ${verb} options: list view has no selection model`);\n }\n\n return selectionModel;\n};\n\nconst selectInListView = (widget: CollectionWidget, valueArray: number[]): void => {\n const selectionModel = requireSelectionModel(widget, \"select\");\n const isMultiSelection = selectionModel instanceof Gtk.MultiSelection;\n selectListViewItems(selectionModel, valueArray, !isMultiSelection);\n};\n\nconst requireSelectableRole = (widget: Gtk.Widget, verb: string): void => {\n if (!isSelectable(widget)) {\n throw new Error(\n `Cannot ${verb} options: expected selectable widget (${formatRoleList(SELECTABLE_ROLES)})`,\n );\n }\n};\n\nconst selectByRole = (widget: Gtk.Widget, valueArray: number[]): void => {\n requireSelectableRole(widget, \"select\");\n const role = widget.getAccessibleRole();\n\n if (role === Gtk.AccessibleRole.COMBO_BOX) {\n selectDropDownOption(widget, valueArray);\n\n return;\n }\n\n if (!hasIndexedChildren(widget)) {\n throw new TypeError(\"Cannot select options: the widget exposes no children to select by index\");\n }\n\n applyIndexedChildren(widget, valueArray, selectContainerChild);\n};\n\nconst runSelectionEvent = (\n widget: Gtk.Widget,\n values: number | number[],\n inListView: (view: Gtk.ListView | Gtk.GridView | Gtk.ColumnView, valueArray: number[]) => void,\n byRole: (widget: Gtk.Widget, valueArray: number[]) => void,\n): Promise<void> =>\n wrapEvent(widget, () => {\n const valueArray = Array.isArray(values) ? values : [values];\n\n if (isListView(widget)) {\n inListView(widget, valueArray);\n\n return;\n }\n\n byRole(widget, valueArray);\n });\n\n/**\n * Selects the items at the given positions through a list, grid, or column view's selection model,\n * by setting the selected position of a widget with the COMBO_BOX role, or by selecting the indexed\n * children of a list box or flow box through their container. An empty array clears a view's\n * selection. The children are never activated, so no row-activated handler runs.\n *\n * @throws When a view has no selection model, when a COMBO_BOX-role widget is given more than one\n * position or exposes no `setSelected`, or when the widget's role is none of COMBO_BOX, GRID, or\n * LIST.\n */\nconst selectOptions = (widget: Gtk.Widget, values: number | number[]): Promise<void> =>\n runSelectionEvent(widget, values, selectInListView, selectByRole);\n\nconst deselectInListView = (widget: Gtk.ListView | Gtk.GridView | Gtk.ColumnView, valueArray: number[]): void => {\n const selectionModel = requireSelectionModel(widget, \"deselect\");\n\n for (const pos of valueArray) {\n selectionModel.unselectItem(pos);\n }\n};\n\nconst deselectByRole = (widget: Gtk.Widget, valueArray: number[]): void => {\n requireSelectableRole(widget, \"deselect\");\n\n if (!hasIndexedChildren(widget)) {\n throw new TypeError(\"Cannot deselect options: the widget exposes no children to deselect by index\");\n }\n\n applyIndexedChildren(widget, valueArray, unselectChildRow);\n};\n\n/**\n * Unselects the items at the given positions in a list, grid, or column view, or unselects the\n * indexed children of a list box or flow box through their container. A child that is not selected\n * is left alone, and no child is activated.\n *\n * @throws When a view has no selection model, when the widget's role is none of COMBO_BOX, GRID, or\n * LIST, or when it exposes no indexed children.\n */\nconst deselectOptions = (widget: Gtk.Widget, values: number | number[]): Promise<void> =>\n runSelectionEvent(widget, values, deselectInListView, deselectByRole);\n\nexport { selectOptions, deselectOptions };\n"]}
1
+ {"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { getCallableMethod } from \"../widget-getters.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\nimport {\n getChildAtIndex,\n hasIndexedChildren,\n isChildSelected,\n selectContainerChild,\n unselectContainerChild,\n} from \"./indexed-children.js\";\n\ntype CollectionWidget = Gtk.ListView | Gtk.GridView | Gtk.ColumnView;\ntype IndexedChildAction = (container: Gtk.Widget, child: Gtk.Widget) => void;\n\nconst SELECTABLE_ROLES: Set<Gtk.AccessibleRole> = new Set([\n Gtk.AccessibleRole.COMBO_BOX,\n Gtk.AccessibleRole.GRID,\n Gtk.AccessibleRole.LIST,\n]);\n\nconst isSelectable = (widget: Gtk.Widget): boolean => SELECTABLE_ROLES.has(widget.getAccessibleRole());\n\nconst selectListViewItems = (\n selectionModel: Gtk.SelectionModel,\n positions: number[],\n isExclusive: boolean,\n): void => {\n if (positions.length === 0) {\n selectionModel.unselectRange(0, selectionModel.getNItems());\n\n return;\n }\n\n const [first] = positions;\n\n if (isExclusive && first !== undefined && positions.length === 1) {\n selectionModel.selectItem(first, true);\n\n return;\n }\n\n const nItems = selectionModel.getNItems();\n const selected = Gtk.Bitset.newEmpty();\n const mask = Gtk.Bitset.newRange(0, nItems);\n\n for (const pos of positions) {\n selected.add(pos);\n }\n\n selectionModel.setSelection(selected, mask);\n};\n\nconst isListView = (widget: Gtk.Widget): widget is CollectionWidget =>\n widget instanceof Gtk.ListView || widget instanceof Gtk.GridView || widget instanceof Gtk.ColumnView;\n\nconst getIndexSelector = (widget: Gtk.Widget): ((position: number) => void) | null =>\n getCallableMethod<[number], unknown>(widget, \"setSelected\");\n\nconst selectDropDownOption = (widget: Gtk.Widget, valueArray: number[]): void => {\n const setSelected = getIndexSelector(widget);\n\n if (!setSelected) {\n throw new TypeError(\"Cannot select options: the COMBO_BOX role needs a widget exposing setSelected\");\n }\n\n if (valueArray.length > 1) {\n throw new Error(\"Cannot select multiple options: a drop-down only supports single selection\");\n }\n\n const [selection] = valueArray;\n\n if (selection !== undefined) {\n setSelected(selection);\n }\n};\n\nconst unselectChildRow = (container: Gtk.Widget, child: Gtk.Widget): void => {\n if (isChildSelected(child)) {\n unselectContainerChild(container, child);\n }\n};\n\nconst applyIndexedChildren = (widget: Gtk.Widget, valueArray: number[], apply: IndexedChildAction): void => {\n for (const value of valueArray) {\n const child = getChildAtIndex(widget, value);\n\n if (child) {\n apply(widget, child);\n }\n }\n};\n\nconst requireSelectionModel = (\n widget: CollectionWidget,\n verb: string,\n): Gtk.SelectionModel => {\n const selectionModel = widget.getModel();\n\n if (selectionModel === null) {\n throw new Error(`Cannot ${verb} options: list view has no selection model`);\n }\n\n return selectionModel;\n};\n\nconst selectInListView = (widget: CollectionWidget, valueArray: number[]): void => {\n const selectionModel = requireSelectionModel(widget, \"select\");\n const isMultiSelection = selectionModel instanceof Gtk.MultiSelection;\n selectListViewItems(selectionModel, valueArray, !isMultiSelection);\n};\n\nconst requireSelectableRole = (widget: Gtk.Widget, verb: string): void => {\n if (!isSelectable(widget)) {\n throw new Error(\n `Cannot ${verb} options: expected selectable widget (${formatRoleList(SELECTABLE_ROLES)})`,\n );\n }\n};\n\nconst selectByRole = (widget: Gtk.Widget, valueArray: number[]): void => {\n requireSelectableRole(widget, \"select\");\n const role = widget.getAccessibleRole();\n\n if (role === Gtk.AccessibleRole.COMBO_BOX) {\n selectDropDownOption(widget, valueArray);\n\n return;\n }\n\n if (!hasIndexedChildren(widget)) {\n throw new TypeError(\"Cannot select options: the widget exposes no children to select by index\");\n }\n\n applyIndexedChildren(widget, valueArray, selectContainerChild);\n};\n\nconst runSelectionEvent = (\n widget: Gtk.Widget,\n values: number | number[],\n inListView: (view: Gtk.ListView | Gtk.GridView | Gtk.ColumnView, valueArray: number[]) => void,\n byRole: (widget: Gtk.Widget, valueArray: number[]) => void,\n): Promise<void> =>\n wrapEvent(widget, () => {\n const valueArray = Array.isArray(values) ? values : [values];\n\n if (isListView(widget)) {\n inListView(widget, valueArray);\n\n return;\n }\n\n byRole(widget, valueArray);\n });\n\nconst requireWidget = (target: Gtk.Accessible): Gtk.Widget => {\n if (!(target instanceof Gtk.Widget)) {\n throw new TypeError(\"Cannot select options on a non-widget accessible\");\n }\n\n return target;\n};\n\n/** Selects positions without activating them. */\nconst selectOptions = (widget: Gtk.Accessible, values: number | number[]): Promise<void> =>\n runSelectionEvent(requireWidget(widget), values, selectInListView, selectByRole);\n\nconst deselectInListView = (widget: Gtk.ListView | Gtk.GridView | Gtk.ColumnView, valueArray: number[]): void => {\n const selectionModel = requireSelectionModel(widget, \"deselect\");\n\n for (const pos of valueArray) {\n selectionModel.unselectItem(pos);\n }\n};\n\nconst deselectByRole = (widget: Gtk.Widget, valueArray: number[]): void => {\n requireSelectableRole(widget, \"deselect\");\n\n if (!hasIndexedChildren(widget)) {\n throw new TypeError(\"Cannot deselect options: the widget exposes no children to deselect by index\");\n }\n\n applyIndexedChildren(widget, valueArray, unselectChildRow);\n};\n\n/** Unselects positions without activating them. */\nconst deselectOptions = (widget: Gtk.Accessible, values: number | number[]): Promise<void> =>\n runSelectionEvent(requireWidget(widget), values, deselectInListView, deselectByRole);\n\nexport { selectOptions, deselectOptions };\n"]}