@gtkx/testing 1.0.0-rc.4 → 1.0.0
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 +5 -5
- package/dist/accessible-native.d.ts +16 -0
- package/dist/accessible-native.d.ts.map +1 -0
- package/dist/accessible-native.js +206 -0
- package/dist/accessible-native.js.map +1 -0
- package/dist/build-queries.d.ts +27 -10
- package/dist/build-queries.d.ts.map +1 -1
- package/dist/build-queries.js +22 -24
- package/dist/build-queries.js.map +1 -1
- package/dist/cleanup-registry.d.ts +1 -1
- package/dist/cleanup-registry.d.ts.map +1 -1
- package/dist/cleanup-registry.js.map +1 -1
- package/dist/errors.d.ts +10 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +10 -1
- package/dist/errors.js.map +1 -1
- package/dist/fire-event.d.ts +35 -6
- package/dist/fire-event.d.ts.map +1 -1
- package/dist/fire-event.js +23 -7
- 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 +15 -5
- package/dist/frame-sync.js.map +1 -1
- package/dist/harness-window.d.ts +4 -0
- package/dist/harness-window.d.ts.map +1 -0
- package/dist/harness-window.js +6 -0
- package/dist/harness-window.js.map +1 -0
- package/dist/index.d.ts +14 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +4 -0
- package/dist/internal.js.map +1 -0
- package/dist/matchers.d.ts +88 -46
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js +156 -18
- package/dist/matchers.js.map +1 -1
- package/dist/pretty-format.d.ts +2 -0
- package/dist/pretty-format.d.ts.map +1 -0
- package/dist/pretty-format.js +2 -0
- package/dist/pretty-format.js.map +1 -0
- package/dist/pretty-widget.d.ts +5 -2
- package/dist/pretty-widget.d.ts.map +1 -1
- package/dist/pretty-widget.js +73 -56
- package/dist/pretty-widget.js.map +1 -1
- package/dist/production.d.ts +8 -0
- package/dist/production.d.ts.map +1 -0
- package/dist/production.js +34 -0
- package/dist/production.js.map +1 -0
- package/dist/queries.d.ts +98 -56
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +123 -83
- package/dist/queries.js.map +1 -1
- package/dist/query-helpers.d.ts +44 -0
- package/dist/query-helpers.d.ts.map +1 -0
- package/dist/query-helpers.js +57 -0
- package/dist/query-helpers.js.map +1 -0
- package/dist/render-children.d.ts +9 -0
- package/dist/render-children.d.ts.map +1 -0
- package/dist/render-children.js +11 -0
- package/dist/render-children.js.map +1 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +11 -9
- package/dist/render.js.map +1 -1
- package/dist/role-helpers.d.ts +12 -3
- package/dist/role-helpers.d.ts.map +1 -1
- package/dist/role-helpers.js +13 -4
- package/dist/role-helpers.js.map +1 -1
- package/dist/role-naming.d.ts +5 -0
- package/dist/role-naming.d.ts.map +1 -0
- package/dist/role-naming.js +96 -0
- package/dist/role-naming.js.map +1 -0
- package/dist/screenshot.d.ts +12 -20
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +183 -91
- package/dist/screenshot.js.map +1 -1
- package/dist/traversal.d.ts +4 -1
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +25 -6
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +26 -14
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +3 -0
- package/dist/user-event/adjustment.d.ts.map +1 -1
- package/dist/user-event/adjustment.js +23 -2
- package/dist/user-event/adjustment.js.map +1 -1
- package/dist/user-event/click.d.ts +43 -8
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +175 -44
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/column-header-click.d.ts +4 -0
- package/dist/user-event/column-header-click.d.ts.map +1 -0
- package/dist/user-event/column-header-click.js +65 -0
- package/dist/user-event/column-header-click.js.map +1 -0
- package/dist/user-event/event-wrapper.d.ts.map +1 -1
- package/dist/user-event/event-wrapper.js +2 -1
- package/dist/user-event/event-wrapper.js.map +1 -1
- package/dist/user-event/index.d.ts +51 -10
- package/dist/user-event/index.d.ts.map +1 -1
- package/dist/user-event/index.js +43 -26
- package/dist/user-event/index.js.map +1 -1
- package/dist/user-event/indexed-children.d.ts +10 -0
- package/dist/user-event/indexed-children.d.ts.map +1 -0
- package/dist/user-event/indexed-children.js +50 -0
- package/dist/user-event/indexed-children.js.map +1 -0
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +33 -4
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/list-row-click.d.ts +4 -0
- package/dist/user-event/list-row-click.d.ts.map +1 -0
- package/dist/user-event/list-row-click.js +39 -0
- package/dist/user-event/list-row-click.js.map +1 -0
- package/dist/user-event/native-click.d.ts +6 -0
- package/dist/user-event/native-click.d.ts.map +1 -0
- package/dist/user-event/native-click.js +32 -0
- package/dist/user-event/native-click.js.map +1 -0
- package/dist/user-event/pointer.d.ts +1 -1
- package/dist/user-event/pointer.d.ts.map +1 -1
- package/dist/user-event/pointer.js +33 -9
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/user-event/selection.d.ts +11 -8
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +49 -38
- package/dist/user-event/selection.js.map +1 -1
- package/dist/user-event/text.d.ts +6 -2
- package/dist/user-event/text.d.ts.map +1 -1
- package/dist/user-event/text.js +68 -18
- package/dist/user-event/text.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +14 -26
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +135 -190
- package/dist/widget-accessible-properties.js.map +1 -1
- package/dist/widget-getters.d.ts +8 -0
- package/dist/widget-getters.d.ts.map +1 -0
- package/dist/widget-getters.js +19 -0
- package/dist/widget-getters.js.map +1 -0
- package/dist/within.d.ts +3 -2
- package/dist/within.d.ts.map +1 -1
- package/dist/within.js +3 -2
- package/dist/within.js.map +1 -1
- package/package.json +12 -7
- package/src/accessible-native.ts +333 -0
- package/src/build-queries.ts +47 -41
- package/src/cleanup-registry.ts +1 -1
- package/src/errors.ts +12 -1
- package/src/fire-event.ts +61 -8
- package/src/frame-sync.ts +21 -5
- package/src/harness-window.ts +9 -0
- package/src/index.ts +18 -11
- package/src/internal.ts +11 -0
- package/src/matchers.ts +428 -70
- package/src/pretty-format.ts +1 -0
- package/src/pretty-widget.ts +97 -70
- package/src/production.ts +52 -0
- package/src/queries.ts +127 -89
- package/src/query-helpers.ts +97 -0
- package/src/render-children.ts +25 -0
- package/src/render.tsx +16 -11
- package/src/role-helpers.ts +14 -4
- package/src/role-naming.ts +99 -0
- package/src/screenshot.ts +272 -103
- package/src/traversal.ts +44 -6
- package/src/types.ts +28 -16
- package/src/user-event/adjustment.ts +29 -2
- package/src/user-event/click.ts +247 -52
- package/src/user-event/column-header-click.ts +90 -0
- package/src/user-event/event-wrapper.ts +3 -1
- package/src/user-event/index.ts +100 -37
- package/src/user-event/indexed-children.ts +75 -0
- package/src/user-event/keyboard.ts +52 -4
- package/src/user-event/list-row-click.ts +57 -0
- package/src/user-event/native-click.ts +46 -0
- package/src/user-event/pointer.ts +48 -9
- package/src/user-event/selection.ts +67 -41
- package/src/user-event/text.ts +92 -21
- package/src/widget-accessible-properties.ts +183 -230
- package/src/widget-getters.ts +32 -0
- package/src/within.ts +3 -2
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { children } from "../traversal.js";
|
|
3
|
+
import { getWidgetTextContent } from "../widget-accessible-properties.js";
|
|
4
|
+
const columnViewFor = (header) => {
|
|
5
|
+
let current = header.getParent();
|
|
6
|
+
while (current !== null) {
|
|
7
|
+
if (current instanceof Gtk.ColumnView) {
|
|
8
|
+
return current;
|
|
9
|
+
}
|
|
10
|
+
current = current.getParent();
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
};
|
|
14
|
+
const columnsFor = (view) => {
|
|
15
|
+
const model = view.getColumns();
|
|
16
|
+
const columns = [];
|
|
17
|
+
for (let index = 0; index < model.getNItems(); index++) {
|
|
18
|
+
const column = model.getItem(index);
|
|
19
|
+
if (column instanceof Gtk.ColumnViewColumn) {
|
|
20
|
+
columns.push(column);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return columns;
|
|
24
|
+
};
|
|
25
|
+
const headerIndexFor = (header) => {
|
|
26
|
+
const parent = header.getParent();
|
|
27
|
+
return parent === null ? -1 : [...children(parent)].indexOf(header);
|
|
28
|
+
};
|
|
29
|
+
const titledColumnFor = (columns, title) => {
|
|
30
|
+
const matches = columns.filter((column) => column.getTitle() === title);
|
|
31
|
+
return matches.length === 1 ? matches[0] ?? null : null;
|
|
32
|
+
};
|
|
33
|
+
const columnFor = (header, view) => {
|
|
34
|
+
const columns = columnsFor(view);
|
|
35
|
+
const picked = columns[headerIndexFor(header)] ?? null;
|
|
36
|
+
const title = getWidgetTextContent(header);
|
|
37
|
+
if (picked !== null && picked.getTitle() === title) {
|
|
38
|
+
return picked;
|
|
39
|
+
}
|
|
40
|
+
return titledColumnFor(columns, title) ?? picked;
|
|
41
|
+
};
|
|
42
|
+
const sortableColumnFor = (header, view) => {
|
|
43
|
+
const column = columnFor(header, view);
|
|
44
|
+
return column !== null && column.getSorter() !== null ? column : null;
|
|
45
|
+
};
|
|
46
|
+
const invertedSortDirection = (order) => order === Gtk.SortType.ASCENDING ? Gtk.SortType.DESCENDING : Gtk.SortType.ASCENDING;
|
|
47
|
+
const nextSortDirection = (view, column) => {
|
|
48
|
+
const sorter = view.getSorter();
|
|
49
|
+
if (!(sorter instanceof Gtk.ColumnViewSorter) || sorter.getPrimarySortColumn() !== column) {
|
|
50
|
+
return Gtk.SortType.ASCENDING;
|
|
51
|
+
}
|
|
52
|
+
return invertedSortDirection(sorter.getPrimarySortOrder());
|
|
53
|
+
};
|
|
54
|
+
const applyHeaderClick = (header, nPress) => {
|
|
55
|
+
const view = columnViewFor(header);
|
|
56
|
+
const column = view === null ? null : sortableColumnFor(header, view);
|
|
57
|
+
if (view === null || column === null) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (let press = 1; press <= nPress; press++) {
|
|
61
|
+
view.sortByColumn(column, nextSortDirection(view, column));
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
export { applyHeaderClick };
|
|
65
|
+
//# sourceMappingURL=column-header-click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-header-click.js","sourceRoot":"","sources":["../../src/user-event/column-header-click.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { children } from \"../traversal.js\";\nimport { getWidgetTextContent } from \"../widget-accessible-properties.js\";\n\nconst columnViewFor = (header: Gtk.Widget): Gtk.ColumnView | null => {\n let current: Gtk.Widget | null = header.getParent();\n\n while (current !== null) {\n if (current instanceof Gtk.ColumnView) {\n return current;\n }\n\n current = current.getParent();\n }\n\n return null;\n};\n\nconst columnsFor = (view: Gtk.ColumnView): Gtk.ColumnViewColumn[] => {\n const model = view.getColumns();\n const columns: Gtk.ColumnViewColumn[] = [];\n\n for (let index = 0; index < model.getNItems(); index++) {\n const column = model.getItem(index);\n\n if (column instanceof Gtk.ColumnViewColumn) {\n columns.push(column);\n }\n }\n\n return columns;\n};\n\nconst headerIndexFor = (header: Gtk.Widget): number => {\n const parent = header.getParent();\n\n return parent === null ? -1 : [...children(parent)].indexOf(header);\n};\n\nconst titledColumnFor = (columns: Gtk.ColumnViewColumn[], title: string | null): Gtk.ColumnViewColumn | null => {\n const matches = columns.filter((column) => column.getTitle() === title);\n\n return matches.length === 1 ? matches[0] ?? null : null;\n};\n\nconst columnFor = (header: Gtk.Widget, view: Gtk.ColumnView): Gtk.ColumnViewColumn | null => {\n const columns = columnsFor(view);\n const picked = columns[headerIndexFor(header)] ?? null;\n const title = getWidgetTextContent(header);\n\n if (picked !== null && picked.getTitle() === title) {\n return picked;\n }\n\n return titledColumnFor(columns, title) ?? picked;\n};\n\nconst sortableColumnFor = (header: Gtk.Widget, view: Gtk.ColumnView): Gtk.ColumnViewColumn | null => {\n const column = columnFor(header, view);\n\n return column !== null && column.getSorter() !== null ? column : null;\n};\n\nconst invertedSortDirection = (order: Gtk.SortType): Gtk.SortType =>\n order === Gtk.SortType.ASCENDING ? Gtk.SortType.DESCENDING : Gtk.SortType.ASCENDING;\n\nconst nextSortDirection = (view: Gtk.ColumnView, column: Gtk.ColumnViewColumn): Gtk.SortType => {\n const sorter = view.getSorter();\n\n if (!(sorter instanceof Gtk.ColumnViewSorter) || sorter.getPrimarySortColumn() !== column) {\n return Gtk.SortType.ASCENDING;\n }\n\n return invertedSortDirection(sorter.getPrimarySortOrder());\n};\n\nconst applyHeaderClick = (header: Gtk.Widget, nPress: number): void => {\n const view = columnViewFor(header);\n const column = view === null ? null : sortableColumnFor(header, view);\n\n if (view === null || column === null) {\n return;\n }\n\n for (let press = 1; press <= nPress; press++) {\n view.sortByColumn(column, nextSortDirection(view, column));\n }\n};\n\nexport { applyHeaderClick };\n"]}
|
|
@@ -1 +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;
|
|
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;AAyEpC,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"}
|
|
@@ -9,7 +9,8 @@ const WINDOW_NOT_ACTIVE = "its window never became active";
|
|
|
9
9
|
const actionableHop = () => new Promise((resolve) => setTimeout(resolve, 1));
|
|
10
10
|
const canDisplayDeliverActivation = (window) => window.getDisplay().getDefaultSeat() !== null;
|
|
11
11
|
const findWindowActionabilityFailure = (widget, root) => {
|
|
12
|
-
|
|
12
|
+
const [isComputed, allocation] = root.computeBounds(root);
|
|
13
|
+
if (!isComputed || allocation.getWidth() === 0) {
|
|
13
14
|
return WINDOW_NOT_ALLOCATED;
|
|
14
15
|
}
|
|
15
16
|
if (!widget.getMapped()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-wrapper.js","sourceRoot":"","sources":["../../src/user-event/event-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,aAAa,GAAG,sEAAsE,CAAC;AAC7F,MAAM,oBAAoB,GAAG,0CAA0C,CAAC;AACxE,MAAM,UAAU,GAAG,0FAA0F,CAAC;AAC9G,MAAM,iBAAiB,GAAG,gCAAgC,CAAC;AAE3D,MAAM,aAAa,GAAG,GAAkB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAE5F,MAAM,2BAA2B,GAAG,CAAC,MAAkB,EAAW,EAAE,CAChE,MAAM,CAAC,UAAU,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC;AAElD,MAAM,8BAA8B,GAAG,CAAC,MAAkB,EAAE,IAAgB,EAAiB,EAAE;IAC3F,IAAI,IAAI,CAAC,
|
|
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 const [isComputed, allocation] = root.computeBounds(root);\n\n if (!isComputed || allocation.getWidth() === 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"]}
|
|
@@ -6,25 +6,57 @@ import { tab } from "./keyboard.js";
|
|
|
6
6
|
import { type PointerInput } from "./pointer.js";
|
|
7
7
|
import { deselectOptions, selectOptions } from "./selection.js";
|
|
8
8
|
import { clear, copy, cut, paste, type } from "./text.js";
|
|
9
|
+
/** Options shared by every helper on a {@link UserEvent} instance. */
|
|
10
|
+
type UserEventOptions = {
|
|
11
|
+
/** Milliseconds to wait after each helper resolves; null, the default, waits not at all. */
|
|
12
|
+
delay?: number | null | undefined;
|
|
13
|
+
};
|
|
9
14
|
/**
|
|
10
15
|
* The set of user interaction helpers exposed by {@link userEvent}, covering clicks, typing,
|
|
11
16
|
* keyboard, pointer, gestures, selection, and scrolling.
|
|
12
17
|
*/
|
|
13
18
|
type UserEvent = {
|
|
14
19
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
20
|
+
* Returns a fresh instance whose helpers share one keyboard and pointer state, so held modifiers
|
|
21
|
+
* and buttons carry across its calls but not across instances.
|
|
22
|
+
*/
|
|
23
|
+
setup: (options?: UserEventOptions) => UserEvent;
|
|
24
|
+
/**
|
|
25
|
+
* Activates a widget that neither claims the click nor carries a click gesture of its own, and
|
|
26
|
+
* otherwise presses and releases outwards from the clicked widget through every widget carrying
|
|
27
|
+
* a click gesture, stopping at the first button or indexed child. A list box row or flow box
|
|
28
|
+
* child receives its click gesture at the clicked position, passes one on to the gestures its
|
|
29
|
+
* container carries, and is then activated, or exclusively selected when its container does not
|
|
30
|
+
* activate on a single click. The press also stops at a widget whose click GTK4 implements
|
|
31
|
+
* itself, where the gestures that widget carries of its own still take the press and the same
|
|
32
|
+
* outcome is then applied through GTK's own public action: a list, grid, or column-view row is
|
|
33
|
+
* focused and selected, and activated as well when its view activates on a single click; an
|
|
34
|
+
* expandable tree expander that is itself the clicked widget toggles its expansion; a column
|
|
35
|
+
* header sorts by its column. A column-view cell and the row carrying the column headers stand
|
|
36
|
+
* in the way of the click rather than taking it, so a click on either reaches the row or the
|
|
37
|
+
* view behind it.
|
|
17
38
|
*/
|
|
18
39
|
click: typeof click;
|
|
19
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* Delivers a two-press click gesture along the same path a single click takes, without trying
|
|
42
|
+
* activation first, activating a list box row or flow box child on that path and replacing its
|
|
43
|
+
* container's selection whether or not that container activates on a single click. A widget
|
|
44
|
+
* whose click GTK4 implements itself receives that outcome once per press, so a row is selected
|
|
45
|
+
* and activated by the second press, a tree expander ends back where it started, and a column
|
|
46
|
+
* header inverts its order after sorting.
|
|
47
|
+
*/
|
|
20
48
|
dblClick: typeof dblClick;
|
|
21
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Delivers a three-press click gesture the same way a double click is delivered, applying the
|
|
51
|
+
* same outcome to a list box row or flow box child, and applying the outcome GTK4 implements
|
|
52
|
+
* itself once per press to a row, tree expander, or column header.
|
|
53
|
+
*/
|
|
22
54
|
tripleClick: typeof tripleClick;
|
|
23
55
|
/** Moves focus within the widget's root, forward by default and backward with `isShiftHeld`. */
|
|
24
56
|
tab: typeof tab;
|
|
25
57
|
/** Focuses an editable widget, applies any initial selection, and inserts the text at the cursor. */
|
|
26
58
|
type: typeof type;
|
|
27
|
-
/**
|
|
59
|
+
/** Focuses an editable widget and deletes its whole text, leaving nothing selected. */
|
|
28
60
|
clear: typeof clear;
|
|
29
61
|
/** Writes an editable widget's current selection to the clipboard. */
|
|
30
62
|
copy: typeof copy;
|
|
@@ -32,9 +64,12 @@ type UserEvent = {
|
|
|
32
64
|
cut: typeof cut;
|
|
33
65
|
/** Inserts the given text, or the clipboard's text, at an editable widget's cursor. */
|
|
34
66
|
paste: typeof paste;
|
|
35
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Selects the items at those positions in a view or drop-down, or selects the indexed children of
|
|
69
|
+
* a list box or flow box through their container, without activating them.
|
|
70
|
+
*/
|
|
36
71
|
selectOptions: typeof selectOptions;
|
|
37
|
-
/**
|
|
72
|
+
/** Unselects the items at those positions, leaving list box and flow box children unactivated. */
|
|
38
73
|
deselectOptions: typeof deselectOptions;
|
|
39
74
|
/** Emits a motion `enter` on the widget, adding a motion controller when it has none. */
|
|
40
75
|
hover: typeof hover;
|
|
@@ -60,12 +95,18 @@ type UserEvent = {
|
|
|
60
95
|
scroll: typeof scroll;
|
|
61
96
|
/** Sends a key sequence, dispatching matching shortcuts and tracking held modifiers across calls. */
|
|
62
97
|
keyboard: (widget: Gtk.Widget, input: string) => Promise<void>;
|
|
63
|
-
/**
|
|
98
|
+
/**
|
|
99
|
+
* Applies a pointer token to the click gestures the widget already carries, tracking whether the
|
|
100
|
+
* left button is held across calls. On a widget whose click GTK4 implements itself, the release
|
|
101
|
+
* also applies GTK's own outcome, the way {@link UserEvent.click} does, and a column-view cell
|
|
102
|
+
* or the row carrying the column headers passes the token to the row or view behind it.
|
|
103
|
+
*/
|
|
64
104
|
pointer: (widget: Gtk.Widget, input: PointerInput) => Promise<void>;
|
|
65
105
|
};
|
|
66
106
|
/**
|
|
67
107
|
* High-level helpers that drive widgets by dispatching the same events and gestures GTK4 delivers
|
|
68
|
-
* when someone clicks, types, or drags.
|
|
108
|
+
* when someone clicks, types, or drags. Call `setup` for an instance with its own keyboard and
|
|
109
|
+
* pointer state.
|
|
69
110
|
*/
|
|
70
111
|
declare const userEvent: UserEvent;
|
|
71
112
|
export type { ScrollDelta } from "./adjustment.js";
|
|
@@ -74,5 +115,5 @@ export type { TabOptions } from "./keyboard.js";
|
|
|
74
115
|
export type { PointerInput } from "./pointer.js";
|
|
75
116
|
export type { TypeOptions } from "./text.js";
|
|
76
117
|
export { resetClipboard } from "./text.js";
|
|
77
|
-
export { userEvent, type UserEvent };
|
|
118
|
+
export { userEvent, type UserEvent, type UserEventOptions };
|
|
78
119
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +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;;;OAGG;IACH,KAAK,EAAE,OAAO,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user-event/index.ts"],"names":[],"mappings":"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"}
|
package/dist/user-event/index.js
CHANGED
|
@@ -6,37 +6,54 @@ import { pointer } from "./pointer.js";
|
|
|
6
6
|
import { deselectOptions, selectOptions } from "./selection.js";
|
|
7
7
|
import { createInitialState } from "./state.js";
|
|
8
8
|
import { clear, copy, cut, paste, type } from "./text.js";
|
|
9
|
-
const state = createInitialState();
|
|
10
9
|
/**
|
|
11
10
|
* High-level helpers that drive widgets by dispatching the same events and gestures GTK4 delivers
|
|
12
|
-
* when someone clicks, types, or drags.
|
|
11
|
+
* when someone clicks, types, or drags. Call `setup` for an instance with its own keyboard and
|
|
12
|
+
* pointer state.
|
|
13
13
|
*/
|
|
14
14
|
const userEvent = {
|
|
15
|
-
|
|
16
|
-
|
|
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),
|
|
15
|
+
...createInstance(createInitialState(), {}),
|
|
16
|
+
setup: (options) => createInstance(createInitialState(), options ?? {}),
|
|
39
17
|
};
|
|
18
|
+
const settle = (delay) => {
|
|
19
|
+
if (delay === null || delay === undefined) {
|
|
20
|
+
return Promise.resolve();
|
|
21
|
+
}
|
|
22
|
+
return new Promise((resolve) => setTimeout(resolve, delay));
|
|
23
|
+
};
|
|
24
|
+
function createInstance(state, options) {
|
|
25
|
+
const after = (helper) => async (...args) => {
|
|
26
|
+
await helper(...args);
|
|
27
|
+
await settle(options.delay);
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
setup: (overrides) => createInstance(state, { ...options, ...overrides }),
|
|
31
|
+
click: after(click),
|
|
32
|
+
dblClick: after(dblClick),
|
|
33
|
+
tripleClick: after(tripleClick),
|
|
34
|
+
tab: after(tab),
|
|
35
|
+
type: after(type),
|
|
36
|
+
clear: after(clear),
|
|
37
|
+
copy: after(copy),
|
|
38
|
+
cut: after(cut),
|
|
39
|
+
paste: after(paste),
|
|
40
|
+
selectOptions: after(selectOptions),
|
|
41
|
+
deselectOptions: after(deselectOptions),
|
|
42
|
+
hover: after(hover),
|
|
43
|
+
unhover: after(unhover),
|
|
44
|
+
rotate: after(rotate),
|
|
45
|
+
zoom: after(zoom),
|
|
46
|
+
swipe: after(swipe),
|
|
47
|
+
longPress: after(longPress),
|
|
48
|
+
drag: after(drag),
|
|
49
|
+
drop: after(drop),
|
|
50
|
+
dragAndDrop: after(dragAndDrop),
|
|
51
|
+
slide: after(slide),
|
|
52
|
+
scroll: after(scroll),
|
|
53
|
+
keyboard: after((widget, input) => keyboard(state, widget, input)),
|
|
54
|
+
pointer: after((widget, input) => pointer(state, widget, input)),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
40
57
|
export { resetClipboard } from "./text.js";
|
|
41
58
|
export { userEvent };
|
|
42
59
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +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;AA4D1D,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 /**\n * Clicks a button, toggles a switch, and otherwise activates the widget, falling back to a click\n * gesture on its nearest clickable ancestor when activation does nothing.\n */\n click: typeof click;\n /** Emits a two-press click gesture on the widget. */\n dblClick: typeof dblClick;\n /** Emits a three-press click gesture on the widget. */\n tripleClick: typeof tripleClick;\n /** Moves focus within the widget's root, forward by default and backward with `isShiftHeld`. */\n tab: typeof tab;\n /** Focuses an editable widget, applies any initial selection, and inserts the text at the cursor. */\n type: typeof type;\n /** Empties an editable widget's text. */\n clear: typeof clear;\n /** Writes an editable widget's current selection to the clipboard. */\n copy: typeof copy;\n /** Writes an editable widget's current selection to the clipboard and deletes it. */\n cut: typeof cut;\n /** Inserts the given text, or the clipboard's text, at an editable widget's cursor. */\n paste: typeof paste;\n /** Selects the items at the given positions in a list view, drop-down, combo box, or list box. */\n selectOptions: typeof selectOptions;\n /** Deselects the items at the given positions in a list view or list box. */\n deselectOptions: typeof deselectOptions;\n /** Emits a motion `enter` on the widget, adding a motion controller when it has none. */\n hover: typeof hover;\n /** Emits a motion `leave` on the widget, adding a motion controller when it has none. */\n unhover: typeof unhover;\n /** Emits `angle-changed` on the widget's rotate gestures. */\n rotate: typeof rotate;\n /** Emits `scale-changed` on the widget's zoom gestures. */\n zoom: typeof zoom;\n /** Emits `swipe` with the given velocity on the widget's swipe gestures. */\n swipe: typeof swipe;\n /** Emits `pressed` at the given point on the widget's long-press gestures. */\n longPress: typeof longPress;\n /** Runs a begin, update, and end sequence on the widget's drag gestures, ending at the given offset. */\n drag: typeof drag;\n /** Emits `drop` with the given content on the widget's drop targets. */\n drop: typeof drop;\n /** Requires a drag source on the source widget, then emits `drop` with the content on the target's drop targets. */\n dragAndDrop: typeof dragAndDrop;\n /** Emits a jump `change-value` on a Gtk.Range so it moves to the given value. */\n slide: typeof slide;\n /** Adds the delta to the adjustments of the widget itself, or of its nearest scrollable ancestor. */\n scroll: typeof scroll;\n /** Sends a key sequence, dispatching matching shortcuts and tracking held modifiers across calls. */\n keyboard: (widget: Gtk.Widget, input: string) => Promise<void>;\n /** Applies a pointer token, tracking whether the left button is held across calls. */\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"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user-event/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { scroll, slide } from \"./adjustment.js\";\nimport { click, dblClick, tripleClick } from \"./click.js\";\nimport { drag, dragAndDrop, drop, hover, longPress, rotate, swipe, unhover, zoom } from \"./gesture.js\";\nimport { keyboard, tab } from \"./keyboard.js\";\nimport { pointer, type PointerInput } from \"./pointer.js\";\nimport { deselectOptions, selectOptions } from \"./selection.js\";\nimport { createInitialState, type UserEventState } from \"./state.js\";\nimport { clear, copy, cut, paste, type } from \"./text.js\";\n\n/** Options shared by every helper on a {@link UserEvent} instance. */\ntype UserEventOptions = {\n /** Milliseconds to wait after each helper resolves; null, the default, waits not at all. */\n delay?: number | null | undefined;\n};\n\n/**\n * The set of user interaction helpers exposed by {@link userEvent}, covering clicks, typing,\n * keyboard, pointer, gestures, selection, and scrolling.\n */\ntype UserEvent = {\n /**\n * Returns a fresh instance whose helpers share one keyboard and pointer state, so held modifiers\n * and buttons carry across its calls but not across instances.\n */\n setup: (options?: UserEventOptions) => UserEvent;\n /**\n * Activates a widget that neither claims the click nor carries a click gesture of its own, and\n * otherwise presses and releases outwards from the clicked widget through every widget carrying\n * a click gesture, stopping at the first button or indexed child. A list box row or flow box\n * child receives its click gesture at the clicked position, passes one on to the gestures its\n * container carries, and is then activated, or exclusively selected when its container does not\n * activate on a single click. The press also stops at a widget whose click GTK4 implements\n * itself, where the gestures that widget carries of its own still take the press and the same\n * outcome is then applied through GTK's own public action: a list, grid, or column-view row is\n * focused and selected, and activated as well when its view activates on a single click; an\n * expandable tree expander that is itself the clicked widget toggles its expansion; a column\n * header sorts by its column. A column-view cell and the row carrying the column headers stand\n * in the way of the click rather than taking it, so a click on either reaches the row or the\n * view behind it.\n */\n click: typeof click;\n /**\n * Delivers a two-press click gesture along the same path a single click takes, without trying\n * activation first, activating a list box row or flow box child on that path and replacing its\n * container's selection whether or not that container activates on a single click. A widget\n * whose click GTK4 implements itself receives that outcome once per press, so a row is selected\n * and activated by the second press, a tree expander ends back where it started, and a column\n * header inverts its order after sorting.\n */\n dblClick: typeof dblClick;\n /**\n * Delivers a three-press click gesture the same way a double click is delivered, applying the\n * same outcome to a list box row or flow box child, and applying the outcome GTK4 implements\n * itself once per press to a row, tree expander, or column header.\n */\n tripleClick: typeof tripleClick;\n /** Moves focus within the widget's root, forward by default and backward with `isShiftHeld`. */\n tab: typeof tab;\n /** Focuses an editable widget, applies any initial selection, and inserts the text at the cursor. */\n type: typeof type;\n /** Focuses an editable widget and deletes its whole text, leaving nothing selected. */\n clear: typeof clear;\n /** Writes an editable widget's current selection to the clipboard. */\n copy: typeof copy;\n /** Writes an editable widget's current selection to the clipboard and deletes it. */\n cut: typeof cut;\n /** Inserts the given text, or the clipboard's text, at an editable widget's cursor. */\n paste: typeof paste;\n /**\n * Selects the items at those positions in a view or drop-down, or selects the indexed children of\n * a list box or flow box through their container, without activating them.\n */\n selectOptions: typeof selectOptions;\n /** Unselects the items at those positions, leaving list box and flow box children unactivated. */\n deselectOptions: typeof deselectOptions;\n /** Emits a motion `enter` on the widget, adding a motion controller when it has none. */\n hover: typeof hover;\n /** Emits a motion `leave` on the widget, adding a motion controller when it has none. */\n unhover: typeof unhover;\n /** Emits `angle-changed` on the widget's rotate gestures. */\n rotate: typeof rotate;\n /** Emits `scale-changed` on the widget's zoom gestures. */\n zoom: typeof zoom;\n /** Emits `swipe` with the given velocity on the widget's swipe gestures. */\n swipe: typeof swipe;\n /** Emits `pressed` at the given point on the widget's long-press gestures. */\n longPress: typeof longPress;\n /** Runs a begin, update, and end sequence on the widget's drag gestures, ending at the given offset. */\n drag: typeof drag;\n /** Emits `drop` with the given content on the widget's drop targets. */\n drop: typeof drop;\n /** Requires a drag source on the source widget, then emits `drop` with the content on the target's drop targets. */\n dragAndDrop: typeof dragAndDrop;\n /** Emits a jump `change-value` on a Gtk.Range so it moves to the given value. */\n slide: typeof slide;\n /** Adds the delta to the adjustments of the widget itself, or of its nearest scrollable ancestor. */\n scroll: typeof scroll;\n /** Sends a key sequence, dispatching matching shortcuts and tracking held modifiers across calls. */\n keyboard: (widget: Gtk.Widget, input: string) => Promise<void>;\n /**\n * Applies a pointer token to the click gestures the widget already carries, tracking whether the\n * left button is held across calls. On a widget whose click GTK4 implements itself, the release\n * also applies GTK's own outcome, the way {@link UserEvent.click} does, and a column-view cell\n * or the row carrying the column headers passes the token to the row or view behind it.\n */\n pointer: (widget: Gtk.Widget, input: PointerInput) => Promise<void>;\n};\n\n/**\n * High-level helpers that drive widgets by dispatching the same events and gestures GTK4 delivers\n * when someone clicks, types, or drags. Call `setup` for an instance with its own keyboard and\n * pointer state.\n */\nconst userEvent: UserEvent = {\n ...createInstance(createInitialState(), {}),\n setup: (options?: UserEventOptions): UserEvent => createInstance(createInitialState(), options ?? {}),\n};\n\nconst settle = (delay: number | null | undefined): Promise<void> => {\n if (delay === null || delay === undefined) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => setTimeout(resolve, delay));\n};\n\nfunction createInstance(state: UserEventState, options: UserEventOptions): UserEvent {\n const after =\n <Args extends unknown[]>(helper: (...args: Args) => Promise<void>) =>\n async (...args: Args): Promise<void> => {\n await helper(...args);\n await settle(options.delay);\n };\n\n return {\n setup: (overrides?: UserEventOptions): UserEvent => createInstance(state, { ...options, ...overrides }),\n click: after(click),\n dblClick: after(dblClick),\n tripleClick: after(tripleClick),\n tab: after(tab),\n type: after(type),\n clear: after(clear),\n copy: after(copy),\n cut: after(cut),\n paste: after(paste),\n selectOptions: after(selectOptions),\n deselectOptions: after(deselectOptions),\n hover: after(hover),\n unhover: after(unhover),\n rotate: after(rotate),\n zoom: after(zoom),\n swipe: after(swipe),\n longPress: after(longPress),\n drag: after(drag),\n drop: after(drop),\n dragAndDrop: after(dragAndDrop),\n slide: after(slide),\n scroll: after(scroll),\n keyboard: after((widget: Gtk.Widget, input: string): Promise<void> => keyboard(state, widget, input)),\n pointer: after((widget: Gtk.Widget, input: PointerInput): Promise<void> => pointer(state, widget, input)),\n };\n}\n\nexport type { ScrollDelta } from \"./adjustment.js\";\nexport type { DragOffset, DragOptions, DropContent, DropOptions } from \"./gesture.js\";\nexport type { TabOptions } from \"./keyboard.js\";\nexport type { PointerInput } from \"./pointer.js\";\nexport type { TypeOptions } from \"./text.js\";\nexport { resetClipboard } from \"./text.js\";\nexport { userEvent, type UserEvent, type UserEventOptions };\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
declare const SELECTED_PROBE = "isSelected";
|
|
3
|
+
declare const hasIndexedChildren: (widget: Gtk.Widget) => boolean;
|
|
4
|
+
declare const getChildAtIndex: (widget: Gtk.Widget, index: number) => Gtk.Widget | null;
|
|
5
|
+
declare const selectContainerChild: (container: Gtk.Widget, child: Gtk.Widget) => void;
|
|
6
|
+
declare const unselectContainerChild: (container: Gtk.Widget, child: Gtk.Widget) => void;
|
|
7
|
+
declare const isChildSelected: (child: Gtk.Widget) => boolean;
|
|
8
|
+
declare const unselectOtherChildren: (container: Gtk.Widget, child: Gtk.Widget) => void;
|
|
9
|
+
export { getChildAtIndex, hasIndexedChildren, isChildSelected, SELECTED_PROBE, selectContainerChild, unselectContainerChild, unselectOtherChildren, };
|
|
10
|
+
//# sourceMappingURL=indexed-children.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed-children.d.ts","sourceRoot":"","sources":["../../src/user-event/indexed-children.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAOzC,QAAA,MAAM,cAAc,eAAe,CAAC;AAEpC,QAAA,MAAM,kBAAkB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAC2B,CAAC;AAE7E,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,MAAM,KAAG,GAAG,CAAC,MAAM,GAAG,IAUzE,CAAC;AAcF,QAAA,MAAM,oBAAoB,GAAI,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAG,IAExE,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAI,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAG,IAE1E,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,OAAO,GAAG,CAAC,MAAM,KAAG,OAA4D,CAAC;AAc1G,QAAA,MAAM,qBAAqB,GAAI,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAG,IAMzE,CAAC;AAEF,OAAO,EACH,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,GACxB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { callBooleanGetter, getCallableMethod, hasWidgetMethod } from "../widget-getters.js";
|
|
2
|
+
const CHILD_AT_INDEX_GETTERS = ["getRowAtIndex", "getChildAtIndex"];
|
|
3
|
+
const CHILD_SELECTORS = ["selectRow", "selectChild"];
|
|
4
|
+
const CHILD_DESELECTORS = ["unselectRow", "unselectChild"];
|
|
5
|
+
const SELECTED_CHILD_GETTERS = ["getSelectedRows", "getSelectedChildren"];
|
|
6
|
+
const SELECTED_PROBE = "isSelected";
|
|
7
|
+
const hasIndexedChildren = (widget) => CHILD_AT_INDEX_GETTERS.some((getter) => hasWidgetMethod(widget, getter));
|
|
8
|
+
const getChildAtIndex = (widget, index) => {
|
|
9
|
+
for (const getter of CHILD_AT_INDEX_GETTERS) {
|
|
10
|
+
const fn = getCallableMethod(widget, getter);
|
|
11
|
+
if (fn) {
|
|
12
|
+
return fn(index) ?? null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
};
|
|
17
|
+
const applyChildMethod = (container, names, child) => {
|
|
18
|
+
for (const name of names) {
|
|
19
|
+
const fn = getCallableMethod(container, name);
|
|
20
|
+
if (fn) {
|
|
21
|
+
fn(child);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const selectContainerChild = (container, child) => {
|
|
27
|
+
applyChildMethod(container, CHILD_SELECTORS, child);
|
|
28
|
+
};
|
|
29
|
+
const unselectContainerChild = (container, child) => {
|
|
30
|
+
applyChildMethod(container, CHILD_DESELECTORS, child);
|
|
31
|
+
};
|
|
32
|
+
const isChildSelected = (child) => callBooleanGetter(child, SELECTED_PROBE) ?? false;
|
|
33
|
+
const getSelectedChildren = (container) => {
|
|
34
|
+
for (const getter of SELECTED_CHILD_GETTERS) {
|
|
35
|
+
const fn = getCallableMethod(container, getter);
|
|
36
|
+
if (fn) {
|
|
37
|
+
return fn();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return [];
|
|
41
|
+
};
|
|
42
|
+
const unselectOtherChildren = (container, child) => {
|
|
43
|
+
for (const selected of getSelectedChildren(container)) {
|
|
44
|
+
if (selected !== child) {
|
|
45
|
+
unselectContainerChild(container, selected);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
export { getChildAtIndex, hasIndexedChildren, isChildSelected, SELECTED_PROBE, selectContainerChild, unselectContainerChild, unselectOtherChildren, };
|
|
50
|
+
//# sourceMappingURL=indexed-children.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed-children.js","sourceRoot":"","sources":["../../src/user-event/indexed-children.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE7F,MAAM,sBAAsB,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;AACpE,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AACrD,MAAM,iBAAiB,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;AAC3D,MAAM,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;AAC1E,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,MAAM,kBAAkB,GAAG,CAAC,MAAkB,EAAW,EAAE,CACvD,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7E,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAE,KAAa,EAAqB,EAAE;IAC7E,KAAK,MAAM,MAAM,IAAI,sBAAsB,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,iBAAiB,CAA8B,MAAM,EAAE,MAAM,CAAC,CAAC;QAE1E,IAAI,EAAE,EAAE,CAAC;YACL,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,SAAqB,EAAE,KAAe,EAAE,KAAiB,EAAQ,EAAE;IACzF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,iBAAiB,CAAwB,SAAS,EAAE,IAAI,CAAC,CAAC;QAErE,IAAI,EAAE,EAAE,CAAC;YACL,EAAE,CAAC,KAAK,CAAC,CAAC;YAEV,OAAO;QACX,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,SAAqB,EAAE,KAAiB,EAAQ,EAAE;IAC5E,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,SAAqB,EAAE,KAAiB,EAAQ,EAAE;IAC9E,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAW,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,IAAI,KAAK,CAAC;AAE1G,MAAM,mBAAmB,GAAG,CAAC,SAAqB,EAAgB,EAAE;IAChE,KAAK,MAAM,MAAM,IAAI,sBAAsB,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,iBAAiB,CAAmB,SAAS,EAAE,MAAM,CAAC,CAAC;QAElE,IAAI,EAAE,EAAE,CAAC;YACL,OAAO,EAAE,EAAE,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,SAAqB,EAAE,KAAiB,EAAQ,EAAE;IAC7E,KAAK,MAAM,QAAQ,IAAI,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACrB,sBAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EACH,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,GACxB,CAAC","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { callBooleanGetter, getCallableMethod, hasWidgetMethod } from \"../widget-getters.js\";\n\nconst CHILD_AT_INDEX_GETTERS = [\"getRowAtIndex\", \"getChildAtIndex\"];\nconst CHILD_SELECTORS = [\"selectRow\", \"selectChild\"];\nconst CHILD_DESELECTORS = [\"unselectRow\", \"unselectChild\"];\nconst SELECTED_CHILD_GETTERS = [\"getSelectedRows\", \"getSelectedChildren\"];\nconst SELECTED_PROBE = \"isSelected\";\n\nconst hasIndexedChildren = (widget: Gtk.Widget): boolean =>\n CHILD_AT_INDEX_GETTERS.some((getter) => hasWidgetMethod(widget, getter));\n\nconst getChildAtIndex = (widget: Gtk.Widget, index: number): Gtk.Widget | null => {\n for (const getter of CHILD_AT_INDEX_GETTERS) {\n const fn = getCallableMethod<[number], Gtk.Widget | null>(widget, getter);\n\n if (fn) {\n return fn(index) ?? null;\n }\n }\n\n return null;\n};\n\nconst applyChildMethod = (container: Gtk.Widget, names: string[], child: Gtk.Widget): void => {\n for (const name of names) {\n const fn = getCallableMethod<[Gtk.Widget], unknown>(container, name);\n\n if (fn) {\n fn(child);\n\n return;\n }\n }\n};\n\nconst selectContainerChild = (container: Gtk.Widget, child: Gtk.Widget): void => {\n applyChildMethod(container, CHILD_SELECTORS, child);\n};\n\nconst unselectContainerChild = (container: Gtk.Widget, child: Gtk.Widget): void => {\n applyChildMethod(container, CHILD_DESELECTORS, child);\n};\n\nconst isChildSelected = (child: Gtk.Widget): boolean => callBooleanGetter(child, SELECTED_PROBE) ?? false;\n\nconst getSelectedChildren = (container: Gtk.Widget): Gtk.Widget[] => {\n for (const getter of SELECTED_CHILD_GETTERS) {\n const fn = getCallableMethod<[], Gtk.Widget[]>(container, getter);\n\n if (fn) {\n return fn();\n }\n }\n\n return [];\n};\n\nconst unselectOtherChildren = (container: Gtk.Widget, child: Gtk.Widget): void => {\n for (const selected of getSelectedChildren(container)) {\n if (selected !== child) {\n unselectContainerChild(container, selected);\n }\n }\n};\n\nexport {\n getChildAtIndex,\n hasIndexedChildren,\n isChildSelected,\n SELECTED_PROBE,\n selectContainerChild,\n unselectContainerChild,\n unselectOtherChildren,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,mCAAmC;AACnC,KAAK,UAAU,GAAG;IACd,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAiDF,uGAAuG;AACvG,QAAA,MAAM,GAAG,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,UAAU,UAAU,KAAG,OAAO,CAAC,IAAI,CAQ9D,CAAC;AAmQP,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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Gdk from "@gtkx/gi/gdk";
|
|
2
|
+
import * as Gio from "@gtkx/gi/gio";
|
|
2
3
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
4
|
import { getEditableDelegate } from "../editable.js";
|
|
4
5
|
import { fireEvent } from "../fire-event.js";
|
|
@@ -167,11 +168,36 @@ const didDispatchShortcutsOnWidget = (widget, keyval, modifiers) => {
|
|
|
167
168
|
}
|
|
168
169
|
return false;
|
|
169
170
|
};
|
|
170
|
-
const
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
171
|
+
const isAccelMatch = (accel, keyval, modifiers) => {
|
|
172
|
+
const [isParsed, accelKeyval, accelModifiers] = Gtk.acceleratorParse(accel);
|
|
173
|
+
return isParsed && accelKeyval === keyval && accelModifiers === modifiers;
|
|
174
|
+
};
|
|
175
|
+
const hasMatchingAccel = (application, detailedActionName, keyval, modifiers) => application.getAccelsForAction(detailedActionName).some((accel) => isAccelMatch(accel, keyval, modifiers));
|
|
176
|
+
const didActivateDetailedAction = (window, detailedActionName) => {
|
|
177
|
+
const [isParsed, actionName, target] = Gio.Action.parseDetailedName(detailedActionName);
|
|
178
|
+
return isParsed && window.activateAction(actionName, target);
|
|
179
|
+
};
|
|
180
|
+
const didDispatchAccelsOnWindow = (window, keyval, modifiers) => {
|
|
181
|
+
const application = window.getApplication();
|
|
182
|
+
if (!application) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
for (const detailedActionName of application.listActionDescriptions()) {
|
|
186
|
+
if (hasMatchingAccel(application, detailedActionName, keyval, modifiers)) {
|
|
187
|
+
return didActivateDetailedAction(window, detailedActionName);
|
|
188
|
+
}
|
|
174
189
|
}
|
|
190
|
+
return false;
|
|
191
|
+
};
|
|
192
|
+
const didDispatchApplicationAccels = (widget, keyval, modifiers) => {
|
|
193
|
+
const root = widget.getRoot();
|
|
194
|
+
return root instanceof Gtk.Window && didDispatchAccelsOnWindow(root, keyval, modifiers);
|
|
195
|
+
};
|
|
196
|
+
const didDispatchDelegateShortcuts = (widget, keyval, modifiers) => {
|
|
197
|
+
const delegate = getEditableDelegate(widget);
|
|
198
|
+
return delegate !== null && didDispatchShortcutsOnWidget(delegate, keyval, modifiers);
|
|
199
|
+
};
|
|
200
|
+
const didDispatchShortcutsOnAncestors = (widget, keyval, modifiers) => {
|
|
175
201
|
for (let current = widget; current; current = current.getParent()) {
|
|
176
202
|
if (didDispatchShortcutsOnWidget(current, keyval, modifiers)) {
|
|
177
203
|
return true;
|
|
@@ -179,6 +205,9 @@ const didDispatchShortcuts = (widget, keyval, modifiers) => {
|
|
|
179
205
|
}
|
|
180
206
|
return false;
|
|
181
207
|
};
|
|
208
|
+
const didDispatchShortcuts = (widget, keyval, modifiers) => didDispatchApplicationAccels(widget, keyval, modifiers) ||
|
|
209
|
+
didDispatchDelegateShortcuts(widget, keyval, modifiers) ||
|
|
210
|
+
didDispatchShortcutsOnAncestors(widget, keyval, modifiers);
|
|
182
211
|
const handleKeyPress = async (widget, keyval, modifiers) => {
|
|
183
212
|
const isHandled = didDispatchShortcuts(widget, keyval, modifiers);
|
|
184
213
|
if (!isHandled && keyval === Gdk.KEY_Return && widget instanceof Gtk.Editable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport type { UserEventState } from \"./state.js\";\nimport { getEditableDelegate } from \"../editable.js\";\nimport { fireEvent } from \"../fire-event.js\";\nimport { getOrCreateControllers } from \"./controller.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** Options for `userEvent.tab`. */\ntype TabOptions = {\n /** Move focus backward instead of forward. */\n isShiftHeld?: boolean;\n};\n\ntype KeyAction = { keyval: number; isPress: boolean };\ntype ParseStep = { actions: KeyAction[]; next: number };\n\nconst KEY_MAP: Record<string, number> = {\n Enter: Gdk.KEY_Return,\n Tab: Gdk.KEY_Tab,\n Escape: Gdk.KEY_Escape,\n Backspace: Gdk.KEY_BackSpace,\n Delete: Gdk.KEY_Delete,\n ArrowUp: Gdk.KEY_Up,\n ArrowDown: Gdk.KEY_Down,\n ArrowLeft: Gdk.KEY_Left,\n ArrowRight: Gdk.KEY_Right,\n Home: Gdk.KEY_Home,\n End: Gdk.KEY_End,\n PageUp: Gdk.KEY_Page_Up,\n PageDown: Gdk.KEY_Page_Down,\n Space: Gdk.KEY_space,\n Shift: Gdk.KEY_Shift_L,\n Control: Gdk.KEY_Control_L,\n Alt: Gdk.KEY_Alt_L,\n Meta: Gdk.KEY_Meta_L,\n F1: Gdk.KEY_F1,\n F2: Gdk.KEY_F2,\n F3: Gdk.KEY_F3,\n F4: Gdk.KEY_F4,\n F5: Gdk.KEY_F5,\n F6: Gdk.KEY_F6,\n F7: Gdk.KEY_F7,\n F8: Gdk.KEY_F8,\n F9: Gdk.KEY_F9,\n F10: Gdk.KEY_F10,\n F11: Gdk.KEY_F11,\n F12: Gdk.KEY_F12,\n};\n\nconst MODIFIER_KEYVAL_TO_MASK: Record<number, number> = {\n [Gdk.KEY_Shift_L]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Shift_R]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Control_L]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Control_R]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Alt_L]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Alt_R]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Meta_L]: Gdk.ModifierType.META_MASK,\n [Gdk.KEY_Meta_R]: Gdk.ModifierType.META_MASK,\n};\n\n/** Moves focus within the widget's root, forward by default and backward when `isShiftHeld` is set. */\nconst tab = (widget: Gtk.Widget, options?: TabOptions): Promise<void> =>\n wrapEvent(widget, () => {\n const direction = options?.isShiftHeld ? Gtk.DirectionType.TAB_BACKWARD : Gtk.DirectionType.TAB_FORWARD;\n const root = widget.getRoot();\n\n if (root) {\n root.childFocus(direction);\n }\n });\n\nconst parseKeyToken = (token: string): { keyval: number; isPress: boolean; isRelease: boolean } => {\n let keyName = token;\n let isPress = true;\n let isRelease = true;\n\n if (keyName.startsWith(\"/\")) {\n keyName = keyName.slice(1);\n isPress = false;\n } else if (keyName.endsWith(\">\")) {\n keyName = keyName.slice(0, -1);\n isRelease = false;\n }\n\n const keyval = KEY_MAP[keyName];\n\n if (keyval === undefined) {\n throw new Error(`Unknown key: {${keyName}}`);\n }\n\n return { keyval, isPress, isRelease };\n};\n\nconst parseCharAt = (input: string, i: number): ParseStep => {\n const keyval = input.codePointAt(i) ?? 0;\n\n return {\n actions: [\n { keyval, isPress: true },\n { keyval, isPress: false },\n ],\n next: i + 1,\n };\n};\n\nconst parseBraceAt = (input: string, i: number): ParseStep | null => {\n const endBrace = input.indexOf(\"}\", i);\n\n if (endBrace === -1) {\n return null;\n }\n\n const { keyval, isPress, isRelease } = parseKeyToken(input.slice(i + 1, endBrace));\n const actions: KeyAction[] = [];\n\n if (isPress) {\n actions.push({ keyval, isPress: true });\n }\n\n if (isRelease) {\n actions.push({ keyval, isPress: false });\n }\n\n return { actions, next: endBrace + 1 };\n};\n\nconst parseStepAt = (input: string, i: number): ParseStep | null =>\n input[i] === \"{\" ? parseBraceAt(input, i) : parseCharAt(input, i);\n\nconst parseKeyboardInput = (input: string): KeyAction[] => {\n const actions: KeyAction[] = [];\n let i = 0;\n\n while (i < input.length) {\n const step = parseStepAt(input, i);\n\n if (step === null) {\n break;\n }\n\n actions.push(...step.actions);\n i = step.next;\n }\n\n return actions;\n};\n\nconst updateModifierState = (state: UserEventState, action: KeyAction): void => {\n const mask = MODIFIER_KEYVAL_TO_MASK[action.keyval];\n\n if (!mask) {\n return;\n }\n\n if (action.isPress) {\n state.modifierState |= mask;\n } else {\n state.modifierState &= ~mask;\n }\n};\n\nconst isTriggerMatch = (\n trigger: Gtk.ShortcutTrigger | null,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (trigger instanceof Gtk.KeyvalTrigger) {\n return trigger.getKeyval() === keyval && trigger.getModifiers() === modifiers;\n }\n\n if (trigger instanceof Gtk.AlternativeTrigger) {\n return (\n isTriggerMatch(trigger.getFirst(), keyval, modifiers) ||\n isTriggerMatch(trigger.getSecond(), keyval, modifiers)\n );\n }\n\n return false;\n};\n\nconst didActivateShortcut = (\n shortcut: Gtk.Shortcut,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (!isTriggerMatch(shortcut.getTrigger(), keyval, modifiers)) {\n return false;\n }\n\n const action = shortcut.getAction();\n\n if (action instanceof Gtk.SignalAction && action.getSignalName() === \"move-focus\") {\n return false;\n }\n\n return action?.activate(0 as Gtk.ShortcutActionFlags, widget, shortcut.getArguments()) ?? false;\n};\n\nconst didActivateMatchingShortcut = (\n controller: Gtk.ShortcutController,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: number,\n): boolean => {\n const count = controller.getNItems();\n\n for (let j = 0; j < count; j++) {\n const shortcut = controller.getItem(j);\n\n if (!(shortcut instanceof Gtk.Shortcut)) {\n continue;\n }\n\n if (didActivateShortcut(shortcut, widget, keyval, modifiers)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst didDispatchShortcutsOnWidget = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const controllers = widget.observeControllers();\n\n for (let i = 0; i < controllers.getNItems(); i++) {\n const controller = controllers.getItem(i);\n\n if (\n controller instanceof Gtk.ShortcutController &&\n didActivateMatchingShortcut(controller, widget, keyval, modifiers)\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst didDispatchShortcuts = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const delegate = getEditableDelegate(widget);\n\n if (delegate && didDispatchShortcutsOnWidget(delegate, keyval, modifiers)) {\n return true;\n }\n\n for (let current: Gtk.Widget | null = widget; current; current = current.getParent()) {\n if (didDispatchShortcutsOnWidget(current, keyval, modifiers)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst handleKeyPress = async (widget: Gtk.Widget, keyval: number, modifiers: number): Promise<void> => {\n const isHandled = didDispatchShortcuts(widget, keyval, modifiers);\n\n if (!isHandled && keyval === Gdk.KEY_Return && widget instanceof Gtk.Editable) {\n await fireEvent(widget, \"activate\");\n }\n};\n\nconst applyKeyAction = async (\n widget: Gtk.Widget,\n controllers: Gtk.EventControllerKey[],\n state: UserEventState,\n action: KeyAction,\n): Promise<void> => {\n updateModifierState(state, action);\n const signalName = action.isPress ? \"key-pressed\" : \"key-released\";\n\n for (const controller of controllers) {\n controller.emit(signalName, action.keyval, 0, state.modifierState);\n }\n\n if (action.isPress) {\n await handleKeyPress(widget, action.keyval, state.modifierState);\n }\n};\n\nconst keyboard = (state: UserEventState, widget: Gtk.Widget, input: string): Promise<void> =>\n wrapEvent(widget, async () => {\n const controllers = getOrCreateControllers(widget, Gtk.EventControllerKey);\n\n for (const action of parseKeyboardInput(input)) {\n await applyKeyAction(widget, controllers, state, action);\n }\n });\n\nexport { tab, keyboard, type TabOptions };\n"]}
|
|
1
|
+
{"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/user-event/keyboard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport type { UserEventState } from \"./state.js\";\nimport { getEditableDelegate } from \"../editable.js\";\nimport { fireEvent } from \"../fire-event.js\";\nimport { getOrCreateControllers } from \"./controller.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** Options for `userEvent.tab`. */\ntype TabOptions = {\n /** Move focus backward instead of forward. */\n isShiftHeld?: boolean;\n};\n\ntype KeyAction = { keyval: number; isPress: boolean };\ntype ParseStep = { actions: KeyAction[]; next: number };\n\nconst KEY_MAP: Record<string, number> = {\n Enter: Gdk.KEY_Return,\n Tab: Gdk.KEY_Tab,\n Escape: Gdk.KEY_Escape,\n Backspace: Gdk.KEY_BackSpace,\n Delete: Gdk.KEY_Delete,\n ArrowUp: Gdk.KEY_Up,\n ArrowDown: Gdk.KEY_Down,\n ArrowLeft: Gdk.KEY_Left,\n ArrowRight: Gdk.KEY_Right,\n Home: Gdk.KEY_Home,\n End: Gdk.KEY_End,\n PageUp: Gdk.KEY_Page_Up,\n PageDown: Gdk.KEY_Page_Down,\n Space: Gdk.KEY_space,\n Shift: Gdk.KEY_Shift_L,\n Control: Gdk.KEY_Control_L,\n Alt: Gdk.KEY_Alt_L,\n Meta: Gdk.KEY_Meta_L,\n F1: Gdk.KEY_F1,\n F2: Gdk.KEY_F2,\n F3: Gdk.KEY_F3,\n F4: Gdk.KEY_F4,\n F5: Gdk.KEY_F5,\n F6: Gdk.KEY_F6,\n F7: Gdk.KEY_F7,\n F8: Gdk.KEY_F8,\n F9: Gdk.KEY_F9,\n F10: Gdk.KEY_F10,\n F11: Gdk.KEY_F11,\n F12: Gdk.KEY_F12,\n};\n\nconst MODIFIER_KEYVAL_TO_MASK: Record<number, number> = {\n [Gdk.KEY_Shift_L]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Shift_R]: Gdk.ModifierType.SHIFT_MASK,\n [Gdk.KEY_Control_L]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Control_R]: Gdk.ModifierType.CONTROL_MASK,\n [Gdk.KEY_Alt_L]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Alt_R]: Gdk.ModifierType.ALT_MASK,\n [Gdk.KEY_Meta_L]: Gdk.ModifierType.META_MASK,\n [Gdk.KEY_Meta_R]: Gdk.ModifierType.META_MASK,\n};\n\n/** Moves focus within the widget's root, forward by default and backward when `isShiftHeld` is set. */\nconst tab = (widget: Gtk.Widget, options?: TabOptions): Promise<void> =>\n wrapEvent(widget, () => {\n const direction = options?.isShiftHeld ? Gtk.DirectionType.TAB_BACKWARD : Gtk.DirectionType.TAB_FORWARD;\n const root = widget.getRoot();\n\n if (root) {\n root.childFocus(direction);\n }\n });\n\nconst parseKeyToken = (token: string): { keyval: number; isPress: boolean; isRelease: boolean } => {\n let keyName = token;\n let isPress = true;\n let isRelease = true;\n\n if (keyName.startsWith(\"/\")) {\n keyName = keyName.slice(1);\n isPress = false;\n } else if (keyName.endsWith(\">\")) {\n keyName = keyName.slice(0, -1);\n isRelease = false;\n }\n\n const keyval = KEY_MAP[keyName];\n\n if (keyval === undefined) {\n throw new Error(`Unknown key: {${keyName}}`);\n }\n\n return { keyval, isPress, isRelease };\n};\n\nconst parseCharAt = (input: string, i: number): ParseStep => {\n const keyval = input.codePointAt(i) ?? 0;\n\n return {\n actions: [\n { keyval, isPress: true },\n { keyval, isPress: false },\n ],\n next: i + 1,\n };\n};\n\nconst parseBraceAt = (input: string, i: number): ParseStep | null => {\n const endBrace = input.indexOf(\"}\", i);\n\n if (endBrace === -1) {\n return null;\n }\n\n const { keyval, isPress, isRelease } = parseKeyToken(input.slice(i + 1, endBrace));\n const actions: KeyAction[] = [];\n\n if (isPress) {\n actions.push({ keyval, isPress: true });\n }\n\n if (isRelease) {\n actions.push({ keyval, isPress: false });\n }\n\n return { actions, next: endBrace + 1 };\n};\n\nconst parseStepAt = (input: string, i: number): ParseStep | null =>\n input[i] === \"{\" ? parseBraceAt(input, i) : parseCharAt(input, i);\n\nconst parseKeyboardInput = (input: string): KeyAction[] => {\n const actions: KeyAction[] = [];\n let i = 0;\n\n while (i < input.length) {\n const step = parseStepAt(input, i);\n\n if (step === null) {\n break;\n }\n\n actions.push(...step.actions);\n i = step.next;\n }\n\n return actions;\n};\n\nconst updateModifierState = (state: UserEventState, action: KeyAction): void => {\n const mask = MODIFIER_KEYVAL_TO_MASK[action.keyval];\n\n if (!mask) {\n return;\n }\n\n if (action.isPress) {\n state.modifierState |= mask;\n } else {\n state.modifierState &= ~mask;\n }\n};\n\nconst isTriggerMatch = (\n trigger: Gtk.ShortcutTrigger | null,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (trigger instanceof Gtk.KeyvalTrigger) {\n return trigger.getKeyval() === keyval && trigger.getModifiers() === modifiers;\n }\n\n if (trigger instanceof Gtk.AlternativeTrigger) {\n return (\n isTriggerMatch(trigger.getFirst(), keyval, modifiers) ||\n isTriggerMatch(trigger.getSecond(), keyval, modifiers)\n );\n }\n\n return false;\n};\n\nconst didActivateShortcut = (\n shortcut: Gtk.Shortcut,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: Gdk.ModifierType,\n): boolean => {\n if (!isTriggerMatch(shortcut.getTrigger(), keyval, modifiers)) {\n return false;\n }\n\n const action = shortcut.getAction();\n\n if (action instanceof Gtk.SignalAction && action.getSignalName() === \"move-focus\") {\n return false;\n }\n\n return action?.activate(0 as Gtk.ShortcutActionFlags, widget, shortcut.getArguments()) ?? false;\n};\n\nconst didActivateMatchingShortcut = (\n controller: Gtk.ShortcutController,\n widget: Gtk.Widget,\n keyval: number,\n modifiers: number,\n): boolean => {\n const count = controller.getNItems();\n\n for (let j = 0; j < count; j++) {\n const shortcut = controller.getItem(j);\n\n if (!(shortcut instanceof Gtk.Shortcut)) {\n continue;\n }\n\n if (didActivateShortcut(shortcut, widget, keyval, modifiers)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst didDispatchShortcutsOnWidget = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const controllers = widget.observeControllers();\n\n for (let i = 0; i < controllers.getNItems(); i++) {\n const controller = controllers.getItem(i);\n\n if (\n controller instanceof Gtk.ShortcutController &&\n didActivateMatchingShortcut(controller, widget, keyval, modifiers)\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isAccelMatch = (accel: string, keyval: number, modifiers: Gdk.ModifierType): boolean => {\n const [isParsed, accelKeyval, accelModifiers] = Gtk.acceleratorParse(accel);\n\n return isParsed && accelKeyval === keyval && accelModifiers === modifiers;\n};\n\nconst hasMatchingAccel = (\n application: Gtk.Application,\n detailedActionName: string,\n keyval: number,\n modifiers: number,\n): boolean =>\n application.getAccelsForAction(detailedActionName).some((accel) => isAccelMatch(accel, keyval, modifiers));\n\nconst didActivateDetailedAction = (window: Gtk.Window, detailedActionName: string): boolean => {\n const [isParsed, actionName, target] = Gio.Action.parseDetailedName(detailedActionName);\n\n return isParsed && window.activateAction(actionName, target);\n};\n\nconst didDispatchAccelsOnWindow = (window: Gtk.Window, keyval: number, modifiers: number): boolean => {\n const application = window.getApplication();\n\n if (!application) {\n return false;\n }\n\n for (const detailedActionName of application.listActionDescriptions()) {\n if (hasMatchingAccel(application, detailedActionName, keyval, modifiers)) {\n return didActivateDetailedAction(window, detailedActionName);\n }\n }\n\n return false;\n};\n\nconst didDispatchApplicationAccels = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const root = widget.getRoot();\n\n return root instanceof Gtk.Window && didDispatchAccelsOnWindow(root, keyval, modifiers);\n};\n\nconst didDispatchDelegateShortcuts = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n const delegate = getEditableDelegate(widget);\n\n return delegate !== null && didDispatchShortcutsOnWidget(delegate, keyval, modifiers);\n};\n\nconst didDispatchShortcutsOnAncestors = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean => {\n for (let current: Gtk.Widget | null = widget; current; current = current.getParent()) {\n if (didDispatchShortcutsOnWidget(current, keyval, modifiers)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst didDispatchShortcuts = (widget: Gtk.Widget, keyval: number, modifiers: number): boolean =>\n didDispatchApplicationAccels(widget, keyval, modifiers) ||\n didDispatchDelegateShortcuts(widget, keyval, modifiers) ||\n didDispatchShortcutsOnAncestors(widget, keyval, modifiers);\n\nconst handleKeyPress = async (widget: Gtk.Widget, keyval: number, modifiers: number): Promise<void> => {\n const isHandled = didDispatchShortcuts(widget, keyval, modifiers);\n\n if (!isHandled && keyval === Gdk.KEY_Return && widget instanceof Gtk.Editable) {\n await fireEvent(widget, \"activate\");\n }\n};\n\nconst applyKeyAction = async (\n widget: Gtk.Widget,\n controllers: Gtk.EventControllerKey[],\n state: UserEventState,\n action: KeyAction,\n): Promise<void> => {\n updateModifierState(state, action);\n const signalName = action.isPress ? \"key-pressed\" : \"key-released\";\n\n for (const controller of controllers) {\n controller.emit(signalName, action.keyval, 0, state.modifierState);\n }\n\n if (action.isPress) {\n await handleKeyPress(widget, action.keyval, state.modifierState);\n }\n};\n\nconst keyboard = (state: UserEventState, widget: Gtk.Widget, input: string): Promise<void> =>\n wrapEvent(widget, async () => {\n const controllers = getOrCreateControllers(widget, Gtk.EventControllerKey);\n\n for (const action of parseKeyboardInput(input)) {\n await applyKeyAction(widget, controllers, state, action);\n }\n });\n\nexport { tab, keyboard, type TabOptions };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-row-click.d.ts","sourceRoot":"","sources":["../../src/user-event/list-row-click.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAkDzC,QAAA,MAAM,aAAa,GAAI,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,KAAG,IAIxD,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
|