Showing preview only (4,401K chars total). Download the full file or copy to clipboard to get everything.
Repository: eythaann/Seelen-UI
Branch: master
Commit: c00d75dcbb8f
Files: 1904
Total size: 3.8 MB
Directory structure:
gitextract_5t012xim/
├── .cargo/
│ └── config.toml
├── .cert/
│ ├── Seelen.cer
│ ├── Seelen.pfx
│ ├── Seelen.pfx.pwd
│ └── readme.md
├── .commitlintrc.yml
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── actions/
│ │ ├── generate-update-manifest/
│ │ │ └── action.yml
│ │ └── setup/
│ │ └── action.yml
│ ├── dependabot.yml
│ └── workflows/
│ ├── ci.yml
│ ├── dependabot-automerge.yml
│ ├── discord-notify.yml
│ ├── msix.yml
│ ├── nightly.yml
│ ├── publish-core.yml
│ └── release.yml
├── .gitignore
├── .npmrc
├── AGENTS.md
├── CLA.md
├── CODE_OF_CONDUCT
├── CONTRIBUTING
├── Cargo.toml
├── LICENSE
├── README.md
├── SECURITY.md
├── changelog.md
├── crowdin.yml
├── deno.json
├── lefthook.yml
├── libs/
│ ├── core/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── deno.json
│ │ ├── mocks/
│ │ │ └── themes/
│ │ │ ├── v2.3.0.yml
│ │ │ └── v2.3.12.yml
│ │ ├── mod.ts
│ │ ├── readme.md
│ │ ├── scripts/
│ │ │ ├── build_npm.ts
│ │ │ └── rust_bindings.ts
│ │ └── src/
│ │ ├── constants/
│ │ │ ├── mod.rs
│ │ │ └── mod.ts
│ │ ├── error.rs
│ │ ├── handlers/
│ │ │ ├── commands.rs
│ │ │ ├── commands.ts
│ │ │ ├── events.rs
│ │ │ ├── events.ts
│ │ │ ├── mod.rs
│ │ │ └── mod.ts
│ │ ├── lib.rs
│ │ ├── lib.test.ts
│ │ ├── lib.ts
│ │ ├── re-exports/
│ │ │ └── tauri.ts
│ │ ├── rect.rs
│ │ ├── resource/
│ │ │ ├── file.rs
│ │ │ ├── interface.rs
│ │ │ ├── metadata.rs
│ │ │ ├── mod.rs
│ │ │ ├── mod.ts
│ │ │ ├── resource_id.rs
│ │ │ └── yaml_ext.rs
│ │ ├── state/
│ │ │ ├── icon_pack.rs
│ │ │ ├── icon_pack.test.ts
│ │ │ ├── icon_pack.ts
│ │ │ ├── mod.rs
│ │ │ ├── mod.ts
│ │ │ ├── placeholder.rs
│ │ │ ├── plugin/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── mod.ts
│ │ │ │ └── value.rs
│ │ │ ├── popups/
│ │ │ │ └── mod.rs
│ │ │ ├── settings/
│ │ │ │ ├── by_monitor.rs
│ │ │ │ ├── by_theme.rs
│ │ │ │ ├── by_wallpaper.rs
│ │ │ │ ├── by_widget.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── mod.ts
│ │ │ │ ├── settings_by_app.rs
│ │ │ │ └── shortcuts.rs
│ │ │ ├── theme/
│ │ │ │ ├── config.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── mod.ts
│ │ │ │ ├── tests.rs
│ │ │ │ └── theming.ts
│ │ │ ├── wallpaper/
│ │ │ │ ├── mod.rs
│ │ │ │ └── mod.ts
│ │ │ ├── weg_items.rs
│ │ │ ├── widget/
│ │ │ │ ├── context_menu.rs
│ │ │ │ ├── declaration.rs
│ │ │ │ ├── interfaces.ts
│ │ │ │ ├── mod.rs
│ │ │ │ ├── mod.ts
│ │ │ │ ├── performance.ts
│ │ │ │ ├── positioning.ts
│ │ │ │ └── sizing.ts
│ │ │ ├── wm_layout.rs
│ │ │ └── workspaces/
│ │ │ └── mod.rs
│ │ ├── system_state/
│ │ │ ├── bluetooth/
│ │ │ │ ├── appearance_values.yml
│ │ │ │ ├── build_low_energy_enums.rs
│ │ │ │ ├── enums.rs
│ │ │ │ ├── low_energy_enums.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── mod.ts
│ │ │ ├── components.rs
│ │ │ ├── language.rs
│ │ │ ├── language.ts
│ │ │ ├── media.rs
│ │ │ ├── mod.rs
│ │ │ ├── mod.ts
│ │ │ ├── monitors.rs
│ │ │ ├── monitors.ts
│ │ │ ├── network/
│ │ │ │ └── mod.rs
│ │ │ ├── notification.rs
│ │ │ ├── power.rs
│ │ │ ├── radios/
│ │ │ │ └── mod.rs
│ │ │ ├── trash_bin.rs
│ │ │ ├── tray.rs
│ │ │ ├── ui_colors.rs
│ │ │ ├── ui_colors.ts
│ │ │ ├── user.rs
│ │ │ ├── user.ts
│ │ │ ├── user_apps/
│ │ │ │ └── mod.rs
│ │ │ └── win_explorer.rs
│ │ └── utils/
│ │ ├── DOM.ts
│ │ ├── List.ts
│ │ ├── State.ts
│ │ ├── async.ts
│ │ ├── mod.rs
│ │ └── mod.ts
│ ├── positioning/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── api/
│ │ │ ├── mod.rs
│ │ │ └── windows.rs
│ │ ├── easings.rs
│ │ ├── error.rs
│ │ ├── lib.rs
│ │ ├── minimization.rs
│ │ └── rect.rs
│ ├── slu-ipc/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── app.rs
│ │ ├── common.rs
│ │ ├── error.rs
│ │ ├── lib.rs
│ │ ├── messages.rs
│ │ └── service.rs
│ ├── ui/
│ │ ├── icons.ts
│ │ ├── react/
│ │ │ ├── components/
│ │ │ │ ├── BackgroundByLayers/
│ │ │ │ │ ├── infra.module.css
│ │ │ │ │ └── infra.tsx
│ │ │ │ ├── Icon/
│ │ │ │ │ ├── FileIcon.tsx
│ │ │ │ │ ├── MissingIcon.tsx
│ │ │ │ │ ├── SpecificIcon.tsx
│ │ │ │ │ ├── common.ts
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── InlineSvg/
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ResourceText/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Wallpaper/
│ │ │ │ ├── components/
│ │ │ │ │ ├── ImageWallpaper.tsx
│ │ │ │ │ ├── ThemedWallpaper.tsx
│ │ │ │ │ └── VideoWallpaper.tsx
│ │ │ │ ├── index.module.css
│ │ │ │ ├── index.tsx
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ └── utils/
│ │ │ ├── DndKit/
│ │ │ │ └── utils.ts
│ │ │ ├── LazySignal.ts
│ │ │ ├── hooks.ts
│ │ │ ├── index.ts
│ │ │ ├── layered.ts
│ │ │ ├── signals.ts
│ │ │ └── styling.ts
│ │ ├── svelte/
│ │ │ ├── components/
│ │ │ │ ├── BackgroundByLayers/
│ │ │ │ │ ├── BackgroundByLayers.svelte
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Icon/
│ │ │ │ │ ├── FileIcon.svelte
│ │ │ │ │ ├── Icon.svelte
│ │ │ │ │ ├── InlineSVG.svelte
│ │ │ │ │ ├── InlineSVGState.svelte.ts
│ │ │ │ │ ├── MissingIcon.svelte
│ │ │ │ │ ├── SpecificIcon.svelte
│ │ │ │ │ ├── common.svelte.ts
│ │ │ │ │ └── index.ts
│ │ │ │ └── Wallpaper/
│ │ │ │ ├── Wallpaper.svelte
│ │ │ │ ├── components/
│ │ │ │ │ ├── ImageWallpaper.svelte
│ │ │ │ │ ├── ThemedWallpaper.svelte
│ │ │ │ │ └── VideoWallpaper.svelte
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── runes/
│ │ │ │ └── DarkMode.svelte.ts
│ │ │ └── utils/
│ │ │ ├── LazyRune.svelte.ts
│ │ │ ├── PersistentRune.svelte.ts
│ │ │ ├── hooks.svelte.ts
│ │ │ ├── i18n.ts
│ │ │ └── index.ts
│ │ └── utils.ts
│ ├── utils/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── checksums.rs
│ │ ├── debounce.rs
│ │ ├── lib.rs
│ │ ├── signature.rs
│ │ └── throttle.rs
│ └── widgets-shared/
│ └── styles/
│ ├── RichText.css
│ ├── colors.css
│ ├── reset.css
│ └── spacings.css
├── package.json
├── rust-toolchain.toml
├── scripts/
│ ├── PalletteGenerator.ts
│ ├── SetFixedRuntime.ps1
│ ├── SubmitToStore.ps1
│ ├── UpdateTauri.ts
│ ├── build/
│ │ ├── README.md
│ │ ├── builders/
│ │ │ ├── react.ts
│ │ │ ├── svelte.ts
│ │ │ └── vanilla.ts
│ │ ├── config.ts
│ │ ├── plugins/
│ │ │ └── index.ts
│ │ ├── server.ts
│ │ ├── steps/
│ │ │ ├── cleanup.ts
│ │ │ ├── discover.ts
│ │ │ └── icons.ts
│ │ └── types.ts
│ ├── build.ts
│ ├── bundle.msix.ts
│ ├── clean.ps1
│ ├── submission.json
│ ├── translate/
│ │ ├── mod.ps1
│ │ └── mod.ts
│ └── versionish.ts
├── src/
│ ├── Cargo.toml
│ ├── background/
│ │ ├── app.rs
│ │ ├── app_instance.rs
│ │ ├── cli/
│ │ │ ├── application/
│ │ │ │ ├── art.rs
│ │ │ │ ├── debugger.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── uri.rs
│ │ │ │ └── win32.rs
│ │ │ ├── infrastructure.rs
│ │ │ ├── mod.rs
│ │ │ ├── self_pipe.rs
│ │ │ └── svc_pipe.rs
│ │ ├── error.rs
│ │ ├── exposed.rs
│ │ ├── hook.rs
│ │ ├── i18n/
│ │ │ ├── af.yml
│ │ │ ├── am.yml
│ │ │ ├── ar.yml
│ │ │ ├── az.yml
│ │ │ ├── bg.yml
│ │ │ ├── bn.yml
│ │ │ ├── bs.yml
│ │ │ ├── ca.yml
│ │ │ ├── cs.yml
│ │ │ ├── cy.yml
│ │ │ ├── da.yml
│ │ │ ├── de.yml
│ │ │ ├── el.yml
│ │ │ ├── en.yml
│ │ │ ├── es.yml
│ │ │ ├── et.yml
│ │ │ ├── eu.yml
│ │ │ ├── fa.yml
│ │ │ ├── fi.yml
│ │ │ ├── fr.yml
│ │ │ ├── gu.yml
│ │ │ ├── he.yml
│ │ │ ├── hi.yml
│ │ │ ├── hr.yml
│ │ │ ├── hu.yml
│ │ │ ├── hy.yml
│ │ │ ├── id.yml
│ │ │ ├── is.yml
│ │ │ ├── it.yml
│ │ │ ├── ja.yml
│ │ │ ├── ka.yml
│ │ │ ├── km.yml
│ │ │ ├── ko.yml
│ │ │ ├── ku.yml
│ │ │ ├── lb.yml
│ │ │ ├── lo.yml
│ │ │ ├── lt.yml
│ │ │ ├── lv.yml
│ │ │ ├── mk.yml
│ │ │ ├── mn.yml
│ │ │ ├── ms.yml
│ │ │ ├── mt.yml
│ │ │ ├── ne.yml
│ │ │ ├── nl.yml
│ │ │ ├── no.yml
│ │ │ ├── pa.yml
│ │ │ ├── pl.yml
│ │ │ ├── ps.yml
│ │ │ ├── pt-BR.yml
│ │ │ ├── pt-PT.yml
│ │ │ ├── ro.yml
│ │ │ ├── ru.yml
│ │ │ ├── si.yml
│ │ │ ├── sk.yml
│ │ │ ├── so.yml
│ │ │ ├── sr.yml
│ │ │ ├── sv.yml
│ │ │ ├── sw.yml
│ │ │ ├── ta.yml
│ │ │ ├── te.yml
│ │ │ ├── tg.yml
│ │ │ ├── th.yml
│ │ │ ├── tl.yml
│ │ │ ├── tr.yml
│ │ │ ├── uk.yml
│ │ │ ├── ur.yml
│ │ │ ├── uz.yml
│ │ │ ├── vi.yml
│ │ │ ├── yo.yml
│ │ │ ├── zh-CN.yml
│ │ │ ├── zh-TW.yml
│ │ │ └── zu.yml
│ │ ├── logger.rs
│ │ ├── main.rs
│ │ ├── migrations.rs
│ │ ├── modules/
│ │ │ ├── apps/
│ │ │ │ ├── application/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── msix.rs
│ │ │ │ │ ├── msix_manifest.rs
│ │ │ │ │ ├── previews.rs
│ │ │ │ │ └── windows.rs
│ │ │ │ ├── infrastructure.rs
│ │ │ │ └── mod.rs
│ │ │ ├── media/
│ │ │ │ ├── devices/
│ │ │ │ │ ├── application.rs
│ │ │ │ │ ├── domain.rs
│ │ │ │ │ ├── infrastructure.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── players/
│ │ │ │ │ ├── application.rs
│ │ │ │ │ ├── domain.rs
│ │ │ │ │ ├── infrastructure.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ └── readme.md
│ │ │ ├── mod.rs
│ │ │ ├── monitors/
│ │ │ │ ├── application.rs
│ │ │ │ ├── brightness/
│ │ │ │ │ ├── application.rs
│ │ │ │ │ ├── domain.rs
│ │ │ │ │ ├── infrastructure.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── domain.rs
│ │ │ │ ├── infrastructure.rs
│ │ │ │ └── mod.rs
│ │ │ ├── network/
│ │ │ │ ├── application/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── passwordless_profile.template.xml
│ │ │ │ │ ├── profile.template.xml
│ │ │ │ │ ├── profiles.ps1
│ │ │ │ │ ├── scanner.rs
│ │ │ │ │ └── v2.rs
│ │ │ │ ├── domain/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── types.rs
│ │ │ │ ├── infrastructure.rs
│ │ │ │ └── mod.rs
│ │ │ ├── notifications/
│ │ │ │ ├── application.rs
│ │ │ │ ├── domain.rs
│ │ │ │ ├── infrastructure.rs
│ │ │ │ └── mod.rs
│ │ │ ├── power/
│ │ │ │ ├── application.rs
│ │ │ │ ├── domain.rs
│ │ │ │ ├── infrastructure.rs
│ │ │ │ └── mod.rs
│ │ │ ├── radios/
│ │ │ │ ├── bluetooth/
│ │ │ │ │ ├── classic.rs
│ │ │ │ │ ├── handlers.rs
│ │ │ │ │ ├── low_energy.rs
│ │ │ │ │ ├── manager.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── device.rs
│ │ │ │ ├── handlers.rs
│ │ │ │ ├── manager.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── wifi/
│ │ │ │ └── mod.rs
│ │ │ ├── start/
│ │ │ │ ├── application.rs
│ │ │ │ ├── domain.rs
│ │ │ │ ├── infrastructure.rs
│ │ │ │ └── mod.rs
│ │ │ ├── system/
│ │ │ │ ├── mod.rs
│ │ │ │ └── tauri.rs
│ │ │ ├── system_settings/
│ │ │ │ ├── application.rs
│ │ │ │ ├── domain.rs
│ │ │ │ ├── infrastructure.rs
│ │ │ │ ├── language/
│ │ │ │ │ ├── application.rs
│ │ │ │ │ ├── domain.rs
│ │ │ │ │ ├── infrastructure.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ └── mod.rs
│ │ │ ├── system_tray/
│ │ │ │ ├── application/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── tray_hook_loader.rs
│ │ │ │ │ ├── tray_icon.rs
│ │ │ │ │ └── util.rs
│ │ │ │ ├── domain.rs
│ │ │ │ ├── infrastructure.rs
│ │ │ │ └── mod.rs
│ │ │ ├── trash_bin/
│ │ │ │ ├── application.rs
│ │ │ │ ├── infrastructure.rs
│ │ │ │ └── mod.rs
│ │ │ └── user/
│ │ │ ├── application.rs
│ │ │ ├── domain.rs
│ │ │ ├── infrastructure.rs
│ │ │ └── mod.rs
│ │ ├── resources/
│ │ │ ├── cli.rs
│ │ │ ├── commands.rs
│ │ │ ├── emitters.rs
│ │ │ ├── mod.rs
│ │ │ └── system_icon_pack.rs
│ │ ├── state/
│ │ │ ├── application/
│ │ │ │ ├── apps_config.rs
│ │ │ │ ├── icons.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── performance.rs
│ │ │ │ ├── settings.rs
│ │ │ │ ├── toolbar_items.rs
│ │ │ │ └── weg_items.rs
│ │ │ ├── domain/
│ │ │ │ └── mod.rs
│ │ │ ├── infrastructure.rs
│ │ │ └── mod.rs
│ │ ├── tauri_context.rs
│ │ ├── tauri_plugins.rs
│ │ ├── telemetry.rs
│ │ ├── utils/
│ │ │ ├── constants.rs
│ │ │ ├── discord.rs
│ │ │ ├── icon_extractor/
│ │ │ │ ├── mod.rs
│ │ │ │ └── queue.rs
│ │ │ ├── integrity/
│ │ │ │ ├── checksums.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── webview.rs
│ │ │ ├── lock_free/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── sync_hash_map.rs
│ │ │ │ ├── sync_vec.rs
│ │ │ │ └── traced_mutex.rs
│ │ │ ├── mod.rs
│ │ │ ├── pwsh.rs
│ │ │ ├── updater.rs
│ │ │ ├── virtual_desktop.rs
│ │ │ └── winver.rs
│ │ ├── virtual_desktops/
│ │ │ ├── cli.rs
│ │ │ ├── events.rs
│ │ │ ├── handlers.rs
│ │ │ ├── mod.rs
│ │ │ └── wallpapers.rs
│ │ ├── widgets/
│ │ │ ├── cli.rs
│ │ │ ├── loader.rs
│ │ │ ├── manager.rs
│ │ │ ├── mod.rs
│ │ │ ├── permissions.rs
│ │ │ ├── popups/
│ │ │ │ ├── cli.rs
│ │ │ │ ├── handlers.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── shortcut_registering.rs
│ │ │ ├── task_switcher/
│ │ │ │ ├── cli.rs
│ │ │ │ └── mod.rs
│ │ │ ├── toolbar/
│ │ │ │ ├── hook.rs
│ │ │ │ └── mod.rs
│ │ │ ├── wallpaper_manager/
│ │ │ │ ├── cli.rs
│ │ │ │ ├── hook.rs
│ │ │ │ └── mod.rs
│ │ │ ├── webview.rs
│ │ │ ├── weg/
│ │ │ │ ├── cli.rs
│ │ │ │ ├── handler.rs
│ │ │ │ ├── hook.rs
│ │ │ │ ├── instance.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── weg_items_impl.rs
│ │ │ └── window_manager/
│ │ │ ├── cli.rs
│ │ │ ├── handler.rs
│ │ │ ├── hook.rs
│ │ │ ├── instance.rs
│ │ │ ├── mod.rs
│ │ │ └── state/
│ │ │ ├── mod.rs
│ │ │ └── node_ext.rs
│ │ └── windows_api/
│ │ ├── app_bar.rs
│ │ ├── com.rs
│ │ ├── devices.rs
│ │ ├── event_window.rs
│ │ ├── hdc.rs
│ │ ├── input.rs
│ │ ├── iterator.rs
│ │ ├── mod.rs
│ │ ├── monitor/
│ │ │ ├── brightness.rs
│ │ │ └── mod.rs
│ │ ├── process.rs
│ │ ├── string_utils.rs
│ │ ├── types.rs
│ │ ├── undocumented/
│ │ │ ├── audio_policy_config.rs
│ │ │ └── mod.rs
│ │ └── window/
│ │ ├── cache.rs
│ │ ├── event.rs
│ │ └── mod.rs
│ ├── build.rs
│ ├── capabilities/
│ │ ├── general.json
│ │ ├── general_window.json
│ │ └── settings_widget.json
│ ├── hook_dll/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── service/
│ │ ├── app_management.rs
│ │ ├── cli/
│ │ │ ├── mod.rs
│ │ │ └── processing.rs
│ │ ├── enviroment.rs
│ │ ├── error.rs
│ │ ├── hotkeys.rs
│ │ ├── logger.rs
│ │ ├── main.rs
│ │ ├── shutdown.rs
│ │ ├── string_utils.rs
│ │ ├── task_scheduler.rs
│ │ └── windows_api/
│ │ ├── app_bar.rs
│ │ ├── com.rs
│ │ ├── iterator.rs
│ │ └── mod.rs
│ ├── static/
│ │ ├── apps_templates/
│ │ │ ├── adobe.yml
│ │ │ ├── browser.yml
│ │ │ ├── core.yml
│ │ │ ├── development.yml
│ │ │ ├── gaming.yml
│ │ │ ├── password_managers.yml
│ │ │ ├── system.yml
│ │ │ └── video-and-streaming.yml
│ │ ├── plugins/
│ │ │ ├── tb_cpu_usage/
│ │ │ │ ├── i18n/
│ │ │ │ │ └── display_name.yml
│ │ │ │ ├── metadata.yml
│ │ │ │ └── plugin/
│ │ │ │ └── template.js
│ │ │ ├── tb_default_focused_app.yml
│ │ │ ├── tb_default_focused_app_title.yml
│ │ │ ├── tb_default_power/
│ │ │ │ ├── i18n/
│ │ │ │ │ ├── description.yml
│ │ │ │ │ └── display_name.yml
│ │ │ │ ├── mod.yml
│ │ │ │ └── plugin/
│ │ │ │ ├── template.js
│ │ │ │ └── tooltip.js
│ │ │ ├── tb_disk_usage/
│ │ │ │ ├── i18n/
│ │ │ │ │ └── display_name.yml
│ │ │ │ ├── metadata.yml
│ │ │ │ └── plugin/
│ │ │ │ ├── template.js
│ │ │ │ └── tooltip.js
│ │ │ ├── tb_memory_usage/
│ │ │ │ ├── i18n/
│ │ │ │ │ └── display_name.yml
│ │ │ │ ├── metadata.yml
│ │ │ │ └── plugin/
│ │ │ │ └── template.js
│ │ │ ├── tb_network_usage/
│ │ │ │ ├── i18n/
│ │ │ │ │ └── display_name.yml
│ │ │ │ ├── metadata.yml
│ │ │ │ └── plugin/
│ │ │ │ └── template.js
│ │ │ ├── tb_workspaces_dotted/
│ │ │ │ ├── i18n/
│ │ │ │ │ └── display_name.yml
│ │ │ │ ├── metadata.yml
│ │ │ │ └── plugin/
│ │ │ │ └── template.js
│ │ │ ├── tb_workspaces_named/
│ │ │ │ ├── i18n/
│ │ │ │ │ └── display_name.yml
│ │ │ │ ├── metadata.yml
│ │ │ │ └── plugin/
│ │ │ │ └── template.js
│ │ │ ├── tb_workspaces_numbered/
│ │ │ │ ├── i18n/
│ │ │ │ │ └── display_name.yml
│ │ │ │ ├── metadata.yml
│ │ │ │ └── plugin/
│ │ │ │ └── template.js
│ │ │ ├── wm_bsp.yml
│ │ │ ├── wm_grid.yml
│ │ │ ├── wm_tall.yml
│ │ │ └── wm_wide.yml
│ │ ├── readme
│ │ ├── themes/
│ │ │ ├── animated-start-icon/
│ │ │ │ ├── metadata.yml
│ │ │ │ └── seelen/
│ │ │ │ └── weg.scss
│ │ │ ├── bubbles/
│ │ │ │ ├── i18n/
│ │ │ │ │ ├── description.yml
│ │ │ │ │ └── display_name.yml
│ │ │ │ ├── mod.yml
│ │ │ │ └── styles/
│ │ │ │ └── toolbar.css
│ │ │ └── default/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ ├── shared/
│ │ │ │ ├── buttons.scss
│ │ │ │ ├── index.scss
│ │ │ │ └── inputs.scss
│ │ │ └── styles/
│ │ │ ├── apps-menu.scss
│ │ │ ├── bluetooth-popup.scss
│ │ │ ├── calendar-popup.scss
│ │ │ ├── context-menu.scss
│ │ │ ├── fancy-toolbar.scss
│ │ │ ├── flyouts.css
│ │ │ ├── keyboard-selector.scss
│ │ │ ├── media-popup.scss
│ │ │ ├── network-popup.scss
│ │ │ ├── notifications.scss
│ │ │ ├── power-menu.scss
│ │ │ ├── quick-settings.scss
│ │ │ ├── task-switcher.scss
│ │ │ ├── tray-menu.scss
│ │ │ ├── user-menu.scss
│ │ │ ├── wallpaper-manager.css
│ │ │ ├── weg.css
│ │ │ ├── window-manager.css
│ │ │ └── workspaces-viewer.scss
│ │ └── widgets/
│ │ ├── apps-menu/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ ├── bluetooth-popup/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── calendar-popup/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── context-menu/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ ├── flyouts/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ ├── keyboard-selector/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── media-popup/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── network-popup/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── notifications/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── popup/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ ├── power-menu/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── quick-settings/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── settings/
│ │ │ ├── i18n/
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ ├── system-tray/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── task-switcher/
│ │ │ ├── i18n/
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ ├── toolbar/
│ │ │ ├── i18n/
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ ├── user/
│ │ │ ├── i18n/
│ │ │ │ ├── description.yml
│ │ │ │ └── display_name.yml
│ │ │ ├── metadata.yml
│ │ │ └── toolbar-plugin.yml
│ │ ├── wallpaper-manager/
│ │ │ ├── i18n/
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ ├── weg/
│ │ │ ├── i18n/
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ ├── window-manager/
│ │ │ ├── i18n/
│ │ │ │ └── display_name.yml
│ │ │ └── metadata.yml
│ │ └── workspaces-viewer/
│ │ ├── i18n/
│ │ │ └── display_name.yml
│ │ └── metadata.yml
│ ├── tauri.conf.json
│ ├── templates/
│ │ ├── AppxManifest.xml
│ │ ├── installer-hooks.nsh
│ │ └── installer.nsi
│ └── ui/
│ ├── globals.d.ts
│ ├── react/
│ │ ├── popup/
│ │ │ ├── app.tsx
│ │ │ ├── global.css
│ │ │ ├── index.tsx
│ │ │ └── public/
│ │ │ └── index.html
│ │ ├── settings/
│ │ │ ├── app.tsx
│ │ │ ├── components/
│ │ │ │ ├── SettingsBox/
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── SortableSelector/
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ThumbnailGeneratorModal/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── thumbnailGenerator.ts
│ │ │ │ │ └── videoThumbnail.ts
│ │ │ │ ├── WelcomeModal/
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── infra.tsx
│ │ │ │ ├── header/
│ │ │ │ │ ├── ExtraInfo.tsx
│ │ │ │ │ ├── UpdateButton.tsx
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── layout/
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── monitor/
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ └── navigation/
│ │ │ │ ├── index.module.css
│ │ │ │ ├── index.tsx
│ │ │ │ └── routes.tsx
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.tsx
│ │ │ ├── modules/
│ │ │ │ ├── ByMonitor/
│ │ │ │ │ └── infra/
│ │ │ │ │ ├── WallpaperSettingsModal.tsx
│ │ │ │ │ ├── WidgetSettingsModal.tsx
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Home/
│ │ │ │ │ ├── MiniStore.module.css
│ │ │ │ │ ├── MiniStore.tsx
│ │ │ │ │ ├── News.module.css
│ │ │ │ │ ├── News.tsx
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── IconPackEditor/
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Wall/
│ │ │ │ │ ├── WallpaperList.tsx
│ │ │ │ │ ├── application.ts
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── infra.tsx
│ │ │ │ ├── WindowManager/
│ │ │ │ │ ├── application.ts
│ │ │ │ │ ├── border/
│ │ │ │ │ │ ├── application.ts
│ │ │ │ │ │ └── infra.tsx
│ │ │ │ │ └── main/
│ │ │ │ │ └── infra/
│ │ │ │ │ ├── Animations.tsx
│ │ │ │ │ ├── GlobalPaddings.tsx
│ │ │ │ │ ├── Others.tsx
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── appsConfigurations/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ ├── default.ts
│ │ │ │ │ │ ├── filters.ts
│ │ │ │ │ │ └── reducer.ts
│ │ │ │ │ ├── domain.ts
│ │ │ │ │ └── infra/
│ │ │ │ │ ├── EditModal.tsx
│ │ │ │ │ ├── Identifier.module.css
│ │ │ │ │ ├── Identifier.tsx
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── infra.tsx
│ │ │ │ ├── developer/
│ │ │ │ │ ├── application.ts
│ │ │ │ │ └── infra.tsx
│ │ │ │ ├── extras/
│ │ │ │ │ ├── application.ts
│ │ │ │ │ ├── infra.module.css
│ │ │ │ │ └── infrastructure.tsx
│ │ │ │ ├── fancyToolbar/
│ │ │ │ │ ├── application.ts
│ │ │ │ │ └── infra.tsx
│ │ │ │ ├── general/
│ │ │ │ │ ├── application.ts
│ │ │ │ │ └── infra/
│ │ │ │ │ ├── Colors.tsx
│ │ │ │ │ ├── Performance.tsx
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── resources/
│ │ │ │ │ ├── IconPacks.tsx
│ │ │ │ │ ├── Plugins.tsx
│ │ │ │ │ ├── ResourceCard.tsx
│ │ │ │ │ ├── SoundPacks.tsx
│ │ │ │ │ ├── Theme/
│ │ │ │ │ │ ├── AllView.tsx
│ │ │ │ │ │ ├── View.tsx
│ │ │ │ │ │ ├── application.ts
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ ├── ThemeConfigDefinition.tsx
│ │ │ │ │ │ │ └── ThemeSetting.tsx
│ │ │ │ │ │ ├── constants.ts
│ │ │ │ │ │ └── hooks/
│ │ │ │ │ │ └── useThemeVariable.ts
│ │ │ │ │ ├── Wallpapers/
│ │ │ │ │ │ ├── AllView.tsx
│ │ │ │ │ │ ├── View.module.css
│ │ │ │ │ │ ├── View.tsx
│ │ │ │ │ │ └── application.ts
│ │ │ │ │ ├── Widget/
│ │ │ │ │ │ ├── AllView.tsx
│ │ │ │ │ │ ├── ConfigRenderer.tsx
│ │ │ │ │ │ ├── InstanceSelector.tsx
│ │ │ │ │ │ ├── View.tsx
│ │ │ │ │ │ └── application.ts
│ │ │ │ │ ├── infra.module.css
│ │ │ │ │ └── infra.tsx
│ │ │ │ ├── seelenweg/
│ │ │ │ │ ├── application.ts
│ │ │ │ │ └── infra.tsx
│ │ │ │ ├── shared/
│ │ │ │ │ ├── config/
│ │ │ │ │ │ └── infra.ts
│ │ │ │ │ ├── signals.ts
│ │ │ │ │ ├── tauri/
│ │ │ │ │ │ └── infra.ts
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── app.ts
│ │ │ │ │ └── domain.ts
│ │ │ │ └── shortcuts/
│ │ │ │ ├── application.ts
│ │ │ │ └── infrastructure.tsx
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ ├── router.tsx
│ │ │ ├── state/
│ │ │ │ ├── mod.ts
│ │ │ │ ├── resources.ts
│ │ │ │ └── system.ts
│ │ │ └── styles/
│ │ │ ├── global.css
│ │ │ └── variables.css
│ │ ├── toolbar/
│ │ │ ├── app.tsx
│ │ │ ├── components/
│ │ │ │ └── Error/
│ │ │ │ ├── index.module.css
│ │ │ │ └── index.tsx
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.tsx
│ │ │ ├── modules/
│ │ │ │ ├── item/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ ├── actionEvaluator.ts
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── scope.ts
│ │ │ │ │ │ │ ├── useItemScope.ts
│ │ │ │ │ │ │ └── useRemoteData.ts
│ │ │ │ │ │ └── services/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── widgetTrigger.ts
│ │ │ │ │ ├── domain/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ └── infra/
│ │ │ │ │ ├── ContextMenu.tsx
│ │ │ │ │ ├── EvaluatedComponents.tsx
│ │ │ │ │ └── infra.tsx
│ │ │ │ ├── main/
│ │ │ │ │ ├── ContextMenu.tsx
│ │ │ │ │ ├── CornerAction.tsx
│ │ │ │ │ ├── ItemsContainer.tsx
│ │ │ │ │ └── Toolbar.tsx
│ │ │ │ └── shared/
│ │ │ │ ├── state/
│ │ │ │ │ ├── default.ts
│ │ │ │ │ ├── items.ts
│ │ │ │ │ ├── lazy.ts
│ │ │ │ │ ├── mod.ts
│ │ │ │ │ ├── system.ts
│ │ │ │ │ └── windows.ts
│ │ │ │ └── utils.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── styles/
│ │ │ ├── global.css
│ │ │ └── variables.css
│ │ └── weg/
│ │ ├── app.tsx
│ │ ├── components/
│ │ │ └── Error/
│ │ │ └── index.tsx
│ │ ├── i18n/
│ │ │ ├── index.ts
│ │ │ └── translations/
│ │ │ ├── af.yml
│ │ │ ├── am.yml
│ │ │ ├── ar.yml
│ │ │ ├── az.yml
│ │ │ ├── bg.yml
│ │ │ ├── bn.yml
│ │ │ ├── bs.yml
│ │ │ ├── ca.yml
│ │ │ ├── cs.yml
│ │ │ ├── cy.yml
│ │ │ ├── da.yml
│ │ │ ├── de.yml
│ │ │ ├── el.yml
│ │ │ ├── en.yml
│ │ │ ├── es.yml
│ │ │ ├── et.yml
│ │ │ ├── eu.yml
│ │ │ ├── fa.yml
│ │ │ ├── fi.yml
│ │ │ ├── fr.yml
│ │ │ ├── gu.yml
│ │ │ ├── he.yml
│ │ │ ├── hi.yml
│ │ │ ├── hr.yml
│ │ │ ├── hu.yml
│ │ │ ├── hy.yml
│ │ │ ├── id.yml
│ │ │ ├── is.yml
│ │ │ ├── it.yml
│ │ │ ├── ja.yml
│ │ │ ├── ka.yml
│ │ │ ├── km.yml
│ │ │ ├── ko.yml
│ │ │ ├── ku.yml
│ │ │ ├── lb.yml
│ │ │ ├── lo.yml
│ │ │ ├── lt.yml
│ │ │ ├── lv.yml
│ │ │ ├── mk.yml
│ │ │ ├── mn.yml
│ │ │ ├── ms.yml
│ │ │ ├── mt.yml
│ │ │ ├── ne.yml
│ │ │ ├── nl.yml
│ │ │ ├── no.yml
│ │ │ ├── pa.yml
│ │ │ ├── pl.yml
│ │ │ ├── ps.yml
│ │ │ ├── pt-BR.yml
│ │ │ ├── pt-PT.yml
│ │ │ ├── ro.yml
│ │ │ ├── ru.yml
│ │ │ ├── si.yml
│ │ │ ├── sk.yml
│ │ │ ├── so.yml
│ │ │ ├── sr.yml
│ │ │ ├── sv.yml
│ │ │ ├── sw.yml
│ │ │ ├── ta.yml
│ │ │ ├── te.yml
│ │ │ ├── tg.yml
│ │ │ ├── th.yml
│ │ │ ├── tl.yml
│ │ │ ├── tr.yml
│ │ │ ├── uk.yml
│ │ │ ├── ur.yml
│ │ │ ├── uz.yml
│ │ │ ├── vi.yml
│ │ │ ├── yo.yml
│ │ │ ├── zh-CN.yml
│ │ │ ├── zh-TW.yml
│ │ │ └── zu.yml
│ │ ├── index.tsx
│ │ ├── modules/
│ │ │ ├── bar/
│ │ │ │ ├── DockMenu.tsx
│ │ │ │ ├── DraggableItem.tsx
│ │ │ │ ├── ItemReordableList.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── item/
│ │ │ │ ├── application.ts
│ │ │ │ └── infra/
│ │ │ │ ├── GeneralMenu.tsx
│ │ │ │ ├── MediaSession.css
│ │ │ │ ├── MediaSession.tsx
│ │ │ │ ├── RecycleBin.tsx
│ │ │ │ ├── Separator.tsx
│ │ │ │ ├── ShowDesktop.tsx
│ │ │ │ ├── StartMenu.tsx
│ │ │ │ ├── UserApplication.tsx
│ │ │ │ ├── UserApplicationContextMenu.tsx
│ │ │ │ └── UserApplicationPreview.tsx
│ │ │ └── shared/
│ │ │ ├── state/
│ │ │ │ ├── hidden.ts
│ │ │ │ ├── items.ts
│ │ │ │ ├── mod.ts
│ │ │ │ ├── settings.ts
│ │ │ │ ├── system.ts
│ │ │ │ └── windows.ts
│ │ │ └── types.ts
│ │ ├── public/
│ │ │ └── index.html
│ │ └── styles/
│ │ ├── global.css
│ │ └── variables.css
│ ├── reduxRootState.ts
│ ├── svelte/
│ │ ├── apps-menu/
│ │ │ ├── App.svelte
│ │ │ ├── components/
│ │ │ │ ├── AllAppsView.svelte
│ │ │ │ ├── AppItem.svelte
│ │ │ │ ├── FolderItem.svelte
│ │ │ │ ├── FolderModal.svelte
│ │ │ │ ├── PinnedView.svelte
│ │ │ │ └── StartMenuBody.svelte
│ │ │ ├── constants.ts
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.ts
│ │ │ ├── keyboard-navigation.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ ├── state/
│ │ │ │ ├── config.svelte.ts
│ │ │ │ ├── knownFolders.svelte.ts
│ │ │ │ ├── mod.svelte.ts
│ │ │ │ └── positioning.svelte.ts
│ │ │ └── utils.ts
│ │ ├── bluetooth-popup/
│ │ │ ├── app.svelte
│ │ │ ├── components/
│ │ │ │ └── BluetoothDevice.svelte
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── icons.ts
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── calendar-popup/
│ │ │ ├── app.svelte
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── context-menu/
│ │ │ ├── MenuItem.svelte
│ │ │ ├── Submenu.svelte
│ │ │ ├── app.svelte
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── flyouts/
│ │ │ ├── app/
│ │ │ │ ├── Brightness.svelte
│ │ │ │ ├── MediaDevices.svelte
│ │ │ │ ├── MediaPlaying.svelte
│ │ │ │ └── Workspace.svelte
│ │ │ ├── app.svelte
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state/
│ │ │ ├── config.svelte.ts
│ │ │ ├── mod.svelte.ts
│ │ │ └── placement.svelte.ts
│ │ ├── keyboard-selector/
│ │ │ ├── app.svelte
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── media-popup/
│ │ │ ├── app.svelte
│ │ │ ├── components/
│ │ │ │ ├── DeviceView.svelte
│ │ │ │ ├── MainView.svelte
│ │ │ │ ├── MediaDevice.svelte
│ │ │ │ ├── MediaPlayer.svelte
│ │ │ │ └── VolumeControl.svelte
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── network-popup/
│ │ │ ├── app.svelte
│ │ │ ├── components/
│ │ │ │ └── WlanEntry.svelte
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── notifications/
│ │ │ ├── app.svelte
│ │ │ ├── components/
│ │ │ │ └── Notification.svelte
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── power-menu/
│ │ │ ├── app.svelte
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.ts
│ │ │ ├── options.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── quick-settings/
│ │ │ ├── app.svelte
│ │ │ ├── components/
│ │ │ │ ├── BrightnessControl.svelte
│ │ │ │ ├── MediaDevices.svelte
│ │ │ │ └── RadioButtons.svelte
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── system-tray/
│ │ │ ├── app.svelte
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── task-switcher/
│ │ │ ├── App.svelte
│ │ │ ├── components/
│ │ │ │ └── TaskItem.svelte
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── user-menu/
│ │ │ ├── app.svelte
│ │ │ ├── components/
│ │ │ │ ├── EmptyList.svelte
│ │ │ │ ├── FilePreview.svelte
│ │ │ │ ├── UserFolder.svelte
│ │ │ │ └── UserProfile.svelte
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.ts
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state/
│ │ │ ├── knownFolders.svelte.ts
│ │ │ └── mod.svelte.ts
│ │ ├── wallpaper_manager/
│ │ │ ├── app.svelte
│ │ │ ├── i18n/
│ │ │ │ ├── index.ts
│ │ │ │ └── translations/
│ │ │ │ ├── af.yml
│ │ │ │ ├── am.yml
│ │ │ │ ├── ar.yml
│ │ │ │ ├── az.yml
│ │ │ │ ├── bg.yml
│ │ │ │ ├── bn.yml
│ │ │ │ ├── bs.yml
│ │ │ │ ├── ca.yml
│ │ │ │ ├── cs.yml
│ │ │ │ ├── cy.yml
│ │ │ │ ├── da.yml
│ │ │ │ ├── de.yml
│ │ │ │ ├── el.yml
│ │ │ │ ├── en.yml
│ │ │ │ ├── es.yml
│ │ │ │ ├── et.yml
│ │ │ │ ├── eu.yml
│ │ │ │ ├── fa.yml
│ │ │ │ ├── fi.yml
│ │ │ │ ├── fr.yml
│ │ │ │ ├── gu.yml
│ │ │ │ ├── he.yml
│ │ │ │ ├── hi.yml
│ │ │ │ ├── hr.yml
│ │ │ │ ├── hu.yml
│ │ │ │ ├── hy.yml
│ │ │ │ ├── id.yml
│ │ │ │ ├── is.yml
│ │ │ │ ├── it.yml
│ │ │ │ ├── ja.yml
│ │ │ │ ├── ka.yml
│ │ │ │ ├── km.yml
│ │ │ │ ├── ko.yml
│ │ │ │ ├── ku.yml
│ │ │ │ ├── lb.yml
│ │ │ │ ├── lo.yml
│ │ │ │ ├── lt.yml
│ │ │ │ ├── lv.yml
│ │ │ │ ├── mk.yml
│ │ │ │ ├── mn.yml
│ │ │ │ ├── ms.yml
│ │ │ │ ├── mt.yml
│ │ │ │ ├── ne.yml
│ │ │ │ ├── nl.yml
│ │ │ │ ├── no.yml
│ │ │ │ ├── pa.yml
│ │ │ │ ├── pl.yml
│ │ │ │ ├── ps.yml
│ │ │ │ ├── pt-BR.yml
│ │ │ │ ├── pt-PT.yml
│ │ │ │ ├── ro.yml
│ │ │ │ ├── ru.yml
│ │ │ │ ├── si.yml
│ │ │ │ ├── sk.yml
│ │ │ │ ├── so.yml
│ │ │ │ ├── sr.yml
│ │ │ │ ├── sv.yml
│ │ │ │ ├── sw.yml
│ │ │ │ ├── ta.yml
│ │ │ │ ├── te.yml
│ │ │ │ ├── tg.yml
│ │ │ │ ├── th.yml
│ │ │ │ ├── tl.yml
│ │ │ │ ├── tr.yml
│ │ │ │ ├── uk.yml
│ │ │ │ ├── ur.yml
│ │ │ │ ├── uz.yml
│ │ │ │ ├── vi.yml
│ │ │ │ ├── yo.yml
│ │ │ │ ├── zh-CN.yml
│ │ │ │ ├── zh-TW.yml
│ │ │ │ └── zu.yml
│ │ │ ├── index.ts
│ │ │ ├── modules/
│ │ │ │ └── Monitor/
│ │ │ │ ├── Monitor.svelte
│ │ │ │ └── infra.svelte
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ └── state.svelte.ts
│ │ ├── window_manager/
│ │ │ ├── App.svelte
│ │ │ ├── index.ts
│ │ │ ├── layout/
│ │ │ │ ├── application.ts
│ │ │ │ ├── domain.ts
│ │ │ │ └── infra/
│ │ │ │ ├── Container.svelte
│ │ │ │ ├── Layout.svelte
│ │ │ │ ├── containers/
│ │ │ │ │ ├── Leaf.svelte
│ │ │ │ │ ├── Reserved.svelte
│ │ │ │ │ └── Stack.svelte
│ │ │ │ └── index.css
│ │ │ ├── public/
│ │ │ │ └── index.html
│ │ │ ├── state.svelte.ts
│ │ │ ├── styles/
│ │ │ │ └── global.css
│ │ │ └── utils.ts
│ │ └── workspaces-viewer/
│ │ ├── app/
│ │ │ ├── Monitor.svelte
│ │ │ ├── Window.svelte
│ │ │ └── Workspace.svelte
│ │ ├── app.svelte
│ │ ├── index.ts
│ │ ├── public/
│ │ │ └── index.html
│ │ └── state.svelte.ts
│ └── vanilla/
│ ├── entry-point/
│ │ ├── ConsoleWrapper.ts
│ │ ├── _ConsoleWrapper.ts
│ │ ├── _tauri.ts
│ │ ├── index.ts
│ │ └── setup.ts
│ ├── integrity/
│ │ ├── index.ts
│ │ └── public/
│ │ └── index.html
│ └── third_party/
│ ├── index.ts
│ ├── public/
│ │ └── index.html
│ └── reset.css
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .cargo/config.toml
================================================
[env]
SLU_SERVICE_CONNECTION_TOKEN = "__local__"
TS_RS_EXPORT_DIR = "./gen/types"
TS_RS_IMPORT_EXTENSION = "ts"
TS_RS_LARGE_INT = "number"
================================================
FILE: .cert/Seelen.pfx.pwd
================================================
Seelen
================================================
FILE: .cert/readme.md
================================================
# Self Signed Certificates
## Creation
```pwsh
msixherocli.exe newcert --directory .\.cert --name Seelen --password Seelen --subject CN=7E60225C-94CB-4B2E-B17F-0159A11074CB --validUntil "14/12/2026 6:31:10 pm"
```
## Usage
In this directory, you will find the self-signed certificates used in the development environment. You can add it to
your system to trust nighly msix packages.
1. Download Seelen.pfx
2. Open a powershell terminal as administrator
3. Go to the directory where you downloaded the file
4. Run the following command
```pwsh
$password = ConvertTo-SecureString -String Seelen -Force -AsPlainText
Import-PfxCertificate -FilePath .\Seelen.pfx -CertStoreLocation Cert:\LocalMachine\root -Password $password
```
> [!NOTE]
> These files expire each year and should be replaced with new ones.
================================================
FILE: .commitlintrc.yml
================================================
# commitlint.config.yml
extends:
- "@commitlint/config-conventional"
rules:
# Basic rules
header-max-length: [2, "always", 72]
body-max-line-length: [2, "always", 100]
# Commit type
type-enum:
- 2
- "always"
- [
"feat", # New feature
"enh", # Enhancement of an existing feature
"fix", # Bug fix
"docs", # Documentation changes
"style", # Code formatting, white spaces, etc.
"refactor", # Code refactoring
"perf", # Performance improvement
"test", # Adding or fixing tests
"build", # Changes affecting the build system or external dependencies
"ci", # Changes to CI configuration files and scripts
"chore", # Other changes that don't modify src or test files
"delete", # Deleting unused files
"revert", # Reverting to a previous commit
]
scope-empty: [2, "never"]
subject-empty: [2, "never"]
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
================================================
FILE: .github/FUNDING.yml
================================================
github: [eythaann]
ko_fi: eythaann
patreon: eythaann
custom:
- https://www.paypal.me/eythaann
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report 🐛
about: Create a report to help us improve
title: "[BUG] Short description of the issue"
labels: bug
assignees: ""
---
### Description of the issue
A clear and concise description of what's wrong.
### To reproduce
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll to '....'
4. See error
### Expected behavior
Explain what you expected to happen.
### Evidence
- **Screenshots/Videos**: If applicable, add visual proof
- **Log File**: Please attach the latest log file from: `%LocalAppdata%\com.seelen.seelen-ui\logs` (This helps us
diagnose the issue)
### Additional context
Add any other relevant information here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: "[FEAT] Include a pandora box"
labels: enhancement, feature request
assignees: ""
---
**Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem
is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like** A clear and concise description of what you want to happen.
**Describe alternatives you've considered** A clear and concise description of any alternative solutions or features
you've considered.
**Additional context** Add any other context or screenshots about the feature request here.
================================================
FILE: .github/actions/generate-update-manifest/action.yml
================================================
name: Generate Update Manifest
description: Generates and uploads latest.json for Tauri updater
inputs:
release-id:
description: Release ID to get the release from
required: true
version:
description: Version to use in the manifest
required: true
github-token:
description: GitHub token for API access
required: true
runs:
using: composite
steps:
- name: Generate and Upload latest.json
uses: actions/github-script@v7
with:
github-token: ${{ inputs.github-token }}
script: |
const releaseId = '${{ inputs.release-id }}';
const version = '${{ inputs.version }}'.replaceAll('"', '');
core.info(`Using version: ${version}`);
// Get the release
const release = await github.rest.repos.getRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId,
});
core.info(`Found release: ${release.data.name} (ID: ${release.data.id})`);
// Get all assets from the release
const { data: assets } = await github.rest.repos.listReleaseAssets({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.data.id,
});
core.info(`Found ${assets.length} assets`);
// Filter relevant assets (exe and sig files)
const relevantAssets = assets.filter(asset =>
asset.name.endsWith('.exe') || asset.name.endsWith('.sig')
);
if (relevantAssets.length === 0) {
throw new Error('No relevant assets found in release');
}
// Build the update manifest
const update = {
version,
notes: `Seelen UI build ${version}`,
pub_date: new Date().toISOString(),
platforms: {
"windows-x86_64": { signature: "", url: "" },
"windows-aarch64": { signature: "", url: "" },
},
};
// Map assets to platforms
for (const asset of relevantAssets) {
const platform = asset.name.includes('x64')
? 'windows-x86_64'
: asset.name.includes('arm64')
? 'windows-aarch64'
: null;
if (!platform) {
core.warning(`Skipping asset with unknown platform: ${asset.name}`);
continue;
}
if (asset.name.endsWith('.sig')) {
// Download signature content
const sigResponse = await github.request('GET /repos/{owner}/{repo}/releases/assets/{asset_id}', {
owner: context.repo.owner,
repo: context.repo.repo,
asset_id: asset.id,
headers: { accept: 'application/octet-stream' },
});
update.platforms[platform].signature = Buffer.from(sigResponse.data).toString('utf-8');
core.info(`Added signature for ${platform}`);
}
if (asset.name.endsWith('.exe')) {
update.platforms[platform].url = asset.browser_download_url;
core.info(`Added URL for ${platform}: ${asset.browser_download_url}`);
}
}
// Validate and remove incomplete platforms
for (const [platform, data] of Object.entries(update.platforms)) {
if (!data.signature || !data.url) {
core.warning(`Platform ${platform} is incomplete - removing`);
delete update.platforms[platform];
}
}
if (Object.keys(update.platforms).length === 0) {
throw new Error('No valid platforms found in assets');
}
const manifestJson = JSON.stringify(update, null, 2);
core.info('Generated update manifest:');
core.info(manifestJson);
// Delete existing latest.json if it exists
const existingManifest = assets.find(a => a.name === 'latest.json');
if (existingManifest) {
core.info('Deleting existing latest.json');
await github.rest.repos.deleteReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
asset_id: existingManifest.id,
});
}
// Upload the new manifest
core.info('Uploading latest.json to release');
const manifestBuffer = Buffer.from(manifestJson, 'utf-8');
await github.rest.repos.uploadReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.data.id,
name: 'latest.json',
data: manifestBuffer,
headers: {
'content-type': 'application/json',
'content-length': manifestBuffer.length,
},
});
core.info('✅ Successfully generated and uploaded latest.json');
// Delete .sig files from release assets
core.info('Deleting .sig files from release assets');
const sigAssets = assets.filter(a => a.name.endsWith('.sig'));
for (const sigAsset of sigAssets) {
core.info(`Deleting ${sigAsset.name}`);
await github.rest.repos.deleteReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
asset_id: sigAsset.id,
});
}
core.info(`✅ Deleted ${sigAssets.length} .sig file(s) from release`);
================================================
FILE: .github/actions/setup/action.yml
================================================
name: Setup Development Environment
description: Sets up Node.js, Deno, and Rust toolchain with caching
inputs:
rust-components:
description: Additional Rust components to install (comma-separated)
required: false
default: ""
rust-targets:
description: Additional Rust targets to install (comma-separated)
required: false
default: ""
cache-key-prefix:
description: Prefix for cache keys
required: false
default: "rust"
runs:
using: composite
steps:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- name: Setup Deno
uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- name: Setup Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly-2025-09-12
components: ${{ inputs.rust-components }}
targets: ${{ inputs.rust-targets }}
- name: Add Rust targets
if: inputs.rust-targets != ''
shell: bash
run: |
IFS=',' read -ra TARGETS <<< "${{ inputs.rust-targets }}"
for target in "${TARGETS[@]}"; do
rustup target add "$target"
done
- name: Cache Rust dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ inputs.cache-key-prefix }}-${{ runner.os }}-${{ hashFiles('Cargo.lock') }}
restore-keys: |
${{ inputs.cache-key-prefix }}-${{ runner.os }}-
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
- package-ecosystem: cargo
directory: /
schedule:
interval: weekly
================================================
FILE: .github/workflows/ci.yml
================================================
name: Continuous Integration
on:
pull_request:
branches:
- master
workflow_dispatch:
workflow_call:
jobs:
js-test-and-linter:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
with:
rust-components: rustfmt
- run: npm install
- run: deno fmt --check
- run: deno lint
- run: npm run type-check
- run: npm run test
rust-linter:
runs-on: windows-2025
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- name: Format
run: |-
rustup component add rustfmt
cargo fmt -- --check
- name: Linter
run: |-
rustup component add clippy
cargo clippy --locked --all-targets -- -D warnings
rust-test:
runs-on: windows-2025
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
with:
cache-key-prefix: rust-test
- run: cargo test --locked --verbose
================================================
FILE: .github/workflows/dependabot-automerge.yml
================================================
name: Dependabot auto-merge
on: pull_request_target
permissions:
contents: write
pull-requests: write
jobs:
automerge:
if: github.actor == 'dependabot[bot]' && github.event.pull_request.head.repo.fork == false
runs-on: ubuntu-latest
steps:
- name: Fetch Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Approve PR
run: gh pr review --approve "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Enable auto-merge (squash)
run: gh pr merge --auto --squash "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/discord-notify.yml
================================================
name: "Discord Notify"
on:
workflow_dispatch:
inputs:
tag:
description: "Release tag to announce (e.g. v2.5.1)"
required: true
workflow_call:
inputs:
tag:
description: "Release tag to announce"
type: string
required: true
jobs:
notify:
name: Send Announcement To Discord Server
runs-on: ubuntu-latest
steps:
- name: Discord notification
uses: actions/github-script@v7
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
with:
script: |
const tag = '${{ inputs.tag }}';
const { data: release } = await github.rest.repos.getReleaseByTag({
owner: context.repo.owner,
repo: context.repo.repo,
tag: tag,
});
let body = release.body || '';
// Strip HTML comments
body = body.replace(/<!--[\s\S]*?-->/g, '');
// Reduce heading levels (avoid h1/h2 dominating the embed)
body = body.replace(/^### /gm, '#### ').replace(/^## /gm, '### ').replace(/^# /gm, '## ');
// Normalise whitespace
body = body.replace(/\r\n/g, '\n').replace(/\r/g, '\n').trim();
// Enforce Discord embed description limit
if (body.length > 4096) body = body.slice(0, 4093) + '...';
const payload = {
username: 'Seelen',
avatar_url: 'https://raw.githubusercontent.com/eythaann/Seelen-UI/master/documentation/images/logo_with_margins.png',
embeds: [{
title: release.name || tag,
description: body,
url: release.html_url,
color: 5814783,
footer: { text: 'Seelen Inc.' },
}],
};
const response = await fetch(process.env.DISCORD_WEBHOOK, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
if (!response.ok) {
const text = await response.text();
core.setFailed(`Discord webhook failed (${response.status}): ${text}`);
}
================================================
FILE: .github/workflows/msix.yml
================================================
name: Pull MSIX from Store
permissions:
contents: write
on:
schedule:
- cron: "0 0 * * *" # Run the action every day
workflow_dispatch: # Manually run the action
jobs:
check-msix:
runs-on: ubuntu-latest
outputs:
MSIX_ALREADY_EXIST: ${{ steps.check_msix.outputs.result }}
steps:
- name: Check for MSIX file in latest release
id: check_msix
uses: actions/github-script@v7
with:
script: |
const { owner, repo } = context.repo;
const latestRelease = await github.rest.repos.getLatestRelease({ owner, repo });
// Check if .msix file exists in the release assets
const msixAsset = latestRelease.data.assets.find(asset => asset.name.toLowerCase().endsWith('.msix'));
return msixAsset ? 'true' : 'false';
result-encoding: string
- name: Debug output
run: echo "MSIX_ALREADY_EXIST value is ${{ steps.check_msix.outputs.result }}"
upload-store-msix-to-release:
name: Upload Signed MSIX to release
needs: check-msix
if: ${{ needs.check-msix.outputs.MSIX_ALREADY_EXIST == 'false' }}
runs-on: ubuntu-latest
steps:
- name: Upload store MSIX to release
uses: JasonWei512/Upload-Microsoft-Store-MSIX-Package-to-GitHub-Release@v1
with:
store-id: 9P67C2D4T9FB
token: ${{ secrets.GITHUB_TOKEN }}
asset-name-pattern: Seelen.UI_{version}_{arch}
msix-to-winget:
name: MSIX to Winget
needs: upload-store-msix-to-release
runs-on: windows-2025
steps:
- name: Get Latest Release
id: get-version
uses: actions/github-script@v7
with:
script: |-
const { owner, repo } = context.repo;
const latestRelease = await github.rest.repos.getLatestRelease({ owner, repo });
const tag = latestRelease.data.tag_name;
const version = tag.replace("v", "") + ".0";
core.setOutput('version', version);
core.setOutput('release-tag', tag);
console.info("Release tag: ", tag, " Version: ", version);
- uses: vedantmgoyal9/winget-releaser@main
with:
identifier: Seelen.SeelenUI
version: ${{ steps.get-version.outputs.version }}
release-tag: ${{ steps.get-version.outputs.release-tag }}
installers-regex: '\.msix$'
fork-user: eythaann
token: ${{ secrets.WINGET_TOKEN }}
================================================
FILE: .github/workflows/nightly.yml
================================================
name: Nightly
on:
push:
branches:
- master
paths-ignore:
- "**.md"
- "documentation/**"
- ".github/**"
- "crowdin.yml"
workflow_dispatch:
permissions:
contents: write
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true
jobs:
continuous-integration:
uses: ./.github/workflows/ci.yml
update-tag:
needs: continuous-integration
runs-on: ubuntu-latest
outputs:
version: ${{ steps.gen-version.outputs.result }}
steps:
- uses: actions/checkout@v4
- run: git fetch --tags --prune
- name: Create or update 'nightly' tag (force overwrite)
run: |
git tag -f nightly
git push origin --force --tags
- name: Generate Version
id: gen-version
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'));
const currentVersion = packageJson.version;
const timestamp = new Date().toISOString().replace(/[-:T]/g, '').slice(2, 12);
const nightlyVersion = `${currentVersion}-nightly.${timestamp}`;
return nightlyVersion;
build-binaries:
needs: update-tag
strategy:
fail-fast: false
matrix:
include:
- platform: windows-2025
target: x86_64-pc-windows-msvc
- platform: windows-2025
target: aarch64-pc-windows-msvc
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
with:
rust-targets: ${{ matrix.target }}
cache-key-prefix: rust-build-${{ matrix.target }}
- name: Install frontend dependencies
run: npm install
- name: Set Version
run: |
npx tsx scripts/versionish.ts ci ${{ needs.update-tag.outputs.version }}
- name: Build Hook DLL
run: cargo build --release --target ${{ matrix.target }} -p sluhk
- name: Build
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: npx tauri build --ci --verbose --no-bundle --target ${{ matrix.target }}
- name: Upload binaries to artifacts
id: upload-binaries
uses: actions/upload-artifact@v4
with:
name: binaries-${{ matrix.target }}
path: |
target/${{ matrix.target }}/release/static/**/*
target/${{ matrix.target }}/release/*.exe
target/${{ matrix.target }}/release/*.dll
target/${{ matrix.target }}/release/SHA256SUMS
target/${{ matrix.target }}/release/SHA256SUMS.sig
target/${{ matrix.target }}/release/seelen_ui.pdb
merge-binaries:
needs: build-binaries
runs-on: ubuntu-latest
outputs:
artifact-id: ${{ steps.merge-binaries.outputs.artifact-id }}
steps:
- name: Merge binaries artifacts
id: merge-binaries
uses: actions/upload-artifact/merge@v4
with:
name: binaries
pattern: binaries-*
separate-directories: true
delete-merged: true
sign-binaries:
needs: merge-binaries
runs-on: ubuntu-latest
steps:
- name: Sign binaries with SignPath
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: 1a9e9b37-229a-4540-a639-137deebee4e1
project-slug: seelen-ui
signing-policy-slug: test-signing
artifact-configuration-slug: binaries
github-artifact-id: ${{ needs.merge-binaries.outputs.artifact-id }}
output-artifact-directory: signed-binaries
wait-for-completion: true
- name: Upload signed binaries by target
uses: actions/upload-artifact@v4
with:
name: signed-binaries-x86_64-pc-windows-msvc
path: signed-binaries/binaries-x86_64-pc-windows-msvc/**/*
- name: Upload signed binaries by target
uses: actions/upload-artifact@v4
with:
name: signed-binaries-aarch64-pc-windows-msvc
path: signed-binaries/binaries-aarch64-pc-windows-msvc/**/*
bundle:
needs:
- update-tag
- sign-binaries
strategy:
fail-fast: false
matrix:
include:
- platform: windows-2025
target: x86_64-pc-windows-msvc
- platform: windows-2025
target: aarch64-pc-windows-msvc
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
with:
rust-targets: ${{ matrix.target }}
cache-key-prefix: rust-bundle-${{ matrix.target }}
- name: Install frontend dependencies
run: npm install
- name: Install MSIX dependencies
shell: pwsh
run: |
winget upgrade winget --accept-package-agreements --accept-source-agreements --disable-interactivity --force || Write-Output "Ignoring winget update failure"
winget install --id Microsoft.DotNet.AspNetCore.8 --accept-package-agreements --accept-source-agreements --force
winget install --id Microsoft.DotNet.DesktopRuntime.8 --accept-package-agreements --accept-source-agreements --force
winget install --id MarcinOtorowski.MSIXHero --accept-package-agreements --accept-source-agreements --force
- name: Set Version
run: |
npx tsx scripts/versionish.ts ci ${{ needs.update-tag.outputs.version }}
- name: Download signed binaries
uses: actions/download-artifact@v4
with:
name: signed-binaries-${{ matrix.target }}
path: target/${{ matrix.target }}/release
- name: Clean bundle folder from cache
shell: pwsh
run: |
$bundlePath = "target/${{ matrix.target }}/release/bundle"
if (Test-Path $bundlePath) {
Remove-Item -Path $bundlePath -Recurse -Force
Write-Output "Old bundles files deleted: $bundlePath"
}
- name: Bundle
run: npx tauri bundle --ci --verbose --target ${{ matrix.target }} --no-sign
- name: Bundle MSIX
run: npx tsx scripts/bundle.msix.ts --target ${{ matrix.target }}
- name: Upload bundles to artifacts
uses: actions/upload-artifact@v4
with:
name: bundles-${{ matrix.target }}
path: target/${{ matrix.target }}/release/bundle
merge-bundles:
needs: bundle
runs-on: ubuntu-latest
outputs:
artifact-id: ${{ steps.upload-merged.outputs.artifact-id }}
steps:
- name: Merge artifacts
id: upload-merged
uses: actions/upload-artifact/merge@v4
with:
name: bundles
pattern: bundles-*
delete-merged: true
sign-bundles:
needs:
- update-tag
- merge-bundles
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
- name: Clean existing assets
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const tagName = 'nightly';
const release = await github.rest.repos.getReleaseByTag({
owner: context.repo.owner,
repo: context.repo.repo,
tag: tagName,
});
const { data: assets } = await github.rest.repos.listReleaseAssets({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.data.id,
});
core.info(`Found ${assets.length} existing assets to clean`);
const deletions = assets.map(asset => {
core.info(`Deleting ${asset.name}`);
return github.rest.repos.deleteReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
asset_id: asset.id,
});
});
await Promise.all(deletions);
core.info('✅ All existing assets cleaned');
- name: Submit to SignPath
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: 1a9e9b37-229a-4540-a639-137deebee4e1
project-slug: seelen-ui
signing-policy-slug: test-signing
artifact-configuration-slug: nightly-bundles
github-artifact-id: ${{ needs.merge-bundles.outputs.artifact-id }}
output-artifact-directory: bundles
- name: File Tree
run: |-
tree bundles
- name: Tauri Updater Signature
env:
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: |
npm install -g @tauri-apps/cli
echo "Removing existing .sig files to regenerate with Tauri updater keys..."
find ./bundles -name "*.sig" -type f -delete
echo "Existing signatures removed"
VERSION=${{ needs.update-tag.outputs.version }}
PATH1="bundles/nsis/Seelen UI_${VERSION}_arm64-setup.exe"
PATH2="bundles/nsis/Seelen UI_${VERSION}_x64-setup.exe"
echo "Signing ${PATH1}..."
tauri signer sign --verbose "$PATH1"
echo "Signing ${PATH2}..."
tauri signer sign --verbose "$PATH2"
- name: Upload Signed Installers to release
uses: svenstaro/upload-release-action@v2
with:
tag: nightly
file: bundles/**/*
file_glob: true
generate-update-file:
needs:
- update-tag
- sign-bundles
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Get Release ID
id: get-release
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const release = await github.rest.repos.getReleaseByTag({
owner: context.repo.owner,
repo: context.repo.repo,
tag: 'nightly',
});
return release.data.id;
- uses: ./.github/actions/generate-update-manifest
with:
release-id: ${{ steps.get-release.outputs.result }}
version: ${{ needs.update-tag.outputs.version }}
github-token: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/publish-core.yml
================================================
name: "Publish Core Library"
on:
workflow_call:
workflow_dispatch:
permissions:
contents: read
id-token: write
jobs:
publish-core:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./libs/core
steps:
- uses: actions/checkout@v4
- uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- uses: actions/setup-node@v4
with:
node-version: 24
registry-url: "https://registry.npmjs.org"
- name: Setup Rust
run: rustup --version
- name: Build Rust Bindings (ts-rs)
run: deno task build:rs
- name: Publish to JSR
run: deno publish --allow-dirty
- name: Build NPM package
run: deno task build:npm
- name: Publish to NPM
run: |
cd ./npm
npm --verbose publish --tag latest
================================================
FILE: .github/workflows/release.yml
================================================
name: "Release"
on:
push:
tags:
- "v[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch:
permissions:
contents: write
id-token: write
jobs:
continuous-integration:
uses: ./.github/workflows/ci.yml
get-version:
needs: continuous-integration
runs-on: ubuntu-latest
outputs:
version: ${{ steps.get-version.outputs.result }}
steps:
- uses: actions/checkout@v4
- name: Get version
id: get-version
uses: actions/github-script@v7
with:
result-encoding: string
script: |
const fs = require('fs');
const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'));
return packageJson.version;
create-release:
needs: get-version
runs-on: ubuntu-latest
outputs:
release_id: ${{ steps.create-release.outputs.result }}
steps:
- uses: actions/checkout@v4
- name: Create release (draft)
id: create-release
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const version = "${{ needs.get-version.outputs.version }}";
const changelogContent = fs.readFileSync('changelog.md', 'utf-8');
const regex = new RegExp(`(?<=\\[${version}\\]\\s)([\\s\\S]*?)(?=\\s## \\[)`, 'g');
const releaseNotes = changelogContent.match(regex)?.[0].trim() || '';
const { data } = await github.rest.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: `v${version}`,
name: `Seelen UI v${version}`,
body: releaseNotes,
generate_release_notes: true,
draft: true,
prerelease: false,
});
return data.id;
build-binaries:
needs: create-release
strategy:
fail-fast: false
matrix:
include:
- platform: windows-2025
target: x86_64-pc-windows-msvc
- platform: windows-2025
target: aarch64-pc-windows-msvc
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
with:
rust-targets: ${{ matrix.target }}
cache-key-prefix: rust-build-${{ matrix.target }}
- name: Install frontend dependencies
run: npm install
- name: Build Hook DLL
run: cargo build --release --target ${{ matrix.target }} -p sluhk
- name: Build (no bundle)
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: npx tauri build --ci --verbose --no-bundle --target ${{ matrix.target }}
- name: Upload binaries to artifacts
uses: actions/upload-artifact@v4
with:
name: binaries-${{ matrix.target }}
path: |
target/${{ matrix.target }}/release/static/**/*
target/${{ matrix.target }}/release/*.exe
target/${{ matrix.target }}/release/*.dll
target/${{ matrix.target }}/release/SHA256SUMS
target/${{ matrix.target }}/release/SHA256SUMS.sig
target/${{ matrix.target }}/release/seelen_ui.pdb
merge-binaries:
needs: build-binaries
runs-on: ubuntu-latest
outputs:
artifact-id: ${{ steps.merge-binaries.outputs.artifact-id }}
steps:
- name: Merge binaries artifacts
id: merge-binaries
uses: actions/upload-artifact/merge@v4
with:
name: binaries
pattern: binaries-*
separate-directories: true
delete-merged: true
sign-binaries:
needs: merge-binaries
runs-on: ubuntu-latest
steps:
- name: Sign binaries with SignPath
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: 1a9e9b37-229a-4540-a639-137deebee4e1
project-slug: seelen-ui
signing-policy-slug: release-signing
artifact-configuration-slug: binaries
github-artifact-id: ${{ needs.merge-binaries.outputs.artifact-id }}
output-artifact-directory: signed-binaries
wait-for-completion: true
- name: Upload signed binaries by target
uses: actions/upload-artifact@v4
with:
name: signed-binaries-x86_64-pc-windows-msvc
path: signed-binaries/binaries-x86_64-pc-windows-msvc/**/*
- name: Upload signed binaries by target
uses: actions/upload-artifact@v4
with:
name: signed-binaries-aarch64-pc-windows-msvc
path: signed-binaries/binaries-aarch64-pc-windows-msvc/**/*
bundle:
needs:
- get-version
- sign-binaries
strategy:
fail-fast: false
matrix:
include:
- platform: windows-2025
target: x86_64-pc-windows-msvc
- platform: windows-2025
target: aarch64-pc-windows-msvc
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
with:
rust-targets: ${{ matrix.target }}
cache-key-prefix: rust-bundle-${{ matrix.target }}
- name: Install frontend dependencies
run: npm install
- name: Install MSIX dependencies
shell: pwsh
run: |
winget upgrade winget --accept-package-agreements --accept-source-agreements --disable-interactivity --force || Write-Output "Ignoring winget update failure"
winget install --id Microsoft.DotNet.AspNetCore.8 --accept-package-agreements --accept-source-agreements --force
winget install --id Microsoft.DotNet.DesktopRuntime.8 --accept-package-agreements --accept-source-agreements --force
winget install --id MarcinOtorowski.MSIXHero --accept-package-agreements --accept-source-agreements --force
- name: Download signed binaries
uses: actions/download-artifact@v4
with:
name: signed-binaries-${{ matrix.target }}
path: target/${{ matrix.target }}/release
- name: Clean bundle folder from cache
shell: pwsh
run: |
$bundlePath = "target/${{ matrix.target }}/release/bundle"
if (Test-Path $bundlePath) {
Remove-Item -Path $bundlePath -Recurse -Force
Write-Output "Old bundles files deleted: $bundlePath"
}
- name: Bundle
run: npx tauri bundle --ci --verbose --target ${{ matrix.target }} --no-sign
- name: Rename normal bundle to temp
shell: pwsh
run: |
$arch = "${{ matrix.target }}".Contains("aarch64") ? "arm64" : "x64"
$version = "${{ needs.get-version.outputs.version }}"
$bundlePath = "target/${{ matrix.target }}/release/bundle/nsis"
$setupFile = "$bundlePath/Seelen UI_${version}_${arch}-setup.exe"
$tempFile = "$bundlePath/Seelen UI_${version}_${arch}-setup_temp.exe"
if (Test-Path $setupFile) {
Move-Item -Path $setupFile -Destination $tempFile
Write-Output "Renamed $setupFile to $tempFile"
} else {
Write-Error "Setup file not found: $setupFile"
exit 1
}
- name: Set Fixed Runtime
shell: pwsh
run: |
$arch = "${{ matrix.target }}".Contains("aarch64") ? "arm64" : "x64"
./scripts/SetFixedRuntime.ps1 -Architecture $arch
- name: Copy Runtime to target directory
shell: pwsh
run: |
$runtimeSource = Get-ChildItem -Path "src/runtime" -Directory | Where-Object { $_.Name -match '^\d+\.\d+\.\d+\.\d+$' } | Select-Object -First 1
if ($runtimeSource) {
$targetRuntimeDir = "target/${{ matrix.target }}/release/runtime"
New-Item -ItemType Directory -Force -Path $targetRuntimeDir | Out-Null
Copy-Item -Path $runtimeSource.FullName -Destination "$targetRuntimeDir/$($runtimeSource.Name)" -Recurse -Force
Write-Output "Copied runtime from $($runtimeSource.FullName) to $targetRuntimeDir/$($runtimeSource.Name)"
} else {
Write-Error "Runtime version directory not found in src/runtime"
exit 1
}
- name: Bundle with Fixed Runtime
run: npx tauri bundle --ci --verbose --target ${{ matrix.target }} --no-sign
- name: Rename bundles
shell: pwsh
run: |
$arch = "${{ matrix.target }}".Contains("aarch64") ? "arm64" : "x64"
$version = "${{ needs.get-version.outputs.version }}"
$bundlePath = "target/${{ matrix.target }}/release/bundle/nsis"
$tempFile = "$bundlePath/Seelen UI_${version}_${arch}-setup_temp.exe"
$normalFile = "$bundlePath/Seelen UI_${version}_${arch}-setup.exe"
$fixedFile = "$bundlePath/Seelen UI_${version}_${arch}-setup-fixed.exe"
Write-Output "Checking files in $bundlePath"
Get-ChildItem -Path $bundlePath -Filter "*.exe" | ForEach-Object { Write-Output " Found: $($_.Name)" }
if (Test-Path $normalFile) {
Move-Item -Path $normalFile -Destination $fixedFile -Force
Write-Output "Renamed fixed runtime bundle to $fixedFile"
} else {
Write-Output "Warning: $normalFile does not exist"
}
if (Test-Path $tempFile) {
Move-Item -Path $tempFile -Destination $normalFile -Force
Write-Output "Renamed normal bundle back to $normalFile"
} else {
Write-Output "Warning: $tempFile does not exist"
}
- name: Bundle MSIX
run: npx tsx scripts/bundle.msix.ts --target ${{ matrix.target }}
- name: Upload bundles to artifacts
uses: actions/upload-artifact@v4
with:
name: bundles-${{ matrix.target }}
path: target/${{ matrix.target }}/release/bundle
merge-bundles:
needs: bundle
runs-on: ubuntu-latest
outputs:
artifact-id: ${{ steps.upload-merged.outputs.artifact-id }}
steps:
- name: Merge artifacts
id: upload-merged
uses: actions/upload-artifact/merge@v4
with:
name: bundles
pattern: bundles-*
delete-merged: true
sign-bundles:
needs:
- get-version
- create-release
- merge-bundles
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
- name: Submit to SignPath
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: 1a9e9b37-229a-4540-a639-137deebee4e1
project-slug: seelen-ui
signing-policy-slug: release-signing
artifact-configuration-slug: bundles
github-artifact-id: ${{ needs.merge-bundles.outputs.artifact-id }}
output-artifact-directory: bundles
- name: File Tree
run: |-
tree bundles
- name: Tauri Updater Signature
env:
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: |
npm install -g @tauri-apps/cli
echo "Removing existing .sig files to regenerate with Tauri updater keys..."
find ./bundles -name "*.sig" -type f -delete
echo "Existing signatures removed"
VERSION="${{ needs.get-version.outputs.version }}"
PATH1="bundles/nsis/Seelen UI_${VERSION}_arm64-setup.exe"
PATH2="bundles/nsis/Seelen UI_${VERSION}_x64-setup.exe"
echo "Signing ${PATH1}..."
tauri signer sign --verbose "$PATH1"
echo "Signing ${PATH2}..."
tauri signer sign --verbose "$PATH2"
- name: Remove self-signed MSIX files (store-signed handled elsewhere)
run: |
echo "Removing self-signed .msix files from bundles..."
find ./bundles -name "*.msix" -type f -delete || true
echo "Self-signed .msix files removed (Store-signed MSIX will be added later by msix.yml workflow)"
- name: Upload Signed Installers to release
uses: svenstaro/upload-release-action@v2
with:
release_id: ${{ needs.create-release.outputs.release_id }}
file: bundles/**/*
file_glob: true
publish-release:
needs: [create-release, sign-bundles]
runs-on: ubuntu-latest
steps:
- name: Publish release (un-draft)
uses: actions/github-script@v7
env:
releaseId: ${{ needs.create-release.outputs.release_id }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
await github.rest.repos.updateRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: process.env.releaseId,
draft: false,
});
microsoft-store-submission:
needs: [publish-release, merge-bundles]
runs-on: windows-2025
steps:
- uses: actions/checkout@v4
- name: Download merged bundles (unsigned)
uses: actions/download-artifact@v4
with:
name: bundles
path: target/release/bundle
# Use Store Broker to publish to Microsoft Store
- name: Submit to Partner Center (aka DevCenter)
shell: pwsh
run: |
./scripts/SubmitToStore.ps1
env:
PartnerCenterStoreId: ${{ secrets.MS_PRODUCT_ID }}
PartnerCenterTenantId: ${{ secrets.MS_TENANT_ID }}
PartnerCenterClientId: ${{ secrets.MS_CLIENT_ID }}
PartnerCenterClientSecret: ${{ secrets.MS_CLIENT_SECRET }}
SBDisableTelemetry: true
generate-update-file:
needs: [get-version, create-release, publish-release]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/generate-update-manifest
with:
release-id: ${{ needs.create-release.outputs.release_id }}
version: ${{ needs.get-version.outputs.version }}
github-token: ${{ secrets.GITHUB_TOKEN }}
discord:
needs: [get-version, publish-release]
uses: ./.github/workflows/discord-notify.yml
with:
tag: v${{ needs.get-version.outputs.version }}
secrets: inherit
publish-core-library:
needs: publish-release
runs-on: ubuntu-latest
permissions:
actions: write
steps:
- name: Trigger publish-core workflow
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
await github.rest.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'publish-core.yml',
ref: context.ref,
});
================================================
FILE: .gitignore
================================================
node_modules
.vscode
.env
dist
target
gen
src/runtime
# Submission Files
/scripts/SBTemp
# rust-analyzer
rustc-ice-*.txt
CLAUDE.md
GEMINI.md
.claude
================================================
FILE: .npmrc
================================================
message = "chore(release): v%s"
================================================
FILE: AGENTS.md
================================================
# AGENTS.md
Guidance for AI agents working in this repository.
Seelen UI is a customizable Windows desktop environment built with:
- Rust + Tauri (backend)
- TypeScript + React/Preact (frontend)
- A monorepo layout with shared libs under `libs/`
## Read First (Non-Negotiable)
Build speed / safety:
- DO NOT use `cargo build --release` for testing, type-checking, or local iteration.
- Prefer `cargo check` for fast Rust validation.
- Use `cargo build` (debug) only when you need a binary.
Translations:
- DO NOT run `npm run translate` during active development.
- Add translations manually while iterating; run the translate command only right before a final commit.
Rust locking order (avoid deadlocks):
1. CLI locks
2. DATA locks
3. EVENT locks
Backend architecture rules:
- System modules in `src/background/modules/` MUST follow the modern pattern (lazy init + lazy tauri registration).
- Business logic must NOT call `emit_to_webviews` directly.
WinRT / COM safety:
- For WinRT objects with event subscriptions, use wrapper structs with `Drop` for automatic unregistration.
- Windows-rs clones `TypedEventHandler` internally: store tokens, not handlers.
## Common Commands
Initial setup:
```bash
npm install && npm run dev
```
Dev / build:
- `npm run dev` - Frontend dev workflow
- `npm run build:ui` - Build UI bundles
- `npm run tauri dev` - Run Tauri in dev mode
- `cargo check` - Fast Rust type check
- `cargo build` - Debug build
Quality (Deno-based):
- `deno lint`
- `deno fmt`
- `npm run type-check`
- `npm test`
Core library (`libs/core`):
- `deno task build`
- `deno task build:rs` - Regenerate Rust -> TypeScript bindings
- `deno task build:npm`
## Repo Map (Where Things Live)
Shared libraries:
- `libs/core/` - Core library + Rust-generated TypeScript bindings
- `libs/widgets-shared/` - Cross-widget state utilities (includes LazySignal)
- `libs/slu-ipc/`, `libs/positioning/`, `libs/widgets-integrity/`
Main app:
- `src/background/` - Rust backend (modules, native integrations)
- `src/service/` - System service components
- `src/ui/` - Frontend apps (each subdirectory is an independent app)
- examples: `src/ui/settings/`, `src/ui/toolbar/`, `src/ui/launcher/`, `src/ui/window_manager/`
## Frontend Conventions
App architecture:
- UI apps use a hexagonal-ish layering: `infra/`, `app/`, `domain/`, `shared/`.
- Keep boundaries clean: `domain/` is pure logic; `infra/` is UI + integration.
Styling:
- CSS Modules are the default.
- Naming: kebab-case for CSS, camelCase for TS.
Internationalization:
- All user-visible strings must be i18n.
- Translation files live under `i18n/translations/` (YAML).
## Backend: System Modules (Modern Pattern)
All modules in `src/background/modules/` follow this pattern:
- `application.rs` owns the singleton manager and emits internal events.
- `infrastructure.rs` (or `handlers.rs`) owns Tauri commands and bridges internal events -> webviews.
- Tauri event registration happens lazily on first command access (via `Once`).
Suggested layout:
```
src/background/modules/<module>/
mod.rs
application.rs
infrastructure.rs # or handlers.rs
domain.rs # optional
```
Minimal pattern (infrastructure side):
```rust
use std::sync::Once;
use seelen_core::handlers::SeelenEvent;
use crate::{app::emit_to_webviews, error::Result};
use super::{YourEvent, YourManager};
fn get_manager() -> &'static YourManager {
static REGISTER: Once = Once::new();
REGISTER.call_once(|| {
YourManager::subscribe(|_event: YourEvent| {
// Keep this small and side-effect focused.
if let Ok(data) = get_your_data() {
emit_to_webviews(SeelenEvent::YourDataChanged, data);
}
});
});
YourManager::instance()
}
#[tauri::command(async)]
pub fn get_your_data() -> Result<Vec<YourType>> {
let manager = get_manager();
Ok(manager.get_data())
}
```
Minimal pattern (application side):
```rust
use std::sync::LazyLock;
pub struct YourManager {
// fields
}
#[derive(Debug, Clone)]
pub enum YourEvent {
DataChanged,
}
event_manager!(YourManager, YourEvent);
impl YourManager {
fn new() -> Self {
Self { /* init */ }
}
pub fn instance() -> &'static Self {
static MANAGER: LazyLock<YourManager> = LazyLock::new(|| {
let mut m = YourManager::new();
m.init().log_error();
m
});
&MANAGER
}
fn init(&mut self) -> Result<()> {
self.setup_listeners()?;
Ok(())
}
fn setup_listeners(&mut self) -> Result<()> {
// Listen to OS signals; emit internal YourEvent::* (not webview events)
Ok(())
}
pub fn get_data(&self) -> Vec<YourType> {
// return data
vec![]
}
}
```
When adding a new backend feature exposed to the UI, update `libs/core`:
1. `libs/core/src/handlers/commands.rs`
```rust
slu_commands_declaration! {
GetYourData = get_your_data() -> Vec<YourType>,
}
```
2. `libs/core/src/handlers/events.rs`
```rust
slu_events_declaration! {
YourDataChanged(Vec<YourType>) as "your-module::data-changed",
}
```
3. Regenerate bindings: `cd libs/core && deno task build:rs`
## WinRT Wrapper Pattern (Automatic Cleanup)
Use wrappers for WinRT objects that register events.
Rules:
- Store event tokens (WinRT tokens are often `i64`).
- Do NOT store `TypedEventHandler` values in struct fields.
- Implement `Drop` to unregister events.
Example:
```rust
pub struct WinRtWrapper {
pub object: SomeWinRtObject,
token: i64,
}
impl WinRtWrapper {
pub fn create(object: SomeWinRtObject) -> Result<Self> {
let token = object.SomeEvent(&TypedEventHandler::new(Self::on_event))?;
Ok(Self { object, token })
}
fn on_event(
_sender: &Option<SomeWinRtObject>,
_args: &Option<SomeArgs>,
) -> windows_core::Result<()> {
Ok(())
}
}
impl Drop for WinRtWrapper {
fn drop(&mut self) {
self.object.RemoveSomeEvent(self.token).log_error();
}
}
```
## Shared State: LazySignal (Cross-Widget)
Use `LazySignal` (in `libs/widgets-shared/`) when state is:
- fetched asynchronously (invoke/system APIs)
- updated by async events
- shared across widgets/webviews
Critical usage pattern:
1. Create lazy signal with async initializer.
2. Register event listeners first (they may fire immediately).
3. Call `.init()` last; it must not overwrite a value set by an event.
Example:
```ts
import { lazySignal } from "libs/widgets-shared/LazySignal";
import { invoke, SeelenCommand, SeelenEvent, subscribe } from "@seelen-ui/lib";
const $data = lazySignal(async () => {
return await invoke(SeelenCommand.GetYourData);
});
subscribe(SeelenEvent.YourDataChanged, (event) => {
$data.value = event.payload;
});
await $data.init();
```
## Creating Svelte Widgets (High-Level)
Seelen UI supports standalone Svelte widgets. Prefer following existing widget patterns; do not invent new build
plumbing.
Typical pieces:
1. Static widget definition: `src/static/widgets/<widget-name>/`
2. Svelte app: `src/ui/svelte/<widget-name>/`
3. Theme styles: `src/static/themes/default/styles/<widget-name>.scss`
4. i18n: translations (and keep the translation workflow rule)
5. Optional Rust backend integration (use the modern module pattern)
Widget checklist:
- Static metadata and HTML exist under `src/static/widgets/<widget-name>/`
- Svelte entry mounts into `#root` and calls `Widget.getCurrent().init(...)`
- Shared, event-driven state uses LazySignal
- Styling uses existing CSS variables; avoid global class conflicts
Shared styling for widgets:
- Use `data-skin` attributes for common control styling (buttons, inputs) to avoid class collisions.
## Rust Types: Tagged Enums (Serde)
Avoid tuple variants for internally tagged enums.
Bad:
```rust
#[serde(tag = "type")]
pub enum Action {
WithData(String),
}
```
Good:
```rust
#[serde(tag = "type")]
pub enum Action {
WithData { data: String },
}
```
## Testing Expectations
- Prefer quick feedback loops (`cargo check`, `npm run type-check`, `deno lint`).
- Keep changes scoped; add tests when behavior changes.
================================================
FILE: CLA.md
================================================
Seelen UI - Individual Contributor License Agreement (CLA)
Thank you for your interest in contributing to the Seelen UI project. By submitting a contribution to the Project, you
agree to the following terms and conditions:
1. Grant of License: By submitting a contribution to the Project, you grant the Project Owner a non-exclusive,
perpetual, irrevocable, worldwide license to use, copy, modify, distribute, and sublicense your contribution, as well
as any derivative works thereof, under the terms of the open-source license under which the Project is distributed.
2. Copyright: You represent that you are the legitimate author of the submitted contribution or that you have the
necessary rights to grant the license described in point 1 above.
3. Warranties: You acknowledge that your contribution is provided "as is" and that you waive any warranties, express or
implied, including, but not limited to, the warranties of merchantability, fitness for a particular purpose, and
non-infringement.
4. Representations and Warranties: You warrant that the contribution you submit does not infringe any third-party
intellectual property rights, and in the event of any third-party claim arising out of or related to your
contribution, you agree to indemnify and hold harmless the Project Owner and its affiliates, agents, licensees, and
sublicensees.
5. Acceptance: By submitting your contribution to the Project, you agree to abide by these terms and conditions.
================================================
FILE: CODE_OF_CONDUCT
================================================
# Seelen UI Code of Conduct
## 1. Our Pledge
We as members, contributors, and maintainers pledge to make participation in the Seelen UI community a harassment-free experience for everyone. We welcome all regardless of:
- Age, body size, disability, ethnicity, gender identity/expression
- Level of experience, nationality, personal appearance, race, religion
- Sexual identity/orientation, or any other characteristic
## 2. Expected Behavior
All community members must:
- Use welcoming and inclusive language
- Respect differing viewpoints and experiences
- Gracefully accept constructive criticism
- Focus on what's best for the community
- Show empathy toward other members
## 3. Unacceptable Behavior
Unacceptable behaviors include:
- Sexualized language/imagery and unwelcome advances
- Trolling, insulting/derogatory comments, personal attacks
- Public/private harassment
- Publishing others' private information without permission
- Other conduct reasonably considered inappropriate
## 4. Enforcement Responsibilities
Project maintainers will:
- Remove/edit inappropriate content
- Warn or ban offenders for inappropriate behavior
- Interpret these standards appropriately
## 5. Scope
Applies to all community spaces including:
- GitHub repositories and discussions
- Discord/Slack channels
- Social media accounts
- In-person events
## 6. Enforcement
Instances of abusive behavior may be reported to:
- Email: [support@seelen.io]
- Discord: [Modmail/DM contact]
- GitHub: [@eythaann]
All complaints will be reviewed and investigated promptly.
## 7. Attribution
This Code is adapted from the [Contributor Covenant][homepage],
version 2.1, available at:
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[homepage]: https://www.contributor-covenant.org
================================================
FILE: CONTRIBUTING
================================================
# Contributing to Seelen UI
Thank you for your interest in contributing to this project! We welcome contributions from everyone. By participating in this project, you agree to abide by the following guidelines and terms.
## How to Contribute
1. Fork the repository and clone it to your local machine.
2. Read the [Project Documentation](documentation/project.md) to understand the project structure and how to use it.
3. Create a new branch for your contribution: `git checkout -b feature/new-feature`.
4. Make your changes and ensure they are well-tested.
5. Commit your changes:
- Ensure that your commits are signed. You can sign commits with `git commit -S -m 'Add new feature'`.
- Follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) syntax for commit messages, e.g., `feat: add new feature`, `fix(wm): resolve #567 issue`.
6. Push to the branch: `git push origin feature/new-feature`.
7. Submit a pull request.
## Contributor License Agreement (CLA)
By submitting code as an individual, you agree to the [Contributor License Agreement](CLA.md).
## Code of Conduct
This project adheres to the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT). By participating, you are expected to uphold this code. Please report any unacceptable behavior to [Maintainer's Email].
## Licensing
All contributions to this project are subject to the terms of the [GNU Affero General Public License v3.0](LICENSE). By contributing, you agree that your contributions will be licensed under the terms of this license.
## Contact
If you have any questions or need further clarification, please feel free to join our [Discord server](https://discord.gg/ABfASx5ZAJ).
================================================
FILE: Cargo.toml
================================================
cargo-features = ["profile-rustflags", "codegen-backend"]
[profile.dev]
debug = "full"
strip = false
opt-level = 0
incremental = true
rustflags = ["-Z", "threads=8", "-C", "link-arg=-fuse-ld=lld"]
[profile.rust-analyzer]
inherits = "dev"
debug = false
[profile.release]
debug = "limited"
strip = true
opt-level = "z"
lto = true
codegen-units = 1
rustflags = ["-Z", "threads=8", "-C", "link-arg=-fuse-ld=lld"]
[workspace]
members = [
"libs/core",
"libs/positioning",
"libs/slu-ipc",
"libs/utils",
"src",
"src/hook_dll",
]
resolver = "3"
lints = {}
[workspace.dependencies]
tokio = "1.49.0"
thiserror = "2.0.18"
serde = "1.0"
serde_json = "1.0"
serde_yaml = "0.9.34"
log = "0.4"
arc-swap = "1.8.1"
backtrace = "0.3.76"
base64 = "0.22.1"
battery = "0.7.8"
clap = "4.5.58"
crossbeam-channel = "0.5.15"
discord-rich-presence = "0.2.5"
encoding_rs = "0.8.35"
evalexpr = "11.3.1"
fern = "0.7.1"
futures = "0.3.31"
image = "0.25.9"
interprocess = "2.3.1"
itertools = "0.14.0"
lazy_static = "1.5.0"
notify-debouncer-full = "0.3.2"
minisign = "0.8.0"
os_info = "3.14.0"
owo-colors = "4.2.3"
parking_lot = "0.12.5"
phf = "0.11.3"
quick-xml = "0.38.4"
rand = "0.9.2"
regex = "1.12.3"
reqwest = "0.12.28"
rust-i18n = "3.1.5"
sha2 = "0.10.9"
seelen-core = { path = "libs/core" }
slu-ipc = { path = "libs/slu-ipc" }
slu-utils = { path = "libs/utils" }
positioning = { path = "libs/positioning" }
sysinfo = "0.38.3"
tauri = "2.10.3"
tauri-build = "2.5.6"
tauri-plugin-deep-link = "2.4.7"
tauri-plugin-dialog = "2.6.0"
tauri-plugin-fs = "2.4.5"
tauri-plugin-http = "2.5.7"
tauri-plugin-log = "2.8.0"
tauri-plugin-process = "2.3.1"
tauri-plugin-shell = "2.3.5"
tauri-plugin-updater = "2.10.0"
translators = "0.1.5"
url = "2.5.8"
urlencoding = "2.1.3"
uuid = "1.20.0"
walkdir = "2.5.0"
widestring = "1.2.1"
win-hotkeys = { git = "https://github.com/Seelen-Inc/windows-keyboard-hook.git", features = ["serde"] }
win-screenshot = "4.0.14"
windows = "0.62.2"
windows-future = "0.3.2"
wmi = "0.18.1"
windows-core = "0.62.2"
winreg = "0.55.0"
time = "0.3.47"
scc = "2.4.0"
================================================
FILE: LICENSE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
================================================
FILE: README.md
================================================
<h1 align="center">
<img src="documentation/images/logo.svg" width="44" align="top" alt="Seelen UI Logo" />
Seelen UI
</h1>
<h2 align="center">
Fully Customizable Desktop Environment for Windows
<br/>
Available in 70+ Languages
</h2>
<div align="center">
[](https://github.com/eythaann/seelen-ui/graphs/contributors)
[](https://github.com/eythaann/seelen-ui/commits/main)
[](https://github.com/eythaann/seelen-ui/releases)
[](https://github.com/eythaann/seelen-ui/releases)
</div>
<img src="./documentation/images/preview.png" width="100%" alt="Screenshot of Seelen UI desktop showing a customized desktop environment">
<table align="center">
<tr>
<td align="center" width="33%">
<a
href="https://apps.microsoft.com/detail/Seelen%20UI/9p67c2d4t9fb?mode=full"
target="_blank"
rel="noopener noreferrer"
aria-label="Download Seelen UI from Microsoft Store">
<img src="https://get.microsoft.com/images/en-us%20dark.svg" width="100%" alt="Download Seelen UI from Microsoft Store">
</a>
</td>
<td align="center" width="33%">
<a
href="https://discord.gg/ABfASx5ZAJ"
target="_blank"
rel="noopener noreferrer"
aria-label="Join the Seelen UI Discord community">
<img src="./documentation/images/discord-alt.png" width="100%" alt="Join the Seelen UI Discord community">
</a>
</td>
<td align="center" width="33%">
<a
href='https://www.digitalocean.com/?refcode=955c7335abf5&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge'
target='_blank'
rel="noopener noreferrer"
aria-label="DigitalOcean Referral Badge"
>
<img src='https://web-platforms.sfo2.cdn.digitaloceanspaces.com/WWW/Badge%201.svg' width="100%" alt='DigitalOcean Referral Badge' />
</a>
</td>
</tr>
</table>
## Overview
[Seelen UI](https://seelen.io/apps/seelen-ui) is a tool designed to enhance your Windows desktop experience with a focus
on customization and productivity. It integrates smoothly into your system, providing a range of features that allow you
to personalize your desktop and optimize your workflow.
- **Be Creative**: Seelen UI lets you tailor your desktop to fit your style and needs. You can adjust menus, widgets,
icons, and other elements to create a personalized and visually appealing desktop environment.

<br/>
- **Enhance Your Productivity**: Seelen UI helps you organize your desktop efficiently. With a Tiling Windows Manager,
windows automatically arrange themselves to support multitasking, making your work more streamlined.

<br/>
- **Enjoy your music**: With an integrated media module that's compatible with most music players, Seelen UI allows you
to enjoy your music seamlessly. You can pause, resume, and skip tracks at any time without the need to open additional
windows.

<br/>
- **Be faster!**: With an app launcher inspired by Rofi, Seelen UI provides a simple and intuitive way to quickly access
your applications and execute commands.

<br/>
- **User-Friendly Configuration**: Seelen UI offers an intuitive interface for easy customization. Adjust settings such
as themes, taskbar layouts, icons, etc. With just a few clicks.

<br/>
## Installation
> [!CAUTION]
> Seelen UI requires the WebView runtime to be installed. On Windows 11, it comes pre-installed with the system.
> However, on Windows 10, the WebView runtime is included with the `setup.exe` installer. Additionally, Microsoft Edge
> is necessary to function correctly. Some users may have modified their system and removed Edge, so please ensure both
> Edge and the WebView runtime are installed on your system.
> [!NOTE]
> On fresh installations of Windows, the app might show a white or dark screen. You only need to update your Windows
> through Windows Update and restart your PC.
You can choose from different installation options based on your preference:
### Microsoft Store <em>(recommended)</em>
Download the latest version from the [Store](https://www.microsoft.com/store/productId/9P67C2D4T9FB?ocid=pdpshare) page.
This is the recommended option because you will receive updates and a secure version of the program.
_**Note**_: It may take around 1 to 3 business days for changes to be reflected in the Microsoft Store, as updates are
approved by real people in the store.
### Winget
Install the latest version using:
```pwsh
winget install --id Seelen.SeelenUI
```
This option also uses the signed `.msix` package and ensures you have the latest secure version. Similar to the
Microsoft Store, it may take around 1 to 3 business days for changes to be reflected in Winget, as updates are approved
by real people in the `winget-pkg` project.
### .msix Installer
Download the `.msix` installer from the [Releases](https://github.com/eythaann/seelen-ui/releases) page. This package is
signed, ensuring a secure installation. This is the same option as the Microsoft Store but is a portable installer.
### .exe Installer
Download the latest version from the [Releases](https://github.com/eythaann/seelen-ui/releases) page and run the
`setup.exe` installer. This option is less recommended as the installer is not signed, which may cause it to be flagged
as a potential threat by some antivirus programs. The `setup.exe` is updated more quickly than the Microsoft Store or
Winget versions and also it receives notifications updates on new release.
## Usage
Once installed or extracted, simply open the program. The easy-to-use and intuitive GUI will guide you through the
configuration process. Customize your desktop environment effortlessly.
## Upcoming Features
I’m excited to share some upcoming features for Seelen UI! Here’s a glimpse of what’s planned for the future:
### ~~App Launcher~~ ✅
I’m planning to develop an app launcher inspired by [Rofi](https://github.com/davatorium/rofi) on Linux. This feature
will provide a sleek and highly customizable way to quickly access your applications.
 _Image
courtesy of [rofi-themes](https://github.com/dctxmei/rofi-themes)_
### Customizable Popup Widgets
I aim to introduce a set of fully customizable popup widgets, similar to the features available in
[EWW](https://github.com/elkowar/eww). These widgets will be highly configurable and adaptable to your needs, providing
an enhanced and interactive way to manage your desktop environment.
 _Image
courtesy of [adi1090x](https://github.com/adi1090x/widgets)_
### Custom Alt + Tab (Task Switching)
An upgraded Alt + Tab system for task switching is on the horizon. This will offer a more visually appealing and
functional experience, allowing for smoother transitions between open applications and windows.
### Custom Virtual Desktops Viewer and Animations
I’m also working on a custom virtual desktops viewer and dynamic animations to improve navigation between different
workspaces. This will provide a more intuitive and immersive multitasking experience.
Stay tuned for more updates as I develop these features. I appreciate your support and enthusiasm!
Happy customizing!
The Seelen UI Team
## Contributing
We welcome contributions!
- Read the [Contribution Guidelines](CONTRIBUTING) to get started with terms.
## License
See the [LICENSE](LICENSE) file for details.
## Contact
For inquiries and support, please contact me on [Discord](https://discord.gg/ABfASx5ZAJ).
## Sponsors
We're grateful for the support of our sponsors who help make Seelen UI possible.
| Sponsor | Description |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------- |
| [](https://www.digitalocean.com/?refcode=955c7335abf5&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge) | **DigitalOcean** provides cloud infrastructure services that power our development and testing environments. |
| [](https://signpath.io/) | **SignPath** provides free code signing certificates, ensuring secure and trusted releases for our users. |
## See you later
```
. .& _,x&"``
& . &' ;.&&'
&. . &.& .0&&&;&""`
. '& &.&&& .&&&&&'
.& ;&&& &&&&&'
&& &&&&&&&& &&&
0& . &&&&&&&&""
&& .0 &&&&&&&
0&& .&' &&&&&&
:&&&&& . &&&&&
0&&&& & &&&&&
&&&&' &&&&&&& .&&&x&
&&&& :&&&&&0.&' , .&&&&&&&&&&;.
&&&&. &&&&&&&& .&&&&&&&&&&' .
0&&&& &&&&&&& ,&&&&&&&&&&&& &
:&&&&; &&&&&0 ,;&&&&&&&&&&& ; .0
0&&&&&&&&&&0 ,;&&&&&&&&&&&&& & &;
0&&&&&&&&&&0 :',;".&&&&&&".& && &0
0&&&&&&&&&0 ',;',&&&&&" ,&' &&&&0
0&&&&&&&&&0 ,x&&&&" .&&& &&&&0
0&&&&&& .&&&&"'''"&&"&& &&&&&0
0&& .&&;`` `&: :& &&&&&&0
&"' &&&&&&&& &"& &"& &&&&&&&&0
0&&&&&&&&&&&&&&&&&&&&&&&&&0
0&&&&&&&&&&&&&&&&&&&0 Seelen
0&&&&&&&&&0
```
---
📌 **Official Website**: [https://seelen.io](https://seelen.io)
Seelen Inc © 2026 - All rights reserved
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
At Seelen UI, we always recommend using the latest available version, as all versions are kept secure and up to date.
| Version | Support |
| ------- | ------------------ |
| Latest | :white_check_mark: |
## Reporting a Vulnerability
If you discover a vulnerability in Seelen UI, we appreciate you reporting it promptly.
### How to Report
- **Email:** Send an email to [support@seelen.io](mailto:support@seelen.io).
- **Discord:** Send a message to the project staff on our official Discord server.
### What to Expect
- **Acknowledgment:** You will receive a confirmation of receipt within 48 hours.
- **Updates:** We will keep you informed about the status of the investigation and any actions taken.
- **Resolution:** If the report is accepted, we will work on a solution and implement it in the next update.
Thank you for helping us keep Seelen UI secure for all users.
================================================
FILE: changelog.md
================================================
# Changelog
## [2.5.7-dev]
### features
- allow split multiple windows into separated items on dock.
- trash bin module for dock.
- allow change polling interval for system resources (cpu, ram, network usage, etc).
### fix
- not displaying tooltips on settings.
- apps menu folder creation being skipped.
- apps menu folder items not scrollable when overflowing.
- some msix apps using resources mapping via 'pri' files not having icons (ex: iCloud).
- PWA edge apps not extracting icons.
- power menu and workspace viewer not scaling properly when users set text scale factor.
- icons not refreshing on new installed apps.
- not clearing icon extraction failure list on cache clear.
- toolbar and calendar language not changing.
- flyout widget being shown on media player close as a dot in the screen.
## [2.5.6]
### fix
- dock pinned apps not being rendered correctly.
## [2.5.5]
### features
- disable all css animations on performance mode extreme.
- add more position options for flyouts.
- show custom browser profile icons instead program one.
- add 'pin to dock' option on apps menu widget.
### refactor
- dock state reimplemented.
### fix
- slow down on performace while dragging apps.
- prevent win32 handle leaks.
- user menu slow render.
- calendar language not being changed.
- media player stucked state.
- some lnk files (ex: docker) not appearing on apps menu.
- app not starting on corrupted settings files.
## [2.5.4]
### features
- new configurations for toolbar customization.
### enhancements
- log system.
- icon pack extractor and cache system.
### fix
- toolbar and dock state resetting on widget reload.
## [2.5.3]
### fix
- can't open apps using apps menu.
- app crashing for new users.
## [2.5.2]
### features
- add new widget security layer for exposed commands.
- apps menu optinal acrylic effect.
- allow users decide if use or not hardware acceleration.
### enhancements
- widgets loading time.
- settings resources lists.
### refactors
- remake wallpaper manager from react to svelte.
### fix
- infinity switching of items on toolbar.
- app not starting correctly from service.
- power menu clossing instantly.
- settings by apps not working after saving new state.
- context menu on toolbar bottom position.
- external links being opened on webview instead external browser.
- apps menu widget freeze on search.
- change wallpaper shortcuts not working.
- apps menu drag and drop.
## [2.5.1]
### enhancements
- add liveness prove for widgets.
### fix
- app failing opening on MSIX version.
## [2.5.0]
### features
- add corner actions on toolbar.
- add toggle desktop module on dock.
- allow layout sorting by windows dragging on the tiling window manager.
- workspaces viewer gui.
- wallpapers per monitor and per workspace.
- wallpaper collections.
- allow set start of week on calendars.
- extended wallpapers across all monitors.
- new start menu widget.
- customizable flyouts (volume, brightness, workspaces, notification, etc)
- resources usage plugins for toolbar.
### enhancements
- improve display changes events.
- tiling window manager now swap windows by center point on drag end.
- improve windows preview system.
- improvements on wallpaper manager syncronization and changes.
- settings UX improvements.
- extraction on local video wallpapers thumbnails.
- avoid reload the UI while playing as this can cause fps drops.
- reduce memory usage!
- copy button for icon list on settings.
### refactor
- toolbar items structure (breaking change).
### fix
- window manager moving windows being currently dragged by the user.
- power menu on multi-monitor setups.
- showing paused message on no video wallpapers.
- app not working on local accounts.
- app and service not running if already running on another session.
- high cpu usage while user session inactive.
- fix stale battery percentage on sleep wake up.
- click on keyboard layout no changing the layout on the system.
- window labels not being shown on dock.
- tiling window manager not pausing on maximized/fullscreen apps.
- run as admin not working on dock/taskbar.
- single key shortcuts not taking in care holded keys.
- wallpaper sometimes not showing on windows 11.
- no emitting brightness events.
- monitors missmatch.
## [2.4.11]
### fix
- tray not working on MSIX installation.
- shortcuts not being enabled by default but widgets yes.
## [2.4.10]
### refactor
- entire rewrite of the bluetooth module.
- internal widgets loader.
- internal generated icon pack logic.
### enhancements
- expose complementary colors of the system accent to css.
- change theme config url from input to local file selector.
- lazy widgets initialization.
- auto closing of popup widgets to save resources.
- show paused message on wallpaper manager.
### fix
- no updating data attribute on toolbar for maximized windows on background.
- ghost items on dock and window manager.
- missing messages to the service on startup.
- options field on theme settings rendering an input instead of selector.
- missing events on app windows hook.
- wasted space reserved for tiling window manager when dock/toolbar are disabled on monitor.
- fix missing variables values on default percentages for theme variables.
- #1290 dock and toolbar showing on other monitors when mouse is at edge of screen.
## [2.4.9]
### features
- implement wallpaper downloads.
- add new wallpaper type "layered" it allows create unique wallpaper via css.
- new css variables added related to the date (hour, minute, day, month, year).
## [2.4.8]
### enhancements
- toolbar overlapped and hidden state.
- addition of pdb files on nightly builds.
- interactable windows matching system.
### fix
- crash caused by wallpaper manager.
- toolbar being shown while using fullscreen apps.
- dock being shown while using fullscreen apps.
## [2.4.7]
### features
- add new cli command to tranlate resource texts.
### enhancements
- improve window manager matching system.
## [2.4.6]
### features
- add new cli command to bundle resources.
- allow close window using middle click on dock item preview.
### refactor
- remove export resource button from settings.
- remake wm ui from react to svelte (this reduced 10mb of ram usage).
- remove native shell window hook, instead use win32 hooks via dlls.
### fix
- infity switching loop on workspaces.
- memory leak on long sessions.
- external links not working.
- wallpaper manager corner barder radius.
- windows overlaping the toolbar and dock when autohide is disabled.
- Power Menu not showing corrently on multiple monitors (#1266).
## [2.4.5]
### features
- new power menu widget.
- widgets now can declare plugins to be loaded.
- new fields on widgets metadata.
- new system tray widget.
### enhancements
- disable individual shortcuts if attached widget is not enabled.
- only show enabled themes as quick access in settings window.
### refactor
- refactor on widget declarations for bundled widgets.
### fix
- app cli was not working.
- (#1258) missing translations on background process.
- apps being filtering wrong.
- stucked video wallpapers.
- deadlocks on media manager.
## [2.4.4]
### features
- add emergency shortcut to stop seelen process (Ctrl + Win + Alt + K).
### enhancements
- improve development ecosystem of resources via embedding of yaml files.
- allow open dev tools on release builds.
- optimize window movement animations.
- don't show version warning if target version is not present.
### fix
- not considering multiple batteries on setups.
- app not forcing restart on pc sleep/resume.
- app/service ipc messages corrupted on encode/decode.
- window manager animations enable logic.
- window manager not forcing size of windows on tiling.
- wallpaper paused while using Alt + Tab.
- stucked menus on extreme performance mode.
- stucked inline items after being dragged on toolbar.
### refactor
- move core library to main repository.
- remove app tray icon registration.
- remove windows tray icons related code.
- discord RPC now is disabled by default.
## [2.4.3]
### fix
- notifications not showing or working as expected.
- autohide not working properly on some screen resolutions.
- managing incorrect app windows on restart the app.
## [2.4.2]
### features
- tiling window manager animations.
- performance mode for seelen.
### enhancements
- improvement on power events.
- reduce memory usage (RAM).
### fix
- third party widgets sometimes not starting.
- can not save settings on empty wallpaper list.
- not updating UI on remotion of resources.
- button to update downloaded resources not working properly.
- crash on max integer caused by media players.
- media player popup not working properly.
- app not working when system installed on different drive unit.
- twm not considerationg the dock size.
## [2.4.1]
### features
- add a button to delete resources.
- add a button to update downloaded resources.
### enhancements
- cleanup of old service logs on start.
- add time to service logs.
### fix
- toolbar not showing when user deleted basic system folders.
- hotkeys stopping working after lock screen.
- update app button not showing correctly on settings.
## [2.4.0]
### features
- wallpaper resources.
- filter for wallpapers.
- tranfomation for wallpapers.
- wallpaper animations on in/out.
- unique wallpaper slider per monitor.
- new shortcuts to create/delete and change virtual desktops.
- add force restart of gui, via shortcut `Ctrl + Win + Alt + R`.
- now workspaces are per monitor.
- now workspaces persist over restarts.
- on window manager windows now can be float or tiled.
- implement focus change via keyboard hotkeys on tiling window manager.
- implement container swapping via keyboard hotkeys on tiling window manager.
- swap twm containers on window drag event.
### refactor
- monitors ids.
- wallpaper manager.
- virtual desktops.
- tiling window manager.
### fix
- drag of text toolbar items not working.
- live wallpapers blocking screensaver and lock screen.
- sleep/wake up events not working.
## [2.3.12]
### enhancements
- add new ways of customization for theme settings
### fix
- volume changed popup wrong placement.
## [2.3.11]
### features
- allow add shared styles on themes to be applied to all the widgets.
### enhancements
- dock and toolbar autohide behaviors.
- animations on popups and start of the own component library.
### refactor
- start migrating to preact signals.
### fix
- (#1019) maximized windows being detected as fullscreen.
- icorrect resource id regex.
- sorting of items on dock and toolbar.
## [2.3.10]
### hotfix
- missing react icons.
## [2.3.9]
### features
- discord rich presence.
### refactor
- icon packs implementation.
- changed react to preact.
### fix
- app crashing on start by missing user folder (desktop, pictures, etc).
## [2.3.8]
### enhancements
- show a warning to users with monitors drivers disabled.
- allow change workspace using wheel on toolbar.
### fix
- (#897) stucked arrival notifications.
- showing native notifications preview with the seelen ones (now only seelen arrival will be shown).
- (#934) invisible edge window on dock.
- (#925) invisible spotify widget on dock.
- (#938) listing 6ghz networks as 5g networks.
- (#962) JetBrains software isn't showing in dock.
- (#923) Can't change media device on MSIX version.
## [2.3.7]
### enhancements
- expose timeline on media players.
- reduce bundled size of js code.
- reduce verbosity on logs comming from widgets.
## [2.3.6]
### features
- widgets implementation.
- allow load/unload widgets via command line client.
### refactor
- improve internal code quality related to app console client.
### fix
- app not starting on start-menu cache corruption.
- widgets being reloaded on ctrl + r.
## [2.3.5]
### fix
- settings by monitor not working correctly.
## [2.3.4]
### enhancements
- sort windows on dock by activation order.
### fix
- duplicated themes on settings GUI.
- bad toolbar color on multiple maximized windows.
## [2.3.3]
### features
- add open window label on dock for app items (configurable).
- add input to write custom text items on the toolbar.
- add export resource button on developer tools.
- allow settings by theme.
### enhancements
- Settings UI refactor to follow the new resources ecosystem.
- (#838) Improve dynamic color behavior on toolbar.
### fix
- not removing old icons mask on icon pack change.
- styles for dock media item.
- not scrollable dock on overflow (many items).
- media player not being correctly updated on player close event.
- (#636) input experience and another background process appearing on dock.
## [2.3.2]
### enhancements
- mini performance improve on dock.
### fix
- resources not being updated correctly.
## [2.3.1]
### breaking changes
- rename scope variables for toolbar plugins.
### refactor
- improve inner code quality on toolbar plugins.
### enhancements
- improve robustness on toolbar items to avoid blue screen.
## [2.3.0]
### breaking changes
- remove mathjs eval by an more accurated eval for js code in toolbar plugins. This will break any plugin created before
v2.2.10.
### features
- add resources endpoint to home tab on settings.
- add customizable and reusable popups implementation.
- improvements on toolbar plugins system.
- allow set buttons with custom actions on toolbar, via toolbar plugins.
- add restore to default button for toolbar structure.
- allow fetching remote data on toolbar plugins.
### enhancements
- reduce CPU usage on slu-service process.
- improve ui on toolbar modules.
### fix
- media player styles on toolbar.
- steam pin item on dock not working properly.
- plugins not being updated on toolbar.
## [2.2.9]
### enhancements
- store service logs in a file to help debugging.
- wait for native shell on startup before start seelen ui.
## [2.2.7]
### fix
- dock items not opening correctly.
## [2.2.6]
### feature
- icons on icon packs now can declare a mask that could be used by themes.
### enhancements
- add custom icons to bluetooth devices.
- allow set different icons by color scheme (light or dark) on icon packs.
### fix
- no dragable dock files and folders.
- focusing widgets on creation.
- not opening settings window when starting the app with an instance already running.
## [2.2.4]
### enhancements
- add suspend/resume logic.
### fix
- not restoring native taskbar on close/crash.
- clear all notifications button not updating UI.
- not translated date on chinese and norwegian.
## [2.2.3]
### enhancements
- wrap webview console as soon as posible to avoid missing errors on logs.
- wait some seconds before remove media players to avoid shifting on chrome.
### refactor
- remove minified classnames and add do-not-use prefix to be clear to users.
### fix
- panic on media module when loading initial devices.
- discord window without umid (for now umid was hardcoded).
- focused app not updating on title change.
- not considerating accesibility text scale factor on toolbar and dock.
- wheel not changing volume level.
- clear all notifications button not working correctly.
## [2.2.2]
### enhancements
- add option to disable dynamic colors on toolbar.
- reduce notification arrival time on screen from 10 seconds to 5 seconds.
### fix
- not showing some notifications.
- crash when disabling a monitor on windows native settings.
- unsyncronized clock on toolbar.
## [2.2.1]
### enhancements
- add new bundled theme as example of animated icons with css.
## [2.2.0]
### features
- add option to disable app thumbnail generation (dock).
- allow lock the dock/toolbar items.
- show instances counter of the same app on dock.
- allow set the toolbar on different positions.
- allow set custom start menu icon.
- language selector for toolbar.
- add dynamic color by focused app on toolbar.
- add hibernate button on toolbar power menu.
- add media volume mixer by apps and by device.
- add clickable notifications, images, and more.
### enhancements
- settings shown each time on startup.
- expand power module with power plan.
### refactor
- update windows-rs crate to 0.59.0.
### fix
- showing domain on username for local accounts.
- showing application frame host instead real app name.
- incorrect event order on win events.
## [2.1.9]
### fix
- shortcuts not working on MSIX.
- empty username for local accounts.
## [2.1.8]
### features
- add button to clear the cached icons on settings.
### enhancements
- allow custom icons by extension on icon packs.
### fix
- error on file icons.
- fix blue screen on toolbar when errors on template evaluation.
## [2.1.7]
### fix
- power module not clickable on toolbar.
- pinned items not working correctly for some apps.
- electron apps without aumid.
## [2.1.6]
### fix
- missing translations.
- fullscreen match not beeing removed.
## [2.1.5]
### fix
- devices and battery not clickables on toolbar.
- missing icon on dock media module while not playing.
- msix store not showing admin prompt.
- links on settings not opening.
## [2.1.4]
### fix
- crash on user module.
- slow loading of toolbar.
- no icons on PWA from edge browser.
- icon packs not modifying icons on toolbar/dock media modules.
- icon packs bad ordering, now the priority order is (umid > full-path > filename > extension).
- bad dock execution path on apps with property store umid but no shortcut on start menu.
## [2.1.3]
### fix
- bad user infomation on user module.
## [2.1.2]
### fix
- style issue on toolbar user module.
- showing unhandable tray icons (ex: nvidia old control panel).
- installer being frozen on update.
## [2.1.0]
### features
- allow custom animations on popups/dropdowns.
- show open new window buttons on dock app items context menu.
- toggle dock items using win + number.
- notifications count on dock app items.
- add brightness slider to quick settings on toolbar.
- add user module on toolbar.
### refactor
- create separated system service to handle elevated actions.
### fix
- ghost windows caused by a refactor donde on v2.0.13.
- not showing save button after icon packs change.
- app failing when powershell is not part of the $PATH enviroment.
- dock items no updatings paths on store updates.
- unremovable workspace module on toolbar.
- missing system tray icons.
- date not being inmediately updated on settings change.
- ghost notification hitbox preventing mouse events on windows.
## [2.0.14]
### hotfix
- not creating the default (system) icon pack.
## [2.0.13]
### features
- add kill process option on context menu for dock items.
- multi-language calendar and date module on toolbar.
- add icon packs selector on settings > general.
- allow show only windows on monitor owner of Dock/Taskbar.
### enhancements
- allow search languages by their english label.
### refactor
- move dock state to the background.
- remove pin sub-menu on dock.
### fix
- slu-service was being closed on exit code 1.
- logging errors on monitor changes.
- duplicated items on dock after drag items.
## [2.0.12]
### fix
- msix version crashing on start.
## [2.0.11]
### features
- add new setting on dock and toolbar to maintain overlap state by monitor.
- add service to restart the seelen-ui app on crash.
### enhancements
- force run the app as an APPX if it was installed using msix.
### refactor
- custom http server to serve files instead bundle it in the executable on development (local).
### fix
- remove ghost settings window from dock.
## [2.0.10]
### fixes
- fix settings `cancel` button not working correctly.
- fix settings `save` button not saving the monitor settings correctly.
## [2.0.9]
### enhancements
- add `XboxGameBarWidgets.exe` to the bundled apps settings list.
### refactor
- themes now use widget ids instead hard-coded keys.
- improvements on events propagation.
- improvements on settings by monitor implementation.
### fix
- window manager not working properly.
- resolution, scale changes not refreshing the UI.
## [2.0.8]
### enhancements
- add task manager shortcut on toolbar and dock context menu.
- improve default no media style on dock.
- add icons to context menus.
### fix
- randomized wallpaper slice freeze.
- bad behavior on context menus and popups.
## [2.0.7]
### fix
- crashing on fresh installations.
## [2.0.6]
### feature
- add bases for future plugins and widgets sytems.
- change wallpaper randomly.
### enhancements
- some UI/UX improvements on seelen wallpaper manager.
- UI/UX improvements on wi-fi toolbar module.
- seelen-ui added to user PATH enviroment variable.
### fix
- popups and context menus fast flashing.
- media player app not appearing on media module (weg & toolbar).
- touch looking the cursor.
- improve start up failure behavior.
## [2.0.5]
### features
- allow change default output volume using mouse wheel on media module items.
- add mini calendar to date module.
### enhancements
- add new settings to delay the show and hide of dock and toolbar.
### fix
- dock and toolbar animations
- fix update notifications for release and nightly channels.
## [2.0.4]
### fix
- app crashing when changing settings on app launcher.
- app previews on wrong position on dock.
## [2.0.3]
### fix
- apps being runned as admin instead normal.
## [2.0.2]
### fix
- infinite render loop on settings home page, fetching news.
## [2.0.1]
### refactor
- unification of SeelenWeg pinned files, folder and apps in a single structure.
### enhancements
- improve open_file function to allow arguments.
- allow to users select update channel between release, beta and nightly.
### fix
- not getting icons directly from .lnk files.
- users not recieving update notification on settings header.
- start-menu item on dock not closing native start menu.
- default theme wallpaper showing cut on ultra-wide monitors.
## [2.0.0]
### breaking changes
- Window Manager Layout Conditions was reimplemented, old conditions (v1) will fail.
### refactor
- refactors, more and more refactors, refactors for everyone.
- reimplementation of Tiling Window Manager.
- remove Update modal at startup by an update button on settings.
### features
- make the dock/taskbar solid when hide mode is `never`.
- add app launcher (rofi for windows).
- add seelen wall (rain-meter and wallpaper engine alternatives).
- expose function to pin items into the dock.
- settings by monitor.
- window manager multimonitor support.
- allow users change date format directly on UI settings.
- add context menu to toolbar items.
### enhancements
- improve quality icons from all app/files items.
- improve init loading performance.
- improve fullscreen matching system.
- reduce UI total size from 355mb (v1) to 121mb (v2-beta4) to 93mb (v2-beta8).
- reduce Installer size from 75mb (v1) to 40mb (v2-beta4) to 28.8mb (v2-beta8).
- allow drop files, apps and folders into the dock to pin them.
- now Virtual Desktop shortcuts doesn't require Tiling WM be enabled to work.
- now Themes are wrapped in a CSS layer, making easier the override theming.
- allow change size of Window Manager Layouts via window resizing with the mouse.
- allow close windows by middle clicking on dock items.
- show icon of app in media players that are not uwp/msix.
- show pwa apps like a separeted app from browser on dock.
### fix
- missing icons for files with a different extension than `exe`.
- losing cursor events on clicking a dock item.
- app allowing be closed via Alt + F4.
- native taskbar being hidden regardless of whether the program starts successfully or not.
- app continuing running when the program fails to start (case: WebView2 Runtime not installed).
- no stoping correctly secondary processes/threads on app close.
- showing unmanageable windows on dock.
- restart seelen-ui button not working properly.
- tray icons not working on others language than english.
- edge tabs open in file explorer.
## [1.10.6]
### fix
- tray module only working when the system language is english.
## [1.10.5]
### fix
- app crashing on IMMDevice disconnection.
## [1.10.4]
### enhancements
- clean weg items on load to remove duped items and apps/files that don't exist.
- remove 1/2px thickness border on window manager border.
- remove 1/2px black border on some previews of apps.
### fix
- can not restore settings window.
- taskbar not been restored when changing weg enabled state.
- taskbar been restored always as not autohide, now it will restored as initial state.
## [1.10.3]
### features
- add beta channel
### enhancements
- add debugger cli toggles to tracing more info on logs.
- media modules now exports the app related to the media player.
### fix
- saving ahk lib in wrong location.
## [1.10.2]
### fix
- app crashing on enumerating many monitors or on large load.
## [1.10.1]
### fix
- app crashing if uwp package has missing path.
- app no working fine on multiple monitors.
## [1.10.0]
### features
- add volume changed popup.
- new custom virtual desktop implementation.
- shortcut to toggle debug mode on hitboxes (Control + Win + Alt + H).
### enhancements
- remove black borders of windows previews on dock.
- improve uwp app manage on dock/taskbar.
### refactor
- add strategy pattern to virtual desktops.
### fix
- topbar hitbox rect on auto hide equals to on-overlap.
- bad matching fullscreen apps.
- suspended process (ex: Settings) been shown on dock.
- uwp icons not loading correctly.
- bad focused app matching strategy.
## [1.9.11]
### features
- add a option to hide apps from the dock/taskbar, requested on #5.
- update tray labels when tray icons module are open.
- add auto-hide option to the toolbar.
### fix
- route no maintaining on cancel changes on settings window.
- cancel button no working correctly after save the settings multiple times.
- tray module no forcing tray overflow creating on startup.
- native taskbar not been restored on close.
## [1.9.10]
### features
- add `getIcon` fn to the scopes of toolbar placeholders.
### refactored
- improve interfaces and documentation.
### fix
- styles of media module when dock is on left side.
- opened apps been removing on weg items file change.
- app crashing on update if language prop was null in the settings.json file.
## [1.9.9]
### refactored
- internal interfaces to improve documentation and development.
### enhancements
- add language selector to the nsis installer.
- allow search on lang selector on Seelen UI Settings.
### fix
- app no opening to new users.
## [1.9.8]
### enhancements
- avoid recreate already existing folders.
- separate lib and app in two crates.
- improve click behavior on seelen weg item to make it more intuitive.
### fix
- can no disable run on startup.
- text been cut on toolbar.
- app crashing on wallpaper change on win11 24h2
## [1.9.7]
### enhancements
- made all invoke handlers async
### fix
- crash on registering network event
## [1.9.6]
### fix
- app crashing on 24h2
## [1.9.5]
### fix
- app crashing by tray icon module
## [1.9.4]
### fix
- app crashing for new users
## [1.9.3]
### performance
- reduce load time from ~7s to ~4s
### features
- .slu and uri now are loaded correctly on seelen ui.
- allow change wallpaper from seelen settings.
### enhancements
- add file associations for .slu files
- add uri associations for seelen-ui:uri
- improve settings editor experience by adding live reload feature.
### fix
- cli no working on production
## [1.9.1]
### fix
- no listening window moving of virtual desktop events.
- no closing or starting widgets on settings changes.
- no listening monitors changes.
- no loading toolbar modules on wake up
## [1.9.0]
### features
- allow custom images on toolbar by `imgFromUrl`, `imgFromPath` and `imgFromExe` functions.
- add notifications module to toolbar.
- add exe path to window in generic module for toolbar.
- add focused window icon to default toolbar layouts.
### enhancements
- icons now are recreated from exe path if icon was deleted.
- uwp icons now are loaded from background.
- improvements on themes selector.
- improvements on system color detection and expose more system colors based in accent gamma.
- improve theme creation experience by adding live reload feature.
- improve toolbar layouts (placeholders) creation experience by adding live reload feature.
- improve weg items editor experience by adding live reload feature.
### refactor
- deprecate `onClick` and add new `onClickV2` on toolbar modules.
### fix
- bad translations keys.
- no restoring dock on closing fullscreened app.
## [1.8.12]
### fix
- app installed by msix no opening.
## [1.8.11]
### fix
- remove unnecessary 1px padding on toolbar.
## [1.8.10]
### enhancements
- remove unnecessary loop on taskbar hiding function.
### fix
- no loading translations correctly on update modal.
## [1.8.9]
### enhancements
- add translation to the rest of apps (dock, toolbar, and update modal).
### fix
- not hiding the taskbar at start.
- opening multiple instances of the app.
## [1.8.8]
### fix
- app not running on startup
## [1.8.7]
### fix
- no updating themes on changes saved.
## [1.8.6]
### features
- Add multi-language support! 🥳.
- Add default media input/output selectors to media module in fancy toolbar.
- Add start module to dock/taskbar (opens start menu).
### enhancements
- Flat default themes to allow easier overrides.
### fix
- Fix zorder on hovering on weg and toolbar respectively to wm borders.
- Applying bad themes on apps.
- Not hiding the taskbar at start.
## [1.8.5]
### fix
- no executing seelen after update installation
## [1.8.4]
## [1.8.3]
### refactor
- migrate settings files from `$USER/.config/seelen` to `$APPDATA/com.seelen.seelen-ui`
- load uwp apps info asynchronously
### fix
- crash on move toolbar item
- can not remove media module
## [1.8.2]
### features
- fancy toolbar items now can be dragged of position.
- using fancy toolbar's layout now can be modified and saved as custom.yml.
## [1.8.1]
### features
- styles can be specified in fancy toolbar placeholder item.
- fancy toolbar item now will have an unique id, this can be specified in the placeholder file.
### enhancements
- replace "bluetooth" for "devices" on bundled fancy toolbar placeholders.
## [1.8.0]
### features
- Media module added to the toolbar.
- Media module added to SeelenWeg.

- SeelenWeg now has a context menu (Right Click Menu).
### enhancements
- enhancements on fullscreen events.
### refactor
- remove Default Wave animation on seelenweg (users will be able to add their own animations).
### fix
- no updating colors correctly on change light or dark mode on windows settings.
- window manager enabled by default for new users.
- showing tray icons with empty name.
- no focusing seelen settings if it was minimized.
## [1.7.7]
### fix
- no registering system events (battery/network/etc)
## [1.7.6]
### enhancements
- improve logging on dev mode and fix missing target on production logged errors.
- improve fullscreen matching.
### fix
- network icon showing incorrect interface icon (lan instead wifi).
- no updating adapters list and using adapter on network changes.
## [1.7.5]
## [1.7.4]
### enhancements
- improvements on workflows to auto upload artifacts to the store.
## [1.7.3]
### enhancements
- improvements on fullscreen events.
## [1.7.2]
### enhancements
- disable tiling window manager on windows 10 from UI (can be forced on settings.json file)
### fix
- app crashing on windows 10
- empty tray icons list on windows 10
## [1.7.1]
### enhancements
- separate `information` and `developer tools` tabs in the settings.
- add a option to open the install path in explorer.
- focus settings window if already exist.
- better performance on canceling changes in settings.
- avoid loading innecesary files in modules that are not used.
- update pinned apps path by filename on open (some apps change of path on updates so this will fix that).
- show empty message on toolbar when no wlan networks are found.
### fix
- ahk error on save.
## [1.7.0]
### features
- add Network toolbar module.
- add WLAN selector to the Network toolbar module.
- add css variable (--config-accent-color-rgb) to be used with css functions like `rgb` or `rgba`.
### enhancements
- now placeholders, layouts and themes can be loaded from data users folder (`AppData\Roaming\com.seelen.seelen-ui`)
- now buttons and others components will use the user accent color.
### fix
- no max size on System Tray List module.
## [1.6.4]
### fix
- xbox games showing missing icons on SeelenWeg.
### enhancements
- follow user accent color for tray list and windows borders
### fix
- no showing promoted (pinned on taskbar) tray icons.
- toolbar no initialized correctly sometimes, now will retry if fails.
- battery no updating level.
- battery showing as always charging on default toolbar templates.
- tray overflow module no working on different languages.
### refactor
- refactor on window_api and AppBar structures.
## [1.6.3]
### enhancements
- only show a progress bar on update and not the complete installer GUI.
### fix
- main app no running if the forced creation of tray overflow fails.
## [1.6.2]
### features
- now `batteries` and `battery` (same as: `batteries[0]`) are available on the scope of power toolbar module.
### enhancements
- add battery crate to handle batteries info directly from their drivers.
- show if is smart charging.
- now battery module wont be shown if batteries are not found.
### fix
- battery showing 255%.
## [1.6.1]
### fix
- tray icons not showing on startup
- hidden trays if icon was not found (now will show a missing icon)
## [1.6.0]
### features
- add "Run as admin" option at context menu on Seelenweg.
- allow receive commands using TCP connections.
- Add System Tray Icons module, (incomplete, devices like usb or windows antivirus trays are still not supported).
### enhancements
- improve power (battery) events performance.
- Window manager disabled by default to new users.
### refactor
- remove tauri single instance plugin by TCP connection.
## [1.5.0]
### features
- new placeholder added to the bundle as alternative to default.
- new workspace item available to be used in placeholders.
### enhancements
- support fullscreen apps (will hide the toolbar and the weg on fullscreen an app).
### fix
- showing incorrect format on dates at start of the app.
- complex text with icons on toolbar items cause wraps.
- missing icons on some uwp apps.
### refactor
- refactor on window event manager to allow synthetic events.
## [1.4.1]
### fix
- no truncating text on toolbar items overflow.
- rendering empty items on toolbar when empty placeholder is declared.
## [1.4.0]
### features
- Modular Themes
- Themes now allow tags to be categorized.
- Allow add, organize, combine multiple themes as cascade layers.
- Themes now allow folder structure to improve developers experience.
### refactor
- Now themes will use .yml files instead json to improve developers experience.
- Themes schema updated, no backwards compatibility with json themes. (.json in themes folder will be ignored)
### fix
- No hiding the taskbar correctly.
## [1.3.4]
### enhancements
- Add splash screen to Settings window.
- Add discord link on Information Section.
### refactor
- Use TaskScheduler for autostart Seelen with priority and admin privileges.
### fix
- bad zorder on Weg and Toolbar under the WM borders
## [1.3.3]
### features
- Multi-monitor support for Fancy Toolbar.
- Multi-monitor support for Seelenweg.
## [1.3.2]
### enhancements
- Remove unnecessary tooltip collision on toolbar items.
### fix
- Crash on restoring app in other virtual desktop using Weg.
- Touch events not working on Toolbar and Weg.
## [1.3.1]
### fix
- disable binding monitors and monitors on apps configurations for now.
## [1.3.0]
### features
- Allow pin apps on Open using Apps Configurations.
- Allow changes Shortcuts using UI.
- Allow Binary Conditions in Apps Configurations Identifiers.
- Allow change the Auto hide behavior for Seelenweg.
### enhancements
- Close AHK by itself if app is crashed or forcedly closed.
- Configurations by apps are enabled again.
- Allow open settings file from Extras/Information
- Add opacity to toolbar (theme: default)
### fix
- Ahk not closing on app close or when user change options.
## [1.2.4]
### enhancements
- Automatic MSIX bundle.
- Add Github Actions for Releases.
- Add Github Actions for Web Page.
## [1.2.3]
### features
- Allow customize Fancy Toolbar modules using placeholders yaml files.
- Add fast settings for toolbar allowing to adjust volume, brightness, etc.
## [1.2.2]
### enhancements
- if app on weg is cloak, change of virtual desktop instead minimize/restore
### fix
- no closing AHK instances
- floating size on fallback
- reservation not working properly
- ignore top most windows by default (normally these are tools or widgets)
- minimization on weg not working properly if window manager is activated
- change focus using commands not working with conditional layouts
- randomly frozen app on start
- no tiling UWP apps
## [1.2.1]
### enhancements
- Allow quit from settings
- Using Box-Content style in the position of windows instead outlined for a better user experience
### fix
- Managing windows without caption (Title bar)
- can't update border configurations
- hiding dock on switching virtual desktops
## [1.2.0]
### fix
- Taskbar showing instead be always hidden
## [1.1.1]
### fix
- Bad download URL in Update Notification
- Showing update notification on installations by Windows Store
## [1.1.0]
### features
- Add Smart Auto Hide for Seelenweg.
- Add visible Separators Option
- Enable animations for items into LEFT, TOP, RIGHT positions
### enhancements
- Now the copy handles option will return hexadecimal handles instead decimal (good for faster debug in tools like
spy++).
### fix
- duped handles
- inconsistencies in separators width
## [1.0.1]
### fix
- App downloaded form Microsoft Store was not running without admin.
## [1.0.0]
### refactored
- Update notifications always enabled for nsis installer
- Update notifications will not appear if app is installed using msix (Microsoft Store).
### enhancements
- Now by default if user is Admin, UAC will be triggered on run the app to allow a better integrated experience in
SeelenWeg and Komorebi Tiling Manager.
## [1.0.0-prerelease.14]
### features
- add indicator to know opens and focused apps on SeelenWeg
- allow set the position of seelenweg (left, top, right, bottom) 🎉
### enhancements
- only creates app icons the first time they are loaded
### refactor
- change themes implementation to allow customs css files
### fix
- incorrect icon for UWP (was using store icon instead taskbar icon)
- replacing icons on each load
- showing logs of opened apps on development
- offset margins working like windows RECT instead like one side margins
## [1.0.0-prerelease.13]
### features
- add Themes Feature 🎉 (incomplete only for Seelenweg for now)
- add SeelenWeg (a Dock or Taskbar) beta feature
- add SeelenWeg in to Settings
- add ContextMenu for apps in SeelenWeg
- allow move apps in the Weg 😄
- add Grouped Apps in one item
- live reload of Apps on events like change of title
- UWP apps support
### enhancements
- move readme blob to documentation/images
## [1.0.0-prerelease.12]
### enhancements
- add some traces on functions to save logs
### fix
- clean installation of komorebi no working
## [1.0.0-prerelease.11]
### refactor
- little improvements on background code
### fix
- initial users can not save the settings
## [1.0.0-prerelease.10]
### features
- add a update tab to allow users decide if will receive notifications for updates
## [1.0.0-prerelease.9]
## [1.0.0-prerelease.8]
- add functionality to pause btn on tray menu
## [1.0.0-prerelease.6]
### added
- Enable Updater 🎉
## [1.0.0-prerelease.3]
### fix
- icon not showing on tray
- poor icon quality on task bar
- StartUp running bad exe file
## [1.0.0-prerelease.2]
## [1.0.0-prerelease.1]
### added
- implement tray icon
### refactored
- Migrate all app background from Electron ⚡ to Tauri 🦀
- reimplement startup to use native system startup
- reimplement included shortcuts with ahk
- reimplement komorebi autostart
- reimplement installer to use NSIS
- refactor folder structure to isolate front-end apps
## [1.0.0-beta.13]
### enhancements
- improve maximized windows experience
### fixed
- fix resize not working (now works like master)
## [1.0.0-beta.12]
### added
- show current used versions on information
- add grid layout preview
- add win + k to open komorebi settings
### refactored
- update komorebi to 0.1.22
### removed
- remove invisible borders feature
## [1.0.0-beta.11]
### fixed
- missing property on schema
- white screen on start app
## [1.0.0-beta.10]
### added
- add a new way to match applications by path
### fixed
- searching feature on apps
- no focusing windows on change workspace
- autostacking not working properly
- workspaces rules not working
## [1.0.0-beta.9]
### added
- add popups on actions 🦀
- now can switch from installed and packaged and should work as the same
### fixed
- fix no removing old path
- lag on many applications
## [1.0.0-beta.8]
### added
- add more templates
## [1.0.0-beta.7]
### fixed
- fix first install
## [1.0.0-beta.6]
### added
- delete old paths on update
### fixed
- fix not saving templates
- fix toggle ahk shortcuts does not run or stop the instance
- running ahk when disabled
- not updating the path of installation folder on update for windows tasks
## [1.0.0-beta.5]
### added
- new searching option for applications
- templates feature
### fixed
- including ghost apps on migration
## [1.0.0-beta.4]
### added
- new feature of invisible borders per app
- new easy way to hard restart the services and AHK
### changed
- delete border overflow and changed for invisible borders per app
### fixed
- components was not triggering dark mode correctly
## [1.0.0-beta.3]
### added
- new apps templates
- add AHK as a dependency to show to new users
- add AHK settings
## [1.0.0-beta.2]
### added
- export option for apps
### fixed
- delete bound monitor and workspace on an application
- bad installation on setup
================================================
FILE: crowdin.yml
================================================
base_path: "."
base_url: "https://api.crowdin.com"
preserve_hierarchy: true
files:
- source: i18n/**/en.yml
translation: /%original_path%/%two_letters_code%.yml
================================================
FILE: deno.json
================================================
{
"lint": {
"rules": {
"include": [
"verbatim-module-syntax"
],
"exclude": [
"prefer-const",
"jsx-button-has-type",
"no-explicit-any",
"ban-types",
"no-window",
"no-window-prefix",
"no-sloppy-imports"
]
}
},
"fmt": {
"lineWidth": 120,
"exclude": [
"**/i18n/translations/**"
]
}
}
================================================
FILE: lefthook.yml
================================================
commit-msg:
commands:
lint-commit-msg:
run: npx commitlint --edit
pre-commit:
commands:
file-format:
priority: 1
run: deno fmt --check
rust-format:
priority: 2
glob: "**/*.rs"
run: cargo fmt -- --check
ts-type-check:
priority: 3
glob: "**/*.{js,jsx,ts,tsx}"
run: npm run type-check
js-linter:
priority: 5
glob: "**/*.{js,jsx,ts,tsx}"
run: deno lint
rust-linter:
priority: 6
glob: "**/*.rs"
run: cargo clippy --all-targets -- -D warnings
pre-push:
commands:
js-test:
priority: 1
glob: "**/*.{js,jsx,ts,tsx}"
run: npm run test
rust-test:
priority: 3
glob: "**/*.rs"
run: cargo test
================================================
FILE: libs/core/.gitignore
================================================
npm
================================================
FILE: libs/core/Cargo.toml
================================================
[package]
name = "seelen-core"
version = "2.5.7"
edition = "2021"
rust-version = "1.89"
[lints]
workspace = true
[dependencies]
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true }
serde_yaml = { workspace = true }
serde_alias = "0.0.2"
schemars = { version = "1.2.1", features = ["url2", "uuid1", "chrono04"] }
regex = { workspace = true }
sys-locale = "0.3.2"
uuid = { workspace = true, features = ["v4", "serde"] }
ts-rs = { version = "12.0.0", features = [
"no-serde-warnings",
"serde-json-impl",
"url-impl",
"uuid-impl",
"chrono-impl",
] }
base64 = { workspace = true }
url = { workspace = true, features = ["serde"] }
grass = { version = "0.13.4", default-features = false, features = ['random'] }
num_enum = "0.7.5"
chrono = { version = "0.4.43", features = ["serde"] }
paste = "1.0.15"
[features]
gen-binds = []
================================================
FILE: libs/core/deno.json
================================================
{
"name": "@seelen-ui/lib",
"version": "2.5.7",
"description": "Seelen UI Library for Widgets",
"license": "AGPL-3.0-only",
"exports": {
".": "./src/lib.ts",
"./types": "./gen/types/mod.ts",
"./tauri": "./src/re-exports/tauri.ts"
},
"tasks": {
"build:npm": "deno run -A ./scripts/build_npm.ts",
"build:rs": "deno run -A ./scripts/rust_bindings.ts",
"build": "deno task build:rs && deno task build:npm"
},
"test": {
"include": [
"src/**/*.test.ts"
]
},
"imports": {
"@deno/dnt": "jsr:@deno/dnt@0.42.3",
"@seelen-ui/types": "./gen/types/mod.ts",
"@std/assert": "jsr:@std/assert@^1.0.19",
"@std/encoding": "jsr:@std/encoding@^1.0.10",
"@tauri-apps/api": "npm:@tauri-apps/api@^2.10.1",
"@tauri-apps/plugin-dialog": "npm:@tauri-apps/plugin-dialog@^2.6.0",
"@tauri-apps/plugin-fs": "npm:@tauri-apps/plugin-fs@^2.4.5",
"@tauri-apps/plugin-log": "npm:@tauri-apps/plugin-log@^2.8.0",
"@tauri-apps/plugin-process": "npm:@tauri-apps/plugin-process@^2.3.1"
},
"compilerOptions": {
"lib": [
"dom",
"dom.iterable",
"ES2023"
]
},
"fmt": {
"lineWidth": 120
},
"lint": {
"rules": {
"include": [
"explicit-function-return-type"
],
"exclude": [
"no-slow-types"
]
}
},
"publish": {
"include": [
"src",
"gen",
"readme.md"
],
"exclude": [
"src/**/*.test.ts"
]
},
"exclude": [
"npm"
]
}
================================================
FILE: libs/core/mocks/themes/v2.3.0.yml
================================================
id: "@eythaann/variables-test"
metadata:
displayName: Variables Test
description: this theme is just for testing
appTargetVersion: [2, 3, 0]
settings:
- syntax: <color>
name: --testing-settings1-1
label: Testing Color Setting 1
initialValue: "#f00"
- syntax: <color>
name: --testing-settings1-2
label: Testing Color Setting 2
initialValue: "#00f"
- syntax: <length>
name: --testing-sizes
label: Testing Length Setting 3
initialValue: 20
initialValueUnit: px
- syntax: <number>
name: --testing-number
label: Testing Number Setting
initialValue: 60
- syntax: <string>
name: --testing-string
label: Testing User Input
initialValue: "hello world"
- syntax: <url>
name: --testing-url
label: Testing User URL Input
initialValue: https://google.com
================================================
FILE: libs/core/mocks/themes/v2.3.12.yml
================================================
id: "@eythaann/variables-test"
metadata:
displayName: Variables Test
description: this theme is just for testing
appTargetVersion: [2, 3, 12]
settings:
- syntax: <color>
name: --testing-settings
label: Testing Color Setting1-1
initialValue: "#f00"
- syntax: <color>
name: --testing-settings1-2
label: Testing Color Setting 2
initialValue: "#00f"
- syntax: <length>
name: --testing-sizes
label: Testing Length Setting 3
initialValue: 20
initialValueUnit: px
- syntax: <number>
name: --testing-number
label: Testing Number Setting
initialValue: 60
- syntax: <string>
name: --testing-string
label: Testing User Input
initialValue: "hello world"
- syntax: <url>
name: --testing-url
label: Testing User URL Input
initialValue: https://google.com
- group:
header: This is a group header
items:
- syntax: <color>
name: --testing-settings2-1
label: Testing Color Setting
description: This is a description to test log text in the settings UI
initialValue: "#f00"
- syntax: <color>
name: --testing-settings2-2
label: Testing Color Setting 2
initialValue: "#00f"
- syntax: <length>
name: --testing-sizes2
label: Testing Length Setting 3
description: This is a description to test log text in the settings UI
initialValue: 20
initialValueUnit: px
- syntax: <number>
name: --testing-number2
label: Testing Number Setting
initialValue: 60
- syntax: <string>
name: --testing-string2
label: Testing User Input
initialValue: "hello world"
- syntax: <url>
name: --testing-url2
label: Testing User URL Input
initialValue: https://google.com
- group:
header: This is a sub group header
items:
- syntax: <color>
name: --testing-settings2-1
label: Testing Color Setting
initialValue: "#f00"
- syntax: <color>
name: --testing-settings2-2
label: Testing Color Setting 2
initialValue: "#00f"
- syntax: <length>
name: --testing-sizes2
label: Testing Length Setting 3
tip: This is a tooltip to test, log text in the settings UI here as well as the description below it as well as the label of the setting
description: Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
initialValue: 20
initialValueUnit: px
- syntax: <number>
name: --testing-number2
label: Testing Number Setting
description: This is a description to test log text in the settings UI
initialValue: 60
options:
- 60
- 90
- 120
- 300
- syntax: <string>
name: --testing-string2
label: Testing User Input
initialValue: "hello world"
- syntax: <url>
name: --testing-url2
label: Testing User URL Input
initialValue: https://google.com
================================================
FILE: libs/core/mod.ts
================================================
// this re-export file is needed as a workaround for a bug in @deno/dnt
//
// remember usage `madge --circular .\mod.ts` to find circular dependencies
export * from "./src/lib.ts";
================================================
FILE: libs/core/readme.md
================================================
<h1 align="center">
<img src="https://raw.githubusercontent.com/eythaann/Seelen-UI/812f64d29162fe49da6f621d5e2a3e4852b8b8b1/documentation/images/logo.svg" width="44" align="top" alt="Seelen UI Logo" />
Seelen UI Library
</h1>
The **Seelen UI Library** is the core library for [Seelen UI](https://github.com/eythaann/seelen-ui), a highly
customizable desktop UI. This library provides the necessary tools and types to create and manage widgets, plugins, and
themes for the Seelen UI application. It's a hybrid library with a Rust core and TypeScript/Deno bindings, designed for
performance and type safety.
## Installation
### TypeScript/Deno
You can use the library from JSR or npm.
**JSR:**
```sh
deno add @seelen-ui/lib
```
**NPM:**
```sh
npm install @seelen-ui/lib
```
## Contributing
Contributions are welcome! Please read our [contributing guidelines](contributing.md) to get started.
## License
This project is licensed under the AGPL-3.0 License. See the [LICENSE](LICENSE) file for details.
## Links
- [GitHub Repository](https://github.com/Seelen-Inc/slu-lib)
- [NPM Package](https://npmjs.com/package/@seelen-ui/lib)
- [JSR Package](https://jsr.io/@seelen-ui/lib)
================================================
FILE: libs/core/scripts/build_npm.ts
================================================
/// <reference lib="deno.ns" />
import { build, type BuildOptions, emptyDir } from "@deno/dnt";
import denoJson from "../deno.json" with { type: "json" };
const { name, description, version, license } = denoJson;
const packageJson: BuildOptions["package"] = {
name,
description,
version,
license,
repository: {
type: "git",
url: "git+https://github.com/eythaann/Seelen-UI.git",
},
bugs: {
url: "https://github.com/eythaann/Seelen-UI/issues",
},
};
await emptyDir("./npm"); // clear previous build
await build({
compilerOptions: {
lib: ["DOM", "DOM.Iterable", "ESNext"],
target: "ES2023",
},
test: false, // this is performed by CI
typeCheck: false, // this is performed by CI
entryPoints: [{
name: ".",
path: "./mod.ts",
}, {
name: "./types",
path: "./gen/types/mod.ts",
}, {
name: "./tauri",
path: "./src/re-exports/tauri.ts",
}],
outDir: "./npm",
shims: {},
importMap: "deno.json",
package: packageJson,
postBuild(): void {
Deno.copyFileSync("../../LICENSE", "npm/LICENSE");
Deno.copyFileSync("readme.md", "npm/readme.md");
Deno.removeSync("npm/src", { recursive: true });
},
});
================================================
FILE: libs/core/scripts/rust_bindings.ts
================================================
/// <reference lib="deno.ns" />
await Deno.mkdir("./gen/types", { recursive: true });
// await Deno.mkdir('./src/validators', { recursive: true });
const GenTypesPath = await Deno.realPath("./gen/types");
// const GenJsonSchemasPath = await Deno.realPath('./gen/schemas');
// const GenZodSchemasPath = await Deno.realPath('./src/validators');
const libPath = await Deno.realPath("./src/lib.ts");
console.log("[Task] Removing old bindings...");
await Deno.remove(GenTypesPath, { recursive: true });
// await Deno.remove(GenZodSchemasPath, { recursive: true });
// recreate
await Deno.mkdir(GenTypesPath, { recursive: true });
// await Deno.mkdir(GenZodSchemasPath, { recursive: true });
{
console.log("[Task] Generating Typescript Bindings and JSON Schemas...");
// yeah cargo test generates the typescript bindings, why? ask to @aleph-alpha/ts-rs xd
// btw internally we also decided to use tests to avoid having a binary.
// also this gill generate the json schemas
await new Deno.Command("cargo", {
args: ["test", "--features", "gen-binds"],
stderr: "inherit",
stdout: "inherit",
}).output();
}
/* {
console.log('[Task] Converting JSON Schemas to Zod Schemas...');
for (const file of Deno.readDirSync(GenJsonSchemasPath)) {
if (file.isFile && file.name.endsWith('.schema.json')) {
const schema = JSON.parse(await Deno.readTextFile(`${GenJsonSchemasPath}/${file.name}`));
const { resolved } = await resolveRefs(schema);
const zodCode = jsonSchemaToZod(resolved, { module: 'esm' });
await Deno.writeTextFile(`${GenZodSchemasPath}/${file.name.replace('.schema.json', '.ts')}`, zodCode);
}
}
} */
{
console.log("[Task] Creating entry points...");
/* const zodMod = await Deno.open(`${GenZodSchemasPath}/mod.ts`, {
create: true,
append: true,
});
for (const file of Deno.readDirSync(GenZodSchemasPath)) {
if (file.isFile && file.name.endsWith('.ts') && file.name !== 'mod.ts') {
await zodMod.write(
new TextEncoder().encode(`export { default as ${file.name.replace('.ts', '')} } from './${file.name}';\n`),
);
}
} */
const typesMod = await Deno.open(`${GenTypesPath}/mod.ts`, {
create: true,
append: true,
});
for (const entry of Deno.readDirSync(GenTypesPath)) {
if (entry.isFile && entry.name.endsWith(".ts") && entry.name !== "mod.ts") {
await typesMod.write(
new TextEncoder().encode(`export * from './${entry.name}';\n`),
);
}
}
}
{
console.log("[Task] Extracting Types Definitions...");
const doc = await new Deno.Command("deno", {
args: ["doc", "--json", "--private", `${GenTypesPath}/mod.ts`],
stderr: "inherit",
stdout: "piped",
}).output();
const docJson = JSON.parse(new TextDecoder().decode(doc.stdout));
await Deno.writeTextFile(
"./gen/doc-types.json",
JSON.stringify(docJson, null, 2),
);
}
{
console.log("[Task] Extracting Library Definitions...");
const doc2 = await new Deno.Command("deno", {
args: ["doc", "--json", "--private", libPath],
stderr: "inherit",
stdout: "piped",
}).output();
const docJson2 = JSON.parse(new TextDecoder().decode(doc2.stdout));
await Deno.writeTextFile(
"./gen/doc-lib.json",
JSON.stringify(docJson2, null, 2),
);
}
console.log("[Task] Formatting...");
await new Deno.Command("cargo", {
args: ["fmt"],
stderr: "inherit",
stdout: "inherit",
}).output();
await new Deno.Command("deno", {
args: ["fmt", "--quiet"],
stderr: "inherit",
stdout: "inherit",
}).output();
console.log("[Task] Done!");
================================================
FILE: libs/core/src/constants/mod.rs
================================================
pub const SUPPORTED_LANGUAGES: &[SupportedLanguage] = &[
lang("Afrikaans", "Afrikaans", "af"),
lang("አማርኛ", "Amharic", "am"),
lang("العربية", "Arabic", "ar"),
lang("Azərbaycan", "Azerbaijani", "az"),
lang("Български", "Bulgarian", "bg"),
lang("বাংলা", "Bengali", "bn"),
lang("Bosanski", "Bosnian", "bs"),
lang("Català", "Catalan", "ca"),
lang("Čeština", "Czech", "cs"),
lang("Cymraeg", "Welsh", "cy"),
lang("Dansk", "Danish", "da"),
lang("Deutsch", "German", "de"),
lang("Ελληνικά", "Greek", "el"),
lang("English", "English", "en"),
lang("Español", "Spanish", "es"),
lang("Eesti", "Estonian", "et"),
lang("Euskara", "Basque", "eu"),
lang("فارسی", "Persian", "fa"),
lang("Suomi", "Finnish", "fi"),
lang("Français", "French", "fr"),
lang("ગુજરાતી", "Gujarati", "gu"),
lang("עברית", "Hebrew", "he"),
lang("हिन्दी", "Hindi", "hi"),
lang("Hrvatski", "Croatian", "hr"),
lang("Magyar", "Hungarian", "hu"),
lang("Հայերեն", "Armenian", "hy"),
lang("Indonesia", "Indonesian", "id"),
lang("Íslenska", "Icelandic", "is"),
lang("Italiano", "Italian", "it"),
lang("日本語", "Japanese", "ja"),
lang("ქართული", "Georgian", "ka"),
lang("ភាសាខ្មែរ", "Khmer", "km"),
lang("한국어", "Korean", "ko"),
lang("Kurdî", "Kurdish", "ku"),
lang("Lëtzebuergesch", "Luxembourgish", "lb"),
lang("ລາວ", "Lao", "lo"),
lang("Lietuvių", "Lithuanian", "lt"),
lang("Latviešu", "Latvian", "lv"),
lang("Македонски", "Macedonian", "mk"),
lang("Монгол", "Mongolian", "mn"),
lang("Malay", "Malay", "ms"),
lang("Malti", "Maltese", "mt"),
lang("नेपाली", "Nepali", "ne"),
lang("Nederlands", "Dutch", "nl"),
lang("Norsk", "Norwegian", "no"),
lang("ਪੰਜਾਬੀ", "Punjabi", "pa"),
lang("Polski", "Polish", "pl"),
lang("پښتو", "Pashto", "ps"),
lang("Português (Brasil)", "Portuguese (Brazil)", "pt-BR"),
lang("Português (Portugal)", "Portuguese (Portugal)", "pt-PT"),
lang("Română", "Romanian", "ro"),
lang("Русский", "Russian", "ru"),
lang("සිංහල", "Sinhala", "si"),
lang("Slovenský", "Slovak", "sk"),
lang("Soomaali", "Somali", "so"),
lang("Српски", "Serbian", "sr"),
lang("Svenska", "Swedish", "sv"),
lang("Kiswahili", "Swahili", "sw"),
lang("தமிழ்", "Tamil", "ta"),
lang("తెలుగు", "Telugu", "te"),
lang("Тоҷикӣ", "Tajik", "tg"),
lang("ไทย", "Thai", "th"),
lang("Tagalog", "Filipino", "tl"),
lang("Türkçe", "Turkish", "tr"),
lang("Українська", "Ukrainian", "uk"),
lang("اردو", "Urdu", "ur"),
lang("Oʻzbek", "Uzbek", "uz"),
lang("Tiếng Việt", "Vietnamese", "vi"),
lang("Yorùbá", "Yoruba", "yo"),
lang("中文 (简体)", "Chinese (Simplified)", "zh-CN"),
lang("中文 (繁體)", "Chinese (Traditional)", "zh-TW"),
lang("isiZulu", "Zulu", "zu"),
];
pub struct SupportedLanguage {
pub label: &'static str,
pub en_label: &'static str,
pub value: &'static str,
}
const fn lang(
label: &'static str,
en_label: &'static str,
value: &'static str,
) -> SupportedLanguage {
SupportedLanguage {
label,
en_label,
value,
}
}
================================================
FILE: libs/core/src/constants/mod.ts
================================================
export type SupportedLanguagesCode = (typeof SupportedLanguages)[number]["value"];
export interface SupportedLanguage {
label: string;
enLabel: string;
/** language code @example 'de' 'es' 'zh' 'en-US' 'en-UK' */
value: string;
}
export const SupportedLanguages = [
{ label: "Afrikaans", enLabel: "Afrikaans", value: "af" },
{ label: "አማርኛ", enLabel: "Amharic", value: "am" },
{ label: "العربية", enLabel: "Arabic", value: "ar" },
{ label: "Azərbaycan", enLabel: "Azerbaijani", value: "az" },
{ label: "Български", enLabel: "Bulgarian", value: "bg" },
{ label: "বাংলা", enLabel: "Bengali", value: "bn" },
{ label: "Bosanski", enLabel: "Bosnian", value: "bs" },
{ label: "Català", enLabel: "Catalan", value: "ca" },
{ label: "Čeština", enLabel: "Czech", value: "cs" },
{ label: "Cymraeg", enLabel: "Welsh", value: "cy" },
{ label: "Dansk", enLabel: "Danish", value: "da" },
{ label: "Deutsch", enLabel: "German", value: "de" },
{ label: "Ελληνικά", enLabel: "Greek", value: "el" },
{ label: "English", enLabel: "English", value: "en" },
{ label: "Español", enLabel: "Spanish", value: "es" },
{ label: "Eesti", enLabel: "Estonian", value: "et" },
{ label: "Euskara", enLabel: "Basque", value: "eu" },
{ label: "فارسی", enLabel: "Persian", value: "fa" },
{ label: "Suomi", enLabel: "Finnish", value: "fi" },
{ label: "Français", enLabel: "French", value: "fr" },
{ label: "ગુજરાતી", enLabel: "Gujarati", value: "gu" },
{ label: "עברית", enLabel: "Hebrew", value: "he" },
{ label: "हिन्दी", enLabel: "Hindi", value: "hi" },
{ label: "Hrvatski", enLabel: "Croatian", value: "hr" },
{ label: "Magyar", enLabel: "Hungarian", value: "hu" },
{ label: "Հայերեն", enLabel: "Armenian", value: "hy" },
{ label: "Indonesia", enLabel: "Indonesian", value: "id" },
{ label: "Íslenska", enLabel: "Icelandic", value: "is" },
{ label: "Italiano", enLabel: "Italian", value: "it" },
{ label: "日本語", enLabel: "Japanese", value: "ja" },
{ label: "ქართული", enLabel: "Georgian", value: "ka" },
{ label: "ភាសាខ្មែរ", enLabel: "Khmer", value: "km" },
{ label: "한국어", enLabel: "Korean", value: "ko" },
{ label: "Kurdî", enLabel: "Kurdish", value: "ku" },
{ label: "Lëtzebuergesch", enLabel: "Luxembourgish", value: "lb" },
{ label: "ລາວ", enLabel: "Lao", value: "lo" },
{ label: "Lietuvių", enLabel: "Lithuanian", value: "lt" },
{ label: "Latviešu", enLabel: "Latvian", value: "lv" },
{ label: "Македонски", enLabel: "Macedonian", value: "mk" },
{ label: "Монгол", enLabel: "Mongolian", value: "mn" },
{ label: "Malay", enLabel: "Malay", value: "ms" },
{ label: "Malti", enLabel: "Maltese", value: "mt" },
{ label: "नेपाली", enLabel: "Nepali", value: "ne" },
{ label: "Nederlands", enLabel: "Dutch", value: "nl" },
{ label: "Norsk", enLabel: "Norwegian", value: "no" },
{ label: "ਪੰਜਾਬੀ", enLabel: "Punjabi", value: "pa" },
{ label: "Polski", enLabel: "Polish", value: "pl" },
{ label: "پښتو", enLabel: "Pashto", value: "ps" },
{ label: "Português (Brasil)", enLabel: "Portuguese (Brazil)", value: "pt-BR" },
{ label: "Português (Portugal)", enLabel: "Portuguese (Portugal)", value: "pt-PT" },
{ label: "Română", enLabel: "Romanian", value: "ro" },
{ label: "Русский", enLabel: "Russian", value: "ru" },
{ label: "සිංහල", enLabel: "Sinhala", value: "si" },
{ label: "Slovenský", enLabel: "Slovak", value: "sk" },
{ label: "Soomaali", enLabel: "Somali", value: "so" },
{ label: "Српски", enLabel: "Serbian", value: "sr" },
{ label: "Svenska", enLabel: "Swedish", value: "sv" },
{ label: "Kiswahili", enLabel: "Swahili", value: "sw" },
{ label: "தமிழ்", enLabel: "Tamil", value: "ta" },
{ label: "తెలుగు", enLabel: "Telugu", value: "te" },
{ label: "Тоҷикӣ", enLabel: "Tajik", value: "tg" },
{ label: "ไทย", enLabel: "Thai", value: "th" },
{ label: "Tagalog", enLabel: "Filipino", value: "tl" },
{ label: "Türkçe", enLabel: "Turkish", value: "tr" },
{ label: "Українська", enLabel: "Ukrainian", value: "uk" },
{ label: "اردو", enLabel: "Urdu", value: "ur" },
{ label: "Oʻzbek", enLabel: "Uzbek", value: "uz" },
{ label: "Tiếng Việt", enLabel: "Vietnamese", value: "vi" },
{ label: "Yorùbá", enLabel: "Yoruba", value: "yo" },
{ label: "中文 (简体)", enLabel: "Chinese (Simplified)", value: "zh-CN" },
{ label: "中文 (繁體)", enLabel: "Chinese (Traditional)", value: "zh-TW" },
{ label: "isiZulu", enLabel: "Zulu", value: "zu" },
] as const;
================================================
FILE: libs/core/src/error.rs
================================================
macro_rules! define_app_errors {
($(
$variant:ident($error_type:ty);
)*) => {
#[derive(Debug)]
pub enum SeelenLibError {
$(
$variant($error_type),
)*
}
$(
impl From<$error_type> for SeelenLibError {
fn from(err: $error_type) -> Self {
SeelenLibError::$variant(err)
}
}
)*
};
}
define_app_errors!(
Custom(String);
Io(std::io::Error);
SerdeJson(serde_json::Error);
SerdeYaml(serde_yaml::Error);
Base64Decode(base64::DecodeError);
Grass(Box<grass::Error>);
);
impl From<&str> for SeelenLibError {
fn from(err: &str) -> Self {
err.to_owned().into()
}
}
impl std::fmt::Display for SeelenLibError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{self:?}")
}
}
pub type Result<T, E = SeelenLibError> = std::result::Result<T, E>;
================================================
FILE: libs/core/src/handlers/commands.rs
================================================
#[cfg(test)]
use crate::{
rect::Rect, resource::*, state::by_monitor::MonitorConfiguration,
state::by_wallpaper::WallpaperInstanceSettings, state::context_menu::*, state::*,
system_state::*,
};
#[cfg(test)]
use std::{collections::HashMap, path::PathBuf};
macro_rules! slu_commands_declaration {
($($key:ident = $fn_name:ident($($args:tt)*) $(-> $return_type:ty)?,)*) => {
#[cfg(test)]
pub struct SeelenCommand;
#[cfg(test)]
impl SeelenCommand {
#[cfg(feature = "gen-binds")]
pub(crate) fn generate_ts_file(path: &str) {
let mut content: Vec<String> = std::vec::Vec::new();
content.push("// This file was generated via rust macros. Don't modify manually.".to_owned());
content.push("export enum SeelenCommand {".to_owned());
$(
content.push(format!(" {} = '{}',", stringify!($key), stringify!($fn_name)));
)*
content.push("}\n".to_owned());
std::fs::write(path, content.join("\n")).unwrap();
}
}
paste::paste! {
$(
$crate::__switch! {
if { $($args)* }
do {
#[cfg(test)]
#[derive(Deserialize, TS)]
#[serde(rename_all = "camelCase")]
#[allow(dead_code)]
struct [<SeelenCommand $key Args>] {
$($args)*
}
}
else {}
}
)*
/// Internal used as mapping of commands to their arguments
#[cfg(test)]
#[allow(non_camel_case_types, dead_code)]
#[derive(Deserialize, TS)]
#[cfg_attr(feature = "gen-binds", ts(export))]
enum SeelenCommandArgument {
$(
#[allow(non_snake_case)]
$fn_name(Box<$crate::__switch! {
if { $($args)* }
do { [<SeelenCommand $key Args>] }
else { () }
}>),
)*
}
}
/// Internal used as mapping of commands to their return types
#[derive(Serialize, TS)]
#[cfg_attr(feature = "gen-binds", ts(export))]
#[allow(non_camel_case_types, dead_code)]
#[cfg(test)]
enum SeelenCommandReturn {
$(
$fn_name(Box<$crate::__switch! {
if { $($return_type)? }
do { $($return_type)? }
else { () }
}>),
)*
}
#[macro_export]
macro_rules! command_handler_list {
() => {
tauri::generate_handler![
$(
$fn_name,
)*
]
};
}
pub use command_handler_list;
};
}
slu_commands_declaration! {
// virtual desktops
StateGetVirtualDesktops = get_virtual_desktops() -> VirtualDesktops,
SwitchWorkspace = switch_workspace(workspace_id: WorkspaceId),
CreateWorkspace = create_workspace(monitor_id: MonitorId) -> WorkspaceId,
DestroyWorkspace = destroy_workspace(workspace_id: WorkspaceId),
RenameWorkspace = rename_workspace(workspace_id: WorkspaceId, name: Option<String>),
// wallpaper
WallpaperNext = wallpaper_next(),
WallpaperPrev = wallpaper_prev(),
WallpaperSaveThumbnail = wallpaper_save_thumbnail(wallpaper_id: ResourceId, thumbnail_bytes: Vec<u8>),
// Logging
LogFromWebview = log_from_webview(level: u8, message: String, location: String),
// General
OpenFile = open_file(path: PathBuf),
SelectFileOnExplorer = select_file_on_explorer(path: PathBuf),
Run = run(program: PathBuf, args: Option<RelaunchArguments>, working_dir: Option<PathBuf>, elevated: bool),
SimulatePerm = simulate_perm(widget_id: String, perm: String),
IsDevMode = is_dev_mode() -> bool,
IsAppxPackage = is_appx_package() -> bool,
HasFixedRuntime = has_fixed_runtime() -> bool,
GetFocusedApp = get_focused_app() -> FocusedApp,
GetMousePosition = get_mouse_position() -> [i32; 2],
GetKeyState = get_key_state(key: String) -> bool,
GetUserEnvs = get_user_envs() -> HashMap<String, String>,
ShowStartMenu = show_start_menu(),
GetIcon = get_icon(
#[ts(optional = nullable)]
path: Option<PathBuf>,
#[ts(optional = nullable)]
umid: Option<String>
),
ShowDesktop = show_desktop(),
RequestToUserInputShortcut = request_to_user_input_shortcut(callback_event: String),
CheckForUpdates = check_for_updates() -> bool,
// Restart the app after install the update so it returns a promise resolved with `never`
InstallLastAvailableUpdate = install_last_available_update(),
// System
SystemGetForegroundWindowColor = get_foreground_window_color() -> Color,
SystemGetMonitors = get_connected_monitors() -> Vec<PhysicalMonitor>,
SystemGetColors = get_system_colors() -> UIColors,
SystemGetLanguages = get_system_languages() -> Vec<SystemLanguage>,
SystemSetKeyboardLayout = set_system_keyboard_layout(id: String, handle: String),
// Seelen Settings
StateGetDefaultSettings = state_get_default_settings() -> Settings,
StateGetDefaultMonitorSettings = state_get_default_monitor_settings() -> MonitorConfiguration,
StateGetDefaultWallpaperSettings = state_get_default_wallpaper_settings() -> WallpaperInstanceSettings,
SetAutoStart = set_auto_start(enabled: bool),
GetAutoStartStatus = get_auto_start_status() -> bool,
RemoveResource = remove_resource(id: ResourceId, kind: ResourceKind),
StateGetThemes = state_get_themes() -> Vec<Theme>,
StateGetWegItems = state_get_weg_items() -> WegItems,
StateWriteWegItems = state_write_weg_items(items: WegItems),
StateGetToolbarItems = state_get_toolbar_items() -> ToolbarState,
StateWriteToolbarItems = state_write_toolbar_items(items: ToolbarState),
StateGetSettings = state_get_settings(path: Option<PathBuf>) -> Settings,
StateWriteSettings = state_write_settings(settings: Settings),
StateGetSettingsByApp = state_get_settings_by_app() -> Vec<AppConfig> ,
StateGetPlugins = state_get_plugins() -> Vec<Plugin>,
StateGetWidgets = state_get_widgets() -> Vec<Widget>,
StateGetIconPacks = state_get_icon_packs() -> Vec<IconPack>,
StateGetWallpapers = state_get_wallpapers() -> Vec<Wallpaper>,
StateSetCustomIconPack = state_add_icon_to_custom_icon_pack(icon: IconPackEntry),
StateDeleteCachedIcons = state_delete_cached_icons(),
StateRequestWallpaperAddition = state_request_wallpaper_addition(),
StateGetPerformanceMode = state_get_performance_mode() -> PerformanceMode,
// Widgets
TriggerWidget = trigger_widget(payload: WidgetTriggerPayload),
TriggerContextMenu = trigger_context_menu(menu: ContextMenu, forward_to: Option<String>),
SetCurrentWidgetStatus = set_current_widget_status(status: WidgetStatus),
GetSelfWindowId = get_self_window_handle() -> isize,
SetSelfPosition = set_self_position(rect: Rect),
BringSelfToTop = bring_self_to_top(),
WriteFile = write_data_file(filename: String, content: String),
ReadFile = read_data_file(filename: String) -> String,
// Shell
GetNativeShellWallpaper = get_native_shell_wallpaper() -> PathBuf,
SetNativeShellWallpaper = set_native_shell_wallpaper(path: PathBuf),
// User
GetUser = get_user() -> User,
GetUserFolderContent = get_user_folder_content(folder_type: FolderType) -> Vec<std::path::PathBuf>,
GetUserAppWindows = get_user_app_windows() -> Vec<UserAppWindow>,
GetUserAppWindowsPreviews = get_user_app_windows_previews() -> HashMap<isize, UserAppWindowPreview>,
// Media
GetMediaDevices = get_media_devices() -> [Vec<MediaDevice>; 2],
GetMediaSessions = get_media_sessions() -> Vec<MediaPlayer>,
MediaPrev = media_prev(id: String),
MediaTogglePlayPause = media_toggle_play_pause(id: String),
MediaNext = media_next(id: String),
SetVolumeLevel = set_volume_level(device_id: String, session_id: Option<String>, level: f32),
MediaToggleMute = media_toggle_mute(device_id: String, session_id: Option<String>),
MediaSetDefaultDevice = media_set_default_device(id: String, role: String),
// Brightness - Multi-monitor support
GetAllMonitorsBrightness = get_all_monitors_brightness() -> Vec<MonitorBrightness>,
SetMonitorBrightness = set_monitor_brightness(instance_name: String, level: u8),
// Power
GetPowerStatus = get_power_status() -> PowerStatus,
GetPowerMode = get_power_mode() -> PowerMode,
GetBatteries = get_batteries() -> Vec<Battery>,
LogOut = log_out(),
Suspend = suspend(),
Hibernate = hibernate(),
Restart = restart(),
Shutdown = shutdown(),
Lock = lock(),
// SeelenWeg
WegCloseApp = weg_close_app(hwnd: isize),
WegKillApp = weg_kill_app(hwnd: isize),
WegToggleWindowState = weg_toggle_window_state(hwnd: isize, was_focused: bool),
WegPinItem = weg_pin_item(path: PathBuf),
// Windows Manager
WmGetRenderTree = wm_get_render_tree() -> WmRenderTree,
SetAppWindowsPositions = set_app_windows_positions(positions: HashMap<isize, Rect>),
RequestFocus = request_focus(hwnd: isize),
// Slu Popups
CreatePopup = create_popup(config: SluPopupConfig) -> uuid::Uuid,
UpdatePopup = update_popup(instance_id: uuid::Uuid, config: SluPopupConfig),
ClosePopup = close_popup(instance_id: uuid::Uuid),
GetPopupConfig = get_popup_config(instance_id: uuid::Uuid) -> SluPopupConfig,
// Network
WlanGetProfiles = wlan_get_profiles() -> Vec<WlanProfile>,
WlanStartScanning = wlan_start_scanning(),
WlanStopScanning = wlan_stop_scanning(),
WlanConnect = wlan_connect(ssid: String, password: Option<String>, hidden: bool) -> bool,
WlanDisconnect = wlan_disconnect(),
GetNetworkDefaultLocalIp = get_network_default_local_ip() -> String,
GetNetworkAdapters = get_network_adapters() -> Vec<NetworkAdapter>,
GetNetworkInternetConnection = get_network_internet_connection() -> bool,
// system tray
GetSystemTrayIcons = get_system_tray_icons() -> Vec<SysTrayIcon>,
SendSystemTrayIconAction = send_system_tray_icon_action(id: SysTrayIconId, action: SystrayIconAction),
// Notifications
GetNotifications = get_notifications() -> Vec<AppNotification>,
NotificationsClose = notifications_close(id: u32),
NotificationsCloseAll = notifications_close_all(),
ActivateNotification = activate_notification(
umid: String,
args: String,
input_data: HashMap<String, String>,
),
// Radios
GetRadios = get_radios() -> Vec<RadioDevice>,
SetRadioState = set_radios_state(kind: RadioDeviceKind, enabled: bool),
// System Info
GetSystemDisks = get_system_disks() -> Vec<Disk>,
GetSystemNetwork = get_system_network() -> Vec<NetworkStatistics>,
GetSystemMemory = get_system_memory() -> Memory,
GetSystemCores = get_system_cores() -> Vec<Core>,
// Bluetooth
GetBluetoothDevices = get_bluetooth_devices() -> Vec<BluetoothDevice>,
StartBluetoothScanning = start_bluetooth_scanning(),
StopBluetoothScanning = stop_bluetooth_scanning(),
RequestPairBluetoothDevice = request_pair_bluetooth_device(id: String) -> DevicePairingNeededAction,
ConfirmBluetoothDevicePairing = confirm_bluetooth_device_pairing(id: String, answer: DevicePairingAnswer),
DisconnectBluetoothDevice = disconnect_bluetooth_device(id: String),
ForgetBluetoothDevice = forget_bluetooth_device(id: String),
// Start Menu
GetStartMenuItems = get_start_menu_items() -> Vec<StartMenuItem>,
GetNativeStartMenu = get_native_start_menu() -> StartMenuLayout,
// Trash Bin
GetTrashBinInfo = get_trash_bin_info() -> TrashBinInfo,
TrashBinEmpty = trash_bin_empty(),
}
================================================
FILE: libs/core/src/handlers/commands.ts
================================================
// This file was generated via rust macros. Don't modify manually.
export enum SeelenCommand {
StateGetVirtualDesktops = "get_virtual_desktops",
SwitchWorkspace = "switch_workspace",
CreateWorkspace = "create_workspace",
DestroyWorkspace = "destroy_workspace",
RenameWorkspace = "rename_workspace",
WallpaperNext = "wallpaper_next",
WallpaperPrev = "wallpaper_prev",
WallpaperSaveThumbnail = "wallpaper_save_thumbnail",
LogFromWebview = "log_from_webview",
OpenFile = "open_file",
SelectFileOnExplorer = "select_file_on_explorer",
Run = "run",
SimulatePerm = "simulate_perm",
IsDevMode = "is_dev_mode",
IsAppxPackage = "is_appx_package",
HasFixedRuntime = "has_fixed_runtime",
GetFocusedApp = "get_focused_app",
GetMousePosition = "get_mouse_position",
GetKeyState = "get_key_state",
GetUserEnvs = "get_user_envs",
ShowStartMenu = "show_start_menu",
GetIcon = "get_icon",
ShowDesktop = "show_desktop",
RequestToUserInputShortcut = "request_to_user_input_shortcut",
CheckForUpdates = "check_for_updates",
InstallLastAvailableUpdate = "install_last_available_update",
SystemGetForegroundWindowColor = "get_foreground_window_color",
SystemGetMonitors = "get_connected_monitors",
SystemGetColors = "get_system_colors",
SystemGetLanguages = "get_system_languages",
SystemSetKeyboardLayout = "set_system_keyboard_layout",
StateGetDefaultSettings = "state_get_default_settings",
StateGetDefaultMonitorSettings = "state_get_default_monitor_settings",
StateGetDefaultWallpaperSettings = "state_get_default_wallpaper_settings",
SetAutoStart = "set_auto_start",
GetAutoStartStatus = "get_auto_start_status",
RemoveResource = "remove_resource",
StateGetThemes = "state_get_themes",
StateGetWegItems = "state_get_weg_items",
StateWriteWegItems = "state_write_weg_items",
StateGetToolbarItems = "state_get_toolbar_items",
StateWriteToolbarItems = "state_write_toolbar_items",
StateGetSettings = "state_get_settings",
StateWriteSettings = "state_write_settings",
StateGetSettingsByApp = "state_get_settings_by_app",
StateGetPlugins = "state_get_plugins",
StateGetWidgets = "state_get_widgets",
StateGetIconPacks = "state_get_icon_packs",
StateGetWallpapers = "state_get_wallpapers",
StateSetCustomIconPack = "state_add_icon_to_custom_icon_pack",
StateDeleteCachedIcons = "state_delete_cached_icons",
StateRequestWallpaperAddition = "state_request_wallpaper_addition",
StateGetPerformanceMode = "state_get_performance_mode",
TriggerWidget = "trigger_widget",
TriggerContextMenu = "trigger_context_menu",
SetCurrentWidgetStatus = "set_current_widget_status",
GetSelfWindowId = "get_self_window_handle",
SetSelfPosition = "set_self_position",
BringSelfToTop = "bring_self_to_top",
WriteFile = "write_data_file",
ReadFile = "read_data_file",
GetNativeShellWallpaper = "get_native_shell_wallpaper",
SetNativeShellWallpaper = "set_native_shell_wallpaper",
GetUser = "get_user",
GetUserFolderContent = "get_user_folder_content",
GetUserAppWindows = "get_user_app_windows",
GetUserAppWindowsPreviews = "get_user_app_windows_previews",
GetMediaDevices = "get_media_devices",
GetMediaSessions = "get_media_sessions",
MediaPrev = "media_prev",
MediaTogglePlayPause = "media_toggle_play_pause",
MediaNext = "media_next",
SetVolumeLevel = "set_volume_level",
MediaToggleMute = "media_toggle_mute",
MediaSetDefaultDevice = "media_set_default_device",
GetAllMonitorsBrightness = "get_all_monitors_brightness",
SetMonitorBrightness = "set_monitor_brightness",
GetPowerStatus = "get_power_status",
GetPowerMode = "get_power_mode",
GetBatteries = "get_batteries",
LogOut = "log_out",
Suspend = "suspend",
Hibernate = "hibernate",
Restart = "restart",
Shutdown = "shutdown",
Lock = "lock",
WegCloseApp = "weg_close_app",
WegKillApp = "weg_kill_app",
WegToggleWindowState = "weg_toggle_window_state",
WegPinItem = "weg_pin_item",
WmGetRenderTree = "wm_get_render_tree",
SetAppWindowsPositions = "set_app_windows_positions",
RequestFocus = "request_focus",
CreatePopup = "create_popup",
UpdatePopup = "update_popup",
ClosePopup = "close_popup",
GetPopupConfig = "get_popup_config",
WlanGetProfiles = "wlan_get_profiles",
WlanStartScanning = "wlan_start_scanning",
WlanStopScanning = "wlan_stop_scanning",
WlanConnect = "wlan_connect",
WlanDisconnect = "wlan_disconnect",
GetNetworkDefaultLocalIp = "get_network_default_local_ip",
GetNetworkAdapters = "get_network_adapters",
GetNetworkInternetConnection = "get_network_internet_connection",
GetSystemTrayIcons = "get_system_tray_icons",
SendSystemTrayIconAction = "send_system_tray_icon_action",
GetNotifications = "get_notifications",
NotificationsClose = "notifications_close",
NotificationsCloseAll = "notifications_close_all",
ActivateNotification = "activate_notification",
GetRadios = "get_radios",
SetRadioState = "set_radios_state",
GetSystemDisks = "get_system_disks",
GetSystemNetwork = "get_system_network",
GetSystemMemory = "get_system_memory",
GetSystemCores = "get_system_cores",
GetBluetoothDevices = "get_bluetooth_devices",
StartBluetoothScanning = "start_bluetooth_scanning",
StopBluetoothScanning = "stop_bluetooth_scanning",
RequestPairBluetoothDevice = "request_pair_bluetooth_device",
ConfirmBluetoothDevicePairing = "confirm_bluetooth_device_pairing",
DisconnectBluetoothDevice = "disconnect_bluetooth_device",
ForgetBluetoothDevice = "forget_bluetooth_device",
GetStartMenuItems = "get_start_menu_items",
GetNativeStartMenu = "get_native_start_menu",
GetTrashBinInfo = "get_trash_bin_info",
TrashBinEmpty = "trash_bin_empty",
}
================================================
FILE: libs/core/src/handlers/events.rs
================================================
use std::collections::HashMap;
use crate::state::*;
use crate::system_state::*;
macro_rules! slu_events_declaration {
($($name:ident$(($payload:ty))? as $value:literal,)*) => {
pub struct SeelenEvent;
#[allow(non_upper_case_globals)]
impl SeelenEvent {
$(
pub const $name: &'static str = $value;
)*
#[allow(dead_code)]
pub(crate) fn generate_ts_file(path: &str) {
let content: Vec<String> = vec![
"// This file was generated via rust macros. Don't modify manually.".to_owned(),
"export enum SeelenEvent {".to_owned(),
$(
format!(" {} = '{}',", stringify!($name), Self::$name),
)*
"}\n".to_owned(),
];
std::fs::write(path, content.join("\n")).unwrap();
}
}
#[derive(Serialize, TS)]
#[cfg_attr(feature = "gen-binds", ts(export))]
pub enum SeelenEventPayload {
$(
#[serde(rename = $value)]
$name($crate::__switch! {
if { $($payload)? }
do { Box<$($payload)?> }
else { () }
}),
)*
}
};
}
slu_events_declaration! {
VirtualDesktopsChanged(VirtualDesktops) as "virtual-desktops::changed",
GlobalFocusChanged(FocusedApp) as "global-focus-changed",
GlobalMouseMove([i32; 2]) as "global-mouse-move",
HandleLayeredHitboxes(bool) as "handle-layered",
SystemMonitorsChanged(Vec<PhysicalMonitor>) as "system::monitors-changed",
SystemLanguagesChanged(Vec<SystemLanguage>) as "system::languages-changed",
SystemMonitorsBrightnessChanged(Vec<MonitorBrightness>) as "system::monitors-brightness-changed",
UserChanged(User) as "user-changed",
UserFolderChanged(FolderChangedArgs) as "user::known-folder-changed",
UserAppWindowsChanged(Vec<UserAppWindow>) as "user::windows-changed",
UserAppWindowsPreviewsChanged(HashMap<isize, UserAppWindowPreview>) as "user::windows-previews-changed",
MediaSessions(Vec<MediaPlayer>) as "media-sessions",
MediaDevices([Vec<MediaDevice>; 2]) as "media::devices",
MediaInputs(Vec<MediaDevice>) as "media-inputs",
MediaOutputs(Vec<MediaDevice>) as "media-outputs",
NetworkDefaultLocalIp(String) as "network-default-local-ip",
NetworkAdapters(Vec<NetworkAdapter>) as "network-adapters",
NetworkInternetConnection(bool) as "network-internet-connection",
NetworkWlanScanned(Vec<WlanBssEntry>) as "wlan-scanned",
Notifications(Vec<AppNotification>) as "notifications",
PowerStatus(PowerStatus) as "power-status",
PowerMode(PowerMode) as "power-mode",
BatteriesStatus(Vec<Battery>) as "batteries-status",
ColorsChanged(UIColors) as "colors-changed",
WMSetReservation as "wm::set-reservation",
WMForceRetiling as "wm::force-retiling",
WMTreeChanged(WmRenderTree) as "wm::tree-changed",
PopupContentChanged(SluPopupConfig) as "popup-content-changed",
StateSettingsChanged(Settings) as "settings-changed",
StateSettingsByAppChanged(Vec<AppConfig>) as "settings-by-app",
StateThemesChanged(Vec<Theme>) as "themes",
StateIconPacksChanged(Vec<IconPack>) as "icon-packs",
StatePluginsChanged(Vec<Plugin>) as "plugins-changed",
StateWidgetsChanged(Vec<Widget>) as "widgets-changed",
StateWallpapersChanged(Vec<Wallpaper>) as "UserResources::wallpapers-changed",
// system tray
SystemTrayChanged(Vec<SysTrayIcon>) as "system-tray::changed",
StatePerformanceModeChanged(PerformanceMode) as "state::performance-mode-changed",
WidgetTriggered(WidgetTriggerPayload) as "widget::triggered",
// Radios
RadiosChanged(Vec<RadioDevice>) as "radio::changed",
// System Info
SystemDisksChanged(Vec<Disk>) as "system::disks-changed",
SystemNetworkChanged(Vec<NetworkStatistics>) as "system::network-changed",
SystemMemoryChanged(Memory) as "system::memory-changed",
SystemCoresChanged(Vec<Core>) as "system::cores-changed",
BluetoothDevicesChanged(Vec<BluetoothDevice>) as "bluetooth-devices-changed",
// Start Menu
StartMenuItemsChanged(Vec<StartMenuItem>) as "start-menu::items-changed",
// SeelenWeg
WegAddItem(WegItemData) as "weg::add-item",
// Trash Bin
TrashBinChanged(TrashBinInfo) as "trash-bin::changed",
}
================================================
FILE: libs/core/src/handlers/events.ts
================================================
// This file was generated via rust macros. Don't modify manually.
export enum SeelenEvent {
VirtualDesktopsChanged = "virtual-desktops::changed",
GlobalFocusChanged = "global-focus-changed",
GlobalMouseMove = "global-mouse-move",
HandleLayeredHitboxes = "handle-layered",
SystemMonitorsChanged = "system::monitors-changed",
gitextract_5t012xim/ ├── .cargo/ │ └── config.toml ├── .cert/ │ ├── Seelen.cer │ ├── Seelen.pfx │ ├── Seelen.pfx.pwd │ └── readme.md ├── .commitlintrc.yml ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── actions/ │ │ ├── generate-update-manifest/ │ │ │ └── action.yml │ │ └── setup/ │ │ └── action.yml │ ├── dependabot.yml │ └── workflows/ │ ├── ci.yml │ ├── dependabot-automerge.yml │ ├── discord-notify.yml │ ├── msix.yml │ ├── nightly.yml │ ├── publish-core.yml │ └── release.yml ├── .gitignore ├── .npmrc ├── AGENTS.md ├── CLA.md ├── CODE_OF_CONDUCT ├── CONTRIBUTING ├── Cargo.toml ├── LICENSE ├── README.md ├── SECURITY.md ├── changelog.md ├── crowdin.yml ├── deno.json ├── lefthook.yml ├── libs/ │ ├── core/ │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ ├── deno.json │ │ ├── mocks/ │ │ │ └── themes/ │ │ │ ├── v2.3.0.yml │ │ │ └── v2.3.12.yml │ │ ├── mod.ts │ │ ├── readme.md │ │ ├── scripts/ │ │ │ ├── build_npm.ts │ │ │ └── rust_bindings.ts │ │ └── src/ │ │ ├── constants/ │ │ │ ├── mod.rs │ │ │ └── mod.ts │ │ ├── error.rs │ │ ├── handlers/ │ │ │ ├── commands.rs │ │ │ ├── commands.ts │ │ │ ├── events.rs │ │ │ ├── events.ts │ │ │ ├── mod.rs │ │ │ └── mod.ts │ │ ├── lib.rs │ │ ├── lib.test.ts │ │ ├── lib.ts │ │ ├── re-exports/ │ │ │ └── tauri.ts │ │ ├── rect.rs │ │ ├── resource/ │ │ │ ├── file.rs │ │ │ ├── interface.rs │ │ │ ├── metadata.rs │ │ │ ├── mod.rs │ │ │ ├── mod.ts │ │ │ ├── resource_id.rs │ │ │ └── yaml_ext.rs │ │ ├── state/ │ │ │ ├── icon_pack.rs │ │ │ ├── icon_pack.test.ts │ │ │ ├── icon_pack.ts │ │ │ ├── mod.rs │ │ │ ├── mod.ts │ │ │ ├── placeholder.rs │ │ │ ├── plugin/ │ │ │ │ ├── mod.rs │ │ │ │ ├── mod.ts │ │ │ │ └── value.rs │ │ │ ├── popups/ │ │ │ │ └── mod.rs │ │ │ ├── settings/ │ │ │ │ ├── by_monitor.rs │ │ │ │ ├── by_theme.rs │ │ │ │ ├── by_wallpaper.rs │ │ │ │ ├── by_widget.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── mod.ts │ │ │ │ ├── settings_by_app.rs │ │ │ │ └── shortcuts.rs │ │ │ ├── theme/ │ │ │ │ ├── config.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── mod.ts │ │ │ │ ├── tests.rs │ │ │ │ └── theming.ts │ │ │ ├── wallpaper/ │ │ │ │ ├── mod.rs │ │ │ │ └── mod.ts │ │ │ ├── weg_items.rs │ │ │ ├── widget/ │ │ │ │ ├── context_menu.rs │ │ │ │ ├── declaration.rs │ │ │ │ ├── interfaces.ts │ │ │ │ ├── mod.rs │ │ │ │ ├── mod.ts │ │ │ │ ├── performance.ts │ │ │ │ ├── positioning.ts │ │ │ │ └── sizing.ts │ │ │ ├── wm_layout.rs │ │ │ └── workspaces/ │ │ │ └── mod.rs │ │ ├── system_state/ │ │ │ ├── bluetooth/ │ │ │ │ ├── appearance_values.yml │ │ │ │ ├── build_low_energy_enums.rs │ │ │ │ ├── enums.rs │ │ │ │ ├── low_energy_enums.rs │ │ │ │ ├── mod.rs │ │ │ │ └── mod.ts │ │ │ ├── components.rs │ │ │ ├── language.rs │ │ │ ├── language.ts │ │ │ ├── media.rs │ │ │ ├── mod.rs │ │ │ ├── mod.ts │ │ │ ├── monitors.rs │ │ │ ├── monitors.ts │ │ │ ├── network/ │ │ │ │ └── mod.rs │ │ │ ├── notification.rs │ │ │ ├── power.rs │ │ │ ├── radios/ │ │ │ │ └── mod.rs │ │ │ ├── trash_bin.rs │ │ │ ├── tray.rs │ │ │ ├── ui_colors.rs │ │ │ ├── ui_colors.ts │ │ │ ├── user.rs │ │ │ ├── user.ts │ │ │ ├── user_apps/ │ │ │ │ └── mod.rs │ │ │ └── win_explorer.rs │ │ └── utils/ │ │ ├── DOM.ts │ │ ├── List.ts │ │ ├── State.ts │ │ ├── async.ts │ │ ├── mod.rs │ │ └── mod.ts │ ├── positioning/ │ │ ├── Cargo.toml │ │ └── src/ │ │ ├── api/ │ │ │ ├── mod.rs │ │ │ └── windows.rs │ │ ├── easings.rs │ │ ├── error.rs │ │ ├── lib.rs │ │ ├── minimization.rs │ │ └── rect.rs │ ├── slu-ipc/ │ │ ├── Cargo.toml │ │ └── src/ │ │ ├── app.rs │ │ ├── common.rs │ │ ├── error.rs │ │ ├── lib.rs │ │ ├── messages.rs │ │ └── service.rs │ ├── ui/ │ │ ├── icons.ts │ │ ├── react/ │ │ │ ├── components/ │ │ │ │ ├── BackgroundByLayers/ │ │ │ │ │ ├── infra.module.css │ │ │ │ │ └── infra.tsx │ │ │ │ ├── Icon/ │ │ │ │ │ ├── FileIcon.tsx │ │ │ │ │ ├── MissingIcon.tsx │ │ │ │ │ ├── SpecificIcon.tsx │ │ │ │ │ ├── common.ts │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── InlineSvg/ │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── ResourceText/ │ │ │ │ │ └── index.tsx │ │ │ │ └── Wallpaper/ │ │ │ │ ├── components/ │ │ │ │ │ ├── ImageWallpaper.tsx │ │ │ │ │ ├── ThemedWallpaper.tsx │ │ │ │ │ └── VideoWallpaper.tsx │ │ │ │ ├── index.module.css │ │ │ │ ├── index.tsx │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ └── utils/ │ │ │ ├── DndKit/ │ │ │ │ └── utils.ts │ │ │ ├── LazySignal.ts │ │ │ ├── hooks.ts │ │ │ ├── index.ts │ │ │ ├── layered.ts │ │ │ ├── signals.ts │ │ │ └── styling.ts │ │ ├── svelte/ │ │ │ ├── components/ │ │ │ │ ├── BackgroundByLayers/ │ │ │ │ │ ├── BackgroundByLayers.svelte │ │ │ │ │ └── index.ts │ │ │ │ ├── Icon/ │ │ │ │ │ ├── FileIcon.svelte │ │ │ │ │ ├── Icon.svelte │ │ │ │ │ ├── InlineSVG.svelte │ │ │ │ │ ├── InlineSVGState.svelte.ts │ │ │ │ │ ├── MissingIcon.svelte │ │ │ │ │ ├── SpecificIcon.svelte │ │ │ │ │ ├── common.svelte.ts │ │ │ │ │ └── index.ts │ │ │ │ └── Wallpaper/ │ │ │ │ ├── Wallpaper.svelte │ │ │ │ ├── components/ │ │ │ │ │ ├── ImageWallpaper.svelte │ │ │ │ │ ├── ThemedWallpaper.svelte │ │ │ │ │ └── VideoWallpaper.svelte │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ ├── runes/ │ │ │ │ └── DarkMode.svelte.ts │ │ │ └── utils/ │ │ │ ├── LazyRune.svelte.ts │ │ │ ├── PersistentRune.svelte.ts │ │ │ ├── hooks.svelte.ts │ │ │ ├── i18n.ts │ │ │ └── index.ts │ │ └── utils.ts │ ├── utils/ │ │ ├── Cargo.toml │ │ └── src/ │ │ ├── checksums.rs │ │ ├── debounce.rs │ │ ├── lib.rs │ │ ├── signature.rs │ │ └── throttle.rs │ └── widgets-shared/ │ └── styles/ │ ├── RichText.css │ ├── colors.css │ ├── reset.css │ └── spacings.css ├── package.json ├── rust-toolchain.toml ├── scripts/ │ ├── PalletteGenerator.ts │ ├── SetFixedRuntime.ps1 │ ├── SubmitToStore.ps1 │ ├── UpdateTauri.ts │ ├── build/ │ │ ├── README.md │ │ ├── builders/ │ │ │ ├── react.ts │ │ │ ├── svelte.ts │ │ │ └── vanilla.ts │ │ ├── config.ts │ │ ├── plugins/ │ │ │ └── index.ts │ │ ├── server.ts │ │ ├── steps/ │ │ │ ├── cleanup.ts │ │ │ ├── discover.ts │ │ │ └── icons.ts │ │ └── types.ts │ ├── build.ts │ ├── bundle.msix.ts │ ├── clean.ps1 │ ├── submission.json │ ├── translate/ │ │ ├── mod.ps1 │ │ └── mod.ts │ └── versionish.ts ├── src/ │ ├── Cargo.toml │ ├── background/ │ │ ├── app.rs │ │ ├── app_instance.rs │ │ ├── cli/ │ │ │ ├── application/ │ │ │ │ ├── art.rs │ │ │ │ ├── debugger.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── uri.rs │ │ │ │ └── win32.rs │ │ │ ├── infrastructure.rs │ │ │ ├── mod.rs │ │ │ ├── self_pipe.rs │ │ │ └── svc_pipe.rs │ │ ├── error.rs │ │ ├── exposed.rs │ │ ├── hook.rs │ │ ├── i18n/ │ │ │ ├── af.yml │ │ │ ├── am.yml │ │ │ ├── ar.yml │ │ │ ├── az.yml │ │ │ ├── bg.yml │ │ │ ├── bn.yml │ │ │ ├── bs.yml │ │ │ ├── ca.yml │ │ │ ├── cs.yml │ │ │ ├── cy.yml │ │ │ ├── da.yml │ │ │ ├── de.yml │ │ │ ├── el.yml │ │ │ ├── en.yml │ │ │ ├── es.yml │ │ │ ├── et.yml │ │ │ ├── eu.yml │ │ │ ├── fa.yml │ │ │ ├── fi.yml │ │ │ ├── fr.yml │ │ │ ├── gu.yml │ │ │ ├── he.yml │ │ │ ├── hi.yml │ │ │ ├── hr.yml │ │ │ ├── hu.yml │ │ │ ├── hy.yml │ │ │ ├── id.yml │ │ │ ├── is.yml │ │ │ ├── it.yml │ │ │ ├── ja.yml │ │ │ ├── ka.yml │ │ │ ├── km.yml │ │ │ ├── ko.yml │ │ │ ├── ku.yml │ │ │ ├── lb.yml │ │ │ ├── lo.yml │ │ │ ├── lt.yml │ │ │ ├── lv.yml │ │ │ ├── mk.yml │ │ │ ├── mn.yml │ │ │ ├── ms.yml │ │ │ ├── mt.yml │ │ │ ├── ne.yml │ │ │ ├── nl.yml │ │ │ ├── no.yml │ │ │ ├── pa.yml │ │ │ ├── pl.yml │ │ │ ├── ps.yml │ │ │ ├── pt-BR.yml │ │ │ ├── pt-PT.yml │ │ │ ├── ro.yml │ │ │ ├── ru.yml │ │ │ ├── si.yml │ │ │ ├── sk.yml │ │ │ ├── so.yml │ │ │ ├── sr.yml │ │ │ ├── sv.yml │ │ │ ├── sw.yml │ │ │ ├── ta.yml │ │ │ ├── te.yml │ │ │ ├── tg.yml │ │ │ ├── th.yml │ │ │ ├── tl.yml │ │ │ ├── tr.yml │ │ │ ├── uk.yml │ │ │ ├── ur.yml │ │ │ ├── uz.yml │ │ │ ├── vi.yml │ │ │ ├── yo.yml │ │ │ ├── zh-CN.yml │ │ │ ├── zh-TW.yml │ │ │ └── zu.yml │ │ ├── logger.rs │ │ ├── main.rs │ │ ├── migrations.rs │ │ ├── modules/ │ │ │ ├── apps/ │ │ │ │ ├── application/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── msix.rs │ │ │ │ │ ├── msix_manifest.rs │ │ │ │ │ ├── previews.rs │ │ │ │ │ └── windows.rs │ │ │ │ ├── infrastructure.rs │ │ │ │ └── mod.rs │ │ │ ├── media/ │ │ │ │ ├── devices/ │ │ │ │ │ ├── application.rs │ │ │ │ │ ├── domain.rs │ │ │ │ │ ├── infrastructure.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── players/ │ │ │ │ │ ├── application.rs │ │ │ │ │ ├── domain.rs │ │ │ │ │ ├── infrastructure.rs │ │ │ │ │ └── mod.rs │ │ │ │ └── readme.md │ │ │ ├── mod.rs │ │ │ ├── monitors/ │ │ │ │ ├── application.rs │ │ │ │ ├── brightness/ │ │ │ │ │ ├── application.rs │ │ │ │ │ ├── domain.rs │ │ │ │ │ ├── infrastructure.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── domain.rs │ │ │ │ ├── infrastructure.rs │ │ │ │ └── mod.rs │ │ │ ├── network/ │ │ │ │ ├── application/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── passwordless_profile.template.xml │ │ │ │ │ ├── profile.template.xml │ │ │ │ │ ├── profiles.ps1 │ │ │ │ │ ├── scanner.rs │ │ │ │ │ └── v2.rs │ │ │ │ ├── domain/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── types.rs │ │ │ │ ├── infrastructure.rs │ │ │ │ └── mod.rs │ │ │ ├── notifications/ │ │ │ │ ├── application.rs │ │ │ │ ├── domain.rs │ │ │ │ ├── infrastructure.rs │ │ │ │ └── mod.rs │ │ │ ├── power/ │ │ │ │ ├── application.rs │ │ │ │ ├── domain.rs │ │ │ │ ├── infrastructure.rs │ │ │ │ └── mod.rs │ │ │ ├── radios/ │ │ │ │ ├── bluetooth/ │ │ │ │ │ ├── classic.rs │ │ │ │ │ ├── handlers.rs │ │ │ │ │ ├── low_energy.rs │ │ │ │ │ ├── manager.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── device.rs │ │ │ │ ├── handlers.rs │ │ │ │ ├── manager.rs │ │ │ │ ├── mod.rs │ │ │ │ └── wifi/ │ │ │ │ └── mod.rs │ │ │ ├── start/ │ │ │ │ ├── application.rs │ │ │ │ ├── domain.rs │ │ │ │ ├── infrastructure.rs │ │ │ │ └── mod.rs │ │ │ ├── system/ │ │ │ │ ├── mod.rs │ │ │ │ └── tauri.rs │ │ │ ├── system_settings/ │ │ │ │ ├── application.rs │ │ │ │ ├── domain.rs │ │ │ │ ├── infrastructure.rs │ │ │ │ ├── language/ │ │ │ │ │ ├── application.rs │ │ │ │ │ ├── domain.rs │ │ │ │ │ ├── infrastructure.rs │ │ │ │ │ └── mod.rs │ │ │ │ └── mod.rs │ │ │ ├── system_tray/ │ │ │ │ ├── application/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── tray_hook_loader.rs │ │ │ │ │ ├── tray_icon.rs │ │ │ │ │ └── util.rs │ │ │ │ ├── domain.rs │ │ │ │ ├── infrastructure.rs │ │ │ │ └── mod.rs │ │ │ ├── trash_bin/ │ │ │ │ ├── application.rs │ │ │ │ ├── infrastructure.rs │ │ │ │ └── mod.rs │ │ │ └── user/ │ │ │ ├── application.rs │ │ │ ├── domain.rs │ │ │ ├── infrastructure.rs │ │ │ └── mod.rs │ │ ├── resources/ │ │ │ ├── cli.rs │ │ │ ├── commands.rs │ │ │ ├── emitters.rs │ │ │ ├── mod.rs │ │ │ └── system_icon_pack.rs │ │ ├── state/ │ │ │ ├── application/ │ │ │ │ ├── apps_config.rs │ │ │ │ ├── icons.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── performance.rs │ │ │ │ ├── settings.rs │ │ │ │ ├── toolbar_items.rs │ │ │ │ └── weg_items.rs │ │ │ ├── domain/ │ │ │ │ └── mod.rs │ │ │ ├── infrastructure.rs │ │ │ └── mod.rs │ │ ├── tauri_context.rs │ │ ├── tauri_plugins.rs │ │ ├── telemetry.rs │ │ ├── utils/ │ │ │ ├── constants.rs │ │ │ ├── discord.rs │ │ │ ├── icon_extractor/ │ │ │ │ ├── mod.rs │ │ │ │ └── queue.rs │ │ │ ├── integrity/ │ │ │ │ ├── checksums.rs │ │ │ │ ├── mod.rs │ │ │ │ └── webview.rs │ │ │ ├── lock_free/ │ │ │ │ ├── mod.rs │ │ │ │ ├── sync_hash_map.rs │ │ │ │ ├── sync_vec.rs │ │ │ │ └── traced_mutex.rs │ │ │ ├── mod.rs │ │ │ ├── pwsh.rs │ │ │ ├── updater.rs │ │ │ ├── virtual_desktop.rs │ │ │ └── winver.rs │ │ ├── virtual_desktops/ │ │ │ ├── cli.rs │ │ │ ├── events.rs │ │ │ ├── handlers.rs │ │ │ ├── mod.rs │ │ │ └── wallpapers.rs │ │ ├── widgets/ │ │ │ ├── cli.rs │ │ │ ├── loader.rs │ │ │ ├── manager.rs │ │ │ ├── mod.rs │ │ │ ├── permissions.rs │ │ │ ├── popups/ │ │ │ │ ├── cli.rs │ │ │ │ ├── handlers.rs │ │ │ │ ├── mod.rs │ │ │ │ └── shortcut_registering.rs │ │ │ ├── task_switcher/ │ │ │ │ ├── cli.rs │ │ │ │ └── mod.rs │ │ │ ├── toolbar/ │ │ │ │ ├── hook.rs │ │ │ │ └── mod.rs │ │ │ ├── wallpaper_manager/ │ │ │ │ ├── cli.rs │ │ │ │ ├── hook.rs │ │ │ │ └── mod.rs │ │ │ ├── webview.rs │ │ │ ├── weg/ │ │ │ │ ├── cli.rs │ │ │ │ ├── handler.rs │ │ │ │ ├── hook.rs │ │ │ │ ├── instance.rs │ │ │ │ ├── mod.rs │ │ │ │ └── weg_items_impl.rs │ │ │ └── window_manager/ │ │ │ ├── cli.rs │ │ │ ├── handler.rs │ │ │ ├── hook.rs │ │ │ ├── instance.rs │ │ │ ├── mod.rs │ │ │ └── state/ │ │ │ ├── mod.rs │ │ │ └── node_ext.rs │ │ └── windows_api/ │ │ ├── app_bar.rs │ │ ├── com.rs │ │ ├── devices.rs │ │ ├── event_window.rs │ │ ├── hdc.rs │ │ ├── input.rs │ │ ├── iterator.rs │ │ ├── mod.rs │ │ ├── monitor/ │ │ │ ├── brightness.rs │ │ │ └── mod.rs │ │ ├── process.rs │ │ ├── string_utils.rs │ │ ├── types.rs │ │ ├── undocumented/ │ │ │ ├── audio_policy_config.rs │ │ │ └── mod.rs │ │ └── window/ │ │ ├── cache.rs │ │ ├── event.rs │ │ └── mod.rs │ ├── build.rs │ ├── capabilities/ │ │ ├── general.json │ │ ├── general_window.json │ │ └── settings_widget.json │ ├── hook_dll/ │ │ ├── Cargo.toml │ │ └── src/ │ │ └── lib.rs │ ├── service/ │ │ ├── app_management.rs │ │ ├── cli/ │ │ │ ├── mod.rs │ │ │ └── processing.rs │ │ ├── enviroment.rs │ │ ├── error.rs │ │ ├── hotkeys.rs │ │ ├── logger.rs │ │ ├── main.rs │ │ ├── shutdown.rs │ │ ├── string_utils.rs │ │ ├── task_scheduler.rs │ │ └── windows_api/ │ │ ├── app_bar.rs │ │ ├── com.rs │ │ ├── iterator.rs │ │ └── mod.rs │ ├── static/ │ │ ├── apps_templates/ │ │ │ ├── adobe.yml │ │ │ ├── browser.yml │ │ │ ├── core.yml │ │ │ ├── development.yml │ │ │ ├── gaming.yml │ │ │ ├── password_managers.yml │ │ │ ├── system.yml │ │ │ └── video-and-streaming.yml │ │ ├── plugins/ │ │ │ ├── tb_cpu_usage/ │ │ │ │ ├── i18n/ │ │ │ │ │ └── display_name.yml │ │ │ │ ├── metadata.yml │ │ │ │ └── plugin/ │ │ │ │ └── template.js │ │ │ ├── tb_default_focused_app.yml │ │ │ ├── tb_default_focused_app_title.yml │ │ │ ├── tb_default_power/ │ │ │ │ ├── i18n/ │ │ │ │ │ ├── description.yml │ │ │ │ │ └── display_name.yml │ │ │ │ ├── mod.yml │ │ │ │ └── plugin/ │ │ │ │ ├── template.js │ │ │ │ └── tooltip.js │ │ │ ├── tb_disk_usage/ │ │ │ │ ├── i18n/ │ │ │ │ │ └── display_name.yml │ │ │ │ ├── metadata.yml │ │ │ │ └── plugin/ │ │ │ │ ├── template.js │ │ │ │ └── tooltip.js │ │ │ ├── tb_memory_usage/ │ │ │ │ ├── i18n/ │ │ │ │ │ └── display_name.yml │ │ │ │ ├── metadata.yml │ │ │ │ └── plugin/ │ │ │ │ └── template.js │ │ │ ├── tb_network_usage/ │ │ │ │ ├── i18n/ │ │ │ │ │ └── display_name.yml │ │ │ │ ├── metadata.yml │ │ │ │ └── plugin/ │ │ │ │ └── template.js │ │ │ ├── tb_workspaces_dotted/ │ │ │ │ ├── i18n/ │ │ │ │ │ └── display_name.yml │ │ │ │ ├── metadata.yml │ │ │ │ └── plugin/ │ │ │ │ └── template.js │ │ │ ├── tb_workspaces_named/ │ │ │ │ ├── i18n/ │ │ │ │ │ └── display_name.yml │ │ │ │ ├── metadata.yml │ │ │ │ └── plugin/ │ │ │ │ └── template.js │ │ │ ├── tb_workspaces_numbered/ │ │ │ │ ├── i18n/ │ │ │ │ │ └── display_name.yml │ │ │ │ ├── metadata.yml │ │ │ │ └── plugin/ │ │ │ │ └── template.js │ │ │ ├── wm_bsp.yml │ │ │ ├── wm_grid.yml │ │ │ ├── wm_tall.yml │ │ │ └── wm_wide.yml │ │ ├── readme │ │ ├── themes/ │ │ │ ├── animated-start-icon/ │ │ │ │ ├── metadata.yml │ │ │ │ └── seelen/ │ │ │ │ └── weg.scss │ │ │ ├── bubbles/ │ │ │ │ ├── i18n/ │ │ │ │ │ ├── description.yml │ │ │ │ │ └── display_name.yml │ │ │ │ ├── mod.yml │ │ │ │ └── styles/ │ │ │ │ └── toolbar.css │ │ │ └── default/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ ├── shared/ │ │ │ │ ├── buttons.scss │ │ │ │ ├── index.scss │ │ │ │ └── inputs.scss │ │ │ └── styles/ │ │ │ ├── apps-menu.scss │ │ │ ├── bluetooth-popup.scss │ │ │ ├── calendar-popup.scss │ │ │ ├── context-menu.scss │ │ │ ├── fancy-toolbar.scss │ │ │ ├── flyouts.css │ │ │ ├── keyboard-selector.scss │ │ │ ├── media-popup.scss │ │ │ ├── network-popup.scss │ │ │ ├── notifications.scss │ │ │ ├── power-menu.scss │ │ │ ├── quick-settings.scss │ │ │ ├── task-switcher.scss │ │ │ ├── tray-menu.scss │ │ │ ├── user-menu.scss │ │ │ ├── wallpaper-manager.css │ │ │ ├── weg.css │ │ │ ├── window-manager.css │ │ │ └── workspaces-viewer.scss │ │ └── widgets/ │ │ ├── apps-menu/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ ├── bluetooth-popup/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── calendar-popup/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── context-menu/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ ├── flyouts/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ ├── keyboard-selector/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── media-popup/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── network-popup/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── notifications/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── popup/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ ├── power-menu/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── quick-settings/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── settings/ │ │ │ ├── i18n/ │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ ├── system-tray/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── task-switcher/ │ │ │ ├── i18n/ │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ ├── toolbar/ │ │ │ ├── i18n/ │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ ├── user/ │ │ │ ├── i18n/ │ │ │ │ ├── description.yml │ │ │ │ └── display_name.yml │ │ │ ├── metadata.yml │ │ │ └── toolbar-plugin.yml │ │ ├── wallpaper-manager/ │ │ │ ├── i18n/ │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ ├── weg/ │ │ │ ├── i18n/ │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ ├── window-manager/ │ │ │ ├── i18n/ │ │ │ │ └── display_name.yml │ │ │ └── metadata.yml │ │ └── workspaces-viewer/ │ │ ├── i18n/ │ │ │ └── display_name.yml │ │ └── metadata.yml │ ├── tauri.conf.json │ ├── templates/ │ │ ├── AppxManifest.xml │ │ ├── installer-hooks.nsh │ │ └── installer.nsi │ └── ui/ │ ├── globals.d.ts │ ├── react/ │ │ ├── popup/ │ │ │ ├── app.tsx │ │ │ ├── global.css │ │ │ ├── index.tsx │ │ │ └── public/ │ │ │ └── index.html │ │ ├── settings/ │ │ │ ├── app.tsx │ │ │ ├── components/ │ │ │ │ ├── SettingsBox/ │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── SortableSelector/ │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── ThumbnailGeneratorModal/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── thumbnailGenerator.ts │ │ │ │ │ └── videoThumbnail.ts │ │ │ │ ├── WelcomeModal/ │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── infra.tsx │ │ │ │ ├── header/ │ │ │ │ │ ├── ExtraInfo.tsx │ │ │ │ │ ├── UpdateButton.tsx │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── monitor/ │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ └── navigation/ │ │ │ │ ├── index.module.css │ │ │ │ ├── index.tsx │ │ │ │ └── routes.tsx │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.tsx │ │ │ ├── modules/ │ │ │ │ ├── ByMonitor/ │ │ │ │ │ └── infra/ │ │ │ │ │ ├── WallpaperSettingsModal.tsx │ │ │ │ │ ├── WidgetSettingsModal.tsx │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── Home/ │ │ │ │ │ ├── MiniStore.module.css │ │ │ │ │ ├── MiniStore.tsx │ │ │ │ │ ├── News.module.css │ │ │ │ │ ├── News.tsx │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── IconPackEditor/ │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── Wall/ │ │ │ │ │ ├── WallpaperList.tsx │ │ │ │ │ ├── application.ts │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── infra.tsx │ │ │ │ ├── WindowManager/ │ │ │ │ │ ├── application.ts │ │ │ │ │ ├── border/ │ │ │ │ │ │ ├── application.ts │ │ │ │ │ │ └── infra.tsx │ │ │ │ │ └── main/ │ │ │ │ │ └── infra/ │ │ │ │ │ ├── Animations.tsx │ │ │ │ │ ├── GlobalPaddings.tsx │ │ │ │ │ ├── Others.tsx │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── appsConfigurations/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ ├── default.ts │ │ │ │ │ │ ├── filters.ts │ │ │ │ │ │ └── reducer.ts │ │ │ │ │ ├── domain.ts │ │ │ │ │ └── infra/ │ │ │ │ │ ├── EditModal.tsx │ │ │ │ │ ├── Identifier.module.css │ │ │ │ │ ├── Identifier.tsx │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── infra.tsx │ │ │ │ ├── developer/ │ │ │ │ │ ├── application.ts │ │ │ │ │ └── infra.tsx │ │ │ │ ├── extras/ │ │ │ │ │ ├── application.ts │ │ │ │ │ ├── infra.module.css │ │ │ │ │ └── infrastructure.tsx │ │ │ │ ├── fancyToolbar/ │ │ │ │ │ ├── application.ts │ │ │ │ │ └── infra.tsx │ │ │ │ ├── general/ │ │ │ │ │ ├── application.ts │ │ │ │ │ └── infra/ │ │ │ │ │ ├── Colors.tsx │ │ │ │ │ ├── Performance.tsx │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── resources/ │ │ │ │ │ ├── IconPacks.tsx │ │ │ │ │ ├── Plugins.tsx │ │ │ │ │ ├── ResourceCard.tsx │ │ │ │ │ ├── SoundPacks.tsx │ │ │ │ │ ├── Theme/ │ │ │ │ │ │ ├── AllView.tsx │ │ │ │ │ │ ├── View.tsx │ │ │ │ │ │ ├── application.ts │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── ThemeConfigDefinition.tsx │ │ │ │ │ │ │ └── ThemeSetting.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ └── hooks/ │ │ │ │ │ │ └── useThemeVariable.ts │ │ │ │ │ ├── Wallpapers/ │ │ │ │ │ │ ├── AllView.tsx │ │ │ │ │ │ ├── View.module.css │ │ │ │ │ │ ├── View.tsx │ │ │ │ │ │ └── application.ts │ │ │ │ │ ├── Widget/ │ │ │ │ │ │ ├── AllView.tsx │ │ │ │ │ │ ├── ConfigRenderer.tsx │ │ │ │ │ │ ├── InstanceSelector.tsx │ │ │ │ │ │ ├── View.tsx │ │ │ │ │ │ └── application.ts │ │ │ │ │ ├── infra.module.css │ │ │ │ │ └── infra.tsx │ │ │ │ ├── seelenweg/ │ │ │ │ │ ├── application.ts │ │ │ │ │ └── infra.tsx │ │ │ │ ├── shared/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── infra.ts │ │ │ │ │ ├── signals.ts │ │ │ │ │ ├── tauri/ │ │ │ │ │ │ └── infra.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── app.ts │ │ │ │ │ └── domain.ts │ │ │ │ └── shortcuts/ │ │ │ │ ├── application.ts │ │ │ │ └── infrastructure.tsx │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ ├── router.tsx │ │ │ ├── state/ │ │ │ │ ├── mod.ts │ │ │ │ ├── resources.ts │ │ │ │ └── system.ts │ │ │ └── styles/ │ │ │ ├── global.css │ │ │ └── variables.css │ │ ├── toolbar/ │ │ │ ├── app.tsx │ │ │ ├── components/ │ │ │ │ └── Error/ │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.tsx │ │ │ ├── modules/ │ │ │ │ ├── item/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ ├── actionEvaluator.ts │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── scope.ts │ │ │ │ │ │ │ ├── useItemScope.ts │ │ │ │ │ │ │ └── useRemoteData.ts │ │ │ │ │ │ └── services/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── widgetTrigger.ts │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ └── infra/ │ │ │ │ │ ├── ContextMenu.tsx │ │ │ │ │ ├── EvaluatedComponents.tsx │ │ │ │ │ └── infra.tsx │ │ │ │ ├── main/ │ │ │ │ │ ├── ContextMenu.tsx │ │ │ │ │ ├── CornerAction.tsx │ │ │ │ │ ├── ItemsContainer.tsx │ │ │ │ │ └── Toolbar.tsx │ │ │ │ └── shared/ │ │ │ │ ├── state/ │ │ │ │ │ ├── default.ts │ │ │ │ │ ├── items.ts │ │ │ │ │ ├── lazy.ts │ │ │ │ │ ├── mod.ts │ │ │ │ │ ├── system.ts │ │ │ │ │ └── windows.ts │ │ │ │ └── utils.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── styles/ │ │ │ ├── global.css │ │ │ └── variables.css │ │ └── weg/ │ │ ├── app.tsx │ │ ├── components/ │ │ │ └── Error/ │ │ │ └── index.tsx │ │ ├── i18n/ │ │ │ ├── index.ts │ │ │ └── translations/ │ │ │ ├── af.yml │ │ │ ├── am.yml │ │ │ ├── ar.yml │ │ │ ├── az.yml │ │ │ ├── bg.yml │ │ │ ├── bn.yml │ │ │ ├── bs.yml │ │ │ ├── ca.yml │ │ │ ├── cs.yml │ │ │ ├── cy.yml │ │ │ ├── da.yml │ │ │ ├── de.yml │ │ │ ├── el.yml │ │ │ ├── en.yml │ │ │ ├── es.yml │ │ │ ├── et.yml │ │ │ ├── eu.yml │ │ │ ├── fa.yml │ │ │ ├── fi.yml │ │ │ ├── fr.yml │ │ │ ├── gu.yml │ │ │ ├── he.yml │ │ │ ├── hi.yml │ │ │ ├── hr.yml │ │ │ ├── hu.yml │ │ │ ├── hy.yml │ │ │ ├── id.yml │ │ │ ├── is.yml │ │ │ ├── it.yml │ │ │ ├── ja.yml │ │ │ ├── ka.yml │ │ │ ├── km.yml │ │ │ ├── ko.yml │ │ │ ├── ku.yml │ │ │ ├── lb.yml │ │ │ ├── lo.yml │ │ │ ├── lt.yml │ │ │ ├── lv.yml │ │ │ ├── mk.yml │ │ │ ├── mn.yml │ │ │ ├── ms.yml │ │ │ ├── mt.yml │ │ │ ├── ne.yml │ │ │ ├── nl.yml │ │ │ ├── no.yml │ │ │ ├── pa.yml │ │ │ ├── pl.yml │ │ │ ├── ps.yml │ │ │ ├── pt-BR.yml │ │ │ ├── pt-PT.yml │ │ │ ├── ro.yml │ │ │ ├── ru.yml │ │ │ ├── si.yml │ │ │ ├── sk.yml │ │ │ ├── so.yml │ │ │ ├── sr.yml │ │ │ ├── sv.yml │ │ │ ├── sw.yml │ │ │ ├── ta.yml │ │ │ ├── te.yml │ │ │ ├── tg.yml │ │ │ ├── th.yml │ │ │ ├── tl.yml │ │ │ ├── tr.yml │ │ │ ├── uk.yml │ │ │ ├── ur.yml │ │ │ ├── uz.yml │ │ │ ├── vi.yml │ │ │ ├── yo.yml │ │ │ ├── zh-CN.yml │ │ │ ├── zh-TW.yml │ │ │ └── zu.yml │ │ ├── index.tsx │ │ ├── modules/ │ │ │ ├── bar/ │ │ │ │ ├── DockMenu.tsx │ │ │ │ ├── DraggableItem.tsx │ │ │ │ ├── ItemReordableList.tsx │ │ │ │ └── index.tsx │ │ │ ├── item/ │ │ │ │ ├── application.ts │ │ │ │ └── infra/ │ │ │ │ ├── GeneralMenu.tsx │ │ │ │ ├── MediaSession.css │ │ │ │ ├── MediaSession.tsx │ │ │ │ ├── RecycleBin.tsx │ │ │ │ ├── Separator.tsx │ │ │ │ ├── ShowDesktop.tsx │ │ │ │ ├── StartMenu.tsx │ │ │ │ ├── UserApplication.tsx │ │ │ │ ├── UserApplicationContextMenu.tsx │ │ │ │ └── UserApplicationPreview.tsx │ │ │ └── shared/ │ │ │ ├── state/ │ │ │ │ ├── hidden.ts │ │ │ │ ├── items.ts │ │ │ │ ├── mod.ts │ │ │ │ ├── settings.ts │ │ │ │ ├── system.ts │ │ │ │ └── windows.ts │ │ │ └── types.ts │ │ ├── public/ │ │ │ └── index.html │ │ └── styles/ │ │ ├── global.css │ │ └── variables.css │ ├── reduxRootState.ts │ ├── svelte/ │ │ ├── apps-menu/ │ │ │ ├── App.svelte │ │ │ ├── components/ │ │ │ │ ├── AllAppsView.svelte │ │ │ │ ├── AppItem.svelte │ │ │ │ ├── FolderItem.svelte │ │ │ │ ├── FolderModal.svelte │ │ │ │ ├── PinnedView.svelte │ │ │ │ └── StartMenuBody.svelte │ │ │ ├── constants.ts │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.ts │ │ │ ├── keyboard-navigation.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ ├── state/ │ │ │ │ ├── config.svelte.ts │ │ │ │ ├── knownFolders.svelte.ts │ │ │ │ ├── mod.svelte.ts │ │ │ │ └── positioning.svelte.ts │ │ │ └── utils.ts │ │ ├── bluetooth-popup/ │ │ │ ├── app.svelte │ │ │ ├── components/ │ │ │ │ └── BluetoothDevice.svelte │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── icons.ts │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── calendar-popup/ │ │ │ ├── app.svelte │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── context-menu/ │ │ │ ├── MenuItem.svelte │ │ │ ├── Submenu.svelte │ │ │ ├── app.svelte │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── flyouts/ │ │ │ ├── app/ │ │ │ │ ├── Brightness.svelte │ │ │ │ ├── MediaDevices.svelte │ │ │ │ ├── MediaPlaying.svelte │ │ │ │ └── Workspace.svelte │ │ │ ├── app.svelte │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state/ │ │ │ ├── config.svelte.ts │ │ │ ├── mod.svelte.ts │ │ │ └── placement.svelte.ts │ │ ├── keyboard-selector/ │ │ │ ├── app.svelte │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── media-popup/ │ │ │ ├── app.svelte │ │ │ ├── components/ │ │ │ │ ├── DeviceView.svelte │ │ │ │ ├── MainView.svelte │ │ │ │ ├── MediaDevice.svelte │ │ │ │ ├── MediaPlayer.svelte │ │ │ │ └── VolumeControl.svelte │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── network-popup/ │ │ │ ├── app.svelte │ │ │ ├── components/ │ │ │ │ └── WlanEntry.svelte │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── notifications/ │ │ │ ├── app.svelte │ │ │ ├── components/ │ │ │ │ └── Notification.svelte │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── power-menu/ │ │ │ ├── app.svelte │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.ts │ │ │ ├── options.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── quick-settings/ │ │ │ ├── app.svelte │ │ │ ├── components/ │ │ │ │ ├── BrightnessControl.svelte │ │ │ │ ├── MediaDevices.svelte │ │ │ │ └── RadioButtons.svelte │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── system-tray/ │ │ │ ├── app.svelte │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── task-switcher/ │ │ │ ├── App.svelte │ │ │ ├── components/ │ │ │ │ └── TaskItem.svelte │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── user-menu/ │ │ │ ├── app.svelte │ │ │ ├── components/ │ │ │ │ ├── EmptyList.svelte │ │ │ │ ├── FilePreview.svelte │ │ │ │ ├── UserFolder.svelte │ │ │ │ └── UserProfile.svelte │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.ts │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state/ │ │ │ ├── knownFolders.svelte.ts │ │ │ └── mod.svelte.ts │ │ ├── wallpaper_manager/ │ │ │ ├── app.svelte │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ └── translations/ │ │ │ │ ├── af.yml │ │ │ │ ├── am.yml │ │ │ │ ├── ar.yml │ │ │ │ ├── az.yml │ │ │ │ ├── bg.yml │ │ │ │ ├── bn.yml │ │ │ │ ├── bs.yml │ │ │ │ ├── ca.yml │ │ │ │ ├── cs.yml │ │ │ │ ├── cy.yml │ │ │ │ ├── da.yml │ │ │ │ ├── de.yml │ │ │ │ ├── el.yml │ │ │ │ ├── en.yml │ │ │ │ ├── es.yml │ │ │ │ ├── et.yml │ │ │ │ ├── eu.yml │ │ │ │ ├── fa.yml │ │ │ │ ├── fi.yml │ │ │ │ ├── fr.yml │ │ │ │ ├── gu.yml │ │ │ │ ├── he.yml │ │ │ │ ├── hi.yml │ │ │ │ ├── hr.yml │ │ │ │ ├── hu.yml │ │ │ │ ├── hy.yml │ │ │ │ ├── id.yml │ │ │ │ ├── is.yml │ │ │ │ ├── it.yml │ │ │ │ ├── ja.yml │ │ │ │ ├── ka.yml │ │ │ │ ├── km.yml │ │ │ │ ├── ko.yml │ │ │ │ ├── ku.yml │ │ │ │ ├── lb.yml │ │ │ │ ├── lo.yml │ │ │ │ ├── lt.yml │ │ │ │ ├── lv.yml │ │ │ │ ├── mk.yml │ │ │ │ ├── mn.yml │ │ │ │ ├── ms.yml │ │ │ │ ├── mt.yml │ │ │ │ ├── ne.yml │ │ │ │ ├── nl.yml │ │ │ │ ├── no.yml │ │ │ │ ├── pa.yml │ │ │ │ ├── pl.yml │ │ │ │ ├── ps.yml │ │ │ │ ├── pt-BR.yml │ │ │ │ ├── pt-PT.yml │ │ │ │ ├── ro.yml │ │ │ │ ├── ru.yml │ │ │ │ ├── si.yml │ │ │ │ ├── sk.yml │ │ │ │ ├── so.yml │ │ │ │ ├── sr.yml │ │ │ │ ├── sv.yml │ │ │ │ ├── sw.yml │ │ │ │ ├── ta.yml │ │ │ │ ├── te.yml │ │ │ │ ├── tg.yml │ │ │ │ ├── th.yml │ │ │ │ ├── tl.yml │ │ │ │ ├── tr.yml │ │ │ │ ├── uk.yml │ │ │ │ ├── ur.yml │ │ │ │ ├── uz.yml │ │ │ │ ├── vi.yml │ │ │ │ ├── yo.yml │ │ │ │ ├── zh-CN.yml │ │ │ │ ├── zh-TW.yml │ │ │ │ └── zu.yml │ │ │ ├── index.ts │ │ │ ├── modules/ │ │ │ │ └── Monitor/ │ │ │ │ ├── Monitor.svelte │ │ │ │ └── infra.svelte │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ └── state.svelte.ts │ │ ├── window_manager/ │ │ │ ├── App.svelte │ │ │ ├── index.ts │ │ │ ├── layout/ │ │ │ │ ├── application.ts │ │ │ │ ├── domain.ts │ │ │ │ └── infra/ │ │ │ │ ├── Container.svelte │ │ │ │ ├── Layout.svelte │ │ │ │ ├── containers/ │ │ │ │ │ ├── Leaf.svelte │ │ │ │ │ ├── Reserved.svelte │ │ │ │ │ └── Stack.svelte │ │ │ │ └── index.css │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ ├── state.svelte.ts │ │ │ ├── styles/ │ │ │ │ └── global.css │ │ │ └── utils.ts │ │ └── workspaces-viewer/ │ │ ├── app/ │ │ │ ├── Monitor.svelte │ │ │ ├── Window.svelte │ │ │ └── Workspace.svelte │ │ ├── app.svelte │ │ ├── index.ts │ │ ├── public/ │ │ │ └── index.html │ │ └── state.svelte.ts │ └── vanilla/ │ ├── entry-point/ │ │ ├── ConsoleWrapper.ts │ │ ├── _ConsoleWrapper.ts │ │ ├── _tauri.ts │ │ ├── index.ts │ │ └── setup.ts │ ├── integrity/ │ │ ├── index.ts │ │ └── public/ │ │ └── index.html │ └── third_party/ │ ├── index.ts │ ├── public/ │ │ └── index.html │ └── reset.css └── tsconfig.json
Showing preview only (271K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3067 symbols across 468 files)
FILE: libs/core/scripts/build_npm.ts
method postBuild (line 44) | postBuild(): void {
FILE: libs/core/src/constants/mod.rs
constant SUPPORTED_LANGUAGES (line 1) | pub const SUPPORTED_LANGUAGES: &[SupportedLanguage] = &[
type SupportedLanguage (line 76) | pub struct SupportedLanguage {
function lang (line 82) | const fn lang(
FILE: libs/core/src/constants/mod.ts
type SupportedLanguagesCode (line 1) | type SupportedLanguagesCode = (typeof SupportedLanguages)[number]["value"];
type SupportedLanguage (line 2) | interface SupportedLanguage {
FILE: libs/core/src/error.rs
method from (line 32) | fn from(err: &str) -> Self {
method fmt (line 38) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type Result (line 43) | pub type Result<T, E = SeelenLibError> = std::result::Result<T, E>;
FILE: libs/core/src/handlers/commands.ts
type SeelenCommand (line 2) | enum SeelenCommand {
FILE: libs/core/src/handlers/events.ts
type SeelenEvent (line 2) | enum SeelenEvent {
FILE: libs/core/src/handlers/mod.ts
type $keyof (line 8) | type $keyof<Type> = [Type] extends [never] ? keyof Type
type UnionToIntersection (line 12) | type UnionToIntersection<Type> = {
type MapNullToVoid (line 21) | type MapNullToVoid<Obj> = {
type MapNullToUndefined (line 25) | type MapNullToUndefined<Obj> = {
type AllSeelenCommandArguments (line 29) | type AllSeelenCommandArguments = MapNullToUndefined<
type AllSeelenCommandReturns (line 32) | type AllSeelenCommandReturns = MapNullToVoid<
type AllSeelenEventPayloads (line 36) | type AllSeelenEventPayloads = UnionToIntersection<SeelenEventPayload>;
function invoke (line 44) | function invoke<T extends SeelenCommand>(
type UnSubscriber (line 60) | type UnSubscriber = () => void;
function subscribe (line 62) | function subscribe<T extends SeelenEvent>(
FILE: libs/core/src/lib.rs
function generate_schemas (line 28) | fn generate_schemas() {
FILE: libs/core/src/rect.rs
type Rect (line 7) | pub struct Rect {
method as_frame (line 26) | pub fn as_frame(&self) -> Frame {
method width (line 35) | pub fn width(&self) -> i32 {
method height (line 39) | pub fn height(&self) -> i32 {
method center (line 43) | pub fn center(&self) -> Point {
method corners (line 47) | pub fn corners(&self) -> [Point; 4] {
method intersection (line 56) | pub fn intersection(&self, other: &Rect) -> Option<Rect> {
method contains (line 74) | pub fn contains(&self, point: &Point) -> bool {
type Frame (line 18) | pub struct Frame {
type Point (line 81) | pub struct Point {
method new (line 87) | pub fn new(x: i32, y: i32) -> Self {
method distance_squared (line 91) | pub fn distance_squared(&self, other: &Point) -> i32 {
method distance (line 97) | pub fn distance(&self, other: &Point) -> f64 {
FILE: libs/core/src/resource/file.rs
type SluResourceFile (line 23) | pub struct SluResourceFile {
method decode (line 32) | pub fn decode<R: Read + Seek>(mut reader: R) -> Result<Self> {
method encode (line 57) | pub fn encode<W: Write>(&self, mut writer: W) -> Result<()> {
method load (line 68) | pub fn load(path: &Path) -> Result<Self> {
method store (line 75) | pub fn store(&self, path: &Path) -> Result<()> {
method try_parse_into (line 80) | pub fn try_parse_into<T>(&self) -> Result<T>
FILE: libs/core/src/resource/interface.rs
type SluResource (line 13) | pub trait SluResource: Sized + Serialize + DeserializeOwned {
constant KIND (line 14) | const KIND: ResourceKind;
method metadata (line 16) | fn metadata(&self) -> &ResourceMetadata;
method metadata_mut (line 17) | fn metadata_mut(&mut self) -> &mut ResourceMetadata;
method load_from_file (line 21) | fn load_from_file(path: &Path) -> Result<Self> {
method load_from_folder (line 57) | fn load_from_folder(path: &Path) -> Result<Self> {
method load (line 65) | fn load(path: &Path) -> Result<Self> {
method sanitize (line 87) | fn sanitize(&mut self) {}
method validate (line 90) | fn validate(&self) -> Result<()> {
method save (line 95) | fn save(&self) -> Result<()> {
method delete (line 130) | fn delete(&self) -> Result<()> {
FILE: libs/core/src/resource/metadata.rs
type ResourceMetadata (line 13) | pub struct ResourceMetadata {
method directory (line 38) | pub fn directory(&self) -> Result<PathBuf> {
type InternalResourceMetadata (line 53) | pub struct InternalResourceMetadata {
method default (line 64) | fn default() -> Self {
FILE: libs/core/src/resource/mod.rs
type ResourceText (line 31) | pub enum ResourceText {
constant MISSING_TEXT (line 43) | const MISSING_TEXT: &'static str = "!?";
method has (line 46) | pub fn has(&self, lang: &str) -> bool {
method get (line 55) | pub fn get(&self, lang: &str) -> &str {
method set (line 68) | pub fn set(&mut self, lang: impl Into<String>, value: impl Into<String...
method default (line 37) | fn default() -> Self {
type ResourceKind (line 85) | pub enum ResourceKind {
type ResourceStatus (line 98) | pub enum ResourceStatus {
type ResourceAttribute (line 115) | pub enum ResourceAttribute {
type Resource (line 128) | pub struct Resource {
method verify (line 167) | pub fn verify(&self) -> Result<()> {
FILE: libs/core/src/resource/resource_id.rs
type ResourceId (line 11) | pub enum ResourceId {
method regex (line 17) | fn regex() -> &'static regex::Regex {
method is_valid (line 25) | pub fn is_valid(&self) -> bool {
method validate (line 32) | pub fn validate(&self) -> Result<(), String> {
method as_str (line 47) | pub fn as_str(&self) -> &str {
method starts_with (line 54) | pub fn starts_with(&self, prefix: &str) -> bool {
method creator (line 62) | pub fn creator(&self) -> Option<String> {
method resource_name (line 76) | pub fn resource_name(&self) -> Option<String> {
method from (line 91) | fn from(value: &str) -> Self {
method from (line 97) | fn from(value: String) -> Self {
method from (line 108) | fn from(value: uuid::Uuid) -> Self {
method fmt (line 114) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method deserialize (line 135) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
method default (line 85) | fn default() -> Self {
method serialize (line 123) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
method known_settings (line 208) | pub fn known_settings() -> Self {
method known_weg (line 211) | pub fn known_weg() -> Self {
method known_toolbar (line 214) | pub fn known_toolbar() -> Self {
method known_wm (line 217) | pub fn known_wm() -> Self {
method known_wall (line 220) | pub fn known_wall() -> Self {
method known_popup (line 223) | pub fn known_popup() -> Self {
FILE: libs/core/src/resource/yaml_ext.rs
function deserialize_extended_yaml (line 10) | pub fn deserialize_extended_yaml<T: serde::de::DeserializeOwned>(path: &...
function read_and_parse_yml (line 15) | fn read_and_parse_yml(path: &Path) -> Result<Value> {
function parse_yaml (line 23) | fn parse_yaml(base: &Path, value: Value) -> Result<Value> {
FILE: libs/core/src/state/icon_pack.rs
type IconPack (line 13) | pub struct IconPack {
method add_entry (line 53) | pub fn add_entry(&mut self, entry: IconPackEntry) {
method find_similar_mut (line 62) | pub fn find_similar_mut(&mut self, entry: &IconPackEntry) -> Option<&m...
method find_similar (line 69) | pub fn find_similar(&self, entry: &IconPackEntry) -> Option<&IconPackE...
method contains_similar (line 74) | pub fn contains_similar(&self, entry: &IconPackEntry) -> bool {
constant KIND (line 28) | const KIND: ResourceKind = ResourceKind::IconPack;
method metadata (line 30) | fn metadata(&self) -> &ResourceMetadata {
method metadata_mut (line 34) | fn metadata_mut(&mut self) -> &mut ResourceMetadata {
method sanitize (line 38) | fn sanitize(&mut self) {
type UniqueIconPackEntry (line 84) | pub struct UniqueIconPackEntry {
type SharedIconPackEntry (line 106) | pub struct SharedIconPackEntry {
type CustomIconPackEntry (line 115) | pub struct CustomIconPackEntry {
type IconPackEntry (line 125) | pub enum IconPackEntry {
method matches (line 132) | pub fn matches(&self, entry: &IconPackEntry) -> bool {
type Icon (line 153) | pub struct Icon {
method is_valid (line 172) | pub fn is_valid(&self) -> bool {
function is_false (line 177) | fn is_false(b: &bool) -> bool {
FILE: libs/core/src/state/icon_pack.test.ts
function assertNull (line 6) | function assertNull(value: unknown): void {
function onlyBase (line 10) | function onlyBase(x: string): Icon {
constant GOT_BY_PATH (line 21) | const GOT_BY_PATH = "GOT_BY_PATH";
constant GOT_BY_FILENAME (line 22) | const GOT_BY_FILENAME = "GOT_BY_FILENAME";
constant GOT_BY_EXTENSION (line 23) | const GOT_BY_EXTENSION = "GOT_BY_EXTENSION";
constant GOT_BY_UMID (line 24) | const GOT_BY_UMID = "GOT_BY_UMID";
constant A_PATH (line 26) | const A_PATH = "path\\to\\a";
constant B_PATH (line 27) | const B_PATH = "path\\to\\b";
constant C_PATH (line 28) | const C_PATH = "path\\to\\c";
class IconPackManagerTestContext (line 148) | class IconPackManagerTestContext {
method constructor (line 152) | constructor(initialActives: string[] = ["b", "a"]) {
method instance (line 164) | get instance(): IconPackManagerMock {
method withActives (line 169) | withActives(actives: string[]): this {
class IconPackManagerMock (line 176) | class IconPackManagerMock extends IconPackManager {
method constructor (line 177) | constructor(packs: IconPack[], activeKeys: string[]) {
method setActives (line 183) | public setActives(actives: string[]): void {
FILE: libs/core/src/state/icon_pack.ts
class IconPackList (line 15) | class IconPackList extends List<IIconPack> {
method getAsync (line 16) | static getAsync(): Promise<IconPackList> {
method onChange (line 20) | static onChange(cb: (payload: IconPackList) => void): Promise<UnSubscr...
class IconPackManager (line 28) | class IconPackManager {
method constructor (line 36) | protected constructor(
method iconPacks (line 41) | get iconPacks(): IconPack[] {
method activeIconPackIds (line 45) | get activeIconPackIds(): string[] {
method resolveAvailableIcons (line 49) | protected resolveAvailableIcons(): void {
method cacheActiveIconPacks (line 73) | protected cacheActiveIconPacks(): void {
method create (line 89) | public static async create(): Promise<IconPackManager> {
method onChange (line 130) | public async onChange(cb: () => void): Promise<UnlistenFn> {
method getIconPath (line 184) | public getIconPath(args: SeelenCommandGetIconArgs): IIcon | null {
method getIcon (line 273) | public getIcon({ path, umid }: SeelenCommandGetIconArgs): IIcon | null {
method getMissingIconPath (line 282) | public getMissingIconPath(): IIcon | null {
method getMissingIcon (line 295) | public getMissingIcon(): IIcon | null {
method getCustomIconPath (line 304) | public getCustomIconPath(name: string): IIcon | null {
method getCustomIcon (line 318) | public getCustomIcon(name: string): IIcon | null {
method requestIconExtraction (line 336) | public static requestIconExtraction(
method clearCachedIcons (line 346) | public static clearCachedIcons(): Promise<void> {
function resolveIcon (line 351) | function resolveIcon(parent: string, icon: IIcon): IIcon {
function resolveAsSrc (line 361) | function resolveAsSrc(icon: IIcon): IIcon {
FILE: libs/core/src/state/placeholder.rs
type ToolbarJsScope (line 12) | pub enum ToolbarJsScope {
type ToolbarItem (line 31) | pub struct ToolbarItem {
method id (line 77) | pub fn id(&self) -> String {
method set_id (line 81) | pub fn set_id(&mut self, id: String) {
type RemoteDataDeclaration (line 53) | pub struct RemoteDataDeclaration {
type StyleValue (line 61) | pub enum StyleValue {
type WorkspaceToolbarItemMode (line 69) | pub enum WorkspaceToolbarItemMode {
type ToolbarItem2 (line 88) | pub enum ToolbarItem2 {
type ToolbarState (line 96) | pub struct ToolbarState {
method migrate_plugin_id (line 108) | fn migrate_plugin_id(id: PluginId) -> PluginId {
method sanitize_items (line 123) | fn sanitize_items(dict: &mut HashSet<String>, items: Vec<ToolbarItem2>...
method sanitize (line 157) | pub fn sanitize(&mut self) {
FILE: libs/core/src/state/plugin/mod.rs
type Plugin (line 13) | pub struct Plugin {
method default_icon (line 38) | pub fn default_icon() -> String {
constant KIND (line 26) | const KIND: ResourceKind = ResourceKind::Plugin;
method metadata (line 28) | fn metadata(&self) -> &ResourceMetadata {
method metadata_mut (line 32) | fn metadata_mut(&mut self) -> &mut ResourceMetadata {
FILE: libs/core/src/state/plugin/mod.ts
class PluginList (line 7) | class PluginList extends List<Plugin> {
method getAsync (line 8) | static getAsync(): Promise<PluginList> {
method onChange (line 12) | static onChange(cb: (payload: PluginList) => void): Promise<UnSubscrib...
method forCurrentWidget (line 16) | forCurrentWidget(): Plugin[] {
FILE: libs/core/src/state/plugin/value.rs
type KnownPlugin (line 11) | pub enum KnownPlugin {
type ThirdPartyPlugin (line 19) | pub struct ThirdPartyPlugin {
type PluginValue (line 30) | pub enum PluginValue {
FILE: libs/core/src/state/popups/mod.rs
type SluPopupConfig (line 8) | pub struct SluPopupConfig {
method default (line 17) | fn default() -> Self {
type SluPopupContent (line 34) | pub enum SluPopupContent {
method set_styles (line 61) | pub fn set_styles(&mut self, new_styles: CssStyles) {
type CssStyles (line 73) | pub struct CssStyles(HashMap<String, String>);
method new (line 76) | pub fn new() -> Self {
method add (line 80) | pub fn add(mut self, key: &str, value: &str) -> Self {
FILE: libs/core/src/state/settings/by_monitor.rs
type MonitorSettingsByWidget (line 12) | pub struct MonitorSettingsByWidget(HashMap<WidgetId, ThirdPartyWidgetSet...
method is_widget_enabled (line 15) | pub fn is_widget_enabled(&self, widget_id: &WidgetId) -> bool {
method remove (line 21) | pub fn remove(&mut self, widget_id: &WidgetId) -> Option<ThirdPartyWid...
method insert (line 25) | pub fn insert(&mut self, widget_id: WidgetId, settings: ThirdPartyWidg...
type MonitorConfiguration (line 32) | pub struct MonitorConfiguration {
type WorkspaceConfiguration (line 44) | pub struct WorkspaceConfiguration {
FILE: libs/core/src/state/settings/by_theme.rs
type ThemeSettings (line 6) | pub struct ThemeSettings(HashMap<CssVariableName, String>);
FILE: libs/core/src/state/settings/by_wallpaper.rs
type WallpaperInstanceSettings (line 3) | pub struct WallpaperInstanceSettings {
method default (line 29) | fn default() -> Self {
type ObjectFit (line 50) | pub enum ObjectFit {
type ObjectPosition (line 60) | pub enum ObjectPosition {
type MixBlendMode (line 72) | pub enum MixBlendMode {
type PlaybackSpeed (line 97) | pub enum PlaybackSpeed {
FILE: libs/core/src/state/settings/by_widget.rs
type SettingsByWidget (line 12) | pub struct SettingsByWidget {
method is_enabled (line 26) | pub fn is_enabled(&self, widget_id: &WidgetId) -> bool {
method set_enabled (line 40) | pub fn set_enabled(&mut self, widget_id: &WidgetId, enabled: bool) {
type ThirdPartyWidgetSettings (line 63) | pub struct ThirdPartyWidgetSettings {
FILE: libs/core/src/state/settings/mod.rs
type FancyToolbarSettings (line 40) | pub struct FancyToolbarSettings {
method total_size (line 76) | pub fn total_size(&self) -> u32 {
method default (line 60) | fn default() -> Self {
type FancyToolbarSide (line 83) | pub enum FancyToolbarSide {
type SeelenWegMode (line 92) | pub enum SeelenWegMode {
type WegTemporalItemsVisibility (line 101) | pub enum WegTemporalItemsVisibility {
type WegPinnedItemsVisibility (line 108) | pub enum WegPinnedItemsVisibility {
type HideMode (line 115) | pub enum HideMode {
type SeelenWegSide (line 127) | pub enum SeelenWegSide {
type SeelenWegSettings (line 137) | pub struct SeelenWegSettings {
method total_size (line 203) | pub fn total_size(&self) -> u32 {
method default (line 177) | fn default() -> Self {
type WindowManagerSettings (line 213) | pub struct WindowManagerSettings {
type WmDragBehavior (line 240) | pub enum WmDragBehavior {
type Border (line 250) | pub struct Border {
type FloatingWindowSettings (line 259) | pub struct FloatingWindowSettings {
type WmAnimations (line 266) | pub struct WmAnimations {
method default (line 273) | fn default() -> Self {
method default (line 283) | fn default() -> Self {
method default (line 293) | fn default() -> Self {
method default (line 302) | fn default() -> Self {
type MultimonitorBehaviour (line 323) | pub enum MultimonitorBehaviour {
type SeelenWallSettings (line 332) | pub struct SeelenWallSettings {
method default (line 348) | fn default() -> Self {
type UpdateChannel (line 364) | pub enum UpdateChannel {
type UpdaterSettings (line 372) | pub struct UpdaterSettings {
method default (line 377) | fn default() -> Self {
type StartOfWeek (line 389) | pub enum StartOfWeek {
type Settings (line 401) | pub struct Settings {
method get_locale (line 478) | pub fn get_locale() -> Option<String> {
method get_system_language (line 482) | pub fn get_system_language() -> String {
method migrate (line 489) | pub fn migrate(&mut self) -> Result<()> {
method dedup_themes (line 511) | pub fn dedup_themes(&mut self) {
method dedup_icon_packs (line 516) | pub fn dedup_icon_packs(&mut self) {
method sanitize (line 521) | pub fn sanitize(&mut self) -> Result<()> {
method load (line 540) | pub fn load(path: impl AsRef<Path>) -> Result<Self> {
method save (line 571) | pub fn save(&self, path: impl AsRef<Path>) -> Result<()> {
method is_widget_enabled (line 606) | pub fn is_widget_enabled(&self, widget_id: &WidgetId) -> bool {
method set_widget_enabled (line 610) | pub fn set_widget_enabled(&mut self, widget_id: &WidgetId, enabled: bo...
method is_widget_enabled_on_monitor (line 614) | pub fn is_widget_enabled_on_monitor(
method default (line 452) | fn default() -> Self {
type PerformanceModeSettings (line 631) | pub struct PerformanceModeSettings {
method default (line 638) | fn default() -> Self {
type PerformanceMode (line 649) | pub enum PerformanceMode {
FILE: libs/core/src/state/settings/mod.ts
type Settings (line 8) | interface Settings extends ISettings {}
method constructor (line 10) | constructor(public inner: ISettings) {
method default (line 14) | static default(): Promise<Settings> {
method getAsync (line 18) | static getAsync(): Promise<Settings> {
method onChange (line 22) | static onChange(cb: (payload: Settings) => void): Promise<UnSubscriber> {
method loadCustom (line 26) | static loadCustom(path: string): Promise<Settings> {
method getCurrentWidgetConfig (line 38) | getCurrentWidgetConfig(): ThirdPartyWidgetSettings {
method save (line 57) | save(): Promise<void> {
class Settings (line 9) | class Settings {
method constructor (line 10) | constructor(public inner: ISettings) {
method default (line 14) | static default(): Promise<Settings> {
method getAsync (line 18) | static getAsync(): Promise<Settings> {
method onChange (line 22) | static onChange(cb: (payload: Settings) => void): Promise<UnSubscriber> {
method loadCustom (line 26) | static loadCustom(path: string): Promise<Settings> {
method getCurrentWidgetConfig (line 38) | getCurrentWidgetConfig(): ThirdPartyWidgetSettings {
method save (line 57) | save(): Promise<void> {
FILE: libs/core/src/state/settings/settings_by_app.rs
type AppExtraFlag (line 9) | pub enum AppExtraFlag {
type AppIdentifierType (line 31) | pub enum AppIdentifierType {
type MatchingStrategy (line 44) | pub enum MatchingStrategy {
type AppIdentifier (line 60) | pub struct AppIdentifier {
method prepare (line 87) | fn prepare(&mut self) {
method lower_id (line 104) | fn lower_id(&self) -> &str {
method validate (line 110) | fn validate(&self, title: &str, class: &str, exe: &str, path: &str) ->...
type AppIdentifierCache (line 81) | pub struct AppIdentifierCache {
type AppConfig (line 167) | pub struct AppConfig {
method prepare (line 187) | pub fn prepare(&mut self) {
method is_false (line 191) | fn is_false(b: &bool) -> bool {
type AppsConfigurationList (line 197) | pub struct AppsConfigurationList(Vec<AppConfig>);
method prepare (line 200) | pub fn prepare(&mut self) {
method search (line 204) | pub fn search(&self, title: &str, class: &str, exe: &str, path: &str) ...
method iter (line 215) | pub fn iter(&self) -> impl Iterator<Item = &AppConfig> {
method clear (line 219) | pub fn clear(&mut self) {
method len (line 223) | pub fn len(&self) -> usize {
method is_empty (line 227) | pub fn is_empty(&self) -> bool {
method extend (line 231) | pub fn extend(&mut self, configs: Vec<AppConfig>) {
method as_slice (line 235) | pub fn as_slice(&self) -> &[AppConfig] {
function test_system_apps_path_contains_matching (line 245) | fn test_system_apps_path_contains_matching() {
function test_system_apps_full_config (line 279) | fn test_system_apps_full_config() {
function test_apps_configuration_list_search (line 325) | fn test_apps_configuration_list_search() {
function test_path_contains_non_matching (line 363) | fn test_path_contains_non_matching() {
function test_path_case_insensitivity (line 394) | fn test_path_case_insensitivity() {
function test_multiple_system_apps (line 426) | fn test_multiple_system_apps() {
function test_app_extra_flag_deserialization (line 459) | fn test_app_extra_flag_deserialization() {
function test_matching_strategy_deserialization (line 469) | fn test_matching_strategy_deserialization() {
function test_path_separator_normalization_forward_slash (line 481) | fn test_path_separator_normalization_forward_slash() {
function test_path_separator_mixed (line 516) | fn test_path_separator_mixed() {
function test_exe_separator_normalization (line 553) | fn test_exe_separator_normalization() {
function test_title_and_class_no_normalization (line 572) | fn test_title_and_class_no_normalization() {
FILE: libs/core/src/state/settings/shortcuts.rs
type SluHotkeyAction (line 9) | pub enum SluHotkeyAction {
type SluHotkey (line 80) | pub struct SluHotkey {
method new (line 95) | pub fn new<'a, T, I>(action: SluHotkeyAction, keys: I) -> Self
method system (line 110) | pub fn system(mut self) -> Self {
method readonly (line 116) | pub fn readonly(mut self) -> Self {
method attached_to (line 121) | pub fn attached_to(mut self, widget_id: impl Into<WidgetId>) -> Self {
type SluShortcutsSettings (line 129) | pub struct SluShortcutsSettings {
method contains_action (line 144) | pub fn contains_action(&self, action: SluHotkeyAction) -> bool {
method sanitize (line 148) | pub fn sanitize(&mut self) {
method get_mut (line 163) | pub fn get_mut(&mut self, action: SluHotkeyAction) -> Option<&mut SluH...
method default_shortcuts (line 167) | pub fn default_shortcuts() -> Self {
method _default_shortcuts (line 208) | fn _default_shortcuts() -> Vec<SluHotkey> {
method default (line 135) | fn default() -> Self {
FILE: libs/core/src/state/theme/config.rs
type ThemeSettingsDefinition (line 9) | pub struct ThemeSettingsDefinition(Vec<ThemeConfigDefinition>);
type ThemeConfigDefinition (line 13) | pub enum ThemeConfigDefinition {
method deserialize (line 27) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type ThemeConfigGroup (line 21) | pub struct ThemeConfigGroup {
type ThemeVariableDefinition (line 50) | pub enum ThemeVariableDefinition {
type ThemeVariable (line 106) | pub struct ThemeVariable<T> {
type ThemeVariableWithUnit (line 135) | pub struct ThemeVariableWithUnit<T> {
type CssVariableName (line 143) | pub struct CssVariableName(String);
method from_string (line 150) | pub fn from_string(name: &str) -> Result<Self> {
method fmt (line 162) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method deserialize (line 168) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
FILE: libs/core/src/state/theme/mod.rs
type Theme (line 24) | pub struct Theme {
method load_old_folder_schema (line 107) | fn load_old_folder_schema(path: &Path) -> Result<Theme> {
constant KIND (line 38) | const KIND: ResourceKind = ResourceKind::Theme;
method metadata (line 40) | fn metadata(&self) -> &ResourceMetadata {
method metadata_mut (line 44) | fn metadata_mut(&mut self) -> &mut ResourceMetadata {
method load_from_folder (line 48) | fn load_from_folder(path: &Path) -> Result<Theme> {
FILE: libs/core/src/state/theme/mod.ts
class ThemeList (line 14) | class ThemeList extends List<ITheme> {
method getAsync (line 15) | static getAsync(): Promise<ThemeList> {
method onChange (line 19) | static onChange(cb: (payload: ThemeList) => void): Promise<UnSubscribe...
method applyToDocument (line 23) | applyToDocument(activeIds: ThemeId[], variables: ISettings["byTheme"])...
type Theme (line 40) | interface Theme extends ITheme {}
method constructor (line 43) | constructor(plain: ITheme) {
method forEachVariableDefinition (line 47) | forEachVariableDefinition(cb: (def: ThemeVariableDefinition) => void):...
method applyToDocument (line 52) | applyToDocument(varValues: ISettings["byTheme"][ResourceId] = {}): void {
method removeFromDocument (line 91) | removeFromDocument(): void {
class Theme (line 42) | class Theme {
method constructor (line 43) | constructor(plain: ITheme) {
method forEachVariableDefinition (line 47) | forEachVariableDefinition(cb: (def: ThemeVariableDefinition) => void):...
method applyToDocument (line 52) | applyToDocument(varValues: ISettings["byTheme"][ResourceId] = {}): void {
method removeFromDocument (line 91) | removeFromDocument(): void {
function isValidCssVariableName (line 96) | function isValidCssVariableName(name: string): boolean {
function iterateVariableDefinitions (line 100) | function iterateVariableDefinitions(
function removeAllThemeStyles (line 113) | function removeAllThemeStyles(): void {
FILE: libs/core/src/state/theme/tests.rs
function test_compatibility_with_older_schemas (line 6) | fn test_compatibility_with_older_schemas() -> Result<()> {
FILE: libs/core/src/state/theme/theming.ts
function startThemingTool (line 10) | async function startThemingTool(): Promise<void> {
function startDateCssVariables (line 32) | function startDateCssVariables(): void {
function updateDateCssVariables (line 39) | function updateDateCssVariables(): void {
FILE: libs/core/src/state/wallpaper/mod.rs
type Wallpaper (line 17) | pub struct Wallpaper {
constant SUPPORTED_IMAGES (line 97) | pub const SUPPORTED_IMAGES: [&str; 11] = [
constant SUPPORTED_VIDEOS (line 101) | pub const SUPPORTED_VIDEOS: [&str; 7] = ["mp4", "webm", "ogg", "avi", ...
method create_from_file (line 104) | pub fn create_from_file(path: &Path, folder_to_store: &Path, copy: boo...
type WallpaperKind (line 36) | pub enum WallpaperKind {
constant KIND (line 49) | const KIND: ResourceKind = ResourceKind::Wallpaper;
method metadata (line 51) | fn metadata(&self) -> &ResourceMetadata {
method metadata_mut (line 55) | fn metadata_mut(&mut self) -> &mut ResourceMetadata {
method sanitize (line 59) | fn sanitize(&mut self) {
method validate (line 87) | fn validate(&self) -> Result<()> {
type WallpaperCollection (line 164) | pub struct WallpaperCollection {
FILE: libs/core/src/state/wallpaper/mod.ts
constant SUPPORTED_IMAGE_WALLPAPER_EXTENSIONS (line 7) | const SUPPORTED_IMAGE_WALLPAPER_EXTENSIONS = [
constant SUPPORTED_VIDEO_WALLPAPER_EXTENSIONS (line 21) | const SUPPORTED_VIDEO_WALLPAPER_EXTENSIONS = [
class WallpaperList (line 31) | class WallpaperList extends List<IWallpaper> {
method getAsync (line 32) | static getAsync(): Promise<WallpaperList> {
method onChange (line 36) | static onChange(cb: (payload: WallpaperList) => void): Promise<UnSubsc...
type WallpaperConfiguration (line 41) | interface WallpaperConfiguration extends WallpaperInstanceSettings {}
method constructor (line 43) | constructor(plain: WallpaperInstanceSettings) {
method default (line 47) | static default(): Promise<WallpaperConfiguration> {
class WallpaperConfiguration (line 42) | class WallpaperConfiguration {
method constructor (line 43) | constructor(plain: WallpaperInstanceSettings) {
method default (line 47) | static default(): Promise<WallpaperConfiguration> {
FILE: libs/core/src/state/weg_items.rs
type WegItemData (line 10) | pub struct WegItemData {
type WegItem (line 29) | pub enum WegItem {
method id (line 62) | pub fn id(&self) -> &uuid::Uuid {
method set_id (line 74) | fn set_id(&mut self, identifier: uuid::Uuid) {
type WegItemType (line 52) | pub enum WegItemType {
type WegItems (line 90) | pub struct WegItems {
method migrate_item (line 99) | fn migrate_item(item: WegItem) -> Option<WegItem> {
method migrate_items (line 151) | fn migrate_items(items: Vec<WegItem>) -> Vec<WegItem> {
method migrate (line 155) | pub fn migrate(&mut self) {
method sanitize_items (line 161) | fn sanitize_items(dict: &mut HashSet<uuid::Uuid>, items: Vec<WegItem>)...
method sanitize (line 184) | pub fn sanitize(&mut self) {
type OldWegItemSubtype (line 197) | pub enum OldWegItemSubtype {
type OldWegItemData (line 207) | pub struct OldWegItemData {
FILE: libs/core/src/state/widget/context_menu.rs
type ContextMenu (line 6) | pub struct ContextMenu {
type ContextMenuItem (line 17) | pub enum ContextMenuItem {
FILE: libs/core/src/state/widget/declaration.rs
type WidgetSettingsDeclarationList (line 17) | pub struct WidgetSettingsDeclarationList(Vec<WidgetConfigDefinition>);
method there_are_duplicates (line 22) | pub fn there_are_duplicates(&self) -> bool {
method collect_keys_recursive (line 37) | fn collect_keys_recursive<'a>(
type WidgetConfigDefinition (line 64) | pub enum WidgetConfigDefinition {
method deserialize (line 86) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type WidgetConfigGroup (line 76) | pub struct WidgetConfigGroup {
type WidgetSettingItem (line 113) | pub enum WidgetSettingItem {
method get_key (line 147) | pub fn get_key(&self) -> &str {
type WidgetSettingBase (line 162) | pub struct WidgetSettingBase {
type WidgetSettingSwitch (line 186) | pub struct WidgetSettingSwitch {
type WidgetSettingSelect (line 195) | pub struct WidgetSettingSelect {
type WidgetSettingInputText (line 208) | pub struct WidgetSettingInputText {
type WidgetSettingInputNumber (line 223) | pub struct WidgetSettingInputNumber {
type WidgetSettingRange (line 238) | pub struct WidgetSettingRange {
type WidgetSettingColor (line 253) | pub struct WidgetSettingColor {
type WidgetSelectOption (line 265) | pub struct WidgetSelectOption {
type WidgetSelectSubtype (line 277) | pub enum WidgetSelectSubtype {
FILE: libs/core/src/state/widget/interfaces.ts
type WidgetInformation (line 1) | interface WidgetInformation {
type InitWidgetOptions (line 12) | interface InitWidgetOptions {
type ReadyWidgetOptions (line 37) | interface ReadyWidgetOptions {
FILE: libs/core/src/state/widget/mod.rs
type Widget (line 23) | pub struct Widget {
constant KIND (line 64) | const KIND: ResourceKind = ResourceKind::Widget;
method metadata (line 66) | fn metadata(&self) -> &ResourceMetadata {
method metadata_mut (line 70) | fn metadata_mut(&mut self) -> &mut ResourceMetadata {
method load_from_folder (line 74) | fn load_from_folder(path: &Path) -> Result<Widget> {
method validate (line 102) | fn validate(&self) -> Result<()> {
method sanitize (line 112) | fn sanitize(&mut self) {
type WidgetInstanceMode (line 121) | pub enum WidgetInstanceMode {
type WidgetLoader (line 136) | pub enum WidgetLoader {
type WidgetPreset (line 150) | pub enum WidgetPreset {
type WidgetTriggerPayload (line 173) | pub struct WidgetTriggerPayload {
method new (line 195) | pub fn new(id: WidgetId) -> Self {
method add_custom_arg (line 207) | pub fn add_custom_arg(&mut self, key: impl AsRef<str>, value: impl Int...
type Alignment (line 220) | pub enum Alignment {
type WidgetStatus (line 228) | pub enum WidgetStatus {
FILE: libs/core/src/state/widget/mod.ts
type WidgetInternalState (line 24) | interface WidgetInternalState {
class Widget (line 42) | class Widget {
method getCurrent (line 47) | static getCurrent(): Widget {
method self (line 58) | static get self(): Widget {
method constructor (line 90) | private constructor(widget: IWidget) {
method windowId (line 109) | get windowId(): number {
method frame (line 114) | get frame(): Frame {
method getDefaultConfig (line 124) | public getDefaultConfig(): ThirdPartyWidgetSettings {
method applyInvisiblePreset (line 132) | private applyInvisiblePreset(): Array<Promise<void>> {
method applyDesktopPreset (line 146) | private async applyDesktopPreset(): Promise<void> {
method applyOverlayPreset (line 151) | private async applyOverlayPreset(): Promise<void> {
method applyPopupPreset (line 156) | private async applyPopupPreset(): Promise<void> {
method persistPositionAndSize (line 209) | public async persistPositionAndSize(): Promise<void> {
method init (line 254) | public async init(options: InitWidgetOptions = {}): Promise<void> {
method ready (line 313) | public async ready(options: ReadyWidgetOptions = {}): Promise<void> {
method onTrigger (line 337) | public onTrigger(cb: (args: WidgetTriggerPayload) => void): void {
method setPosition (line 344) | public setPosition(rect: Rect): Promise<void> {
method show (line 360) | public async show(): Promise<void> {
method focus (line 366) | public async focus(): Promise<void> {
method hide (line 376) | public hide(closeAfterInactivity?: boolean): void {
type ExtendedGlobalThis (line 388) | type ExtendedGlobalThis = typeof globalThis & {
function getDecodedWebviewLabel (line 400) | function getDecodedWebviewLabel(): [WidgetId, string | undefined] {
function getDefinitionDefaultValues (line 410) | function getDefinitionDefaultValues(definition: WidgetConfigDefinition):...
FILE: libs/core/src/state/widget/performance.ts
function disableAnimationsOnPerformanceMode (line 4) | async function disableAnimationsOnPerformanceMode(): Promise<void> {
function setDisableAnimations (line 12) | function setDisableAnimations(mode: PerformanceMode): void {
FILE: libs/core/src/state/widget/positioning.ts
type args (line 6) | interface args {
function initMonitorsState (line 16) | async function initMonitorsState(): Promise<void> {
function monitorFromPoint (line 23) | function monitorFromPoint(x: number, y: number): PhysicalMonitor | undef...
function primaryMonitor (line 29) | function primaryMonitor(): PhysicalMonitor | undefined {
function adjustPositionByPlacement (line 33) | function adjustPositionByPlacement({
function fitIntoMonitor (line 59) | function fitIntoMonitor({ x, y, width, height }: Frame): Frame {
FILE: libs/core/src/state/widget/sizing.ts
class WidgetAutoSizer (line 5) | class WidgetAutoSizer {
method constructor (line 11) | constructor(
method setup (line 19) | private setup(): () => void {
method execute (line 33) | async execute(): Promise<void> {
FILE: libs/core/src/state/wm_layout.rs
type WmRenderTree (line 7) | pub struct WmRenderTree(pub HashMap<MonitorId, WindowManagerLayout>);
type WmNode (line 11) | pub struct WmNode {
method len (line 40) | pub fn len(&self) -> usize {
method capacity (line 49) | pub fn capacity(&self) -> usize {
method is_full (line 63) | pub fn is_full(&self) -> bool {
method is_empty (line 73) | pub fn is_empty(&self) -> bool {
method default (line 79) | fn default() -> Self {
type WmNodeKind (line 96) | pub enum WmNodeKind {
type WmNodeLifetime (line 109) | pub enum WmNodeLifetime {
type WindowManagerLayout (line 118) | pub struct WindowManagerLayout {
method default (line 125) | fn default() -> Self {
FILE: libs/core/src/state/workspaces/mod.rs
type VirtualDesktops (line 10) | pub struct VirtualDesktops {
method sanitize (line 18) | pub fn sanitize(&mut self) {
type VirtualDesktopMonitor (line 32) | pub struct VirtualDesktopMonitor {
method create (line 38) | pub fn create() -> Self {
method sanitize (line 47) | pub fn sanitize(&mut self) {
method active_workspace_id (line 63) | pub fn active_workspace_id(&self) -> &WorkspaceId {
method active_workspace (line 67) | pub fn active_workspace(&self) -> &DesktopWorkspace {
method active_workspace_mut (line 74) | pub fn active_workspace_mut(&mut self) -> &mut DesktopWorkspace {
method set_active_workspace (line 82) | pub fn set_active_workspace(&mut self, workspace_id: &WorkspaceId) -> ...
method add_workspace (line 92) | pub fn add_workspace(&mut self) -> WorkspaceId {
method remove_workspace (line 103) | pub fn remove_workspace(&mut self, workspace_id: &WorkspaceId) -> Resu...
method rename_workspace (line 137) | pub fn rename_workspace(
type DesktopWorkspace (line 153) | pub struct DesktopWorkspace {
method create (line 164) | pub fn create() -> Self {
type WorkspaceId (line 176) | pub struct WorkspaceId(pub String);
FILE: libs/core/src/system_state/bluetooth/build_low_energy_enums.rs
type AppearanceDefinition (line 4) | struct AppearanceDefinition {
type AppearanceCategoryDefinition (line 9) | struct AppearanceCategoryDefinition {
type AppearanceSubcategoryDefinition (line 17) | struct AppearanceSubcategoryDefinition {
function build_low_energy_enums (line 23) | fn build_low_energy_enums() -> crate::error::Result<()> {
FILE: libs/core/src/system_state/bluetooth/enums.rs
type BluetoothMajorServiceClass (line 4) | pub enum BluetoothMajorServiceClass {
type BluetoothMajorClass (line 32) | pub enum BluetoothMajorClass {
type BluetoothMinorClass (line 59) | pub enum BluetoothMinorClass {
type BluetoothComputerMinor (line 78) | pub enum BluetoothComputerMinor {
type BluetoothPhoneMinor (line 102) | pub enum BluetoothPhoneMinor {
type BluetoothNetworkMinor (line 122) | pub enum BluetoothNetworkMinor {
type BluetoothNetworkSubMinor (line 139) | pub enum BluetoothNetworkSubMinor {
type BluetoothAudioVideoMinor (line 150) | pub enum BluetoothAudioVideoMinor {
type BluetoothPeripheralMinor (line 182) | pub enum BluetoothPeripheralMinor {
type BluetoothPeripheralSubMinor (line 196) | pub enum BluetoothPeripheralSubMinor {
type BluetoothImagingMinor (line 217) | pub enum BluetoothImagingMinor {
type BluetoothImagingSubMinor (line 229) | pub enum BluetoothImagingSubMinor {
type BluetoothWearableMinor (line 240) | pub enum BluetoothWearableMinor {
type BluetoothToyMinor (line 257) | pub enum BluetoothToyMinor {
type BluetoothHealthMinor (line 273) | pub enum BluetoothHealthMinor {
FILE: libs/core/src/system_state/bluetooth/low_energy_enums.rs
type BLEAppearanceUnknownSubCategory (line 9) | pub enum BLEAppearanceUnknownSubCategory {
type BLEAppearancePhoneSubCategory (line 19) | pub enum BLEAppearancePhoneSubCategory {
type BLEAppearanceComputerSubCategory (line 29) | pub enum BLEAppearanceComputerSubCategory {
type BLEAppearanceWatchSubCategory (line 54) | pub enum BLEAppearanceWatchSubCategory {
type BLEAppearanceClockSubCategory (line 66) | pub enum BLEAppearanceClockSubCategory {
type BLEAppearanceDisplaySubCategory (line 76) | pub enum BLEAppearanceDisplaySubCategory {
type BLEAppearanceRemoteControlSubCategory (line 86) | pub enum BLEAppearanceRemoteControlSubCategory {
type BLEAppearanceEyeglassesSubCategory (line 96) | pub enum BLEAppearanceEyeglassesSubCategory {
type BLEAppearanceTagSubCategory (line 106) | pub enum BLEAppearanceTagSubCategory {
type BLEAppearanceKeyringSubCategory (line 116) | pub enum BLEAppearanceKeyringSubCategory {
type BLEAppearanceMediaPlayerSubCategory (line 126) | pub enum BLEAppearanceMediaPlayerSubCategory {
type BLEAppearanceBarcodeScannerSubCategory (line 136) | pub enum BLEAppearanceBarcodeScannerSubCategory {
type BLEAppearanceThermometerSubCategory (line 146) | pub enum BLEAppearanceThermometerSubCategory {
type BLEAppearanceHeartRateSensorSubCategory (line 157) | pub enum BLEAppearanceHeartRateSensorSubCategory {
type BLEAppearanceBloodPressureSubCategory (line 168) | pub enum BLEAppearanceBloodPressureSubCategory {
type BLEAppearanceHumanInterfaceDeviceSubCategory (line 180) | pub enum BLEAppearanceHumanInterfaceDeviceSubCategory {
type BLEAppearanceGlucoseMeterSubCategory (line 200) | pub enum BLEAppearanceGlucoseMeterSubCategory {
type BLEAppearanceRunningWalkingSensorSubCategory (line 210) | pub enum BLEAppearanceRunningWalkingSensorSubCategory {
type BLEAppearanceCyclingSubCategory (line 223) | pub enum BLEAppearanceCyclingSubCategory {
type BLEAppearanceControlDeviceSubCategory (line 238) | pub enum BLEAppearanceControlDeviceSubCategory {
type BLEAppearanceNetworkDeviceSubCategory (line 261) | pub enum BLEAppearanceNetworkDeviceSubCategory {
type BLEAppearanceSensorSubCategory (line 274) | pub enum BLEAppearanceSensorSubCategory {
type BLEAppearanceLightFixturesSubCategory (line 309) | pub enum BLEAppearanceLightFixturesSubCategory {
type BLEAppearanceFanSubCategory (line 344) | pub enum BLEAppearanceFanSubCategory {
type BLEAppearanceHVACSubCategory (line 360) | pub enum BLEAppearanceHVACSubCategory {
type BLEAppearanceAirConditioningSubCategory (line 381) | pub enum BLEAppearanceAirConditioningSubCategory {
type BLEAppearanceHumidifierSubCategory (line 391) | pub enum BLEAppearanceHumidifierSubCategory {
type BLEAppearanceHeatingSubCategory (line 401) | pub enum BLEAppearanceHeatingSubCategory {
type BLEAppearanceAccessControlSubCategory (line 418) | pub enum BLEAppearanceAccessControlSubCategory {
type BLEAppearanceMotorizedDeviceSubCategory (line 437) | pub enum BLEAppearanceMotorizedDeviceSubCategory {
type BLEAppearancePowerDeviceSubCategory (line 452) | pub enum BLEAppearancePowerDeviceSubCategory {
type BLEAppearanceLightSourceSubCategory (line 471) | pub enum BLEAppearanceLightSourceSubCategory {
type BLEAppearanceWindowCoveringSubCategory (line 489) | pub enum BLEAppearanceWindowCoveringSubCategory {
type BLEAppearanceAudioSinkSubCategory (line 505) | pub enum BLEAppearanceAudioSinkSubCategory {
type BLEAppearanceAudioSourceSubCategory (line 520) | pub enum BLEAppearanceAudioSourceSubCategory {
type BLEAppearanceMotorizedVehicleSubCategory (line 539) | pub enum BLEAppearanceMotorizedVehicleSubCategory {
type BLEAppearanceDomesticApplianceSubCategory (line 564) | pub enum BLEAppearanceDomesticApplianceSubCategory {
type BLEAppearanceWearableAudioDeviceSubCategory (line 589) | pub enum BLEAppearanceWearableAudioDeviceSubCategory {
type BLEAppearanceAircraftSubCategory (line 603) | pub enum BLEAppearanceAircraftSubCategory {
type BLEAppearanceAVEquipmentSubCategory (line 617) | pub enum BLEAppearanceAVEquipmentSubCategory {
type BLEAppearanceDisplayEquipmentSubCategory (line 637) | pub enum BLEAppearanceDisplayEquipmentSubCategory {
type BLEAppearanceHearingaidSubCategory (line 650) | pub enum BLEAppearanceHearingaidSubCategory {
type BLEAppearanceGamingSubCategory (line 663) | pub enum BLEAppearanceGamingSubCategory {
type BLEAppearanceSignageSubCategory (line 675) | pub enum BLEAppearanceSignageSubCategory {
type BLEAppearancePulseOximeterSubCategory (line 687) | pub enum BLEAppearancePulseOximeterSubCategory {
type BLEAppearanceWeightScaleSubCategory (line 699) | pub enum BLEAppearanceWeightScaleSubCategory {
type BLEAppearancePersonalMobilityDeviceSubCategory (line 709) | pub enum BLEAppearancePersonalMobilityDeviceSubCategory {
type BLEAppearanceContinuousGlucoseMonitorSubCategory (line 721) | pub enum BLEAppearanceContinuousGlucoseMonitorSubCategory {
type BLEAppearanceInsulinPumpSubCategory (line 731) | pub enum BLEAppearanceInsulinPumpSubCategory {
type BLEAppearanceMedicationDeliverySubCategory (line 744) | pub enum BLEAppearanceMedicationDeliverySubCategory {
type BLEAppearanceSpirometerSubCategory (line 754) | pub enum BLEAppearanceSpirometerSubCategory {
type BLEAppearanceOutdoorSportsActivitySubCategory (line 765) | pub enum BLEAppearanceOutdoorSportsActivitySubCategory {
type BLEAppearanceIndustrialMeasurementDeviceSubCategory (line 779) | pub enum BLEAppearanceIndustrialMeasurementDeviceSubCategory {
type BLEAppearanceIndustrialToolsSubCategory (line 795) | pub enum BLEAppearanceIndustrialToolsSubCategory {
type BLEAppearanceCategory (line 813) | pub enum BLEAppearanceCategory {
type BLEAppearance (line 873) | pub enum BLEAppearance {
method from (line 931) | fn from(value: u16) -> Self {
FILE: libs/core/src/system_state/bluetooth/mod.rs
type BluetoothDevice (line 13) | pub struct BluetoothDevice {
method map_services_classes (line 30) | fn map_services_classes(class: u32) -> Vec<BluetoothMajorServiceClass> {
method get_parts_of_class (line 50) | pub fn get_parts_of_class(
type BluetoothDevicePairShowPinRequest (line 126) | pub struct BluetoothDevicePairShowPinRequest {
type DevicePairingNeededAction (line 134) | pub enum DevicePairingNeededAction {
type DevicePairingAnswer (line 154) | pub struct DevicePairingAnswer {
FILE: libs/core/src/system_state/bluetooth/mod.ts
class BluetoothDevices (line 6) | class BluetoothDevices extends List<BluetoothDevice> {
method getAsync (line 7) | static getAsync(): Promise<BluetoothDevices> {
method onChange (line 11) | static onChange(cb: (payload: BluetoothDevices) => void): Promise<UnSu...
method discover (line 15) | static async discover(): Promise<void> {
method stopDiscovery (line 19) | static async stopDiscovery(): Promise<void> {
method default (line 23) | static default(): BluetoothDevices {
FILE: libs/core/src/system_state/components.rs
type Disk (line 6) | pub struct Disk {
type NetworkStatistics (line 20) | pub struct NetworkStatistics {
type Memory (line 31) | pub struct Memory {
type Core (line 41) | pub struct Core {
FILE: libs/core/src/system_state/language.rs
type SystemLanguage (line 4) | pub struct SystemLanguage {
type KeyboardLayout (line 15) | pub struct KeyboardLayout {
type ImeStatus (line 27) | pub struct ImeStatus {
FILE: libs/core/src/system_state/language.ts
class LanguageList (line 6) | class LanguageList extends List<SystemLanguage> {
method getAsync (line 7) | static getAsync(): Promise<LanguageList> {
method onChange (line 11) | static onChange(cb: (payload: LanguageList) => void): Promise<UnSubscr...
FILE: libs/core/src/system_state/media.rs
type MediaPlayerOwner (line 5) | pub struct MediaPlayerOwner {
type MediaPlayerTimeline (line 11) | pub struct MediaPlayerTimeline {
type MediaPlayer (line 27) | pub struct MediaPlayer {
type MediaDeviceSession (line 40) | pub struct MediaDeviceSession {
type MediaDeviceType (line 54) | pub enum MediaDeviceType {
type MediaDevice (line 61) | pub struct MediaDevice {
FILE: libs/core/src/system_state/monitors.rs
type PhysicalMonitor (line 5) | pub struct PhysicalMonitor {
type Brightness (line 14) | pub struct Brightness {
type MonitorBrightness (line 22) | pub struct MonitorBrightness {
type MonitorId (line 31) | pub struct MonitorId(pub String);
method default (line 36) | fn default() -> Self {
FILE: libs/core/src/system_state/monitors.ts
class ConnectedMonitorList (line 6) | class ConnectedMonitorList extends List<PhysicalMonitor> {
method getAsync (line 7) | static getAsync(): Promise<ConnectedMonitorList> {
method onChange (line 11) | static onChange(
FILE: libs/core/src/system_state/network/mod.rs
type WlanProfile (line 6) | pub struct WlanProfile {
type WlanBssEntry (line 17) | pub struct WlanBssEntry {
type AdapterStatus (line 35) | pub enum AdapterStatus {
type NetworkAdapter (line 42) | pub struct NetworkAdapter {
FILE: libs/core/src/system_state/notification.rs
type AppNotification (line 9) | pub struct AppNotification {
type Toast (line 21) | pub struct Toast {
type ToastDuration (line 35) | pub enum ToastDuration {
type ToastHeader (line 47) | pub struct ToastHeader {
type ToastVisual (line 61) | pub struct ToastVisual {
method default (line 74) | fn default() -> Self {
type ToastBinding (line 87) | pub struct ToastBinding {
type ToastTemplateType (line 96) | pub enum ToastTemplateType {
type ToastBindingChild (line 113) | pub enum ToastBindingChild {
type ToastText (line 122) | pub struct ToastText {
type ToastImage (line 130) | pub struct ToastImage {
type ToastImageCropType (line 147) | pub enum ToastImageCropType {
type ToastImagePlacement (line 155) | pub enum ToastImagePlacement {
type ToastGroup (line 169) | pub struct ToastGroup {
type ToastSubGroup (line 178) | pub struct ToastSubGroup {
type ToastSubGroupChild (line 185) | pub enum ToastSubGroupChild {
type ToastProgress (line 191) | pub struct ToastProgress {
type ToastActions (line 207) | pub struct ToastActions {
type ToastActionsChild (line 214) | pub enum ToastActionsChild {
type ToastInput (line 223) | pub struct ToastInput {
type ToastInputType (line 243) | pub enum ToastInputType {
type ToastInputSelection (line 256) | pub struct ToastInputSelection {
type ToastAction (line 267) | pub struct ToastAction {
type ToastActionButtonStyle (line 293) | pub enum ToastActionButtonStyle {
type ToastActionAfterActivationBehavior (line 304) | pub enum ToastActionAfterActivationBehavior {
type ToastActionActivationType (line 316) | pub enum ToastActionActivationType {
type ToastActionPlacement (line 332) | pub enum ToastActionPlacement {
FILE: libs/core/src/system_state/power.rs
type PowerStatus (line 4) | pub struct PowerStatus {
type PowerMode (line 17) | pub enum PowerMode {
type Battery (line 30) | pub struct Battery {
FILE: libs/core/src/system_state/radios/mod.rs
type RadioDevice (line 4) | pub struct RadioDevice {
type RadioDeviceKind (line 14) | pub enum RadioDeviceKind {
FILE: libs/core/src/system_state/trash_bin.rs
type TrashBinInfo (line 7) | pub struct TrashBinInfo {
FILE: libs/core/src/system_state/tray.rs
type SysTrayIconId (line 10) | pub enum SysTrayIconId {
method fmt (line 16) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type Err (line 25) | type Err = crate::error::SeelenLibError;
method from_str (line 27) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type SysTrayIcon (line 47) | pub struct SysTrayIcon {
type SystrayIconAction (line 108) | pub enum SystrayIconAction {
FILE: libs/core/src/system_state/ui_colors.rs
type UIColors (line 4) | pub struct UIColors {
type Color (line 20) | pub struct Color {
method new (line 36) | pub fn new(r: u8, g: u8, b: u8, a: u8) -> Self {
method parse (line 40) | pub fn parse(format: ColorFormat) -> Self {
type ColorFormat (line 28) | pub enum ColorFormat {
FILE: libs/core/src/system_state/ui_colors.ts
class UIColors (line 6) | class UIColors {
method constructor (line 7) | constructor(public inner: IUIColors) {}
method getAsync (line 9) | static getAsync(): Promise<UIColors> {
method onChange (line 13) | static onChange(cb: (payload: UIColors) => void): Promise<UnSubscriber> {
method default (line 17) | static default(): UIColors {
method setAsCssVariables (line 32) | setAsCssVariables(): void {
type Color (line 61) | interface Color extends IColor {}
method constructor (line 64) | constructor(obj: IColor) {
method random (line 72) | static random(): Color {
method fromHex (line 81) | static fromHex(hex: string): Color {
method toHexString (line 106) | toHexString(): string {
method getRuntimeStyleSheet (line 116) | private getRuntimeStyleSheet(): HTMLStyleElement {
method insertIntoStyleSheet (line 128) | private insertIntoStyleSheet(obj: Record<string, string>): void {
method setAsCssVariable (line 152) | setAsCssVariable(name: string): void {
method calcLuminance (line 169) | calcLuminance(accuracy?: boolean): number {
method complementary (line 181) | complementary(): Color {
class Color (line 63) | class Color {
method constructor (line 64) | constructor(obj: IColor) {
method random (line 72) | static random(): Color {
method fromHex (line 81) | static fromHex(hex: string): Color {
method toHexString (line 106) | toHexString(): string {
method getRuntimeStyleSheet (line 116) | private getRuntimeStyleSheet(): HTMLStyleElement {
method insertIntoStyleSheet (line 128) | private insertIntoStyleSheet(obj: Record<string, string>): void {
method setAsCssVariable (line 152) | setAsCssVariable(name: string): void {
method calcLuminance (line 169) | calcLuminance(accuracy?: boolean): number {
method complementary (line 181) | complementary(): Color {
FILE: libs/core/src/system_state/user.rs
type FolderType (line 7) | pub enum FolderType {
method values (line 28) | pub fn values() -> &'static [FolderType] {
type FolderChangedArgs (line 36) | pub struct FolderChangedArgs {
type User (line 44) | pub struct User {
FILE: libs/core/src/system_state/user.ts
class UserDetails (line 5) | class UserDetails {
method constructor (line 6) | constructor(public user: User) {}
method getAsync (line 8) | static getAsync(): Promise<UserDetails> {
method onChange (line 12) | static onChange(cb: (payload: UserDetails) => void): Promise<UnSubscri...
FILE: libs/core/src/system_state/user_apps/mod.rs
type FocusedApp (line 7) | pub struct FocusedApp {
type UserAppWindow (line 24) | pub struct UserAppWindow {
type ProcessInformation (line 43) | pub struct ProcessInformation {
type UserAppWindowPreview (line 50) | pub struct UserAppWindowPreview {
type Relaunch (line 59) | pub struct Relaunch {
type RelaunchArguments (line 72) | pub enum RelaunchArguments {
method fmt (line 78) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: libs/core/src/system_state/win_explorer.rs
type StartMenuItem (line 5) | pub struct StartMenuItem {
type StartMenuLayout (line 18) | pub struct StartMenuLayout {
type StartMenuLayoutItem (line 24) | pub enum StartMenuLayoutItem {
type TrayIcon (line 33) | pub struct TrayIcon {
type RegistryNotifyIcon (line 40) | pub struct RegistryNotifyIcon {
FILE: libs/core/src/utils/DOM.ts
class RuntimeStyleSheet (line 1) | class RuntimeStyleSheet {
method constructor (line 6) | constructor(styleId: string) {
method addVariable (line 16) | addVariable(key: string, value: string): void {
method addStyle (line 20) | addStyle(style: string): void {
method clear (line 24) | clear(): void {
method applyToDocument (line 29) | applyToDocument(): void {
FILE: libs/core/src/utils/List.ts
method constructor (line 11) | constructor(protected inner: T[]) {
method [Symbol.iterator] (line 20) | public [Symbol.iterator](): Iterable<T> {
method length (line 24) | public get length(): number {
method asArray (line 32) | public asArray(): T[] {
method all (line 41) | public all(): T[] {
FILE: libs/core/src/utils/State.ts
type ConstructorWithSingleArg (line 14) | interface ConstructorWithSingleArg<T = any> {
function newFromInvoke (line 19) | async function newFromInvoke<
function newOnEvent (line 30) | function newOnEvent<
FILE: libs/core/src/utils/async.ts
type DebouncedFunction (line 2) | interface DebouncedFunction<T extends (...args: any[]) => any> {
function debounce (line 10) | function debounce<T extends (...args: any[]) => any>(
FILE: libs/core/src/utils/mod.rs
type TsUnknown (line 57) | pub struct TsUnknown(pub serde_json::Value);
method from (line 60) | fn from(value: T) -> Self {
function search_resource_entrypoint (line 67) | pub fn search_resource_entrypoint(folder: &Path) -> Option<PathBuf> {
FILE: libs/core/src/utils/mod.ts
class Rect (line 1) | class Rect {
FILE: libs/positioning/src/api/windows.rs
function get_window_rect (line 16) | pub fn get_window_rect(window_id: isize) -> Result<Rect> {
function start_defered_positioning (line 23) | pub fn start_defered_positioning(amount: i32) -> Result<HDWP> {
function move_window (line 29) | pub fn move_window(hwnd: isize, rect: &Rect, redraw: bool) -> Result<()> {
function position_window (line 43) | pub fn position_window(hwnd: isize, rect: &Rect, redraw: bool, no_size: ...
function defer_window_position (line 69) | pub fn defer_window_position(
function finish_defered_positioning (line 98) | pub fn finish_defered_positioning(hdwp: HDWP) -> Result<()> {
function force_redraw_window (line 103) | pub fn force_redraw_window(window_id: isize) -> Result<()> {
function get_class (line 118) | pub fn get_class(hwnd: isize) -> Result<String> {
function is_explorer (line 125) | pub fn is_explorer(hwnd: isize) -> Result<bool> {
FILE: libs/positioning/src/easings.rs
type Easing (line 5) | pub enum Easing {
method from_name (line 89) | pub fn from_name(name: &str) -> Option<Easing> {
method ease_in_expo (line 131) | fn ease_in_expo(x: f64) -> f64 {
method ease_out_expo (line 140) | fn ease_out_expo(x: f64) -> f64 {
method ease_in_out_expo (line 149) | fn ease_in_out_expo(x: f64) -> f64 {
method ease_in_circ (line 162) | fn ease_in_circ(x: f64) -> f64 {
method ease_out_circ (line 167) | fn ease_out_circ(x: f64) -> f64 {
method ease_in_out_circ (line 172) | fn ease_in_out_circ(x: f64) -> f64 {
method ease_in_back (line 181) | fn ease_in_back(x: f64) -> f64 {
method ease_out_back (line 188) | fn ease_out_back(x: f64) -> f64 {
method ease_in_out_back (line 195) | fn ease_in_out_back(x: f64) -> f64 {
method ease_in_elastic (line 206) | fn ease_in_elastic(x: f64) -> f64 {
method ease_out_elastic (line 219) | fn ease_out_elastic(x: f64) -> f64 {
method ease_in_out_elastic (line 232) | fn ease_in_out_elastic(x: f64) -> f64 {
method ease_in_bounce (line 247) | fn ease_in_bounce(x: f64) -> f64 {
method ease_out_bounce (line 252) | fn ease_out_bounce(x: f64) -> f64 {
method ease_in_out_bounce (line 271) | fn ease_in_out_bounce(x: f64) -> f64 {
method y (line 50) | fn y(&self, x: f64) -> f64 {
FILE: libs/positioning/src/error.rs
type Error (line 2) | pub enum Error {
type Result (line 13) | pub type Result<T> = core::result::Result<T, Error>;
FILE: libs/positioning/src/lib.rs
type PositionerBuilder (line 18) | pub struct PositionerBuilder {
method new (line 32) | pub fn new() -> Self {
method add (line 36) | pub fn add(&mut self, window_id: isize, rect: Rect) {
method remove (line 40) | pub fn remove(&mut self, window_id: isize) {
method clear (line 44) | pub fn clear(&mut self) {
method place (line 49) | pub fn place(&self) -> Result<()> {
method build (line 57) | pub fn build(self) -> HashMap<isize, Rect> {
type WinDataForAnimation (line 23) | struct WinDataForAnimation {
type WindowAnimation (line 63) | pub struct WindowAnimation {
method new (line 70) | fn new() -> Self {
method start (line 79) | fn start<F>(
method perform (line 131) | fn perform(
method is_running (line 174) | pub fn is_running(&self) -> bool {
method interrupt (line 178) | fn interrupt(&mut self) {
method wait (line 184) | fn wait(&mut self) {
method drop (line 192) | fn drop(&mut self) {
type AnimationOrchestrator (line 199) | pub struct AnimationOrchestrator {
method new (line 204) | pub fn new() -> Self {
method animate_batch (line 213) | pub fn animate_batch<F>(
method animate_window (line 230) | fn animate_window<F>(
method default (line 252) | fn default() -> Self {
FILE: libs/positioning/src/rect.rs
type Rect (line 4) | pub struct Rect {
method from (line 32) | fn from(rect: windows::Win32::Foundation::RECT) -> Self {
method ease (line 12) | fn ease(from: Self, to: Self, time: impl keyframe::num_traits::Float) ->...
function from (line 43) | fn from(rect: Rect) -> Self {
FILE: libs/slu-ipc/src/app.rs
type AppIpc (line 18) | pub struct AppIpc {
method path_with_session (line 31) | pub fn path_with_session(session_id: u32) -> String {
method start (line 35) | pub fn start<F>(cb: F) -> Result<()>
method process_connection (line 66) | async fn process_connection<F>(stream: &AsyncDuplexPipeStream<Bytes>, ...
method response_to_client (line 81) | async fn response_to_client(
method send (line 89) | pub async fn send(message: AppMessage) -> Result<()> {
method send_sync (line 97) | pub fn send_sync(message: &AppMessage) -> Result<()> {
method path (line 23) | fn path() -> String {
function current_session_id (line 106) | pub fn current_session_id() -> Result<u32> {
function current_interactive_session_id (line 114) | pub fn current_interactive_session_id() -> Option<u32> {
FILE: libs/slu-ipc/src/common.rs
constant END_OF_TRANSMISSION_BLOCK (line 20) | pub const END_OF_TRANSMISSION_BLOCK: u8 = 0x17;
constant IPC_TIMEOUT (line 23) | pub const IPC_TIMEOUT: Duration = Duration::from_secs(3);
constant MAX_RETRIES (line 26) | pub const MAX_RETRIES: u32 = 3;
type IPC (line 29) | pub trait IPC {
method path (line 30) | fn path() -> String;
method server_process_id (line 33) | async fn server_process_id() -> Result<u32> {
method test_connection (line 40) | fn test_connection() -> Result<()> {
method can_stablish_connection (line 46) | fn can_stablish_connection() -> bool {
function create_security_descriptor (line 52) | pub fn create_security_descriptor() -> Result<SecurityDescriptor> {
function read_from_ipc_stream (line 60) | pub async fn read_from_ipc_stream(stream: &AsyncDuplexPipeStream<Bytes>)...
function write_to_ipc_stream (line 75) | pub async fn write_to_ipc_stream(stream: &AsyncDuplexPipeStream<Bytes>, ...
function send_to_ipc_stream (line 91) | pub async fn send_to_ipc_stream(
function send_to_ipc_stream_blocking (line 101) | pub fn send_to_ipc_stream_blocking(
function send_with_retry (line 119) | pub async fn send_with_retry<F, Fut>(send_fn: F) -> Result<()>
FILE: libs/slu-ipc/src/error.rs
type Error (line 4) | pub enum Error {
type Result (line 17) | pub type Result<T = ()> = core::result::Result<T, Error>;
FILE: libs/slu-ipc/src/messages.rs
type IpcResponse (line 9) | pub enum IpcResponse {
method ok (line 15) | pub fn ok(self) -> Result<()> {
method from_bytes (line 22) | pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
method to_bytes (line 26) | pub fn to_bytes(&self) -> Result<Vec<u8>> {
type AppMessage (line 35) | pub enum AppMessage {
method from_bytes (line 45) | pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
method to_bytes (line 49) | pub fn to_bytes(&self) -> Result<Vec<u8>> {
type SvcAction (line 59) | pub enum SvcAction {
type SvcMessage (line 88) | pub struct SvcMessage {
method signature (line 94) | pub fn signature() -> &'static str {
method is_signature_valid (line 98) | pub fn is_signature_valid(&self) -> bool {
method from_bytes (line 102) | pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
method to_bytes (line 106) | pub fn to_bytes(&self) -> Result<Vec<u8>> {
type LauncherMessage (line 114) | pub enum LauncherMessage {
method from_bytes (line 120) | pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
method to_bytes (line 124) | pub fn to_bytes(&self) -> Result<Vec<u8>> {
type IconEventData (line 133) | pub struct IconEventData {
type Win32TrayEvent (line 147) | pub enum Win32TrayEvent {
FILE: libs/slu-ipc/src/service.rs
type ServiceIpc (line 17) | pub struct ServiceIpc {
method path_with_session (line 30) | pub fn path_with_session(session_id: u32) -> String {
method start (line 36) | pub fn start<R, F>(cb: F) -> Result<()>
method process_connection (line 68) | async fn process_connection<F, R>(
method response_to_client (line 96) | async fn response_to_client(
method send (line 103) | pub async fn send(message: SvcAction) -> Result<()> {
method try_send (line 113) | async fn try_send(data: &[u8]) -> Result<IpcResponse> {
method path (line 22) | fn path() -> String {
FILE: libs/ui/icons.ts
type IconName (line 2) | type IconName =
FILE: libs/ui/react/components/BackgroundByLayers/infra.tsx
type PropsV2 (line 6) | interface PropsV2 extends HTMLAttributes<HTMLDivElement> {
function BackgroundByLayersV2 (line 12) | function BackgroundByLayersV2({ children, className, prefix, ...divProps...
FILE: libs/ui/react/components/Icon/FileIcon.tsx
type FileIconProps (line 12) | interface FileIconProps extends SeelenCommandGetIconArgs, Omit<ImgHTMLAt...
function FileIcon (line 17) | function FileIcon({ path, umid, noFallback, ...imgProps }: FileIconProps) {
FILE: libs/ui/react/components/Icon/MissingIcon.tsx
type MissingIconProps (line 8) | interface MissingIconProps extends Omit<ImgHTMLAttributes<HTMLImageEleme...
function MissingIcon (line 10) | function MissingIcon({ ref: _ref, ...props }: MissingIconProps) {
FILE: libs/ui/react/components/Icon/SpecificIcon.tsx
type SpecificIconProps (line 8) | interface SpecificIconProps extends Omit<ImgHTMLAttributes<HTMLImageElem...
function SpecificIcon (line 12) | function SpecificIcon({ name, ref: _ref, ...imgProps }: SpecificIconProp...
FILE: libs/ui/react/components/Icon/index.tsx
type ReactIconProps (line 8) | interface ReactIconProps extends HTMLAttributes<HTMLElement> {
FILE: libs/ui/react/components/InlineSvg/index.tsx
type Props (line 6) | interface Props extends HTMLAttributes<HTMLElement> {
FILE: libs/ui/react/components/ResourceText/index.tsx
type Props (line 12) | interface Props {
function ResourceText (line 17) | function ResourceText({ text, className }: Props) {
type MarkdownViewerProps (line 36) | interface MarkdownViewerProps {
function ResourceTextAsMarkdown (line 40) | function ResourceTextAsMarkdown({ text }: MarkdownViewerProps) {
function safeMarkdownToHtml (line 77) | async function safeMarkdownToHtml(markdown: string): Promise<string> {
FILE: libs/ui/react/components/Wallpaper/components/ImageWallpaper.tsx
function ImageWallpaper (line 9) | function ImageWallpaper({ definition, config, onLoad }: DefinedWallProps) {
FILE: libs/ui/react/components/Wallpaper/components/ThemedWallpaper.tsx
function ThemedWallpaper (line 9) | function ThemedWallpaper({
FILE: libs/ui/react/components/Wallpaper/components/VideoWallpaper.tsx
constant MAX_RETRIES (line 9) | const MAX_RETRIES = 3;
constant WAITING_TIMEOUT_MS (line 10) | const WAITING_TIMEOUT_MS = 3000;
constant STALL_CHECK_INTERVAL_MS (line 11) | const STALL_CHECK_INTERVAL_MS = 5000;
function VideoWallpaper (line 13) | function VideoWallpaper({ definition, config, muted, paused, onLoad }: D...
FILE: libs/ui/react/components/Wallpaper/index.tsx
function Wallpaper (line 15) | function Wallpaper(props: BaseProps) {
FILE: libs/ui/react/components/Wallpaper/types.ts
type BaseProps (line 3) | interface BaseProps {
type DefinedWallProps (line 16) | interface DefinedWallProps extends BaseProps {
FILE: libs/ui/react/components/Wallpaper/utils.ts
function getPlaybackRate (line 4) | function getPlaybackRate(speed: PlaybackSpeed): number {
function getWallpaperStyles (line 27) | function getWallpaperStyles(config: WallpaperInstanceSettings) {
FILE: libs/ui/react/utils/DndKit/utils.ts
type DndContainer (line 1) | interface DndContainer<T> {
function getContainerIdx (line 6) | function getContainerIdx<T>(
function genericHandleDragOver (line 13) | function genericHandleDragOver<T extends string>(
FILE: libs/ui/react/utils/LazySignal.ts
class LazySignal (line 6) | class LazySignal<T> extends Signal<T> {
method constructor (line 10) | constructor(private initializer: () => Promise<T>) {
method value (line 15) | get value(): T {
method value (line 22) | set value(value: T) {
method init (line 31) | public init(): Promise<Signal<T>> {
method setByPayload (line 46) | public setByPayload({ payload }: { payload: T }) {
function lazySignal (line 62) | function lazySignal<T>(initial: () => Promise<T>): LazySignal<T> {
FILE: libs/ui/react/utils/hooks.ts
function useWindowFocusChange (line 12) | function useWindowFocusChange(cb: (focused: boolean) => void) {
function useInterval (line 24) | function useInterval(cb: () => void, ms: number, deps: any[] = []) {
function useTimeout (line 38) | function useTimeout(cb: () => void, ms: number, deps: any[] = []) {
function useSyncClockInterval (line 52) | function useSyncClockInterval(
function useDeepCompareEffect (line 88) | function useDeepCompareEffect(
function useDebounce (line 99) | function useDebounce<F extends (...args: any[]) => void>(
function useThrottle (line 119) | function useThrottle<F extends (...args: any[]) => void>(
FILE: libs/ui/react/utils/index.ts
function getRootContainer (line 3) | function getRootContainer(): HTMLElement {
function toPhysicalPixels (line 11) | function toPhysicalPixels(size: number): number {
function getResourceText (line 15) | function getResourceText(text: ResourceText, locale: string): string {
constant EPOCH_DIFF_MILLISECONDS (line 23) | const EPOCH_DIFF_MILLISECONDS = 11644473600000n;
function WindowsDateFileTimeToDate (line 26) | function WindowsDateFileTimeToDate(fileTime: bigint | number) {
FILE: libs/ui/react/utils/layered.ts
class LayeredHitbox (line 4) | class LayeredHitbox {
method isIgnoringCursorEvents (line 9) | get isIgnoringCursorEvents(): boolean {
method isIgnoringCursorEvents (line 13) | set isIgnoringCursorEvents(value: boolean) {
function declareDocumentAsLayeredHitbox (line 21) | async function declareDocumentAsLayeredHitbox(
FILE: libs/ui/react/utils/styling.ts
type Args (line 3) | type Args = undefined | string | { [x: string]: any };
function isDarkModeEnabled (line 27) | function isDarkModeEnabled() {
function useDarkMode (line 31) | function useDarkMode() {
FILE: libs/ui/svelte/components/Icon/InlineSVGState.svelte.ts
function fetchSVG (line 3) | async function fetchSVG(src: string) {
FILE: libs/ui/svelte/components/Icon/common.svelte.ts
type IconState (line 15) | interface IconState {
FILE: libs/ui/svelte/components/Wallpaper/types.ts
type BaseProps (line 3) | interface BaseProps {
type DefinedWallProps (line 16) | interface DefinedWallProps extends BaseProps {
FILE: libs/ui/svelte/components/Wallpaper/utils.ts
function getPlaybackRate (line 6) | function getPlaybackRate(speed: PlaybackSpeed): number {
function getWallpaperStyles (line 29) | function getWallpaperStyles(config: WallpaperInstanceSettings): string {
FILE: libs/ui/svelte/utils/LazyRune.svelte.ts
class LazyRune (line 31) | class LazyRune<T> {
method constructor (line 35) | constructor(private initializer: () => Promise<T> | T) {
method value (line 43) | get value(): T {
method value (line 54) | set value(value: T) {
method init (line 69) | public async init(): Promise<void> {
method setByPayload (line 88) | public setByPayload({ payload }: { payload: T }): void {
method isInitialized (line 96) | public isInitialized(): boolean {
function lazyRune (line 121) | function lazyRune<T>(initial: () => Promise<T> | T): LazyRune<T> {
FILE: libs/ui/svelte/utils/PersistentRune.svelte.ts
class PersistentRune (line 5) | class PersistentRune<T> {
method constructor (line 11) | private constructor(storeKey: string, initial: T, schema?: ZodSchema<T...
method create (line 18) | static async create<T>(
method loadFromFile (line 29) | private async loadFromFile(): Promise<T | null> {
method saveToFile (line 47) | private async saveToFile(value: T): Promise<void> {
method value (line 58) | get value(): T {
method value (line 62) | set value(value: T) {
function persistentRune (line 81) | function persistentRune<T>(
FILE: libs/ui/svelte/utils/hooks.svelte.ts
type Transition (line 1) | interface Transition {
function useTransition (line 8) | function useTransition(): Transition {
FILE: libs/ui/svelte/utils/i18n.ts
function translate (line 6) | function translate(locale: string, key: string, vars: Record<string, str...
function setMessages (line 48) | function setMessages(newMessages: Record<string, any>) {
FILE: libs/ui/svelte/utils/index.ts
constant EPOCH_DIFF_MILLISECONDS (line 6) | const EPOCH_DIFF_MILLISECONDS = 11644473600000n;
function WindowsDateFileTimeToDate (line 9) | function WindowsDateFileTimeToDate(fileTime: bigint | number): Date {
function relativeTimeFromNow (line 15) | function relativeTimeFromNow(date: Date): string {
FILE: libs/ui/utils.ts
function nanosecondsToPlayingTime (line 1) | function nanosecondsToPlayingTime(nanoseconds: number): string {
function brightnessIcon (line 13) | function brightnessIcon(brightness: number) {
function outputVolumeIcon (line 20) | function outputVolumeIcon(muted: boolean, volume: number) {
function crashPageByMemory (line 36) | function crashPageByMemory() {
function freezePageByLoop (line 46) | function freezePageByLoop() {
FILE: libs/utils/src/checksums.rs
type Diff (line 9) | pub enum Diff {
function calculate_sha256 (line 16) | pub fn calculate_sha256(data: &[u8]) -> String {
type CheckSums (line 22) | pub struct CheckSums(HashMap<PathBuf, String>);
method new (line 25) | pub fn new() -> Self {
method raw_add (line 33) | pub fn raw_add<P: AsRef<Path>>(&mut self, content: &[u8], path: P) {
method add (line 40) | pub fn add<P: AsRef<Path>>(&mut self, path: P) -> Result<(), String> {
method parse (line 50) | pub fn parse(content: &[u8]) -> Result<Self, String> {
method write (line 90) | pub fn write<P: AsRef<Path>>(&self, path: P) -> Result<(), String> {
method to_plain_text (line 97) | pub fn to_plain_text(&self) -> String {
method compare (line 110) | pub fn compare(&self, other: &Self) -> Vec<(Diff, PathBuf)> {
method get (line 132) | pub fn get<P: AsRef<Path>>(&self, path: P) -> Option<&String> {
method contains (line 136) | pub fn contains<P: AsRef<Path>>(&self, path: P) -> bool {
method len (line 140) | pub fn len(&self) -> usize {
method is_empty (line 144) | pub fn is_empty(&self) -> bool {
function test_calculate_sha256 (line 154) | fn test_calculate_sha256() {
function test_checksums_parse (line 162) | fn test_checksums_parse() {
function test_checksums_compare (line 170) | fn test_checksums_compare() {
FILE: libs/utils/src/debounce.rs
function debounce (line 5) | pub fn debounce<F, T>(closure: F, delay: Duration) -> Debounce<T>
type DebounceConfig (line 74) | struct DebounceConfig<T> {
method drop (line 81) | fn drop(&mut self) {
type Debounce (line 87) | pub struct Debounce<T> {
function call (line 94) | pub fn call(&self, param: T) {
function terminate (line 103) | pub fn terminate(&self) {
method drop (line 114) | fn drop(&mut self) {
function it_works (line 126) | fn it_works() {
function debounce_resets_on_new_calls (line 169) | fn debounce_resets_on_new_calls() {
FILE: libs/utils/src/signature.rs
function sign_minisign (line 7) | pub fn sign_minisign(
function verify_minisign (line 34) | pub fn verify_minisign(
FILE: libs/utils/src/throttle.rs
function throttle (line 5) | pub fn throttle<F, T>(closure: F, delay: Duration) -> Throttle<T>
type ThrottleConfig (line 67) | struct ThrottleConfig<T> {
method drop (line 74) | fn drop(&mut self) {
type Throttle (line 80) | pub struct Throttle<T> {
function call (line 87) | pub fn call(&self, param: T) {
function terminate (line 96) | pub fn terminate(&self) {
method drop (line 107) | fn drop(&mut self) {
function it_works (line 119) | fn it_works() {
FILE: scripts/PalletteGenerator.ts
function oklchToP3 (line 3) | function oklchToP3(L: number, C: number, H: number) {
function inP3 (line 30) | function inP3(r: number, g: number, b: number) {
function maxChromaP3 (line 35) | function maxChromaP3(L: number, H: number) {
function oklchToSRGB (line 50) | function oklchToSRGB(L: number, C: number, H: number) {
function inSRGB (line 73) | function inSRGB(r: number, g: number, b: number) {
function _maxChromaSRGB (line 77) | function _maxChromaSRGB(L: number, H: number) {
constant LIGHT_STEPS (line 96) | const LIGHT_STEPS = {
constant DARK_STEPS (line 109) | const DARK_STEPS = {
constant COLOR_LIST (line 122) | const COLOR_LIST = {
function generateScale (line 136) | function generateScale(name: string, hue: number, steps: Record<number, ...
function generateScheme (line 152) | function generateScheme(scheme: "light" | "dark" | "none", steps: Record...
function truncate (line 175) | function truncate(num: number, decimals: number): number {
FILE: scripts/build.ts
function main (line 24) | async function main() {
FILE: scripts/build/builders/react.ts
function createReactBuildConfig (line 13) | function createReactBuildConfig(
function buildReact (line 55) | async function buildReact(
FILE: scripts/build/builders/svelte.ts
function createSvelteBuildConfig (line 15) | function createSvelteBuildConfig(
function buildSvelte (line 57) | async function buildSvelte(
FILE: scripts/build/builders/vanilla.ts
function createVanillaBuildConfig (line 11) | function createVanillaBuildConfig(
function buildVanilla (line 42) | async function buildVanilla(
FILE: scripts/build/config.ts
function parseArgs (line 8) | async function parseArgs(): Promise<BuildArgs> {
constant DEV_SERVER_PORT (line 27) | const DEV_SERVER_PORT = 3579;
constant DIST_DIR (line 28) | const DIST_DIR = "./dist";
constant ICONS_DIR (line 29) | const ICONS_DIR = "./dist/icons";
constant UI_DIR (line 30) | const UI_DIR = "src/ui";
constant SHARED_DIR (line 31) | const SHARED_DIR = "shared";
constant NODE_MODULES_DIR (line 32) | const NODE_MODULES_DIR = "./node_modules";
FILE: scripts/build/plugins/index.ts
function createCopyPublicPlugin (line 12) | function createCopyPublicPlugin(appFolders: string[]): esbuild.Plugin {
function createLoggerPlugin (line 52) | function createLoggerPlugin(
FILE: scripts/build/server.ts
function startDevServer (line 10) | function startDevServer(): void {
FILE: scripts/build/steps/cleanup.ts
function cleanDist (line 11) | function cleanDist(): void {
FILE: scripts/build/steps/discover.ts
constant FRAMEWORK_FOLDERS (line 12) | const FRAMEWORK_FOLDERS = ["react", "svelte", "vanilla"] as const;
function discoverAppFolders (line 17) | function discoverAppFolders(frameworkFolder: string): string[] {
function discoverEntryPoints (line 37) | function discoverEntryPoints(): EntryPointInfo[] {
function groupEntryPointsByFramework (line 79) | function groupEntryPointsByFramework(
FILE: scripts/build/steps/icons.ts
function extractIcons (line 14) | async function extractIcons(): Promise<void> {
FILE: scripts/build/types.ts
type BuildArgs (line 3) | interface BuildArgs {
type BuildContext (line 8) | interface BuildContext {
type FrameworkType (line 15) | type FrameworkType = "react" | "svelte" | "vanilla";
type EntryPointInfo (line 17) | interface EntryPointInfo {
FILE: scripts/bundle.msix.ts
function getArgs (line 10) | async function getArgs() {
FILE: scripts/translate/mod.ts
function deepSortObject (line 10) | function deepSortObject<T>(obj: T): T {
function completeTranslationsFor (line 26) | async function completeTranslationsFor(localesDir: string) {
FILE: scripts/versionish.ts
function updateCargoVersion (line 7) | function updateCargoVersion(filePath: string, version: string): void {
function updateJsonVersion (line 13) | function updateJsonVersion(filePath: string, version: string): void {
function updateChangelog (line 19) | function updateChangelog(version: string, forceUpdate = false): void {
function replaceChangelogVersion (line 31) | function replaceChangelogVersion(oldVersion: string, newVersion: string)...
function createGitCommit (line 38) | function createGitCommit(message: string): void {
function createGitTag (line 44) | function createGitTag(tag: string): void {
function updateAllVersions (line 49) | function updateAllVersions(version: string, skipLockfiles = false): void {
function main (line 73) | async function main(args: string[]) {
FILE: src/background/app.rs
function get_app_handle (line 40) | pub fn get_app_handle<'a>() -> &'a AppHandle<Wry> {
function emit_to_webviews (line 46) | pub fn emit_to_webviews<S>(event: &str, payload: S)
type Seelen (line 60) | pub struct Seelen {
method instances_mut (line 67) | pub fn instances_mut(&mut self) -> &mut Vec<LegacyWidgetMonitorContain...
method is_running (line 71) | pub fn is_running() -> bool {
method add_wall (line 78) | fn add_wall(&mut self) -> Result<()> {
method refresh_windows_positions (line 87) | fn refresh_windows_positions(&mut self) -> Result<()> {
method on_settings_change (line 97) | pub fn on_settings_change(&mut self, state: &FullState) -> Result<()> {
method on_monitor_event (line 120) | fn on_monitor_event(event: MonitorManagerEvent) {
method on_system_settings_change (line 135) | fn on_system_settings_change(event: SystemSettingsEvent) {
method start (line 141) | pub fn start(&mut self) -> Result<()> {
method stop (line 170) | pub fn stop(&self) {
method add_monitor (line 174) | fn add_monitor(&mut self, monitor_id: MonitorId) -> Result<()> {
method remove_monitor (line 182) | fn remove_monitor(&mut self, id: &MonitorId) -> Result<()> {
method is_auto_start_enabled (line 189) | pub fn is_auto_start_enabled() -> Result<bool> {
method set_auto_start (line 209) | pub fn set_auto_start(enabled: bool) -> Result<()> {
FILE: src/background/app_instance.rs
type LegacyWidgetMonitorContainer (line 14) | pub struct LegacyWidgetMonitorContainer {
method new (line 24) | pub fn new(view_primary_target_id: MonitorId, settings: &FullState) ->...
method ensure_positions (line 36) | pub fn ensure_positions(&mut self) -> Result<()> {
method add_toolbar (line 54) | fn add_toolbar(&mut self) -> Result<()> {
method add_weg (line 61) | fn add_weg(&mut self) -> Result<()> {
method add_wm (line 68) | fn add_wm(&mut self) -> Result<()> {
method load_settings (line 75) | pub fn load_settings(&mut self, state: &FullState) -> Result<()> {
FILE: src/background/cli/application/art.rs
type ArtVariant (line 4) | pub enum ArtVariant {
type ArtCli (line 9) | pub struct ArtCli {
method process_direct (line 14) | pub fn process_direct(self) {
FILE: src/background/cli/application/debugger.rs
type DebuggerCli (line 9) | pub struct DebuggerCli {
method process (line 23) | pub fn process(self) -> Result<()> {
type SubCommand (line 15) | enum SubCommand {
FILE: src/background/cli/application/mod.rs
type CommandExecutionMode (line 28) | pub enum CommandExecutionMode {
type SluCliCommand (line 36) | pub trait SluCliCommand {
method execution_mode (line 39) | fn execution_mode(&self) -> CommandExecutionMode {
method execution_mode (line 90) | fn execution_mode(&self) -> CommandExecutionMode {
type CliRoutingStrategy (line 46) | enum CliRoutingStrategy {
type AppCli (line 59) | pub struct AppCli {
method process_direct (line 190) | pub async fn process_direct(self) -> Result<()> {
method process (line 198) | pub fn process(self) -> Result<()> {
method send_to_main_instance (line 210) | pub async fn send_to_main_instance(self) -> Result<()> {
type AppCliCommand (line 73) | pub enum AppCliCommand {
method process_direct (line 239) | pub async fn process_direct(self) -> Result<()> {
method process (line 257) | pub fn process(self) -> Result<()> {
function handle_console_client (line 111) | pub async fn handle_console_client() -> Result<()> {
function parse_cli_args (line 142) | fn parse_cli_args() -> AppCli {
function configure_global_flags (line 153) | fn configure_global_flags(cli: &AppCli) {
function determine_routing_strategy (line 166) | fn determine_routing_strategy(cli: &AppCli) -> CliRoutingStrategy {
function attach_console (line 298) | pub fn attach_console() -> bool {
FILE: src/background/cli/application/uri.rs
constant URI (line 22) | pub const URI: &str = "seelen-ui.uri:";
function process_uri (line 24) | pub fn process_uri(uri: &str) -> Result<()> {
function path_by_resource_kind (line 69) | fn path_by_resource_kind(kind: &ResourceKind) -> &Path {
function store_file_on_respective_user_folder (line 80) | fn store_file_on_respective_user_folder(file: &SluResourceFile) -> Resul...
function download_resource (line 94) | async fn download_resource(url: &str) -> Result<()> {
function _download_resource (line 136) | async fn _download_resource(url: &str) -> Result<SluResourceFile> {
function update_popup_to_added_resource (line 154) | fn update_popup_to_added_resource(popup_id: &Uuid, resource: &Resource) ...
function resource_to_popup_config (line 224) | fn resource_to_popup_config(resource: &Resource) -> Result<SluPopupConfi...
function error_popup_config (line 310) | fn error_popup_config(err: &str) -> SluPopupConfig {
function download_remote_wallpapers (line 347) | async fn download_remote_wallpapers(wallpaper: &mut Wallpaper) -> Result...
function download_remote_asset (line 370) | async fn download_remote_asset(url: &url::Url, folder_to_store: &Path) -...
FILE: src/background/cli/application/win32.rs
type Win32Cli (line 6) | pub struct Win32Cli {
method process_direct (line 17) | pub fn process_direct(&self) -> Result<()> {
type SubCommand (line 12) | enum SubCommand {
FILE: src/background/cli/infrastructure.rs
function request_to_user_input_shortcut (line 7) | pub async fn request_to_user_input_shortcut(
FILE: src/background/cli/self_pipe.rs
type SelfPipe (line 9) | pub struct SelfPipe;
method _handle_cli_message (line 11) | fn _handle_cli_message(mut argv: Vec<String>) -> Result<()> {
method handle_message (line 30) | fn handle_message(message: AppMessage) -> IpcResponse {
method start_listener (line 45) | pub fn start_listener() -> Result<()> {
method request_open_settings (line 50) | pub async fn request_open_settings() -> Result<()> {
FILE: src/background/cli/svc_pipe.rs
type ServicePipe (line 19) | pub struct ServicePipe;
method request (line 23) | pub fn request(message: SvcAction) -> Result<()> {
method is_running (line 32) | pub fn is_running() -> bool {
method service_path (line 36) | pub fn service_path() -> Result<PathBuf> {
method start_service_task (line 46) | fn start_service_task() -> Result<()> {
method start_service (line 79) | pub async fn start_service() -> Result<()> {
FILE: src/background/error.rs
type AppError (line 30) | pub struct AppError {
method fmt (line 71) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method fmt (line 126) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method from (line 132) | fn from(err: &str) -> Self {
method from (line 145) | fn from(output: tauri_plugin_shell::process::Output) -> Self {
method from (line 159) | fn from(_err: crossbeam_channel::SendError<T>) -> Self {
function from (line 139) | fn from(val: AppError) -> Self {
type WindowsResultExt (line 164) | pub trait WindowsResultExt {
method filter_fake_error (line 171) | fn filter_fake_error(self) -> core::result::Result<(), windows::core::...
method filter_fake_error (line 185) | fn filter_fake_error(self) -> core::result::Result<(), windows::core::...
type ResultLogExt (line 174) | pub trait ResultLogExt {
method log_error (line 176) | fn log_error(self);
method log_error (line 212) | fn log_error(self) {
type ErrorMap (line 180) | pub trait ErrorMap<T> {
method wrap_error (line 181) | fn wrap_error(self) -> core::result::Result<T, AppError>;
function wrap_error (line 204) | fn wrap_error(self) -> core::result::Result<T, AppError> {
type Result (line 219) | pub type Result<T = ()> = core::result::Result<T, AppError>;
FILE: src/background/exposed.rs
function log_from_webview (line 30) | pub fn log_from_webview(level: u8, message: String, location: String) {
function open_file_inner (line 41) | pub fn open_file_inner(path: String) -> Result<()> {
function open_file (line 56) | pub fn open_file(webview: tauri::WebviewWindow, path: String) -> Result<...
function select_file_on_explorer (line 62) | fn select_file_on_explorer(path: String) -> Result<()> {
function run (line 72) | async fn run(
function is_dev_mode (line 85) | fn is_dev_mode() -> bool {
function has_fixed_runtime (line 90) | fn has_fixed_runtime() -> bool {
function is_appx_package (line 95) | fn is_appx_package() -> bool {
function get_user_envs (line 100) | pub fn get_user_envs() -> HashMap<String, String> {
function set_auto_start (line 105) | async fn set_auto_start(enabled: bool) -> Result<()> {
function get_auto_start_status (line 110) | async fn get_auto_start_status() -> Result<bool> {
function get_icon (line 116) | fn get_icon(path: Option<PathBuf>, umid: Option<String>) -> Result<()> {
function check_for_updates (line 127) | async fn check_for_updates() -> Result<bool> {
function get_foreground_window_color (line 132) | fn get_foreground_window_color(webview: WebviewWindow<tauri::Wry>) -> Re...
function install_last_available_update (line 151) | async fn install_last_available_update() -> Result<()> {
function translate_file (line 161) | pub async fn translate_file(path: PathBuf, source_lang: Option<String>) ...
function _translate_text (line 232) | async fn _translate_text(source: &str, source_lang: &str, mut target_lan...
function get_native_start_menu (line 251) | async fn get_native_start_menu() -> Result<StartMenuLayout> {
function register_invoke_handler (line 273) | pub fn register_invoke_handler(app_builder: Builder<Wry>) -> Builder<Wry> {
FILE: src/background/hook.rs
type HookManager (line 44) | pub struct HookManager;
method raw_win_event_hook_recv (line 51) | extern "system" fn raw_win_event_hook_recv(
method start (line 83) | fn start() {
method log_event (line 130) | fn log_event(event: WinEvent, origin: Window) {
method legacy_process_event (line 142) | fn legacy_process_event(event: WinEvent, origin: Window) {
function register_win_hook (line 191) | pub fn register_win_hook() -> Result<()> {
function init_zombie_window_killer (line 231) | pub fn init_zombie_window_killer() {
FILE: src/background/logger.rs
type SeelenLogger (line 8) | pub struct SeelenLogger {}
constant MAX_LOG_SIZE (line 23) | const MAX_LOG_SIZE: u64 = 5 * 1024 * 1024;
method init (line 25) | pub fn init() -> Result<()> {
function format_now (line 10) | fn format_now() -> String {
function register_panic_hook (line 102) | pub fn register_panic_hook() {
FILE: src/background/main.rs
function is_local_dev (line 49) | pub fn is_local_dev() -> bool {
function get_tokio_handle (line 53) | pub fn get_tokio_handle() -> &'static tokio::runtime::Handle {
function main (line 60) | async fn main() {
function setup (line 119) | async fn setup(app_handle: &tauri::AppHandle<tauri::Wry>) -> Result<()> {
function create_main_folders (line 139) | fn create_main_folders() -> Result<()> {
function app_callback (line 153) | fn app_callback(_: &tauri::AppHandle<tauri::Wry>, event: tauri::RunEvent) {
FILE: src/background/migrations.rs
type Migrations (line 6) | pub struct Migrations;
method migration_v1_8_3 (line 10) | fn migration_v1_8_3() -> Result<()> {
method migration_v2_1_0 (line 29) | fn migration_v2_1_0() -> Result<()> {
method migration_v2_3_9 (line 39) | fn migration_v2_3_9() -> Result<()> {
method migration_v2_4_10 (line 56) | fn migration_v2_4_10() -> Result<()> {
method migration_v2_5_0 (line 64) | fn migration_v2_5_0() -> Result<()> {
method run (line 93) | pub fn run() -> Result<()> {
FILE: src/background/modules/apps/application/mod.rs
type UserAppsManager (line 16) | pub struct UserAppsManager {
method init (line 31) | fn init() -> Self {
method instance (line 37) | pub fn instance() -> &'static Self {
method contains_win (line 41) | pub fn contains_win(&self, window: &Window) -> bool {
method add_win (line 46) | fn add_win(&self, window: &Window) {
method remove_win (line 51) | fn remove_win(&self, window: &Window) {
type UserAppWinEvent (line 22) | pub enum UserAppWinEvent {
FILE: src/background/modules/apps/application/msix.rs
type MsixAppsManager (line 27) | pub struct MsixAppsManager {
method new (line 32) | fn new() -> Self {
method instance (line 36) | pub fn instance() -> &'static Self {
method get_app_path (line 45) | pub fn get_app_path(&self, app_umid: &str) -> Result<Option<PathBuf>> {
method get_app_icon_path (line 70) | pub fn get_app_icon_path(&self, app_umid: &str) -> Result<(PathBuf, Pa...
method try_read_for (line 102) | fn try_read_for(package: &Package) -> Result<Self> {
function get_icon_via_display_info (line 123) | fn get_icon_via_display_info(app_info: &AppInfo, app_umid: &str) -> Opti...
function get_hightest_quality_posible_for_uwp_image (line 164) | pub fn get_hightest_quality_posible_for_uwp_image(icon_path: &Path) -> O...
FILE: src/background/modules/apps/application/msix_manifest.rs
type PackageManifest (line 5) | pub struct PackageManifest {
method get_app (line 13) | pub fn get_app(&self, id: &str) -> Option<&ManifestApplication> {
type ManifestIdentity (line 22) | pub struct ManifestIdentity {
type ManifestProperties (line 31) | pub struct ManifestProperties {
type ManifestApplications (line 42) | pub struct ManifestApplications {
type ManifestApplication (line 50) | pub struct ManifestApplication {
type ManifestApplicationVisualElements (line 60) | pub struct ManifestApplicationVisualElements {
FILE: src/background/modules/apps/application/previews.rs
type WinPreviewManager (line 21) | pub struct WinPreviewManager {
method instance (line 35) | pub fn instance() -> &'static Self {
method create (line 39) | fn create() -> Self {
method init (line 47) | fn init(&self) -> Result<()> {
method capture_window (line 99) | fn capture_window(&self, window: &Window) -> Result<()> {
type WinPreviewEvent (line 27) | pub enum WinPreviewEvent {
function image_to_hash (line 139) | fn image_to_hash(icon_image: &image::RgbaImage) -> String {
FILE: src/background/modules/apps/application/windows.rs
method init_listing_app_windows (line 21) | pub(super) fn init_listing_app_windows() -> Vec<UserAppWindow> {
method on_win_event (line 53) | fn on_win_event(event: WinEvent, window: Window) {
function is_interactable_window (line 149) | pub fn is_interactable_window(window: &Window) -> bool {
FILE: src/background/modules/apps/infrastructure.rs
function get_apps_manager (line 18) | fn get_apps_manager() -> &'static UserAppsManager {
function get_focused_app (line 39) | pub fn get_focused_app() -> FocusedApp {
function get_mouse_position (line 44) | pub fn get_mouse_position() -> [i32; 2] {
function get_key_state (line 50) | pub fn get_key_state(key: win_hotkeys::VKey) -> bool {
function get_user_app_windows (line 64) | pub fn get_user_app_windows() -> Vec<UserAppWindow> {
function get_user_app_windows_previews (line 69) | pub fn get_user_app_windows_previews() -> HashMap<isize, UserAppWindowPr...
function show_desktop (line 76) | pub fn show_desktop() -> Result<()> {
FILE: src/background/modules/media/devices/application.rs
type DevicesManager (line 29) | pub struct DevicesManager {
method new (line 75) | fn new() -> Result<Self> {
method init (line 84) | fn init(&mut self) -> Result<()> {
method instance (line 107) | pub fn instance() -> &'static Self {
method get_inputs (line 116) | pub fn get_inputs(&self) -> Vec<MediaDevice> {
method get_outputs (line 120) | pub fn get_outputs(&self) -> Vec<MediaDevice> {
method get_raw_device (line 124) | pub fn get_raw_device(&self, device_id: &str) -> Option<IMMDevice> {
method set_volume_level (line 128) | pub fn set_volume_level(
method toggle_mute (line 164) | pub fn toggle_mute(&self, device_id: String, session_id: Option<String...
method load_device (line 197) | fn load_device(&self, device: &IMMDevice) -> Result<()> {
method remove_device (line 208) | fn remove_device(&self, device_id: &str) {
method is_default_device (line 217) | fn is_default_device(&self, device: &MediaDevice, role: ERole) -> bool {
method process_event (line 231) | fn process_event(&self, event: DevicesEvent) -> Result<()> {
type DevicesEvent (line 38) | pub enum DevicesEvent {
method load (line 310) | pub unsafe fn load(raw_device: &IMMDevice) -> Result<Self> {
method load (line 366) | pub unsafe fn load(session: IAudioSessionControl2, device_id: &str) -> R...
method drop (line 399) | fn drop(&mut self) {
type DevicesManagerEvents (line 411) | struct DevicesManagerEvents;
method OnDefaultDeviceChanged (line 414) | fn OnDefaultDeviceChanged(
method OnDeviceAdded (line 428) | fn OnDeviceAdded(&self, device_id: &windows_core::PCWSTR) -> windows_cor...
method OnDeviceRemoved (line 433) | fn OnDeviceRemoved(&self, device_id: &windows_core::PCWSTR) -> windows_c...
method OnDeviceStateChanged (line 440) | fn OnDeviceStateChanged(
method OnPropertyValueChanged (line 456) | fn OnPropertyValueChanged(
type MediaDeviceEventHandler (line 466) | pub struct MediaDeviceEventHandler {
method OnNotify (line 471) | fn OnNotify(
method OnSessionCreated (line 489) | fn OnSessionCreated(
type MediaSessionEventHandler (line 512) | pub struct MediaSessionEventHandler {
method OnChannelVolumeChanged (line 518) | fn OnChannelVolumeChanged(
method OnDisplayNameChanged (line 528) | fn OnDisplayNameChanged(
method OnGroupingParamChanged (line 536) | fn OnGroupingParamChanged(
method OnIconPathChanged (line 544) | fn OnIconPathChanged(
method OnSessionDisconnected (line 552) | fn OnSessionDisconnected(
method OnSimpleVolumeChanged (line 565) | fn OnSimpleVolumeChanged(
method OnStateChanged (line 582) | fn OnStateChanged(
FILE: src/background/modules/media/devices/domain.rs
type MediaDeviceSession (line 11) | pub struct MediaDeviceSession {
method release (line 89) | pub fn release(self) {
type MediaDeviceType (line 29) | pub enum MediaDeviceType {
type MediaDevice (line 36) | pub struct MediaDevice {
method session (line 57) | pub fn session(&self, session_id: &str) -> Option<&MediaDeviceSession> {
method session_mut (line 61) | pub fn session_mut(&mut self, session_id: &str) -> Option<&mut MediaDe...
method remove_session (line 65) | pub fn remove_session(&mut self, session_id: &str) {
method release (line 75) | pub fn release(&self) {
FILE: src/background/modules/media/devices/infrastructure.rs
function get_devices_manager (line 9) | fn get_devices_manager() -> &'static DevicesManager {
function get_media_devices (line 26) | pub fn get_media_devices() -> Result<(serde_json::Value, serde_json::Val...
function media_set_default_device (line 34) | pub async fn media_set_default_device(id: String, role: String) -> Resul...
function media_toggle_mute (line 41) | pub fn media_toggle_mute(device_id: String, session_id: Option<String>) ...
function set_volume_level (line 47) | pub fn set_volume_level(device_id: String, session_id: Option<String>, l...
FILE: src/background/modules/media/players/application.rs
constant REMOVAL_GRACE_MS (line 27) | const REMOVAL_GRACE_MS: u128 = 1500;
constant REMOVAL_SCHEDULE_MS (line 30) | const REMOVAL_SCHEDULE_MS: u64 = 2000;
function timeline_from_raw (line 32) | fn timeline_from_raw(
type PlayersEvent (line 47) | pub enum PlayersEvent {
type PlayersManager (line 71) | pub struct PlayersManager {
method new (line 81) | fn new() -> Result<Self> {
method instance (line 91) | pub fn instance() -> &'static Self {
method init (line 100) | fn init(&mut self) -> Result<()> {
method get_media_player (line 129) | pub fn get_media_player(
method get_recommended_player_id (line 136) | pub fn get_recommended_player_id(&self) -> Result<String> {
method get_playing_sessions (line 144) | pub fn get_playing_sessions(&self) -> Vec<MediaPlayer> {
method process_event (line 148) | fn process_event(&self, event: &PlayersEvent) -> Result<()> {
method update_recommended_player (line 216) | fn update_recommended_player(&self) {
method load_session (line 224) | fn load_session(&self, session: GlobalSystemMediaTransportControlsSess...
method release_pending_players (line 288) | fn release_pending_players(&self) -> Result<()> {
method release_session (line 314) | fn release_session(&self, player_id: &str) -> Result<()> {
method on_media_players_changed (line 321) | fn on_media_players_changed(
method on_media_player_properties_changed (line 349) | fn on_media_player_properties_changed(
method on_media_player_playback_changed (line 373) | fn on_media_player_playback_changed(
method on_media_player_timeline_changed (line 391) | fn on_media_player_timeline_changed(
FILE: src/background/modules/media/players/domain.rs
type MediaPlayerSession (line 15) | pub struct MediaPlayerSession {
method create (line 23) | pub fn create(
method drop (line 53) | fn drop(&mut self) {
type MediaPlayer (line 67) | pub struct MediaPlayer {
method serialize (line 73) | fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S:...
FILE: src/background/modules/media/players/infrastructure.rs
function get_players_manager (line 9) | fn get_players_manager() -> &'static PlayersManager {
function get_media_sessions (line 23) | pub fn get_media_sessions() -> Result<Vec<MediaPlayer>> {
function media_next (line 29) | pub fn media_next(id: String) -> Result<()> {
function media_prev (line 41) | pub fn media_prev(id: String) -> Result<()> {
function media_toggle_play_pause (line 53) | pub fn media_toggle_play_pause(id: String) -> Result<()> {
FILE: src/background/modules/monitors/application.rs
type MonitorManager (line 21) | pub struct MonitorManager {
method create (line 44) | fn create() -> Result<MonitorManager> {
method instance (line 66) | pub fn instance() -> &'static MonitorManager {
method initialize (line 75) | fn initialize(&mut self) -> Result<()> {
method on_enabled (line 114) | fn on_enabled(
method on_disabled (line 129) | fn on_disabled(
method on_changed (line 143) | fn on_changed(
method on_paths_failed_or_invalidated (line 157) | fn on_paths_failed_or_invalidated(
method check_for_display_changes (line 172) | fn check_for_display_changes() -> windows_core::Result<()> {
method get_display_view_for_target (line 206) | pub fn get_display_view_for_target(&self, target_id: &MonitorId) -> Re...
method read_all_views (line 218) | pub fn read_all_views(&self) -> Result<Vec<DisplayView>> {
type MonitorManagerEvent (line 33) | pub enum MonitorManagerEvent {
method drop (line 226) | fn drop(&mut self) {
FILE: src/background/modules/monitors/brightness/application.rs
type BrightnessManagerEvent (line 16) | pub enum BrightnessManagerEvent {
type BrightnessManager (line 22) | pub struct BrightnessManager {
method instance (line 27) | pub fn instance() -> &'static Self {
method new (line 36) | fn new() -> Self {
method init (line 42) | fn init(&mut self) -> Result<()> {
method get_all_brightness (line 65) | pub fn get_all_brightness(&self) -> Vec<WmiMonitorBrightness> {
method set_brightness (line 69) | pub fn set_brightness(&self, instance_name: &str, level: u8) -> Result...
FILE: src/background/modules/monitors/brightness/domain.rs
type WmiMonitorBrightness (line 7) | pub struct WmiMonitorBrightness {
type WmiMonitorBrightnessEvent (line 17) | pub struct WmiMonitorBrightnessEvent {
type WmiMonitorBrightnessMethods (line 25) | pub struct WmiMonitorBrightnessMethods {
type WmiSetBrightnessPayload (line 34) | pub struct WmiSetBrightnessPayload {
FILE: src/background/modules/monitors/brightness/infrastructure.rs
function get_brightness_manager (line 9) | fn get_brightness_manager() -> &'static BrightnessManager {
function get_all_monitors_brightness (line 36) | pub fn get_all_monitors_brightness() -> Result<Vec<MonitorBrightness>> {
function set_monitor_brightness (line 53) | pub fn set_monitor_brightness(instance_name: String, level: u8) -> Resul...
FILE: src/background/modules/monitors/domain.rs
type Error (line 6) | type Error = AppError;
method try_from (line 7) | fn try_from(m: Monitor) -> Result<Self, Self::Error> {
FILE: src/background/modules/monitors/infrastructure.rs
function get_monitor_manager (line 10) | fn get_monitor_manager() -> &'static MonitorManager {
function _get_connected_monitors (line 28) | pub fn _get_connected_monitors() -> Result<Vec<PhysicalMonitor>> {
function get_connected_monitors (line 37) | pub fn get_connected_monitors() -> Result<Vec<PhysicalMonitor>> {
FILE: src/background/modules/network/application/mod.rs
type NetworkManagerEvent (line 40) | pub enum NetworkManagerEvent {
type IterFromRaw (line 49) | trait IterFromRaw {
method iter_from_raw (line 50) | unsafe fn iter_from_raw(raw: *const IP_ADAPTER_ADDRESSES_LH) -> Result...
method iter_from_raw (line 54) | unsafe fn iter_from_raw(raw: *const IP_ADAPTER_ADDRESSES_LH) -> Result...
type NetworkManager (line 68) | pub struct NetworkManager {}
method instance (line 71) | pub fn instance() -> &'static Self {
method disconnect_all (line 122) | pub fn disconnect_all() -> Result<()> {
method get_adapters (line 132) | pub fn get_adapters() -> Result<Vec<NetworkAdapter>> {
method start_monitoring (line 158) | fn start_monitoring() {
method get_wifi_profiles (line 211) | pub async fn get_wifi_profiles() -> Result<Vec<WlanProfile>> {
method add_profile (line 220) | pub async fn add_profile(ssid: &str, password: &str, hidden: bool) -> ...
method remove_profile (line 262) | pub async fn remove_profile(ssid: &str) -> Result<()> {
function get_local_ip_address (line 281) | pub fn get_local_ip_address() -> Result<String> {
function get_local_ip_address_base (line 284) | fn get_local_ip_address_base() -> Result<IpAddr> {
FILE: src/background/modules/network/application/scanner.rs
type WlanHandle (line 32) | pub struct WlanHandle(HANDLE);
type Target (line 41) | type Target = HANDLE;
method deref (line 42) | fn deref(&self) -> &Self::Target {
method drop (line 35) | fn drop(&mut self) {
function from_raw_entry (line 47) | fn from_raw_entry(entry: &WLAN_BSS_ENTRY) -> WlanBssEntry {
method open_wlan (line 75) | pub fn open_wlan() -> Result<WlanHandle> {
method get_connected_wlan (line 95) | fn get_connected_wlan<'a>(
method is_connected_to (line 120) | pub fn is_connected_to(ssid: &str) -> Result<bool> {
method get_profiles (line 140) | fn get_profiles(client_handle: HANDLE, interface_guid: &GUID) -> Result<...
method get_wlan_interfaces (line 182) | pub fn get_wlan_interfaces(client_handle: HANDLE) -> Result<Vec<WLAN_INT...
method get_available_networks (line 200) | fn get_available_networks(
method get_bss_entries (line 228) | fn get_bss_entries(
method scan_networks (line 257) | pub fn scan_networks() -> Result<Vec<WlanBssEntry>> {
method start_scanning (line 314) | pub fn start_scanning<F>(cb: F)
method stop_scanning (line 346) | pub fn stop_scanning() {
FILE: src/background/modules/network/application/v2.rs
type NetworkManagerV2 (line 13) | pub struct NetworkManagerV2 {}
method new (line 23) | pub fn new() -> Self {
method hotspot (line 27) | pub fn hotspot() -> Result<Option<Hotspot>> {
method toggle_hotspot (line 64) | pub fn toggle_hotspot(enabled: bool) -> Result<()> {
type NetworkManagerEventV2 (line 17) | pub enum NetworkManagerEventV2 {}
FILE: src/background/modules/network/domain/mod.rs
type Address (line 18) | enum Address {
function get_gateway (line 24) | unsafe fn get_gateway(adapter: &IP_ADAPTER_ADDRESSES_LH) -> Option<Strin...
function get_address (line 51) | unsafe fn get_address(adapter: &IP_ADAPTER_ADDRESSES_LH, address: Addres...
function adapter_to_slu_net_adapter (line 96) | pub fn adapter_to_slu_net_adapter(adapter: &IP_ADAPTER_ADDRESSES_LH) -> ...
type Hotspot (line 128) | pub struct Hotspot {
type HotspotState (line 140) | pub enum HotspotState {
method from (line 148) | fn from(state: TetheringOperationalState) -> Self {
FILE: src/background/modules/network/domain/types.rs
method fmt (line 232) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: src/background/modules/network/infrastructure.rs
function get_network_manager (line 19) | fn get_network_manager() -> &'static NetworkManager {
function try_connect_to_profile (line 44) | async fn try_connect_to_profile(ssid: &str) -> Result<bool> {
function wlan_start_scanning (line 67) | pub fn wlan_start_scanning() {
function wlan_stop_scanning (line 76) | pub fn wlan_stop_scanning() {
function wlan_get_profiles (line 83) | pub async fn wlan_get_profiles() -> Result<Vec<WlanProfile>> {
function wlan_connect (line 89) | pub async fn wlan_connect(ssid: String, password: Option<String>, hidden...
function wlan_disconnect (line 112) | pub async fn wlan_disconnect() -> Result<()> {
function get_network_default_local_ip (line 118) | pub fn get_network_default_local_ip() -> Result<String> {
function get_network_adapters (line 124) | pub fn get_network_adapters() -> Result<Vec<seelen_core::system_state::N...
function get_network_internet_connection (line 130) | pub fn get_network_internet_connection() -> Result<bool> {
FILE: src/background/modules/notifications/application.rs
type NotificationEvent (line 45) | pub enum NotificationEvent {
type NotificationManager (line 51) | pub struct NotificationManager {
method new (line 64) | fn new() -> Result<Self> {
method instance (line 73) | pub fn instance() -> &'static Self {
method notifications (line 83) | pub fn notifications(&self) -> Vec<AppNotification> {
method remove_notification (line 89) | pub fn remove_notification(&self, id: u32) -> Result<()> {
method clear_notifications (line 95) | pub fn clear_notifications(&self) -> Result<()> {
method init (line 108) | fn init(&mut self) -> Result<()> {
method on_notifications_change (line 151) | fn on_notifications_change(
method manual_notifications_loop (line 174) | fn manual_notifications_loop() -> Result<()> {
method process_event (line 195) | fn process_event(event: NotificationEvent) -> Result<()> {
method clean_toast (line 214) | fn clean_toast(toast: &mut Toast, umid: &str) -> Result<()> {
method load_notification (line 306) | fn load_notification(&self, u_notification: UserNotification) -> Resul...
method drop (line 400) | fn drop(&mut self) {
function get_text_from_toast (line 408) | fn get_text_from_toast(toast: &Toast) -> String {
function get_toast_activator_clsid (line 419) | pub fn get_toast_activator_clsid(app_umid: &AppUserModelId) -> Result<St...
FILE: src/background/modules/notifications/infrastructure.rs
function get_notification_manager (line 16) | fn get_notification_manager() -> &'static NotificationManager {
function get_notifications (line 30) | pub fn get_notifications() -> Vec<AppNotification> {
function activate_notification (line 37) | pub fn activate_notification(
function notifications_close (line 78) | pub fn notifications_close(id: u32) -> Result<()> {
function notifications_close_all (line 83) | pub fn notifications_close_all() -> Result<()> {
FILE: src/background/modules/power/application.rs
type PowerManager (line 33) | pub struct PowerManager {
method instance (line 45) | pub fn instance() -> &'static TracedMutex<Self> {
method new (line 54) | fn new() -> Self {
method init (line 58) | fn init(&mut self) -> Result<()> {
method on_effective_power_mode_change (line 116) | unsafe extern "system" fn on_effective_power_mode_change(
method on_battery_percent_change (line 129) | unsafe extern "system" fn on_battery_percent_change(
method get_power_status (line 140) | pub fn get_power_status() -> Result<PowerStatus> {
method get_batteries (line 146) | pub fn get_batteries() -> Result<Vec<Battery>> {
method on_bg_window_proc (line 155) | fn on_bg_window_proc(msg: u32, w_param: usize, _l_param: isize) -> Res...
method release (line 195) | pub fn release(&mut self) {
method default (line 204) | fn default() -> Self {
type PowerManagerEvent (line 217) | pub enum PowerManagerEvent {
FILE: src/background/modules/power/domain.rs
function power_status_to_serializable (line 6) | pub fn power_status_to_serializable(power_status: SYSTEM_POWER_STATUS) -...
function power_mode_to_serializable (line 17) | pub fn power_mode_to_serializable(mode: EFFECTIVE_POWER_MODE) -> PowerMo...
function battery_to_slu_battery (line 30) | pub fn battery_to_slu_battery(battery: battery::Battery) -> Result<Batte...
FILE: src/background/modules/power/infrastructure.rs
function get_power_manager (line 20) | fn get_power_manager() -> &'static TracedMutex<PowerManager> {
function get_power_status (line 39) | pub fn get_power_status() -> PowerStatus {
function get_power_mode (line 44) | pub fn get_power_mode() -> PowerMode {
function get_batteries (line 49) | pub fn get_batteries() -> Vec<Battery> {
function log_out (line 54) | pub fn log_out() {
function suspend (line 59) | pub fn suspend() {
function hibernate (line 64) | pub fn hibernate() {
function restart (line 69) | pub fn restart() -> Result<()> {
function shutdown (line 75) | pub fn shutdown() -> Result<()> {
function lock (line 81) | pub fn lock() -> Result<()> {
FILE: src/background/modules/radios/bluetooth/classic.rs
type BluetoothDeviceWrapper (line 11) | pub struct BluetoothDeviceWrapper {
method create (line 21) | pub fn create(device_id: &str) -> Result<Self> {
method refresh_state (line 53) | pub fn refresh_state(&mut self) -> Result<()> {
method disconnect (line 58) | pub fn disconnect(&self) -> Result<()> {
method to_serializable (line 71) | pub fn to_serializable(
method drop (line 104) | fn drop(&mut self) {
FILE: src/background/modules/radios/bluetooth/handlers.rs
function get_bluetooth_manager (line 11) | fn get_bluetooth_manager() -> &'static BluetoothManager {
function get_bluetooth_devices (line 25) | pub fn get_bluetooth_devices() -> Vec<BluetoothDevice> {
function start_bluetooth_scanning (line 30) | pub fn start_bluetooth_scanning() -> Result<()> {
function stop_bluetooth_scanning (line 35) | pub fn stop_bluetooth_scanning() -> Result<()> {
function request_pair_bluetooth_device (line 40) | pub async fn request_pair_bluetooth_device(id: String) -> Result<DeviceP...
function confirm_bluetooth_device_pairing (line 46) | pub async fn confirm_bluetooth_device_pairing(
function disconnect_bluetooth_device (line 68) | pub fn disconnect_bluetooth_device(id: String) -> Result<()> {
function forget_bluetooth_device (line 74) | pub async fn forget_bluetooth_device(id: String) -> Result<()> {
FILE: src/background/modules/radios/bluetooth/low_energy.rs
type BluetoothLEDeviceWrapper (line 11) | pub struct BluetoothLEDeviceWrapper {
method create (line 21) | pub fn create(device_id: &str) -> Result<Self> {
method refresh_state (line 53) | pub fn refresh_state(&mut self) -> Result<()> {
method close (line 58) | pub fn close(self) -> Result<()> {
method to_serializable (line 78) | pub fn to_serializable(
method drop (line 108) | fn drop(&mut self) {
FILE: src/background/modules/radios/bluetooth/manager.rs
constant PAIRING_REQUEST_TIMEOUT_SECS (line 35) | const PAIRING_REQUEST_TIMEOUT_SECS: u64 = 10;
constant PAIRING_CONFIRMATION_MAX_RETRIES (line 36) | const PAIRING_CONFIRMATION_MAX_RETRIES: u32 = 20;
constant PAIRING_CONFIRMATION_RETRY_INTERVAL_MS (line 37) | const PAIRING_CONFIRMATION_RETRY_INTERVAL_MS: u64 = 500;
type BluetoothManager (line 45) | pub struct BluetoothManager {
method create (line 77) | fn create() -> Self {
method initialize (line 89) | fn initialize(&mut self) -> Result<()> {
method instance (line 144) | pub fn instance() -> &'static Self {
method on_event (line 148) | fn on_event(&self, event: &BluetoothManagerEvent) -> Result<()> {
method get_classic_devices (line 187) | pub fn get_classic_devices(&self) -> Vec<SerializableBluetoothDevice> {
method get_le_devices (line 195) | pub fn get_le_devices(&self) -> Vec<SerializableBluetoothDevice> {
method get_all_devices (line 203) | pub fn get_all_devices(&self) -> Vec<SerializableBluetoothDevice> {
method start_scanning (line 211) | pub fn start_scanning(&self) -> Result<()> {
method stop_scanning (line 244) | pub fn stop_scanning(&self) -> Result<()> {
method prepare_pair_device (line 253) | fn prepare_pair_device(
method start_pairing (line 310) | async fn start_pairing(
method request_pair_device (line 362) | pub async fn request_pair_device(&self, device_id: &str) -> Result<Dev...
method confirm_device_pairing (line 382) | pub async fn confirm_device_pairing(
method on_pair_request (line 457) | fn on_pair_request(
method disconnect_device (line 508) | pub fn disconnect_device(&self, device_id: &str) -> Result<()> {
method release (line 527) | pub fn release(&mut self) {
function handle_device_event (line 66) | fn handle_device_event(event: DeviceEvent, device_type: BluetoothDeviceT...
type PendingPairRequest (line 535) | pub struct PendingPairRequest {
method drop (line 551) | fn drop(&mut self) {
FILE: src/background/modules/radios/bluetooth/mod.rs
type BluetoothDeviceType (line 7) | pub enum BluetoothDeviceType {
type BluetoothManagerEvent (line 14) | pub enum BluetoothManagerEvent {
FILE: src/background/modules/radios/device.rs
type SluRadioDevice (line 9) | pub struct SluRadioDevice {
method create (line 17) | pub fn create(device_id: &str) -> Result<SluRadioDevice> {
method to_serializable (line 46) | pub fn to_serializable(id: &str, radio: &Radio) -> Result<RadioDevice> {
method drop (line 65) | fn drop(&mut self) {
FILE: src/background/modules/radios/handlers.rs
function get_radio_manager (line 12) | fn get_radio_manager() -> &'static RadioManager {
function get_radios (line 27) | pub fn get_radios() -> Vec<RadioDevice> {
function set_radios_state (line 32) | pub fn set_radios_state(kind: RadioDeviceKind, enabled: bool) -> Result<...
FILE: src/background/modules/radios/manager.rs
type RadioManager (line 14) | pub struct RadioManager {
method create (line 26) | fn create() -> Self {
method initialize (line 33) | fn initialize(&mut self) -> Result<()> {
method instance (line 61) | pub fn instance() -> &'static Self {
method is_enabled (line 70) | pub fn is_enabled(&self, kind: RadioDeviceKind) -> bool {
method on_event (line 75) | fn on_event(&self, event: &DeviceEvent) -> Result<()> {
method get_radios (line 89) | pub fn get_radios(&self) -> Vec<RadioDevice> {
method set_radios_state (line 96) | pub fn set_radios_state(&self, kind: RadioDeviceKind, enabled: bool) -...
FILE: src/background/modules/start/application.rs
type StartMenuManager (line 24) | pub struct StartMenuManager {
method common_items_path (line 44) | pub fn common_items_path() -> PathBuf {
method user_items_path (line 50) | pub fn user_items_path() -> PathBuf {
method new (line 55) | fn new() -> StartMenuManager {
method instance (line 64) | pub fn instance() -> &'static Self {
method init (line 73) | fn init(&mut self) -> Result<()> {
method get_by_target (line 98) | pub fn get_by_target(&self, target: &Path) -> Option<Arc<StartMenuItem...
method get_by_file_umid (line 104) | pub fn get_by_file_umid(&self, umid: &str) -> Option<Arc<StartMenuItem...
method store_cache (line 117) | pub fn store_cache(&self) -> Result<()> {
method load_cache (line 124) | pub fn load_cache(&mut self) -> Result<()> {
method _get_items (line 132) | fn _get_items(dir: &Path) -> Result<Vec<Arc<StartMenuItem>>> {
method load_start_menu_items (line 164) | pub fn load_start_menu_items() -> Result<Vec<Arc<StartMenuItem>>> {
method create_file_watcher (line 209) | fn create_file_watcher(
method reload (line 236) | fn reload() -> Result<()> {
method on_files_changed (line 245) | fn on_files_changed(_events: Vec<DebouncedEvent>) -> Result<()> {
method setup_package_catalog_listener (line 249) | fn setup_package_catalog_listener(&mut self) -> Result<()> {
method setup_listeners (line 279) | pub fn setup_listeners(&mut self) -> Result<()> {
type StartMenuEvent (line 33) | pub enum StartMenuEvent {
FILE: src/background/modules/start/infrastructure.rs
function get_start_menu_manager (line 9) | fn get_start_menu_manager() -> &'static StartMenuManager {
function get_start_menu_items (line 20) | pub fn get_start_menu_items() -> Vec<Arc<StartMenuItem>> {
FILE: src/background/modules/system/mod.rs
type SystemInfo (line 14) | pub struct SystemInfo {
method instance (line 37) | pub fn instance() -> &'static SystemInfo {
method new (line 46) | fn new() -> Self {
method init (line 59) | fn init(&mut self) -> Result<()> {
method check_and_emit_changes (line 76) | fn check_and_emit_changes(&self) {
method disks_changed (line 116) | fn disks_changed(old: &[Disk], new: &[Disk]) -> bool {
method network_changed (line 131) | fn network_changed(old: &[NetworkStatistics], new: &[NetworkStatistics...
method memory_changed (line 143) | fn memory_changed(old: &Memory, new: &Memory) -> bool {
method cores_changed (line 147) | fn cores_changed(old: &[Core], new: &[Core]) -> bool {
method disks (line 159) | fn disks(&self) -> Vec<Disk> {
method network (line 181) | fn network(&self) -> Vec<NetworkStatistics> {
method memory (line 197) | fn memory(&self) -> Memory {
method cores (line 209) | fn cores(&self) -> Vec<Core> {
type SystemInfoEvent (line 27) | pub enum SystemInfoEvent {
FILE: src/background/modules/system/tauri.rs
function get_system_info (line 15) | fn get_system_info() -> &'static SystemInfo {
function get_system_disks (line 50) | pub fn get_system_disks() -> Vec<Disk> {
function get_system_network (line 55) | pub fn get_system_network() -> Vec<NetworkStatistics> {
function get_system_memory (line 60) | pub fn get_system_memory() -> Memory {
function get_system_cores (line 65) | pub fn get_system_cores() -> Vec<Core> {
FILE: src/background/modules/system_settings/application.rs
function color_to_string (line 14) | fn color_to_string(color: windows::UI::Color) -> String {
type SystemSettingsEvent (line 22) | pub enum SystemSettingsEvent {
type SystemSettings (line 27) | pub struct SystemSettings {
method instance (line 38) | pub fn instance() -> &'static Self {
method new (line 47) | fn new() -> Self {
method init (line 55) | fn init(&mut self) -> Result<()> {
method internal_on_colors_change (line 72) | fn internal_on_colors_change(
method internal_on_text_scale_change (line 80) | fn internal_on_text_scale_change(
method get_colors (line 88) | pub fn get_colors(&self) -> Result<UIColors> {
method drop (line 107) | fn drop(&mut self) {
FILE: src/background/modules/system_settings/infrastructure.rs
function get_system_settings (line 13) | fn get_system_settings() -> &'static SystemSettings {
function get_system_colors (line 28) | pub fn get_system_colors() -> Result<UIColors> {
FILE: src/background/modules/system_settings/language/application.rs
type LanguageEvent (line 45) | pub enum LanguageEvent {
type LanguageManager (line 51) | pub struct LanguageManager {
method instance (line 56) | pub fn instance() -> &'static Self {
method new (line 60) | fn new() -> Self {
method init (line 66) | fn init(&mut self) -> Result<()> {
method get_input_locale_list (line 113) | fn get_input_locale_list() -> Vec<HKL> {
method get_active_hkl (line 123) | fn get_active_hkl() -> HKL {
method get_active_ime (line 131) | fn get_active_ime() -> ImeStatus {
method enum_langs (line 151) | fn enum_langs() -> Result<Vec<SystemLanguage>> {
method get_language (line 173) | fn get_language(lang_id: u32) -> Result<SystemLanguage> {
method get_keyboard_layout (line 201) | fn get_keyboard_layout(hkl: HKL, active: bool) -> Result<KeyboardLayou...
method get_ime_family (line 227) | fn get_ime_family(hkl: HKL) -> Result<()> {
method get_reg_layout_id (line 242) | fn get_reg_layout_id(hkl: u32) -> Result<String> {
method set_keyboard_layout (line 280) | pub fn set_keyboard_layout(klid: &str, hkl: &str) -> Result<()> {
method get_languages (line 295) | pub fn get_languages(&self) -> Vec<SystemLanguage> {
FILE: src/background/modules/system_settings/language/infrastructure.rs
function get_language_manager (line 11) | fn get_language_manager() -> &'static LanguageManager {
function get_system_languages (line 25) | pub fn get_system_languages() -> Vec<SystemLanguage> {
function set_system_keyboard_layout (line 30) | pub fn set_system_keyboard_layout(id: String, handle: String) -> Result<...
FILE: src/background/modules/system_tray/application/mod.rs
type SystemTrayManager (line 15) | pub struct SystemTrayManager {
method create (line 28) | fn create() -> Self {
method instance (line 45) | pub fn instance() -> &'static Self {
method handle_tray_event (line 53) | pub fn handle_tray_event(event: Win32TrayEvent) {
type SystemTrayEvent (line 21) | pub enum SystemTrayEvent {
FILE: src/background/modules/system_tray/application/tray_hook_loader.rs
type GetMsgProcFn (line 25) | type GetMsgProcFn = unsafe extern "system" fn(i32, WPARAM, LPARAM) -> LR...
type TrayHookLoader (line 36) | pub struct TrayHookLoader {
method new (line 45) | pub fn new() -> Result<Self> {
method get_dll_path (line 75) | fn get_dll_path() -> Result<PathBuf> {
method load_dll (line 107) | fn load_dll(path: &Path) -> Result<Owned<HMODULE>> {
method get_proc_address (line 121) | fn get_proc_address<F>(dll_handle: HMODULE, name: &str) -> Result<F> {
method drop (line 138) | fn drop(&mut self) {
FILE: src/background/modules/system_tray/application/tray_icon.rs
type SystrayEvent (line 27) | pub enum SystrayEvent {
method icons (line 35) | pub fn icons(&self) -> Vec<SysTrayIcon> {
method icon_by_handle (line 40) | pub fn icon_by_handle(&self, handle: isize, uid: u32) -> Option<SysTrayI...
method icon_by_guid (line 46) | pub fn icon_by_guid(&self, guid: uuid::Uuid) -> Option<SysTrayIcon> {
method find_icon (line 50) | fn find_icon(&self, icon_data: &IconEventData) -> Option<SysTrayIcon> {
method process_event (line 64) | pub(super) fn process_event(&self, mut event: Win32TrayEvent) -> Option<...
method send_action (line 205) | pub fn send_action(
method notify_icon (line 282) | fn notify_icon(
function image_to_hash (line 321) | fn image_to_hash(icon_image: &image::RgbaImage) -> String {
function has_change (line 328) | fn has_change(icon: &SysTrayIcon, data: &IconEventData) -> bool {
FILE: src/background/modules/system_tray/application/util.rs
type Util (line 10) | pub struct Util;
method pack_i32 (line 16) | pub fn pack_i32(low: i16, high: i16) -> i32 {
method cursor_position (line 21) | pub fn cursor_position() -> crate::Result<(i32, i32)> {
method refresh_icons (line 33) | pub fn refresh_icons() -> crate::Result<()> {
FILE: src/background/modules/system_tray/infrastructure.rs
function get_system_tray_manager (line 12) | fn get_system_tray_manager() -> &'static SystemTrayManager {
function get_system_tray_icons (line 26) | pub fn get_system_tray_icons() -> Vec<SysTrayIcon> {
function send_system_tray_icon_action (line 31) | pub fn send_system_tray_icon_action(id: SysTrayIconId, action: SystrayIc...
FILE: src/background/modules/trash_bin/application.rs
type TrashBinManager (line 17) | pub struct TrashBinManager {
method instance (line 29) | pub fn instance() -> &'static TracedMutex<Self> {
method new (line 38) | fn new() -> Self {
method init (line 44) | fn init(&mut self) -> Result<()> {
method query (line 57) | pub fn query() -> Result<TrashBinInfo> {
method empty (line 69) | pub fn empty() -> Result<()> {
method on_bg_window_proc (line 76) | fn on_bg_window_proc(msg: u32, _w_param: usize, _l_param: isize) -> Re...
type TrashBinManagerEvent (line 22) | pub enum TrashBinManagerEvent {
FILE: src/background/modules/trash_bin/infrastructure.rs
function get_trash_bin_manager (line 9) | fn get_trash_bin_manager() -> &'static TracedMutex<TrashBinManager> {
function get_trash_bin_info (line 21) | pub fn get_trash_bin_info() -> TrashBinInfo {
function trash_bin_empty (line 26) | pub fn trash_bin_empty() -> Result<()> {
FILE: src/background/modules/user/application.rs
type UserManagerEvent (line 32) | pub enum UserManagerEvent {
type FolderDetails (line 39) | pub struct FolderDetails {
type UserManager (line 46) | pub struct UserManager {
method instance (line 57) | pub fn instance() -> &'static Arc<Mutex<Self>> {
method get_path_from_folder (line 66) | fn get_path_from_folder(folder_type: &FolderType) -> Option<PathBuf> {
method get_logged_on_user_sid (line 81) | fn get_logged_on_user_sid() -> Result<String> {
method get_folder_content (line 88) | fn get_folder_content(base_path: PathBuf, folder_type: FolderType) -> ...
method get_user_profile_picture_path (line 116) | fn get_user_profile_picture_path(sid: &str, quality: PictureQuality) -...
method get_one_drive_attributes (line 126) | fn get_one_drive_attributes() -> Result<(String, PathBuf)> {
method get_xbox_gamertag (line 134) | fn get_xbox_gamertag() -> Result<String> {
method get_logged_user (line 141) | fn get_logged_user() -> User {
method create_folder_watcher (line 180) | fn create_folder_watcher(
method reload_folder_content (line 198) | fn reload_folder_content(folder_type: FolderType) -> Result<()> {
method new (line 211) | pub fn new() -> Result<Self> {
function is_ignored_entry (line 241) | fn is_ignored_entry(path: &std::path::Path) -> bool {
function is_ignored_file (line 279) | fn is_ignored_file(path: &std::path::Path) -> bool {
FILE: src/background/modules/user/domain.rs
type PictureQuality (line 2) | pub enum PictureQuality {
method as_str (line 17) | pub fn as_str(&self) -> &'static str {
FILE: src/background/modules/user/infrastructure.rs
function get_user_manager (line 16) | fn get_user_manager() -> &'static Arc<Mutex<UserManager>> {
function get_user (line 39) | pub fn get_user() -> User {
function get_user_folder_content (line 44) | pub fn get_user_folder_content(folder_type: FolderType) -> Vec<PathBuf> {
FILE: src/background/resources/cli.rs
type ResourceManagerCli (line 18) | pub struct ResourceManagerCli {
method process (line 81) | pub fn process(self) -> Result<()> {
method process_direct (line 104) | pub async fn process_direct(self) -> Result<()> {
type SubCommand (line 24) | enum SubCommand {
method execution_mode (line 61) | fn execution_mode(&self) -> CommandExecutionMode {
method execution_mode (line 74) | fn execution_mode(&self) -> CommandExecutionMode {
type ClapResourceKind (line 172) | enum ClapResourceKind {
method from (line 182) | fn from(value: ClapResourceKind) -> Self {
FILE: src/background/resources/commands.rs
function remove_resource (line 12) | pub fn remove_resource(kind: ResourceKind, id: ResourceId) -> Result<()> {
function state_get_themes (line 68) | pub fn state_get_themes() -> Vec<Arc<Theme>> {
function state_get_plugins (line 77) | pub fn state_get_plugins() -> Vec<Arc<Plugin>> {
function state_get_widgets (line 86) | pub fn state_get_widgets() -> Vec<Arc<Widget>> {
function state_get_wallpapers (line 95) | pub fn state_get_wallpapers() -> Vec<Arc<Wallpaper>> {
function state_get_icon_packs (line 104) | pub fn state_get_icon_packs() -> Vec<Arc<IconPack>> {
function state_delete_cached_icons (line 121) | pub fn state_delete_cached_icons() -> Result<()> {
FILE: src/background/resources/emitters.rs
method emit_widgets (line 8) | pub fn emit_widgets(&self) -> Result<()> {
method emit_themes (line 18) | pub fn emit_themes(&self) -> Result<()> {
method emit_plugins (line 27) | pub fn emit_plugins(&self) -> Result<()> {
method emit_icon_packs (line 36) | pub fn emit_icon_packs(&self) -> Result<()> {
method emit_wallpapers (line 53) | pub fn emit_wallpapers(&self) -> Result<()> {
method emit_kind_changed (line 62) | pub fn emit_kind_changed(&self, kind: &ResourceKind) -> Result<()> {
FILE: src/background/resources/mod.rs
type ResourceManager (line 28) | pub struct ResourceManager {
method initialize (line 42) | fn initialize(&self) {
method load (line 50) | pub fn load(&self, kind: &ResourceKind, path: &Path) -> Result<()> {
method unload (line 134) | pub fn unload(&self, kind: &ResourceKind, path: &Path) {
method unload_all (line 159) | pub fn unload_all(&self, kind: &ResourceKind) {
method get_entries_for_type (line 183) | fn get_entries_for_type(kind: &ResourceKind) -> Result<Vec<std::fs::Re...
method load_all_of_type (line 225) | pub fn load_all_of_type(&self, kind: ResourceKind) -> Result<()> {
FILE: src/background/resources/system_icon_pack.rs
method with_system_pack (line 31) | fn with_system_pack<F, T>(&self, cb: F) -> T
method request_save_system_icon_pack (line 41) | fn request_save_system_icon_pack(&self) {
method sanitize_default_icons (line 46) | fn sanitize_default_icons(sys_icons_path: &Path) -> Result<()> {
method sanitize_default_entries (line 77) | fn sanitize_default_entries(system_pack: &mut IconPack) {
method ensure_system_icon_pack (line 146) | pub fn ensure_system_icon_pack(&self) -> Result<()> {
method add_system_app_icon (line 173) | pub fn add_system_app_icon(&self, umid: Option<&str>, path: Option<&Path...
method add_system_icon_redirect (line 193) | pub fn add_system_icon_redirect(&self, umid: Option<String>, origin: &Pa...
method add_system_file_icon (line 208) | pub fn add_system_file_icon(&self, origin_extension: &str, icon: Icon) {
method icon_exists (line 219) | fn icon_exists(icon: &Icon) -> bool {
method _has_app_icon (line 235) | fn _has_app_icon(system_pack: &IconPack, umid: Option<&str>, path: Optio...
method _has_shared_file_icon (line 299) | fn _has_shared_file_icon(system_pack: &IconPack, path: &Path) -> bool {
method has_app_icon (line 313) | pub fn has_app_icon(&self, umid: Option<&str>, path: Option<&Path>) -> b...
method has_shared_file_icon (line 317) | pub fn has_shared_file_icon(&self, path: &Path) -> bool {
function last_edit_at (line 322) | fn last_edit_at(path: &Path) -> Option<DateTime<Utc>> {
function strip_icon_index (line 331) | fn strip_icon_index(path: &Path) -> std::borrow::Cow<'_, Path> {
FILE: src/background/state/application/apps_config.rs
method get_app_config_by_window (line 11) | pub fn get_app_config_by_window(&self, hwnd: HWND) -> Result<Option<&App...
method _load_bundled_settings_by_app (line 28) | fn _load_bundled_settings_by_app(&mut self) -> Result<()> {
method load_bundled_settings_by_app (line 46) | pub(super) fn load_bundled_settings_by_app(&mut self) {
FILE: src/background/state/application/icons.rs
function download_remote_icons (line 10) | pub async fn download_remote_icons(pack: &mut IconPack) -> Result<()> {
function download_entry_icons (line 45) | async fn download_entry_icons(icon: &Icon, folder_to_store: &Path) -> Re...
function download_remote_icon_and_validate_it (line 77) | async fn download_remote_icon_and_validate_it(
FILE: src/background/state/application/mod.rs
type FullState (line 43) | pub struct FullState {
method new (line 55) | fn new() -> Result<Self> {
method cloned (line 72) | pub fn cloned(&self) -> Self {
method join_and_filter_debounced_changes (line 76) | fn join_and_filter_debounced_changes(events: Vec<DebouncedEvent>) -> H...
method process_changes (line 88) | fn process_changes(&mut self, changed: &HashSet<PathBuf>) -> Result<()> {
method start_listeners (line 178) | fn start_listeners(&mut self) -> Result<()> {
method load_all (line 217) | fn load_all(&mut self) {
method show_corrupted_state_to_user (line 231) | fn show_corrupted_state_to_user(path: &Path) {
FILE: src/background/state/application/performance.rs
function start_listeners (line 22) | fn start_listeners() {
function get_perf_mode (line 40) | fn get_perf_mode() -> PerformanceMode {
function check_for_changes (line 63) | fn check_for_changes() {
FILE: src/background/state/application/settings.rs
method emit_settings (line 14) | pub(super) fn emit_settings(&self) -> Result<()> {
method _read_settings (line 20) | fn _read_settings(&mut self) -> Result<()> {
method migration_v2_5_0 (line 33) | fn migration_v2_5_0(&mut self) -> Result<()> {
method sanitize_wallpaper_collections (line 91) | pub(super) fn sanitize_wallpaper_collections(&mut self) -> bool {
method read_settings (line 105) | pub(super) fn read_settings(&mut self) {
method write_settings (line 112) | pub fn write_settings(&self) -> Result<()> {
FILE: src/background/state/application/toolbar_items.rs
method initial_toolbar_items (line 16) | pub fn initial_toolbar_items() -> ToolbarState {
method _read_toolbar_items (line 47) | fn _read_toolbar_items(&mut self) -> Result<()> {
method read_toolbar_items (line 63) | pub(super) fn read_toolbar_items(&mut self) {
method write_toolbar_items (line 72) | pub fn write_toolbar_items(&self, items: &ToolbarState) -> Result<()> {
FILE: src/background/state/application/weg_items.rs
method initial_weg_items (line 15) | pub fn initial_weg_items() -> WegItems {
method update_weg_items_paths (line 46) | fn update_weg_items_paths(items: &mut [WegItem]) {
method _read_weg_items (line 58) | fn _read_weg_items(&mut self) -> Result<()> {
method read_weg_items (line 77) | pub(super) fn read_weg_items(&mut self) {
method write_weg_items (line 86) | pub fn write_weg_items(&self, items: &WegItems) -> Result<()> {
FILE: src/background/state/infrastructure.rs
function state_get_toolbar_items (line 25) | pub fn state_get_toolbar_items() -> ToolbarState {
function state_write_toolbar_items (line 30) | pub fn state_write_toolbar_items(mut items: ToolbarState) -> Result<()> {
function state_get_weg_items (line 41) | pub fn state_get_weg_items() -> WegItems {
function state_write_weg_items (line 46) | pub fn state_write_weg_items(mut items: WegItems) -> Result<()> {
function state_get_settings (line 57) | pub fn state_get_settings(path: Option<PathBuf>) -> Result<Settings> {
function state_get_default_settings (line 66) | pub fn state_get_default_settings() -> Result<Settings> {
function state_get_default_monitor_settings (line 73) | pub fn state_get_default_monitor_settings() -> MonitorConfiguration {
function state_get_default_wallpaper_settings (line 78) | pub fn state_get_default_wallpaper_settings() -> WallpaperInstanceSettin...
function state_write_settings (line 83) | pub fn state_write_settings(mut settings: Settings) -> Result<()> {
function state_get_settings_by_app (line 94) | pub fn state_get_settings_by_app() -> Vec<AppConfig> {
function get_native_shell_wallpaper (line 104) | pub fn get_native_shell_wallpaper() -> Result<PathBuf> {
function set_native_shell_wallpaper (line 109) | pub fn set_native_shell_wallpaper(path: String) -> Result<()> {
function state_request_wallpaper_addition (line 114) | pub fn state_request_wallpaper_addition() -> Result<()> {
function state_add_icon_to_custom_icon_pack (line 135) | pub fn state_add_icon_to_custom_icon_pack(_icon: IconPackEntry) -> Resul...
function state_get_performance_mode (line 140) | pub fn state_get_performance_mode() -> PerformanceMode {
FILE: src/background/state/mod.rs
method is_widget_enabled (line 19) | pub fn is_widget_enabled(&self, widget_id: &WidgetId) -> bool {
method is_widget_enable_on_monitor (line 23) | pub fn is_widget_enable_on_monitor(
method is_weg_enabled (line 32) | pub fn is_weg_enabled(&self) -> bool {
method is_bar_enabled (line 37) | pub fn is_bar_enabled(&self) -> bool {
method is_window_manager_enabled (line 41) | pub fn is_window_manager_enabled(&self) -> bool {
method is_weg_enabled_on_monitor (line 45) | pub fn is_weg_enabled_on_monitor(&self, monitor_id: &MonitorId) -> bool {
method is_bar_enabled_on_monitor (line 49) | pub fn is_bar_enabled_on_monitor(&self, monitor_id: &MonitorId) -> bool {
method is_window_manager_enabled_on_monitor (line 53) | pub fn is_window_manager_enabled_on_monitor(&self, monitor_id: &MonitorI...
method get_widget_instances_ids (line 57) | pub fn get_widget_instances_ids(&self, widget_id: &WidgetId) -> Vec<Uuid> {
method is_wall_enabled (line 68) | pub fn is_wall_enabled(&self) -> bool {
method get_wm_layout (line 72) | pub fn get_wm_layout(&self, workspace_id: &WorkspaceId) -> WindowManager...
method get_wm_layout_id (line 102) | pub fn get_wm_layout_id(&self, _workspace_id: &WorkspaceId) -> PluginId {
method locale (line 137) | pub fn locale(&self) -> &String {
FILE: src/background/tauri_context.rs
function get_context (line 3) | pub fn get_context() -> tauri::Context {
FILE: src/background/tauri_plugins.rs
function register_plugins (line 3) | pub fn register_plugins(app_builder: Builder<Wry>) -> Builder<Wry> {
FILE: src/background/telemetry.rs
constant REGISTRY_SUBKEY (line 10) | const REGISTRY_SUBKEY: &str = "Software\\Seelen UI\\Analytics";
constant INSTALL_ID_VALUE (line 11) | const INSTALL_ID_VALUE: &str = "InstallId";
constant TELEMETRY_ENDPOINT (line 14) | const TELEMETRY_ENDPOINT: &str = "https://telemetry.local.seelen.io/even...
constant TELEMETRY_ENDPOINT (line 16) | const TELEMETRY_ENDPOINT: &str = "https://telemetry.seelen.io/events";
type TelemetryEvent (line 22) | pub enum TelemetryEvent {
function get_or_create_install_id (line 35) | fn get_or_create_install_id() -> crate::error::Result<Uuid> {
function os_version_string (line 53) | fn os_version_string() -> String {
function send_event (line 58) | async fn send_event(install_id: Uuid) {
function start_telemetry (line 100) | pub fn start_telemetry() {
FILE: src/background/utils/constants.rs
type SeelenCommon (line 15) | pub struct SeelenCommon {
method new (line 40) | pub fn new() -> Self {
method app_resource_dir (line 76) | pub fn app_resource_dir(&self) -> &Path {
method app_data_dir (line 80) | pub fn app_data_dir(&self) -> &Path {
method app_cache_dir (line 84) | pub fn app_cache_dir(&self) -> &Path {
method app_temp_dir (line 88) | pub fn app_temp_dir(&self) -> &Path {
method system_dir (line 93) | pub fn system_dir(&self) -> &Path {
method settings_path (line 97) | pub fn settings_path(&self) -> &Path {
method system_icon_pack_path (line 101) | pub fn system_icon_pack_path(&self) -> &Path {
method user_icons_path (line 105) | pub fn user_icons_path(&self) -> &Path {
method user_sounds_path (line 109) | pub fn user_sounds_path(&self) -> &Path {
method user_themes_path (line 113) | pub fn user_themes_path(&self) -> &Path {
method bundled_themes_path (line 117) | pub fn bundled_themes_path(&self) -> &Path {
method user_plugins_path (line 121) | pub fn user_plugins_path(&self) -> &Path {
method bundled_plugins_path (line 125) | pub fn bundled_plugins_path(&self) -> &Path {
method bundled_app_configs_path (line 129) | pub fn bundled_app_configs_path(&self) -> &Path {
method user_widgets_path (line 133) | pub fn user_widgets_path(&self) -> &Path {
method bundled_widgets_path (line 137) | pub fn bundled_widgets_path(&self) -> &Path {
method user_wallpapers_path (line 141) | pub fn user_wallpapers_path(&self) -> &Path {
method widget_data_dir (line 145) | pub fn widget_data_dir(&self, id: &WidgetId) -> PathBuf {
FILE: src/background/utils/discord.rs
function start_discord_rpc (line 69) | pub fn start_discord_rpc() -> Result<()> {
function get_activity (line 124) | pub fn get_activity() -> Activity<'static> {
FILE: src/background/utils/icon_extractor/mod.rs
function bgra_to_rgba (line 47) | pub fn bgra_to_rgba(data: &mut [u8]) {
function bgra_to_rgba (line 67) | pub fn bgra_to_rgba(data: &mut [u8]) {
function convert_hicon_to_rgba_image (line 85) | pub fn convert_hicon_to_rgba_image(hicon: &HICON) -> Result<RgbaImage> {
function convert_hbitmap_to_rgba_image (line 102) | pub fn convert_hbitmap_to_rgba_image(hbitmap: HBITMAP) -> Result<RgbaIma...
function fix_alpha_channel (line 165) | fn fix_alpha_channel(buffer: &mut [u8]) {
function crop_transparent_borders (line 207) | pub fn crop_transparent_borders(rgba_image: &RgbaImage) -> RgbaImage {
function extract_icon_from_module (line 279) | pub fn extract_icon_from_module(path: &Path, index: i32) -> Result<RgbaI...
function get_shell_icon (line 294) | pub fn get_shell_icon(path: &Path) -> Result<RgbaImage> {
function get_icon_from_url_file (line 333) | fn get_icon_from_url_file(path: &Path) -> Result<RgbaImage> {
function parse_path_with_icon_index (line 358) | fn parse_path_with_icon_index(raw: &Path) -> Option<(PathBuf, i32)> {
function _extract_and_save_icon_from_module_with_index (line 375) | fn _extract_and_save_icon_from_module_with_index(
function _extract_and_save_icon_from_file (line 412) | fn _extract_and_save_icon_from_file(origin: &Path) -> Result<()> {
function _extract_and_save_icon_umid (line 506) | fn _extract_and_save_icon_umid(aumid: &AppUserModelId) -> Result<()> {
function request_icon_extraction_from_file (line 575) | pub fn request_icon_extraction_from_file<T: AsRef<Path>>(path: T) {
function request_icon_extraction_from_umid (line 583) | pub fn request_icon_extraction_from_umid(aumid: &AppUserModelId) {
constant SQUARE_MARGIN (line 587) | const SQUARE_MARGIN: f32 = 0.1;
constant ASPECT_TOLERANCE (line 588) | const ASPECT_TOLERANCE: f32 = 0.05;
constant OPACITY_THRESHOLD (line 589) | const OPACITY_THRESHOLD: u8 = 254;
function is_aproximately_a_square (line 591) | pub fn is_aproximately_a_square(rgba_image: &RgbaImage) -> bool {
FILE: src/background/utils/icon_extractor/queue.rs
constant PER_FILE_EXTENSIONS (line 21) | const PER_FILE_EXTENSIONS: &[&str] = &["exe", "lnk", "url"];
function real_path_for_ext (line 25) | fn real_path_for_ext(path: &Path) -> std::borrow::Cow<'_, std::path::Pat...
type IconExtractor (line 36) | pub struct IconExtractor {
method create (line 58) | fn create() -> Self {
method init (line 97) | pub fn init(&mut self) -> Result<()> {
method instance (line 107) | pub fn instance() -> &'static IconExtractor {
method request (line 112) | pub fn request(&self, request: IconExtractorRequest) {
method is_failed (line 117) | fn is_failed(&self, request: &IconExtractorRequest) -> bool {
method record_failure (line 139) | fn record_failure(&self, request: IconExtractorRequest) {
method clear_failures (line 166) | pub fn clear_failures(&self) {
method revalidate_property_store_failures (line 175) | fn revalidate_property_store_failures(&self) {
method process (line 199) | fn process(request: &IconExtractorRequest) -> Result<()> {
type IconExtractorRequest (line 48) | pub enum IconExtractorRequest {
FILE: src/background/utils/integrity/checksums.rs
constant MINISIGN_PUBLIC_KEY (line 12) | const MINISIGN_PUBLIC_KEY: &str = "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduI...
function ensure_bundle_files_integrity (line 14) | pub fn ensure_bundle_files_integrity(app: &tauri::AppHandle) -> Result<(...
function validate_directory_checksums (line 51) | fn validate_directory_checksums(base_path: &Path, checksums_path: &Path)...
function verify_external_signature (line 89) | fn verify_external_signature(file: &Path, signature_file: &Path, key_bas...
function show_integrity_dialog (line 99) | fn show_integrity_dialog() {
FILE: src/background/utils/integrity/mod.rs
function print_initial_information (line 26) | pub fn print_initial_information() {
function restart_as_appx (line 63) | pub fn restart_as_appx() -> Result<!> {
function is_uac_enabled (line 73) | fn is_uac_enabled() -> bool {
function warn_if_elevated (line 84) | pub fn warn_if_elevated(app: &tauri::AppHandle) {
function is_already_running (line 95) | pub fn is_already_running() -> bool {
FILE: src/background/utils/integrity/webview.rs
function validate_webview_runtime_is_installed (line 14) | pub fn validate_webview_runtime_is_installed(app: &tauri::AppHandle) -> ...
function check_for_webview_optimal_state (line 55) | pub fn check_for_webview_optimal_state(app: &tauri::AppHandle) -> Result...
function start_integrity_thread (line 76) | fn start_integrity_thread(app: tauri::AppHandle) {
FILE: src/background/utils/lock_free/sync_hash_map.rs
type SyncHashMap (line 8) | pub struct SyncHashMap<K, V>(TracedMutex<HashMap<K, V>>);
function new (line 15) | pub fn new() -> Self {
function len (line 19) | pub fn len(&self) -> usize {
function is_empty (line 23) | pub fn is_empty(&self) -> bool {
function upsert (line 27) | pub fn upsert(&self, key: K, value: V) -> Option<V> {
function remove (line 31) | pub fn remove<Q: ?Sized>(&self, key: &Q) -> Option<V>
function contains_key (line 39) | pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool
function get (line 47) | pub fn get<Q: ?Sized, F, R>(&self, key: &Q, f: F) -> Option<R>
function get_or_default (line 57) | pub fn get_or_default<Q, F, R>(&self, key: Q, f: F) -> R
function get_or_insert (line 67) | pub fn get_or_insert<Q, C, F, R>(&self, key: Q, constructor: C, f: F) -> R
function for_each (line 76) | pub fn for_each<F>(&self, f: F)
function retain (line 83) | pub fn retain<F>(&self, f: F)
function clear (line 90) | pub fn clear(&self) {
function any (line 94) | pub fn any<F>(&self, f: F) -> bool
function take (line 101) | pub fn take(&self) -> HashMap<K, V> {
function replace (line 105) | pub fn replace(&self, value: HashMap<K, V>) {
function to_hash_map (line 116) | pub fn to_hash_map(&self) -> HashMap<K, V> {
function keys (line 120) | pub fn keys(&self) -> Vec<K> {
function values (line 124) | pub fn values(&self) -> Vec<V> {
function from (line 133) | fn from(value: HashMap<K, V>) -> Self {
method default (line 142) | fn default() -> Self {
FILE: src/background/utils/lock_free/sync_vec.rs
type SyncVec (line 5) | pub struct SyncVec<T>(TracedMutex<Vec<T>>);
function new (line 9) | pub fn new() -> Self {
function contains (line 13) | pub fn contains(&self, item: &T) -> bool
function len (line 20) | pub fn len(&self) -> usize {
function push (line 24) | pub fn push(&self, item: T) {
function any (line 28) | pub fn any(&self, f: impl FnMut(&T) -> bool) -> bool {
function for_each (line 32) | pub fn for_each<F>(&self, f: F)
function map (line 39) | pub fn map<F, R>(&self, f: F) -> Vec<R>
function retain (line 46) | pub fn retain<F>(&self, f: F)
function clear (line 53) | pub fn clear(&self) {
function drain (line 57) | pub fn drain(&self) -> Vec<T> {
function replace (line 61) | pub fn replace(&self, value: Vec<T>) {
function sort_by (line 65) | pub fn sort_by<F>(&self, compare: F)
function to_vec (line 74) | pub fn to_vec(&self) -> Vec<T> {
function find (line 78) | pub fn find(&self, f: impl Fn(&T) -> bool) -> Option<T> {
function from (line 90) | fn from(value: Vec<T>) -> Self {
method default (line 96) | fn default() -> Self {
FILE: src/background/utils/lock_free/traced_mutex.rs
type TracedMutex (line 9) | pub struct TracedMutex<T> {
function new (line 16) | pub fn new(value: T) -> Self {
function lock (line 35) | pub fn lock<'a>(&'a self) -> MutexGuard<'a, T> {
method default (line 63) | fn default() -> Self {
function fmt (line 70) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: src/background/utils/mod.rs
function atomic_write_file (line 34) | pub fn atomic_write_file(path: &Path, content: &[u8]) -> Result<()> {
function pcwstr (line 48) | pub fn pcwstr(s: &str) -> windows::core::PCWSTR {
function sleep_millis (line 52) | pub fn sleep_millis(millis: u64) {
function resolve_guid_path (line 60) | pub fn resolve_guid_path<S: AsRef<str>>(path: S) -> Result<PathBuf> {
type PerformanceHelper (line 133) | pub struct PerformanceHelper {
method start (line 138) | pub fn start(&mut self, name: &str) {
method elapsed (line 143) | pub fn elapsed(&self, name: &str) -> Duration {
method end (line 147) | pub fn end(&mut self, name: &str) {
function spawn_named_thread (line 154) | pub fn spawn_named_thread<F, T>(id: &str, cb: F) -> std::thread::JoinHan...
function convert_file_to_src (line 170) | pub fn convert_file_to_src(path: &Path) -> String {
function now_timestamp_as_millis (line 184) | pub fn now_timestamp_as_millis() -> u64 {
function date_based_hex_id (line 192) | pub fn date_based_hex_id() -> String {
function get_parts_of_inline_command (line 200) | pub fn get_parts_of_inline_command(cmd: &str) -> (String, Option<String>) {
FILE: src/background/utils/pwsh.rs
constant PWSH_COMMON_ARGS (line 9) | const PWSH_COMMON_ARGS: [&str; 7] = [
type PwshScript (line 19) | pub struct PwshScript {
method new (line 37) | pub fn new<S: Into<String>>(contents: S) -> Self {
method inline_command (line 45) | pub fn inline_command(mut self) -> Self {
method elevated (line 51) | pub fn elevated(mut self) -> Self {
method build_args (line 56) | fn build_args(&self, script_path_str: &str) -> Vec<String> {
method execute (line 88) | pub async fn execute(&self) -> Result<String> {
type PwshExecutionMode (line 25) | pub enum PwshExecutionMode {
FILE: src/background/utils/updater.rs
function check_for_updates (line 14) | pub async fn check_for_updates() -> Result<Option<Update>> {
function trace_update_intallation (line 53) | pub async fn trace_update_intallation(update: Update) -> Result<()> {
FILE: src/background/utils/virtual_desktop.rs
type RegistryVirtualDesktopManager (line 8) | pub struct RegistryVirtualDesktopManager {}
method get_virtual_desktops_folder (line 61) | fn get_virtual_desktops_folder() -> Result<RegKey> {
method enum_virtual_desktops (line 71) | pub fn enum_virtual_desktops() -> Result<Vec<RegistryVirtualDesktop>> {
method current_virtual_desktops (line 81) | pub fn current_virtual_desktops() -> Result<RegistryVirtualDesktop> {
type RegistryVirtualDesktop (line 11) | pub struct RegistryVirtualDesktop {
method from (line 18) | fn from(guid: GUID) -> Self {
method from (line 34) | fn from(id: Vec<u8>) -> Self {
method id (line 50) | pub fn id(&self) -> String {
method guid (line 54) | pub fn guid(&self) -> GUID {
FILE: src/background/utils/winver.rs
function is_windows_10 (line 5) | pub fn is_windows_10() -> bool {
function is_windows_11 (line 10) | pub fn is_windows_11() -> bool {
function has_fixed_runtime (line 14) | pub fn has_fixed_runtime() -> bool {
function get_fixed_runtime_path (line 18) | pub fn get_fixed_runtime_path() -> Option<PathBuf> {
function is_running_as_appx (line 30) | pub fn is_running_as_appx() -> bool {
function was_installed_using_msix (line 40) | pub fn was_installed_using_msix() -> bool {
FILE: src/background/virtual_desktops/cli.rs
type VirtualDesktopCli (line 12) | pub struct VirtualDesktopCli {
method process (line 47) | pub fn process(self) -> Result<()> {
type VdCommand (line 18) | pub enum VdCommand {
method process (line 53) | pub fn process(self) -> Result<()> {
FILE: src/background/virtual_desktops/events.rs
type VirtualDesktopEvent (line 5) | pub enum VirtualDesktopEvent {
FILE: src/background/virtual_desktops/handlers.rs
function get_vd_manager (line 15) | fn get_vd_manager() -> &'static SluWorkspacesManager2 {
function get_virtual_desktops (line 28) | pub fn get_virtual_desktops() -> VirtualDesktops {
function switch_workspace (line 33) | pub fn switch_workspace(workspace_id: seelen_core::state::WorkspaceId) -...
function create_workspace (line 40) | pub fn create_workspace(monitor_id: MonitorId) -> Result<seelen_core::st...
function destroy_workspace (line 48) | pub fn destroy_workspace(workspace_id: seelen_core::state::WorkspaceId) ...
function rename_workspace (line 55) | pub fn rename_workspace(
function wallpaper_next (line 65) | pub fn wallpaper_next() {
function wallpaper_prev (line 70) | pub fn wallpaper_prev() {
function wallpaper_save_thumbnail (line 75) | pub fn wallpaper_save_thumbnail(wallpaper_id: WallpaperId, thumbnail_byt...
FILE: src/background/virtual_desktops/mod.rs
type SluWorkspacesManager2 (line 36) | pub struct SluWorkspacesManager2 {
method instance (line 45) | pub fn instance() -> &'static Self {
method load_stored (line 49) | fn load_stored() -> Result<VirtualDesktops> {
method request_save (line 56) | fn request_save(&self) {
method create (line 78) | fn create() -> Self {
method initialize (line 95) | fn initialize(&mut self) -> Result<()> {
method on_win_event (line 168) | fn on_win_event(event: WinEvent, window: Window) -> Result<()> {
method for_each_workspace (line 229) | pub fn for_each_workspace<F: Fn(&mut DesktopWorkspace)>(&mut self, f: ...
method get_monitor_of_workspace (line 237) | pub fn get_monitor_of_workspace(&self, workspace_id: &WorkspaceId) -> ...
method is_pinned (line 243) | pub fn is_pinned(&self, window_id: &isize) -> bool {
method contains (line 247) | fn contains(&self, window: &Window) -> bool {
method add_to_current_workspace (line 259) | fn add_to_current_workspace(&self, window: &Window) {
method remove (line 302) | fn remove(&self, window: &Window) {
method switch_to_id (line 321) | pub fn switch_to_id(&self, monitor_id: &MonitorId, workspace_id: &Work...
method switch_to (line 349) | pub fn switch_to(&self, monitor_id: &MonitorId, index: usize) -> Resul...
method send_to (line 364) | pub fn send_to(&self, window: &Window, workspace_id: &WorkspaceId) -> ...
method create_desktop (line 403) | pub fn create_desktop(&self, monitor_id: &MonitorId) -> Result<Workspa...
method destroy_desktop (line 420) | pub fn destroy_desktop(
method rename_desktop (line 446) | pub fn rename_desktop(
method from (line 463) | fn from(value: VirtualDesktops) -> Self {
method from (line 480) | fn from(value: &SluWorkspacesManager2) -> Self {
type DesktopWorkspaceExt (line 488) | pub trait DesktopWorkspaceExt {
method hide (line 489) | fn hide(&self, force: bool);
method restore (line 490) | fn restore(&self);
method hide (line 494) | fn hide(&self, force: bool) {
method restore (line 505) | fn restore(&self) {
FILE: src/background/virtual_desktops/wallpapers.rs
type ChangeDirection (line 29) | enum ChangeDirection {
type WorkspaceWallpapersManager (line 34) | pub struct WorkspaceWallpapersManager;
method init (line 36) | pub fn init(manager: &super::SluWorkspacesManager2) {
method on_settings_changed (line 56) | fn on_settings_changed() {
method get_collection_id (line 64) | fn get_collection_id(monitor_id: &MonitorId, workspace_id: &WorkspaceI...
method get_collection (line 86) | fn get_collection(collection_id: &Uuid) -> Option<WallpaperCollection> {
method get_current_wallpaper (line 97) | pub fn get_current_wallpaper(
method increment_collection_index (line 116) | fn increment_collection_index(collection_id: &Uuid, direction: ChangeD...
method update_all_wallpapers (line 158) | fn update_all_wallpapers(direction: ChangeDirection) {
method update_workspace_wallpapers_internal (line 196) | pub(super) fn update_workspace_wallpapers_internal(vd_manager: &super:...
method get_interval_duration (line 206) | fn get_interval_duration() -> Duration {
method rotation_loop (line 213) | async fn rotation_loop(mut rx: mpsc::UnboundedReceiver<ChangeDirection...
method next (line 234) | pub fn next() {
method previous (line 243) | pub fn previous() {
FILE: src/background/widgets/cli.rs
type WidgetCli (line 7) | pub struct WidgetCli {
method run (line 19) | pub fn run(&self) -> Result<()> {
type WidgetCommand (line 13) | enum WidgetCommand {
FILE: src/background/widgets/loader.rs
constant LIVENESS_PROVE_INTERVAL (line 21) | const LIVENESS_PROVE_INTERVAL: Duration = Duration::from_secs(5);
constant LIVENESS_PROVE_WAIT_TIMEOUT (line 22) | const LIVENESS_PROVE_WAIT_TIMEOUT: Duration = Duration::from_secs(2);
constant LIVENESS_PROVE_MAX_RETRIES (line 23) | const LIVENESS_PROVE_MAX_RETRIES: u8 = 5;
type InstanceType (line 26) | pub enum InstanceType {
type WidgetContainer (line 33) | pub struct WidgetContainer {
method create (line 39) | pub fn create(widget: Arc<Widget>) -> Self {
method start_all_webviews (line 67) | pub fn start_all_webviews(&self) {
method start_webview (line 73) | pub fn start_webview(&self, label: &WidgetWebviewLabel) {
method create_runtime_instance (line 79) | pub fn create_runtime_instance(&self, instance_id: &Uuid) {
type WidgetInstance (line 90) | pub struct WidgetInstance {
method create (line 101) | fn create(
method status (line 119) | pub fn status(&self) -> &WidgetStatus {
method set_status (line 123) | pub fn set_status(&mut self, status: WidgetStatus) {
method is_ready (line 128) | pub fn is_ready(&self) -> bool {
method start_webview (line 132) | fn start_webview(&mut self, definition: &Widget) {
method drop (line 229) | fn drop(&mut self) {
FILE: src/background/widgets/manager.rs
type WidgetManager (line 18) | pub struct WidgetManager {
method create (line 24) | fn create() -> Self {
method is_ready (line 30) | pub fn is_ready(&self, label: &WidgetWebviewLabel) -> bool {
method set_status (line 38) | pub fn set_status(&self, label: &WidgetWebviewLabel, status: WidgetSta...
method refresh (line 46) | pub fn refresh(&self) -> Result<()> {
FILE: src/background/widgets/mod.rs
function set_current_widget_status (line 43) | pub fn set_current_widget_status(
function trigger_widget (line 57) | pub fn trigger_widget(mut payload: WidgetTriggerPayload) -> Result<()> {
function trigger_context_menu (line 115) | pub fn trigger_context_menu(
function get_self_window_handle (line 137) | pub fn get_self_window_handle(webview: tauri::WebviewWindow) -> Result<i...
function set_self_position (line 142) | pub fn set_self_position(webview: tauri::WebviewWindow, rect: Rect) -> R...
function bring_self_to_top (line 171) | pub fn bring_self_to_top(webview: tauri::WebviewWindow) -> Result<()> {
function show_settings (line 177) | pub fn show_settings() -> Result<()> {
function show_start_menu (line 182) | pub fn show_start_menu() -> Result<()> {
function write_data_file (line 193) | pub fn write_data_file(
function read_data_file (line 205) | pub fn read_data_file(webview: tauri::WebviewWindow, filename: String) -...
function widget_data_dir (line 211) | fn widget_data_dir(webview: &tauri::WebviewWindow) -> Result<PathBuf> {
function resolve_safe_path (line 225) | fn resolve_safe_path(base: &Path, filename: &str) -> Result<PathBuf> {
FILE: src/background/widgets/permissions.rs
type WidgetPerm (line 23) | pub enum WidgetPerm {
method i18n_label (line 29) | fn i18n_label(&self) -> String {
type WidgetPermState (line 40) | pub enum WidgetPermState {
type WidgetPermissions (line 46) | pub struct WidgetPermissions(HashMap<WidgetId, HashMap<WidgetPerm, Widge...
type PermissionsManager (line 52) | pub struct PermissionsManager {
method load (line 65) | fn load(path: PathBuf) -> Self {
method save (line 78) | fn save(&self) -> Result<()> {
method is_resolved (line 87) | fn is_resolved(&self, widget_id: &WidgetId, command: &WidgetPerm) -> O...
method persist_decision (line 96) | fn persist_decision(&self, widget_id: WidgetId, command: WidgetPerm, g...
method request (line 108) | pub fn request(&self, widget_id: &WidgetId, command: WidgetPerm) -> Re...
method decision_to_result (line 159) | fn decision_to_result(granted: bool, widget_id: &WidgetId, command: &W...
function request_widget_permission (line 179) | pub fn request_widget_permission(
function simulate_perm (line 191) | pub fn simulate_perm(widget_id: String, perm: WidgetPerm) -> Result<()> {
FILE: src/background/widgets/popups/cli.rs
type PopupsCli (line 7) | pub struct PopupsCli {
method process (line 33) | pub fn process(self) -> Result<()> {
type PopupsCommand (line 13) | pub enum PopupsCommand {
method process (line 39) | pub fn process(self) -> Result<()> {
FILE: src/background/widgets/popups/handlers.rs
function get_popup_config (line 9) | pub fn get_popup_config(instance_id: Uuid) -> Option<SluPopupConfig> {
function create_popup (line 14) | pub fn create_popup(config: SluPopupConfig) -> Result<Uuid> {
function update_popup (line 19) | pub fn update_popup(instance_id: Uuid, config: SluPopupConfig) -> Result...
function close_popup (line 25) | pub fn close_popup(instance_id: Uuid) -> Result<()> {
FILE: src/background/widgets/popups/mod.rs
type PopupsManager (line 29) | pub struct PopupsManager {
method get_window_handle (line 36) | pub fn get_window_handle(&self, id: &Uuid) -> Option<&WebviewWindow> {
method create (line 40) | pub fn create(&mut self, config: SluPopupConfig) -> Result<Uuid> {
method update (line 93) | pub fn update(&mut self, id: &Uuid, config: SluPopupConfig) -> Result<...
method close_popup (line 103) | pub fn close_popup(&mut self, id: &Uuid) -> Result<()> {
FILE: src/background/widgets/popups/shortcut_registering.rs
type RegShortcutData (line 18) | pub struct RegShortcutData {
method emit_state_to_requester (line 26) | fn emit_state_to_requester(&self) {
method cancel_shortcut_registering (line 32) | fn cancel_shortcut_registering(&mut self) {
function set_registering_shortcut (line 41) | pub fn set_registering_shortcut(shortcut: Option<Vec<String>>) -> Result...
function get_popup_config (line 78) | fn get_popup_config(shortcut: &[String]) -> SluPopupConfig {
FILE: src/background/widgets/task_switcher/cli.rs
type TaskSwitcherClient (line 6) | pub struct TaskSwitcherClient {
method process (line 12) | pub fn process(self) -> Result<()> {
type TaskSwitcherCommand (line 18) | pub enum TaskSwitcherCommand {
method process (line 30) | pub fn process(self) -> Result<()> {
FILE: src/background/widgets/toolbar/hook.rs
method process_win_event (line 6) | pub fn process_win_event(&mut self, event: WinEvent, origin: &Window) ->...
FILE: src/background/widgets/toolbar/mod.rs
type FancyToolbar (line 19) | pub struct FancyToolbar {
method hwnd (line 35) | pub fn hwnd(&self) -> Result<HWND> {
method new (line 39) | pub fn new(monitor_id: &str) -> Result<Self> {
constant TITLE (line 49) | pub const TITLE: &'static str = "Seelen Fancy Toolbar";
constant TARGET (line 50) | pub const TARGET: &'static str = "@seelen/fancy-toolbar";
method decoded_label (line 52) | pub fn decoded_label(monitor_id: &str) -> String {
method label (line 56) | pub fn label(monitor_id: &str) -> String {
method create_window (line 60) | fn create_window(monitor_id: &str) -> Result<WebviewWindow> {
method get_toolbar_height_on_monitor (line 89) | pub fn get_toolbar_height_on_monitor(monitor: &Monitor) -> Result<i32> {
method set_position (line 96) | pub fn set_position(&mut self, monitor: &Monitor) -> Result<()> {
method reposition_if_needed (line 133) | pub fn reposition_if_needed(&mut self) -> Result<()> {
method drop (line 25) | fn drop(&mut self) {
FILE: src/background/widgets/wallpaper_manager/cli.rs
type WallpaperCli (line 5) | pub struct WallpaperCli {
method process (line 19) | pub fn process(self) -> Result<()> {
type WallpaperCommand (line 11) | enum WallpaperCommand {
FILE: src/background/widgets/wallpaper_manager/hook.rs
method process_win_event (line 6) | pub fn process_win_event(&mut self, _event: WinEvent, _origin: &Window) ...
FILE: src/background/widgets/wallpaper_manager/mod.rs
type DesktopInfo (line 25) | struct DesktopInfo {
type SeelenWall (line 32) | pub struct SeelenWall {
constant TITLE (line 44) | pub const TITLE: &str = "Seelen Wall";
constant TARGET (line 45) | const TARGET: &str = "@seelen/wallpaper-manager";
method new (line 47) | pub fn new() -> Result<Self> {
method create_window (line 54) | fn create_window() -> Result<WebviewWindow> {
method hwnd (line 94) | pub fn hwnd(&self) -> Result<HWND> {
method update_position (line 98) | pub fn update_position(&self) -> Result<()> {
method setup_desktop_layer (line 134) | fn setup_desktop_layer() -> Result<()> {
method detect_desktop_info (line 143) | fn detect_desktop_info() -> Result<DesktopInfo> {
method attach_to_desktop (line 209) | fn attach_to_desktop(hwnd: HWND, desktop_info: &DesktopInfo) -> Result...
method attach_standard_desktop (line 218) | fn attach_standard_desktop(hwnd: HWND, desktop_info: &DesktopInfo) -> ...
method attach_raised_desktop (line 246) | fn attach_raised_desktop(hwnd: HWND, desktop_info: &DesktopInfo) -> Re...
method ensure_workerw_z_order (line 290) | fn ensure_workerw_z_order(worker_w: HWND) -> Result<()> {
method try_set_under_desktop_items (line 306) | fn try_set_under_desktop_items(hwnd: HWND) -> Result<()> {
method refresh_desktop (line 320) | fn refresh_desktop() -> Result<()> {
method drop (line 37) | fn drop(&mut self) {
FILE: src/background/widgets/webview.rs
type WidgetWebview (line 14) | pub struct WidgetWebview(pub tauri::WebviewWindow);
method create (line 17) | pub fn create(widget: &Widget, label: &WidgetWebviewLabel) -> Result<S...
method drop (line 60) | fn drop(&mut self) {
type WidgetWebviewLabel (line 68) | pub struct WidgetWebviewLabel {
method new (line 78) | pub fn new(
method try_from_raw (line 111) | pub fn try_from_raw(raw: &str) -> Result<Self> {
method fmt (line 125) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type WebviewArgs (line 132) | pub struct WebviewArgs {
constant BASE_ARGS (line 138) | const BASE_ARGS: &[&str] = &[
constant PERFORMANCE_ARGS (line 149) | const PERFORMANCE_ARGS: &[&str] = &[
method data_directory (line 156) | pub fn data_directory(&self) -> PathBuf {
method fmt (line 187) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method default (line 168) | fn default() -> Self {
FILE: src/background/widgets/weg/cli.rs
function get_windows_for_item (line 23) | fn get_windows_for_item<'a>(
type WegCli (line 58) | pub struct WegCli {
method process (line 73) | pub fn process(self) -> Result<()> {
type WegCommand (line 64) | pub enum WegCommand {
FILE: src/background/widgets/weg/handler.rs
function weg_close_app (line 14) | pub fn weg_close_app(hwnd: isize) -> Result<()> {
function weg_kill_app (line 21) | pub fn weg_kill_app(hwnd: isize) -> Result<()> {
function weg_toggle_window_state (line 32) | pub fn weg_toggle_window_state(hwnd: isize, was_focused: bool) -> Result...
function weg_pin_item (line 47) | pub fn weg_pin_item(path: PathBuf) -> Result<()> {
FILE: src/background/widgets/weg/hook.rs
method process_individual_win_event (line 18) | pub fn process_individual_win_event(&mut self, event: WinEvent, origin: ...
method process_raw_win_event (line 26) | pub fn process_raw_win_event(event: u32, origin_hwnd: HWND) -> Result<()> {
FILE: src/background/widgets/weg/instance.rs
type SeelenWeg (line 18) | pub struct SeelenWeg {
constant TITLE (line 37) | pub const TITLE: &'static str = "SeelenWeg";
constant TARGET (line 38) | pub const TARGET: &'static str = "@seelen/weg";
method hwnd (line 40) | pub fn hwnd(&self) -> Result<HWND> {
method create_window (line 44) | fn create_window(monitor_id: &str) -> Result<WebviewWindow> {
method new (line 76) | pub fn new(monitor_id: &str) -> Result<Self> {
method get_weg_size_on_monitor (line 86) | pub fn get_weg_size_on_monitor(monitor: &Monitor) -> Result<i32> {
method set_position (line 93) | pub fn set_position(&mut self, monitor: &Monitor) -> Result<()> {
method reposition_if_needed (line 156) | pub fn reposition_if_needed(&mut self) -> Result<()> {
method drop (line 27) | fn drop(&mut self) {
FILE: src/background/widgets/weg/mod.rs
function get_taskbars_handles (line 28) | pub fn get_taskbars_handles() -> Result<Vec<HWND>> {
method hide_native_taskbar (line 39) | pub fn hide_native_taskbar() -> JoinHandle<()> {
method restore_native_taskbar (line 57) | pub fn restore_native_taskbar() -> Result<()> {
FILE: src/background/widgets/window_manager/cli.rs
type AllowedReservations (line 15) | pub enum AllowedReservations {
type NodeSiblingSide (line 25) | pub enum NodeSiblingSide {
type Sizing (line 33) | pub enum Sizing {
type StepWay (line 39) | pub enum StepWay {
type Axis (line 45) | pub enum Axis {
type WindowManagerCli (line 57) | pub struct WindowManagerCli {
method process (line 103) | pub fn process(self) -> Result<()> {
type WmCommand (line 63) | pub enum WmCommand {
method process (line 109) | pub fn process(self) -> Result<()> {
FILE: src/background/widgets/window_manager/handler.rs
function schedule_window_position (line 26) | pub fn schedule_window_position(window: isize, rect: Rect) {
function set_app_windows_positions (line 31) | pub fn set_app_windows_positions(positions: HashMap<isize, Rect>) -> Res...
function request_focus (line 84) | pub fn request_focus(hwnd: isize) -> Result<()> {
function wm_get_render_tree (line 94) | pub fn wm_get_render_tree() -> WmRenderTree {
FILE: src/background/widgets/window_manager/hook.rs
method system_move_size_end (line 19) | fn system_move_size_end(window: &Window) -> Result<()> {
method synthetic_foreground_location_change (line 82) | fn synthetic_foreground_location_change(window: &Window) -> Result<()> {
method process_win_event (line 113) | pub fn process_win_event(event: WinEvent, window: &Window) -> Result<()> {
FILE: src/background/widgets/window_manager/instance.rs
type WindowManagerV2 (line 18) | pub struct WindowManagerV2 {
constant TITLE (line 30) | pub const TITLE: &'static str = "Seelen Window Manager";
constant TARGET (line 31) | pub const TARGET: &'static str = "@seelen/window-manager";
method new (line 33) | pub fn new(monitor_id: &MonitorId) -> Result<Self> {
method hwnd (line 39) | pub fn hwnd(&self) -> Result<HWND> {
method create_window (line 43) | fn create_window(monitor_id: &MonitorId) -> Result<WebviewWindow> {
method set_position (line 75) | pub fn set_position(&self, monitor: &Monitor) -> Result<()> {
method drop (line 23) | fn drop(&mut self) {
FILE: src/background/widgets/window_manager/mod.rs
method should_be_managed (line 22) | fn should_be_managed(hwnd: HWND) -> bool {
method force_retiling (line 57) | pub fn force_retiling() -> Result<()> {
FILE: src/background/widgets/window_manager/state/mod.rs
type WmState (line 44) | pub struct WmState {
method get_render_tree (line 56) | pub fn get_render_tree(&self) -> WmRenderTree {
method initialize (line 69) | pub fn initialize(&mut self) {
method process_vd_event (line 89) | pub fn process_vd_event(&mut self, event: &VirtualDesktopEvent) -> Res...
method add (line 119) | pub fn add(&mut self, window: &Window) -> Result<()> {
method remove (line 126) | pub fn remove(&mut self, window: &Window) -> Result<()> {
method is_managed (line 136) | pub fn is_managed(&self, window: &Window) -> bool {
method is_tiled (line 140) | pub fn is_tiled(&self, window: &Window) -> bool {
method get_workspace_state (line 144) | pub fn get_workspace_state(&mut self, workspace: &WorkspaceId) -> &mut...
method get_workspace_state_for_window (line 150) | pub fn get_workspace_state_for_window(
method update_size (line 180) | pub fn update_size(
type WmStateEvent (line 49) | pub enum WmStateEvent {
type WmWorkspaceState (line 286) | pub struct WmWorkspaceState {
method new (line 293) | pub fn new(workspace_id: &WorkspaceId) -> Self {
method set_rect_to_float_initial_size (line 303) | pub fn set_rect_to_float_initial_size(window: &Window) -> Result<()> {
method add_to_floats (line 331) | pub fn add_to_floats(&mut self, window: &Window) -> Result<()> {
method add_to_tiles (line 345) | pub fn add_to_tiles(&mut self, window: &Window) {
method unmanage (line 361) | pub fn unmanage(&mut self, window: &Window) {
method is_floating (line 372) | pub fn is_floating(&self, window_id: &isize) -> bool {
method is_tiled (line 376) | pub fn is_tiled(&self, window: &Window) -> bool {
method is_managed (line 380) | pub fn is_managed(&self, window: &Window) -> bool {
method swap_nodes_containing_window (line 384) | pub fn swap_nodes_containing_window(&mut self, a: &Window, b: &Window)...
method trace (line 408) | pub fn trace(&self, window: &Window) -> Vec<&WmNode> {
method get_node_at_point (line 413) | pub fn get_node_at_point(&self, point: &Point) -> Option<&WmNode> {
method get_nearest_node_to_rect (line 417) | pub fn get_nearest_node_to_rect(&self, rect: &Rect) -> Option<&WmNode> {
method toggle_monocle (line 425) | pub fn toggle_monocle(&mut self) {
FILE: src/background/widgets/window_manager/state/node_ext.rs
type WmNodeExt (line 15) | pub trait WmNodeExt {
method is_enabled (line 17) | fn is_enabled(&self, context: &HashMapContext) -> bool;
method drain (line 20) | fn drain(&mut self) -> Vec<isize>;
method trace (line 22) | fn trace(&self, window: &Window) -> Vec<&Self>;
method get_node_at_point (line 24) | fn get_node_at_point(&self, point: &Point) -> Result<Option<&Self>>;
method get_nearest_node_to_rect (line 25) | fn get_nearest_node_to_rect(&self, rect: &Rect) -> Result<Option<(&Sel...
method get_siblings_at_side (line 28) | fn get_siblings_at_side(&self, window: &Window, side: &NodeSiblingSide...
method contains (line 31) | fn contains(&self, window: &Window) -> bool;
method leaf_containing (line 32) | fn leaf_containing(&self, window: &Window) -> Option<&Self>;
method leaf_containing_mut (line 33) | fn leaf_containing_mut(&mut self, window: &Window) -> Option<&mut Self>;
method try_add_window (line 36) | fn try_add_window(&mut self, window: &Window, context: &HashMapContext...
method add_window (line 37) | fn add_window(&mut self, window: &Window) -> Vec<isize>;
method remove_window (line 38) | fn remove_window(&mut self, window: &Window) -> Vec<isize>;
method face (line 41) | fn face(&self) -> Option<Window>;
method process_stacks (line 43) | fn process_stacks(&self) -> Result<()>;
method is_enabled (line 55) | fn is_enabled(&self, context: &HashMapContext) -> bool {
method drain (line 65) | fn drain(&mut self) -> Vec<isize> {
method contains (line 75) | fn contains(&self, window: &Window) -> bool {
method leaf_containing (line 79) | fn leaf_containing(&self, window: &Window) -> Option<&Self> {
method leaf_containing_mut (line 97) | fn leaf_containing_mut<'a>(&'a mut self, window: &Window) -> Option<&'...
method trace (line 115) | fn trace(&self, window: &Window) -> Vec<&Self> {
method get_siblings_at_side (line 137) | fn get_siblings_at_side(&self, window: &Window, side: &NodeSiblingSide...
method try_add_window (line 180) | fn try_add_window(&mut self, window: &Window, context: &HashMapContext...
method add_window (line 223) | fn add_window(&mut self, window: &Window) -> Vec<isize> {
method remove_window (line 247) | fn remove_window(&mut self, window: &Window) -> Vec<isize> {
method face (line 271) | fn face(&self) -> Option<Window> {
method get_node_at_point (line 293) | fn get_node_at_point(&self, point: &Point) -> Result<Option<&Self>> {
method get_nearest_node_to_rect (line 321) | fn get_nearest_node_to_rect(&self, rect: &Rect) -> Result<Option<(&Sel...
method process_stacks (line 363) | fn process_stacks(&self) -> Result<()> {
function create_context (line 46) | fn create_context(len: usize, is_reindexing: bool) -> HashMapContext {
FILE: src/background/windows_api/app_bar.rs
type AppBarDataEdge (line 19) | pub enum AppBarDataEdge {
method from (line 27) | fn from(val: SeelenWegSide) -> Self {
method from (line 38) | fn from(val: FancyToolbarSide) -> Self {
type AppBarDataState (line 48) | pub enum AppBarDataState {
method from (line 62) | fn from(state: u32) -> Self {
method from (line 56) | fn from(val: AppBarDataState) -> Self {
type AppBarData (line 73) | pub struct AppBarData(pub APPBARDATA);
method from_handle (line 77) | pub fn from_handle(hwnd: HWND) -> Self {
method set_state (line 85) | pub fn set_state(&self, state: AppBarDataState) {
method set_edge (line 91) | pub fn set_edge(&mut self, edge: AppBarDataEdge) {
method set_rect (line 95) | pub fn set_rect(&mut self, rect: RECT) {
method register_as_new_bar (line 99) | pub fn register_as_new_bar(&mut self) {
method unregister_bar (line 110) | pub fn unregister_bar(&mut self) {
FILE: src/background/windows_api/com.rs
type Com (line 9) | pub struct Com {}
method initialize (line 11) | fn initialize() -> Result<()> {
method create_instance (line 19) | pub fn create_instance<T>(class_id: &GUID) -> Result<T>
method uninitialize (line 27) | fn uninitialize() {
method run_with_context (line 32) | pub fn run_with_context<F, T>(f: F) -> Result<T>
FILE: src/background/windows_api/devices.rs
type DeviceId (line 14) | pub type DeviceId = String;
type DeviceEvent (line 18) | pub enum DeviceEvent {
type DeviceChangeCallback (line 24) | type DeviceChangeCallback = Arc<dyn Fn(DeviceEvent) + Send + Sync + 'sta...
type DeviceEnumerator (line 33) | pub struct DeviceEnumerator {
method new (line 67) | pub fn new<F>(query: impl Into<String>, callback: F) -> Result<Self>
method start_blocking (line 183) | pub fn start_blocking(&self) -> Result<Vec<DeviceInformation>> {
method start (line 196) | pub fn start(&self) -> Result<()> {
method drop (line 204) | fn drop(&mut self) {
FILE: src/background/windows_api/event_window.rs
constant HSHELL_FULLSCREEN_ENTER (line 33) | pub const HSHELL_FULLSCREEN_ENTER: u32 = 53;
constant HSHELL_FULLSCREEN_EXIT (line 34) | pub const HSHELL_FULLSCREEN_EXIT: u32 = 54;
constant WM_TRASH_BIN_NOTIFY (line 39) | pub const WM_TRASH_BIN_NOTIFY: u32 = WM_APP + 100;
constant CSIDL_BITBUCKET (line 42) | const CSIDL_BITBUCKET: i32 = 0x000a;
constant SHCNRF_SHELL_LEVEL (line 44) | const SHCNRF_SHELL_LEVEL: SHCNRF_SOURCE = SHCNRF_SOURCE(0x0002);
constant SHCNE_ALL_EVENTS (line 46) | const SHCNE_ALL_EVENTS: i32 = 0x7FFFFFFF_u32 as i32;
type BgWindowProc (line 52) | pub struct BgWindowProc {}
method _create_background_window (line 58) | unsafe fn _create_background_window(done: &crossbeam_channel::Sender<(...
method window_proc (line 121) | unsafe extern "system" fn window_proc(
function register_shell_notifications (line 157) | unsafe fn register_shell_notifications(hwnd: HWND) {
function create_background_window (line 178) | pub fn create_background_window() -> Result<()> {
function subscribe_to_background_window (line 189) | pub fn subscribe_to_background_window<F>(callback: F)
FILE: src/background/windows_api/hdc.rs
type DeviceContext (line 10) | pub struct DeviceContext {
method create (line 22) | pub fn create(window: Option<HWND>) -> DeviceContext {
method get_pixel (line 29) | pub fn get_pixel(&self, x: i32, y: i32) -> Color {
method drop (line 16) | fn drop(&mut self) {
FILE: src/background/windows_api/input.rs
constant VIRTUAL_KEYS (line 20) | const VIRTUAL_KEYS: phf::Map<&'static str, VIRTUAL_KEY> = phf_map! {
constant HOLD_KEYS (line 36) | const HOLD_KEYS: phf::Set<&'static str> = phf_set! {
constant KEYEVENTF_KEYDOWN (line 43) | const KEYEVENTF_KEYDOWN: KEYBD_EVENT_FLAGS = KEYBD_EVENT_FLAGS(0);
type InputItem (line 46) | enum InputItem {
method is_holdkey (line 53) | fn is_holdkey(&self) -> bool {
type Input (line 59) | struct Input {
method new (line 65) | fn new() -> Self {
method has_holdkey (line 72) | fn has_holdkey(&self) -> bool {
method has_items (line 76) | fn has_items(&self) -> bool {
method is_holdkey_only (line 80) | fn is_holdkey_only(&self) -> bool {
method push (line 84) | fn push(&mut self, item: InputItem) {
method push_all (line 94) | fn push_all(&mut self, items: &Vec<InputItem>) {
method create_inputs (line 100) | fn create_inputs(&self) -> Result<Vec<INPUT>> {
method create_virtual_key (line 134) | fn create_virtual_key(key: VIRTUAL_KEY, flags: KEYBD_EVENT_FLAGS) -> I...
method create_char_key (line 149) | fn create_char_key(ch: u16, hold_mode: bool) -> Vec<INPUT> {
function parse_input (line 283) | fn parse_input(expression: &str) -> Result<Vec<Input>> {
function next_input (line 307) | fn next_input(expr: &mut Chars<'_>) -> Result<Option<(Vec<InputItem>, bo...
function read_special_item (line 326) | fn read_special_item(expr: &mut Chars<'_>) -> Result<InputItem> {
function read_group_items (line 358) | fn read_group_items(expr: &mut Chars<'_>) -> Result<Vec<InputItem>> {
type Keyboard (line 380) | pub struct Keyboard {
method new (line 388) | pub fn new() -> Self {
method interval (line 398) | pub fn interval(mut self, interval: u64) -> Self {
method send_keys (line 410) | pub fn send_keys(&self, keys: &str) -> Result<()> {
method begin_hold_keys (line 424) | pub fn begin_hold_keys(&mut self, keys: &str) -> Result<()> {
method end_hold_keys (line 453) | pub fn end_hold_keys(&mut self) -> Result<()> {
method send_keyboard (line 484) | fn send_keyboard(&self, input_keys: &[INPUT]) -> Result<()> {
method wait (line 500) | fn wait(&self) {
method drop (line 508) | fn drop(&mut self) {
type Mouse (line 524) | pub struct Mouse {
method new (line 545) | pub fn new() -> Self {
method interval (line 552) | pub fn interval(mut self, interval: u64) -> Self {
method move_time (line 558) | pub fn move_time(mut self, move_time: u64) -> Self {
method auto_move (line 564) | pub fn auto_move(mut self, auto_move: bool) -> Self {
method holdkeys (line 572) | pub fn holdkeys(mut self, holdkeys: &str) -> Self {
method get_cursor_pos (line 590) | pub fn get_cursor_pos() -> Result<Point> {
method set_cursor_pos (line 597) | pub fn set_cursor_pos(pos: Point) -> Result<()> {
method move_to (line 614) | pub fn move_to(&self, target: &Point) -> Result<()> {
method click (line 652) | pub fn click(&self, pos: Point) -> Result<()> {
method double_click (line 675) | pub fn double_click(&self, pos: Point) -> Result<()> {
method right_click (line 705) | pub fn right_click(&self, pos: Point) -> Result<()> {
method before_click (line 718) | fn before_click(&self) -> Result<()> {
method after_click (line 728) | fn after_click(&self) -> Result<()> {
method mouse_event (line 738) | fn mouse_event(&self, x: i32, y: i32, flags: MOUSE_EVENT_FLAGS) -> Res...
method wait (line 758) | fn wait(&self) {
method default (line 532) | fn default() -> Self {
function get_screen_size (line 766) | pub fn get_screen_size() -> Result<(i32, i32)> {
function send_input (line 780) | fn send_input(inputs: &[INPUT]) -> Result<()> {
FILE: src/background/windows_api/iterator.rs
type WindowEnumerator (line 13) | pub struct WindowEnumerator {
method new (line 21) | pub fn new() -> Self {
method with_parent (line 25) | pub fn with_parent(mut self, parent: HWND) -> Self {
method enumerate (line 30) | fn enumerate(
method for_each (line 45) | pub fn for_each<F>(&self, cb: F) -> Result<()>
method for_each_and_descendants (line 62) | pub fn for_each_and_descendants<F>(&self, cb: F) -> Result<()>
method for_each_and_descendants_impl (line 70) | fn for_each_and_descendants_impl<F>(&self, cb: &mut F) -> Result<()>
method map (line 85) | pub fn map<F, T>(&self, cb: F) -> Result<Vec<T>>
type MonitorEnumerator (line 112) | pub struct MonitorEnumerator;
method enumerate_win32 (line 115) | pub fn enumerate_win32() -> Result<Vec<Monitor>> {
FILE: src/background/windows_api/mod.rs
type WindowsApi (line 150) | pub struct WindowsApi {}
method module_handle_w (line 152) | pub fn module_handle_w() -> Result<HMODULE> {
method enum_display_monitors (line 156) | pub fn enum_display_monitors(
method post_message (line 168) | pub fn post_message(hwnd: HWND, message: u32, wparam: usize, lparam: i...
method get_monitor_scale_factor (line 173) | pub fn get_monitor_scale_factor(hmonitor: HMONITOR) -> Result<f64> {
method get_text_scale_factor (line 181) | pub fn get_text_scale_factor() -> Result<f64> {
method window_thread_process_id (line 187) | pub fn window_thread_process_id(hwnd: HWND) -> (u32, u32) {
method find_window (line 197) | pub fn find_window(
method current_process (line 224) | pub fn current_process() -> HANDLE {
method current_process_id (line 228) | pub fn current_process_id() -> u32 {
method current_thread_id (line 233) | pub fn current_thread_id() -> u32 {
method current_session_id (line 237) | pub fn current_session_id() -> u32 {
method get_foreground_window (line 246) | pub fn get_foreground_window() -> HWND {
method is_window (line 256) | pub fn is_window(hwnd: HWND) -> bool {
method is_window_visible (line 260) | pub fn is_window_visible(hwnd: HWND) -> bool {
method is_iconic (line 264) | pub fn is_iconic(hwnd: HWND) -> bool {
method is_zoomed (line 268) | pub fn is_zoomed(hwnd: HWND) -> bool {
method is_fullscreen (line 272) | pub fn is_fullscreen(hwnd: HWND) -> Result<bool> {
method is_cloaked (line 286) | pub fn is_cloaked(hwnd: HWND) -> Result<bool> {
method show_window (line 304) | pub fn show_window(hwnd: HWND, command: SHOW_WINDOW_CMD) -> Result<()> {
method show_window_async (line 313) | pub fn show_window_async(hwnd: HWND, command: SHOW_WINDOW_CMD) -> Resu...
method get_styles (line 322) | pub fn get_styles(hwnd: HWND) -> WINDOW_STYLE {
method get_ex_styles (line 326) | pub fn get_ex_styles(hwnd: HWND) -> WINDOW_EX_STYLE {
method _set_position (line 330) | fn _set_position(
method set_position (line 354) | pub fn set_position(
method move_window (line 367) | pub fn move_window(hwnd: HWND, rect: &RECT) -> Result<()> {
method bring_to_top (line 371) | pub fn bring_to_top(hwnd: HWND) -> Result<()> {
method attach_thread_input (line 377) | pub fn attach_thread_input(thread_id: u32, attach_to: u32, attach: boo...
method set_foreground (line 382) | pub fn set_foreground(hwnd: HWND) -> Result<()> {
method open_process (line 404) | fn open_process(
method open_current_process_token (line 415) | pub fn open_current_process_token() -> Result<Owned<HANDLE>> {
method get_luid (line 431) | pub fn get_luid(system: PCWSTR, name: PCWSTR) -> Result<LUID> {
method enable_privilege (line 437) | pub fn enable_privilege(name: PCWSTR) -> Result<()> {
method get_parent (line 451) | pub fn get_parent(hwnd: HWND) -> Result<HWND> {
method get_owner (line 455) | pub fn get_owner(hwnd: HWND) -> Result<HWND> {
method get_desktop_window (line 459) | pub fn get_desktop_window() -> HWND {
method is_process_frozen (line 463) | pub fn is_process_frozen(process_id: u32) -> Result<bool> {
method exe_path_by_process (line 489) | pub fn exe_path_by_process(process_id: u32) -> Result<OsString> {
method get_class (line 498) | pub fn get_class(hwnd: HWND) -> Result<String> {
method get_shell_item (line 505) | pub fn get_shell_item(path: &Path) -> Result<IShellItem2> {
method get_property_store_for_window (line 511) | pub fn get_property_store_for_window(hwnd: HWND) -> Result<IPropertySt...
method get_window_app_user_model_id (line 516) | pub fn get_window_app_user_model_id(hwnd: HWND) -> Result<String> {
method get_window_prevent_pinning (line 525) | pub fn get_window_prevent_pinning(hwnd: HWND) -> Result<bool> {
method get_window_relaunch_command (line 535) | pub fn get_window_relaunch_command(hwnd: HWND) -> Result<String> {
method get_window_relaunch_display_name (line 545) | pub fn get_window_relaunch_display_name(hwnd: HWND) -> Result<String> {
method get_window_relaunch_icon_resource (line 555) | pub fn get_window_relaunch_icon_resource(hwnd: HWND) -> Result<String> {
method is_uwp_package_id (line 564) | pub fn is_uwp_package_id(package_id: &str) -> bool {
method get_uwp_app_info (line 568) | pub fn get_uwp_app_info(umid: &str) -> Result<AppInfo> {
method resolve_lnk_target (line 574) | pub fn resolve_lnk_target(lnk_path: &Path) -> Result<(PathBuf, OsStrin...
method resolve_lnk_custom_icon_path (line 598) | pub fn resolve_lnk_custom_icon_path(lnk_path: &Path) -> Result<(PathBu...
method resolve_indirect_string (line 626) | pub fn resolve_indirect_string(text: &str) -> Result<String> {
method resolve_environment_variables (line 635) | pub fn resolve_environment_variables(source: &WindowsString) -> Result...
method get_executable_display_name (line 642) | pub fn get_executable_display_name(path: &Path) -> Result<String> {
method get_file_umid (line 652) | pub fn get_file_umid(path: &Path) -> Result<String> {
method get_file_toast_activator (line 664) | pub fn get_file_toast_activator(path: &Path) -> Result<String> {
method get_window_text (line 680) | pub fn get_window_text(hwnd: HWND) -> String {
method dwm_get_window_attribute (line 687) | pub fn dwm_get_window_attribute<T>(
method get_outer_window_rect (line 704) | pub fn get_outer_window_rect(hwnd: HWND) -> Result<RECT> {
method get_window_thickness (line 710) | fn get_window_thickness(hwnd: HWND) -> u32 {
method get_inner_window_rect (line 722) | pub fn get_inner_window_rect(hwnd: HWND) -> Result<RECT> {
method monitor_from_window (line 740) | pub fn monitor_from_window(hwnd: HWND) -> HMONITOR {
method monitor_from_point (line 744) | pub fn monitor_from_point(point: &seelen_core::Point) -> HMONITOR {
method primary_monitor (line 756) | pub fn primary_monitor() -> HMONITOR {
method get_physical_monitors (line 760) | pub fn get_physical_monitors(monitor: HMONITOR) -> Result<Vec<PHYSICAL...
method virtual_screen_rect (line 772) | pub fn virtual_screen_rect() -> Result<RECT> {
method monitor_info (line 783) | pub fn monitor_info(hmonitor: HMONITOR) -> Result<MONITORINFOEXW> {
method monitor_rect (line 790) | pub fn monitor_rect(hmonitor: HMONITOR) -> Result<RECT> {
method shadow_rect (line 795) | pub fn shadow_rect(hwnd: HWND) -> Result<RECT> {
method _get_virtual_desktop_manager (line 806) | pub fn _get_virtual_desktop_manager() -> Result<IVirtualDesktopManager> {
method _get_virtual_desktop_id (line 810) | pub fn _get_virtual_desktop_id(hwnd: HWND) -> Result<GUID> {
method get_wallpaper (line 827) | pub fn get_wallpaper() -> Result<PathBuf> {
method refresh_desktop (line 844) | pub fn refresh_desktop() -> Result<()> {
method set_wallpaper (line 851) | pub fn set_wallpaper(path: String) -> Result<()> {
method exit_windows (line 869) | pub fn exit_windows(flags: EXIT_WINDOWS_FLAGS, reason: SHUTDOWN_REASON...
method set_suspend_state (line 876) | pub fn set_suspend_state(hibernate: bool) -> Result<()> {
method is_elevated (line 885) | pub fn is_elevated() -> Result<bool> {
method get_system_power_status (line 902) | pub fn get_system_power_status() -> Result<SYSTEM_POWER_STATUS> {
method stream_to_dynamic_image (line 910) | pub fn stream_to_dynamic_image(
method extract_thumbnail_from_stream (line 926) | pub fn extract_thumbnail_from_stream(
method extract_thumbnail_from_ref (line 935) | pub fn extract_thumbnail_from_ref(stream: IRandomAccessStreamReference...
method lock_machine (line 939) | pub fn lock_machine() -> Result<()> {
method get_username (line 944) | pub fn get_username(format: EXTENDED_NAME_FORMAT) -> Result<String> {
method get_computer_name (line 955) | pub fn get_computer_name(format: COMPUTER_NAME_FORMAT) -> Result<Strin...
method known_folder (line 962) | pub fn known_folder(folder_id: windows::core::GUID) -> Result<PathBuf> {
method known_folder_item (line 970) | pub fn known_folder_item(folder_id: windows::core::GUID) -> Result<()> {
method execute (line 1004) | pub fn execute(
FILE: src/background/windows_api/monitor/brightness.rs
type DdcciBrightnessValues (line 22) | pub struct DdcciBrightnessValues {
method get_file_handle (line 33) | fn get_file_handle(&self) -> Result<Owned<HANDLE>> {
method main_physical (line 55) | fn main_physical(&self) -> Result<PHYSICAL_MONITOR> {
method supports_ddcci (line 62) | pub fn supports_ddcci(&self) -> Result<bool> {
method ddcci_get_monitor_brightness (line 78) | pub fn ddcci_get_monitor_brightness(&self) -> Result<DdcciBrightnessValu...
method ddcci_set_monitor_brightness (line 93) | pub fn ddcci_set_monitor_brightness(&self, value: u32) -> Result<()> {
FILE: src/background/windows_api/monitor/mod.rs
type Monitor (line 26) | pub struct Monitor(HMONITOR);
method from (line 32) | fn from(hmonitor: HMONITOR) -> Self {
method from (line 38) | fn from(hmonitor: isize) -> Self {
method from (line 44) | fn from(point: &seelen_core::Point) -> Self {
method handle (line 53) | pub fn handle(&self) -> HMONITOR {
method primary (line 57) | pub fn primary() -> Monitor {
method is_primary (line 61) | pub fn is_primary(&self) -> bool {
method at_point (line 65) | pub fn at_point(point: &seelen_core::Point) -> Monitor {
method info (line 69) | pub fn info(&self) -> Result<MONITORINFOEXW> {
method get_stable_info (line 85) | pub fn get_stable_info(&self) -> Result<(MonitorId, String)> {
method stable_id (line 137) | pub fn stable_id(&self) -> Result<MonitorId> {
method friendly_name (line 141) | pub fn friendly_name(&self) -> Result<String> {
method rect (line 145) | pub fn rect(&self) -> Result<Rect> {
method scale_factor (line 155) | pub fn scale_factor(&self) -> Result<f64> {
type DisplayView (line 171) | pub struct DisplayView(WinRTDisplayView);
method as_win32_view (line 174) | pub fn as_win32_view(&self) -> Result<Monitor> {
method primary_target (line 215) | pub fn primary_target(&self) -> Result<MonitorTarget> {
met
Condensed preview — 1904 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,331K chars).
[
{
"path": ".cargo/config.toml",
"chars": 139,
"preview": "[env]\nSLU_SERVICE_CONNECTION_TOKEN = \"__local__\"\nTS_RS_EXPORT_DIR = \"./gen/types\"\nTS_RS_IMPORT_EXTENSION = \"ts\"\nTS_RS_LA"
},
{
"path": ".cert/Seelen.pfx.pwd",
"chars": 7,
"preview": "Seelen\n"
},
{
"path": ".cert/readme.md",
"chars": 811,
"preview": "# Self Signed Certificates\n\n## Creation\n\n```pwsh\nmsixherocli.exe newcert --directory .\\.cert --name Seelen --password Se"
},
{
"path": ".commitlintrc.yml",
"chars": 932,
"preview": "# commitlint.config.yml\nextends:\n - \"@commitlint/config-conventional\"\n\nrules:\n # Basic rules\n header-max-length: [2, "
},
{
"path": ".gitattributes",
"chars": 19,
"preview": "* text=auto eol=lf\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 96,
"preview": "github: [eythaann]\nko_fi: eythaann\npatreon: eythaann\ncustom:\n - https://www.paypal.me/eythaann\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 677,
"preview": "---\nname: Bug report 🐛\nabout: Create a report to help us improve\ntitle: \"[BUG] Short description of the issue\"\nlabels: b"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 648,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[FEAT] Include a pandora box\"\nlabels: enhancem"
},
{
"path": ".github/actions/generate-update-manifest/action.yml",
"chars": 5530,
"preview": "name: Generate Update Manifest\ndescription: Generates and uploads latest.json for Tauri updater\n\ninputs:\n release-id:\n "
},
{
"path": ".github/actions/setup/action.yml",
"chars": 1585,
"preview": "name: Setup Development Environment\ndescription: Sets up Node.js, Deno, and Rust toolchain with caching\n\ninputs:\n rust-"
},
{
"path": ".github/dependabot.yml",
"chars": 184,
"preview": "version: 2\nupdates:\n - package-ecosystem: npm\n directory: /\n schedule:\n interval: weekly\n - package-ecosyst"
},
{
"path": ".github/workflows/ci.yml",
"chars": 1031,
"preview": "name: Continuous Integration\n\non:\n pull_request:\n branches:\n - master\n workflow_dispatch:\n workflow_call:\n\njo"
},
{
"path": ".github/workflows/dependabot-automerge.yml",
"chars": 838,
"preview": "name: Dependabot auto-merge\n\non: pull_request_target\n\npermissions:\n contents: write\n pull-requests: write\n\njobs:\n aut"
},
{
"path": ".github/workflows/discord-notify.yml",
"chars": 2226,
"preview": "name: \"Discord Notify\"\n\non:\n workflow_dispatch:\n inputs:\n tag:\n description: \"Release tag to announce (e"
},
{
"path": ".github/workflows/msix.yml",
"chars": 2473,
"preview": "name: Pull MSIX from Store\n\npermissions:\n contents: write\n\non:\n schedule:\n - cron: \"0 0 * * *\" # Run the action eve"
},
{
"path": ".github/workflows/nightly.yml",
"chars": 10679,
"preview": "name: Nightly\n\non:\n push:\n branches:\n - master\n paths-ignore:\n - \"**.md\"\n - \"documentation/**\"\n "
},
{
"path": ".github/workflows/publish-core.yml",
"chars": 868,
"preview": "name: \"Publish Core Library\"\n\non:\n workflow_call:\n workflow_dispatch:\n\npermissions:\n contents: read\n id-token: write"
},
{
"path": ".github/workflows/release.yml",
"chars": 15081,
"preview": "name: \"Release\"\n\non:\n push:\n tags:\n - \"v[0-9]+.[0-9]+.[0-9]+\"\n workflow_dispatch:\n\npermissions:\n contents: wr"
},
{
"path": ".gitignore",
"chars": 153,
"preview": "node_modules\n\n.vscode\n.env\n\ndist\ntarget\ngen\nsrc/runtime\n\n# Submission Files\n/scripts/SBTemp\n\n# rust-analyzer\nrustc-ice-*"
},
{
"path": ".npmrc",
"chars": 31,
"preview": "message = \"chore(release): v%s\""
},
{
"path": "AGENTS.md",
"chars": 8190,
"preview": "# AGENTS.md\n\nGuidance for AI agents working in this repository.\n\nSeelen UI is a customizable Windows desktop environment"
},
{
"path": "CLA.md",
"chars": 1492,
"preview": "Seelen UI - Individual Contributor License Agreement (CLA)\n\nThank you for your interest in contributing to the Seelen UI"
},
{
"path": "CODE_OF_CONDUCT",
"chars": 1799,
"preview": "# Seelen UI Code of Conduct\n\n## 1. Our Pledge\n\nWe as members, contributors, and maintainers pledge to make participation"
},
{
"path": "CONTRIBUTING",
"chars": 1699,
"preview": "# Contributing to Seelen UI\n\nThank you for your interest in contributing to this project! We welcome contributions from "
},
{
"path": "Cargo.toml",
"chars": 2066,
"preview": "cargo-features = [\"profile-rustflags\", \"codegen-backend\"]\n\n[profile.dev]\ndebug = \"full\"\nstrip = false\nopt-level = 0\nincr"
},
{
"path": "LICENSE",
"chars": 34523,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "README.md",
"chars": 10912,
"preview": "<h1 align=\"center\">\n <img src=\"documentation/images/logo.svg\" width=\"44\" align=\"top\" alt=\"Seelen UI Logo\" />\n Seelen U"
},
{
"path": "SECURITY.md",
"chars": 935,
"preview": "# Security Policy\n\n## Supported Versions\n\nAt Seelen UI, we always recommend using the latest available version, as all v"
},
{
"path": "changelog.md",
"chars": 42704,
"preview": "# Changelog\n\n## [2.5.7-dev]\n\n### features\n\n- allow split multiple windows into separated items on dock.\n- trash bin modu"
},
{
"path": "crowdin.yml",
"chars": 167,
"preview": "base_path: \".\"\nbase_url: \"https://api.crowdin.com\"\npreserve_hierarchy: true\nfiles:\n - source: i18n/**/en.yml\n transl"
},
{
"path": "deno.json",
"chars": 402,
"preview": "{\n \"lint\": {\n \"rules\": {\n \"include\": [\n \"verbatim-module-syntax\"\n ],\n \"exclude\": [\n \"pr"
},
{
"path": "lefthook.yml",
"chars": 746,
"preview": "commit-msg:\n commands:\n lint-commit-msg:\n run: npx commitlint --edit\n\npre-commit:\n commands:\n file-format:\n"
},
{
"path": "libs/core/.gitignore",
"chars": 3,
"preview": "npm"
},
{
"path": "libs/core/Cargo.toml",
"chars": 866,
"preview": "[package]\nname = \"seelen-core\"\nversion = \"2.5.7\"\nedition = \"2021\"\nrust-version = \"1.89\"\n\n[lints]\nworkspace = true\n\n[depe"
},
{
"path": "libs/core/deno.json",
"chars": 1504,
"preview": "{\n \"name\": \"@seelen-ui/lib\",\n \"version\": \"2.5.7\",\n \"description\": \"Seelen UI Library for Widgets\",\n \"license\": \"AGPL"
},
{
"path": "libs/core/mocks/themes/v2.3.0.yml",
"chars": 836,
"preview": "id: \"@eythaann/variables-test\"\nmetadata:\n displayName: Variables Test\n description: this theme is just for testing\n a"
},
{
"path": "libs/core/mocks/themes/v2.3.12.yml",
"chars": 3464,
"preview": "id: \"@eythaann/variables-test\"\nmetadata:\n displayName: Variables Test\n description: this theme is just for testing\n a"
},
{
"path": "libs/core/mod.ts",
"chars": 181,
"preview": "// this re-export file is needed as a workaround for a bug in @deno/dnt\n//\n// remember usage `madge --circular .\\mod.ts`"
},
{
"path": "libs/core/readme.md",
"chars": 1192,
"preview": "<h1 align=\"center\">\n <img src=\"https://raw.githubusercontent.com/eythaann/Seelen-UI/812f64d29162fe49da6f621d5e2a3e4852b"
},
{
"path": "libs/core/scripts/build_npm.ts",
"chars": 1186,
"preview": "/// <reference lib=\"deno.ns\" />\n\nimport { build, type BuildOptions, emptyDir } from \"@deno/dnt\";\n\nimport denoJson from \""
},
{
"path": "libs/core/scripts/rust_bindings.ts",
"chars": 3576,
"preview": "/// <reference lib=\"deno.ns\" />\n\nawait Deno.mkdir(\"./gen/types\", { recursive: true });\n// await Deno.mkdir('./src/valida"
},
{
"path": "libs/core/src/constants/mod.rs",
"chars": 3185,
"preview": "pub const SUPPORTED_LANGUAGES: &[SupportedLanguage] = &[\n lang(\"Afrikaans\", \"Afrikaans\", \"af\"),\n lang(\"አማርኛ\", \"Amh"
},
{
"path": "libs/core/src/constants/mod.ts",
"chars": 4457,
"preview": "export type SupportedLanguagesCode = (typeof SupportedLanguages)[number][\"value\"];\nexport interface SupportedLanguage {\n"
},
{
"path": "libs/core/src/error.rs",
"chars": 993,
"preview": "macro_rules! define_app_errors {\n ($(\n $variant:ident($error_type:ty);\n )*) => {\n #[derive(Debug)]\n "
},
{
"path": "libs/core/src/handlers/commands.rs",
"chars": 12139,
"preview": "#[cfg(test)]\nuse crate::{\n rect::Rect, resource::*, state::by_monitor::MonitorConfiguration,\n state::by_wallpaper:"
},
{
"path": "libs/core/src/handlers/commands.ts",
"chars": 5723,
"preview": "// This file was generated via rust macros. Don't modify manually.\nexport enum SeelenCommand {\n StateGetVirtualDesktops"
},
{
"path": "libs/core/src/handlers/events.rs",
"chars": 4498,
"preview": "use std::collections::HashMap;\n\nuse crate::state::*;\nuse crate::system_state::*;\n\nmacro_rules! slu_events_declaration {\n"
},
{
"path": "libs/core/src/handlers/events.ts",
"chars": 2237,
"preview": "// This file was generated via rust macros. Don't modify manually.\nexport enum SeelenEvent {\n VirtualDesktopsChanged = "
},
{
"path": "libs/core/src/handlers/mod.rs",
"chars": 67,
"preview": "mod commands;\nmod events;\n\npub use commands::*;\npub use events::*;\n"
},
{
"path": "libs/core/src/handlers/mod.ts",
"chars": 1997,
"preview": "import type { SeelenCommandArgument, SeelenCommandReturn, SeelenEventPayload } from \"@seelen-ui/types\";\nimport { invoke "
},
{
"path": "libs/core/src/lib.rs",
"chars": 1390,
"preview": "pub mod constants;\npub mod error;\npub mod handlers;\npub mod rect;\npub mod resource;\npub mod state;\npub mod system_state;"
},
{
"path": "libs/core/src/lib.test.ts",
"chars": 175,
"preview": "import { assert } from \"@std/assert/assert\";\nimport * as SluLib from \"./lib.ts\";\n\nDeno.test(\"Library is importable on ba"
},
{
"path": "libs/core/src/lib.ts",
"chars": 287,
"preview": "export * from \"./constants/mod.ts\";\nexport * from \"./state/mod.ts\";\nexport * from \"./system_state/mod.ts\";\nexport * from"
},
{
"path": "libs/core/src/re-exports/tauri.ts",
"chars": 274,
"preview": "export * from \"@tauri-apps/api\";\nexport * from \"@tauri-apps/api/dpi\";\n\nexport * as dialog from \"@tauri-apps/plugin-dialo"
},
{
"path": "libs/core/src/rect.rs",
"chars": 2696,
"preview": "use schemars::JsonSchema;\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\n\n#[derive(Debug, Clone, Default, PartialEq"
},
{
"path": "libs/core/src/resource/file.rs",
"chars": 3026,
"preview": "use std::{\n fs::File,\n io::{Read, Seek, SeekFrom, Write},\n path::Path,\n};\n\nuse base64::Engine;\nuse serde::{de::"
},
{
"path": "libs/core/src/resource/interface.rs",
"chars": 4620,
"preview": "use std::{fs::File, path::Path};\n\nuse serde::{de::DeserializeOwned, Serialize};\n\nuse crate::{\n error::Result,\n res"
},
{
"path": "libs/core/src/resource/metadata.rs",
"chars": 2664,
"preview": "use std::{collections::HashMap, path::PathBuf};\n\nuse chrono::{DateTime, Utc};\nuse url::Url;\n\nuse crate::{\n error::Res"
},
{
"path": "libs/core/src/resource/mod.rs",
"chars": 5282,
"preview": "mod file;\nmod interface;\nmod metadata;\nmod resource_id;\nmod yaml_ext;\n\npub use file::*;\npub use interface::*;\npub use me"
},
{
"path": "libs/core/src/resource/mod.ts",
"chars": 11,
"preview": "export {};\n"
},
{
"path": "libs/core/src/resource/resource_id.rs",
"chars": 6825,
"preview": "use std::sync::LazyLock;\n\nuse serde::{de::Visitor, Deserialize, Deserializer, Serialize};\n\nuse crate::error::Result;\n\n//"
},
{
"path": "libs/core/src/resource/yaml_ext.rs",
"chars": 2302,
"preview": "// the idea with this module is improve YAML with extensibility, via custom keywords\n\nuse std::{fs::File, path::Path};\n\n"
},
{
"path": "libs/core/src/state/icon_pack.rs",
"chars": 6670,
"preview": "use std::path::PathBuf;\n\nuse chrono::{DateTime, Utc};\nuse schemars::JsonSchema;\nuse serde::{Deserialize, Serialize};\nuse"
},
{
"path": "libs/core/src/state/icon_pack.test.ts",
"chars": 16484,
"preview": "import type { Icon, IconPack, IconPackId, ResourceMetadata } from \"@seelen-ui/types\";\nimport { IconPackManager } from \"."
},
{
"path": "libs/core/src/state/icon_pack.ts",
"chars": 12281,
"preview": "import type {\n Icon as IIcon,\n IconPack,\n IconPack as IIconPack,\n SeelenCommandGetIconArgs,\n UniqueIconPackEntry,\n}"
},
{
"path": "libs/core/src/state/mod.rs",
"chars": 386,
"preview": "mod icon_pack;\nmod placeholder;\nmod plugin;\nmod popups;\nmod settings;\nmod theme;\nmod wallpaper;\nmod weg_items;\nmod widge"
},
{
"path": "libs/core/src/state/mod.ts",
"chars": 201,
"preview": "export * from \"./theme/mod.ts\";\nexport * from \"./settings/mod.ts\";\nexport * from \"./icon_pack.ts\";\nexport * from \"./plug"
},
{
"path": "libs/core/src/state/placeholder.rs",
"chars": 5520,
"preview": "use std::collections::{HashMap, HashSet};\n\nuse schemars::JsonSchema;\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;"
},
{
"path": "libs/core/src/state/plugin/mod.rs",
"chars": 1093,
"preview": "pub mod value;\n\nuse schemars::JsonSchema;\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\nuse value::PluginValue;\n\nu"
},
{
"path": "libs/core/src/state/plugin/mod.ts",
"chars": 738,
"preview": "import { SeelenCommand, SeelenEvent, type UnSubscriber } from \"../../handlers/mod.ts\";\nimport { List } from \"../../utils"
},
{
"path": "libs/core/src/state/plugin/value.rs",
"chars": 976,
"preview": "use schemars::JsonSchema;\n\nuse crate::{\n resource::WidgetId,\n state::{ToolbarItem, WindowManagerLayout},\n utils"
},
{
"path": "libs/core/src/state/popups/mod.rs",
"chars": 2177,
"preview": "use std::collections::HashMap;\n\nuse url::Url;\n\n#[derive(Debug, Clone, Serialize, Deserialize, TS)]\n#[serde(default, rena"
},
{
"path": "libs/core/src/state/settings/by_monitor.rs",
"chars": 1729,
"preview": "use schemars::JsonSchema;\nuse serde::{Deserialize, Serialize};\nuse std::collections::HashMap;\nuse ts_rs::TS;\n\nuse crate:"
},
{
"path": "libs/core/src/state/settings/by_theme.rs",
"chars": 209,
"preview": "use std::collections::HashMap;\n\nuse crate::state::config::CssVariableName;\n\n#[derive(Debug, Clone, Default, Serialize, D"
},
{
"path": "libs/core/src/state/settings/by_wallpaper.rs",
"chars": 2632,
"preview": "#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, TS)]\n#[serde(default, rename_all = \"camelCase\")]\npub struct W"
},
{
"path": "libs/core/src/state/settings/by_widget.rs",
"chars": 2881,
"preview": "use std::collections::HashMap;\n\nuse schemars::JsonSchema;\nuse uuid::Uuid;\n\nuse crate::{resource::WidgetId, utils::TsUnkn"
},
{
"path": "libs/core/src/state/settings/mod.rs",
"chars": 20419,
"preview": "/* In this file we use #[serde_alias(SnakeCase)] as backward compatibility from versions below v1.9.8 */\npub mod by_moni"
},
{
"path": "libs/core/src/state/settings/mod.ts",
"chars": 2040,
"preview": "import { SeelenCommand, SeelenEvent, type UnSubscriber } from \"../../handlers/mod.ts\";\n\nimport type { Settings as ISetti"
},
{
"path": "libs/core/src/state/settings/settings_by_app.rs",
"chars": 20759,
"preview": "use regex::Regex;\nuse schemars::JsonSchema;\nuse serde::{Deserialize, Serialize};\nuse serde_alias::serde_alias;\nuse ts_rs"
},
{
"path": "libs/core/src/state/settings/shortcuts.rs",
"chars": 9543,
"preview": "use std::collections::HashSet;\n\nuse uuid::Uuid;\n\nuse crate::resource::WidgetId;\n\n#[derive(Debug, Copy, Clone, PartialEq,"
},
{
"path": "libs/core/src/state/theme/config.rs",
"chars": 6651,
"preview": "use std::sync::LazyLock;\n\nuse schemars::JsonSchema;\nuse serde::{de::Visitor, Deserialize, Deserializer};\n\nuse crate::{er"
},
{
"path": "libs/core/src/state/theme/mod.rs",
"chars": 4733,
"preview": "#[cfg(test)]\nmod tests;\n\npub mod config;\n\nuse std::{collections::HashMap, path::Path};\n\nuse config::ThemeSettingsDefinit"
},
{
"path": "libs/core/src/state/theme/mod.ts",
"chars": 3535,
"preview": "import type {\n ResourceId,\n Settings as ISettings,\n Theme as ITheme,\n ThemeConfigDefinition,\n ThemeId,\n ThemeVaria"
},
{
"path": "libs/core/src/state/theme/tests.rs",
"chars": 380,
"preview": "use std::path::PathBuf;\n\nuse crate::{error::Result, resource::SluResource, state::Theme};\n\n#[test]\nfn test_compatibility"
},
{
"path": "libs/core/src/state/theme/theming.ts",
"chars": 2442,
"preview": "import { UIColors } from \"../../system_state/ui_colors.ts\";\nimport { RuntimeStyleSheet } from \"../../utils/DOM.ts\";\nimpo"
},
{
"path": "libs/core/src/state/wallpaper/mod.rs",
"chars": 5354,
"preview": "use std::path::Path;\n\nuse url::Url;\nuse uuid::Uuid;\n\nuse crate::{\n error::Result,\n resource::{\n InternalRes"
},
{
"path": "libs/core/src/state/wallpaper/mod.ts",
"chars": 1246,
"preview": "import type { Wallpaper as IWallpaper, WallpaperInstanceSettings } from \"@seelen-ui/types\";\n\nimport { SeelenCommand, See"
},
{
"path": "libs/core/src/state/weg_items.rs",
"chars": 7181,
"preview": "use std::{collections::HashSet, path::PathBuf};\n\nuse serde::{Deserialize, Serialize};\nuse ts_rs::TS;\n\nuse crate::system_"
},
{
"path": "libs/core/src/state/widget/context_menu.rs",
"chars": 1300,
"preview": "use crate::{resource::ResourceText, state::Alignment};\n\n#[derive(Debug, Clone, Serialize, Deserialize, TS)]\n#[serde(rena"
},
{
"path": "libs/core/src/state/widget/declaration.rs",
"chars": 9846,
"preview": "use std::collections::HashSet;\n\nuse schemars::JsonSchema;\nuse serde::{Deserialize, Deserializer, Serialize};\nuse ts_rs::"
},
{
"path": "libs/core/src/state/widget/interfaces.ts",
"chars": 1274,
"preview": "export interface WidgetInformation {\n /** decoded webview label */\n label: string;\n /** Will be present if the widget"
},
{
"path": "libs/core/src/state/widget/mod.rs",
"chars": 8569,
"preview": "pub mod context_menu;\npub mod declaration;\n\nuse std::{collections::HashMap, path::Path};\n\nuse declaration::WidgetSetting"
},
{
"path": "libs/core/src/state/widget/mod.ts",
"chars": 13307,
"preview": "import {\n type Frame,\n type Rect,\n type ThirdPartyWidgetSettings,\n type Widget as IWidget,\n type WidgetConfigDefini"
},
{
"path": "libs/core/src/state/widget/performance.ts",
"chars": 688,
"preview": "import { PerformanceMode } from \"@seelen-ui/types\";\nimport { invoke, SeelenCommand, SeelenEvent, subscribe } from \"../.."
},
{
"path": "libs/core/src/state/widget/positioning.ts",
"chars": 2348,
"preview": "import { Alignment, type Frame, type PhysicalMonitor } from \"@seelen-ui/types\";\nimport { invoke, subscribe } from \"../.."
},
{
"path": "libs/core/src/state/widget/sizing.ts",
"chars": 2144,
"preview": "import { PhysicalSize } from \"@tauri-apps/api/dpi\";\nimport type { Widget } from \"./mod.ts\";\nimport { Alignment } from \"@"
},
{
"path": "libs/core/src/state/wm_layout.rs",
"chars": 4110,
"preview": "use std::{cell::Cell, collections::HashMap};\n\nuse crate::system_state::MonitorId;\n\n#[derive(Debug, Serialize, Deserializ"
},
{
"path": "libs/core/src/state/workspaces/mod.rs",
"chars": 5470,
"preview": "use std::collections::{HashMap, HashSet};\n\nuse uuid::Uuid;\n\nuse crate::{error::Result, identifier_impl, resource::Wallpa"
},
{
"path": "libs/core/src/system_state/bluetooth/appearance_values.yml",
"chars": 15954,
"preview": "# https://bitbucket.org/bluetooth-SIG/public/src/main/assigned_numbers/core/appearance_values.yaml\nappearance_values:\n "
},
{
"path": "libs/core/src/system_state/bluetooth/build_low_energy_enums.rs",
"chars": 4176,
"preview": "#[cfg(feature = \"gen-binds\")]\nmod tests {\n #[derive(Deserialize)]\n struct AppearanceDefinition {\n pub appea"
},
{
"path": "libs/core/src/system_state/bluetooth/enums.rs",
"chars": 7626,
"preview": "#[repr(u32)]\n#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, TS)]\n#[ts(repr(enum = name))]\npub enum "
},
{
"path": "libs/core/src/system_state/bluetooth/low_energy_enums.rs",
"chars": 36975,
"preview": "// This file was generated via rust macros. Don't modify manually.\n// all this structs are based on official docs https:"
},
{
"path": "libs/core/src/system_state/bluetooth/mod.rs",
"chars": 5870,
"preview": "// all this structs are based on official docs https://www.bluetooth.com/specifications/assigned-numbers\n#[cfg(test)]\nmo"
},
{
"path": "libs/core/src/system_state/bluetooth/mod.ts",
"chars": 901,
"preview": "import { invoke, SeelenCommand, SeelenEvent, type UnSubscriber } from \"../../handlers/mod.ts\";\nimport { List } from \"../"
},
{
"path": "libs/core/src/system_state/components.rs",
"chars": 1199,
"preview": "use std::path::PathBuf;\n\n#[derive(Debug, Clone, Serialize, Deserialize, TS)]\n#[cfg_attr(feature = \"gen-binds\", ts(export"
},
{
"path": "libs/core/src/system_state/language.rs",
"chars": 908,
"preview": "#[derive(Debug, Clone, Serialize, Deserialize, TS)]\n#[serde(rename_all = \"camelCase\")]\n#[cfg_attr(feature = \"gen-binds\","
},
{
"path": "libs/core/src/system_state/language.ts",
"chars": 573,
"preview": "import { SeelenCommand, SeelenEvent, type UnSubscriber } from \"../handlers/mod.ts\";\nimport { List } from \"../utils/List."
},
{
"path": "libs/core/src/system_state/media.rs",
"chars": 1924,
"preview": "use std::path::PathBuf;\n\n#[derive(Debug, Clone, Serialize, TS)]\n#[serde(rename_all = \"camelCase\")]\npub struct MediaPlaye"
},
{
"path": "libs/core/src/system_state/mod.rs",
"chars": 520,
"preview": "mod bluetooth;\nmod components;\nmod language;\nmod media;\nmod monitors;\nmod network;\nmod notification;\nmod power;\nmod radi"
},
{
"path": "libs/core/src/system_state/mod.ts",
"chars": 157,
"preview": "export * from \"./monitors.ts\";\nexport * from \"./ui_colors.ts\";\nexport * from \"./language.ts\";\nexport * from \"./user.ts\";"
},
{
"path": "libs/core/src/system_state/monitors.rs",
"chars": 927,
"preview": "use crate::{identifier_impl, rect::Rect};\n\n#[derive(Debug, Clone, Serialize, Deserialize, TS)]\n#[serde(rename_all = \"cam"
},
{
"path": "libs/core/src/system_state/monitors.ts",
"chars": 606,
"preview": "import { SeelenCommand, SeelenEvent, type UnSubscriber } from \"../handlers/mod.ts\";\nimport type { PhysicalMonitor } from"
},
{
"path": "libs/core/src/system_state/network/mod.rs",
"chars": 1523,
"preview": "use serde_alias::serde_alias;\n\n#[serde_alias(PascalCase)] // used by pwsh scripts\n#[derive(Debug, Serialize, Deserialize"
},
{
"path": "libs/core/src/system_state/notification.rs",
"chars": 9740,
"preview": "// All this structs/interfaces are taken from https://learn.microsoft.com/en-us/uwp/schemas/tiles/toastschema/schema-roo"
},
{
"path": "libs/core/src/system_state/power.rs",
"chars": 1444,
"preview": "#[derive(Debug, Clone, Serialize, TS)]\n#[serde(rename_all = \"camelCase\")]\n#[allow(non_snake_case)]\npub struct PowerStatu"
},
{
"path": "libs/core/src/system_state/radios/mod.rs",
"chars": 523,
"preview": "/// Represents a radio device like a bluetooth - wifi etc.\n#[derive(Debug, Clone, Serialize, Deserialize, TS)]\n#[cfg_att"
},
{
"path": "libs/core/src/system_state/trash_bin.rs",
"chars": 371,
"preview": "use serde::{Deserialize, Serialize};\nuse ts_rs::TS;\n\n#[derive(Debug, Default, Clone, Serialize, Deserialize, TS)]\n#[cfg_"
},
{
"path": "libs/core/src/system_state/tray.rs",
"chars": 3673,
"preview": "use std::path::PathBuf;\n\n/// Identifier for a systray icon.\n///\n/// A systray icon is either identified by a (window han"
},
{
"path": "libs/core/src/system_state/ui_colors.rs",
"chars": 1716,
"preview": "/// https://learn.microsoft.com/is-is/uwp/api/windows.ui.viewmanagement.uicolortype?view=winrt-19041\n#[derive(Debug, Def"
},
{
"path": "libs/core/src/system_state/ui_colors.ts",
"chars": 5194,
"preview": "import { SeelenCommand, SeelenEvent, type UnSubscriber } from \"../handlers/mod.ts\";\nimport { RuntimeStyleSheet } from \"."
},
{
"path": "libs/core/src/system_state/user.rs",
"chars": 1246,
"preview": "use std::path::PathBuf;\n\nuse ts_rs::TS;\n\n#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Serialize, Deserialize, TS)]\n"
},
{
"path": "libs/core/src/system_state/user.ts",
"chars": 505,
"preview": "import { SeelenCommand, SeelenEvent, type UnSubscriber } from \"../handlers/mod.ts\";\nimport { newFromInvoke, newOnEvent }"
},
{
"path": "libs/core/src/system_state/user_apps/mod.rs",
"chars": 2565,
"preview": "use std::path::PathBuf;\n\nuse crate::{rect::Rect, system_state::MonitorId};\n\n#[derive(Debug, Clone, Serialize, Deserializ"
},
{
"path": "libs/core/src/system_state/win_explorer.rs",
"chars": 1467,
"preview": "use std::path::PathBuf;\n\n#[derive(Debug, Clone, Serialize, Deserialize, TS)]\n#[cfg_attr(feature = \"gen-binds\", ts(export"
},
{
"path": "libs/core/src/utils/DOM.ts",
"chars": 957,
"preview": "export class RuntimeStyleSheet {\n #element: HTMLStyleElement;\n #variables: Array<[string, string]> = [];\n #styles: Ar"
},
{
"path": "libs/core/src/utils/List.ts",
"chars": 1201,
"preview": "/**\n * A generic, abstract class for managing an array-like collection of items.\n * @template T The type of elements sto"
},
{
"path": "libs/core/src/utils/State.ts",
"chars": 1228,
"preview": "import { invoke as tauriInvoke } from \"@tauri-apps/api/core\";\nimport { listen as tauriListen, type Options as ListenerOp"
},
{
"path": "libs/core/src/utils/async.ts",
"chars": 1166,
"preview": "// deno-lint-ignore no-explicit-any\nexport interface DebouncedFunction<T extends (...args: any[]) => any> {\n (...args: "
},
{
"path": "libs/core/src/utils/mod.rs",
"chars": 2096,
"preview": "use std::path::{Path, PathBuf};\n\nuse schemars::JsonSchema;\n\n#[macro_export(local_inner_macros)]\nmacro_rules! __switch {\n"
},
{
"path": "libs/core/src/utils/mod.ts",
"chars": 72,
"preview": "export class Rect {\n left = 0;\n top = 0;\n right = 0;\n bottom = 0;\n}\n"
},
{
"path": "libs/positioning/Cargo.toml",
"chars": 314,
"preview": "[package]\nname = \"positioning\"\nedition = \"2024\"\n\n[lints]\nworkspace = true\n\n[dependencies]\nthiserror = { workspace = true"
},
{
"path": "libs/positioning/src/api/mod.rs",
"chars": 94,
"preview": "#[cfg(target_os = \"windows\")]\nmod windows;\n\n#[cfg(target_os = \"windows\")]\npub use windows::*;\n"
},
{
"path": "libs/positioning/src/api/windows.rs",
"chars": 3220,
"preview": "use windows::Win32::{\n Foundation::{HWND, RECT},\n Graphics::Gdi::{\n RDW_ALLCHILDREN, RDW_ERASE, RDW_FRAME, "
},
{
"path": "libs/positioning/src/easings.rs",
"chars": 8053,
"preview": "use keyframe::EasingFunction;\n\n/// Easing based on https://easings.net/#\n#[derive(Clone, Copy)]\npub enum Easing {\n Li"
},
{
"path": "libs/positioning/src/error.rs",
"chars": 388,
"preview": "#[derive(Debug, thiserror::Error)]\npub enum Error {\n #[error(\"Windows: {0}\")]\n Windows(#[from] windows::core::Erro"
},
{
"path": "libs/positioning/src/lib.rs",
"chars": 6900,
"preview": "mod api;\npub mod easings;\npub mod error;\npub mod minimization;\npub mod rect;\n\nuse std::collections::HashMap;\nuse std::sy"
},
{
"path": "libs/positioning/src/minimization.rs",
"chars": 1676,
"preview": "/* use windows::Win32::{\n Foundation::{HWND, POINT},\n UI::WindowsAndMessaging::{\n AnimateWindow, GetWindowP"
},
{
"path": "libs/positioning/src/rect.rs",
"chars": 1355,
"preview": "use keyframe::CanTween;\n\n#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]\npub struct Rect {\n pub x: i32,\n pub"
},
{
"path": "libs/slu-ipc/Cargo.toml",
"chars": 528,
"preview": "[package]\nname = \"slu-ipc\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[lints]\nworkspace = true\n\n[dependencies]\ntokio = { worksp"
},
{
"path": "libs/slu-ipc/src/app.rs",
"chars": 3879,
"preview": "use std::sync::Arc;\n\nuse interprocess::os::windows::named_pipe::{\n DuplexPipeStream, PipeListenerOptions, pipe_mode::"
},
{
"path": "libs/slu-ipc/src/common.rs",
"chars": 4785,
"preview": "use std::{\n io::{BufRead, Write},\n time::Duration,\n};\n\nuse interprocess::os::windows::{\n named_pipe::{\n "
},
{
"path": "libs/slu-ipc/src/error.rs",
"chars": 458,
"preview": "use thiserror::Error;\n\n#[derive(Error, Debug)]\npub enum Error {\n #[error(\"IO Error: {0}\")]\n Io(#[from] std::io::Er"
},
{
"path": "libs/slu-ipc/src/lib.rs",
"chars": 191,
"preview": "pub mod app;\npub mod common;\npub mod error;\npub mod messages;\npub mod service;\n\n// Re-export main types for convenience\n"
},
{
"path": "libs/slu-ipc/src/messages.rs",
"chars": 3507,
"preview": "use std::collections::HashMap;\n\nuse seelen_core::{rect::Rect, state::Settings};\nuse serde::{Deserialize, Serialize};\n\nus"
},
{
"path": "libs/slu-ipc/src/service.rs",
"chars": 3602,
"preview": "use std::{future::Future, sync::Arc};\n\nuse interprocess::os::windows::named_pipe::{\n PipeListenerOptions, pipe_mode::"
},
{
"path": "libs/ui/icons.ts",
"chars": 1381,
"preview": "// This file is generated on build, do not edit.\nexport type IconName =\n | keyof typeof import(\"react-icons/ai\")\n | ke"
},
{
"path": "libs/ui/react/components/BackgroundByLayers/infra.module.css",
"chars": 197,
"preview": ".background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n\n .layer {\n width: 100%;\n heigh"
},
{
"path": "libs/ui/react/components/BackgroundByLayers/infra.tsx",
"chars": 1000,
"preview": "import { cx } from \"libs/ui/react/utils/styling\";\nimport type { HTMLAttributes } from \"react\";\n\nimport cs from \"./infra."
},
{
"path": "libs/ui/react/components/Icon/FileIcon.tsx",
"chars": 2719,
"preview": "import { IconPackManager } from \"@seelen-ui/lib\";\nimport type { SeelenCommandGetIconArgs } from \"@seelen-ui/lib/types\";\n"
},
{
"path": "libs/ui/react/components/Icon/MissingIcon.tsx",
"chars": 1260,
"preview": "import { cx } from \"libs/ui/react/utils/styling.ts\";\nimport { useComputed } from \"@preact/signals\";\nimport type { ImgHTM"
},
{
"path": "libs/ui/react/components/Icon/SpecificIcon.tsx",
"chars": 1354,
"preview": "import { cx } from \"libs/ui/react/utils/styling.ts\";\nimport { useComputed, useSignal } from \"@preact/signals\";\nimport ty"
},
{
"path": "libs/ui/react/components/Icon/common.ts",
"chars": 562,
"preview": "import { IconPackManager } from \"@seelen-ui/lib\";\nimport { signal } from \"@preact/signals\";\n\nconst manager = await IconP"
},
{
"path": "libs/ui/react/components/Icon/index.module.css",
"chars": 628,
"preview": ".reactIcon {\n height: 1rem;\n width: max-content;\n min-width: max-content;\n display: inline-block;\n\n > svg {\n ver"
},
{
"path": "libs/ui/react/components/Icon/index.tsx",
"chars": 907,
"preview": "import { forwardRef, type HTMLAttributes } from \"preact/compat\";\n\nimport { cx } from \"../../utils/styling.ts\";\nimport In"
},
{
"path": "libs/ui/react/components/InlineSvg/index.module.css",
"chars": 64,
"preview": ".inlineSvg {\n > svg {\n width: 100%;\n height: 100%;\n }\n}\n"
},
{
"path": "libs/ui/react/components/InlineSvg/index.tsx",
"chars": 1000,
"preview": "import { cx } from \"libs/ui/react/utils/styling\";\nimport { forwardRef, type HTMLAttributes, useEffect, useState } from \""
},
{
"path": "libs/ui/react/components/ResourceText/index.tsx",
"chars": 2297,
"preview": "import type { ResourceText as IResourceText } from \"@seelen-ui/lib/types\";\nimport { invoke, SeelenCommand } from \"@seele"
},
{
"path": "libs/ui/react/components/Wallpaper/components/ImageWallpaper.tsx",
"chars": 1055,
"preview": "import { cx } from \"libs/ui/react/utils/styling.ts\";\nimport { convertFileSrc } from \"@tauri-apps/api/core\";\nimport { use"
},
{
"path": "libs/ui/react/components/Wallpaper/components/ThemedWallpaper.tsx",
"chars": 869,
"preview": "import { cx } from \"libs/ui/react/utils/styling.ts\";\nimport { useEffect } from \"preact/hooks\";\nimport { BackgroundByLaye"
},
{
"path": "libs/ui/react/components/Wallpaper/components/VideoWallpaper.tsx",
"chars": 6548,
"preview": "import { cx } from \"libs/ui/react/utils/styling.ts\";\nimport { convertFileSrc } from \"@tauri-apps/api/core\";\nimport { use"
},
{
"path": "libs/ui/react/components/Wallpaper/index.module.css",
"chars": 8286,
"preview": ".container {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n\n .wallpaper {\n width: 100%;\n"
},
{
"path": "libs/ui/react/components/Wallpaper/index.tsx",
"chars": 2624,
"preview": "import { useSignal } from \"@preact/signals\";\nimport { WallpaperConfiguration } from \"@seelen-ui/lib\";\nimport { Wallpaper"
},
{
"path": "libs/ui/react/components/Wallpaper/types.ts",
"chars": 488,
"preview": "import type { Wallpaper, WallpaperInstanceSettings } from \"@seelen-ui/lib/types\";\n\nexport interface BaseProps {\n defini"
},
{
"path": "libs/ui/react/components/Wallpaper/utils.ts",
"chars": 1427,
"preview": "import type { PlaybackSpeed, WallpaperInstanceSettings } from \"@seelen-ui/lib/types\";\nimport type { CSSProperties } from"
},
{
"path": "libs/ui/react/utils/DndKit/utils.ts",
"chars": 1682,
"preview": "export interface DndContainer<T> {\n id: T;\n items: T[];\n}\n\nfunction getContainerIdx<T>(\n id: T,\n containers: DndCont"
},
{
"path": "libs/ui/react/utils/LazySignal.ts",
"chars": 1609,
"preview": "import { Signal } from \"@preact/signals\";\n\n/**\n * Structure done to work with async event programming\n */\nexport class L"
},
{
"path": "libs/ui/react/utils/hooks.ts",
"chars": 3367,
"preview": "import { getCurrentWindow } from \"@tauri-apps/api/window\";\nimport {\n debounce,\n type DebouncedFunc,\n type DebouncedFu"
},
{
"path": "libs/ui/react/utils/index.ts",
"chars": 942,
"preview": "import type { ResourceText } from \"@seelen-ui/lib/types\";\n\nexport function getRootContainer(): HTMLElement {\n const ele"
},
{
"path": "libs/ui/react/utils/layered.ts",
"chars": 2730,
"preview": "import { SeelenEvent } from \"@seelen-ui/lib\";\nimport { window as TauriWindow } from \"@seelen-ui/lib/tauri\";\n\nclass Layer"
},
{
"path": "libs/ui/react/utils/signals.ts",
"chars": 623,
"preview": "import { UIColors, Widget } from \"@seelen-ui/lib\";\nimport { lazySignal } from \"./LazySignal\";\n\nconst window = Widget.sel"
},
{
"path": "libs/ui/react/utils/styling.ts",
"chars": 1037,
"preview": "import { useEffect, useState } from \"react\";\n\ntype Args = undefined | string | { [x: string]: any };\nexport const cx = ("
},
{
"path": "libs/ui/svelte/components/BackgroundByLayers/BackgroundByLayers.svelte",
"chars": 581,
"preview": "<script lang=\"ts\">\n let props = $props();\n</script>\n\n<div {...props} class={[\"bg-container\", props.class]}>\n <div clas"
},
{
"path": "libs/ui/svelte/components/BackgroundByLayers/index.ts",
"chars": 77,
"preview": "export { default as BackgroundByLayers } from \"./BackgroundByLayers.svelte\";\n"
},
{
"path": "libs/ui/svelte/components/Icon/FileIcon.svelte",
"chars": 2536,
"preview": "<script lang=\"ts\">\n import type { ClassValue } from \"svelte/elements\";\n import type { SeelenCommandGetIconArgs } from "
},
{
"path": "libs/ui/svelte/components/Icon/Icon.svelte",
"chars": 1030,
"preview": "<script lang=\"ts\">\n import type { ClassValue } from \"svelte/elements\";\n import InlineSVG from \"./InlineSVG.svelte\";\n "
},
{
"path": "libs/ui/svelte/components/Icon/InlineSVG.svelte",
"chars": 570,
"preview": "<script lang=\"ts\">\n import type { ClassValue } from \"svelte/elements\";\n import { fetchSVG, svgs } from \"./InlineSVGSta"
},
{
"path": "libs/ui/svelte/components/Icon/InlineSVGState.svelte.ts",
"chars": 362,
"preview": "export const svgs = $state<Record<string, string>>({});\n\nexport async function fetchSVG(src: string) {\n try {\n const"
},
{
"path": "libs/ui/svelte/components/Icon/MissingIcon.svelte",
"chars": 1597,
"preview": "<script lang=\"ts\">\n import type { ClassValue } from \"svelte/elements\";\n import { iconPackManager, type IconState } fro"
},
{
"path": "libs/ui/svelte/components/Icon/SpecificIcon.svelte",
"chars": 1819,
"preview": "<script lang=\"ts\">\n import type { ClassValue } from \"svelte/elements\";\n import { iconPackManager, type IconState } fro"
},
{
"path": "libs/ui/svelte/components/Icon/common.svelte.ts",
"chars": 383,
"preview": "import { IconPackManager } from \"@seelen-ui/lib\";\n\nconst manager = await IconPackManager.create();\n\nexport const iconPac"
},
{
"path": "libs/ui/svelte/components/Icon/index.ts",
"chars": 344,
"preview": "export { default as Icon } from \"./Icon.svelte\";\nexport { default as InlineSVG } from \"./InlineSVG.svelte\";\nexport { def"
},
{
"path": "libs/ui/svelte/components/Wallpaper/Wallpaper.svelte",
"chars": 2322,
"preview": "<script lang=\"ts\">\n import { WallpaperKind } from \"@seelen-ui/lib/types\";\n\n import ThemedWallpaper from \"./components/"
},
{
"path": "libs/ui/svelte/components/Wallpaper/components/ImageWallpaper.svelte",
"chars": 877,
"preview": "<script lang=\"ts\">\n import { convertFileSrc } from \"@tauri-apps/api/core\";\n import type { DefinedWallProps } from \"../"
},
{
"path": "libs/ui/svelte/components/Wallpaper/components/ThemedWallpaper.svelte",
"chars": 8485,
"preview": "<script lang=\"ts\">\n import { onMount } from \"svelte\";\n import BackgroundByLayers from \"../../BackgroundByLayers/Backgr"
},
{
"path": "libs/ui/svelte/components/Wallpaper/components/VideoWallpaper.svelte",
"chars": 6306,
"preview": "<script lang=\"ts\">\n import { convertFileSrc } from \"@tauri-apps/api/core\";\n import { onMount, onDestroy } from \"svelte"
},
{
"path": "libs/ui/svelte/components/Wallpaper/index.ts",
"chars": 101,
"preview": "export { default as Wallpaper } from \"./Wallpaper.svelte\";\nexport type { BaseProps } from \"./types\";\n"
},
{
"path": "libs/ui/svelte/components/Wallpaper/types.ts",
"chars": 488,
"preview": "import type { Wallpaper, WallpaperInstanceSettings } from \"@seelen-ui/lib/types\";\n\nexport interface BaseProps {\n defini"
},
{
"path": "libs/ui/svelte/components/Wallpaper/utils.ts",
"chars": 1567,
"preview": "import type { PlaybackSpeed, WallpaperInstanceSettings } from \"@seelen-ui/lib/types\";\nimport { WallpaperConfiguration } "
},
{
"path": "libs/ui/svelte/runes/DarkMode.svelte.ts",
"chars": 256,
"preview": "const darkModeQuery = globalThis.matchMedia(\"(prefers-color-scheme: dark)\");\nexport const prefersDarkColorScheme = $stat"
},
{
"path": "libs/ui/svelte/utils/LazyRune.svelte.ts",
"chars": 3282,
"preview": "/**\n * Structure done to work with async event programming\n *\n * The LazyRune double-check pattern ensures that if an ev"
},
{
"path": "libs/ui/svelte/utils/PersistentRune.svelte.ts",
"chars": 2261,
"preview": "import type { ZodSchema } from \"zod\";\nimport { invoke, SeelenCommand } from \"@seelen-ui/lib\";\nimport { debounce } from \""
},
{
"path": "libs/ui/svelte/utils/hooks.svelte.ts",
"chars": 733,
"preview": "interface Transition {\n readonly loading: boolean;\n readonly error: unknown;\n start: (cb: () => Promise<void>) => Pro"
},
{
"path": "libs/ui/svelte/utils/i18n.ts",
"chars": 1511,
"preview": "import { derived, get, writable } from \"svelte/store\";\n\nexport const locale = writable(\"en\");\nconst messages = writable<"
},
{
"path": "libs/ui/svelte/utils/index.ts",
"chars": 1637,
"preview": "export * from \"./LazyRune.svelte\";\nexport * from \"./PersistentRune.svelte\";\nexport * from \"./i18n\";\n\n// Difference betwe"
},
{
"path": "libs/ui/utils.ts",
"chars": 1480,
"preview": "export function nanosecondsToPlayingTime(nanoseconds: number): string {\n const hours = Math.floor(nanoseconds / 3_600_0"
},
{
"path": "libs/utils/Cargo.toml",
"chars": 218,
"preview": "[package]\nname = \"slu-utils\"\nversion = \"0.0.1\"\nedition = \"2021\"\nrust-version = \"1.89\"\n\n[dependencies]\nminisign = { works"
},
{
"path": "libs/utils/src/checksums.rs",
"chars": 5484,
"preview": "use std::{\n collections::HashMap,\n path::{Path, PathBuf},\n};\n\nuse sha2::{Digest, Sha256};\n\n#[derive(Debug, Clone, "
},
{
"path": "libs/utils/src/debounce.rs",
"chars": 7097,
"preview": "use std::pin::Pin;\nuse std::sync::{mpsc, Arc, Mutex};\nuse std::time::{self, Duration};\n\npub fn debounce<F, T>(closure: F"
},
{
"path": "libs/utils/src/lib.rs",
"chars": 110,
"preview": "mod debounce;\nmod throttle;\n\npub mod checksums;\npub mod signature;\n\npub use debounce::*;\npub use throttle::*;\n"
},
{
"path": "libs/utils/src/signature.rs",
"chars": 2079,
"preview": "use std::io::Cursor;\n\nuse base64::Engine;\nuse minisign::{PublicKeyBox, SecretKeyBox, SignatureBox};\n\n/// Sign data with "
}
]
// ... and 1704 more files (download for full content)
About this extraction
This page contains the full source code of the eythaann/Seelen-UI GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1904 files (3.8 MB), approximately 1.1M tokens, and a symbol index with 3067 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.