@gtkx/testing 0.21.0 → 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/README.md +137 -34
- package/dist/act.d.ts +19 -0
- package/dist/act.d.ts.map +1 -0
- package/dist/act.js +56 -0
- package/dist/act.js.map +1 -0
- package/dist/bound-queries.d.ts +33 -0
- package/dist/bound-queries.d.ts.map +1 -0
- package/dist/bound-queries.js +2 -0
- package/dist/bound-queries.js.map +1 -0
- package/dist/build-queries.d.ts +16 -0
- package/dist/build-queries.d.ts.map +1 -0
- package/dist/build-queries.js +115 -0
- package/dist/build-queries.js.map +1 -0
- package/dist/cleanup-registry.d.ts +5 -0
- package/dist/cleanup-registry.d.ts.map +1 -0
- package/dist/cleanup-registry.js +21 -0
- package/dist/cleanup-registry.js.map +1 -0
- package/dist/config.d.ts +20 -52
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -46
- package/dist/config.js.map +1 -1
- package/dist/editable.d.ts +8 -0
- package/dist/editable.d.ts.map +1 -0
- package/dist/editable.js +26 -0
- package/dist/editable.js.map +1 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +135 -0
- package/dist/errors.js.map +1 -0
- package/dist/fire-event.d.ts +8 -25
- package/dist/fire-event.d.ts.map +1 -1
- package/dist/fire-event.js +11 -30
- package/dist/fire-event.js.map +1 -1
- package/dist/frame-sync.d.ts +4 -0
- package/dist/frame-sync.d.ts.map +1 -0
- package/dist/frame-sync.js +37 -0
- package/dist/frame-sync.js.map +1 -0
- package/dist/index.d.ts +17 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -7
- package/dist/index.js.map +1 -1
- package/dist/matchers.d.ts +59 -0
- package/dist/matchers.d.ts.map +1 -0
- package/dist/matchers.js +117 -0
- package/dist/matchers.js.map +1 -0
- package/dist/pretty-widget.d.ts +24 -26
- package/dist/pretty-widget.d.ts.map +1 -1
- package/dist/pretty-widget.js +111 -117
- package/dist/pretty-widget.js.map +1 -1
- package/dist/queries.d.ts +190 -180
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +291 -320
- package/dist/queries.js.map +1 -1
- package/dist/register-test-hooks.d.ts +2 -0
- package/dist/register-test-hooks.d.ts.map +1 -0
- package/dist/register-test-hooks.js +16 -0
- package/dist/register-test-hooks.js.map +1 -0
- package/dist/render-hook.d.ts +15 -35
- package/dist/render-hook.d.ts.map +1 -1
- package/dist/render-hook.js +9 -45
- package/dist/render-hook.js.map +1 -1
- package/dist/render.d.ts +13 -42
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +138 -121
- package/dist/render.js.map +1 -1
- package/dist/role-helpers.d.ts +19 -53
- package/dist/role-helpers.d.ts.map +1 -1
- package/dist/role-helpers.js +48 -63
- package/dist/role-helpers.js.map +1 -1
- package/dist/screen.d.ts +7 -63
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +24 -110
- package/dist/screen.js.map +1 -1
- package/dist/screenshot.d.ts +21 -23
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +98 -50
- package/dist/screenshot.js.map +1 -1
- package/dist/suggestions.d.ts +27 -0
- package/dist/suggestions.d.ts.map +1 -0
- package/dist/suggestions.js +61 -0
- package/dist/suggestions.js.map +1 -0
- package/dist/traversal.d.ts +12 -10
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +36 -15
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +115 -169
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +10 -0
- package/dist/user-event/adjustment.d.ts.map +1 -0
- package/dist/user-event/adjustment.js +35 -0
- package/dist/user-event/adjustment.js.map +1 -0
- package/dist/user-event/click.d.ts +8 -0
- package/dist/user-event/click.d.ts.map +1 -0
- package/dist/user-event/click.js +73 -0
- package/dist/user-event/click.js.map +1 -0
- package/dist/user-event/controller.d.ts +8 -0
- package/dist/user-event/controller.d.ts.map +1 -0
- package/dist/user-event/controller.js +31 -0
- package/dist/user-event/controller.js.map +1 -0
- package/dist/user-event/dispatch.d.ts +7 -0
- package/dist/user-event/dispatch.d.ts.map +1 -0
- package/dist/user-event/dispatch.js +11 -0
- package/dist/user-event/dispatch.js.map +1 -0
- package/dist/user-event/event-wrapper.d.ts +4 -0
- package/dist/user-event/event-wrapper.d.ts.map +1 -0
- package/dist/user-event/event-wrapper.js +59 -0
- package/dist/user-event/event-wrapper.js.map +1 -0
- package/dist/user-event/gesture.d.ts +35 -0
- package/dist/user-event/gesture.d.ts.map +1 -0
- package/dist/user-event/gesture.js +138 -0
- package/dist/user-event/gesture.js.map +1 -0
- package/dist/user-event/index.d.ts +51 -0
- package/dist/user-event/index.d.ts.map +1 -0
- package/dist/user-event/index.js +42 -0
- package/dist/user-event/index.js.map +1 -0
- package/dist/user-event/keyboard.d.ts +10 -0
- package/dist/user-event/keyboard.d.ts.map +1 -0
- package/dist/user-event/keyboard.js +204 -0
- package/dist/user-event/keyboard.js.map +1 -0
- package/dist/user-event/pointer.d.ts +10 -0
- package/dist/user-event/pointer.d.ts.map +1 -0
- package/dist/user-event/pointer.js +30 -0
- package/dist/user-event/pointer.js.map +1 -0
- package/dist/user-event/selection.d.ts +5 -0
- package/dist/user-event/selection.d.ts.map +1 -0
- package/dist/user-event/selection.js +105 -0
- package/dist/user-event/selection.js.map +1 -0
- package/dist/user-event/state.d.ts +7 -0
- package/dist/user-event/state.d.ts.map +1 -0
- package/dist/user-event/state.js +3 -0
- package/dist/user-event/state.js.map +1 -0
- package/dist/user-event/text.d.ts +18 -0
- package/dist/user-event/text.d.ts.map +1 -0
- package/dist/user-event/text.js +113 -0
- package/dist/user-event/text.js.map +1 -0
- package/dist/wait-for.d.ts +16 -36
- package/dist/wait-for.d.ts.map +1 -1
- package/dist/wait-for.js +74 -70
- package/dist/wait-for.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +34 -0
- package/dist/widget-accessible-properties.d.ts.map +1 -0
- package/dist/widget-accessible-properties.js +260 -0
- package/dist/widget-accessible-properties.js.map +1 -0
- package/dist/within.d.ts +10 -26
- package/dist/within.d.ts.map +1 -1
- package/dist/within.js +16 -25
- package/dist/within.js.map +1 -1
- package/package.json +23 -12
- package/src/act.ts +77 -0
- package/src/bound-queries.ts +37 -0
- package/src/build-queries.ts +226 -0
- package/src/cleanup-registry.ts +27 -0
- package/src/config.ts +35 -62
- package/src/editable.ts +37 -0
- package/src/errors.ts +191 -0
- package/src/fire-event.ts +13 -38
- package/src/frame-sync.ts +51 -0
- package/src/index.ts +58 -15
- package/src/matchers.ts +251 -0
- package/src/pretty-widget.ts +163 -130
- package/src/queries.ts +485 -396
- package/src/register-test-hooks.ts +19 -0
- package/src/render-hook.tsx +38 -45
- package/src/render.tsx +192 -155
- package/src/role-helpers.ts +65 -72
- package/src/screen.ts +26 -114
- package/src/screenshot.ts +128 -56
- package/src/suggestions.ts +106 -0
- package/src/traversal.ts +56 -22
- package/src/types.ts +144 -172
- package/src/user-event/adjustment.ts +62 -0
- package/src/user-event/click.ts +99 -0
- package/src/user-event/controller.ts +58 -0
- package/src/user-event/dispatch.ts +25 -0
- package/src/user-event/event-wrapper.ts +80 -0
- package/src/user-event/gesture.ts +239 -0
- package/src/user-event/index.ts +81 -0
- package/src/user-event/keyboard.ts +290 -0
- package/src/user-event/pointer.ts +46 -0
- package/src/user-event/selection.ts +159 -0
- package/src/user-event/state.ts +8 -0
- package/src/user-event/text.ts +172 -0
- package/src/wait-for.ts +117 -78
- package/src/widget-accessible-properties.ts +388 -0
- package/src/within.ts +29 -27
- package/dist/bind-queries.d.ts +0 -14
- package/dist/bind-queries.d.ts.map +0 -1
- package/dist/bind-queries.js +0 -29
- package/dist/bind-queries.js.map +0 -1
- package/dist/error-builder.d.ts +0 -28
- package/dist/error-builder.d.ts.map +0 -1
- package/dist/error-builder.js +0 -81
- package/dist/error-builder.js.map +0 -1
- package/dist/timing.d.ts +0 -18
- package/dist/timing.d.ts.map +0 -1
- package/dist/timing.js +0 -18
- package/dist/timing.js.map +0 -1
- package/dist/user-event.d.ts +0 -138
- package/dist/user-event.d.ts.map +0 -1
- package/dist/user-event.js +0 -411
- package/dist/user-event.js.map +0 -1
- package/dist/widget-text.d.ts +0 -69
- package/dist/widget-text.d.ts.map +0 -1
- package/dist/widget-text.js +0 -177
- package/dist/widget-text.js.map +0 -1
- package/dist/widget.d.ts +0 -3
- package/dist/widget.d.ts.map +0 -1
- package/dist/widget.js +0 -13
- package/dist/widget.js.map +0 -1
- package/src/bind-queries.ts +0 -52
- package/src/error-builder.ts +0 -102
- package/src/timing.ts +0 -17
- package/src/user-event.ts +0 -492
- package/src/widget-text.ts +0 -202
- package/src/widget.ts +0 -15
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { getOrCreateControllers, queryController } from "./controller.js";
|
|
3
|
+
import { wrapEvent } from "./event-wrapper.js";
|
|
4
|
+
const getPressPoint = (widget) => {
|
|
5
|
+
const width = widget.getWidth();
|
|
6
|
+
const height = widget.getHeight();
|
|
7
|
+
if (width > 0 && height > 0) {
|
|
8
|
+
return { x: width / 2, y: height / 2 };
|
|
9
|
+
}
|
|
10
|
+
return { x: 0, y: 0 };
|
|
11
|
+
};
|
|
12
|
+
const emitGesture = (widget, controllers, nPress, signal) => {
|
|
13
|
+
const { x, y } = getPressPoint(widget);
|
|
14
|
+
for (const controller of controllers) {
|
|
15
|
+
controller.emit(signal, nPress, x, y);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const emitPress = (widget, controllers, nPress) => {
|
|
19
|
+
emitGesture(widget, controllers, nPress, "pressed");
|
|
20
|
+
};
|
|
21
|
+
const emitRelease = (widget, controllers, nPress) => {
|
|
22
|
+
emitGesture(widget, controllers, nPress, "released");
|
|
23
|
+
};
|
|
24
|
+
const emitClickSequence = (widget, target, nPress) => wrapEvent(widget, () => {
|
|
25
|
+
const controllers = getOrCreateControllers(target, Gtk.GestureClick);
|
|
26
|
+
for (let i = 1; i <= nPress; i++) {
|
|
27
|
+
emitPress(target, controllers, i);
|
|
28
|
+
emitRelease(target, controllers, i);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
const findClickableAncestor = (widget) => {
|
|
32
|
+
let current = widget.getParent();
|
|
33
|
+
while (current) {
|
|
34
|
+
if (current instanceof Gtk.Button || queryController(current, Gtk.GestureClick) !== null) {
|
|
35
|
+
return current;
|
|
36
|
+
}
|
|
37
|
+
current = current.getParent();
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
};
|
|
41
|
+
const tryActivate = async (widget) => {
|
|
42
|
+
if (widget.getAccessibleRole() === Gtk.AccessibleRole.LABEL) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
let isActivated = false;
|
|
46
|
+
await wrapEvent(widget, () => {
|
|
47
|
+
isActivated = widget.activate();
|
|
48
|
+
});
|
|
49
|
+
return isActivated;
|
|
50
|
+
};
|
|
51
|
+
const click = async (widget) => {
|
|
52
|
+
if (widget instanceof Gtk.Button) {
|
|
53
|
+
await emitClickSequence(widget, widget, 1);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (widget instanceof Gtk.Switch) {
|
|
57
|
+
await wrapEvent(widget, () => {
|
|
58
|
+
widget.setActive(!widget.getActive());
|
|
59
|
+
});
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (await tryActivate(widget)) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const target = findClickableAncestor(widget);
|
|
66
|
+
if (target) {
|
|
67
|
+
await emitClickSequence(widget, target, 1);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const dblClick = (widget) => emitClickSequence(widget, widget, 2);
|
|
71
|
+
const tripleClick = (widget) => emitClickSequence(widget, widget, 3);
|
|
72
|
+
export { emitPress, emitRelease, click, dblClick, tripleClick };
|
|
73
|
+
//# sourceMappingURL=click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click.js","sourceRoot":"","sources":["../../src/user-event/click.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { getOrCreateControllers, queryController } from \"./controller.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\nconst getPressPoint = (widget: Gtk.Widget): { x: number; y: number } => {\n const width = widget.getWidth();\n const height = widget.getHeight();\n\n if (width > 0 && height > 0) {\n return { x: width / 2, y: height / 2 };\n }\n\n return { x: 0, y: 0 };\n};\n\nconst emitGesture = (widget: Gtk.Widget, controllers: Gtk.GestureClick[], nPress: number, signal: string): void => {\n const { x, y } = getPressPoint(widget);\n\n for (const controller of controllers) {\n controller.emit(signal, nPress, x, y);\n }\n};\n\nconst emitPress = (widget: Gtk.Widget, controllers: Gtk.GestureClick[], nPress: number): void => {\n emitGesture(widget, controllers, nPress, \"pressed\");\n};\n\nconst emitRelease = (widget: Gtk.Widget, controllers: Gtk.GestureClick[], nPress: number): void => {\n emitGesture(widget, controllers, nPress, \"released\");\n};\n\nconst emitClickSequence = (widget: Gtk.Widget, target: Gtk.Widget, nPress: number): Promise<void> =>\n wrapEvent(widget, () => {\n const controllers = getOrCreateControllers(target, Gtk.GestureClick);\n\n for (let i = 1; i <= nPress; i++) {\n emitPress(target, controllers, i);\n emitRelease(target, controllers, i);\n }\n });\n\nconst findClickableAncestor = (widget: Gtk.Widget): Gtk.Widget | null => {\n let current = widget.getParent();\n\n while (current) {\n if (current instanceof Gtk.Button || queryController(current, Gtk.GestureClick) !== null) {\n return current;\n }\n\n current = current.getParent();\n }\n\n return null;\n};\n\nconst tryActivate = async (widget: Gtk.Widget): Promise<boolean> => {\n if (widget.getAccessibleRole() === Gtk.AccessibleRole.LABEL) {\n return false;\n }\n\n let isActivated = false;\n\n await wrapEvent(widget, () => {\n isActivated = widget.activate();\n });\n\n return isActivated;\n};\n\nconst click = async (widget: Gtk.Widget): Promise<void> => {\n if (widget instanceof Gtk.Button) {\n await emitClickSequence(widget, widget, 1);\n\n return;\n }\n\n if (widget instanceof Gtk.Switch) {\n await wrapEvent(widget, () => {\n widget.setActive(!widget.getActive());\n });\n\n return;\n }\n\n if (await tryActivate(widget)) {\n return;\n }\n\n const target = findClickableAncestor(widget);\n\n if (target) {\n await emitClickSequence(widget, target, 1);\n }\n};\n\nconst dblClick = (widget: Gtk.Widget): Promise<void> => emitClickSequence(widget, widget, 2);\nconst tripleClick = (widget: Gtk.Widget): Promise<void> => emitClickSequence(widget, widget, 3);\n\nexport { emitPress, emitRelease, click, dblClick, tripleClick };\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
type ControllerConstructor<T extends Gtk.EventController> = new () => T;
|
|
3
|
+
declare const queryAllControllers: <T extends Gtk.EventController>(widget: Gtk.Widget, controllerType: ControllerConstructor<T>) => T[];
|
|
4
|
+
declare const queryController: <T extends Gtk.EventController>(widget: Gtk.Widget, controllerType: ControllerConstructor<T>) => T | null;
|
|
5
|
+
declare const getAllControllers: <T extends Gtk.EventController>(widget: Gtk.Widget, controllerType: ControllerConstructor<T>) => T[];
|
|
6
|
+
declare const getOrCreateControllers: <T extends Gtk.EventController>(widget: Gtk.Widget, controllerType: ControllerConstructor<T>) => T[];
|
|
7
|
+
export { queryAllControllers, queryController, getAllControllers, getOrCreateControllers, type ControllerConstructor };
|
|
8
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/user-event/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAEzC,KAAK,qBAAqB,CAAC,CAAC,SAAS,GAAG,CAAC,eAAe,IAAI,UAAU,CAAC,CAAC;AAExE,QAAA,MAAM,mBAAmB,GAAI,CAAC,SAAS,GAAG,CAAC,eAAe,EACtD,QAAQ,GAAG,CAAC,MAAM,EAClB,gBAAgB,qBAAqB,CAAC,CAAC,CAAC,KACzC,CAAC,EAcH,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,CAAC,SAAS,GAAG,CAAC,eAAe,EAClD,QAAQ,GAAG,CAAC,MAAM,EAClB,gBAAgB,qBAAqB,CAAC,CAAC,CAAC,KACzC,CAAC,GAAG,IAA8D,CAAC;AAEtE,QAAA,MAAM,iBAAiB,GAAI,CAAC,SAAS,GAAG,CAAC,eAAe,EACpD,QAAQ,GAAG,CAAC,MAAM,EAClB,gBAAgB,qBAAqB,CAAC,CAAC,CAAC,KACzC,CAAC,EAQH,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAI,CAAC,SAAS,GAAG,CAAC,eAAe,EACzD,QAAQ,GAAG,CAAC,MAAM,EAClB,gBAAgB,qBAAqB,CAAC,CAAC,CAAC,KACzC,CAAC,EAWH,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,KAAK,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const queryAllControllers = (widget, controllerType) => {
|
|
2
|
+
const controllers = widget.observeControllers();
|
|
3
|
+
const nItems = controllers.getNItems();
|
|
4
|
+
const matches = [];
|
|
5
|
+
for (let i = 0; i < nItems; i++) {
|
|
6
|
+
const controller = controllers.getItem(i);
|
|
7
|
+
if (controller instanceof controllerType) {
|
|
8
|
+
matches.push(controller);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return matches;
|
|
12
|
+
};
|
|
13
|
+
const queryController = (widget, controllerType) => queryAllControllers(widget, controllerType)[0] ?? null;
|
|
14
|
+
const getAllControllers = (widget, controllerType) => {
|
|
15
|
+
const controllers = queryAllControllers(widget, controllerType);
|
|
16
|
+
if (controllers.length === 0) {
|
|
17
|
+
throw new Error(`No ${controllerType.name} controller is attached to the widget`);
|
|
18
|
+
}
|
|
19
|
+
return controllers;
|
|
20
|
+
};
|
|
21
|
+
const getOrCreateControllers = (widget, controllerType) => {
|
|
22
|
+
const existing = queryAllControllers(widget, controllerType);
|
|
23
|
+
if (existing.length > 0) {
|
|
24
|
+
return existing;
|
|
25
|
+
}
|
|
26
|
+
const controller = new controllerType();
|
|
27
|
+
widget.addController(controller);
|
|
28
|
+
return [controller];
|
|
29
|
+
};
|
|
30
|
+
export { queryAllControllers, queryController, getAllControllers, getOrCreateControllers };
|
|
31
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/user-event/controller.ts"],"names":[],"mappings":"AAIA,MAAM,mBAAmB,GAAG,CACxB,MAAkB,EAClB,cAAwC,EACrC,EAAE;IACL,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;IACvC,MAAM,OAAO,GAAQ,EAAE,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE1C,IAAI,UAAU,YAAY,cAAc,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACpB,MAAkB,EAClB,cAAwC,EAChC,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAEtE,MAAM,iBAAiB,GAAG,CACtB,MAAkB,EAClB,cAAwC,EACrC,EAAE;IACL,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEhE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,MAAM,cAAc,CAAC,IAAI,uCAAuC,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,WAAW,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAC3B,MAAkB,EAClB,cAAwC,EACrC,EAAE;IACL,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAE7D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAC;IACxC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAEjC,OAAO,CAAC,UAAU,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAA8B,CAAC","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\n\ntype ControllerConstructor<T extends Gtk.EventController> = new () => T;\n\nconst queryAllControllers = <T extends Gtk.EventController>(\n widget: Gtk.Widget,\n controllerType: ControllerConstructor<T>,\n): T[] => {\n const controllers = widget.observeControllers();\n const nItems = controllers.getNItems();\n const matches: T[] = [];\n\n for (let i = 0; i < nItems; i++) {\n const controller = controllers.getItem(i);\n\n if (controller instanceof controllerType) {\n matches.push(controller);\n }\n }\n\n return matches;\n};\n\nconst queryController = <T extends Gtk.EventController>(\n widget: Gtk.Widget,\n controllerType: ControllerConstructor<T>,\n): T | null => queryAllControllers(widget, controllerType)[0] ?? null;\n\nconst getAllControllers = <T extends Gtk.EventController>(\n widget: Gtk.Widget,\n controllerType: ControllerConstructor<T>,\n): T[] => {\n const controllers = queryAllControllers(widget, controllerType);\n\n if (controllers.length === 0) {\n throw new Error(`No ${controllerType.name} controller is attached to the widget`);\n }\n\n return controllers;\n};\n\nconst getOrCreateControllers = <T extends Gtk.EventController>(\n widget: Gtk.Widget,\n controllerType: ControllerConstructor<T>,\n): T[] => {\n const existing = queryAllControllers(widget, controllerType);\n\n if (existing.length > 0) {\n return existing;\n }\n\n const controller = new controllerType();\n widget.addController(controller);\n\n return [controller];\n};\n\nexport { queryAllControllers, queryController, getAllControllers, getOrCreateControllers, type ControllerConstructor };\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { type ControllerConstructor } from "./controller.js";
|
|
3
|
+
type ControllerEmit<T extends Gtk.EventController> = (controller: T) => void | PromiseLike<void>;
|
|
4
|
+
declare const dispatchOnOrCreateControllers: <T extends Gtk.EventController>(widget: Gtk.Widget, controllerType: ControllerConstructor<T>, emit: ControllerEmit<T>) => Promise<void>;
|
|
5
|
+
declare const dispatchOnControllers: <T extends Gtk.EventController>(widget: Gtk.Widget, controllerType: ControllerConstructor<T>, emit: ControllerEmit<T>) => Promise<void>;
|
|
6
|
+
export { dispatchOnOrCreateControllers, dispatchOnControllers };
|
|
7
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/user-event/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,KAAK,qBAAqB,EAA6C,MAAM,iBAAiB,CAAC;AAGxG,KAAK,cAAc,CAAC,CAAC,SAAS,GAAG,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAQjG,QAAA,MAAM,6BAA6B,GAAI,CAAC,SAAS,GAAG,CAAC,eAAe,EAChE,QAAQ,GAAG,CAAC,MAAM,EAClB,gBAAgB,qBAAqB,CAAC,CAAC,CAAC,EACxC,MAAM,cAAc,CAAC,CAAC,CAAC,KACxB,OAAO,CAAC,IAAI,CAA6F,CAAC;AAE7G,QAAA,MAAM,qBAAqB,GAAI,CAAC,SAAS,GAAG,CAAC,eAAe,EACxD,QAAQ,GAAG,CAAC,MAAM,EAClB,gBAAgB,qBAAqB,CAAC,CAAC,CAAC,EACxC,MAAM,cAAc,CAAC,CAAC,CAAC,KACxB,OAAO,CAAC,IAAI,CAAwF,CAAC;AAExG,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { getAllControllers, getOrCreateControllers } from "./controller.js";
|
|
2
|
+
import { wrapEvent } from "./event-wrapper.js";
|
|
3
|
+
const emitOnAll = async (controllers, emit) => {
|
|
4
|
+
for (const controller of controllers) {
|
|
5
|
+
await emit(controller);
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
const dispatchOnOrCreateControllers = (widget, controllerType, emit) => wrapEvent(widget, () => emitOnAll(getOrCreateControllers(widget, controllerType), emit));
|
|
9
|
+
const dispatchOnControllers = (widget, controllerType, emit) => wrapEvent(widget, () => emitOnAll(getAllControllers(widget, controllerType), emit));
|
|
10
|
+
export { dispatchOnOrCreateControllers, dispatchOnControllers };
|
|
11
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/user-event/dispatch.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,MAAM,SAAS,GAAG,KAAK,EAAiC,WAAgB,EAAE,IAAuB,EAAiB,EAAE;IAChH,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAClC,MAAkB,EAClB,cAAwC,EACxC,IAAuB,EACV,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,sBAAsB,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAE7G,MAAM,qBAAqB,GAAG,CAC1B,MAAkB,EAClB,cAAwC,EACxC,IAAuB,EACV,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAExG,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,CAAC","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { type ControllerConstructor, getAllControllers, getOrCreateControllers } from \"./controller.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\ntype ControllerEmit<T extends Gtk.EventController> = (controller: T) => void | PromiseLike<void>;\n\nconst emitOnAll = async <T extends Gtk.EventController>(controllers: T[], emit: ControllerEmit<T>): Promise<void> => {\n for (const controller of controllers) {\n await emit(controller);\n }\n};\n\nconst dispatchOnOrCreateControllers = <T extends Gtk.EventController>(\n widget: Gtk.Widget,\n controllerType: ControllerConstructor<T>,\n emit: ControllerEmit<T>,\n): Promise<void> => wrapEvent(widget, () => emitOnAll(getOrCreateControllers(widget, controllerType), emit));\n\nconst dispatchOnControllers = <T extends Gtk.EventController>(\n widget: Gtk.Widget,\n controllerType: ControllerConstructor<T>,\n emit: ControllerEmit<T>,\n): Promise<void> => wrapEvent(widget, () => emitOnAll(getAllControllers(widget, controllerType), emit));\n\nexport { dispatchOnOrCreateControllers, dispatchOnControllers };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-wrapper.d.ts","sourceRoot":"","sources":["../../src/user-event/event-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAuEpC,QAAA,MAAM,SAAS,GAAU,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAM/F,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { runInAct } from "../act.js";
|
|
3
|
+
import { getConfig } from "../config.js";
|
|
4
|
+
import { formatRole } from "../role-helpers.js";
|
|
5
|
+
const NOT_SENSITIVE = "it is not sensitive (the widget or one of its ancestors is disabled)";
|
|
6
|
+
const WINDOW_NOT_ALLOCATED = "its window has not been allocated a size";
|
|
7
|
+
const NOT_MAPPED = "it is not mapped (it is not shown on screen, e.g. it is hidden or on a non-visible page)";
|
|
8
|
+
const WINDOW_NOT_ACTIVE = "its window never became active";
|
|
9
|
+
const actionableHop = () => new Promise((resolve) => setTimeout(resolve, 1));
|
|
10
|
+
const canDisplayDeliverActivation = (window) => window.getDisplay().getDefaultSeat() !== null;
|
|
11
|
+
const findWindowActionabilityFailure = (widget, root) => {
|
|
12
|
+
if (root.getAllocatedWidth() === 0) {
|
|
13
|
+
return WINDOW_NOT_ALLOCATED;
|
|
14
|
+
}
|
|
15
|
+
if (!widget.getMapped()) {
|
|
16
|
+
return NOT_MAPPED;
|
|
17
|
+
}
|
|
18
|
+
if (canDisplayDeliverActivation(root) && !root.isActive()) {
|
|
19
|
+
return WINDOW_NOT_ACTIVE;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
};
|
|
23
|
+
const findActionabilityFailure = (widget) => {
|
|
24
|
+
if (!widget.isSensitive()) {
|
|
25
|
+
return NOT_SENSITIVE;
|
|
26
|
+
}
|
|
27
|
+
const root = widget.getRoot();
|
|
28
|
+
if (!(root instanceof Gtk.Window) || !root.getVisible()) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return findWindowActionabilityFailure(widget, root);
|
|
32
|
+
};
|
|
33
|
+
const describeWidget = (widget) => {
|
|
34
|
+
const tag = widget.constructor.name;
|
|
35
|
+
const name = widget.getName();
|
|
36
|
+
const nameAttribute = name && !name.endsWith(tag) ? ` name="${name}"` : "";
|
|
37
|
+
return `<${tag}${nameAttribute} role="${formatRole(widget.getAccessibleRole())}">`;
|
|
38
|
+
};
|
|
39
|
+
const waitForActionable = async (widget) => {
|
|
40
|
+
const timeout = getConfig().actionabilityTimeout;
|
|
41
|
+
const deadline = Date.now() + timeout;
|
|
42
|
+
let failure = findActionabilityFailure(widget);
|
|
43
|
+
while (failure !== null && Date.now() < deadline) {
|
|
44
|
+
await actionableHop();
|
|
45
|
+
failure = findActionabilityFailure(widget);
|
|
46
|
+
}
|
|
47
|
+
if (failure !== null) {
|
|
48
|
+
throw new Error(`Cannot dispatch user event: ${describeWidget(widget)} did not become actionable ` +
|
|
49
|
+
`within ${String(timeout)}ms because ${failure}`);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const wrapEvent = async (widget, body) => {
|
|
53
|
+
await waitForActionable(widget);
|
|
54
|
+
await runInAct(async () => {
|
|
55
|
+
await body();
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
export { wrapEvent };
|
|
59
|
+
//# sourceMappingURL=event-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-wrapper.js","sourceRoot":"","sources":["../../src/user-event/event-wrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { runInAct } from \"../act.js\";\nimport { getConfig } from \"../config.js\";\nimport { formatRole } from \"../role-helpers.js\";\n\nconst NOT_SENSITIVE = \"it is not sensitive (the widget or one of its ancestors is disabled)\";\nconst WINDOW_NOT_ALLOCATED = \"its window has not been allocated a size\";\nconst NOT_MAPPED = \"it is not mapped (it is not shown on screen, e.g. it is hidden or on a non-visible page)\";\nconst WINDOW_NOT_ACTIVE = \"its window never became active\";\n\nconst actionableHop = (): Promise<void> => new Promise((resolve) => setTimeout(resolve, 1));\n\nconst canDisplayDeliverActivation = (window: Gtk.Window): boolean =>\n window.getDisplay().getDefaultSeat() !== null;\n\nconst findWindowActionabilityFailure = (widget: Gtk.Widget, root: Gtk.Window): string | null => {\n if (root.getAllocatedWidth() === 0) {\n return WINDOW_NOT_ALLOCATED;\n }\n\n if (!widget.getMapped()) {\n return NOT_MAPPED;\n }\n\n if (canDisplayDeliverActivation(root) && !root.isActive()) {\n return WINDOW_NOT_ACTIVE;\n }\n\n return null;\n};\n\nconst findActionabilityFailure = (widget: Gtk.Widget): string | null => {\n if (!widget.isSensitive()) {\n return NOT_SENSITIVE;\n }\n\n const root = widget.getRoot();\n\n if (!(root instanceof Gtk.Window) || !root.getVisible()) {\n return null;\n }\n\n return findWindowActionabilityFailure(widget, root);\n};\n\nconst describeWidget = (widget: Gtk.Widget): string => {\n const tag = widget.constructor.name;\n const name = widget.getName();\n const nameAttribute = name && !name.endsWith(tag) ? ` name=\"${name}\"` : \"\";\n\n return `<${tag}${nameAttribute} role=\"${formatRole(widget.getAccessibleRole())}\">`;\n};\n\nconst waitForActionable = async (widget: Gtk.Widget): Promise<void> => {\n const timeout = getConfig().actionabilityTimeout;\n const deadline = Date.now() + timeout;\n let failure = findActionabilityFailure(widget);\n\n while (failure !== null && Date.now() < deadline) {\n await actionableHop();\n failure = findActionabilityFailure(widget);\n }\n\n if (failure !== null) {\n throw new Error(\n `Cannot dispatch user event: ${describeWidget(widget)} did not become actionable ` +\n `within ${String(timeout)}ms because ${failure}`,\n );\n }\n};\n\nconst wrapEvent = async (widget: Gtk.Widget, body: () => void | PromiseLike<void>): Promise<void> => {\n await waitForActionable(widget);\n\n await runInAct(async () => {\n await body();\n });\n};\n\nexport { wrapEvent };\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as GObject from "@gtkx/gi/gobject";
|
|
2
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
+
/** The value delivered to a drop target: a primitive (converted to a GObject.Value) or an explicit GObject.Value. */
|
|
4
|
+
type DropContent = string | number | boolean | GObject.Value;
|
|
5
|
+
/** Options for a drop: the drop coordinates within the target. */
|
|
6
|
+
type DropOptions = {
|
|
7
|
+
x?: number;
|
|
8
|
+
y?: number;
|
|
9
|
+
};
|
|
10
|
+
/** A drag offset relative to the drag start point. */
|
|
11
|
+
type DragOffset = {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Options for a drag gesture: the starting point, the number of interpolated drag updates, or
|
|
17
|
+
* explicit intermediate offsets emitted before the final one.
|
|
18
|
+
*/
|
|
19
|
+
type DragOptions = {
|
|
20
|
+
startX?: number;
|
|
21
|
+
startY?: number;
|
|
22
|
+
steps?: number;
|
|
23
|
+
offsets?: DragOffset[];
|
|
24
|
+
};
|
|
25
|
+
declare const hover: (widget: Gtk.Widget) => Promise<void>;
|
|
26
|
+
declare const unhover: (widget: Gtk.Widget) => Promise<void>;
|
|
27
|
+
declare const rotate: (widget: Gtk.Widget, angle: number, deltaAngle?: number) => Promise<void>;
|
|
28
|
+
declare const zoom: (widget: Gtk.Widget, scale: number) => Promise<void>;
|
|
29
|
+
declare const swipe: (widget: Gtk.Widget, velocityX: number, velocityY: number) => Promise<void>;
|
|
30
|
+
declare const longPress: (widget: Gtk.Widget, x?: number, y?: number) => Promise<void>;
|
|
31
|
+
declare const drag: (widget: Gtk.Widget, dx: number, dy: number, options?: DragOptions) => Promise<void>;
|
|
32
|
+
declare const drop: (widget: Gtk.Widget, content: DropContent, options?: DropOptions) => Promise<void>;
|
|
33
|
+
declare const dragAndDrop: (source: Gtk.Widget, target: Gtk.Widget, content: DropContent, options?: DropOptions) => Promise<void>;
|
|
34
|
+
export { hover, unhover, rotate, zoom, swipe, longPress, drag, drop, dragAndDrop, type DropContent, type DropOptions, type DragOffset, type DragOptions, };
|
|
35
|
+
//# sourceMappingURL=gesture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gesture.d.ts","sourceRoot":"","sources":["../../src/user-event/gesture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAKpC,qHAAqH;AACrH,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;AAE7D,kEAAkE;AAClE,KAAK,WAAW,GAAG;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,sDAAsD;AACtD,KAAK,UAAU,GAAG;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;GAGG;AACH,KAAK,WAAW,GAAG;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CAC1B,CAAC;AAqCF,QAAA,MAAM,KAAK,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,CAAC,IAAI,CAG1C,CAAC;AAEP,QAAA,MAAM,OAAO,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,CAAC,IAAI,CAG5C,CAAC;AAEP,QAAA,MAAM,MAAM,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,aAAY,MAAc,KAAG,OAAO,CAAC,IAAI,CAIvF,CAAC;AAEN,QAAA,MAAM,IAAI,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAGxD,CAAC;AAEP,QAAA,MAAM,KAAK,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,IAAI,CAGhF,CAAC;AAEP,QAAA,MAAM,SAAS,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,UAAK,EAAE,UAAK,KAAG,OAAO,CAAC,IAAI,CAG5D,CAAC;AAmFP,QAAA,MAAM,IAAI,GAAU,QAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,UAAS,WAAgB,KAAG,OAAO,CAAC,IAAI,CAevG,CAAC;AAUF,QAAA,MAAM,IAAI,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,UAAS,WAAgB,KAAG,OAAO,CAAC,IAAI,CAG1F,CAAC;AAEP,QAAA,MAAM,WAAW,GACb,QAAQ,GAAG,CAAC,MAAM,EAClB,QAAQ,GAAG,CAAC,MAAM,EAClB,SAAS,WAAW,EACpB,UAAS,WAAgB,KAC1B,OAAO,CAAC,IAAI,CAQd,CAAC;AAEF,OAAO,EACH,KAAK,EACL,OAAO,EACP,MAAM,EACN,IAAI,EACJ,KAAK,EACL,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACnB,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as GObject from "@gtkx/gi/gobject";
|
|
2
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
+
import { getAllControllers } from "./controller.js";
|
|
4
|
+
import { dispatchOnControllers, dispatchOnOrCreateControllers } from "./dispatch.js";
|
|
5
|
+
import { wrapEvent } from "./event-wrapper.js";
|
|
6
|
+
const buildDropValue = (content) => {
|
|
7
|
+
if (content instanceof GObject.Value) {
|
|
8
|
+
return content;
|
|
9
|
+
}
|
|
10
|
+
if (typeof content === "string") {
|
|
11
|
+
return GObject.buildValue(GObject.TYPE_STRING, (v) => {
|
|
12
|
+
v.setString(content);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (typeof content === "boolean") {
|
|
16
|
+
return GObject.buildValue(GObject.TYPE_BOOLEAN, (v) => {
|
|
17
|
+
v.setBoolean(content);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return GObject.buildValue(GObject.TYPE_DOUBLE, (v) => {
|
|
21
|
+
v.setDouble(content);
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
const hover = (widget) => dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {
|
|
25
|
+
controller.emit("enter", 0, 0);
|
|
26
|
+
});
|
|
27
|
+
const unhover = (widget) => dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {
|
|
28
|
+
controller.emit("leave");
|
|
29
|
+
});
|
|
30
|
+
const rotate = (widget, angle, deltaAngle = angle) => dispatchOnControllers(widget, Gtk.GestureRotate, (controller) => {
|
|
31
|
+
controller.emit("angle-changed", angle, deltaAngle);
|
|
32
|
+
});
|
|
33
|
+
const zoom = (widget, scale) => dispatchOnControllers(widget, Gtk.GestureZoom, (controller) => {
|
|
34
|
+
controller.emit("scale-changed", scale);
|
|
35
|
+
});
|
|
36
|
+
const swipe = (widget, velocityX, velocityY) => dispatchOnControllers(widget, Gtk.GestureSwipe, (controller) => {
|
|
37
|
+
controller.emit("swipe", velocityX, velocityY);
|
|
38
|
+
});
|
|
39
|
+
const longPress = (widget, x = 0, y = 0) => dispatchOnControllers(widget, Gtk.GestureLongPress, (controller) => {
|
|
40
|
+
controller.emit("pressed", x, y);
|
|
41
|
+
});
|
|
42
|
+
const restoreDragState = (saved) => {
|
|
43
|
+
const { instance } = saved;
|
|
44
|
+
if (saved.ownsStartPoint) {
|
|
45
|
+
instance.getStartPoint = saved.previousStartPoint;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
delete instance.getStartPoint;
|
|
49
|
+
}
|
|
50
|
+
if (saved.ownsOffset) {
|
|
51
|
+
instance.getOffset = saved.previousOffset;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
delete instance.getOffset;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const patchDragState = (controller, start, offset) => {
|
|
58
|
+
const instance = controller;
|
|
59
|
+
const saved = {
|
|
60
|
+
instance,
|
|
61
|
+
ownsStartPoint: Object.hasOwn(instance, "getStartPoint"),
|
|
62
|
+
ownsOffset: Object.hasOwn(instance, "getOffset"),
|
|
63
|
+
previousStartPoint: instance.getStartPoint,
|
|
64
|
+
previousOffset: instance.getOffset,
|
|
65
|
+
};
|
|
66
|
+
instance.getStartPoint = () => [true, start.x, start.y];
|
|
67
|
+
instance.getOffset = () => {
|
|
68
|
+
const current = offset();
|
|
69
|
+
return [true, current.x, current.y];
|
|
70
|
+
};
|
|
71
|
+
return () => {
|
|
72
|
+
restoreDragState(saved);
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
const emitToControllers = (controllers, signal, x, y) => {
|
|
76
|
+
for (const controller of controllers) {
|
|
77
|
+
controller.emit(signal, x, y);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const runDragSequence = (controllers, start, updates) => {
|
|
81
|
+
let current = { x: 0, y: 0 };
|
|
82
|
+
const restores = controllers.map((controller) => patchDragState(controller, start, () => current));
|
|
83
|
+
try {
|
|
84
|
+
emitToControllers(controllers, "drag-begin", start.x, start.y);
|
|
85
|
+
for (const update of updates) {
|
|
86
|
+
current = update;
|
|
87
|
+
emitToControllers(controllers, "drag-update", update.x, update.y);
|
|
88
|
+
}
|
|
89
|
+
emitToControllers(controllers, "drag-end", current.x, current.y);
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
for (const restore of restores) {
|
|
93
|
+
restore();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const resolveDragUpdates = (dx, dy, options) => {
|
|
98
|
+
if (options.offsets) {
|
|
99
|
+
return [...options.offsets, { x: dx, y: dy }];
|
|
100
|
+
}
|
|
101
|
+
const steps = Math.max(1, Math.floor(options.steps ?? 2));
|
|
102
|
+
const updates = [];
|
|
103
|
+
for (let i = 1; i <= steps; i++) {
|
|
104
|
+
updates.push({ x: (dx * i) / steps, y: (dy * i) / steps });
|
|
105
|
+
}
|
|
106
|
+
return updates;
|
|
107
|
+
};
|
|
108
|
+
const drag = async (widget, dx, dy, options = {}) => {
|
|
109
|
+
if (widget instanceof Gtk.Range) {
|
|
110
|
+
throw new TypeError("userEvent.drag cannot drive a Gtk.Range's built-in slider " +
|
|
111
|
+
"(its drag reads pointer coordinates from the display); " +
|
|
112
|
+
"use userEvent.slide(range, value) or userEvent.keyboard for sliders");
|
|
113
|
+
}
|
|
114
|
+
const start = { x: options.startX ?? 0, y: options.startY ?? 0 };
|
|
115
|
+
const updates = resolveDragUpdates(dx, dy, options);
|
|
116
|
+
await wrapEvent(widget, () => {
|
|
117
|
+
runDragSequence(getAllControllers(widget, Gtk.GestureDrag), start, updates);
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
const emitDrop = (target, content, options) => {
|
|
121
|
+
const dropTargets = getAllControllers(target, Gtk.DropTarget);
|
|
122
|
+
for (const dropTarget of dropTargets) {
|
|
123
|
+
dropTarget.emit("drop", buildDropValue(content), options.x ?? 0, options.y ?? 0);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
const drop = (widget, content, options = {}) => wrapEvent(widget, () => {
|
|
127
|
+
emitDrop(widget, content, options);
|
|
128
|
+
});
|
|
129
|
+
const dragAndDrop = async (source, target, content, options = {}) => {
|
|
130
|
+
await wrapEvent(source, () => {
|
|
131
|
+
getAllControllers(source, Gtk.DragSource);
|
|
132
|
+
});
|
|
133
|
+
await wrapEvent(target, () => {
|
|
134
|
+
emitDrop(target, content, options);
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
export { hover, unhover, rotate, zoom, swipe, longPress, drag, drop, dragAndDrop, };
|
|
138
|
+
//# sourceMappingURL=gesture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gesture.js","sourceRoot":"","sources":["../../src/user-event/gesture.ts"],"names":[],"mappings":"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","sourcesContent":["import * as GObject from \"@gtkx/gi/gobject\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { getAllControllers } from \"./controller.js\";\nimport { dispatchOnControllers, dispatchOnOrCreateControllers } from \"./dispatch.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** The value delivered to a drop target: a primitive (converted to a GObject.Value) or an explicit GObject.Value. */\ntype DropContent = string | number | boolean | GObject.Value;\n\n/** Options for a drop: the drop coordinates within the target. */\ntype DropOptions = {\n x?: number;\n y?: number;\n};\n\n/** A drag offset relative to the drag start point. */\ntype DragOffset = {\n x: number;\n y: number;\n};\n\n/**\n * Options for a drag gesture: the starting point, the number of interpolated drag updates, or\n * explicit intermediate offsets emitted before the final one.\n */\ntype DragOptions = {\n startX?: number;\n startY?: number;\n steps?: number;\n offsets?: DragOffset[];\n};\n\ntype DragInstancePatch = {\n getStartPoint?: Gtk.GestureDrag[\"getStartPoint\"] | undefined;\n getOffset?: Gtk.GestureDrag[\"getOffset\"] | undefined;\n};\n\ntype SavedDragState = {\n instance: DragInstancePatch;\n ownsStartPoint: boolean;\n ownsOffset: boolean;\n previousStartPoint: DragInstancePatch[\"getStartPoint\"];\n previousOffset: DragInstancePatch[\"getOffset\"];\n};\n\nconst buildDropValue = (content: DropContent): GObject.Value => {\n if (content instanceof GObject.Value) {\n return content;\n }\n\n if (typeof content === \"string\") {\n return GObject.buildValue(GObject.TYPE_STRING, (v) => {\n v.setString(content);\n });\n }\n\n if (typeof content === \"boolean\") {\n return GObject.buildValue(GObject.TYPE_BOOLEAN, (v) => {\n v.setBoolean(content);\n });\n }\n\n return GObject.buildValue(GObject.TYPE_DOUBLE, (v) => {\n v.setDouble(content);\n });\n};\n\nconst hover = (widget: Gtk.Widget): Promise<void> =>\n dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {\n controller.emit(\"enter\", 0, 0);\n });\n\nconst unhover = (widget: Gtk.Widget): Promise<void> =>\n dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {\n controller.emit(\"leave\");\n });\n\nconst rotate = (widget: Gtk.Widget, angle: number, deltaAngle: number = angle): Promise<void> =>\n dispatchOnControllers(widget, Gtk.GestureRotate, (controller) => {\n controller.emit(\"angle-changed\", angle, deltaAngle);\n },\n );\n\nconst zoom = (widget: Gtk.Widget, scale: number): Promise<void> =>\n dispatchOnControllers(widget, Gtk.GestureZoom, (controller) => {\n controller.emit(\"scale-changed\", scale);\n });\n\nconst swipe = (widget: Gtk.Widget, velocityX: number, velocityY: number): Promise<void> =>\n dispatchOnControllers(widget, Gtk.GestureSwipe, (controller) => {\n controller.emit(\"swipe\", velocityX, velocityY);\n });\n\nconst longPress = (widget: Gtk.Widget, x = 0, y = 0): Promise<void> =>\n dispatchOnControllers(widget, Gtk.GestureLongPress, (controller) => {\n controller.emit(\"pressed\", x, y);\n });\n\nconst restoreDragState = (saved: SavedDragState): void => {\n const { instance } = saved;\n\n if (saved.ownsStartPoint) {\n instance.getStartPoint = saved.previousStartPoint;\n } else {\n delete instance.getStartPoint;\n }\n\n if (saved.ownsOffset) {\n instance.getOffset = saved.previousOffset;\n } else {\n delete instance.getOffset;\n }\n};\n\nconst patchDragState = (controller: Gtk.GestureDrag, start: DragOffset, offset: () => DragOffset): (() => void) => {\n const instance: DragInstancePatch = controller;\n\n const saved: SavedDragState = {\n instance,\n ownsStartPoint: Object.hasOwn(instance, \"getStartPoint\"),\n ownsOffset: Object.hasOwn(instance, \"getOffset\"),\n previousStartPoint: instance.getStartPoint,\n previousOffset: instance.getOffset,\n };\n\n instance.getStartPoint = () => [true, start.x, start.y];\n\n instance.getOffset = () => {\n const current = offset();\n\n return [true, current.x, current.y];\n };\n\n return () => {\n restoreDragState(saved);\n };\n};\n\nconst emitToControllers = (controllers: Gtk.GestureDrag[], signal: string, x: number, y: number): void => {\n for (const controller of controllers) {\n controller.emit(signal, x, y);\n }\n};\n\nconst runDragSequence = (controllers: Gtk.GestureDrag[], start: DragOffset, updates: DragOffset[]): void => {\n let current: DragOffset = { x: 0, y: 0 };\n const restores = controllers.map((controller) => patchDragState(controller, start, () => current));\n\n try {\n emitToControllers(controllers, \"drag-begin\", start.x, start.y);\n\n for (const update of updates) {\n current = update;\n emitToControllers(controllers, \"drag-update\", update.x, update.y);\n }\n\n emitToControllers(controllers, \"drag-end\", current.x, current.y);\n } finally {\n for (const restore of restores) {\n restore();\n }\n }\n};\n\nconst resolveDragUpdates = (dx: number, dy: number, options: DragOptions): DragOffset[] => {\n if (options.offsets) {\n return [...options.offsets, { x: dx, y: dy }];\n }\n\n const steps = Math.max(1, Math.floor(options.steps ?? 2));\n const updates: DragOffset[] = [];\n\n for (let i = 1; i <= steps; i++) {\n updates.push({ x: (dx * i) / steps, y: (dy * i) / steps });\n }\n\n return updates;\n};\n\nconst drag = async (widget: Gtk.Widget, dx: number, dy: number, options: DragOptions = {}): Promise<void> => {\n if (widget instanceof Gtk.Range) {\n throw new TypeError(\n \"userEvent.drag cannot drive a Gtk.Range's built-in slider \" +\n \"(its drag reads pointer coordinates from the display); \" +\n \"use userEvent.slide(range, value) or userEvent.keyboard for sliders\",\n );\n }\n\n const start = { x: options.startX ?? 0, y: options.startY ?? 0 };\n const updates = resolveDragUpdates(dx, dy, options);\n\n await wrapEvent(widget, () => {\n runDragSequence(getAllControllers(widget, Gtk.GestureDrag), start, updates);\n });\n};\n\nconst emitDrop = (target: Gtk.Widget, content: DropContent, options: DropOptions): void => {\n const dropTargets = getAllControllers(target, Gtk.DropTarget);\n\n for (const dropTarget of dropTargets) {\n dropTarget.emit(\"drop\", buildDropValue(content), options.x ?? 0, options.y ?? 0);\n }\n};\n\nconst drop = (widget: Gtk.Widget, content: DropContent, options: DropOptions = {}): Promise<void> =>\n wrapEvent(widget, () => {\n emitDrop(widget, content, options);\n });\n\nconst dragAndDrop = async (\n source: Gtk.Widget,\n target: Gtk.Widget,\n content: DropContent,\n options: DropOptions = {},\n): Promise<void> => {\n await wrapEvent(source, () => {\n getAllControllers(source, Gtk.DragSource);\n });\n\n await wrapEvent(target, () => {\n emitDrop(target, content, options);\n });\n};\n\nexport {\n hover,\n unhover,\n rotate,\n zoom,\n swipe,\n longPress,\n drag,\n drop,\n dragAndDrop,\n type DropContent,\n type DropOptions,\n type DragOffset,\n type DragOptions,\n};\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { scroll, slide } from "./adjustment.js";
|
|
3
|
+
import { click, dblClick, tripleClick } from "./click.js";
|
|
4
|
+
import { drag, dragAndDrop, drop, hover, longPress, rotate, swipe, unhover, zoom } from "./gesture.js";
|
|
5
|
+
import { tab } from "./keyboard.js";
|
|
6
|
+
import { type PointerInput } from "./pointer.js";
|
|
7
|
+
import { deselectOptions, selectOptions } from "./selection.js";
|
|
8
|
+
import { clear, copy, cut, paste, type } from "./text.js";
|
|
9
|
+
/**
|
|
10
|
+
* The set of user interaction helpers exposed by {@link userEvent}, covering clicks, typing,
|
|
11
|
+
* keyboard, pointer, gestures, selection, and scrolling.
|
|
12
|
+
*/
|
|
13
|
+
type UserEvent = {
|
|
14
|
+
click: typeof click;
|
|
15
|
+
dblClick: typeof dblClick;
|
|
16
|
+
tripleClick: typeof tripleClick;
|
|
17
|
+
tab: typeof tab;
|
|
18
|
+
type: typeof type;
|
|
19
|
+
clear: typeof clear;
|
|
20
|
+
copy: typeof copy;
|
|
21
|
+
cut: typeof cut;
|
|
22
|
+
paste: typeof paste;
|
|
23
|
+
selectOptions: typeof selectOptions;
|
|
24
|
+
deselectOptions: typeof deselectOptions;
|
|
25
|
+
hover: typeof hover;
|
|
26
|
+
unhover: typeof unhover;
|
|
27
|
+
rotate: typeof rotate;
|
|
28
|
+
zoom: typeof zoom;
|
|
29
|
+
swipe: typeof swipe;
|
|
30
|
+
longPress: typeof longPress;
|
|
31
|
+
drag: typeof drag;
|
|
32
|
+
drop: typeof drop;
|
|
33
|
+
dragAndDrop: typeof dragAndDrop;
|
|
34
|
+
slide: typeof slide;
|
|
35
|
+
scroll: typeof scroll;
|
|
36
|
+
keyboard: (widget: Gtk.Widget, input: string) => Promise<void>;
|
|
37
|
+
pointer: (widget: Gtk.Widget, input: PointerInput) => Promise<void>;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* High-level helpers that drive widgets by dispatching the same events and gestures GTK4 delivers
|
|
41
|
+
* when someone clicks, types, or drags.
|
|
42
|
+
*/
|
|
43
|
+
declare const userEvent: UserEvent;
|
|
44
|
+
export type { ScrollDelta } from "./adjustment.js";
|
|
45
|
+
export type { DragOffset, DragOptions, DropContent, DropOptions } from "./gesture.js";
|
|
46
|
+
export type { TabOptions } from "./keyboard.js";
|
|
47
|
+
export type { PointerInput } from "./pointer.js";
|
|
48
|
+
export type { TypeOptions } from "./text.js";
|
|
49
|
+
export { resetClipboard } from "./text.js";
|
|
50
|
+
export { userEvent, type UserEvent };
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user-event/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACvG,OAAO,EAAY,GAAG,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1D;;;GAGG;AACH,KAAK,SAAS,GAAG;IACb,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,GAAG,EAAE,OAAO,GAAG,CAAC;IAChB,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,GAAG,EAAE,OAAO,GAAG,CAAC;IAChB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE,CAAC;AAIF;;;GAGG;AACH,QAAA,MAAM,SAAS,EAAE,SAyBhB,CAAC;AAEF,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACtF,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { scroll, slide } from "./adjustment.js";
|
|
2
|
+
import { click, dblClick, tripleClick } from "./click.js";
|
|
3
|
+
import { drag, dragAndDrop, drop, hover, longPress, rotate, swipe, unhover, zoom } from "./gesture.js";
|
|
4
|
+
import { keyboard, tab } from "./keyboard.js";
|
|
5
|
+
import { pointer } from "./pointer.js";
|
|
6
|
+
import { deselectOptions, selectOptions } from "./selection.js";
|
|
7
|
+
import { createInitialState } from "./state.js";
|
|
8
|
+
import { clear, copy, cut, paste, type } from "./text.js";
|
|
9
|
+
const state = createInitialState();
|
|
10
|
+
/**
|
|
11
|
+
* High-level helpers that drive widgets by dispatching the same events and gestures GTK4 delivers
|
|
12
|
+
* when someone clicks, types, or drags.
|
|
13
|
+
*/
|
|
14
|
+
const userEvent = {
|
|
15
|
+
click,
|
|
16
|
+
dblClick,
|
|
17
|
+
tripleClick,
|
|
18
|
+
tab,
|
|
19
|
+
type,
|
|
20
|
+
clear,
|
|
21
|
+
copy,
|
|
22
|
+
cut,
|
|
23
|
+
paste,
|
|
24
|
+
selectOptions,
|
|
25
|
+
deselectOptions,
|
|
26
|
+
hover,
|
|
27
|
+
unhover,
|
|
28
|
+
rotate,
|
|
29
|
+
zoom,
|
|
30
|
+
swipe,
|
|
31
|
+
longPress,
|
|
32
|
+
drag,
|
|
33
|
+
drop,
|
|
34
|
+
dragAndDrop,
|
|
35
|
+
slide,
|
|
36
|
+
scroll,
|
|
37
|
+
keyboard: (widget, input) => keyboard(state, widget, input),
|
|
38
|
+
pointer: (widget, input) => pointer(state, widget, input),
|
|
39
|
+
};
|
|
40
|
+
export { resetClipboard } from "./text.js";
|
|
41
|
+
export { userEvent };
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user-event/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAqB,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiC1D,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;AAEnC;;;GAGG;AACH,MAAM,SAAS,GAAc;IACzB,KAAK;IACL,QAAQ;IACR,WAAW;IACX,GAAG;IACH,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,GAAG;IACH,KAAK;IACL,aAAa;IACb,eAAe;IACf,KAAK;IACL,OAAO;IACP,MAAM;IACN,IAAI;IACJ,KAAK;IACL,SAAS;IACT,IAAI;IACJ,IAAI;IACJ,WAAW;IACX,KAAK;IACL,MAAM;IACN,QAAQ,EAAE,CAAC,MAAkB,EAAE,KAAa,EAAiB,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IAC9F,OAAO,EAAE,CAAC,MAAkB,EAAE,KAAmB,EAAiB,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;CACrG,CAAC;AAOF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAkB,CAAC","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\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 } from \"./state.js\";\nimport { clear, copy, cut, paste, type } from \"./text.js\";\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 click: typeof click;\n dblClick: typeof dblClick;\n tripleClick: typeof tripleClick;\n tab: typeof tab;\n type: typeof type;\n clear: typeof clear;\n copy: typeof copy;\n cut: typeof cut;\n paste: typeof paste;\n selectOptions: typeof selectOptions;\n deselectOptions: typeof deselectOptions;\n hover: typeof hover;\n unhover: typeof unhover;\n rotate: typeof rotate;\n zoom: typeof zoom;\n swipe: typeof swipe;\n longPress: typeof longPress;\n drag: typeof drag;\n drop: typeof drop;\n dragAndDrop: typeof dragAndDrop;\n slide: typeof slide;\n scroll: typeof scroll;\n keyboard: (widget: Gtk.Widget, input: string) => Promise<void>;\n pointer: (widget: Gtk.Widget, input: PointerInput) => Promise<void>;\n};\n\nconst state = createInitialState();\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.\n */\nconst userEvent: UserEvent = {\n click,\n dblClick,\n tripleClick,\n tab,\n type,\n clear,\n copy,\n cut,\n paste,\n selectOptions,\n deselectOptions,\n hover,\n unhover,\n rotate,\n zoom,\n swipe,\n longPress,\n drag,\n drop,\n dragAndDrop,\n slide,\n scroll,\n keyboard: (widget: Gtk.Widget, input: string): Promise<void> => keyboard(state, widget, input),\n pointer: (widget: Gtk.Widget, input: PointerInput): Promise<void> => pointer(state, widget, input),\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 };\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import type { UserEventState } from "./state.js";
|
|
3
|
+
/** Options for {@link tab}: when `shift` is set, move focus backward instead of forward. */
|
|
4
|
+
type TabOptions = {
|
|
5
|
+
shift?: boolean;
|
|
6
|
+
};
|
|
7
|
+
declare const tab: (widget: Gtk.Widget, options?: TabOptions) => Promise<void>;
|
|
8
|
+
declare const keyboard: (state: UserEventState, widget: Gtk.Widget, input: string) => Promise<void>;
|
|
9
|
+
export { tab, keyboard, type TabOptions };
|
|
10
|
+
//# sourceMappingURL=keyboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,4FAA4F;AAC5F,KAAK,UAAU,GAAG;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAiDF,QAAA,MAAM,GAAG,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,UAAU,UAAU,KAAG,OAAO,CAAC,IAAI,CAQ9D,CAAC;AAoNP,QAAA,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAOnF,CAAC;AAEP,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,CAAC"}
|