flea-qml 0.0.0-stage → 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/LICENSE +22 -0
- package/README.md +511 -2
- package/THIRD-PARTY-NOTICES.md +29 -0
- package/demos/App.java +5 -0
- package/demos/Dockerfile +4 -0
- package/demos/Main.kt +3 -0
- package/demos/Program.cs +1 -0
- package/demos/README.md +12 -0
- package/demos/app.dart +3 -0
- package/demos/app.deb +0 -0
- package/demos/app.js +1 -0
- package/demos/backup.tar +0 -0
- package/demos/budget.xlsx +0 -0
- package/demos/build.sh +2 -0
- package/demos/bundle.zip +0 -0
- package/demos/clip.mp4 +0 -0
- package/demos/data.sqlite +0 -0
- package/demos/disk.iso +0 -0
- package/demos/engine.cpp +5 -0
- package/demos/firmware.bin +0 -0
- package/demos/flake.nix +4 -0
- package/demos/folder/inside.txt +1 -0
- package/demos/font.ttf +0 -0
- package/demos/index.html +5 -0
- package/demos/index.php +2 -0
- package/demos/init.lua +1 -0
- package/demos/letter.docx +0 -0
- package/demos/lib.rs +3 -0
- package/demos/main.c +6 -0
- package/demos/main.h +3 -0
- package/demos/math-and-diagrams.md +200 -0
- package/demos/notes.tar.gz +0 -0
- package/demos/notes.txt +3 -0
- package/demos/photo.png +0 -0
- package/demos/program +2 -0
- package/demos/report.pdf +32 -0
- package/demos/script.py +1 -0
- package/demos/server.go +7 -0
- package/demos/settings.json +4 -0
- package/demos/slides.pptx +0 -0
- package/demos/song.mp3 +0 -0
- package/demos/style.css +4 -0
- package/demos/tool.rb +1 -0
- package/demos/types.ts +2 -0
- package/docs/pele.md +23 -0
- package/docs/protocol.md +3420 -0
- package/docs/temml.md +63 -0
- package/index.js +107 -0
- package/package.json +34 -4
- package/src/archive.js +407 -0
- package/src/archiveops.js +728 -0
- package/src/backend.js +369 -0
- package/src/bulkrename.js +95 -0
- package/src/clip-host.js +76 -0
- package/src/clip.js +462 -0
- package/src/code.js +168 -0
- package/src/compare.js +74 -0
- package/src/create.js +128 -0
- package/src/dirsize.js +147 -0
- package/src/figure-svg.js +530 -0
- package/src/figure-thread.js +23 -0
- package/src/figure.js +132 -0
- package/src/find.js +55 -0
- package/src/flea.js +39 -0
- package/src/fsinfo.js +39 -0
- package/src/highlight.js +141 -0
- package/src/html.js +52 -0
- package/src/kinds.js +89 -0
- package/src/listing.js +130 -0
- package/src/markdown-html.js +317 -0
- package/src/mathml.js +186 -0
- package/src/menu.js +180 -0
- package/src/meta.js +135 -0
- package/src/office.js +810 -0
- package/src/order.js +100 -0
- package/src/peek.js +49 -0
- package/src/pele-wrapper.js +695 -0
- package/src/permissions.js +180 -0
- package/src/places.js +313 -0
- package/src/preview-language.js +10 -0
- package/src/terminal-server.js +95 -0
- package/src/terminal-shell.js +26 -0
- package/src/transfer.js +669 -0
- package/src/trash-record.js +41 -0
- package/src/trash.js +210 -0
- package/src/trashbrowse.js +327 -0
- package/src/uistate.js +393 -0
- package/src/uistore.js +168 -0
- package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
- package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
- package/src/vendor/LICENSES/MIT-katex.txt +21 -0
- package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
- package/src/vendor/LICENSES/MIT-pele.txt +40 -0
- package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
- package/src/vendor/LICENSES/MIT-temml.txt +21 -0
- package/src/vendor/pele.js +145 -0
- package/src/vendor/temml.mjs +14708 -0
- package/src/watch.js +98 -0
- package/src/wayland/client.js +109 -0
- package/src/wayland/protocol.js +55 -0
- package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
- package/src/wayland/protocols/wayland.xml +3248 -0
- package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
- package/src/wayland/resource-io.js +6 -0
- package/src/wayland/socket-discovery.js +26 -0
- package/src/wayland/transport-posix.js +120 -0
- package/src/wayland/transport-win32.js +11 -0
- package/src/wayland/transport.js +3 -0
- package/src/wayland/win32-resources.js +80 -0
- package/src/wayland/win32-wire.js +62 -0
- package/test/archive.test.js +80 -0
- package/test/bench-markdown-scroll.mjs +190 -0
- package/test/clip-host.test.js +113 -0
- package/test/code-preview.test.js +35 -0
- package/test/compare-ui-paths.test.js +24 -0
- package/test/compare.test.js +54 -0
- package/test/delete-trash.test.js +67 -0
- package/test/dirsize.test.js +138 -0
- package/test/file-ops.test.js +307 -0
- package/test/file-url.test.js +24 -0
- package/test/find-contents.test.js +161 -0
- package/test/find-input.test.js +66 -0
- package/test/fixtures/pele-parity.json +1006 -0
- package/test/highlight-launcher.test.js +35 -0
- package/test/html-preview.test.js +22 -0
- package/test/input.test.js +15 -0
- package/test/keymap.test.js +26 -0
- package/test/language-icons.test.js +36 -0
- package/test/launcher.test.js +51 -0
- package/test/manual-archive-here-ui.mjs +47 -0
- package/test/manual-code-scroll.mjs +28 -0
- package/test/manual-column-scroll.mjs +24 -0
- package/test/manual-compare-ui.mjs +20 -0
- package/test/manual-find-status.mjs +37 -0
- package/test/manual-folder-focus.mjs +63 -0
- package/test/manual-html-security.mjs +23 -0
- package/test/manual-html-ui.mjs +30 -0
- package/test/manual-syntax-preview.mjs +26 -0
- package/test/manual-terminal-lifecycle.mjs +42 -0
- package/test/manual-terminal-navigation.mjs +48 -0
- package/test/manual-terminal-ui.mjs +47 -0
- package/test/manual-trash-ui.mjs +86 -0
- package/test/markdown-diagrams.test.js +93 -0
- package/test/markdown-html.test.js +105 -0
- package/test/mathml.test.js +92 -0
- package/test/menu-transfer.test.js +57 -0
- package/test/office-preview.test.js +154 -0
- package/test/pele-parity.test.js +28 -0
- package/test/places.test.js +134 -0
- package/test/preview-keys.test.js +60 -0
- package/test/preview-language.test.js +22 -0
- package/test/status-filename.test.js +20 -0
- package/test/transfer-replace-merge.test.js +187 -0
- package/test/trash-address.test.js +23 -0
- package/test/trash-view.test.js +37 -0
- package/test/trashbrowse.test.js +135 -0
- package/ui/AboutFacts.qml +78 -0
- package/ui/ArchiveCards.qml +95 -0
- package/ui/ArchiveCompressDialog.qml +378 -0
- package/ui/ArchiveHereConfirm.qml +127 -0
- package/ui/ArchivePasswordDialog.qml +257 -0
- package/ui/Backend.qml +775 -0
- package/ui/BulkOldNames.qml +47 -0
- package/ui/BulkRenameDialog.qml +380 -0
- package/ui/CardFrame.qml +67 -0
- package/ui/CardScroll.qml +79 -0
- package/ui/CheckBox.qml +73 -0
- package/ui/ChromeBar.qml +360 -0
- package/ui/ChromeButton.qml +131 -0
- package/ui/ChromeModes.qml +43 -0
- package/ui/CodeLines.qml +256 -0
- package/ui/CodeRefusal.qml +52 -0
- package/ui/CollideConfirm.qml +147 -0
- package/ui/CollideHost.qml +167 -0
- package/ui/ColumnPane.qml +525 -0
- package/ui/ColumnRow.qml +380 -0
- package/ui/ColumnsArea.qml +594 -0
- package/ui/ColumnsLanding.qml +147 -0
- package/ui/CompareView.qml +321 -0
- package/ui/ContextMenu.qml +743 -0
- package/ui/ConvertDialog.qml +456 -0
- package/ui/CountedWorker.qml +7 -0
- package/ui/Crumb.qml +64 -0
- package/ui/CrumbDrop.qml +25 -0
- package/ui/CsvTable.qml +394 -0
- package/ui/CursorMark.qml +41 -0
- package/ui/DefaultClaim.qml +130 -0
- package/ui/DeviceLock.qml +47 -0
- package/ui/DeviceMounts.qml +540 -0
- package/ui/DialogButton.qml +150 -0
- package/ui/DialogField.qml +147 -0
- package/ui/DialogHeader.qml +31 -0
- package/ui/DialogScrim.qml +20 -0
- package/ui/DialogTitle.qml +37 -0
- package/ui/Divider.qml +9 -0
- package/ui/DropInto.qml +126 -0
- package/ui/DropTarget.qml +35 -0
- package/ui/DropboxMark.qml +60 -0
- package/ui/EmptyState.qml +150 -0
- package/ui/EscapeHint.qml +11 -0
- package/ui/FactsTable.qml +54 -0
- package/ui/FastScrollHandler.qml +476 -0
- package/ui/FatNamesConfirm.qml +157 -0
- package/ui/Favourites.qml +143 -0
- package/ui/FigureService.qml +120 -0
- package/ui/FileDrag.qml +267 -0
- package/ui/FilterStrip.qml +133 -0
- package/ui/FitMetrics.qml +22 -0
- package/ui/FlashDriveRows.qml +137 -0
- package/ui/FlashHost.qml +72 -0
- package/ui/FlashImageRow.qml +104 -0
- package/ui/FlashRunner.qml +119 -0
- package/ui/FlashStepRow.qml +172 -0
- package/ui/FlashStrip.qml +38 -0
- package/ui/FlashView.qml +397 -0
- package/ui/FleaMark.qml +88 -0
- package/ui/FlyoutFade.qml +23 -0
- package/ui/FontPane.qml +170 -0
- package/ui/Glass.qml +114 -0
- package/ui/GlassTagger.qml +59 -0
- package/ui/Glyph.qml +64 -0
- package/ui/GlyphSolid.qml +22 -0
- package/ui/GridArea.qml +664 -0
- package/ui/GridTile.qml +325 -0
- package/ui/GvfsBridge.qml +164 -0
- package/ui/Header.qml +433 -0
- package/ui/HoverTimers.qml +39 -0
- package/ui/HtmlClip.qml +30 -0
- package/ui/HtmlPane.qml +63 -0
- package/ui/HyprlandMark.qml +45 -0
- package/ui/Ipc.qml +1005 -0
- package/ui/IpcControls.qml +7 -0
- package/ui/IpcMenuState.qml +48 -0
- package/ui/IpcPreviewState.qml +185 -0
- package/ui/JumpPath.qml +51 -0
- package/ui/KeymapSheet.qml +561 -0
- package/ui/KeymapSheetResult.qml +89 -0
- package/ui/KindStack.qml +40 -0
- package/ui/LangMark.qml +51 -0
- package/ui/LangMarkLoader.qml +26 -0
- package/ui/List.qml +480 -0
- package/ui/LoadingState.qml +54 -0
- package/ui/LocalSend.qml +56 -0
- package/ui/LocalSendMark.qml +73 -0
- package/ui/MarkdownBlockView.qml +311 -0
- package/ui/MarkdownBlocks.qml +35 -0
- package/ui/MarkdownFigure.qml +254 -0
- package/ui/MarkdownImages.qml +72 -0
- package/ui/MarkdownList.qml +81 -0
- package/ui/MarkdownMathsText.qml +97 -0
- package/ui/MarkdownPane.qml +83 -0
- package/ui/MarkdownPictures.qml +41 -0
- package/ui/MarkdownQuote.qml +52 -0
- package/ui/MarkdownRemote.qml +82 -0
- package/ui/MarkdownSource.qml +155 -0
- package/ui/MarkdownTable.qml +222 -0
- package/ui/MarkdownTableScroll.qml +64 -0
- package/ui/MarkdownTableWheel.qml +126 -0
- package/ui/MarkdownText.qml +87 -0
- package/ui/MarkdownWorker.js +132 -0
- package/ui/MatchText.qml +99 -0
- package/ui/MediaSession.qml +38 -0
- package/ui/MediaSound.qml +26 -0
- package/ui/MediaStrip.qml +191 -0
- package/ui/MediaTrack.qml +36 -0
- package/ui/MediaVolume.qml +54 -0
- package/ui/MenuActionDialog.qml +396 -0
- package/ui/MenuEdgeFade.qml +24 -0
- package/ui/MenuHost.qml +227 -0
- package/ui/MenuRow.qml +351 -0
- package/ui/MountListing.qml +100 -0
- package/ui/NetworkDialog.qml +435 -0
- package/ui/NetworkForm.qml +426 -0
- package/ui/NetworkMounts.qml +913 -0
- package/ui/NetworkPlaces.qml +127 -0
- package/ui/OpenWithDialog.qml +613 -0
- package/ui/Opener.qml +95 -0
- package/ui/Pane.qml +1320 -0
- package/ui/PaneMenuActions.qml +527 -0
- package/ui/PanePath.qml +90 -0
- package/ui/PaneRail.qml +268 -0
- package/ui/PaneStates.qml +88 -0
- package/ui/PaneSwap.qml +339 -0
- package/ui/PaneWire.qml +601 -0
- package/ui/ParkedWait.qml +9 -0
- package/ui/PathEntry.qml +186 -0
- package/ui/PathJump.qml +400 -0
- package/ui/PdfViewer.qml +297 -0
- package/ui/PermissionsDialog.qml +658 -0
- package/ui/PermissionsHeadings.qml +31 -0
- package/ui/PhoneMounts.qml +67 -0
- package/ui/PickerAnswers.qml +75 -0
- package/ui/PickerBox.qml +26 -0
- package/ui/PickerChrome.qml +295 -0
- package/ui/PickerFilter.qml +97 -0
- package/ui/PickerGrid.qml +308 -0
- package/ui/PickerHeader.qml +28 -0
- package/ui/PickerLifecycle.qml +27 -0
- package/ui/PickerList.qml +218 -0
- package/ui/PickerListing.qml +149 -0
- package/ui/PickerPathBar.qml +127 -0
- package/ui/PickerPlaces.qml +189 -0
- package/ui/PickerRecent.qml +92 -0
- package/ui/PickerSave.qml +101 -0
- package/ui/PickerSelection.qml +155 -0
- package/ui/PickerWindow.qml +846 -0
- package/ui/PowerSectorsReader.qml +10 -0
- package/ui/PrebuildDriver.qml +146 -0
- package/ui/Preview.qml +1005 -0
- package/ui/PreviewAnimation.qml +24 -0
- package/ui/PreviewArchive.qml +91 -0
- package/ui/PreviewColumn.qml +553 -0
- package/ui/PreviewEdge.qml +63 -0
- package/ui/PreviewFacts.qml +30 -0
- package/ui/PreviewFactsLine.qml +34 -0
- package/ui/PreviewHtml.qml +233 -0
- package/ui/PreviewImage.qml +253 -0
- package/ui/PreviewImagePan.qml +13 -0
- package/ui/PreviewImageSharp.qml +32 -0
- package/ui/PreviewLines.qml +106 -0
- package/ui/PreviewMarkdown.qml +706 -0
- package/ui/PreviewMedia.qml +250 -0
- package/ui/PreviewPdf.qml +482 -0
- package/ui/PreviewScroll.qml +201 -0
- package/ui/PreviewSwap.qml +335 -0
- package/ui/PreviewText.qml +149 -0
- package/ui/ProtocolChip.qml +18 -0
- package/ui/QuickLookArchive.qml +41 -0
- package/ui/QuickLookBar.qml +103 -0
- package/ui/QuickLookPrepare.qml +355 -0
- package/ui/QuickLookSwap.qml +10 -0
- package/ui/QuickLookWarm.qml +65 -0
- package/ui/RailDrop.qml +155 -0
- package/ui/RailHeading.qml +19 -0
- package/ui/RailPlaces.qml +38 -0
- package/ui/RailTrashRow.qml +67 -0
- package/ui/RenameField.qml +353 -0
- package/ui/RendererRetry.qml +11 -0
- package/ui/ResizeHandle.qml +52 -0
- package/ui/Reveal.qml +54 -0
- package/ui/Row.qml +476 -0
- package/ui/RowDrag.qml +213 -0
- package/ui/RowDropTarget.qml +27 -0
- package/ui/RunCard.qml +286 -0
- package/ui/Scripts.qml +65 -0
- package/ui/SearchStrip.qml +232 -0
- package/ui/SelectionBand.qml +140 -0
- package/ui/SelectionPreview.qml +370 -0
- package/ui/SettingsFavourite.qml +122 -0
- package/ui/SettingsGroup.qml +96 -0
- package/ui/SettingsHint.qml +12 -0
- package/ui/SettingsMetrics.qml +29 -0
- package/ui/SettingsPane.qml +178 -0
- package/ui/SettingsPanel.qml +547 -0
- package/ui/SettingsRail.qml +128 -0
- package/ui/SettingsRow.qml +409 -0
- package/ui/SettingsRuler.qml +85 -0
- package/ui/SettingsSegment.qml +85 -0
- package/ui/ShareBrowser.qml +113 -0
- package/ui/ShareLink.qml +67 -0
- package/ui/ShelfPins.qml +101 -0
- package/ui/Sidebar.qml +728 -0
- package/ui/SidebarRow.qml +358 -0
- package/ui/Spinner.qml +60 -0
- package/ui/StableModel.qml +89 -0
- package/ui/StateMessage.qml +84 -0
- package/ui/StatusBar.qml +512 -0
- package/ui/StatusFileName.qml +27 -0
- package/ui/TabBar.qml +673 -0
- package/ui/TabDragGeometry.qml +60 -0
- package/ui/TagMenuMark.qml +52 -0
- package/ui/TagRailSection.qml +53 -0
- package/ui/TagSlot.qml +40 -0
- package/ui/TagState.qml +150 -0
- package/ui/TagSwatch.qml +28 -0
- package/ui/Taildrop.qml +86 -0
- package/ui/TailscaleMark.qml +50 -0
- package/ui/TerminalService.qml +69 -0
- package/ui/TerminalTab.qml +48 -0
- package/ui/TerminalTabs.qml +27 -0
- package/ui/Theme.qml +460 -0
- package/ui/ThemeColors.qml +43 -0
- package/ui/TransferCard.qml +239 -0
- package/ui/TrashConfirm.qml +129 -0
- package/ui/TrashDropHandler.qml +11 -0
- package/ui/TrashHost.qml +202 -0
- package/ui/TrashMonitor.qml +30 -0
- package/ui/TrashToolbar.qml +19 -0
- package/ui/TrashView.qml +492 -0
- package/ui/UnlockDialog.qml +450 -0
- package/ui/UnlockHost.qml +206 -0
- package/ui/UpdateCheck.qml +97 -0
- package/ui/UserDirs.qml +25 -0
- package/ui/ViewState.qml +565 -0
- package/ui/ViewportScrollBar.qml +195 -0
- package/ui/ViewportScrollBars.qml +25 -0
- package/ui/WebPreview.qml +33 -0
- package/ui/WebPreviewView.qml +26 -0
- package/ui/WindowBody.qml +829 -0
- package/ui/WindowDrag.qml +35 -0
- package/ui/boot/Commons/AudioNodes.qml +50 -0
- package/ui/boot/Commons/AudioNodesModel.js +96 -0
- package/ui/boot/Commons/Border.qml +243 -0
- package/ui/boot/Commons/BorderGeometry.js +373 -0
- package/ui/boot/Commons/Color.qml +258 -0
- package/ui/boot/Commons/I18n.qml +118 -0
- package/ui/boot/Commons/InputDevices.qml +112 -0
- package/ui/boot/Commons/InputMethodState.qml +38 -0
- package/ui/boot/Commons/IpcRegistry.qml +77 -0
- package/ui/boot/Commons/Numbers.js +19 -0
- package/ui/boot/Commons/Plural.js +91 -0
- package/ui/boot/Commons/ShellIpc.qml +12 -0
- package/ui/boot/Commons/Style.qml +561 -0
- package/ui/boot/Commons/Translations.qml +100 -0
- package/ui/boot/Commons/UntypedInput.qml +152 -0
- package/ui/boot/Commons/Util.qml +188 -0
- package/ui/boot/Commons/qmldir +13 -0
- package/ui/boot/LICENSE-omarchy +20 -0
- package/ui/boot/Ui/BackgroundMedia.qml +49 -0
- package/ui/boot/Ui/BarIconButton.qml +106 -0
- package/ui/boot/Ui/BarIconContent.qml +38 -0
- package/ui/boot/Ui/BarIndicator.qml +53 -0
- package/ui/boot/Ui/BarWidget.qml +50 -0
- package/ui/boot/Ui/BorderOverlay.qml +54 -0
- package/ui/boot/Ui/BorderSurface.qml +40 -0
- package/ui/boot/Ui/Button.qml +224 -0
- package/ui/boot/Ui/ButtonGroup.qml +131 -0
- package/ui/boot/Ui/ConfirmDialog.qml +134 -0
- package/ui/boot/Ui/CursorSurface.qml +42 -0
- package/ui/boot/Ui/Dropdown.qml +245 -0
- package/ui/boot/Ui/FilterInput.qml +26 -0
- package/ui/boot/Ui/IconContentBounds.qml +141 -0
- package/ui/boot/Ui/KeyboardPanel.qml +453 -0
- package/ui/boot/Ui/MultiSelect.qml +624 -0
- package/ui/boot/Ui/NumberField.qml +86 -0
- package/ui/boot/Ui/OpticalGlyph.qml +68 -0
- package/ui/boot/Ui/OverlayWindow.qml +102 -0
- package/ui/boot/Ui/Panel.qml +60 -0
- package/ui/boot/Ui/PanelActionButton.qml +105 -0
- package/ui/boot/Ui/PanelController.qml +16 -0
- package/ui/boot/Ui/PanelHero.qml +112 -0
- package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
- package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
- package/ui/boot/Ui/PanelSeparator.qml +19 -0
- package/ui/boot/Ui/PanelSlider.qml +156 -0
- package/ui/boot/Ui/PanelToolTip.qml +50 -0
- package/ui/boot/Ui/PluginBarApi.qml +89 -0
- package/ui/boot/Ui/PointerMoveGate.qml +54 -0
- package/ui/boot/Ui/PopupCard.qml +181 -0
- package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
- package/ui/boot/Ui/SearchableDropdown.qml +354 -0
- package/ui/boot/Ui/SizedImage.qml +125 -0
- package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
- package/ui/boot/Ui/TextField.qml +58 -0
- package/ui/boot/Ui/Toggle.qml +118 -0
- package/ui/boot/Ui/ToggleSwitch.qml +115 -0
- package/ui/boot/Ui/WidgetButton.qml +172 -0
- package/ui/boot/Ui/qmldir +41 -0
- package/ui/boot/fleatab.qml +50 -0
- package/ui/boot/picker.qml +39 -0
- package/ui/boot/shell.qml +131 -0
- package/ui/boot/tabtearoff.qml +51 -0
- package/ui/js/Anchor.js +379 -0
- package/ui/js/AnchorHold.js +162 -0
- package/ui/js/Archive.js +157 -0
- package/ui/js/ArchiveCard.js +44 -0
- package/ui/js/ArchiveOps.js +44 -0
- package/ui/js/BackReturn.js +118 -0
- package/ui/js/BulkRename.js +100 -0
- package/ui/js/Buttons.js +54 -0
- package/ui/js/ChromeKeys.js +116 -0
- package/ui/js/ClipMarks.js +73 -0
- package/ui/js/ClipSelection.js +67 -0
- package/ui/js/Clipboard.js +179 -0
- package/ui/js/Cloud.js +97 -0
- package/ui/js/CodeRuns.js +72 -0
- package/ui/js/Collide.js +212 -0
- package/ui/js/ColumnFit.js +28 -0
- package/ui/js/ColumnMenu.js +111 -0
- package/ui/js/Columns.js +298 -0
- package/ui/js/ColumnsCarry.js +103 -0
- package/ui/js/Compare.js +74 -0
- package/ui/js/Contrast.js +157 -0
- package/ui/js/ControlReader.js +42 -0
- package/ui/js/Convert.js +52 -0
- package/ui/js/CopyAs.js +52 -0
- package/ui/js/Crumbs.js +178 -0
- package/ui/js/Csv.js +231 -0
- package/ui/js/Density.js +44 -0
- package/ui/js/Devices.js +440 -0
- package/ui/js/DirSizes.js +180 -0
- package/ui/js/Drag.js +360 -0
- package/ui/js/DragOut.js +166 -0
- package/ui/js/DropDev.js +52 -0
- package/ui/js/Dropbox.js +41 -0
- package/ui/js/Eject.js +217 -0
- package/ui/js/Errors.js +188 -0
- package/ui/js/ExtThumbs.js +115 -0
- package/ui/js/Facts.js +402 -0
- package/ui/js/FigureDate.js +14 -0
- package/ui/js/Filter.js +285 -0
- package/ui/js/Find.js +46 -0
- package/ui/js/Flash.js +184 -0
- package/ui/js/FlashCard.js +79 -0
- package/ui/js/FlashEndings.js +125 -0
- package/ui/js/FlashPane.js +116 -0
- package/ui/js/FleaBin.js +12 -0
- package/ui/js/Focus.js +504 -0
- package/ui/js/FolderSorts.js +108 -0
- package/ui/js/FolderViews.js +44 -0
- package/ui/js/Format.js +314 -0
- package/ui/js/Fuzzy.js +141 -0
- package/ui/js/GlassTag.js +72 -0
- package/ui/js/Grid.js +33 -0
- package/ui/js/GridGeometry.js +90 -0
- package/ui/js/GridNames.js +153 -0
- package/ui/js/GvfsBridge.js +200 -0
- package/ui/js/HostClipboard.js +29 -0
- package/ui/js/Icons.js +218 -0
- package/ui/js/Input.js +50 -0
- package/ui/js/Jump.js +200 -0
- package/ui/js/KeyName.js +64 -0
- package/ui/js/Keymap.js +401 -0
- package/ui/js/Kinds.js +164 -0
- package/ui/js/LICENSES/ISC-lucide.txt +43 -0
- package/ui/js/LangMarkPaths.js +47 -0
- package/ui/js/LangMarks.js +120 -0
- package/ui/js/Lists.js +11 -0
- package/ui/js/LocalSend.js +39 -0
- package/ui/js/LockedMenu.js +63 -0
- package/ui/js/MakeDefault.js +186 -0
- package/ui/js/MarkBox.js +7 -0
- package/ui/js/Markdown.js +119 -0
- package/ui/js/MarkdownLists.js +86 -0
- package/ui/js/MarkdownMaths.js +58 -0
- package/ui/js/MarkdownPictures.js +32 -0
- package/ui/js/MarkdownPrepared.js +139 -0
- package/ui/js/MarkdownTableFit.js +34 -0
- package/ui/js/Marks.js +148 -0
- package/ui/js/Marquee.js +96 -0
- package/ui/js/Match.js +93 -0
- package/ui/js/Material.js +109 -0
- package/ui/js/MdBlocks.js +437 -0
- package/ui/js/MdBreak.js +71 -0
- package/ui/js/MdChunks.js +70 -0
- package/ui/js/MdContainer.js +137 -0
- package/ui/js/MdDocument.js +337 -0
- package/ui/js/MdEmph.js +97 -0
- package/ui/js/MdEntity.js +108 -0
- package/ui/js/MdEntityTable.js +223 -0
- package/ui/js/MdEscape.js +59 -0
- package/ui/js/MdFront.js +37 -0
- package/ui/js/MdHold.js +32 -0
- package/ui/js/MdHtml.js +307 -0
- package/ui/js/MdHtmlBlock.js +290 -0
- package/ui/js/MdHtmlHeading.js +53 -0
- package/ui/js/MdHtmlImage.js +179 -0
- package/ui/js/MdInline.js +154 -0
- package/ui/js/MdItems.js +212 -0
- package/ui/js/MdLeaf.js +309 -0
- package/ui/js/MdLink.js +196 -0
- package/ui/js/MdMath.js +67 -0
- package/ui/js/MdParagraphs.js +138 -0
- package/ui/js/MdRefs.js +232 -0
- package/ui/js/MdResolve.js +226 -0
- package/ui/js/MdRun.js +300 -0
- package/ui/js/MdUrl.js +226 -0
- package/ui/js/Menu.js +514 -0
- package/ui/js/MenuContext.js +85 -0
- package/ui/js/MenuFit.js +13 -0
- package/ui/js/MenuRefresh.js +74 -0
- package/ui/js/MenuWheel.js +35 -0
- package/ui/js/Messages.js +186 -0
- package/ui/js/Motion.js +16 -0
- package/ui/js/Mounts.js +320 -0
- package/ui/js/MouseNav.js +13 -0
- package/ui/js/Nav.js +329 -0
- package/ui/js/NetFs.js +26 -0
- package/ui/js/OpenWith.js +83 -0
- package/ui/js/Ops.js +585 -0
- package/ui/js/Palette.js +33 -0
- package/ui/js/PathBar.js +260 -0
- package/ui/js/Permissions.js +179 -0
- package/ui/js/Phones.js +112 -0
- package/ui/js/Picker.js +353 -0
- package/ui/js/PlaceMenu.js +96 -0
- package/ui/js/Places.js +265 -0
- package/ui/js/PreviewAsk.js +21 -0
- package/ui/js/PreviewKeys.js +155 -0
- package/ui/js/PreviewSettle.js +29 -0
- package/ui/js/PreviewSwap.js +101 -0
- package/ui/js/PropertyFacts.js +144 -0
- package/ui/js/Protocols.js +296 -0
- package/ui/js/QuickLookKinds.js +27 -0
- package/ui/js/QuickLookRect.js +24 -0
- package/ui/js/RailDrop.js +51 -0
- package/ui/js/RailKeys.js +87 -0
- package/ui/js/RailMenu.js +133 -0
- package/ui/js/Recent.js +135 -0
- package/ui/js/RecentMode.js +156 -0
- package/ui/js/Reload.js +60 -0
- package/ui/js/Renderer.js +9 -0
- package/ui/js/RunFile.js +143 -0
- package/ui/js/Scripts.js +28 -0
- package/ui/js/Scroll.js +304 -0
- package/ui/js/ScrollOff.js +69 -0
- package/ui/js/Search.js +478 -0
- package/ui/js/Selection.js +97 -0
- package/ui/js/Settings.js +476 -0
- package/ui/js/SettingsAbout.js +97 -0
- package/ui/js/SettingsShelf.js +52 -0
- package/ui/js/SheetKeys.js +42 -0
- package/ui/js/SheetQuery.js +281 -0
- package/ui/js/ShelfPile.js +27 -0
- package/ui/js/SlowClick.js +53 -0
- package/ui/js/SlowOp.js +6 -0
- package/ui/js/Sort.js +134 -0
- package/ui/js/Startup.js +63 -0
- package/ui/js/StateWords.js +17 -0
- package/ui/js/Status.js +238 -0
- package/ui/js/Swap.js +166 -0
- package/ui/js/TabMove.js +39 -0
- package/ui/js/Tabs.js +751 -0
- package/ui/js/Tags.js +134 -0
- package/ui/js/Taildrop.js +128 -0
- package/ui/js/Tap.js +180 -0
- package/ui/js/TextSize.js +107 -0
- package/ui/js/Thumbs.js +158 -0
- package/ui/js/Transfer.js +172 -0
- package/ui/js/Trash.js +84 -0
- package/ui/js/TrashDates.js +47 -0
- package/ui/js/TrashDrop.js +64 -0
- package/ui/js/UiState.js +438 -0
- package/ui/js/Unlock.js +152 -0
- package/ui/js/Update.js +130 -0
- package/ui/js/UserDirs.js +56 -0
- package/ui/qmldir +230 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
pragma Singleton
|
|
2
|
+
import QtQuick
|
|
3
|
+
import Quickshell
|
|
4
|
+
import Quickshell.Io
|
|
5
|
+
import "Plural.js" as Plural
|
|
6
|
+
import "Numbers.js" as Numbers
|
|
7
|
+
|
|
8
|
+
// Display-language strings for the shell. The selected code lives in
|
|
9
|
+
// ~/.config/omarchy/language (omarchy-language owns it); a missing file
|
|
10
|
+
// means English. Strings come from default/i18n/<code>/shell.json layered
|
|
11
|
+
// over the English catalog, so a missing translation falls back to English
|
|
12
|
+
// per string. Use as I18n.t("common.search"), with .arg(...) for %1 holes,
|
|
13
|
+
// and I18n.tn(key, count).arg(I18n.formatNumber(count)) for an
|
|
14
|
+
// entry with plural forms.
|
|
15
|
+
// The language file is watched, so switching language under Setup
|
|
16
|
+
// re-renders the shell without a restart.
|
|
17
|
+
QtObject {
|
|
18
|
+
id: root
|
|
19
|
+
|
|
20
|
+
readonly property string omarchyPath: Quickshell.env("OMARCHY_PATH")
|
|
21
|
+
readonly property string configHome: Quickshell.env("XDG_CONFIG_HOME") || (Quickshell.env("HOME") + "/.config")
|
|
22
|
+
|
|
23
|
+
readonly property string language: languageCode(languageFile.text())
|
|
24
|
+
readonly property var localeSettings: parseCatalog(registryFile.text())[root.language] || ({})
|
|
25
|
+
readonly property string formatLocale: localeSettings.formatLocale || "en-US"
|
|
26
|
+
// From the registry: how numbers are written and which way text runs.
|
|
27
|
+
readonly property string decimal: localeSettings.decimal || "."
|
|
28
|
+
readonly property string zeroDigit: localeSettings.zeroDigit || "0"
|
|
29
|
+
readonly property bool rightToLeft: localeSettings.direction === "rtl"
|
|
30
|
+
|
|
31
|
+
// Reading text() makes blockLoading take effect on the first lookup.
|
|
32
|
+
// These bindings also rebuild the maps when a watched catalog changes.
|
|
33
|
+
readonly property var englishStrings: parseCatalog(englishCatalogFile.text())
|
|
34
|
+
readonly property var languageStrings: parseCatalog(languageCatalogFile.text())
|
|
35
|
+
readonly property var strings: {
|
|
36
|
+
var merged = ({})
|
|
37
|
+
for (var k in root.englishStrings) merged[k] = root.englishStrings[k]
|
|
38
|
+
for (var k2 in root.languageStrings) merged[k2] = root.languageStrings[k2]
|
|
39
|
+
return merged
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The optional fallback is what imperative callers (the JS models) pass
|
|
43
|
+
// as their English text: for a key the catalogs do not carry, they keep
|
|
44
|
+
// sensible English instead of a raw key.
|
|
45
|
+
function t(key, fallback) {
|
|
46
|
+
var value = root.strings[key]
|
|
47
|
+
if (value && typeof value === "object") value = value.other
|
|
48
|
+
if (typeof value === "string" && value.length > 0) return value
|
|
49
|
+
return fallback !== undefined ? fallback : key
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// The form of a plural entry for count, by the language's plural rules
|
|
53
|
+
// (Plural.js). The English entry answers when the translation has none.
|
|
54
|
+
function tn(key, count, fallback) {
|
|
55
|
+
var value = Plural.pick(root.languageStrings[key], root.language, count)
|
|
56
|
+
if (typeof value !== "string" || value.length === 0) value = Plural.pick(root.englishStrings[key], "en", count)
|
|
57
|
+
if (typeof value === "string" && value.length > 0) return value
|
|
58
|
+
return fallback !== undefined ? fallback : key
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A number with the language's decimal separator and digits, ungrouped:
|
|
62
|
+
// formatNumber(13.14, 1) is "13,1" in Danish. Pass decimals to round;
|
|
63
|
+
// without them the value is written as it is.
|
|
64
|
+
function formatNumber(value, decimals) {
|
|
65
|
+
return Numbers.format(value, decimals, root.decimal, root.zeroDigit)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function parseCatalog(raw) {
|
|
69
|
+
try {
|
|
70
|
+
var parsed = JSON.parse(raw || "{}")
|
|
71
|
+
return (parsed && typeof parsed === "object" && !Array.isArray(parsed)) ? parsed : ({})
|
|
72
|
+
} catch (e) {
|
|
73
|
+
return ({})
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function languageCode(raw) {
|
|
78
|
+
var code = String(raw || "").trim()
|
|
79
|
+
if (!/^[a-z]{2,3}(-[A-Za-z]{2})?$/.test(code)) code = "en"
|
|
80
|
+
return code
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The catalogs are small local files, read synchronously so the first
|
|
84
|
+
// binding to call t() already gets the string rather than the raw key.
|
|
85
|
+
property FileView languageFile: FileView {
|
|
86
|
+
// OMARCHY_LANGUAGE_FILE overrides the location, as it does for
|
|
87
|
+
// omarchy-i18n, so tests can pin a language whatever the machine uses.
|
|
88
|
+
path: Quickshell.env("OMARCHY_LANGUAGE_FILE") || (root.configHome + "/omarchy/language")
|
|
89
|
+
watchChanges: true
|
|
90
|
+
printErrors: false
|
|
91
|
+
blockLoading: true
|
|
92
|
+
onFileChanged: reload()
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
property FileView englishCatalogFile: FileView {
|
|
96
|
+
path: root.omarchyPath + "/default/i18n/en/shell.json"
|
|
97
|
+
watchChanges: true
|
|
98
|
+
printErrors: false
|
|
99
|
+
blockLoading: true
|
|
100
|
+
onFileChanged: reload()
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
property FileView languageCatalogFile: FileView {
|
|
104
|
+
path: root.omarchyPath + "/default/i18n/" + root.language + "/shell.json"
|
|
105
|
+
watchChanges: true
|
|
106
|
+
printErrors: false
|
|
107
|
+
blockLoading: true
|
|
108
|
+
onFileChanged: reload()
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
property FileView registryFile: FileView {
|
|
112
|
+
path: root.omarchyPath + "/default/i18n/locales.json"
|
|
113
|
+
watchChanges: true
|
|
114
|
+
printErrors: false
|
|
115
|
+
blockLoading: true
|
|
116
|
+
onFileChanged: reload()
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
pragma Singleton
|
|
2
|
+
import QtQuick
|
|
3
|
+
import Quickshell
|
|
4
|
+
import Quickshell.Io
|
|
5
|
+
|
|
6
|
+
// Input devices arriving and leaving, which Hyprland raises no event for. Every
|
|
7
|
+
// device the kernel sees, from a USB keyboard to a Bluetooth one pairing, adds
|
|
8
|
+
// and removes its nodes under /dev/input, and udev records it under
|
|
9
|
+
// /run/udev/data once it has finished with it, which is when libinput hands it
|
|
10
|
+
// to Hyprland. One watch on both serves the whole shell instead of each bar
|
|
11
|
+
// asking Hyprland on a timer.
|
|
12
|
+
Singleton {
|
|
13
|
+
id: root
|
|
14
|
+
|
|
15
|
+
signal changed()
|
|
16
|
+
|
|
17
|
+
// Tests point this at a fixture root, the way OMARCHY_PROC_ROOT and
|
|
18
|
+
// OMARCHY_SYS_ROOT stand in for /proc and /sys.
|
|
19
|
+
readonly property string fixtureRoot: Quickshell.env("OMARCHY_INPUT_ROOT") || ""
|
|
20
|
+
readonly property string devDir: fixtureRoot + "/dev"
|
|
21
|
+
readonly property string inputDir: devDir + "/input"
|
|
22
|
+
readonly property string udevDir: fixtureRoot + "/run/udev/data"
|
|
23
|
+
|
|
24
|
+
// inotifywait is restarted when it ends. One that keeps ending at once (an
|
|
25
|
+
// exhausted inotify limit, say) is retried less and less often, down to once
|
|
26
|
+
// a minute, rather than given up on: nothing else would notice a device.
|
|
27
|
+
property real startedAt: 0
|
|
28
|
+
property int quickExits: 0
|
|
29
|
+
// Whether the watch has stayed up, which the keyboard widget falls back to
|
|
30
|
+
// asking on a timer without.
|
|
31
|
+
readonly property bool healthy: quickExits === 0
|
|
32
|
+
|
|
33
|
+
// /dev is watched beside /dev/input for one thing: /dev/input being created
|
|
34
|
+
// again after it went away with the last device, when the watch on the old
|
|
35
|
+
// directory is gone and has to be set up on the new one. udev's records for
|
|
36
|
+
// input devices are the c13: entries, character major 13.
|
|
37
|
+
Process {
|
|
38
|
+
id: watcher
|
|
39
|
+
command: ["bash", "-c",
|
|
40
|
+
"dirs=(\"$2\"); for dir in \"$1\" \"$3\"; do [[ -d $dir ]] && dirs+=(\"$dir\"); done; "
|
|
41
|
+
+ "exec inotifywait -m -q -e create,delete,delete_self,moved_to --format '%w|%e|%f' \"${dirs[@]}\"",
|
|
42
|
+
"input-devices", root.inputDir, root.devDir, root.udevDir]
|
|
43
|
+
running: true
|
|
44
|
+
// Whatever arrived or left while no watch was set up went unseen, so read
|
|
45
|
+
// the seat again once a watch is: at start, after a watch that had been
|
|
46
|
+
// up, and once a failing one has stayed up a second. A watch failing at
|
|
47
|
+
// once announces nothing, or each retry would ask Hyprland from every bar.
|
|
48
|
+
onRunningChanged: {
|
|
49
|
+
if (!running) return
|
|
50
|
+
root.startedAt = Date.now()
|
|
51
|
+
if (root.quickExits === 0) root.announce()
|
|
52
|
+
else recovered.restart()
|
|
53
|
+
}
|
|
54
|
+
stdout: SplitParser {
|
|
55
|
+
onRead: function(line) {
|
|
56
|
+
var fields = String(line).split("|")
|
|
57
|
+
var dir = fields[0].replace(/\/$/, "")
|
|
58
|
+
if (dir === root.devDir) {
|
|
59
|
+
if (fields[2] === "input" && fields[1].indexOf("CREATE") !== -1) {
|
|
60
|
+
watcher.running = false
|
|
61
|
+
root.announce()
|
|
62
|
+
}
|
|
63
|
+
} else if (dir === root.udevDir) {
|
|
64
|
+
if (String(fields[2]).indexOf("c13:") === 0) root.announce()
|
|
65
|
+
} else {
|
|
66
|
+
root.announce()
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
onExited: {
|
|
71
|
+
root.quickExits = Date.now() - root.startedAt < 1000 ? root.quickExits + 1 : 0
|
|
72
|
+
restart.interval = Math.min(60000, 1000 * Math.pow(2, Math.max(0, root.quickExits - 4)))
|
|
73
|
+
restart.start()
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// A device brings several nodes at once, so announce it once the burst has
|
|
78
|
+
// settled, and again a few seconds on in case udev's record of it was what
|
|
79
|
+
// lagged.
|
|
80
|
+
function announce() {
|
|
81
|
+
settle.restart()
|
|
82
|
+
followUp.restart()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
Timer {
|
|
86
|
+
id: settle
|
|
87
|
+
interval: 500
|
|
88
|
+
onTriggered: root.changed()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
Timer {
|
|
92
|
+
id: followUp
|
|
93
|
+
interval: 3000
|
|
94
|
+
onTriggered: root.changed()
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
Timer {
|
|
98
|
+
id: recovered
|
|
99
|
+
interval: 1000
|
|
100
|
+
onTriggered: {
|
|
101
|
+
if (!watcher.running) return
|
|
102
|
+
root.quickExits = 0
|
|
103
|
+
root.announce()
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
Timer {
|
|
108
|
+
id: restart
|
|
109
|
+
interval: 1000
|
|
110
|
+
onTriggered: watcher.running = true
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
pragma Singleton
|
|
2
|
+
import QtQuick
|
|
3
|
+
import Quickshell
|
|
4
|
+
import Quickshell.Io
|
|
5
|
+
|
|
6
|
+
Singleton {
|
|
7
|
+
id: root
|
|
8
|
+
property var state: ({})
|
|
9
|
+
|
|
10
|
+
function cycle(back) {
|
|
11
|
+
if (!watcher.running) return false
|
|
12
|
+
watcher.write(back ? "cycle back\n" : "cycle\n")
|
|
13
|
+
return true
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// One reader and pending selection for every monitor's keyboard widget.
|
|
17
|
+
Process {
|
|
18
|
+
id: watcher
|
|
19
|
+
command: ["/usr/bin/python3", Quickshell.env("OMARCHY_PATH") + "/default/input-methods/indicator.py"]
|
|
20
|
+
running: true
|
|
21
|
+
stdinEnabled: true
|
|
22
|
+
stdout: SplitParser {
|
|
23
|
+
onRead: data => {
|
|
24
|
+
try { root.state = JSON.parse(data) } catch (e) {}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
onExited: {
|
|
28
|
+
root.state = ({})
|
|
29
|
+
restart.restart()
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Timer {
|
|
34
|
+
id: restart
|
|
35
|
+
interval: 5000
|
|
36
|
+
onTriggered: watcher.running = true
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
pragma Singleton
|
|
2
|
+
import QtQuick
|
|
3
|
+
import Quickshell
|
|
4
|
+
import Quickshell.Io
|
|
5
|
+
|
|
6
|
+
// Every ShellIpc handler, so the shell can answer an omarchy-shell call over
|
|
7
|
+
// its own socket instead of through a qs ipc client started per call. It
|
|
8
|
+
// answers only what qs ipc would: the first live, enabled handler for a
|
|
9
|
+
// target, and only the functions that handler declares. Those are allowed by
|
|
10
|
+
// name, never inferred from what a function call happens to reach: QObject
|
|
11
|
+
// methods such as destroy() are callable but not enumerable.
|
|
12
|
+
Singleton {
|
|
13
|
+
id: root
|
|
14
|
+
|
|
15
|
+
property var handlers: []
|
|
16
|
+
|
|
17
|
+
// A bare handler's own functions (signals and hooks such as targetChanged),
|
|
18
|
+
// which qs ipc never exposes and neither may the socket.
|
|
19
|
+
readonly property var builtins: functionNames(bareHandler)
|
|
20
|
+
|
|
21
|
+
IpcHandler {
|
|
22
|
+
id: bareHandler
|
|
23
|
+
enabled: false
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function functionNames(object) {
|
|
27
|
+
var names = []
|
|
28
|
+
for (var key in object) {
|
|
29
|
+
if (typeof object[key] === "function") names.push(key)
|
|
30
|
+
}
|
|
31
|
+
return names
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function register(handler) {
|
|
35
|
+
if (handlers.indexOf(handler) === -1) handlers.push(handler)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function unregister(handler) {
|
|
39
|
+
var index = handlers.indexOf(handler)
|
|
40
|
+
if (index !== -1) handlers.splice(index, 1)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function handlerFor(target) {
|
|
44
|
+
for (var i = 0; i < handlers.length; i++) {
|
|
45
|
+
var handler = handlers[i]
|
|
46
|
+
if (handler && handler.enabled && handler.target === target) return handler
|
|
47
|
+
}
|
|
48
|
+
return null
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// { ran: true, output } once the function ran; { ran: false } when it did
|
|
52
|
+
// not (unknown target or function, wrong argument count), so the caller
|
|
53
|
+
// can ask qs ipc for its exact answer without running anything twice.
|
|
54
|
+
// The functions a handler declares: what it enumerates beyond a bare
|
|
55
|
+
// handler, less property change signals.
|
|
56
|
+
function declaredFunctions(handler) {
|
|
57
|
+
return functionNames(handler).filter(function(name) {
|
|
58
|
+
return builtins.indexOf(name) === -1 && !/Changed$/.test(name)
|
|
59
|
+
})
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function call(target, method, args) {
|
|
63
|
+
var handler = handlerFor(target)
|
|
64
|
+
if (!handler) return { ran: false }
|
|
65
|
+
if (declaredFunctions(handler).indexOf(method) === -1) return { ran: false }
|
|
66
|
+
if (handler[method].length !== args.length) return { ran: false }
|
|
67
|
+
|
|
68
|
+
var result
|
|
69
|
+
try {
|
|
70
|
+
result = handler[method].apply(handler, args)
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.warn("ipc " + target + " " + method + " failed: " + error)
|
|
73
|
+
return { ran: true, output: "" }
|
|
74
|
+
}
|
|
75
|
+
return { ran: true, output: result === undefined || result === null ? "" : String(result) }
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// A number written with a language's decimal separator and digits from the
|
|
2
|
+
// registry, ungrouped: format(13.14, 1, ",", "0") is "13,1". Without
|
|
3
|
+
// decimals the value is written as it is. default/i18n/plural.jq's
|
|
4
|
+
// localize_number does the same for omarchy-i18n.
|
|
5
|
+
function format(value, decimals, decimal, zeroDigit) {
|
|
6
|
+
var number = Number(value)
|
|
7
|
+
if (!isFinite(number)) return String(value)
|
|
8
|
+
var text = decimals === undefined ? String(number) : number.toFixed(decimals)
|
|
9
|
+
if (decimal && decimal !== ".") text = text.replace(".", decimal)
|
|
10
|
+
if (zeroDigit && zeroDigit !== "0") {
|
|
11
|
+
var zero = zeroDigit.charCodeAt(0)
|
|
12
|
+
text = text.replace(/[0-9]/g, function(digit) { return String.fromCharCode(zero + digit.charCodeAt(0) - 48) })
|
|
13
|
+
}
|
|
14
|
+
return text
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (typeof module !== "undefined") {
|
|
18
|
+
module.exports = { format: format }
|
|
19
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// CLDR cardinal plural categories for whole counts, per Omarchy language
|
|
2
|
+
// code. A plural catalog entry is an object keyed by these categories
|
|
3
|
+
// ({ "one": "%1 file", "other": "%1 files" }); every language needs "other",
|
|
4
|
+
// plus whichever categories its counts can reach. default/i18n/plural.jq
|
|
5
|
+
// holds the same rules for omarchy-i18n, and i18n-test.sh keeps the two
|
|
6
|
+
// in agreement.
|
|
7
|
+
|
|
8
|
+
function within(value, low, high) {
|
|
9
|
+
return value >= low && value <= high
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function category(code, count) {
|
|
13
|
+
var n = Math.abs(Math.trunc(Number(count) || 0))
|
|
14
|
+
var n10 = n % 10
|
|
15
|
+
var n100 = n % 100
|
|
16
|
+
var millions = n !== 0 && n % 1000000 === 0
|
|
17
|
+
|
|
18
|
+
switch (String(code || "")) {
|
|
19
|
+
case "ja": case "ko": case "zh-CN": case "zh-TW": case "th": case "vi": case "id": case "ms":
|
|
20
|
+
return "other"
|
|
21
|
+
case "hi": case "bn": case "fa": case "si":
|
|
22
|
+
return n <= 1 ? "one" : "other"
|
|
23
|
+
case "fr": case "pt-BR":
|
|
24
|
+
return n <= 1 ? "one" : millions ? "many" : "other"
|
|
25
|
+
case "ca": case "es-MX": case "it": case "pt":
|
|
26
|
+
return n === 1 ? "one" : millions ? "many" : "other"
|
|
27
|
+
case "fil":
|
|
28
|
+
return (n10 === 4 || n10 === 6 || n10 === 9) ? "other" : "one"
|
|
29
|
+
case "is":
|
|
30
|
+
return n10 === 1 && n100 !== 11 ? "one" : "other"
|
|
31
|
+
case "cs": case "sk":
|
|
32
|
+
return n === 1 ? "one" : within(n, 2, 4) ? "few" : "other"
|
|
33
|
+
case "pl":
|
|
34
|
+
if (n === 1) return "one"
|
|
35
|
+
return within(n10, 2, 4) && !within(n100, 12, 14) ? "few" : "many"
|
|
36
|
+
case "ru": case "uk":
|
|
37
|
+
if (n10 === 1 && n100 !== 11) return "one"
|
|
38
|
+
return within(n10, 2, 4) && !within(n100, 12, 14) ? "few" : "many"
|
|
39
|
+
case "hr": case "sr":
|
|
40
|
+
if (n10 === 1 && n100 !== 11) return "one"
|
|
41
|
+
return within(n10, 2, 4) && !within(n100, 12, 14) ? "few" : "other"
|
|
42
|
+
case "sl":
|
|
43
|
+
if (n100 === 1) return "one"
|
|
44
|
+
if (n100 === 2) return "two"
|
|
45
|
+
return within(n100, 3, 4) ? "few" : "other"
|
|
46
|
+
case "lt":
|
|
47
|
+
if (within(n100, 11, 19)) return "other"
|
|
48
|
+
return n10 === 1 ? "one" : n10 >= 2 ? "few" : "other"
|
|
49
|
+
case "lv":
|
|
50
|
+
if (n10 === 0 || within(n100, 11, 19)) return "zero"
|
|
51
|
+
return n10 === 1 ? "one" : "other"
|
|
52
|
+
case "ro":
|
|
53
|
+
if (n === 1) return "one"
|
|
54
|
+
return n === 0 || within(n100, 1, 19) ? "few" : "other"
|
|
55
|
+
case "ar":
|
|
56
|
+
if (n <= 2) return ["zero", "one", "two"][n]
|
|
57
|
+
return within(n100, 3, 10) ? "few" : within(n100, 11, 99) ? "many" : "other"
|
|
58
|
+
case "he":
|
|
59
|
+
return n === 1 ? "one" : n === 2 ? "two" : "other"
|
|
60
|
+
case "ga":
|
|
61
|
+
if (n <= 2) return n === 0 ? "other" : n === 1 ? "one" : "two"
|
|
62
|
+
return within(n, 3, 6) ? "few" : within(n, 7, 10) ? "many" : "other"
|
|
63
|
+
default:
|
|
64
|
+
return n === 1 ? "one" : "other"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
var ORDER = ["zero", "one", "two", "few", "many", "other"]
|
|
69
|
+
|
|
70
|
+
// The categories a translation of a plural entry must provide.
|
|
71
|
+
function categories(code) {
|
|
72
|
+
var seen = { other: true }
|
|
73
|
+
for (var n = 0; n <= 1000; n++) seen[category(code, n)] = true
|
|
74
|
+
seen[category(code, 1000000)] = true
|
|
75
|
+
return ORDER.filter(function(name) { return seen[name] })
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// The string for a count from a plural entry, or the entry itself when it
|
|
79
|
+
// is a plain string. A translation missing a category falls back to its
|
|
80
|
+
// "other" form.
|
|
81
|
+
function pick(entry, code, count) {
|
|
82
|
+
if (typeof entry === "string") return entry
|
|
83
|
+
if (!entry || typeof entry !== "object") return undefined
|
|
84
|
+
var form = entry[category(code, count)]
|
|
85
|
+
if (typeof form === "string" && form.length > 0) return form
|
|
86
|
+
return typeof entry.other === "string" ? entry.other : undefined
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (typeof module !== "undefined") {
|
|
90
|
+
module.exports = { category: category, categories: categories, pick: pick }
|
|
91
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import Quickshell.Io
|
|
3
|
+
|
|
4
|
+
// An IpcHandler the shell can also answer over its own socket (see
|
|
5
|
+
// IpcRegistry), so omarchy-shell reaches it without a qs ipc client. qs ipc
|
|
6
|
+
// still reaches it as before.
|
|
7
|
+
IpcHandler {
|
|
8
|
+
id: handler
|
|
9
|
+
|
|
10
|
+
Component.onCompleted: IpcRegistry.register(handler)
|
|
11
|
+
Component.onDestruction: IpcRegistry.unregister(handler)
|
|
12
|
+
}
|