@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.
- package/dist/act.d.ts +6 -6
- package/dist/act.d.ts.map +1 -1
- package/dist/act.js +34 -26
- package/dist/act.js.map +1 -1
- package/dist/bound-queries.d.ts +4 -3
- package/dist/bound-queries.d.ts.map +1 -1
- package/dist/bound-queries.js.map +1 -1
- package/dist/build-queries.d.ts +5 -5
- package/dist/build-queries.d.ts.map +1 -1
- package/dist/build-queries.js +21 -9
- package/dist/build-queries.js.map +1 -1
- package/dist/cleanup-registry.d.ts +4 -3
- package/dist/cleanup-registry.d.ts.map +1 -1
- package/dist/cleanup-registry.js +13 -3
- package/dist/cleanup-registry.js.map +1 -1
- package/dist/config.d.ts +5 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -9
- package/dist/config.js.map +1 -1
- package/dist/editable.d.ts +6 -5
- package/dist/editable.d.ts.map +1 -1
- package/dist/editable.js +7 -5
- package/dist/editable.js.map +1 -1
- package/dist/errors.d.ts +7 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +64 -48
- package/dist/errors.js.map +1 -1
- package/dist/fire-event.d.ts +2 -1
- package/dist/fire-event.d.ts.map +1 -1
- package/dist/fire-event.js +2 -1
- package/dist/fire-event.js.map +1 -1
- package/dist/frame-sync.d.ts +2 -1
- package/dist/frame-sync.d.ts.map +1 -1
- package/dist/frame-sync.js +28 -21
- package/dist/frame-sync.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/matchers.d.ts +38 -34
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js +72 -58
- package/dist/matchers.js.map +1 -1
- package/dist/pretty-widget.d.ts +6 -4
- package/dist/pretty-widget.d.ts.map +1 -1
- package/dist/pretty-widget.js +64 -24
- package/dist/pretty-widget.js.map +1 -1
- package/dist/queries.d.ts +143 -86
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +231 -147
- package/dist/queries.js.map +1 -1
- package/dist/register-test-hooks.js +2 -1
- package/dist/register-test-hooks.js.map +1 -1
- package/dist/render-hook.d.ts +3 -2
- package/dist/render-hook.d.ts.map +1 -1
- package/dist/render-hook.js +2 -1
- package/dist/render-hook.js.map +1 -1
- package/dist/render.d.ts +3 -2
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +24 -18
- package/dist/render.js.map +1 -1
- package/dist/role-helpers.d.ts +6 -5
- package/dist/role-helpers.d.ts.map +1 -1
- package/dist/role-helpers.js +16 -12
- package/dist/role-helpers.js.map +1 -1
- package/dist/screen.d.ts +4 -3
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +13 -11
- package/dist/screen.js.map +1 -1
- package/dist/screenshot.d.ts +4 -3
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +43 -36
- package/dist/screenshot.js.map +1 -1
- package/dist/suggestions.d.ts +11 -6
- package/dist/suggestions.d.ts.map +1 -1
- package/dist/suggestions.js +10 -5
- package/dist/suggestions.js.map +1 -1
- package/dist/traversal.d.ts +7 -7
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +17 -11
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +39 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +5 -3
- package/dist/user-event/adjustment.d.ts.map +1 -1
- package/dist/user-event/adjustment.js +6 -4
- package/dist/user-event/adjustment.js.map +1 -1
- package/dist/user-event/click.d.ts +6 -5
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +29 -21
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/controller.d.ts +6 -5
- package/dist/user-event/controller.d.ts.map +1 -1
- package/dist/user-event/controller.js +9 -6
- package/dist/user-event/controller.js.map +1 -1
- package/dist/user-event/dispatch.d.ts +3 -3
- package/dist/user-event/dispatch.d.ts.map +1 -1
- package/dist/user-event/dispatch.js +3 -2
- package/dist/user-event/dispatch.js.map +1 -1
- package/dist/user-event/event-wrapper.d.ts +2 -1
- package/dist/user-event/event-wrapper.d.ts.map +1 -1
- package/dist/user-event/event-wrapper.js +27 -16
- package/dist/user-event/event-wrapper.js.map +1 -1
- package/dist/user-event/gesture.d.ts +18 -14
- package/dist/user-event/gesture.d.ts.map +1 -1
- package/dist/user-event/gesture.js +70 -37
- package/dist/user-event/gesture.js.map +1 -1
- package/dist/user-event/index.d.ts +17 -10
- package/dist/user-event/index.d.ts.map +1 -1
- package/dist/user-event/index.js +7 -3
- package/dist/user-event/index.js.map +1 -1
- package/dist/user-event/keyboard.d.ts +4 -3
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +89 -58
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/pointer.d.ts +7 -3
- package/dist/user-event/pointer.d.ts.map +1 -1
- package/dist/user-event/pointer.js +4 -1
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/user-event/selection.d.ts +3 -2
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +26 -27
- package/dist/user-event/selection.js.map +1 -1
- package/dist/user-event/state.d.ts +3 -2
- package/dist/user-event/state.d.ts.map +1 -1
- package/dist/user-event/state.js +2 -1
- package/dist/user-event/state.js.map +1 -1
- package/dist/user-event/text.d.ts +8 -7
- package/dist/user-event/text.d.ts.map +1 -1
- package/dist/user-event/text.js +39 -33
- package/dist/user-event/text.js.map +1 -1
- package/dist/wait-for.d.ts +5 -5
- package/dist/wait-for.d.ts.map +1 -1
- package/dist/wait-for.js +45 -30
- package/dist/wait-for.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +26 -25
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +106 -61
- package/dist/widget-accessible-properties.js.map +1 -1
- package/dist/within.d.ts +2 -1
- package/dist/within.d.ts.map +1 -1
- package/dist/within.js +2 -1
- package/dist/within.js.map +1 -1
- package/package.json +11 -9
- package/src/act.ts +44 -35
- package/src/bound-queries.ts +5 -4
- package/src/build-queries.ts +84 -43
- package/src/cleanup-registry.ts +18 -5
- package/src/config.ts +16 -12
- package/src/editable.ts +13 -6
- package/src/errors.ts +106 -45
- package/src/fire-event.ts +3 -1
- package/src/frame-sync.ts +38 -21
- package/src/index.ts +2 -1
- package/src/matchers.ts +158 -107
- package/src/pretty-widget.ts +114 -42
- package/src/queries.ts +422 -233
- package/src/register-test-hooks.ts +4 -1
- package/src/render-hook.tsx +10 -4
- package/src/render.tsx +58 -33
- package/src/role-helpers.ts +29 -16
- package/src/screen.ts +17 -12
- package/src/screenshot.ts +61 -38
- package/src/suggestions.ts +29 -10
- package/src/traversal.ts +35 -15
- package/src/types.ts +65 -32
- package/src/user-event/adjustment.ts +23 -10
- package/src/user-event/click.ts +49 -20
- package/src/user-event/controller.ts +21 -7
- package/src/user-event/dispatch.ts +4 -2
- package/src/user-event/event-wrapper.ts +42 -16
- package/src/user-event/gesture.ts +135 -50
- package/src/user-event/index.ts +19 -12
- package/src/user-event/keyboard.ts +147 -61
- package/src/user-event/pointer.ts +20 -8
- package/src/user-event/selection.ts +69 -32
- package/src/user-event/state.ts +4 -2
- package/src/user-event/text.ts +73 -38
- package/src/wait-for.ts +77 -36
- package/src/widget-accessible-properties.ts +218 -74
- 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
|
|
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())
|
|
33
|
+
if (!widget.isSensitive()) {
|
|
34
|
+
return NOT_SENSITIVE;
|
|
35
|
+
}
|
|
36
|
+
|
|
17
37
|
const root = widget.getRoot();
|
|
18
|
-
|
|
19
|
-
if (root.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
8
|
+
type DropContent = string | number | boolean | GObject.Value;
|
|
9
9
|
|
|
10
10
|
/** Options for a drop: the drop coordinates within the target. */
|
|
11
|
-
|
|
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
|
-
|
|
17
|
+
type DragOffset = {
|
|
18
18
|
x: number;
|
|
19
19
|
y: number;
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
-
/**
|
|
23
|
-
|
|
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)
|
|
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) =>
|
|
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) =>
|
|
58
|
+
return GObject.buildValue(GObject.TYPE_BOOLEAN, (v) => {
|
|
59
|
+
v.setBoolean(content);
|
|
60
|
+
});
|
|
37
61
|
}
|
|
38
|
-
|
|
62
|
+
|
|
63
|
+
return GObject.buildValue(GObject.TYPE_DOUBLE, (v) => {
|
|
64
|
+
v.setDouble(content);
|
|
65
|
+
});
|
|
39
66
|
};
|
|
40
67
|
|
|
41
|
-
|
|
42
|
-
dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) =>
|
|
68
|
+
const hover = (widget: Gtk.Widget): Promise<void> =>
|
|
69
|
+
dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {
|
|
70
|
+
controller.emit("enter", 0, 0);
|
|
71
|
+
});
|
|
43
72
|
|
|
44
|
-
|
|
45
|
-
dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) =>
|
|
73
|
+
const unhover = (widget: Gtk.Widget): Promise<void> =>
|
|
74
|
+
dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {
|
|
75
|
+
controller.emit("leave");
|
|
76
|
+
});
|
|
46
77
|
|
|
47
|
-
|
|
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
|
-
|
|
53
|
-
dispatchOnControllers(widget, Gtk.GestureZoom, (controller) =>
|
|
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
|
-
|
|
56
|
-
dispatchOnControllers(widget, Gtk.GestureSwipe, (controller) =>
|
|
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
|
-
|
|
59
|
-
dispatchOnControllers(widget, Gtk.GestureLongPress, (controller) =>
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
150
|
+
emitToControllers(controllers, "drag-begin", start.x, start.y);
|
|
151
|
+
|
|
92
152
|
for (const update of updates) {
|
|
93
153
|
current = update;
|
|
94
|
-
|
|
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)
|
|
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)
|
|
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
|
-
|
|
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
|
|
119
|
-
"userEvent.drag cannot drive a Gtk.Range's built-in slider
|
|
120
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
};
|
package/src/user-event/index.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
/**
|
|
49
|
-
|
|
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 };
|