@react-x11/components 0.1.0 → 0.2.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 +979 -21
- package/dist/ansi/cast.d.ts +48 -0
- package/dist/ansi/cast.d.ts.map +1 -0
- package/dist/ansi/cast.js +135 -0
- package/dist/ansi/cast.js.map +1 -0
- package/dist/ansi/index.d.ts +10 -0
- package/dist/ansi/index.d.ts.map +1 -0
- package/dist/ansi/index.js +27 -0
- package/dist/ansi/index.js.map +1 -0
- package/dist/ansi/palette.d.ts +79 -0
- package/dist/ansi/palette.d.ts.map +1 -0
- package/dist/ansi/palette.js +155 -0
- package/dist/ansi/palette.js.map +1 -0
- package/dist/ansi/parse.d.ts +114 -0
- package/dist/ansi/parse.d.ts.map +1 -0
- package/dist/ansi/parse.js +687 -0
- package/dist/ansi/parse.js.map +1 -0
- package/dist/ansi/sgr.d.ts +87 -0
- package/dist/ansi/sgr.d.ts.map +1 -0
- package/dist/ansi/sgr.js +302 -0
- package/dist/ansi/sgr.js.map +1 -0
- package/dist/ansi/utf8.d.ts +15 -0
- package/dist/ansi/utf8.d.ts.map +1 -0
- package/dist/ansi/utf8.js +82 -0
- package/dist/ansi/utf8.js.map +1 -0
- package/dist/calendar/Calendar.d.ts +136 -0
- package/dist/calendar/Calendar.d.ts.map +1 -0
- package/dist/calendar/Calendar.js +460 -0
- package/dist/calendar/Calendar.js.map +1 -0
- package/dist/calendar/DatePicker.d.ts +52 -0
- package/dist/calendar/DatePicker.d.ts.map +1 -0
- package/dist/calendar/DatePicker.js +257 -0
- package/dist/calendar/DatePicker.js.map +1 -0
- package/dist/calendar/dates.d.ts +90 -0
- package/dist/calendar/dates.d.ts.map +1 -0
- package/dist/calendar/dates.js +236 -0
- package/dist/calendar/dates.js.map +1 -0
- package/dist/calendar/index.d.ts +8 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/index.js +15 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/charts/components.d.ts +141 -0
- package/dist/charts/components.d.ts.map +1 -0
- package/dist/charts/components.js +580 -0
- package/dist/charts/components.js.map +1 -0
- package/dist/charts/data.d.ts +198 -0
- package/dist/charts/data.d.ts.map +1 -0
- package/dist/charts/data.js +616 -0
- package/dist/charts/data.js.map +1 -0
- package/dist/charts/hx.d.ts +21 -0
- package/dist/charts/hx.d.ts.map +1 -0
- package/dist/charts/hx.js +15 -0
- package/dist/charts/hx.js.map +1 -0
- package/dist/charts/index.d.ts +27 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +38 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/node.d.ts +96 -0
- package/dist/charts/node.d.ts.map +1 -0
- package/dist/charts/node.js +720 -0
- package/dist/charts/node.js.map +1 -0
- package/dist/charts/render.d.ts +153 -0
- package/dist/charts/render.d.ts.map +1 -0
- package/dist/charts/render.js +762 -0
- package/dist/charts/render.js.map +1 -0
- package/dist/charts/scale.d.ts +42 -0
- package/dist/charts/scale.d.ts.map +1 -0
- package/dist/charts/scale.js +173 -0
- package/dist/charts/scale.js.map +1 -0
- package/dist/charts/spec.d.ts +91 -0
- package/dist/charts/spec.d.ts.map +1 -0
- package/dist/charts/spec.js +33 -0
- package/dist/charts/spec.js.map +1 -0
- package/dist/charts/timers.d.ts +6 -0
- package/dist/charts/timers.d.ts.map +1 -0
- package/dist/charts/timers.js +14 -0
- package/dist/charts/timers.js.map +1 -0
- package/dist/code/hx.d.ts +24 -0
- package/dist/code/hx.d.ts.map +1 -0
- package/dist/code/hx.js +25 -0
- package/dist/code/hx.js.map +1 -0
- package/dist/code/index.d.ts +45 -0
- package/dist/code/index.d.ts.map +1 -0
- package/dist/code/index.js +93 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code-editor/completion.d.ts +26 -0
- package/dist/code-editor/completion.d.ts.map +1 -0
- package/dist/code-editor/completion.js +129 -0
- package/dist/code-editor/completion.js.map +1 -0
- package/dist/code-editor/doc.d.ts +35 -0
- package/dist/code-editor/doc.d.ts.map +1 -0
- package/dist/code-editor/doc.js +162 -0
- package/dist/code-editor/doc.js.map +1 -0
- package/dist/code-editor/hx.d.ts +13 -0
- package/dist/code-editor/hx.d.ts.map +1 -0
- package/dist/code-editor/hx.js +10 -0
- package/dist/code-editor/hx.js.map +1 -0
- package/dist/code-editor/index.d.ts +88 -0
- package/dist/code-editor/index.d.ts.map +1 -0
- package/dist/code-editor/index.js +401 -0
- package/dist/code-editor/index.js.map +1 -0
- package/dist/code-editor/node.d.ts +343 -0
- package/dist/code-editor/node.d.ts.map +1 -0
- package/dist/code-editor/node.js +1521 -0
- package/dist/code-editor/node.js.map +1 -0
- package/dist/code-language/hljs.d.ts +47 -0
- package/dist/code-language/hljs.d.ts.map +1 -0
- package/dist/code-language/hljs.js +211 -0
- package/dist/code-language/hljs.js.map +1 -0
- package/dist/code-language/index.d.ts +22 -0
- package/dist/code-language/index.d.ts.map +1 -0
- package/dist/code-language/index.js +20 -0
- package/dist/code-language/index.js.map +1 -0
- package/dist/code-language/languages/glsl.d.ts +4 -0
- package/dist/code-language/languages/glsl.d.ts.map +1 -0
- package/dist/code-language/languages/glsl.js +99 -0
- package/dist/code-language/languages/glsl.js.map +1 -0
- package/dist/code-language/languages/javascript.d.ts +10 -0
- package/dist/code-language/languages/javascript.d.ts.map +1 -0
- package/dist/code-language/languages/javascript.js +360 -0
- package/dist/code-language/languages/javascript.js.map +1 -0
- package/dist/code-language/languages/json.d.ts +4 -0
- package/dist/code-language/languages/json.d.ts.map +1 -0
- package/dist/code-language/languages/json.js +68 -0
- package/dist/code-language/languages/json.js.map +1 -0
- package/dist/code-language/languages/shell.d.ts +4 -0
- package/dist/code-language/languages/shell.d.ts.map +1 -0
- package/dist/code-language/languages/shell.js +189 -0
- package/dist/code-language/languages/shell.js.map +1 -0
- package/dist/code-language/languages/sql.d.ts +11 -0
- package/dist/code-language/languages/sql.d.ts.map +1 -0
- package/dist/code-language/languages/sql.js +133 -0
- package/dist/code-language/languages/sql.js.map +1 -0
- package/dist/code-language/lezer.d.ts +24 -0
- package/dist/code-language/lezer.d.ts.map +1 -0
- package/dist/code-language/lezer.js +148 -0
- package/dist/code-language/lezer.js.map +1 -0
- package/dist/code-language/registry.d.ts +19 -0
- package/dist/code-language/registry.d.ts.map +1 -0
- package/dist/code-language/registry.js +56 -0
- package/dist/code-language/registry.js.map +1 -0
- package/dist/code-language/runs.d.ts +35 -0
- package/dist/code-language/runs.d.ts.map +1 -0
- package/dist/code-language/runs.js +88 -0
- package/dist/code-language/runs.js.map +1 -0
- package/dist/code-language/stream.d.ts +70 -0
- package/dist/code-language/stream.d.ts.map +1 -0
- package/dist/code-language/stream.js +243 -0
- package/dist/code-language/stream.js.map +1 -0
- package/dist/code-language/textmate.d.ts +27 -0
- package/dist/code-language/textmate.d.ts.map +1 -0
- package/dist/code-language/textmate.js +86 -0
- package/dist/code-language/textmate.js.map +1 -0
- package/dist/code-language/theme.d.ts +26 -0
- package/dist/code-language/theme.d.ts.map +1 -0
- package/dist/code-language/theme.js +108 -0
- package/dist/code-language/theme.js.map +1 -0
- package/dist/code-language/timers.d.ts +7 -0
- package/dist/code-language/timers.d.ts.map +1 -0
- package/dist/code-language/timers.js +22 -0
- package/dist/code-language/timers.js.map +1 -0
- package/dist/code-language/types.d.ts +173 -0
- package/dist/code-language/types.d.ts.map +1 -0
- package/dist/code-language/types.js +41 -0
- package/dist/code-language/types.js.map +1 -0
- package/dist/codeblock/index.d.ts +69 -0
- package/dist/codeblock/index.d.ts.map +1 -0
- package/dist/codeblock/index.js +85 -0
- package/dist/codeblock/index.js.map +1 -0
- package/dist/color-picker/ColorField.d.ts +39 -0
- package/dist/color-picker/ColorField.d.ts.map +1 -0
- package/dist/color-picker/ColorField.js +239 -0
- package/dist/color-picker/ColorField.js.map +1 -0
- package/dist/color-picker/ColorPicker.d.ts +109 -0
- package/dist/color-picker/ColorPicker.d.ts.map +1 -0
- package/dist/color-picker/ColorPicker.js +757 -0
- package/dist/color-picker/ColorPicker.js.map +1 -0
- package/dist/color-picker/color.d.ts +105 -0
- package/dist/color-picker/color.d.ts.map +1 -0
- package/dist/color-picker/color.js +313 -0
- package/dist/color-picker/color.js.map +1 -0
- package/dist/color-picker/index.d.ts +8 -0
- package/dist/color-picker/index.d.ts.map +1 -0
- package/dist/color-picker/index.js +19 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/desktop-calendar/eds.d.ts +102 -0
- package/dist/desktop-calendar/eds.d.ts.map +1 -0
- package/dist/desktop-calendar/eds.js +356 -0
- package/dist/desktop-calendar/eds.js.map +1 -0
- package/dist/desktop-calendar/ical.d.ts +63 -0
- package/dist/desktop-calendar/ical.d.ts.map +1 -0
- package/dist/desktop-calendar/ical.js +57 -0
- package/dist/desktop-calendar/ical.js.map +1 -0
- package/dist/desktop-calendar/index.d.ts +72 -0
- package/dist/desktop-calendar/index.d.ts.map +1 -0
- package/dist/desktop-calendar/index.js +213 -0
- package/dist/desktop-calendar/index.js.map +1 -0
- package/dist/embed/client.d.ts +121 -0
- package/dist/embed/client.d.ts.map +1 -0
- package/dist/embed/client.js +203 -0
- package/dist/embed/client.js.map +1 -0
- package/dist/embed/host.d.ts +96 -0
- package/dist/embed/host.d.ts.map +1 -0
- package/dist/embed/host.js +266 -0
- package/dist/embed/host.js.map +1 -0
- package/dist/embed/index.d.ts +5 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +13 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/timers.d.ts +6 -0
- package/dist/embed/timers.d.ts.map +1 -0
- package/dist/embed/timers.js +16 -0
- package/dist/embed/timers.js.map +1 -0
- package/dist/flow/draw.d.ts +45 -0
- package/dist/flow/draw.d.ts.map +1 -0
- package/dist/flow/draw.js +295 -0
- package/dist/flow/draw.js.map +1 -0
- package/dist/flow/index.d.ts +64 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +306 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/flow/model.d.ts +158 -0
- package/dist/flow/model.d.ts.map +1 -0
- package/dist/flow/model.js +566 -0
- package/dist/flow/model.js.map +1 -0
- package/dist/flow/node.d.ts +429 -0
- package/dist/flow/node.d.ts.map +1 -0
- package/dist/flow/node.js +3025 -0
- package/dist/flow/node.js.map +1 -0
- package/dist/flow/paths.d.ts +43 -0
- package/dist/flow/paths.d.ts.map +1 -0
- package/dist/flow/paths.js +327 -0
- package/dist/flow/paths.js.map +1 -0
- package/dist/flow/types.d.ts +561 -0
- package/dist/flow/types.d.ts.map +1 -0
- package/dist/flow/types.js +2 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/formula/hx.d.ts +24 -0
- package/dist/formula/hx.d.ts.map +1 -0
- package/dist/formula/hx.js +25 -0
- package/dist/formula/hx.js.map +1 -0
- package/dist/formula/index.d.ts +74 -0
- package/dist/formula/index.d.ts.map +1 -0
- package/dist/formula/index.js +155 -0
- package/dist/formula/index.js.map +1 -0
- package/dist/formula/katex.d.ts +78 -0
- package/dist/formula/katex.d.ts.map +1 -0
- package/dist/formula/katex.js +130 -0
- package/dist/formula/katex.js.map +1 -0
- package/dist/formula/layout.d.ts +103 -0
- package/dist/formula/layout.d.ts.map +1 -0
- package/dist/formula/layout.js +716 -0
- package/dist/formula/layout.js.map +1 -0
- package/dist/formula/node.d.ts +50 -0
- package/dist/formula/node.d.ts.map +1 -0
- package/dist/formula/node.js +351 -0
- package/dist/formula/node.js.map +1 -0
- package/dist/html/controls.d.ts +48 -0
- package/dist/html/controls.d.ts.map +1 -0
- package/dist/html/controls.js +195 -0
- package/dist/html/controls.js.map +1 -0
- package/dist/html/css/cascade.d.ts +51 -0
- package/dist/html/css/cascade.d.ts.map +1 -0
- package/dist/html/css/cascade.js +552 -0
- package/dist/html/css/cascade.js.map +1 -0
- package/dist/html/css/parse.d.ts +74 -0
- package/dist/html/css/parse.d.ts.map +1 -0
- package/dist/html/css/parse.js +464 -0
- package/dist/html/css/parse.js.map +1 -0
- package/dist/html/css/style.d.ts +142 -0
- package/dist/html/css/style.d.ts.map +1 -0
- package/dist/html/css/style.js +1145 -0
- package/dist/html/css/style.js.map +1 -0
- package/dist/html/css/ua.d.ts +5 -0
- package/dist/html/css/ua.d.ts.map +1 -0
- package/dist/html/css/ua.js +171 -0
- package/dist/html/css/ua.js.map +1 -0
- package/dist/html/css/values.d.ts +78 -0
- package/dist/html/css/values.d.ts.map +1 -0
- package/dist/html/css/values.js +330 -0
- package/dist/html/css/values.js.map +1 -0
- package/dist/html/dom.d.ts +112 -0
- package/dist/html/dom.d.ts.map +1 -0
- package/dist/html/dom.js +374 -0
- package/dist/html/dom.js.map +1 -0
- package/dist/html/hx.d.ts +24 -0
- package/dist/html/hx.d.ts.map +1 -0
- package/dist/html/hx.js +29 -0
- package/dist/html/hx.js.map +1 -0
- package/dist/html/index.d.ts +137 -0
- package/dist/html/index.d.ts.map +1 -0
- package/dist/html/index.js +339 -0
- package/dist/html/index.js.map +1 -0
- package/dist/html/layout/block.d.ts +58 -0
- package/dist/html/layout/block.d.ts.map +1 -0
- package/dist/html/layout/block.js +724 -0
- package/dist/html/layout/block.js.map +1 -0
- package/dist/html/layout/boxes.d.ts +261 -0
- package/dist/html/layout/boxes.d.ts.map +1 -0
- package/dist/html/layout/boxes.js +725 -0
- package/dist/html/layout/boxes.js.map +1 -0
- package/dist/html/layout/flex.d.ts +16 -0
- package/dist/html/layout/flex.d.ts.map +1 -0
- package/dist/html/layout/flex.js +242 -0
- package/dist/html/layout/flex.js.map +1 -0
- package/dist/html/layout/floats.d.ts +50 -0
- package/dist/html/layout/floats.d.ts.map +1 -0
- package/dist/html/layout/floats.js +110 -0
- package/dist/html/layout/floats.js.map +1 -0
- package/dist/html/layout/inline.d.ts +44 -0
- package/dist/html/layout/inline.d.ts.map +1 -0
- package/dist/html/layout/inline.js +700 -0
- package/dist/html/layout/inline.js.map +1 -0
- package/dist/html/layout/table.d.ts +5 -0
- package/dist/html/layout/table.d.ts.map +1 -0
- package/dist/html/layout/table.js +340 -0
- package/dist/html/layout/table.js.map +1 -0
- package/dist/html/node.d.ts +149 -0
- package/dist/html/node.d.ts.map +1 -0
- package/dist/html/node.js +861 -0
- package/dist/html/node.js.map +1 -0
- package/dist/html/paint.d.ts +48 -0
- package/dist/html/paint.d.ts.map +1 -0
- package/dist/html/paint.js +495 -0
- package/dist/html/paint.js.map +1 -0
- package/dist/html/resources.d.ts +48 -0
- package/dist/html/resources.d.ts.map +1 -0
- package/dist/html/resources.js +156 -0
- package/dist/html/resources.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/heights.d.ts +81 -0
- package/dist/internal/heights.d.ts.map +1 -0
- package/dist/internal/heights.js +193 -0
- package/dist/internal/heights.js.map +1 -0
- package/dist/internal/hx.d.ts +24 -0
- package/dist/internal/hx.d.ts.map +1 -0
- package/dist/internal/hx.js +27 -0
- package/dist/internal/hx.js.map +1 -0
- package/dist/internal/text.d.ts +6 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +44 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/timers.d.ts +8 -0
- package/dist/internal/timers.d.ts.map +1 -0
- package/dist/internal/timers.js +22 -0
- package/dist/internal/timers.js.map +1 -0
- package/dist/internal/widget.d.ts +40 -0
- package/dist/internal/widget.d.ts.map +1 -0
- package/dist/internal/widget.js +44 -0
- package/dist/internal/widget.js.map +1 -0
- package/dist/markdown/ast.d.ts +126 -0
- package/dist/markdown/ast.d.ts.map +1 -0
- package/dist/markdown/ast.js +8 -0
- package/dist/markdown/ast.js.map +1 -0
- package/dist/markdown/hx.d.ts +24 -0
- package/dist/markdown/hx.d.ts.map +1 -0
- package/dist/markdown/hx.js +25 -0
- package/dist/markdown/hx.js.map +1 -0
- package/dist/markdown/index.d.ts +90 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +413 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/parse.d.ts +8 -0
- package/dist/markdown/parse.d.ts.map +1 -0
- package/dist/markdown/parse.js +911 -0
- package/dist/markdown/parse.js.map +1 -0
- package/dist/markdown/spans.d.ts +20 -0
- package/dist/markdown/spans.d.ts.map +1 -0
- package/dist/markdown/spans.js +96 -0
- package/dist/markdown/spans.js.map +1 -0
- package/dist/media-player/backends.d.ts +64 -0
- package/dist/media-player/backends.d.ts.map +1 -0
- package/dist/media-player/backends.js +110 -0
- package/dist/media-player/backends.js.map +1 -0
- package/dist/media-player/control.d.ts +40 -0
- package/dist/media-player/control.d.ts.map +1 -0
- package/dist/media-player/control.js +44 -0
- package/dist/media-player/control.js.map +1 -0
- package/dist/media-player/hx.d.ts +24 -0
- package/dist/media-player/hx.d.ts.map +1 -0
- package/dist/media-player/hx.js +25 -0
- package/dist/media-player/hx.js.map +1 -0
- package/dist/media-player/index.d.ts +107 -0
- package/dist/media-player/index.d.ts.map +1 -0
- package/dist/media-player/index.js +219 -0
- package/dist/media-player/index.js.map +1 -0
- package/dist/media-player/mpv.d.ts +4 -0
- package/dist/media-player/mpv.d.ts.map +1 -0
- package/dist/media-player/mpv.js +120 -0
- package/dist/media-player/mpv.js.map +1 -0
- package/dist/media-player/vlc.d.ts +8 -0
- package/dist/media-player/vlc.d.ts.map +1 -0
- package/dist/media-player/vlc.js +83 -0
- package/dist/media-player/vlc.js.map +1 -0
- package/dist/richtext/index.d.ts +19 -0
- package/dist/richtext/index.d.ts.map +1 -0
- package/dist/richtext/index.js +4 -0
- package/dist/richtext/index.js.map +1 -0
- package/dist/richtext/links.d.ts +12 -0
- package/dist/richtext/links.d.ts.map +1 -0
- package/dist/richtext/links.js +64 -0
- package/dist/richtext/links.js.map +1 -0
- package/dist/richtext/menu.d.ts +11 -0
- package/dist/richtext/menu.d.ts.map +1 -0
- package/dist/richtext/menu.js +43 -0
- package/dist/richtext/menu.js.map +1 -0
- package/dist/richtext/node.d.ts +151 -0
- package/dist/richtext/node.d.ts.map +1 -0
- package/dist/richtext/node.js +255 -0
- package/dist/richtext/node.js.map +1 -0
- package/dist/richtext/runs.d.ts +92 -0
- package/dist/richtext/runs.d.ts.map +1 -0
- package/dist/richtext/runs.js +158 -0
- package/dist/richtext/runs.js.map +1 -0
- package/dist/table/hx.d.ts +24 -0
- package/dist/table/hx.d.ts.map +1 -0
- package/dist/table/hx.js +25 -0
- package/dist/table/hx.js.map +1 -0
- package/dist/table/index.d.ts +169 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/table/index.js +844 -0
- package/dist/table/index.js.map +1 -0
- package/dist/table/rows.d.ts +136 -0
- package/dist/table/rows.d.ts.map +1 -0
- package/dist/table/rows.js +146 -0
- package/dist/table/rows.js.map +1 -0
- package/dist/terminal/backends.d.ts +105 -0
- package/dist/terminal/backends.d.ts.map +1 -0
- package/dist/terminal/backends.js +185 -0
- package/dist/terminal/backends.js.map +1 -0
- package/dist/terminal/hx.d.ts +24 -0
- package/dist/terminal/hx.d.ts.map +1 -0
- package/dist/terminal/hx.js +25 -0
- package/dist/terminal/hx.js.map +1 -0
- package/dist/terminal/index.d.ts +160 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +344 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/title.d.ts +24 -0
- package/dist/terminal/title.d.ts.map +1 -0
- package/dist/terminal/title.js +129 -0
- package/dist/terminal/title.js.map +1 -0
- package/dist/terminal/vt/colors.d.ts +63 -0
- package/dist/terminal/vt/colors.d.ts.map +1 -0
- package/dist/terminal/vt/colors.js +203 -0
- package/dist/terminal/vt/colors.js.map +1 -0
- package/dist/terminal/vt/diff.d.ts +117 -0
- package/dist/terminal/vt/diff.d.ts.map +1 -0
- package/dist/terminal/vt/diff.js +358 -0
- package/dist/terminal/vt/diff.js.map +1 -0
- package/dist/terminal/vt/fonts.d.ts +92 -0
- package/dist/terminal/vt/fonts.d.ts.map +1 -0
- package/dist/terminal/vt/fonts.js +178 -0
- package/dist/terminal/vt/fonts.js.map +1 -0
- package/dist/terminal/vt/index.d.ts +78 -0
- package/dist/terminal/vt/index.d.ts.map +1 -0
- package/dist/terminal/vt/index.js +312 -0
- package/dist/terminal/vt/index.js.map +1 -0
- package/dist/terminal/vt/keys.d.ts +74 -0
- package/dist/terminal/vt/keys.d.ts.map +1 -0
- package/dist/terminal/vt/keys.js +309 -0
- package/dist/terminal/vt/keys.js.map +1 -0
- package/dist/terminal/vt/mouse.d.ts +44 -0
- package/dist/terminal/vt/mouse.d.ts.map +1 -0
- package/dist/terminal/vt/mouse.js +106 -0
- package/dist/terminal/vt/mouse.js.map +1 -0
- package/dist/terminal/vt/node.d.ts +246 -0
- package/dist/terminal/vt/node.d.ts.map +1 -0
- package/dist/terminal/vt/node.js +1068 -0
- package/dist/terminal/vt/node.js.map +1 -0
- package/dist/terminal/vt/pty.d.ts +81 -0
- package/dist/terminal/vt/pty.d.ts.map +1 -0
- package/dist/terminal/vt/pty.js +201 -0
- package/dist/terminal/vt/pty.js.map +1 -0
- package/dist/terminal/vt/renderer.d.ts +179 -0
- package/dist/terminal/vt/renderer.d.ts.map +1 -0
- package/dist/terminal/vt/renderer.js +357 -0
- package/dist/terminal/vt/renderer.js.map +1 -0
- package/dist/terminal/vt/timers.d.ts +6 -0
- package/dist/terminal/vt/timers.d.ts.map +1 -0
- package/dist/terminal/vt/timers.js +16 -0
- package/dist/terminal/vt/timers.js.map +1 -0
- package/dist/terminal/vt/xterm.d.ts +142 -0
- package/dist/terminal/vt/xterm.d.ts.map +1 -0
- package/dist/terminal/vt/xterm.js +32 -0
- package/dist/terminal/vt/xterm.js.map +1 -0
- package/dist/terminal-output/hx.d.ts +24 -0
- package/dist/terminal-output/hx.d.ts.map +1 -0
- package/dist/terminal-output/hx.js +25 -0
- package/dist/terminal-output/hx.js.map +1 -0
- package/dist/terminal-output/index.d.ts +92 -0
- package/dist/terminal-output/index.d.ts.map +1 -0
- package/dist/terminal-output/index.js +179 -0
- package/dist/terminal-output/index.js.map +1 -0
- package/dist/terminal-output/runs.d.ts +27 -0
- package/dist/terminal-output/runs.d.ts.map +1 -0
- package/dist/terminal-output/runs.js +66 -0
- package/dist/terminal-output/runs.js.map +1 -0
- package/dist/three/canvas.d.ts +46 -0
- package/dist/three/canvas.d.ts.map +1 -0
- package/dist/three/canvas.js +305 -0
- package/dist/three/canvas.js.map +1 -0
- package/dist/three/events.d.ts +64 -0
- package/dist/three/events.d.ts.map +1 -0
- package/dist/three/events.js +146 -0
- package/dist/three/events.js.map +1 -0
- package/dist/three/geometries.d.ts +89 -0
- package/dist/three/geometries.d.ts.map +1 -0
- package/dist/three/geometries.js +345 -0
- package/dist/three/geometries.js.map +1 -0
- package/dist/three/globals.d.ts +7 -0
- package/dist/three/globals.d.ts.map +1 -0
- package/dist/three/globals.js +20 -0
- package/dist/three/globals.js.map +1 -0
- package/dist/three/hx.d.ts +9 -0
- package/dist/three/hx.d.ts.map +1 -0
- package/dist/three/hx.js +10 -0
- package/dist/three/hx.js.map +1 -0
- package/dist/three/index.d.ts +22 -0
- package/dist/three/index.d.ts.map +1 -0
- package/dist/three/index.js +24 -0
- package/dist/three/index.js.map +1 -0
- package/dist/three/jsx-dev-runtime.d.ts +19 -0
- package/dist/three/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/three/jsx-dev-runtime.js +2 -0
- package/dist/three/jsx-dev-runtime.js.map +1 -0
- package/dist/three/jsx-runtime.d.ts +19 -0
- package/dist/three/jsx-runtime.d.ts.map +1 -0
- package/dist/three/jsx-runtime.js +2 -0
- package/dist/three/jsx-runtime.js.map +1 -0
- package/dist/three/jsx.d.ts +198 -0
- package/dist/three/jsx.d.ts.map +1 -0
- package/dist/three/jsx.js +2 -0
- package/dist/three/jsx.js.map +1 -0
- package/dist/three/materials.d.ts +125 -0
- package/dist/three/materials.d.ts.map +1 -0
- package/dist/three/materials.js +229 -0
- package/dist/three/materials.js.map +1 -0
- package/dist/three/math.d.ts +146 -0
- package/dist/three/math.d.ts.map +1 -0
- package/dist/three/math.js +464 -0
- package/dist/three/math.js.map +1 -0
- package/dist/three/objects.d.ts +185 -0
- package/dist/three/objects.d.ts.map +1 -0
- package/dist/three/objects.js +309 -0
- package/dist/three/objects.js.map +1 -0
- package/dist/three/passes.d.ts +54 -0
- package/dist/three/passes.d.ts.map +1 -0
- package/dist/three/passes.js +78 -0
- package/dist/three/passes.js.map +1 -0
- package/dist/three/postprocess.d.ts +85 -0
- package/dist/three/postprocess.d.ts.map +1 -0
- package/dist/three/postprocess.js +503 -0
- package/dist/three/postprocess.js.map +1 -0
- package/dist/three/raycast.d.ts +24 -0
- package/dist/three/raycast.d.ts.map +1 -0
- package/dist/three/raycast.js +138 -0
- package/dist/three/raycast.js.map +1 -0
- package/dist/three/reconciler.d.ts +48 -0
- package/dist/three/reconciler.d.ts.map +1 -0
- package/dist/three/reconciler.js +416 -0
- package/dist/three/reconciler.js.map +1 -0
- package/dist/three/renderer-direct.d.ts +102 -0
- package/dist/three/renderer-direct.d.ts.map +1 -0
- package/dist/three/renderer-direct.js +782 -0
- package/dist/three/renderer-direct.js.map +1 -0
- package/dist/three/renderer-indirect.d.ts +68 -0
- package/dist/three/renderer-indirect.d.ts.map +1 -0
- package/dist/three/renderer-indirect.js +438 -0
- package/dist/three/renderer-indirect.js.map +1 -0
- package/dist/three/store.d.ts +81 -0
- package/dist/three/store.d.ts.map +1 -0
- package/dist/three/store.js +110 -0
- package/dist/three/store.js.map +1 -0
- package/dist/timeline/hx.d.ts +18 -0
- package/dist/timeline/hx.d.ts.map +1 -0
- package/dist/timeline/hx.js +10 -0
- package/dist/timeline/hx.js.map +1 -0
- package/dist/timeline/index.d.ts +152 -0
- package/dist/timeline/index.d.ts.map +1 -0
- package/dist/timeline/index.js +383 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/tray-host/hx.d.ts +24 -0
- package/dist/tray-host/hx.d.ts.map +1 -0
- package/dist/tray-host/hx.js +25 -0
- package/dist/tray-host/hx.js.map +1 -0
- package/dist/tray-host/index.d.ts +110 -0
- package/dist/tray-host/index.d.ts.map +1 -0
- package/dist/tray-host/index.js +191 -0
- package/dist/tray-host/index.js.map +1 -0
- package/dist/tray-host/manager.d.ts +137 -0
- package/dist/tray-host/manager.d.ts.map +1 -0
- package/dist/tray-host/manager.js +462 -0
- package/dist/tray-host/manager.js.map +1 -0
- package/dist/tray-host/notify.d.ts +22 -0
- package/dist/tray-host/notify.d.ts.map +1 -0
- package/dist/tray-host/notify.js +74 -0
- package/dist/tray-host/notify.js.map +1 -0
- package/dist/tray-host/protocol.d.ts +106 -0
- package/dist/tray-host/protocol.d.ts.map +1 -0
- package/dist/tray-host/protocol.js +191 -0
- package/dist/tray-host/protocol.js.map +1 -0
- package/dist/tree/hx.d.ts +24 -0
- package/dist/tree/hx.d.ts.map +1 -0
- package/dist/tree/hx.js +25 -0
- package/dist/tree/hx.js.map +1 -0
- package/dist/tree/index.d.ts +221 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/index.js +716 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree/internal.d.ts +18 -0
- package/dist/tree/internal.d.ts.map +1 -0
- package/dist/tree/internal.js +66 -0
- package/dist/tree/internal.js.map +1 -0
- package/dist/tree/rows.d.ts +177 -0
- package/dist/tree/rows.d.ts.map +1 -0
- package/dist/tree/rows.js +179 -0
- package/dist/tree/rows.js.map +1 -0
- package/package.json +166 -12
- package/src/ansi/cast.ts +159 -0
- package/src/ansi/index.ts +53 -0
- package/src/ansi/palette.ts +226 -0
- package/src/ansi/parse.ts +780 -0
- package/src/ansi/sgr.ts +380 -0
- package/src/ansi/utf8.ts +84 -0
- package/src/calendar/Calendar.ts +744 -0
- package/src/calendar/DatePicker.ts +368 -0
- package/src/calendar/dates.ts +307 -0
- package/src/calendar/index.ts +51 -0
- package/src/charts/components.ts +864 -0
- package/src/charts/data.ts +776 -0
- package/src/charts/hx.ts +39 -0
- package/src/charts/index.ts +99 -0
- package/src/charts/node.ts +932 -0
- package/src/charts/render.ts +982 -0
- package/src/charts/scale.ts +214 -0
- package/src/charts/spec.ts +122 -0
- package/src/charts/timers.ts +24 -0
- package/src/code/hx.ts +51 -0
- package/src/code/index.ts +174 -0
- package/src/code-editor/completion.ts +161 -0
- package/src/code-editor/doc.ts +198 -0
- package/src/code-editor/hx.ts +26 -0
- package/src/code-editor/index.ts +615 -0
- package/src/code-editor/node.ts +1926 -0
- package/src/code-language/hljs.ts +302 -0
- package/src/code-language/index.ts +51 -0
- package/src/code-language/languages/glsl.ts +120 -0
- package/src/code-language/languages/javascript.ts +419 -0
- package/src/code-language/languages/json.ts +72 -0
- package/src/code-language/languages/shell.ts +221 -0
- package/src/code-language/languages/sql.ts +165 -0
- package/src/code-language/lezer.ts +190 -0
- package/src/code-language/registry.ts +66 -0
- package/src/code-language/runs.ts +128 -0
- package/src/code-language/stream.ts +306 -0
- package/src/code-language/textmate.ts +134 -0
- package/src/code-language/theme.ts +124 -0
- package/src/code-language/timers.ts +36 -0
- package/src/code-language/types.ts +252 -0
- package/src/codeblock/index.ts +146 -0
- package/src/color-picker/ColorField.ts +333 -0
- package/src/color-picker/ColorPicker.ts +1069 -0
- package/src/color-picker/color.ts +399 -0
- package/src/color-picker/index.ts +50 -0
- package/src/desktop-calendar/eds.ts +484 -0
- package/src/desktop-calendar/ical.ts +119 -0
- package/src/desktop-calendar/index.ts +287 -0
- package/src/embed/client.ts +311 -0
- package/src/embed/host.ts +432 -0
- package/src/embed/index.ts +33 -0
- package/src/embed/timers.ts +32 -0
- package/src/flow/draw.ts +418 -0
- package/src/flow/index.ts +473 -0
- package/src/flow/model.ts +687 -0
- package/src/flow/node.ts +3694 -0
- package/src/flow/paths.ts +403 -0
- package/src/flow/types.ts +634 -0
- package/src/formula/hx.ts +51 -0
- package/src/formula/index.ts +243 -0
- package/src/formula/katex.ts +209 -0
- package/src/formula/layout.ts +876 -0
- package/src/formula/node.ts +467 -0
- package/src/html/controls.ts +244 -0
- package/src/html/css/cascade.ts +606 -0
- package/src/html/css/parse.ts +500 -0
- package/src/html/css/style.ts +1371 -0
- package/src/html/css/ua.ts +174 -0
- package/src/html/css/values.ts +358 -0
- package/src/html/dom.ts +410 -0
- package/src/html/hx.ts +55 -0
- package/src/html/index.ts +545 -0
- package/src/html/layout/block.ts +876 -0
- package/src/html/layout/boxes.ts +981 -0
- package/src/html/layout/flex.ts +297 -0
- package/src/html/layout/floats.ts +125 -0
- package/src/html/layout/inline.ts +870 -0
- package/src/html/layout/table.ts +380 -0
- package/src/html/node.ts +967 -0
- package/src/html/paint.ts +605 -0
- package/src/html/resources.ts +214 -0
- package/src/index.ts +638 -0
- package/src/internal/heights.ts +211 -0
- package/src/internal/hx.ts +53 -0
- package/src/internal/text.ts +44 -0
- package/src/internal/timers.ts +44 -0
- package/src/internal/widget.ts +92 -0
- package/src/markdown/ast.ts +163 -0
- package/src/markdown/hx.ts +51 -0
- package/src/markdown/index.ts +686 -0
- package/src/markdown/parse.ts +1037 -0
- package/src/markdown/spans.ts +143 -0
- package/src/media-player/backends.ts +155 -0
- package/src/media-player/control.ts +70 -0
- package/src/media-player/hx.ts +51 -0
- package/src/media-player/index.ts +378 -0
- package/src/media-player/mpv.ts +146 -0
- package/src/media-player/vlc.ts +97 -0
- package/src/richtext/index.ts +42 -0
- package/src/richtext/links.ts +78 -0
- package/src/richtext/menu.ts +49 -0
- package/src/richtext/node.ts +406 -0
- package/src/richtext/runs.ts +253 -0
- package/src/table/hx.ts +51 -0
- package/src/table/index.ts +1219 -0
- package/src/table/rows.ts +275 -0
- package/src/terminal/backends.ts +242 -0
- package/src/terminal/hx.ts +51 -0
- package/src/terminal/index.ts +574 -0
- package/src/terminal/title.ts +172 -0
- package/src/terminal/vt/colors.ts +247 -0
- package/src/terminal/vt/diff.ts +467 -0
- package/src/terminal/vt/fonts.ts +233 -0
- package/src/terminal/vt/index.ts +443 -0
- package/src/terminal/vt/keys.ts +369 -0
- package/src/terminal/vt/mouse.ts +144 -0
- package/src/terminal/vt/node.ts +1242 -0
- package/src/terminal/vt/pty.ts +334 -0
- package/src/terminal/vt/renderer.ts +555 -0
- package/src/terminal/vt/timers.ts +31 -0
- package/src/terminal/vt/xterm.ts +193 -0
- package/src/terminal-output/hx.ts +51 -0
- package/src/terminal-output/index.ts +340 -0
- package/src/terminal-output/runs.ts +79 -0
- package/src/three/canvas.ts +451 -0
- package/src/three/events.ts +197 -0
- package/src/three/geometries.ts +429 -0
- package/src/three/globals.ts +34 -0
- package/src/three/hx.ts +22 -0
- package/src/three/index.ts +98 -0
- package/src/three/jsx-dev-runtime.ts +27 -0
- package/src/three/jsx-runtime.ts +38 -0
- package/src/three/jsx.ts +275 -0
- package/src/three/materials.ts +270 -0
- package/src/three/math.ts +585 -0
- package/src/three/objects.ts +397 -0
- package/src/three/passes.ts +90 -0
- package/src/three/postprocess.ts +677 -0
- package/src/three/raycast.ts +189 -0
- package/src/three/react-reconciler.d.ts +50 -0
- package/src/three/reconciler.ts +624 -0
- package/src/three/renderer-direct.ts +1055 -0
- package/src/three/renderer-indirect.ts +570 -0
- package/src/three/store.ts +207 -0
- package/src/timeline/hx.ts +31 -0
- package/src/timeline/index.ts +603 -0
- package/src/tray-host/hx.ts +51 -0
- package/src/tray-host/index.ts +331 -0
- package/src/tray-host/manager.ts +639 -0
- package/src/tray-host/notify.ts +102 -0
- package/src/tray-host/protocol.ts +235 -0
- package/src/tree/hx.ts +51 -0
- package/src/tree/index.ts +1087 -0
- package/src/tree/internal.ts +87 -0
- package/src/tree/rows.ts +334 -0
- package/src/index.d.ts +0 -2
- package/src/index.js +0 -9
- package/src/sparkline/index.d.ts +0 -29
- package/src/sparkline/index.js +0 -50
- package/src/sparkline/node.js +0 -72
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
// The manager selection, and everything that arrives because of it.
|
|
2
|
+
//
|
|
3
|
+
// A tray host is three things on the wire: it owns `_NET_SYSTEM_TRAY_S<n>`,
|
|
4
|
+
// it publishes two properties saying how it wants to be drawn into, and it
|
|
5
|
+
// answers `_NET_SYSTEM_TRAY_OPCODE` messages addressed to the window that
|
|
6
|
+
// owns that selection. None of it is React-shaped, so none of it is in the
|
|
7
|
+
// component — `./index.ts` owns the icon list as state and this owns the
|
|
8
|
+
// protocol that changes it.
|
|
9
|
+
//
|
|
10
|
+
// ### Why this listens on `X.on('event')` rather than `onClientMessage`
|
|
11
|
+
//
|
|
12
|
+
// Core has an element-scoped ClientMessage seam now, and it is the right
|
|
13
|
+
// thing for an application — but it is a **`<window>`** prop, and the window
|
|
14
|
+
// the tray opcodes are addressed to is not an element. It cannot be: the
|
|
15
|
+
// selection has to be held on something that outlives the render, so this
|
|
16
|
+
// creates its own window with `X.CreateWindow` rather than rendering one. A
|
|
17
|
+
// `<TrayHost>` that unmounted while its panel stayed up would otherwise take
|
|
18
|
+
// the selection with it and leave the desktop with no tray.
|
|
19
|
+
//
|
|
20
|
+
// That is exactly the case core's own `src/clientmessage.js` carves out:
|
|
21
|
+
// filtering `X.on('event')` "is the right shape *there*, because a settings
|
|
22
|
+
// daemon's window is nobody's element". A tray's manager window is the same
|
|
23
|
+
// kind of window.
|
|
24
|
+
//
|
|
25
|
+
// The timestamp is the other half, and that one core does answer:
|
|
26
|
+
// `serverTime()` is a current server timestamp for an operation no user
|
|
27
|
+
// action caused, and its own documentation names a tray taking its manager
|
|
28
|
+
// selection as the case. ICCCM 2.1 forbids `CurrentTime` here.
|
|
29
|
+
import { serverTime } from 'react-x11';
|
|
30
|
+
import type { NtkApp } from 'react-x11';
|
|
31
|
+
|
|
32
|
+
import {
|
|
33
|
+
BalloonAssembler,
|
|
34
|
+
MANAGER_ATOM,
|
|
35
|
+
MESSAGE_DATA_ATOM,
|
|
36
|
+
OPCODE_ATOM,
|
|
37
|
+
ORIENTATION_ATOM,
|
|
38
|
+
SYSTEM_TRAY_BEGIN_MESSAGE,
|
|
39
|
+
SYSTEM_TRAY_CANCEL_MESSAGE,
|
|
40
|
+
SYSTEM_TRAY_REQUEST_DOCK,
|
|
41
|
+
VISUAL_ATOM,
|
|
42
|
+
argbVisualOf,
|
|
43
|
+
orientationValue,
|
|
44
|
+
selectionNameFor,
|
|
45
|
+
} from './protocol.js';
|
|
46
|
+
import type { TrayIcon, TrayMessage, TrayOrientation } from './protocol.js';
|
|
47
|
+
|
|
48
|
+
// Core event codes and masks, written out for the same reason
|
|
49
|
+
// `src/xsettings.js` writes them out: they are protocol constants, and
|
|
50
|
+
// naming them here is cheaper than reaching into node-x11 for a number that
|
|
51
|
+
// has not changed since 1987.
|
|
52
|
+
const SELECTION_CLEAR = 29;
|
|
53
|
+
const CLIENT_MESSAGE = 33;
|
|
54
|
+
const STRUCTURE_NOTIFY_MASK = 131072; // x11.eventMask.StructureNotify
|
|
55
|
+
const INPUT_ONLY = 2;
|
|
56
|
+
/** Predefined atoms — no InternAtom round trip for these. */
|
|
57
|
+
const XA_CARDINAL = 6;
|
|
58
|
+
const XA_VISUALID = 32;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Where a tray host is in its life.
|
|
62
|
+
*
|
|
63
|
+
* `'conflict'` and `'unavailable'` are both ordinary states of a healthy
|
|
64
|
+
* machine rather than failures — a second panel on one display is a
|
|
65
|
+
* configuration mistake, and a connection with no raw protocol access (a
|
|
66
|
+
* headless mock) simply has no tray to be. Same call `<Terminal>` makes
|
|
67
|
+
* about a machine with no emulator installed.
|
|
68
|
+
*/
|
|
69
|
+
export type TrayStatus =
|
|
70
|
+
'starting' | 'owned' | 'conflict' | 'released' | 'unavailable';
|
|
71
|
+
|
|
72
|
+
/** Somebody else is the tray. */
|
|
73
|
+
export interface TrayConflict {
|
|
74
|
+
/** The X window that owns `_NET_SYSTEM_TRAY_S<screen>`. */
|
|
75
|
+
owner: number;
|
|
76
|
+
screen: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** What the component wires up. Every one is optional; the manager runs
|
|
80
|
+
* whether or not anybody is listening. */
|
|
81
|
+
export interface TrayManagerHandlers {
|
|
82
|
+
/** The whole list, whenever it changes — what the component renders. */
|
|
83
|
+
onIcons?(icons: readonly TrayIcon[]): void;
|
|
84
|
+
onDock?(icon: TrayIcon): void;
|
|
85
|
+
onUndock?(icon: TrayIcon): void;
|
|
86
|
+
onStatus?(status: TrayStatus, conflict: TrayConflict | null): void;
|
|
87
|
+
onMessage?(message: TrayMessage): void;
|
|
88
|
+
onCancelMessage?(info: { windowId: number; id: number }): void;
|
|
89
|
+
onError?(err: Error): void;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** The slice of the X connection this needs. `useApp()` is declared
|
|
93
|
+
* `unknown` in core — it is the escape hatch, so the shape is written out
|
|
94
|
+
* rather than imported. */
|
|
95
|
+
interface XEvent {
|
|
96
|
+
type: number;
|
|
97
|
+
wid?: number;
|
|
98
|
+
atom?: number;
|
|
99
|
+
time?: number;
|
|
100
|
+
owner?: number;
|
|
101
|
+
selection?: number;
|
|
102
|
+
format?: number;
|
|
103
|
+
message_type?: number;
|
|
104
|
+
data?: number[];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
interface XConnection {
|
|
108
|
+
AllocID(): number;
|
|
109
|
+
InternAtom(
|
|
110
|
+
onlyIfExists: boolean,
|
|
111
|
+
name: string,
|
|
112
|
+
cb: (err: Error | null, atom: number) => void,
|
|
113
|
+
): void;
|
|
114
|
+
CreateWindow(
|
|
115
|
+
id: number,
|
|
116
|
+
parent: number,
|
|
117
|
+
x: number,
|
|
118
|
+
y: number,
|
|
119
|
+
width: number,
|
|
120
|
+
height: number,
|
|
121
|
+
borderWidth: number,
|
|
122
|
+
depth: number,
|
|
123
|
+
klass: number,
|
|
124
|
+
visual: number,
|
|
125
|
+
values: Record<string, unknown>,
|
|
126
|
+
): void;
|
|
127
|
+
DestroyWindow(id: number): void;
|
|
128
|
+
ChangeProperty(
|
|
129
|
+
mode: number,
|
|
130
|
+
wid: number,
|
|
131
|
+
name: number,
|
|
132
|
+
type: number,
|
|
133
|
+
format: number,
|
|
134
|
+
data: readonly number[],
|
|
135
|
+
): void;
|
|
136
|
+
GetSelectionOwner(
|
|
137
|
+
atom: number,
|
|
138
|
+
cb: (err: Error | null, owner: number) => void,
|
|
139
|
+
): void;
|
|
140
|
+
SetSelectionOwner(owner: number, atom: number, time: number): void;
|
|
141
|
+
GetWindowAttributes(
|
|
142
|
+
wid: number,
|
|
143
|
+
cb: (err: Error | null, attrs: { visual: number }) => void,
|
|
144
|
+
): void;
|
|
145
|
+
SendEvent(
|
|
146
|
+
destination: number,
|
|
147
|
+
propagate: number,
|
|
148
|
+
eventMask: number,
|
|
149
|
+
event: Record<string, unknown>,
|
|
150
|
+
): void;
|
|
151
|
+
on(name: 'event', fn: (ev: XEvent) => void): void;
|
|
152
|
+
removeListener?(name: 'event', fn: (ev: XEvent) => void): void;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** What ntk's app exposes that a tray needs. */
|
|
156
|
+
export interface TrayApp {
|
|
157
|
+
X?: XConnection;
|
|
158
|
+
display?: {
|
|
159
|
+
screen?: {
|
|
160
|
+
root: number;
|
|
161
|
+
depths?: Record<number, Record<string, { class?: number }>>;
|
|
162
|
+
}[];
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export interface TrayManagerStartOptions {
|
|
167
|
+
orientation: TrayOrientation;
|
|
168
|
+
/**
|
|
169
|
+
* The top-level window the icons will be embedded into, so the visual it
|
|
170
|
+
* actually has can be advertised — or not. `null` skips the question and
|
|
171
|
+
* publishes no `_NET_SYSTEM_TRAY_VISUAL`.
|
|
172
|
+
*/
|
|
173
|
+
hostWindowId: number | null;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* The tray host's half of the system tray protocol.
|
|
178
|
+
*
|
|
179
|
+
* ```ts
|
|
180
|
+
* const manager = new TrayManager(app, 0);
|
|
181
|
+
* manager.handlers = { onIcons: setIcons };
|
|
182
|
+
* await manager.start({ orientation: 'horizontal', hostWindowId: id });
|
|
183
|
+
* // …
|
|
184
|
+
* manager.stop();
|
|
185
|
+
* ```
|
|
186
|
+
*
|
|
187
|
+
* Public because a panel that draws its own tray — one that does not want
|
|
188
|
+
* `<TrayHost>`'s layout — should not have to reimplement selection
|
|
189
|
+
* ownership, and because it is what the tests drive. Same reason
|
|
190
|
+
* `ProcessHost` is exported from `../embed/`.
|
|
191
|
+
*/
|
|
192
|
+
export class TrayManager {
|
|
193
|
+
#app: TrayApp;
|
|
194
|
+
#screen: number;
|
|
195
|
+
#X: XConnection | null;
|
|
196
|
+
#root: number;
|
|
197
|
+
|
|
198
|
+
#selectionAtom = 0;
|
|
199
|
+
#opcodeAtom = 0;
|
|
200
|
+
#orientationAtom = 0;
|
|
201
|
+
#visualAtom = 0;
|
|
202
|
+
#messageDataAtom = 0;
|
|
203
|
+
#managerAtom = 0;
|
|
204
|
+
|
|
205
|
+
/** The window that owns the selection, and the address the opcodes are
|
|
206
|
+
* sent to. Created here rather than rendered, because a selection held on
|
|
207
|
+
* a node that can unmount is a tray that silently stops being one. */
|
|
208
|
+
#window = 0;
|
|
209
|
+
/** The timestamp the selection was taken with; ICCCM 2.3 wants it back
|
|
210
|
+
* when the selection is given up. */
|
|
211
|
+
#ownedAt = 0;
|
|
212
|
+
|
|
213
|
+
#icons: TrayIcon[] = [];
|
|
214
|
+
#balloons = new BalloonAssembler();
|
|
215
|
+
#status: TrayStatus = 'starting';
|
|
216
|
+
#conflict: TrayConflict | null = null;
|
|
217
|
+
#orientation: TrayOrientation = 'horizontal';
|
|
218
|
+
#visual = 0;
|
|
219
|
+
/**
|
|
220
|
+
* The current run, or `null` between `stop()` and the next `start()`.
|
|
221
|
+
*
|
|
222
|
+
* A token rather than a pair of booleans for the reason `ForeignNode._start`
|
|
223
|
+
* uses one: taking the selection is a chain of round trips, and a run that
|
|
224
|
+
* was stopped part-way through must not have its stale continuation report
|
|
225
|
+
* success or leave a window behind. It is also what makes the manager
|
|
226
|
+
* genuinely restartable — React remounts an effect on the same instance in
|
|
227
|
+
* development, and a one-shot manager would come back dead.
|
|
228
|
+
*/
|
|
229
|
+
#run: object | null = null;
|
|
230
|
+
#listener: ((ev: XEvent) => void) | null = null;
|
|
231
|
+
|
|
232
|
+
/** Assign, do not construct with: the component replaces these every
|
|
233
|
+
* render so an inline handler is not a reason to restart anything. */
|
|
234
|
+
handlers: TrayManagerHandlers = {};
|
|
235
|
+
|
|
236
|
+
constructor(app: TrayApp, screen = 0) {
|
|
237
|
+
this.#app = app;
|
|
238
|
+
this.#screen = screen;
|
|
239
|
+
this.#X = app?.X ?? null;
|
|
240
|
+
this.#root = app?.display?.screen?.[screen]?.root ?? 0;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
get status(): TrayStatus {
|
|
244
|
+
return this.#status;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
get conflict(): TrayConflict | null {
|
|
248
|
+
return this.#conflict;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** The manager selection window, once there is one. */
|
|
252
|
+
get windowId(): number {
|
|
253
|
+
return this.#window || 0;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
get icons(): readonly TrayIcon[] {
|
|
257
|
+
return this.#icons;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Take the selection, if nobody else has it.
|
|
262
|
+
*
|
|
263
|
+
* The order is the spec's: publish the properties, *then* take the
|
|
264
|
+
* selection, *then* broadcast `MANAGER`. A client that starts docking on
|
|
265
|
+
* the broadcast reads the properties immediately afterwards, so they have
|
|
266
|
+
* to be there before the announcement rather than after it.
|
|
267
|
+
*/
|
|
268
|
+
async start(options: TrayManagerStartOptions): Promise<void> {
|
|
269
|
+
if (this.#run) return;
|
|
270
|
+
const run = {};
|
|
271
|
+
this.#run = run;
|
|
272
|
+
/** Still the run that started this line? */
|
|
273
|
+
const live = (): boolean => this.#run === run;
|
|
274
|
+
this.#orientation = options.orientation;
|
|
275
|
+
this.#setStatus('starting', null);
|
|
276
|
+
|
|
277
|
+
const X = this.#X;
|
|
278
|
+
// No raw protocol on this connection — a headless mock. Not an error to
|
|
279
|
+
// report: there is simply no display to be the tray of.
|
|
280
|
+
if (!X || typeof X.SetSelectionOwner !== 'function' || !this.#root) {
|
|
281
|
+
this.#setStatus('unavailable', null);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
try {
|
|
286
|
+
await this.#internAtoms(X);
|
|
287
|
+
if (!live()) return;
|
|
288
|
+
|
|
289
|
+
const existing = await this.#selectionOwner(X);
|
|
290
|
+
if (!live()) return;
|
|
291
|
+
if (existing) {
|
|
292
|
+
// A second panel on one display is a configuration mistake, not an
|
|
293
|
+
// exception. It says so and embeds nothing.
|
|
294
|
+
this.#setStatus('conflict', { owner: existing, screen: this.#screen });
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
this.#window = X.AllocID();
|
|
299
|
+
// InputOnly, never mapped, 1x1 off-screen: this window exists to be an
|
|
300
|
+
// address and to hold two properties, which InputOnly windows do. It
|
|
301
|
+
// selects nothing — a ClientMessage reaches the client that created the
|
|
302
|
+
// window whatever its event mask is, which is how the opcodes arrive.
|
|
303
|
+
X.CreateWindow(
|
|
304
|
+
this.#window,
|
|
305
|
+
this.#root,
|
|
306
|
+
-1,
|
|
307
|
+
-1,
|
|
308
|
+
1,
|
|
309
|
+
1,
|
|
310
|
+
0,
|
|
311
|
+
0,
|
|
312
|
+
INPUT_ONLY,
|
|
313
|
+
0,
|
|
314
|
+
{
|
|
315
|
+
eventMask: 0,
|
|
316
|
+
},
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
this.#visual = await this.#resolveVisual(X, options.hostWindowId);
|
|
320
|
+
// Stopped mid-flight: the window above is ours and nothing else will
|
|
321
|
+
// drop it, because `stop()` ran before there was one to drop.
|
|
322
|
+
if (!live()) {
|
|
323
|
+
this.#destroyWindow();
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
this.#writeOrientation();
|
|
327
|
+
this.#writeVisual();
|
|
328
|
+
|
|
329
|
+
// ICCCM 2.1: never `CurrentTime`. Nothing the user did caused this, so
|
|
330
|
+
// it is a fresh server timestamp rather than `lastInputTime()`.
|
|
331
|
+
const time = await serverTime(this.#app as unknown as NtkApp);
|
|
332
|
+
if (!live()) {
|
|
333
|
+
this.#destroyWindow();
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
X.SetSelectionOwner(this.#window, this.#selectionAtom, time);
|
|
337
|
+
this.#ownedAt = time;
|
|
338
|
+
|
|
339
|
+
// Ask rather than assume. Two panels starting together both saw an
|
|
340
|
+
// unowned selection above, and only one of them has it now.
|
|
341
|
+
const owner = await this.#selectionOwner(X);
|
|
342
|
+
if (!live()) {
|
|
343
|
+
X.SetSelectionOwner(0, this.#selectionAtom, time);
|
|
344
|
+
this.#destroyWindow();
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
if (owner !== this.#window) {
|
|
348
|
+
this.#setStatus('conflict', { owner, screen: this.#screen });
|
|
349
|
+
this.#destroyWindow();
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
this.#listen(X);
|
|
354
|
+
this.#broadcastManager(X, time);
|
|
355
|
+
this.#setStatus('owned', null);
|
|
356
|
+
} catch (err) {
|
|
357
|
+
this.#fail(err);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Give the selection back and drop the manager window.
|
|
363
|
+
*
|
|
364
|
+
* The icons are *not* reparented here: each one is a `<foreign>`, and
|
|
365
|
+
* handing a client back untouched on unmount is that element's promise.
|
|
366
|
+
* All this does is stop being the tray.
|
|
367
|
+
*/
|
|
368
|
+
stop(): void {
|
|
369
|
+
if (!this.#run) return;
|
|
370
|
+
this.#run = null;
|
|
371
|
+
const X = this.#X;
|
|
372
|
+
this.#unlisten();
|
|
373
|
+
this.#balloons.clear();
|
|
374
|
+
this.#replaceIcons([]);
|
|
375
|
+
if (X && this.#window) {
|
|
376
|
+
try {
|
|
377
|
+
// ICCCM 2.3: relinquish with the timestamp it was acquired at.
|
|
378
|
+
X.SetSelectionOwner(0, this.#selectionAtom, this.#ownedAt);
|
|
379
|
+
} catch {
|
|
380
|
+
// the connection is going away, which releases it anyway
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
this.#destroyWindow();
|
|
384
|
+
this.#setStatus('released', null);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/** Republish `_NET_SYSTEM_TRAY_ORIENTATION`. Cheap and idempotent. */
|
|
388
|
+
setOrientation(orientation: TrayOrientation): void {
|
|
389
|
+
if (orientation === this.#orientation) return;
|
|
390
|
+
this.#orientation = orientation;
|
|
391
|
+
this.#writeOrientation();
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* The icon's client went away — `<foreign onClientGone>`, which is the
|
|
396
|
+
* ordinary case here rather than an error: tray icons come and go with the
|
|
397
|
+
* applications that own them.
|
|
398
|
+
*/
|
|
399
|
+
undock(id: number): void {
|
|
400
|
+
const icon = this.#icons.find((entry) => entry.id === id);
|
|
401
|
+
if (!icon) return;
|
|
402
|
+
// A new array, never a splice: the component holds this as state, and
|
|
403
|
+
// React compares identities — mutating in place removes the icon from
|
|
404
|
+
// the list and leaves it on screen.
|
|
405
|
+
this.#icons = this.#icons.filter((entry) => entry !== icon);
|
|
406
|
+
this.#balloons.forget(id);
|
|
407
|
+
this.#emitIcons();
|
|
408
|
+
this.#safely(() => this.handlers.onUndock?.(icon));
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// --- the wire ------------------------------------------------------
|
|
412
|
+
|
|
413
|
+
#listen(X: XConnection): void {
|
|
414
|
+
const listener = (ev: XEvent): void => {
|
|
415
|
+
if (!this.#run) return;
|
|
416
|
+
try {
|
|
417
|
+
this.#onEvent(ev);
|
|
418
|
+
} catch (err) {
|
|
419
|
+
this.#fail(err);
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
this.#listener = listener;
|
|
423
|
+
X.on('event', listener);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
#unlisten(): void {
|
|
427
|
+
const listener = this.#listener;
|
|
428
|
+
this.#listener = null;
|
|
429
|
+
if (listener) this.#X?.removeListener?.('event', listener);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
#onEvent(ev: XEvent): void {
|
|
433
|
+
if (ev.type === SELECTION_CLEAR) {
|
|
434
|
+
// Another tray took over. Letting the icons go is the whole job here:
|
|
435
|
+
// a panel that keeps drawing dead icons after losing the selection is
|
|
436
|
+
// the failure users report as "my tray is empty".
|
|
437
|
+
if (ev.selection !== this.#selectionAtom) return;
|
|
438
|
+
if (this.#window && ev.owner !== this.#window) return;
|
|
439
|
+
this.#unlisten();
|
|
440
|
+
this.#balloons.clear();
|
|
441
|
+
this.#replaceIcons([]);
|
|
442
|
+
this.#destroyWindow();
|
|
443
|
+
this.#setStatus('released', null);
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
if (ev.type !== CLIENT_MESSAGE) return;
|
|
448
|
+
|
|
449
|
+
if (ev.message_type === this.#opcodeAtom) {
|
|
450
|
+
// A dock request names the manager window; a balloon message names the
|
|
451
|
+
// icon it is about, and both are *sent to* the manager window. So the
|
|
452
|
+
// event's window field is only ever one of those two.
|
|
453
|
+
const from = ev.wid ?? 0;
|
|
454
|
+
if (from !== this.#window && !this.#hasIcon(from)) return;
|
|
455
|
+
this.#onOpcode(from, ev.data ?? []);
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
if (ev.message_type === this.#messageDataAtom && ev.format === 8) {
|
|
460
|
+
const from = ev.wid ?? 0;
|
|
461
|
+
if (!this.#hasIcon(from)) return;
|
|
462
|
+
const message = this.#balloons.data(from, ev.data ?? []);
|
|
463
|
+
if (message) this.#safely(() => this.handlers.onMessage?.(message));
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
#onOpcode(from: number, data: readonly number[]): void {
|
|
468
|
+
const opcode = data[1];
|
|
469
|
+
if (opcode === SYSTEM_TRAY_REQUEST_DOCK) {
|
|
470
|
+
this.#dock(data[2] ?? 0);
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
if (opcode === SYSTEM_TRAY_BEGIN_MESSAGE) {
|
|
474
|
+
if (!this.#hasIcon(from)) return;
|
|
475
|
+
const message = this.#balloons.begin(from, {
|
|
476
|
+
timeout: data[2] ?? 0,
|
|
477
|
+
length: data[3] ?? 0,
|
|
478
|
+
id: data[4] ?? 0,
|
|
479
|
+
});
|
|
480
|
+
if (message) this.#safely(() => this.handlers.onMessage?.(message));
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
if (opcode === SYSTEM_TRAY_CANCEL_MESSAGE) {
|
|
484
|
+
if (!this.#hasIcon(from)) return;
|
|
485
|
+
const id = data[2] ?? 0;
|
|
486
|
+
if (this.#balloons.cancel(from, id)) {
|
|
487
|
+
this.#safely(() =>
|
|
488
|
+
this.handlers.onCancelMessage?.({ windowId: from, id }),
|
|
489
|
+
);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
#dock(id: number): void {
|
|
495
|
+
if (!id || this.#status !== 'owned' || this.#hasIcon(id)) return;
|
|
496
|
+
const icon: TrayIcon = { id };
|
|
497
|
+
this.#icons = [...this.#icons, icon];
|
|
498
|
+
this.#emitIcons();
|
|
499
|
+
this.#safely(() => this.handlers.onDock?.(icon));
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
#hasIcon(id: number): boolean {
|
|
503
|
+
return this.#icons.some((icon) => icon.id === id);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
#replaceIcons(next: TrayIcon[]): void {
|
|
507
|
+
if (this.#icons.length === 0 && next.length === 0) return;
|
|
508
|
+
const gone = this.#icons;
|
|
509
|
+
this.#icons = next;
|
|
510
|
+
this.#emitIcons();
|
|
511
|
+
for (const icon of gone) {
|
|
512
|
+
if (!next.includes(icon))
|
|
513
|
+
this.#safely(() => this.handlers.onUndock?.(icon));
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
#emitIcons(): void {
|
|
518
|
+
const icons = this.#icons;
|
|
519
|
+
this.#safely(() => this.handlers.onIcons?.(icons));
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* ICCCM 2.8's `MANAGER` broadcast: clients that were waiting for a tray
|
|
524
|
+
* start docking on this, which is the only reason an application launched
|
|
525
|
+
* before the panel ever gets an icon.
|
|
526
|
+
*/
|
|
527
|
+
#broadcastManager(X: XConnection, time: number): void {
|
|
528
|
+
X.SendEvent(this.#root, 0, STRUCTURE_NOTIFY_MASK, {
|
|
529
|
+
name: 'ClientMessage',
|
|
530
|
+
format: 32,
|
|
531
|
+
wid: this.#root,
|
|
532
|
+
message_type: this.#managerAtom,
|
|
533
|
+
data: [time, this.#selectionAtom, this.#window, 0, 0],
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
#writeOrientation(): void {
|
|
538
|
+
const X = this.#X;
|
|
539
|
+
if (!X || !this.#window) return;
|
|
540
|
+
X.ChangeProperty(0, this.#window, this.#orientationAtom, XA_CARDINAL, 32, [
|
|
541
|
+
orientationValue(this.#orientation),
|
|
542
|
+
]);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
#writeVisual(): void {
|
|
546
|
+
const X = this.#X;
|
|
547
|
+
// Absent rather than zero when there is nothing honest to say: a client
|
|
548
|
+
// reads "is the property there" and a 0 visual id is not a visual.
|
|
549
|
+
if (!X || !this.#window || !this.#visual) return;
|
|
550
|
+
X.ChangeProperty(0, this.#window, this.#visualAtom, XA_VISUALID, 32, [
|
|
551
|
+
this.#visual,
|
|
552
|
+
]);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
async #resolveVisual(
|
|
556
|
+
X: XConnection,
|
|
557
|
+
hostWindowId: number | null,
|
|
558
|
+
): Promise<number> {
|
|
559
|
+
if (!hostWindowId) return 0;
|
|
560
|
+
try {
|
|
561
|
+
const attrs = await new Promise<{ visual: number }>((resolve, reject) =>
|
|
562
|
+
X.GetWindowAttributes(hostWindowId, (err, value) =>
|
|
563
|
+
err ? reject(err) : resolve(value),
|
|
564
|
+
),
|
|
565
|
+
);
|
|
566
|
+
const screen = this.#app.display?.screen?.[this.#screen];
|
|
567
|
+
return argbVisualOf(screen, attrs?.visual ?? 0);
|
|
568
|
+
} catch {
|
|
569
|
+
// The window went away, or the server would not say. No property, and
|
|
570
|
+
// the icons fall back to guessing a background — which always worked.
|
|
571
|
+
return 0;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
#selectionOwner(X: XConnection): Promise<number> {
|
|
576
|
+
return new Promise<number>((resolve, reject) =>
|
|
577
|
+
X.GetSelectionOwner(this.#selectionAtom, (err, owner) =>
|
|
578
|
+
err ? reject(err) : resolve(owner >>> 0),
|
|
579
|
+
),
|
|
580
|
+
);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
async #internAtoms(X: XConnection): Promise<void> {
|
|
584
|
+
const intern = (name: string): Promise<number> =>
|
|
585
|
+
new Promise<number>((resolve, reject) =>
|
|
586
|
+
X.InternAtom(false, name, (err, atom) =>
|
|
587
|
+
err ? reject(err) : resolve(atom),
|
|
588
|
+
),
|
|
589
|
+
);
|
|
590
|
+
const [selection, opcode, orientation, visual, messageData, manager] =
|
|
591
|
+
await Promise.all([
|
|
592
|
+
intern(selectionNameFor(this.#screen)),
|
|
593
|
+
intern(OPCODE_ATOM),
|
|
594
|
+
intern(ORIENTATION_ATOM),
|
|
595
|
+
intern(VISUAL_ATOM),
|
|
596
|
+
intern(MESSAGE_DATA_ATOM),
|
|
597
|
+
intern(MANAGER_ATOM),
|
|
598
|
+
]);
|
|
599
|
+
this.#selectionAtom = selection ?? 0;
|
|
600
|
+
this.#opcodeAtom = opcode ?? 0;
|
|
601
|
+
this.#orientationAtom = orientation ?? 0;
|
|
602
|
+
this.#visualAtom = visual ?? 0;
|
|
603
|
+
this.#messageDataAtom = messageData ?? 0;
|
|
604
|
+
this.#managerAtom = manager ?? 0;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
#destroyWindow(): void {
|
|
608
|
+
const id = this.#window;
|
|
609
|
+
this.#window = 0;
|
|
610
|
+
if (!id) return;
|
|
611
|
+
try {
|
|
612
|
+
this.#X?.DestroyWindow(id);
|
|
613
|
+
} catch {
|
|
614
|
+
// the connection is closing; the server drops it with us
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
#setStatus(status: TrayStatus, conflict: TrayConflict | null): void {
|
|
619
|
+
if (this.#status === status && this.#conflict === conflict) return;
|
|
620
|
+
this.#status = status;
|
|
621
|
+
this.#conflict = conflict;
|
|
622
|
+
this.#safely(() => this.handlers.onStatus?.(status, conflict));
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
#fail(err: unknown): void {
|
|
626
|
+
const wrapped = err instanceof Error ? err : new Error(String(err));
|
|
627
|
+
this.#safely(() => this.handlers.onError?.(wrapped));
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/** One handler throwing must not take the X event loop with it — the same
|
|
631
|
+
* rule `xsettings.js` applies to its subscribers. */
|
|
632
|
+
#safely(fn: () => void): void {
|
|
633
|
+
try {
|
|
634
|
+
fn();
|
|
635
|
+
} catch {
|
|
636
|
+
/* a listener's problem, not the tray's */
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|