react-x11 1.2.0 → 2.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 +330 -81
- package/package.json +132 -14
- package/src/ClickToComponent.js +9 -2
- package/src/DevToolsIntegration.js +440 -32
- package/src/Reconciler.js +463 -165
- package/src/a11y.js +1299 -0
- package/src/acceleratorhooks.js +86 -0
- package/src/accelerators.js +128 -0
- package/src/activate.js +168 -0
- package/src/anchor.js +360 -0
- package/src/appcontext.js +161 -0
- package/src/appearance.js +748 -0
- package/src/appearancehooks.js +96 -0
- package/src/apphooks.js +73 -0
- package/src/application.js +748 -0
- package/src/atspi.js +1953 -0
- package/src/bus.js +545 -0
- package/src/bushooks.js +136 -0
- package/src/clientmessage.js +140 -0
- package/src/clipboard.js +121 -0
- package/src/components/Button.js +148 -33
- package/src/components/Checkbox.js +66 -32
- package/src/components/Dialog.js +96 -29
- package/src/components/FileDialog.js +491 -0
- package/src/components/Icon.js +329 -0
- package/src/components/Menu.js +797 -133
- package/src/components/PasswordInput.js +434 -0
- package/src/components/ProgressBar.js +91 -12
- package/src/components/Radio.js +78 -35
- package/src/components/Select.js +255 -65
- package/src/components/Slider.js +102 -41
- package/src/components/SplitPane.js +206 -0
- package/src/components/Switch.js +100 -22
- package/src/components/Table.js +529 -0
- package/src/components/Tabs.js +211 -0
- package/src/components/Tooltip.js +528 -54
- package/src/components/anchor.js +154 -107
- package/src/components/change.js +34 -0
- package/src/components/dnd.js +103 -0
- package/src/components/index.js +16 -3
- package/src/components/keys.js +17 -20
- package/src/components/scribble.js +247 -0
- package/src/components/theme.js +350 -42
- package/src/components/typeahead.js +12 -2
- package/src/compose.js +868 -0
- package/src/compositing.js +224 -0
- package/src/dbusmenu.js +384 -0
- package/src/debug.d.ts +63 -0
- package/src/debug.js +642 -0
- package/src/decorations.js +486 -0
- package/src/desktopsettings.js +209 -0
- package/src/desktopsettingshooks.js +62 -0
- package/src/dnd.js +1725 -0
- package/src/editmenu.js +272 -0
- package/src/errors.js +98 -0
- package/src/events.js +1406 -162
- package/src/extensions.js +45 -0
- package/src/filedialog.js +375 -0
- package/src/filedialoghooks.js +132 -0
- package/src/fonthooks.js +64 -0
- package/src/fonts.js +301 -0
- package/src/foreignnodes.js +519 -0
- package/src/frame/child.js +33 -0
- package/src/frame/childmain.js +274 -0
- package/src/frame/env.js +140 -0
- package/src/frame/index.js +444 -0
- package/src/frame/lifecycle.js +67 -0
- package/src/frame/protocol.js +179 -0
- package/src/frames.js +73 -0
- package/src/glbackend.js +114 -0
- package/src/glnodes.js +125 -67
- package/src/globalmenu.js +683 -0
- package/src/host.d.ts +88 -0
- package/src/host.js +42 -0
- package/src/idle.js +490 -0
- package/src/idlehooks.js +100 -0
- package/src/imagesource.js +349 -0
- package/src/index.d.ts +475 -0
- package/src/index.js +83 -9
- package/src/inputtime.js +206 -0
- package/src/jsx-dev-runtime.d.ts +21 -0
- package/src/jsx-dev-runtime.js +2 -0
- package/src/jsx-runtime.d.ts +39 -0
- package/src/jsx-runtime.js +6 -0
- package/src/keyboard.js +256 -0
- package/src/keyboardstate.js +278 -0
- package/src/keyboardstatehooks.js +58 -0
- package/src/keysyms.d.ts +149 -0
- package/src/keysyms.js +270 -0
- package/src/locale.js +170 -0
- package/src/localehooks.js +47 -0
- package/src/menuitem.js +223 -0
- package/src/node.d.ts +597 -0
- package/src/node.js +44 -0
- package/src/nodes.js +9546 -690
- package/src/ntk.d.ts +44 -0
- package/src/ntk.js +25 -0
- package/src/paintcache.js +366 -0
- package/src/palette.js +380 -0
- package/src/pastestate.js +66 -0
- package/src/portal.js +461 -0
- package/src/priority.js +26 -0
- package/src/refresh/index.d.ts +40 -0
- package/src/refresh/index.js +122 -0
- package/src/refresh/loader.d.ts +37 -0
- package/src/refresh/loader.js +401 -0
- package/src/refresh/register.d.ts +5 -0
- package/src/refresh/register.js +13 -0
- package/src/registry.js +232 -0
- package/src/scale.js +626 -0
- package/src/scalehooks.js +27 -0
- package/src/screencolor.js +640 -0
- package/src/screencolorhooks.js +101 -0
- package/src/screens.js +754 -0
- package/src/screenshooks.js +137 -0
- package/src/startup.js +302 -0
- package/src/style.d.ts +126 -0
- package/src/style.js +33 -0
- package/src/styles.js +1482 -6
- package/src/svgnodes.js +306 -0
- package/src/testing/a11y.js +484 -0
- package/src/testing/components.js +414 -0
- package/src/testing/events.js +407 -0
- package/src/testing/harness.js +455 -0
- package/src/testing/index.d.ts +558 -0
- package/src/testing/index.js +85 -0
- package/src/testing/mock-app.js +463 -0
- package/src/testing/pixels.js +152 -0
- package/src/testing/queries.js +224 -0
- package/src/textrange.js +83 -0
- package/src/textselection.js +439 -0
- package/src/trace-registry.js +63 -0
- package/src/transfer.js +93 -0
- package/src/types/appearance.d.ts +84 -0
- package/src/types/application.d.ts +173 -0
- package/src/types/components.d.ts +820 -0
- package/src/types/dbus.d.ts +177 -0
- package/src/types/elements.d.ts +897 -0
- package/src/types/events.d.ts +549 -0
- package/src/types/filedialog.d.ts +260 -0
- package/src/types/fonts.d.ts +124 -0
- package/src/types/frame.d.ts +146 -0
- package/src/types/globalmenu.d.ts +42 -0
- package/src/types/nodes.d.ts +199 -0
- package/src/types/screencolor.d.ts +84 -0
- package/src/types/style.d.ts +434 -0
- package/src/types/system.d.ts +287 -0
- package/src/windowid.js +151 -0
- package/src/windowstate.js +393 -0
- package/src/xsettings.js +336 -0
- package/src/yoga.d.ts +55 -0
- package/src/yoga.js +135 -0
- package/src/components/Canvas3D.js +0 -28
- package/src/geometry3d.js +0 -223
- package/src/pointer3d.js +0 -158
- package/src/raycast3d.js +0 -146
- package/src/richnodes.js +0 -436
- package/src/scene3d.js +0 -683
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// `useEyedropper()` — the screen colour pick as a component sees it.
|
|
2
|
+
//
|
|
3
|
+
// The bare `pickScreenColor()` is complete; what a component wants on top of
|
|
4
|
+
// it is *binding*, not another rung (there is no rung to draw — the screen
|
|
5
|
+
// is the one thing an application cannot draw itself). The hook binds the
|
|
6
|
+
// tree's connection and owner window once, exposes `supported` for the
|
|
7
|
+
// button's existence and `picking` for its pressed state, and hands a
|
|
8
|
+
// second click the pick that is already in flight instead of a second grab.
|
|
9
|
+
|
|
10
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
11
|
+
|
|
12
|
+
import { useApp } from './appcontext.js';
|
|
13
|
+
import { pickScreenColor, screenColorBackend } from './screencolor.js';
|
|
14
|
+
import { useTopLevelWindow } from './windowid.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* An eyedropper for a component.
|
|
18
|
+
*
|
|
19
|
+
* ```jsx
|
|
20
|
+
* const eyedropper = useEyedropper();
|
|
21
|
+
*
|
|
22
|
+
* {eyedropper.supported && (
|
|
23
|
+
* <Button
|
|
24
|
+
* label="Pick from screen"
|
|
25
|
+
* disabled={eyedropper.picking}
|
|
26
|
+
* onPress={async () => {
|
|
27
|
+
* const hex = await eyedropper.pick();
|
|
28
|
+
* if (hex) onChange(hex); // '#rrggbb'; null means cancelled
|
|
29
|
+
* }}
|
|
30
|
+
* />
|
|
31
|
+
* )}
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* `pick()` resolves to `'#rrggbb'`, or `null` when the user cancelled. It
|
|
35
|
+
* never rejects for lack of a backend on an X11 tree — the connection this
|
|
36
|
+
* tree renders through *is* the fallback rung — so `supported` is about the
|
|
37
|
+
* forced-backend and future-platform cases, not a check most apps must make.
|
|
38
|
+
*
|
|
39
|
+
* The portal dialog is parented to the window this component is in, the
|
|
40
|
+
* `useFileDialog()` way: resolved at the moment the pick starts, with
|
|
41
|
+
* `parentWindow` as the override for a tree with several top-level windows.
|
|
42
|
+
*
|
|
43
|
+
* While a pick is in flight, `picking` is true and another `pick()` returns
|
|
44
|
+
* **the same promise** — a double-clicked button must not queue a second
|
|
45
|
+
* grab behind the first.
|
|
46
|
+
*/
|
|
47
|
+
export function useEyedropper(defaults = {}) {
|
|
48
|
+
const app = useApp();
|
|
49
|
+
const owner = useTopLevelWindow();
|
|
50
|
+
const [picking, setPicking] = useState(false);
|
|
51
|
+
const [supported, setSupported] = useState(false);
|
|
52
|
+
const inflight = useRef(null);
|
|
53
|
+
|
|
54
|
+
const backend = defaults.backend;
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
let alive = true;
|
|
57
|
+
screenColorBackend({ app, backend }).then(
|
|
58
|
+
(rung) => {
|
|
59
|
+
if (alive) setSupported(rung !== null);
|
|
60
|
+
},
|
|
61
|
+
() => {
|
|
62
|
+
if (alive) setSupported(false);
|
|
63
|
+
},
|
|
64
|
+
);
|
|
65
|
+
return () => {
|
|
66
|
+
alive = false;
|
|
67
|
+
};
|
|
68
|
+
}, [app, backend]);
|
|
69
|
+
|
|
70
|
+
const pick = useCallback(
|
|
71
|
+
(options = {}) => {
|
|
72
|
+
if (inflight.current) return inflight.current;
|
|
73
|
+
// `app` last: the tree's connection is what this hook exists to bind,
|
|
74
|
+
// not an override surface.
|
|
75
|
+
const opts = { parentWindow: owner, ...defaults, ...options, app };
|
|
76
|
+
setPicking(true);
|
|
77
|
+
const run = pickScreenColor(opts).finally(() => {
|
|
78
|
+
inflight.current = null;
|
|
79
|
+
setPicking(false);
|
|
80
|
+
});
|
|
81
|
+
inflight.current = run;
|
|
82
|
+
return run;
|
|
83
|
+
},
|
|
84
|
+
// `defaults` is deliberately not a dependency — the useFileDialog rule:
|
|
85
|
+
// an app writes it inline, and a new object every render would rebuild
|
|
86
|
+
// the callback every render.
|
|
87
|
+
[app, owner],
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
return useMemo(
|
|
91
|
+
() => ({
|
|
92
|
+
/** @returns {Promise<string | null>} `'#rrggbb'`, or null if cancelled */
|
|
93
|
+
pick,
|
|
94
|
+
/** `screenColorBackend()` resolved — false until it answers. */
|
|
95
|
+
supported,
|
|
96
|
+
/** A pick is in flight — the button's pressed/disabled state. */
|
|
97
|
+
picking,
|
|
98
|
+
}),
|
|
99
|
+
[pick, supported, picking],
|
|
100
|
+
);
|
|
101
|
+
}
|