@gtkx/testing 1.0.0-rc.2 → 1.0.0-rc.4
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 +4 -5
- package/dist/act.d.ts +2 -0
- package/dist/act.d.ts.map +1 -1
- package/dist/act.js.map +1 -1
- package/dist/bound-queries.d.ts +2 -3
- package/dist/bound-queries.d.ts.map +1 -1
- package/dist/bound-queries.js.map +1 -1
- package/dist/build-queries.d.ts.map +1 -1
- package/dist/build-queries.js +18 -7
- package/dist/build-queries.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -3
- package/dist/config.js.map +1 -1
- package/dist/errors.js +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/matchers.d.ts +125 -21
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js +258 -21
- package/dist/matchers.js.map +1 -1
- package/dist/normalize.d.ts +10 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +20 -0
- package/dist/normalize.js.map +1 -0
- package/dist/pretty-widget.d.ts +2 -1
- package/dist/pretty-widget.d.ts.map +1 -1
- package/dist/pretty-widget.js +3 -3
- package/dist/pretty-widget.js.map +1 -1
- package/dist/queries.d.ts +4 -21
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +46 -59
- package/dist/queries.js.map +1 -1
- package/dist/render.js +3 -3
- package/dist/render.js.map +1 -1
- package/dist/suggestions.d.ts +3 -0
- package/dist/suggestions.d.ts.map +1 -1
- package/dist/suggestions.js.map +1 -1
- package/dist/traversal.d.ts +5 -0
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +1 -0
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +69 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +13 -0
- package/dist/user-event/adjustment.d.ts.map +1 -1
- package/dist/user-event/adjustment.js +11 -0
- package/dist/user-event/adjustment.js.map +1 -1
- package/dist/user-event/click.d.ts +7 -0
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +7 -0
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/controller.d.ts +31 -1
- package/dist/user-event/controller.d.ts.map +1 -1
- package/dist/user-event/controller.js +36 -1
- package/dist/user-event/controller.js.map +1 -1
- package/dist/user-event/gesture.d.ts +51 -0
- package/dist/user-event/gesture.d.ts.map +1 -1
- package/dist/user-event/gesture.js +47 -4
- package/dist/user-event/gesture.js.map +1 -1
- package/dist/user-event/index.d.ts +27 -0
- package/dist/user-event/index.d.ts.map +1 -1
- package/dist/user-event/index.js.map +1 -1
- package/dist/user-event/keyboard.d.ts +4 -2
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +13 -12
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/pointer.js +5 -5
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/user-event/selection.d.ts +15 -0
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +15 -0
- package/dist/user-event/selection.js.map +1 -1
- package/dist/user-event/state.d.ts +1 -1
- package/dist/user-event/state.d.ts.map +1 -1
- package/dist/user-event/state.js +1 -1
- package/dist/user-event/state.js.map +1 -1
- package/dist/user-event/text.d.ts +30 -3
- package/dist/user-event/text.d.ts.map +1 -1
- package/dist/user-event/text.js +28 -1
- package/dist/user-event/text.js.map +1 -1
- package/dist/wait-for.d.ts +2 -0
- package/dist/wait-for.d.ts.map +1 -1
- package/dist/wait-for.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +28 -2
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +129 -10
- package/dist/widget-accessible-properties.js.map +1 -1
- package/dist/within.js.map +1 -1
- package/package.json +7 -7
- package/src/act.ts +2 -0
- package/src/bound-queries.ts +2 -3
- package/src/build-queries.ts +20 -8
- package/src/config.ts +4 -3
- package/src/errors.ts +2 -2
- package/src/index.ts +11 -2
- package/src/matchers.ts +500 -53
- package/src/normalize.ts +28 -0
- package/src/pretty-widget.ts +5 -4
- package/src/queries.ts +79 -105
- package/src/render.tsx +3 -3
- package/src/suggestions.ts +3 -0
- package/src/traversal.ts +5 -0
- package/src/types.ts +88 -4
- package/src/user-event/adjustment.ts +13 -0
- package/src/user-event/click.ts +7 -0
- package/src/user-event/controller.ts +50 -1
- package/src/user-event/gesture.ts +57 -6
- package/src/user-event/index.ts +27 -0
- package/src/user-event/keyboard.ts +18 -16
- package/src/user-event/pointer.ts +5 -5
- package/src/user-event/selection.ts +15 -0
- package/src/user-event/state.ts +2 -2
- package/src/user-event/text.ts +31 -4
- package/src/wait-for.ts +2 -0
- package/src/widget-accessible-properties.ts +188 -10
- package/src/within.ts +1 -1
|
@@ -4,12 +4,16 @@ import * as Gtk from "@gtkx/gi/gtk";
|
|
|
4
4
|
type DropContent = string | number | boolean | GObject.Value;
|
|
5
5
|
/** Options for a drop: the drop coordinates within the target. */
|
|
6
6
|
type DropOptions = {
|
|
7
|
+
/** Horizontal drop coordinate within the target, in pixels. */
|
|
7
8
|
x?: number;
|
|
9
|
+
/** Vertical drop coordinate within the target, in pixels. */
|
|
8
10
|
y?: number;
|
|
9
11
|
};
|
|
10
12
|
/** A drag offset relative to the drag start point. */
|
|
11
13
|
type DragOffset = {
|
|
14
|
+
/** Horizontal distance from the drag start point, in pixels. */
|
|
12
15
|
x: number;
|
|
16
|
+
/** Vertical distance from the drag start point, in pixels. */
|
|
13
17
|
y: number;
|
|
14
18
|
};
|
|
15
19
|
/**
|
|
@@ -17,19 +21,66 @@ type DragOffset = {
|
|
|
17
21
|
* explicit intermediate offsets emitted before the final one.
|
|
18
22
|
*/
|
|
19
23
|
type DragOptions = {
|
|
24
|
+
/** Horizontal coordinate the drag begins at; defaults to 0. */
|
|
20
25
|
startX?: number;
|
|
26
|
+
/** Vertical coordinate the drag begins at; defaults to 0. */
|
|
21
27
|
startY?: number;
|
|
28
|
+
/** Number of evenly interpolated drag updates, the last of which is the requested offset; defaults to 2. */
|
|
22
29
|
steps?: number;
|
|
30
|
+
/** Explicit intermediate offsets emitted before the requested one, used instead of `steps`. */
|
|
23
31
|
offsets?: DragOffset[];
|
|
24
32
|
};
|
|
33
|
+
/** Emits `enter` at the widget's origin on its motion controllers, adding one when it has none. */
|
|
25
34
|
declare const hover: (widget: Gtk.Widget) => Promise<void>;
|
|
35
|
+
/** Emits `leave` on the widget's motion controllers, adding one when it has none. */
|
|
26
36
|
declare const unhover: (widget: Gtk.Widget) => Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Emits `angle-changed` on the widget's rotate gestures.
|
|
39
|
+
*
|
|
40
|
+
* @param angle Current angle, in radians.
|
|
41
|
+
* @param deltaAngle Difference from the angle the gesture started at; defaults to `angle`.
|
|
42
|
+
* @throws When the widget has no Gtk.GestureRotate.
|
|
43
|
+
*/
|
|
27
44
|
declare const rotate: (widget: Gtk.Widget, angle: number, deltaAngle?: number) => Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Emits `scale-changed` with the given scale delta on the widget's zoom gestures.
|
|
47
|
+
*
|
|
48
|
+
* @throws When the widget has no Gtk.GestureZoom.
|
|
49
|
+
*/
|
|
28
50
|
declare const zoom: (widget: Gtk.Widget, scale: number) => Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Emits `swipe` with the given per-axis velocity, in pixels per second, on the widget's swipe gestures.
|
|
53
|
+
*
|
|
54
|
+
* @throws When the widget has no Gtk.GestureSwipe.
|
|
55
|
+
*/
|
|
29
56
|
declare const swipe: (widget: Gtk.Widget, velocityX: number, velocityY: number) => Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Emits `pressed` at the given point in widget coordinates on the widget's long-press gestures.
|
|
59
|
+
*
|
|
60
|
+
* @throws When the widget has no Gtk.GestureLongPress.
|
|
61
|
+
*/
|
|
30
62
|
declare const longPress: (widget: Gtk.Widget, x?: number, y?: number) => Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Runs a `drag-begin`, `drag-update`, `drag-end` sequence ending at the offset `dx`, `dy` on the
|
|
65
|
+
* widget's drag gestures, overriding each gesture's start point and offset for the duration so
|
|
66
|
+
* handlers read the simulated values back.
|
|
67
|
+
*
|
|
68
|
+
* @throws When the widget is a Gtk.Range, whose slider reads pointer coordinates from the display,
|
|
69
|
+
* or when it has no Gtk.GestureDrag.
|
|
70
|
+
*/
|
|
31
71
|
declare const drag: (widget: Gtk.Widget, dx: number, dy: number, options?: DragOptions) => Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Emits `drop` with the given content on every drop target attached to the widget.
|
|
74
|
+
*
|
|
75
|
+
* @throws When the widget has no Gtk.DropTarget.
|
|
76
|
+
*/
|
|
32
77
|
declare const drop: (widget: Gtk.Widget, content: DropContent, options?: DropOptions) => Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Emits `drop` with the given content on the target's drop targets, after checking that the source
|
|
80
|
+
* carries a drag source.
|
|
81
|
+
*
|
|
82
|
+
* @throws When the source has no Gtk.DragSource, or the target no Gtk.DropTarget.
|
|
83
|
+
*/
|
|
33
84
|
declare const dragAndDrop: (source: Gtk.Widget, target: Gtk.Widget, content: DropContent, options?: DropOptions) => Promise<void>;
|
|
34
85
|
export { hover, unhover, rotate, zoom, swipe, longPress, drag, drop, dragAndDrop, type DropContent, type DropOptions, type DragOffset, type DragOptions, };
|
|
35
86
|
//# sourceMappingURL=gesture.d.ts.map
|
|
@@ -1 +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"}
|
|
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,+DAA+D;IAC/D,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,6DAA6D;IAC7D,CAAC,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,sDAAsD;AACtD,KAAK,UAAU,GAAG;IACd,gEAAgE;IAChE,CAAC,EAAE,MAAM,CAAC;IACV,8DAA8D;IAC9D,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;GAGG;AACH,KAAK,WAAW,GAAG;IACf,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CAC1B,CAAC;AAqCF,mGAAmG;AACnG,QAAA,MAAM,KAAK,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,CAAC,IAAI,CAG1C,CAAC;AAEP,qFAAqF;AACrF,QAAA,MAAM,OAAO,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,CAAC,IAAI,CAG5C,CAAC;AAEP;;;;;;GAMG;AACH,QAAA,MAAM,MAAM,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,aAAY,MAAc,KAAG,OAAO,CAAC,IAAI,CAIvF,CAAC;AAEN;;;;GAIG;AACH,QAAA,MAAM,IAAI,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAGxD,CAAC;AAEP;;;;GAIG;AACH,QAAA,MAAM,KAAK,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,IAAI,CAGhF,CAAC;AAEP;;;;GAIG;AACH,QAAA,MAAM,SAAS,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,UAAK,EAAE,UAAK,KAAG,OAAO,CAAC,IAAI,CAG5D,CAAC;AAmFP;;;;;;;GAOG;AACH,QAAA,MAAM,IAAI,GAAU,QAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,UAAS,WAAgB,KAAG,OAAO,CAAC,IAAI,CAevG,CAAC;AAUF;;;;GAIG;AACH,QAAA,MAAM,IAAI,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,UAAS,WAAgB,KAAG,OAAO,CAAC,IAAI,CAG1F,CAAC;AAEP;;;;;GAKG;AACH,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"}
|
|
@@ -21,33 +21,57 @@ const buildDropValue = (content) => {
|
|
|
21
21
|
v.setDouble(content);
|
|
22
22
|
});
|
|
23
23
|
};
|
|
24
|
+
/** Emits `enter` at the widget's origin on its motion controllers, adding one when it has none. */
|
|
24
25
|
const hover = (widget) => dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {
|
|
25
26
|
controller.emit("enter", 0, 0);
|
|
26
27
|
});
|
|
28
|
+
/** Emits `leave` on the widget's motion controllers, adding one when it has none. */
|
|
27
29
|
const unhover = (widget) => dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {
|
|
28
30
|
controller.emit("leave");
|
|
29
31
|
});
|
|
32
|
+
/**
|
|
33
|
+
* Emits `angle-changed` on the widget's rotate gestures.
|
|
34
|
+
*
|
|
35
|
+
* @param angle Current angle, in radians.
|
|
36
|
+
* @param deltaAngle Difference from the angle the gesture started at; defaults to `angle`.
|
|
37
|
+
* @throws When the widget has no Gtk.GestureRotate.
|
|
38
|
+
*/
|
|
30
39
|
const rotate = (widget, angle, deltaAngle = angle) => dispatchOnControllers(widget, Gtk.GestureRotate, (controller) => {
|
|
31
40
|
controller.emit("angle-changed", angle, deltaAngle);
|
|
32
41
|
});
|
|
42
|
+
/**
|
|
43
|
+
* Emits `scale-changed` with the given scale delta on the widget's zoom gestures.
|
|
44
|
+
*
|
|
45
|
+
* @throws When the widget has no Gtk.GestureZoom.
|
|
46
|
+
*/
|
|
33
47
|
const zoom = (widget, scale) => dispatchOnControllers(widget, Gtk.GestureZoom, (controller) => {
|
|
34
48
|
controller.emit("scale-changed", scale);
|
|
35
49
|
});
|
|
50
|
+
/**
|
|
51
|
+
* Emits `swipe` with the given per-axis velocity, in pixels per second, on the widget's swipe gestures.
|
|
52
|
+
*
|
|
53
|
+
* @throws When the widget has no Gtk.GestureSwipe.
|
|
54
|
+
*/
|
|
36
55
|
const swipe = (widget, velocityX, velocityY) => dispatchOnControllers(widget, Gtk.GestureSwipe, (controller) => {
|
|
37
56
|
controller.emit("swipe", velocityX, velocityY);
|
|
38
57
|
});
|
|
58
|
+
/**
|
|
59
|
+
* Emits `pressed` at the given point in widget coordinates on the widget's long-press gestures.
|
|
60
|
+
*
|
|
61
|
+
* @throws When the widget has no Gtk.GestureLongPress.
|
|
62
|
+
*/
|
|
39
63
|
const longPress = (widget, x = 0, y = 0) => dispatchOnControllers(widget, Gtk.GestureLongPress, (controller) => {
|
|
40
64
|
controller.emit("pressed", x, y);
|
|
41
65
|
});
|
|
42
66
|
const restoreDragState = (saved) => {
|
|
43
67
|
const { instance } = saved;
|
|
44
|
-
if (saved.
|
|
68
|
+
if (saved.hasOwnStartPoint) {
|
|
45
69
|
instance.getStartPoint = saved.previousStartPoint;
|
|
46
70
|
}
|
|
47
71
|
else {
|
|
48
72
|
delete instance.getStartPoint;
|
|
49
73
|
}
|
|
50
|
-
if (saved.
|
|
74
|
+
if (saved.hasOwnOffset) {
|
|
51
75
|
instance.getOffset = saved.previousOffset;
|
|
52
76
|
}
|
|
53
77
|
else {
|
|
@@ -58,8 +82,8 @@ const patchDragState = (controller, start, offset) => {
|
|
|
58
82
|
const instance = controller;
|
|
59
83
|
const saved = {
|
|
60
84
|
instance,
|
|
61
|
-
|
|
62
|
-
|
|
85
|
+
hasOwnStartPoint: Object.hasOwn(instance, "getStartPoint"),
|
|
86
|
+
hasOwnOffset: Object.hasOwn(instance, "getOffset"),
|
|
63
87
|
previousStartPoint: instance.getStartPoint,
|
|
64
88
|
previousOffset: instance.getOffset,
|
|
65
89
|
};
|
|
@@ -105,6 +129,14 @@ const resolveDragUpdates = (dx, dy, options) => {
|
|
|
105
129
|
}
|
|
106
130
|
return updates;
|
|
107
131
|
};
|
|
132
|
+
/**
|
|
133
|
+
* Runs a `drag-begin`, `drag-update`, `drag-end` sequence ending at the offset `dx`, `dy` on the
|
|
134
|
+
* widget's drag gestures, overriding each gesture's start point and offset for the duration so
|
|
135
|
+
* handlers read the simulated values back.
|
|
136
|
+
*
|
|
137
|
+
* @throws When the widget is a Gtk.Range, whose slider reads pointer coordinates from the display,
|
|
138
|
+
* or when it has no Gtk.GestureDrag.
|
|
139
|
+
*/
|
|
108
140
|
const drag = async (widget, dx, dy, options = {}) => {
|
|
109
141
|
if (widget instanceof Gtk.Range) {
|
|
110
142
|
throw new TypeError("userEvent.drag cannot drive a Gtk.Range's built-in slider " +
|
|
@@ -123,9 +155,20 @@ const emitDrop = (target, content, options) => {
|
|
|
123
155
|
dropTarget.emit("drop", buildDropValue(content), options.x ?? 0, options.y ?? 0);
|
|
124
156
|
}
|
|
125
157
|
};
|
|
158
|
+
/**
|
|
159
|
+
* Emits `drop` with the given content on every drop target attached to the widget.
|
|
160
|
+
*
|
|
161
|
+
* @throws When the widget has no Gtk.DropTarget.
|
|
162
|
+
*/
|
|
126
163
|
const drop = (widget, content, options = {}) => wrapEvent(widget, () => {
|
|
127
164
|
emitDrop(widget, content, options);
|
|
128
165
|
});
|
|
166
|
+
/**
|
|
167
|
+
* Emits `drop` with the given content on the target's drop targets, after checking that the source
|
|
168
|
+
* carries a drag source.
|
|
169
|
+
*
|
|
170
|
+
* @throws When the source has no Gtk.DragSource, or the target no Gtk.DropTarget.
|
|
171
|
+
*/
|
|
129
172
|
const dragAndDrop = async (source, target, content, options = {}) => {
|
|
130
173
|
await wrapEvent(source, () => {
|
|
131
174
|
getAllControllers(source, Gtk.DragSource);
|
|
@@ -1 +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"]}
|
|
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 /** Horizontal drop coordinate within the target, in pixels. */\n x?: number;\n /** Vertical drop coordinate within the target, in pixels. */\n y?: number;\n};\n\n/** A drag offset relative to the drag start point. */\ntype DragOffset = {\n /** Horizontal distance from the drag start point, in pixels. */\n x: number;\n /** Vertical distance from the drag start point, in pixels. */\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 /** Horizontal coordinate the drag begins at; defaults to 0. */\n startX?: number;\n /** Vertical coordinate the drag begins at; defaults to 0. */\n startY?: number;\n /** Number of evenly interpolated drag updates, the last of which is the requested offset; defaults to 2. */\n steps?: number;\n /** Explicit intermediate offsets emitted before the requested one, used instead of `steps`. */\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 hasOwnStartPoint: boolean;\n hasOwnOffset: 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\n/** Emits `enter` at the widget's origin on its motion controllers, adding one when it has none. */\nconst hover = (widget: Gtk.Widget): Promise<void> =>\n dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {\n controller.emit(\"enter\", 0, 0);\n });\n\n/** Emits `leave` on the widget's motion controllers, adding one when it has none. */\nconst unhover = (widget: Gtk.Widget): Promise<void> =>\n dispatchOnOrCreateControllers(widget, Gtk.EventControllerMotion, (controller) => {\n controller.emit(\"leave\");\n });\n\n/**\n * Emits `angle-changed` on the widget's rotate gestures.\n *\n * @param angle Current angle, in radians.\n * @param deltaAngle Difference from the angle the gesture started at; defaults to `angle`.\n * @throws When the widget has no Gtk.GestureRotate.\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\n/**\n * Emits `scale-changed` with the given scale delta on the widget's zoom gestures.\n *\n * @throws When the widget has no Gtk.GestureZoom.\n */\nconst zoom = (widget: Gtk.Widget, scale: number): Promise<void> =>\n dispatchOnControllers(widget, Gtk.GestureZoom, (controller) => {\n controller.emit(\"scale-changed\", scale);\n });\n\n/**\n * Emits `swipe` with the given per-axis velocity, in pixels per second, on the widget's swipe gestures.\n *\n * @throws When the widget has no Gtk.GestureSwipe.\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\n/**\n * Emits `pressed` at the given point in widget coordinates on the widget's long-press gestures.\n *\n * @throws When the widget has no Gtk.GestureLongPress.\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.hasOwnStartPoint) {\n instance.getStartPoint = saved.previousStartPoint;\n } else {\n delete instance.getStartPoint;\n }\n\n if (saved.hasOwnOffset) {\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 hasOwnStartPoint: Object.hasOwn(instance, \"getStartPoint\"),\n hasOwnOffset: 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\n/**\n * Runs a `drag-begin`, `drag-update`, `drag-end` sequence ending at the offset `dx`, `dy` on the\n * widget's drag gestures, overriding each gesture's start point and offset for the duration so\n * handlers read the simulated values back.\n *\n * @throws When the widget is a Gtk.Range, whose slider reads pointer coordinates from the display,\n * or when it has no Gtk.GestureDrag.\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\n/**\n * Emits `drop` with the given content on every drop target attached to the widget.\n *\n * @throws When the widget has no Gtk.DropTarget.\n */\nconst drop = (widget: Gtk.Widget, content: DropContent, options: DropOptions = {}): Promise<void> =>\n wrapEvent(widget, () => {\n emitDrop(widget, content, options);\n });\n\n/**\n * Emits `drop` with the given content on the target's drop targets, after checking that the source\n * carries a drag source.\n *\n * @throws When the source has no Gtk.DragSource, or the target no Gtk.DropTarget.\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"]}
|
|
@@ -11,29 +11,56 @@ import { clear, copy, cut, paste, type } from "./text.js";
|
|
|
11
11
|
* keyboard, pointer, gestures, selection, and scrolling.
|
|
12
12
|
*/
|
|
13
13
|
type UserEvent = {
|
|
14
|
+
/**
|
|
15
|
+
* Clicks a button, toggles a switch, and otherwise activates the widget, falling back to a click
|
|
16
|
+
* gesture on its nearest clickable ancestor when activation does nothing.
|
|
17
|
+
*/
|
|
14
18
|
click: typeof click;
|
|
19
|
+
/** Emits a two-press click gesture on the widget. */
|
|
15
20
|
dblClick: typeof dblClick;
|
|
21
|
+
/** Emits a three-press click gesture on the widget. */
|
|
16
22
|
tripleClick: typeof tripleClick;
|
|
23
|
+
/** Moves focus within the widget's root, forward by default and backward with `isShiftHeld`. */
|
|
17
24
|
tab: typeof tab;
|
|
25
|
+
/** Focuses an editable widget, applies any initial selection, and inserts the text at the cursor. */
|
|
18
26
|
type: typeof type;
|
|
27
|
+
/** Empties an editable widget's text. */
|
|
19
28
|
clear: typeof clear;
|
|
29
|
+
/** Writes an editable widget's current selection to the clipboard. */
|
|
20
30
|
copy: typeof copy;
|
|
31
|
+
/** Writes an editable widget's current selection to the clipboard and deletes it. */
|
|
21
32
|
cut: typeof cut;
|
|
33
|
+
/** Inserts the given text, or the clipboard's text, at an editable widget's cursor. */
|
|
22
34
|
paste: typeof paste;
|
|
35
|
+
/** Selects the items at the given positions in a list view, drop-down, combo box, or list box. */
|
|
23
36
|
selectOptions: typeof selectOptions;
|
|
37
|
+
/** Deselects the items at the given positions in a list view or list box. */
|
|
24
38
|
deselectOptions: typeof deselectOptions;
|
|
39
|
+
/** Emits a motion `enter` on the widget, adding a motion controller when it has none. */
|
|
25
40
|
hover: typeof hover;
|
|
41
|
+
/** Emits a motion `leave` on the widget, adding a motion controller when it has none. */
|
|
26
42
|
unhover: typeof unhover;
|
|
43
|
+
/** Emits `angle-changed` on the widget's rotate gestures. */
|
|
27
44
|
rotate: typeof rotate;
|
|
45
|
+
/** Emits `scale-changed` on the widget's zoom gestures. */
|
|
28
46
|
zoom: typeof zoom;
|
|
47
|
+
/** Emits `swipe` with the given velocity on the widget's swipe gestures. */
|
|
29
48
|
swipe: typeof swipe;
|
|
49
|
+
/** Emits `pressed` at the given point on the widget's long-press gestures. */
|
|
30
50
|
longPress: typeof longPress;
|
|
51
|
+
/** Runs a begin, update, and end sequence on the widget's drag gestures, ending at the given offset. */
|
|
31
52
|
drag: typeof drag;
|
|
53
|
+
/** Emits `drop` with the given content on the widget's drop targets. */
|
|
32
54
|
drop: typeof drop;
|
|
55
|
+
/** Requires a drag source on the source widget, then emits `drop` with the content on the target's drop targets. */
|
|
33
56
|
dragAndDrop: typeof dragAndDrop;
|
|
57
|
+
/** Emits a jump `change-value` on a Gtk.Range so it moves to the given value. */
|
|
34
58
|
slide: typeof slide;
|
|
59
|
+
/** Adds the delta to the adjustments of the widget itself, or of its nearest scrollable ancestor. */
|
|
35
60
|
scroll: typeof scroll;
|
|
61
|
+
/** Sends a key sequence, dispatching matching shortcuts and tracking held modifiers across calls. */
|
|
36
62
|
keyboard: (widget: Gtk.Widget, input: string) => Promise<void>;
|
|
63
|
+
/** Applies a pointer token, tracking whether the left button is held across calls. */
|
|
37
64
|
pointer: (widget: Gtk.Widget, input: PointerInput) => Promise<void>;
|
|
38
65
|
};
|
|
39
66
|
/**
|
|
@@ -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,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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user-event/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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,9 +1,11 @@
|
|
|
1
1
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
2
|
import type { UserEventState } from "./state.js";
|
|
3
|
-
/** Options for
|
|
3
|
+
/** Options for `userEvent.tab`. */
|
|
4
4
|
type TabOptions = {
|
|
5
|
-
|
|
5
|
+
/** Move focus backward instead of forward. */
|
|
6
|
+
isShiftHeld?: boolean;
|
|
6
7
|
};
|
|
8
|
+
/** Moves focus within the widget's root, forward by default and backward when `isShiftHeld` is set. */
|
|
7
9
|
declare const tab: (widget: Gtk.Widget, options?: TabOptions) => Promise<void>;
|
|
8
10
|
declare const keyboard: (state: UserEventState, widget: Gtk.Widget, input: string) => Promise<void>;
|
|
9
11
|
export { tab, keyboard, type TabOptions };
|
|
@@ -1 +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,
|
|
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,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;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"}
|
|
@@ -46,8 +46,9 @@ const MODIFIER_KEYVAL_TO_MASK = {
|
|
|
46
46
|
[Gdk.KEY_Meta_L]: Gdk.ModifierType.META_MASK,
|
|
47
47
|
[Gdk.KEY_Meta_R]: Gdk.ModifierType.META_MASK,
|
|
48
48
|
};
|
|
49
|
+
/** Moves focus within the widget's root, forward by default and backward when `isShiftHeld` is set. */
|
|
49
50
|
const tab = (widget, options) => wrapEvent(widget, () => {
|
|
50
|
-
const direction = options?.
|
|
51
|
+
const direction = options?.isShiftHeld ? Gtk.DirectionType.TAB_BACKWARD : Gtk.DirectionType.TAB_FORWARD;
|
|
51
52
|
const root = widget.getRoot();
|
|
52
53
|
if (root) {
|
|
53
54
|
root.childFocus(direction);
|
|
@@ -69,14 +70,14 @@ const parseKeyToken = (token) => {
|
|
|
69
70
|
if (keyval === undefined) {
|
|
70
71
|
throw new Error(`Unknown key: {${keyName}}`);
|
|
71
72
|
}
|
|
72
|
-
return { keyval,
|
|
73
|
+
return { keyval, isPress, isRelease };
|
|
73
74
|
};
|
|
74
75
|
const parseCharAt = (input, i) => {
|
|
75
76
|
const keyval = input.codePointAt(i) ?? 0;
|
|
76
77
|
return {
|
|
77
78
|
actions: [
|
|
78
|
-
{ keyval,
|
|
79
|
-
{ keyval,
|
|
79
|
+
{ keyval, isPress: true },
|
|
80
|
+
{ keyval, isPress: false },
|
|
80
81
|
],
|
|
81
82
|
next: i + 1,
|
|
82
83
|
};
|
|
@@ -86,13 +87,13 @@ const parseBraceAt = (input, i) => {
|
|
|
86
87
|
if (endBrace === -1) {
|
|
87
88
|
return null;
|
|
88
89
|
}
|
|
89
|
-
const { keyval,
|
|
90
|
+
const { keyval, isPress, isRelease } = parseKeyToken(input.slice(i + 1, endBrace));
|
|
90
91
|
const actions = [];
|
|
91
|
-
if (
|
|
92
|
-
actions.push({ keyval,
|
|
92
|
+
if (isPress) {
|
|
93
|
+
actions.push({ keyval, isPress: true });
|
|
93
94
|
}
|
|
94
|
-
if (
|
|
95
|
-
actions.push({ keyval,
|
|
95
|
+
if (isRelease) {
|
|
96
|
+
actions.push({ keyval, isPress: false });
|
|
96
97
|
}
|
|
97
98
|
return { actions, next: endBrace + 1 };
|
|
98
99
|
};
|
|
@@ -115,7 +116,7 @@ const updateModifierState = (state, action) => {
|
|
|
115
116
|
if (!mask) {
|
|
116
117
|
return;
|
|
117
118
|
}
|
|
118
|
-
if (action.
|
|
119
|
+
if (action.isPress) {
|
|
119
120
|
state.modifierState |= mask;
|
|
120
121
|
}
|
|
121
122
|
else {
|
|
@@ -186,11 +187,11 @@ const handleKeyPress = async (widget, keyval, modifiers) => {
|
|
|
186
187
|
};
|
|
187
188
|
const applyKeyAction = async (widget, controllers, state, action) => {
|
|
188
189
|
updateModifierState(state, action);
|
|
189
|
-
const signalName = action.
|
|
190
|
+
const signalName = action.isPress ? "key-pressed" : "key-released";
|
|
190
191
|
for (const controller of controllers) {
|
|
191
192
|
controller.emit(signalName, action.keyval, 0, state.modifierState);
|
|
192
193
|
}
|
|
193
|
-
if (action.
|
|
194
|
+
if (action.isPress) {
|
|
194
195
|
await handleKeyPress(widget, action.keyval, state.modifierState);
|
|
195
196
|
}
|
|
196
197
|
};
|
|
@@ -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 {@link tab}: when `shift` is set, move focus backward instead of forward. */\ntype TabOptions = {\n shift?: boolean;\n};\n\ntype KeyAction = { keyval: number; press: 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\nconst tab = (widget: Gtk.Widget, options?: TabOptions): Promise<void> =>\n wrapEvent(widget, () => {\n const direction = options?.shift ? 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; press: boolean; release: 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, press: isPress, release: isRelease };\n};\n\nconst parseCharAt = (input: string, i: number): ParseStep => {\n const keyval = input.codePointAt(i) ?? 0;\n\n return {\n actions: [\n { keyval, press: true },\n { keyval, press: 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, press, release } = parseKeyToken(input.slice(i + 1, endBrace));\n const actions: KeyAction[] = [];\n\n if (press) {\n actions.push({ keyval, press: true });\n }\n\n if (release) {\n actions.push({ keyval, press: 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.press) {\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.press ? \"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.press) {\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 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"]}
|
|
@@ -10,17 +10,17 @@ const applyPointerInput = (widget, state, input) => {
|
|
|
10
10
|
if (CLICK_INPUTS.has(input)) {
|
|
11
11
|
emitPress(widget, controllers, 1);
|
|
12
12
|
emitRelease(widget, controllers, 1);
|
|
13
|
-
state.
|
|
13
|
+
state.isMouseLeftDown = false;
|
|
14
14
|
return;
|
|
15
15
|
}
|
|
16
|
-
if (PRESS_INPUTS.has(input) && !state.
|
|
16
|
+
if (PRESS_INPUTS.has(input) && !state.isMouseLeftDown) {
|
|
17
17
|
emitPress(widget, controllers, 1);
|
|
18
|
-
state.
|
|
18
|
+
state.isMouseLeftDown = true;
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
|
-
if (RELEASE_INPUTS.has(input) && state.
|
|
21
|
+
if (RELEASE_INPUTS.has(input) && state.isMouseLeftDown) {
|
|
22
22
|
emitRelease(widget, controllers, 1);
|
|
23
|
-
state.
|
|
23
|
+
state.isMouseLeftDown = false;
|
|
24
24
|
}
|
|
25
25
|
};
|
|
26
26
|
const pointer = (state, widget, input) => wrapEvent(widget, () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer.js","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,MAAM,YAAY,GAAsB,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1E,MAAM,cAAc,GAAsB,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;AAC1E,MAAM,YAAY,GAAsB,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1E,MAAM,iBAAiB,GAAG,CAAC,MAAkB,EAAE,KAAqB,EAAE,KAAmB,EAAQ,EAAE;IAC/F,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAErE,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAClC,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"pointer.js","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,MAAM,YAAY,GAAsB,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1E,MAAM,cAAc,GAAsB,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;AAC1E,MAAM,YAAY,GAAsB,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1E,MAAM,iBAAiB,GAAG,CAAC,MAAkB,EAAE,KAAqB,EAAE,KAAmB,EAAQ,EAAE;IAC/F,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAErE,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAClC,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;QAE9B,OAAO;IACX,CAAC;IAED,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QACpD,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAClC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;QAE7B,OAAO;IACX,CAAC;IAED,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QACrD,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;IAClC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,KAAqB,EAAE,MAAkB,EAAE,KAAmB,EAAiB,EAAE,CAC9F,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE;IACnB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEP,OAAO,EAAE,OAAO,EAAqB,CAAC","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport type { UserEventState } from \"./state.js\";\nimport { emitPress, emitRelease } from \"./click.js\";\nimport { getOrCreateControllers } from \"./controller.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/**\n * A pointer action token: a full click (`click`, `[MouseLeft]`), a button press (`down`,\n * `[MouseLeft>]`), or a button release (`up`, `[/MouseLeft]`).\n */\ntype PointerInput = \"click\" | \"down\" | \"up\" | \"[MouseLeft]\" | \"[MouseLeft>]\" | \"[/MouseLeft]\";\n\nconst PRESS_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft>]\", \"down\"]);\nconst RELEASE_INPUTS: Set<PointerInput> = new Set([\"[/MouseLeft]\", \"up\"]);\nconst CLICK_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft]\", \"click\"]);\n\nconst applyPointerInput = (widget: Gtk.Widget, state: UserEventState, input: PointerInput): void => {\n const controllers = getOrCreateControllers(widget, Gtk.GestureClick);\n\n if (CLICK_INPUTS.has(input)) {\n emitPress(widget, controllers, 1);\n emitRelease(widget, controllers, 1);\n state.isMouseLeftDown = false;\n\n return;\n }\n\n if (PRESS_INPUTS.has(input) && !state.isMouseLeftDown) {\n emitPress(widget, controllers, 1);\n state.isMouseLeftDown = true;\n\n return;\n }\n\n if (RELEASE_INPUTS.has(input) && state.isMouseLeftDown) {\n emitRelease(widget, controllers, 1);\n state.isMouseLeftDown = false;\n }\n};\n\nconst pointer = (state: UserEventState, widget: Gtk.Widget, input: PointerInput): Promise<void> =>\n wrapEvent(widget, () => {\n applyPointerInput(widget, state, input);\n });\n\nexport { pointer, type PointerInput };\n"]}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
/**
|
|
3
|
+
* Selects the items at the given positions through a list, grid, or column view's selection model,
|
|
4
|
+
* by setting the active item of a drop-down or combo box, or by selecting list box rows. An empty
|
|
5
|
+
* array clears a view's selection.
|
|
6
|
+
*
|
|
7
|
+
* @throws When a view has no selection model, when a combo box is given more than one position, or
|
|
8
|
+
* when the widget is neither a view nor something with the combo box or list role.
|
|
9
|
+
*/
|
|
2
10
|
declare const selectOptions: (widget: Gtk.Widget, values: number | number[]) => Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Unselects the items at the given positions in a list, grid, or column view, or the rows at those
|
|
13
|
+
* indices in a Gtk.ListBox.
|
|
14
|
+
*
|
|
15
|
+
* @throws When a view has no selection model, or when the widget is neither one of those views nor
|
|
16
|
+
* a Gtk.ListBox.
|
|
17
|
+
*/
|
|
3
18
|
declare const deselectOptions: (widget: Gtk.Widget, values: number | number[]) => Promise<void>;
|
|
4
19
|
export { selectOptions, deselectOptions };
|
|
5
20
|
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAwIpC,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACd,CAAC;AAkBtE,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACZ,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/user-event/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAwIpC;;;;;;;GAOG;AACH,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACd,CAAC;AAkBtE;;;;;;GAMG;AACH,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACZ,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC"}
|