@gtkx/testing 1.0.0-rc.1 → 1.0.0-rc.2

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 (182) hide show
  1. package/dist/act.d.ts +6 -6
  2. package/dist/act.d.ts.map +1 -1
  3. package/dist/act.js +34 -26
  4. package/dist/act.js.map +1 -1
  5. package/dist/bound-queries.d.ts +4 -3
  6. package/dist/bound-queries.d.ts.map +1 -1
  7. package/dist/bound-queries.js.map +1 -1
  8. package/dist/build-queries.d.ts +5 -5
  9. package/dist/build-queries.d.ts.map +1 -1
  10. package/dist/build-queries.js +21 -9
  11. package/dist/build-queries.js.map +1 -1
  12. package/dist/cleanup-registry.d.ts +4 -3
  13. package/dist/cleanup-registry.d.ts.map +1 -1
  14. package/dist/cleanup-registry.js +13 -3
  15. package/dist/cleanup-registry.js.map +1 -1
  16. package/dist/config.d.ts +5 -4
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +11 -9
  19. package/dist/config.js.map +1 -1
  20. package/dist/editable.d.ts +6 -5
  21. package/dist/editable.d.ts.map +1 -1
  22. package/dist/editable.js +7 -5
  23. package/dist/editable.js.map +1 -1
  24. package/dist/errors.d.ts +7 -6
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/errors.js +64 -48
  27. package/dist/errors.js.map +1 -1
  28. package/dist/fire-event.d.ts +2 -1
  29. package/dist/fire-event.d.ts.map +1 -1
  30. package/dist/fire-event.js +2 -1
  31. package/dist/fire-event.js.map +1 -1
  32. package/dist/frame-sync.d.ts +2 -1
  33. package/dist/frame-sync.d.ts.map +1 -1
  34. package/dist/frame-sync.js +28 -21
  35. package/dist/frame-sync.js.map +1 -1
  36. package/dist/index.d.ts +2 -2
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +1 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/matchers.d.ts +38 -34
  41. package/dist/matchers.d.ts.map +1 -1
  42. package/dist/matchers.js +72 -58
  43. package/dist/matchers.js.map +1 -1
  44. package/dist/pretty-widget.d.ts +6 -4
  45. package/dist/pretty-widget.d.ts.map +1 -1
  46. package/dist/pretty-widget.js +64 -24
  47. package/dist/pretty-widget.js.map +1 -1
  48. package/dist/queries.d.ts +143 -86
  49. package/dist/queries.d.ts.map +1 -1
  50. package/dist/queries.js +231 -147
  51. package/dist/queries.js.map +1 -1
  52. package/dist/register-test-hooks.js +2 -1
  53. package/dist/register-test-hooks.js.map +1 -1
  54. package/dist/render-hook.d.ts +3 -2
  55. package/dist/render-hook.d.ts.map +1 -1
  56. package/dist/render-hook.js +2 -1
  57. package/dist/render-hook.js.map +1 -1
  58. package/dist/render.d.ts +3 -2
  59. package/dist/render.d.ts.map +1 -1
  60. package/dist/render.js +24 -18
  61. package/dist/render.js.map +1 -1
  62. package/dist/role-helpers.d.ts +6 -5
  63. package/dist/role-helpers.d.ts.map +1 -1
  64. package/dist/role-helpers.js +16 -12
  65. package/dist/role-helpers.js.map +1 -1
  66. package/dist/screen.d.ts +4 -3
  67. package/dist/screen.d.ts.map +1 -1
  68. package/dist/screen.js +13 -11
  69. package/dist/screen.js.map +1 -1
  70. package/dist/screenshot.d.ts +4 -3
  71. package/dist/screenshot.d.ts.map +1 -1
  72. package/dist/screenshot.js +43 -36
  73. package/dist/screenshot.js.map +1 -1
  74. package/dist/suggestions.d.ts +11 -6
  75. package/dist/suggestions.d.ts.map +1 -1
  76. package/dist/suggestions.js +10 -5
  77. package/dist/suggestions.js.map +1 -1
  78. package/dist/traversal.d.ts +7 -7
  79. package/dist/traversal.d.ts.map +1 -1
  80. package/dist/traversal.js +17 -11
  81. package/dist/traversal.js.map +1 -1
  82. package/dist/types.d.ts +39 -24
  83. package/dist/types.d.ts.map +1 -1
  84. package/dist/types.js.map +1 -1
  85. package/dist/user-event/adjustment.d.ts +5 -3
  86. package/dist/user-event/adjustment.d.ts.map +1 -1
  87. package/dist/user-event/adjustment.js +6 -4
  88. package/dist/user-event/adjustment.js.map +1 -1
  89. package/dist/user-event/click.d.ts +6 -5
  90. package/dist/user-event/click.d.ts.map +1 -1
  91. package/dist/user-event/click.js +29 -21
  92. package/dist/user-event/click.js.map +1 -1
  93. package/dist/user-event/controller.d.ts +6 -5
  94. package/dist/user-event/controller.d.ts.map +1 -1
  95. package/dist/user-event/controller.js +9 -6
  96. package/dist/user-event/controller.js.map +1 -1
  97. package/dist/user-event/dispatch.d.ts +3 -3
  98. package/dist/user-event/dispatch.d.ts.map +1 -1
  99. package/dist/user-event/dispatch.js +3 -2
  100. package/dist/user-event/dispatch.js.map +1 -1
  101. package/dist/user-event/event-wrapper.d.ts +2 -1
  102. package/dist/user-event/event-wrapper.d.ts.map +1 -1
  103. package/dist/user-event/event-wrapper.js +27 -16
  104. package/dist/user-event/event-wrapper.js.map +1 -1
  105. package/dist/user-event/gesture.d.ts +18 -14
  106. package/dist/user-event/gesture.d.ts.map +1 -1
  107. package/dist/user-event/gesture.js +70 -37
  108. package/dist/user-event/gesture.js.map +1 -1
  109. package/dist/user-event/index.d.ts +17 -10
  110. package/dist/user-event/index.d.ts.map +1 -1
  111. package/dist/user-event/index.js +7 -3
  112. package/dist/user-event/index.js.map +1 -1
  113. package/dist/user-event/keyboard.d.ts +4 -3
  114. package/dist/user-event/keyboard.d.ts.map +1 -1
  115. package/dist/user-event/keyboard.js +89 -58
  116. package/dist/user-event/keyboard.js.map +1 -1
  117. package/dist/user-event/pointer.d.ts +7 -3
  118. package/dist/user-event/pointer.d.ts.map +1 -1
  119. package/dist/user-event/pointer.js +4 -1
  120. package/dist/user-event/pointer.js.map +1 -1
  121. package/dist/user-event/selection.d.ts +3 -2
  122. package/dist/user-event/selection.d.ts.map +1 -1
  123. package/dist/user-event/selection.js +26 -27
  124. package/dist/user-event/selection.js.map +1 -1
  125. package/dist/user-event/state.d.ts +3 -2
  126. package/dist/user-event/state.d.ts.map +1 -1
  127. package/dist/user-event/state.js +2 -1
  128. package/dist/user-event/state.js.map +1 -1
  129. package/dist/user-event/text.d.ts +8 -7
  130. package/dist/user-event/text.d.ts.map +1 -1
  131. package/dist/user-event/text.js +39 -33
  132. package/dist/user-event/text.js.map +1 -1
  133. package/dist/wait-for.d.ts +5 -5
  134. package/dist/wait-for.d.ts.map +1 -1
  135. package/dist/wait-for.js +45 -30
  136. package/dist/wait-for.js.map +1 -1
  137. package/dist/widget-accessible-properties.d.ts +26 -25
  138. package/dist/widget-accessible-properties.d.ts.map +1 -1
  139. package/dist/widget-accessible-properties.js +106 -61
  140. package/dist/widget-accessible-properties.js.map +1 -1
  141. package/dist/within.d.ts +2 -1
  142. package/dist/within.d.ts.map +1 -1
  143. package/dist/within.js +2 -1
  144. package/dist/within.js.map +1 -1
  145. package/package.json +11 -9
  146. package/src/act.ts +44 -35
  147. package/src/bound-queries.ts +5 -4
  148. package/src/build-queries.ts +84 -43
  149. package/src/cleanup-registry.ts +18 -5
  150. package/src/config.ts +16 -12
  151. package/src/editable.ts +13 -6
  152. package/src/errors.ts +106 -45
  153. package/src/fire-event.ts +3 -1
  154. package/src/frame-sync.ts +38 -21
  155. package/src/index.ts +2 -1
  156. package/src/matchers.ts +158 -107
  157. package/src/pretty-widget.ts +114 -42
  158. package/src/queries.ts +422 -233
  159. package/src/register-test-hooks.ts +4 -1
  160. package/src/render-hook.tsx +10 -4
  161. package/src/render.tsx +58 -33
  162. package/src/role-helpers.ts +29 -16
  163. package/src/screen.ts +17 -12
  164. package/src/screenshot.ts +61 -38
  165. package/src/suggestions.ts +29 -10
  166. package/src/traversal.ts +35 -15
  167. package/src/types.ts +65 -32
  168. package/src/user-event/adjustment.ts +23 -10
  169. package/src/user-event/click.ts +49 -20
  170. package/src/user-event/controller.ts +21 -7
  171. package/src/user-event/dispatch.ts +4 -2
  172. package/src/user-event/event-wrapper.ts +42 -16
  173. package/src/user-event/gesture.ts +135 -50
  174. package/src/user-event/index.ts +19 -12
  175. package/src/user-event/keyboard.ts +147 -61
  176. package/src/user-event/pointer.ts +20 -8
  177. package/src/user-event/selection.ts +69 -32
  178. package/src/user-event/state.ts +4 -2
  179. package/src/user-event/text.ts +73 -38
  180. package/src/wait-for.ts +77 -36
  181. package/src/widget-accessible-properties.ts +218 -74
  182. package/src/within.ts +7 -4
@@ -10,22 +10,44 @@ const WINDOW_NOT_ACTIVE = "its window never became active";
10
10
 
11
11
  const actionableHop = (): Promise<void> => new Promise((resolve) => setTimeout(resolve, 1));
12
12
 
13
- const displayDeliversActivation = (window: Gtk.Window): boolean => window.getDisplay().getDefaultSeat() !== null;
13
+ const canDisplayDeliverActivation = (window: Gtk.Window): boolean =>
14
+ window.getDisplay().getDefaultSeat() !== null;
15
+
16
+ const findWindowActionabilityFailure = (widget: Gtk.Widget, root: Gtk.Window): string | null => {
17
+ if (root.getAllocatedWidth() === 0) {
18
+ return WINDOW_NOT_ALLOCATED;
19
+ }
20
+
21
+ if (!widget.getMapped()) {
22
+ return NOT_MAPPED;
23
+ }
24
+
25
+ if (canDisplayDeliverActivation(root) && !root.isActive()) {
26
+ return WINDOW_NOT_ACTIVE;
27
+ }
28
+
29
+ return null;
30
+ };
14
31
 
15
32
  const findActionabilityFailure = (widget: Gtk.Widget): string | null => {
16
- if (!widget.isSensitive()) return NOT_SENSITIVE;
33
+ if (!widget.isSensitive()) {
34
+ return NOT_SENSITIVE;
35
+ }
36
+
17
37
  const root = widget.getRoot();
18
- if (!(root instanceof Gtk.Window) || !root.getVisible()) return null;
19
- if (root.getAllocatedWidth() === 0) return WINDOW_NOT_ALLOCATED;
20
- if (!widget.getMapped()) return NOT_MAPPED;
21
- if (displayDeliversActivation(root) && !root.isActive()) return WINDOW_NOT_ACTIVE;
22
- return null;
38
+
39
+ if (!(root instanceof Gtk.Window) || !root.getVisible()) {
40
+ return null;
41
+ }
42
+
43
+ return findWindowActionabilityFailure(widget, root);
23
44
  };
24
45
 
25
46
  const describeWidget = (widget: Gtk.Widget): string => {
26
47
  const tag = widget.constructor.name;
27
48
  const name = widget.getName();
28
49
  const nameAttribute = name && !name.endsWith(tag) ? ` name="${name}"` : "";
50
+
29
51
  return `<${tag}${nameAttribute} role="${formatRole(widget.getAccessibleRole())}">`;
30
52
  };
31
53
 
@@ -33,22 +55,26 @@ const waitForActionable = async (widget: Gtk.Widget): Promise<void> => {
33
55
  const timeout = getConfig().actionabilityTimeout;
34
56
  const deadline = Date.now() + timeout;
35
57
  let failure = findActionabilityFailure(widget);
58
+
36
59
  while (failure !== null && Date.now() < deadline) {
37
60
  await actionableHop();
38
61
  failure = findActionabilityFailure(widget);
39
62
  }
63
+
40
64
  if (failure !== null) {
41
65
  throw new Error(
42
- `Cannot dispatch user event: ${describeWidget(widget)} did not become actionable within ${timeout}ms because ${failure}`,
66
+ `Cannot dispatch user event: ${describeWidget(widget)} did not become actionable ` +
67
+ `within ${String(timeout)}ms because ${failure}`,
43
68
  );
44
69
  }
45
70
  };
46
71
 
47
- export const wrapEvent = (widget: Gtk.Widget, body: () => void | PromiseLike<void>): Promise<void> =>
48
- Promise.resolve()
49
- .then(() => waitForActionable(widget))
50
- .then(() =>
51
- runInAct(async () => {
52
- await body();
53
- }),
54
- );
72
+ const wrapEvent = async (widget: Gtk.Widget, body: () => void | PromiseLike<void>): Promise<void> => {
73
+ await waitForActionable(widget);
74
+
75
+ await runInAct(async () => {
76
+ await body();
77
+ });
78
+ };
79
+
80
+ export { wrapEvent };
@@ -5,123 +5,190 @@ import { dispatchOnControllers, dispatchOnOrCreateControllers } from "./dispatch
5
5
  import { wrapEvent } from "./event-wrapper.js";
6
6
 
7
7
  /** The value delivered to a drop target: a primitive (converted to a GObject.Value) or an explicit GObject.Value. */
8
- export type DropContent = string | number | boolean | GObject.Value;
8
+ type DropContent = string | number | boolean | GObject.Value;
9
9
 
10
10
  /** Options for a drop: the drop coordinates within the target. */
11
- export type DropOptions = {
11
+ type DropOptions = {
12
12
  x?: number;
13
13
  y?: number;
14
14
  };
15
15
 
16
16
  /** A drag offset relative to the drag start point. */
17
- export type DragOffset = {
17
+ type DragOffset = {
18
18
  x: number;
19
19
  y: number;
20
20
  };
21
21
 
22
- /** Options for a drag gesture: the starting point, the number of interpolated drag updates, or explicit intermediate offsets emitted before the final one. */
23
- export type DragOptions = {
22
+ /**
23
+ * Options for a drag gesture: the starting point, the number of interpolated drag updates, or
24
+ * explicit intermediate offsets emitted before the final one.
25
+ */
26
+ type DragOptions = {
24
27
  startX?: number;
25
28
  startY?: number;
26
29
  steps?: number;
27
30
  offsets?: DragOffset[];
28
31
  };
29
32
 
33
+ type DragInstancePatch = {
34
+ getStartPoint?: Gtk.GestureDrag["getStartPoint"] | undefined;
35
+ getOffset?: Gtk.GestureDrag["getOffset"] | undefined;
36
+ };
37
+
38
+ type SavedDragState = {
39
+ instance: DragInstancePatch;
40
+ ownsStartPoint: boolean;
41
+ ownsOffset: boolean;
42
+ previousStartPoint: DragInstancePatch["getStartPoint"];
43
+ previousOffset: DragInstancePatch["getOffset"];
44
+ };
45
+
30
46
  const buildDropValue = (content: DropContent): GObject.Value => {
31
- if (content instanceof GObject.Value) return content;
47
+ if (content instanceof GObject.Value) {
48
+ return content;
49
+ }
50
+
32
51
  if (typeof content === "string") {
33
- return GObject.buildValue(GObject.TYPE_STRING, (v) => v.setString(content));
52
+ return GObject.buildValue(GObject.TYPE_STRING, (v) => {
53
+ v.setString(content);
54
+ });
34
55
  }
56
+
35
57
  if (typeof content === "boolean") {
36
- return GObject.buildValue(GObject.TYPE_BOOLEAN, (v) => v.setBoolean(content));
58
+ return GObject.buildValue(GObject.TYPE_BOOLEAN, (v) => {
59
+ v.setBoolean(content);
60
+ });
37
61
  }
38
- return GObject.buildValue(GObject.TYPE_DOUBLE, (v) => v.setDouble(content));
62
+
63
+ return GObject.buildValue(GObject.TYPE_DOUBLE, (v) => {
64
+ v.setDouble(content);
65
+ });
39
66
  };
40
67
 
41
- export const hover = (widget: Gtk.Widget): Promise<void> =>
42
- dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => controller.emit("enter", 0, 0));
68
+ const hover = (widget: Gtk.Widget): Promise<void> =>
69
+ dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {
70
+ controller.emit("enter", 0, 0);
71
+ });
43
72
 
44
- export const unhover = (widget: Gtk.Widget): Promise<void> =>
45
- dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => controller.emit("leave"));
73
+ const unhover = (widget: Gtk.Widget): Promise<void> =>
74
+ dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {
75
+ controller.emit("leave");
76
+ });
46
77
 
47
- export const rotate = (widget: Gtk.Widget, angle: number, deltaAngle: number = angle): Promise<void> =>
48
- dispatchOnControllers(widget, Gtk.GestureRotate, (controller) =>
49
- controller.emit("angle-changed", angle, deltaAngle),
78
+ const rotate = (widget: Gtk.Widget, angle: number, deltaAngle: number = angle): Promise<void> =>
79
+ dispatchOnControllers(widget, Gtk.GestureRotate, (controller) => {
80
+ controller.emit("angle-changed", angle, deltaAngle);
81
+ },
50
82
  );
51
83
 
52
- export const zoom = (widget: Gtk.Widget, scale: number): Promise<void> =>
53
- dispatchOnControllers(widget, Gtk.GestureZoom, (controller) => controller.emit("scale-changed", scale));
84
+ const zoom = (widget: Gtk.Widget, scale: number): Promise<void> =>
85
+ dispatchOnControllers(widget, Gtk.GestureZoom, (controller) => {
86
+ controller.emit("scale-changed", scale);
87
+ });
54
88
 
55
- export const swipe = (widget: Gtk.Widget, velocityX: number, velocityY: number): Promise<void> =>
56
- dispatchOnControllers(widget, Gtk.GestureSwipe, (controller) => controller.emit("swipe", velocityX, velocityY));
89
+ const swipe = (widget: Gtk.Widget, velocityX: number, velocityY: number): Promise<void> =>
90
+ dispatchOnControllers(widget, Gtk.GestureSwipe, (controller) => {
91
+ controller.emit("swipe", velocityX, velocityY);
92
+ });
57
93
 
58
- export const longPress = (widget: Gtk.Widget, x: number = 0, y: number = 0): Promise<void> =>
59
- dispatchOnControllers(widget, Gtk.GestureLongPress, (controller) => controller.emit("pressed", x, y));
94
+ const longPress = (widget: Gtk.Widget, x = 0, y = 0): Promise<void> =>
95
+ dispatchOnControllers(widget, Gtk.GestureLongPress, (controller) => {
96
+ controller.emit("pressed", x, y);
97
+ });
60
98
 
61
- type DragInstancePatch = {
62
- getStartPoint?: Gtk.GestureDrag["getStartPoint"] | undefined;
63
- getOffset?: Gtk.GestureDrag["getOffset"] | undefined;
99
+ const restoreDragState = (saved: SavedDragState): void => {
100
+ const { instance } = saved;
101
+
102
+ if (saved.ownsStartPoint) {
103
+ instance.getStartPoint = saved.previousStartPoint;
104
+ } else {
105
+ delete instance.getStartPoint;
106
+ }
107
+
108
+ if (saved.ownsOffset) {
109
+ instance.getOffset = saved.previousOffset;
110
+ } else {
111
+ delete instance.getOffset;
112
+ }
64
113
  };
65
114
 
66
115
  const patchDragState = (controller: Gtk.GestureDrag, start: DragOffset, offset: () => DragOffset): (() => void) => {
67
116
  const instance: DragInstancePatch = controller;
68
- const ownsStartPoint = Object.hasOwn(instance, "getStartPoint");
69
- const ownsOffset = Object.hasOwn(instance, "getOffset");
70
- const previousStartPoint = instance.getStartPoint;
71
- const previousOffset = instance.getOffset;
117
+
118
+ const saved: SavedDragState = {
119
+ instance,
120
+ ownsStartPoint: Object.hasOwn(instance, "getStartPoint"),
121
+ ownsOffset: Object.hasOwn(instance, "getOffset"),
122
+ previousStartPoint: instance.getStartPoint,
123
+ previousOffset: instance.getOffset,
124
+ };
125
+
72
126
  instance.getStartPoint = () => [true, start.x, start.y];
127
+
73
128
  instance.getOffset = () => {
74
129
  const current = offset();
130
+
75
131
  return [true, current.x, current.y];
76
132
  };
133
+
77
134
  return () => {
78
- if (ownsStartPoint) instance.getStartPoint = previousStartPoint;
79
- else delete instance.getStartPoint;
80
- if (ownsOffset) instance.getOffset = previousOffset;
81
- else delete instance.getOffset;
135
+ restoreDragState(saved);
82
136
  };
83
137
  };
84
138
 
139
+ const emitToControllers = (controllers: Gtk.GestureDrag[], signal: string, x: number, y: number): void => {
140
+ for (const controller of controllers) {
141
+ controller.emit(signal, x, y);
142
+ }
143
+ };
144
+
85
145
  const runDragSequence = (controllers: Gtk.GestureDrag[], start: DragOffset, updates: DragOffset[]): void => {
86
146
  let current: DragOffset = { x: 0, y: 0 };
87
147
  const restores = controllers.map((controller) => patchDragState(controller, start, () => current));
148
+
88
149
  try {
89
- for (const controller of controllers) {
90
- controller.emit("drag-begin", start.x, start.y);
91
- }
150
+ emitToControllers(controllers, "drag-begin", start.x, start.y);
151
+
92
152
  for (const update of updates) {
93
153
  current = update;
94
- for (const controller of controllers) {
95
- controller.emit("drag-update", update.x, update.y);
96
- }
97
- }
98
- for (const controller of controllers) {
99
- controller.emit("drag-end", current.x, current.y);
154
+ emitToControllers(controllers, "drag-update", update.x, update.y);
100
155
  }
156
+
157
+ emitToControllers(controllers, "drag-end", current.x, current.y);
101
158
  } finally {
102
- for (const restore of restores) restore();
159
+ for (const restore of restores) {
160
+ restore();
161
+ }
103
162
  }
104
163
  };
105
164
 
106
165
  const resolveDragUpdates = (dx: number, dy: number, options: DragOptions): DragOffset[] => {
107
- if (options.offsets) return [...options.offsets, { x: dx, y: dy }];
166
+ if (options.offsets) {
167
+ return [...options.offsets, { x: dx, y: dy }];
168
+ }
169
+
108
170
  const steps = Math.max(1, Math.floor(options.steps ?? 2));
109
171
  const updates: DragOffset[] = [];
172
+
110
173
  for (let i = 1; i <= steps; i++) {
111
174
  updates.push({ x: (dx * i) / steps, y: (dy * i) / steps });
112
175
  }
176
+
113
177
  return updates;
114
178
  };
115
179
 
116
- export const drag = async (widget: Gtk.Widget, dx: number, dy: number, options: DragOptions = {}): Promise<void> => {
180
+ const drag = async (widget: Gtk.Widget, dx: number, dy: number, options: DragOptions = {}): Promise<void> => {
117
181
  if (widget instanceof Gtk.Range) {
118
- throw new Error(
119
- "userEvent.drag cannot drive a Gtk.Range's built-in slider (its drag reads pointer coordinates from the display); " +
120
- "use userEvent.slide(range, value) or userEvent.keyboard for sliders",
182
+ throw new TypeError(
183
+ "userEvent.drag cannot drive a Gtk.Range's built-in slider " +
184
+ "(its drag reads pointer coordinates from the display); " +
185
+ "use userEvent.slide(range, value) or userEvent.keyboard for sliders",
121
186
  );
122
187
  }
188
+
123
189
  const start = { x: options.startX ?? 0, y: options.startY ?? 0 };
124
190
  const updates = resolveDragUpdates(dx, dy, options);
191
+
125
192
  await wrapEvent(widget, () => {
126
193
  runDragSequence(getAllControllers(widget, Gtk.GestureDrag), start, updates);
127
194
  });
@@ -129,17 +196,18 @@ export const drag = async (widget: Gtk.Widget, dx: number, dy: number, options:
129
196
 
130
197
  const emitDrop = (target: Gtk.Widget, content: DropContent, options: DropOptions): void => {
131
198
  const dropTargets = getAllControllers(target, Gtk.DropTarget);
199
+
132
200
  for (const dropTarget of dropTargets) {
133
201
  dropTarget.emit("drop", buildDropValue(content), options.x ?? 0, options.y ?? 0);
134
202
  }
135
203
  };
136
204
 
137
- export const drop = (widget: Gtk.Widget, content: DropContent, options: DropOptions = {}): Promise<void> =>
205
+ const drop = (widget: Gtk.Widget, content: DropContent, options: DropOptions = {}): Promise<void> =>
138
206
  wrapEvent(widget, () => {
139
207
  emitDrop(widget, content, options);
140
208
  });
141
209
 
142
- export const dragAndDrop = async (
210
+ const dragAndDrop = async (
143
211
  source: Gtk.Widget,
144
212
  target: Gtk.Widget,
145
213
  content: DropContent,
@@ -148,7 +216,24 @@ export const dragAndDrop = async (
148
216
  await wrapEvent(source, () => {
149
217
  getAllControllers(source, Gtk.DragSource);
150
218
  });
219
+
151
220
  await wrapEvent(target, () => {
152
221
  emitDrop(target, content, options);
153
222
  });
154
223
  };
224
+
225
+ export {
226
+ hover,
227
+ unhover,
228
+ rotate,
229
+ zoom,
230
+ swipe,
231
+ longPress,
232
+ drag,
233
+ drop,
234
+ dragAndDrop,
235
+ type DropContent,
236
+ type DropOptions,
237
+ type DragOffset,
238
+ type DragOptions,
239
+ };
@@ -3,20 +3,16 @@ import { scroll, slide } from "./adjustment.js";
3
3
  import { click, dblClick, tripleClick } from "./click.js";
4
4
  import { drag, dragAndDrop, drop, hover, longPress, rotate, swipe, unhover, zoom } from "./gesture.js";
5
5
  import { keyboard, tab } from "./keyboard.js";
6
- import { type PointerInput, pointer } from "./pointer.js";
6
+ import { pointer, type PointerInput } from "./pointer.js";
7
7
  import { deselectOptions, selectOptions } from "./selection.js";
8
8
  import { createInitialState } from "./state.js";
9
9
  import { clear, copy, cut, paste, type } from "./text.js";
10
10
 
11
- export type { ScrollDelta } from "./adjustment.js";
12
- export type { DragOffset, DragOptions, DropContent, DropOptions } from "./gesture.js";
13
- export type { TabOptions } from "./keyboard.js";
14
- export type { PointerInput } from "./pointer.js";
15
- export type { TypeOptions } from "./text.js";
16
- export { resetClipboard } from "./text.js";
17
-
18
- /** The set of user interaction helpers exposed by {@link userEvent}, covering clicks, typing, keyboard, pointer, gestures, selection, and scrolling. */
19
- export type UserEvent = {
11
+ /**
12
+ * The set of user interaction helpers exposed by {@link userEvent}, covering clicks, typing,
13
+ * keyboard, pointer, gestures, selection, and scrolling.
14
+ */
15
+ type UserEvent = {
20
16
  click: typeof click;
21
17
  dblClick: typeof dblClick;
22
18
  tripleClick: typeof tripleClick;
@@ -45,8 +41,11 @@ export type UserEvent = {
45
41
 
46
42
  const state = createInitialState();
47
43
 
48
- /** High-level helpers that drive widgets by dispatching the same events and gestures GTK4 delivers when someone clicks, types, or drags. */
49
- export const userEvent: UserEvent = {
44
+ /**
45
+ * High-level helpers that drive widgets by dispatching the same events and gestures GTK4 delivers
46
+ * when someone clicks, types, or drags.
47
+ */
48
+ const userEvent: UserEvent = {
50
49
  click,
51
50
  dblClick,
52
51
  tripleClick,
@@ -72,3 +71,11 @@ export const userEvent: UserEvent = {
72
71
  keyboard: (widget: Gtk.Widget, input: string): Promise<void> => keyboard(state, widget, input),
73
72
  pointer: (widget: Gtk.Widget, input: PointerInput): Promise<void> => pointer(state, widget, input),
74
73
  };
74
+
75
+ export type { ScrollDelta } from "./adjustment.js";
76
+ export type { DragOffset, DragOptions, DropContent, DropOptions } from "./gesture.js";
77
+ export type { TabOptions } from "./keyboard.js";
78
+ export type { PointerInput } from "./pointer.js";
79
+ export type { TypeOptions } from "./text.js";
80
+ export { resetClipboard } from "./text.js";
81
+ export { userEvent, type UserEvent };