1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-05-12 07:19:41 -04:00

Compare commits

..

120 Commits

Author SHA1 Message Date
bbedward
3f24cf37ca settings: make horizontal change more smart 2026-02-24 20:49:02 -05:00
bbedward
01218f34cb settings: restore notifyHorizontalBarChanged 2026-02-24 19:43:01 -05:00
purian23
9da58d8296 fix: Update HTML rendering injections 2026-02-24 19:43:01 -05:00
purian23
af0038e634 dbar: Refactor to memoize dbar & widget state via json 2026-02-24 19:20:30 -05:00
purian23
05c312b9eb cpu widget: Fix monitor binding 2026-02-24 19:20:30 -05:00
bbedward
89d5c958c4 settings: use Image in theme colors tab wp preview 2026-02-24 15:23:07 -05:00
bbedward
e4d86ad595 popout: fully unload popout layers on close 2026-02-24 15:20:00 -05:00
bbedward
532b54a028 wallpaper: handle initial load better, add dms randr command for quick physical scale retrieval 2026-02-24 15:20:00 -05:00
bbedward
504d027c3f privacy indicator: fix width when not active 2026-02-24 13:59:58 -05:00
bbedward
e8f95f4533 settings: use Image for per-mode previews 2026-02-24 13:37:34 -05:00
bbedward
b83256c83a matugen: skip theme refreshes if no colors changed 2026-02-24 13:37:34 -05:00
bbedward
8e2cd21be8 dock: fix tooltip positioning 2026-02-24 13:37:34 -05:00
bbedward
c5413608da dankbar: fix some defaults in reset 2026-02-24 13:37:34 -05:00
bbedward
586bcad442 widgets: set updatesEnabled false on background layers, if qs supports it 2026-02-24 13:37:34 -05:00
bbedward
3b3d10f730 widgets: fix moddedAppID consistency 2026-02-24 13:37:34 -05:00
purian23
4834891b36 settings: Re-adjust dbar layout 2026-02-24 13:37:34 -05:00
purian23
f60e65aecb settings: Dankbar layout updates 2026-02-24 13:37:34 -05:00
purian23
01387b0123 fix: Clipboard button widget alignment 2026-02-24 13:37:34 -05:00
bbedward
1476658c23 dankbar: fix syncing settings to new bars 2026-02-24 13:37:34 -05:00
bbedward
7861c6e316 i18n: term sync 2026-02-24 10:52:35 -05:00
bbedward
d2247d7b24 dankbar: restore horizontal change debounce 2026-02-24 10:52:35 -05:00
bbedward
2ff78d4a02 dpms: disable fade overlay in onRequestMonitorOn 2026-02-24 10:52:35 -05:00
bbedward
785243ce5f dankbar: optimize bindings in bar window 2026-02-24 10:52:35 -05:00
bbedward
0e1b868384 widgets: fix undefined icon warnings 2026-02-24 10:52:35 -05:00
null
2b08e800e8 feat: improve icon resolution and align switcher fallback styling (#1823)
- Implement deep search icon resolution in DesktopService with runtime caching.
- Update Paths.getAppIcon to utilize enhanced resolution for mismatched app IDs.
- Align Workspace Switcher fallback icons with AppsDock visual style.
- Synchronize fallback text logic between Switcher and Dock using app names.
2026-02-24 10:52:35 -05:00
purian23
74e4f8ea1e display: Fix output config on delete & popup height 2026-02-24 10:52:35 -05:00
purian23
9c58569b4c template: Refine bug report tracker 2026-02-24 10:52:35 -05:00
purian23
29de677e00 feat: Refactor DankBar w/New granular options - New background toggles - New maxIcon & maxText widget sizes (global) - Dedicated M3 padding slider - New independent icon scale options - Updated logic to improve performance on single & dual bar modes 2026-02-24 10:52:35 -05:00
purian23
fae4944845 fix: Animated Image warnings 2026-02-24 10:52:34 -05:00
Lucas
07a0ac4b7d doctor: fix imageformats detection (#1811) 2026-02-23 19:45:10 -05:00
bbedward
b2d8f4d73b keybinds: preserve scroll position of expanded item on list change fixes #1766 2026-02-23 19:33:29 -05:00
bbedward
fe58c45233 widgets: fallback when AnimatedImage probe fails to static Image 2026-02-23 19:03:48 -05:00
bbedward
3ea4e389eb thememode: connect to loginctl PrepareForSleep event 2026-02-23 19:03:48 -05:00
purian23
7276f295fc dms-greeter: Update dankinstall greeter automation w/distro packages 2026-02-23 18:53:29 -05:00
bbedward
93ed96a789 launcher: don't tie unload to visibility 2026-02-23 18:53:29 -05:00
purian23
bea325e94c audio: Sync audio hide opts w/dash Output devices 2026-02-23 18:53:29 -05:00
bbedward
2f8f1c30ad audio: fix cycle output, improve icon resolution for sink fixes #1808 2026-02-23 18:53:29 -05:00
Lucas
f859a14173 nix: update flake.lock (#1809) 2026-02-23 18:53:29 -05:00
bbedward
153f39da48 audio: disable effects when mpris player is playing 2026-02-23 18:53:29 -05:00
bbedward
e4accdd1c7 launcher: implement memory for selected tab fixes #1806 2026-02-23 10:20:48 -05:00
dms-ci[bot]
a2c89e0a8c nix: update vendorHash for go.mod changes 2026-02-23 10:20:48 -05:00
bbedward
e282831c2e widgets: make AnimatedImage conditional in DankCircularImage - Cut potential overhead of always using AnimatedImage 2026-02-23 10:20:48 -05:00
bbedward
5c5ff6195a osd: disable media playback OSD by default 2026-02-23 10:20:48 -05:00
Triệu Kha
c4bbf54679 clipboard: fix html elements get parsed in clipboard entry (#1798)
* clipboard: fix html elements get parsed in clipboard entry

* Revert "clipboard: fix html elements get parsed in clipboard entry"

This reverts commit 52b11eeb98.

* clipboard: fix html elements get parsed in clipboard entry
2026-02-23 10:20:48 -05:00
Jonas Bloch
98acafb4b8 fix(notepad): decode path URI when saving/creating a file (#1805) 2026-02-23 10:20:48 -05:00
Jonas Bloch
da20681fc0 feat: add support for animated gifs as profile pictures (#1804) 2026-02-23 10:20:48 -05:00
purian23
b38cb961b2 dms-greeter: Enable greetd via dms greeter install all-in-one cmd 2026-02-23 10:20:48 -05:00
bbedward
7a0bb07518 matugen: unconditionally run portal sync even if matugen errors 2026-02-22 23:09:18 -05:00
purian23
403e3e90a2 dms-greeter: Enhance DMS Greeter dankinstall & packaging across distros - Added support for Debian, Ubuntu, Fedora, Arch, and OpenSUSE on dankinstall / dms greeter install 2026-02-22 23:09:18 -05:00
bbedward
50b91f14b6 launcher: fix frecency ranking in search results fixes #1799 2026-02-22 23:09:18 -05:00
bbedward
b3df47fce0 scripts: fix shellcheck 2026-02-22 23:09:18 -05:00
bbedward
09bd65d746 bluetooth: expose trust/untrust on devices 2026-02-22 23:09:18 -05:00
长夜月玩Fedora
020d56ab7f Add support for 'evernight' distribution in Fedora (#1786) 2026-02-22 23:09:18 -05:00
Triệu Kha
f3bee65da9 Fix dock visible when theres no app (#1797)
* clipboard: improve image thumbnail
- thumbnail image is now bigger
- circular mask has been replaced with rounded rectangular mask

* dock: fix dock still visible when there's no app
2026-02-22 23:09:18 -05:00
purian23
b14b0946e2 feat: DMS Greeter packaging for Debian/OpenSUSE on OBS 2026-02-22 23:09:18 -05:00
Lucas
ca44205f1c zen: add more commands to detection (#1792) 2026-02-22 23:09:18 -05:00
purian23
2d39e8fd2a ipc: Fix DankDash Wallpaper call 2026-02-22 23:09:18 -05:00
purian23
6d4df6e927 theme: Fix Light/Dark mode portal sync 2026-02-22 23:09:18 -05:00
Connor Welsh
b8ab86e6c0 distro: add cups-pk-helper as suggested dependency (#1670) 2026-02-22 23:09:18 -05:00
bbedward
837329a6d8 window rules: default to fixed for width/height part of #1774 2026-02-22 23:09:18 -05:00
purian23
8c6c2ffd23 ubuntu: Fix dms-git Go versioning to restore builds 2026-02-22 23:09:18 -05:00
bbedward
ad3c8b6755 v1.4.3 version file 2026-02-22 23:07:18 -05:00
bbedward
03a8e1e0d5 clipboard: fix memory leak from unbounded offer maps and unguarded file reads 2026-02-20 11:42:14 -05:00
bbedward
4d4d3c20a1 keybinds/niri: fix quote preservation 2026-02-20 11:42:14 -05:00
bbedward
cef16d6bc9 dankdash: fix widgets across different bar section fixes #1764s 2026-02-20 11:42:14 -05:00
bbedward
aafaad1791 core/screenshot: light cleanups 2026-02-20 11:42:14 -05:00
Patrick Fischer
7906fdc2b0 screensaver: emit ActiveChanged on lock/unlock (#1761) 2026-02-20 11:42:14 -05:00
Triệu Kha
397650ca52 clipboard: improve image thumbnail (#1759)
- thumbnail image is now bigger
- circular mask has been replaced with rounded rectangular mask
2026-02-20 11:42:14 -05:00
purian23
826207006a template: Default install method 2026-02-20 11:42:14 -05:00
purian23
58c2fcd31c issues: Template fix 2026-02-20 11:42:14 -05:00
purian23
b2a2b425ec templates: Fix GitHub issue labels 2026-02-20 11:42:14 -05:00
shorinkiwata
942c9c9609 feat(distros): allow CatOS to run DMS installer (#1768)
- This PR adds support for **CatOS**
- CatOS is fully compatible with Arch Linux
2026-02-20 11:42:14 -05:00
purian23
46d6e1cff3 templates: Update DMS issue formats 2026-02-20 11:42:14 -05:00
bbedward
a4137c57c1 running apps: fix ordering on niri 2026-02-19 20:46:26 -05:00
bbedward
1ad8b627f1 launcher: fix premature exit of file search fixes #1749 2026-02-19 16:47:34 -05:00
Jonas Bloch
58a02ce290 Search keybinds fixes (#1748)
* fix: close keybind cheatsheet on escape press

* feat: match all space separated words in keybind cheatsheet search
2026-02-19 16:27:14 -05:00
bbedward
8e1ad1a2be audio: fix hide device not working 2026-02-19 16:24:48 -05:00
bbedward
68cd7ab32c i18n: term sync 2026-02-19 14:11:21 -05:00
Youseffo13
f649ce9a8e Added missing i18n strings and changed reset button (#1746)
* Update it.json

* Enhance SettingsSliderRow: add resetText property and update reset button styling

* added i18n strings

* adjust reset button width to be dynamic based on content size

* added i18n strings

* Update template.json

* reverted changes

* Update it.json

* Update template.json
2026-02-19 14:11:21 -05:00
bbedward
c4df242f07 dankbar: remove behaviors from monitoring widgets 2026-02-19 14:11:21 -05:00
bbedward
26846c8d55 dgop: round computed values to match display format 2026-02-19 14:11:21 -05:00
bbedward
31b44a667c flake: fix dev flake for go 1.25 and ashellchheck 2026-02-19 14:11:21 -05:00
bbedward
4f3b73ee21 hyprland: add serial to output model generator 2026-02-19 09:22:56 -05:00
bbedward
4cfae91f02 dock: fix context menu styling fixes #1742 2026-02-19 09:22:56 -05:00
bbedward
8d947a6e95 dock: fix transparency setting fixes #1739 2026-02-19 09:22:56 -05:00
bbedward
1e84d4252c launcher: improve perf of settings search 2026-02-19 09:22:56 -05:00
bbedward
76072e1d4c launcher: always heuristic lookup cached entries 2026-02-19 09:22:56 -05:00
bbedward
6408dce4a9 launcher v2: always heuristicLookup tab actions 2026-02-18 19:07:30 -05:00
bbedward
0b2e1cca38 i18n: term updates 2026-02-18 18:35:29 -05:00
bbedward
c1bfd8c0b7 system tray: fix to take up 0 space when empty 2026-02-18 18:35:29 -05:00
Youseffo13
90ffa5833b Added Missing i18n strings (#1729)
* inverted dock visibility and position option

* added missing I18n strings

* added missing i18n strings

* added i18n strings

* Added missing i18n strings

* updated translations

* Update it.json
2026-02-18 18:35:29 -05:00
bbedward
169c669286 widgets: add openWith/toggleWith modes for dankbar widgets 2026-02-18 16:24:07 -05:00
bbedward
f8350deafc keybinds: fix escape in keybinds modal 2026-02-18 14:57:53 -05:00
bbedward
0286a1b80b launcher v2: remove calc cc: enhancements for plugins to size details 2026-02-18 14:48:44 -05:00
beluch-dev
7c3e6c1f02 fix: correct parameter name in Hyprland windowrule (no_initial_focus) (#1726)
##Description
This PR corrects the parameter name to match new Hyprland standard.

## Changes
-Before: 'noinitialfocus'
-After: 'no_initial_focus'
2026-02-18 14:48:40 -05:00
bbedward
d2d72db3c9 plugins: fix settings focus loss 2026-02-18 13:36:51 -05:00
Evgeny Zemtsov
f81f861408 handle recycled server object IDs for workspace/group handles (#1725)
When switching tabs rapidly or closing multiple tabs, the taskbar shows
"ghost" workspaces — entries with no name, no coordinates, and no active
state. The ghosts appear at positions where workspaces were removed and
then recreated by the compositor.

When a compositor removes a workspace (sends `removed` event) and the
client calls Destroy(), the proxy is marked as zombie but stays in the
Context.objects map. For server-created objects (IDs >= 0xFF000000), the
server never sends `delete_id`, so the zombie proxy persists indefinitely.

When the compositor later creates a new workspace that gets a recycled
server object ID, GetProxy() returns the old zombie proxy. The dispatch
loop in GetDispatch() checks IsZombie() and silently drops ALL events
for zombie proxies — including property events (name, id, coordinates,
state, capabilities) intended for the new workspace. This causes the
ghost workspaces with empty properties in the UI.

Fix: check IsZombie() when handling `workspace` and `workspace_group`
events that carry a `new_id` argument. If the existing proxy is a
zombie, treat it as absent and create a fresh proxy via
registerServerProxy(), which replaces the zombie in the map. Subsequent
property events are then dispatched to the live proxy.
2026-02-18 13:36:51 -05:00
bbedward
af494543f5 1.4.2: staging ground 2026-02-18 13:36:43 -05:00
bbedward
db4de55338 popout: decouple shadow from content layer 2026-02-18 10:46:01 -05:00
bbedward
37ecbbbbde popout: disable layer after animation 2026-02-18 10:34:21 -05:00
purian23
d6a6d2a438 notifications: Maintain shadow during expansion 2026-02-18 10:34:21 -05:00
purian23
bf1c6eec74 notifications: Update initial popup height surfaces 2026-02-18 10:34:21 -05:00
bbedward
0ddae80584 running apps: fix scroll events being propagated fixes #1724 2026-02-18 10:34:21 -05:00
bbedward
5c96c03bfa matugen: make v4 detection more resilient 2026-02-18 09:57:35 -05:00
bbedward
dfe36e47d8 process list: fix scaling with fonts fixes #1721 2026-02-18 09:57:35 -05:00
purian23
63e1b75e57 dankinstall: Fix Debian ARM64 detection 2026-02-18 09:57:35 -05:00
bbedward
29efdd8598 matugen: detect emacs directory fixes #1720 2026-02-18 09:57:35 -05:00
bbedward
34d03cf11b osd: optimize bindings 2026-02-18 09:57:35 -05:00
bbedward
c339389d44 screenshot: adjust cursor CLI option to be more explicit 2026-02-17 22:28:46 -05:00
bbedward
af5f6eb656 settings: workaround crash 2026-02-17 22:20:19 -05:00
purian23
a6d28e2553 notifications: Tweak animation scale & settings 2026-02-17 22:07:36 -05:00
bbedward
6213267908 settings: guard internal writes from watcher 2026-02-17 22:03:57 -05:00
bbedward
d084114149 cc: fix plugin reloading in bar position changes 2026-02-17 17:25:19 -05:00
bbedward
f6d99eca0d popout: anchor height changing popout surfaces to top and bottom 2026-02-17 17:25:19 -05:00
bbedward
722eb3289e workspaces: fix named workspace icons 2026-02-17 17:25:19 -05:00
bbedward
b7f2bdcb2d dankinstall: no_anim on dms layers 2026-02-17 17:25:19 -05:00
bbedward
11c20db6e6 1.4.1 2026-02-17 14:08:15 -05:00
bbedward
8a4e3f8bb1 system updater: fix hide no update option 2026-02-17 14:08:04 -05:00
bbedward
bc8fe97c13 launcher: fix kb navigation not always showing last delegate in view 2026-02-17 14:08:04 -05:00
bbedward
47262155aa doctor: add qt6-imageformats check 2026-02-17 14:08:04 -05:00
78 changed files with 2902 additions and 2223 deletions

View File

@@ -7,7 +7,7 @@ body:
attributes:
value: |
## DankMaterialShell Bug Report
Limit your report to one issue per submission unless closely related
Limit your report to one issue per submission unless similarly related
- type: dropdown
id: compositor
attributes:
@@ -53,9 +53,9 @@ body:
validations:
required: true
- type: dropdown
id: original_installation_method_different
id: original_installation_method
attributes:
label: Was your original Installation method different?
label: Was this your original Installation method?
options:
- "Yes"
- No (specify below)
@@ -73,7 +73,7 @@ body:
id: dms_doctor
attributes:
label: dms doctor -vC
description: Output of `dms doctor -vC` command — paste between the lines below to keep it collapsed in the issue
description: Output of `dms doctor -vC` command — paste between the details tags below to keep it collapsed in the issue
placeholder: Paste the output of `dms doctor -vC` here
value: |
<details>

View File

@@ -525,5 +525,6 @@ func getCommonCommands() []*cobra.Command {
doctorCmd,
configCmd,
dlCmd,
randrCmd,
}
}

View File

@@ -3,7 +3,9 @@ package main
import (
"context"
"encoding/json"
"errors"
"fmt"
"os"
"time"
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
@@ -95,7 +97,11 @@ func buildMatugenOptions(cmd *cobra.Command) matugen.Options {
func runMatugenGenerate(cmd *cobra.Command, args []string) {
opts := buildMatugenOptions(cmd)
if err := matugen.Run(opts); err != nil {
err := matugen.Run(opts)
switch {
case errors.Is(err, matugen.ErrNoChanges):
os.Exit(2)
case err != nil:
log.Fatalf("Theme generation failed: %v", err)
}
}
@@ -129,7 +135,11 @@ func runMatugenQueue(cmd *cobra.Command, args []string) {
if !wait {
if err := sendServerRequestFireAndForget(request); err != nil {
log.Info("Server unavailable, running synchronously")
if err := matugen.Run(opts); err != nil {
err := matugen.Run(opts)
switch {
case errors.Is(err, matugen.ErrNoChanges):
os.Exit(2)
case err != nil:
log.Fatalf("Theme generation failed: %v", err)
}
return
@@ -146,11 +156,15 @@ func runMatugenQueue(cmd *cobra.Command, args []string) {
resp, ok := tryServerRequest(request)
if !ok {
log.Info("Server unavailable, running synchronously")
if err := matugen.Run(opts); err != nil {
err := matugen.Run(opts)
switch {
case errors.Is(err, matugen.ErrNoChanges):
resultCh <- matugen.ErrNoChanges
case err != nil:
resultCh <- err
return
default:
resultCh <- nil
}
resultCh <- nil
return
}
if resp.Error != "" {
@@ -162,7 +176,10 @@ func runMatugenQueue(cmd *cobra.Command, args []string) {
select {
case err := <-resultCh:
if err != nil {
switch {
case errors.Is(err, matugen.ErrNoChanges):
os.Exit(2)
case err != nil:
log.Fatalf("Theme generation failed: %v", err)
}
fmt.Println("Theme generation completed")

View File

@@ -0,0 +1,58 @@
package main
import (
"encoding/json"
"fmt"
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
"github.com/spf13/cobra"
)
var randrCmd = &cobra.Command{
Use: "randr",
Short: "Query output display information",
Long: "Query Wayland compositor for output names, scales, resolutions and refresh rates via zwlr-output-management",
Run: runRandr,
}
func init() {
randrCmd.Flags().Bool("json", false, "Output in JSON format")
}
type randrJSON struct {
Outputs []randrOutput `json:"outputs"`
}
func runRandr(cmd *cobra.Command, args []string) {
outputs, err := queryRandr()
if err != nil {
log.Fatalf("%v", err)
}
jsonFlag, _ := cmd.Flags().GetBool("json")
if jsonFlag {
data, err := json.Marshal(randrJSON{Outputs: outputs})
if err != nil {
log.Fatalf("failed to marshal JSON: %v", err)
}
fmt.Println(string(data))
return
}
for i, out := range outputs {
if i > 0 {
fmt.Println()
}
status := "enabled"
if !out.Enabled {
status = "disabled"
}
fmt.Printf("%s (%s)\n", out.Name, status)
fmt.Printf(" Scale: %.4g\n", out.Scale)
fmt.Printf(" Resolution: %dx%d\n", out.Width, out.Height)
if out.Refresh > 0 {
fmt.Printf(" Refresh: %.2f Hz\n", float64(out.Refresh)/1000.0)
}
}
}

View File

@@ -0,0 +1,172 @@
package main
import (
"fmt"
"github.com/AvengeMedia/DankMaterialShell/core/internal/proto/wlr_output_management"
wlclient "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
)
type randrOutput struct {
Name string `json:"name"`
Scale float64 `json:"scale"`
Width int32 `json:"width"`
Height int32 `json:"height"`
Refresh int32 `json:"refresh"`
Enabled bool `json:"enabled"`
}
type randrHead struct {
name string
enabled bool
scale float64
currentModeID uint32
modeIDs []uint32
}
type randrMode struct {
width int32
height int32
refresh int32
}
type randrClient struct {
display *wlclient.Display
ctx *wlclient.Context
manager *wlr_output_management.ZwlrOutputManagerV1
heads map[uint32]*randrHead
modes map[uint32]*randrMode
done bool
err error
}
func queryRandr() ([]randrOutput, error) {
display, err := wlclient.Connect("")
if err != nil {
return nil, fmt.Errorf("failed to connect to Wayland: %w", err)
}
c := &randrClient{
display: display,
ctx: display.Context(),
heads: make(map[uint32]*randrHead),
modes: make(map[uint32]*randrMode),
}
defer c.ctx.Close()
registry, err := display.GetRegistry()
if err != nil {
return nil, fmt.Errorf("failed to get registry: %w", err)
}
registry.SetGlobalHandler(func(e wlclient.RegistryGlobalEvent) {
if e.Interface == wlr_output_management.ZwlrOutputManagerV1InterfaceName {
mgr := wlr_output_management.NewZwlrOutputManagerV1(c.ctx)
version := min(e.Version, 4)
mgr.SetHeadHandler(func(e wlr_output_management.ZwlrOutputManagerV1HeadEvent) {
c.handleHead(e)
})
mgr.SetDoneHandler(func(e wlr_output_management.ZwlrOutputManagerV1DoneEvent) {
c.done = true
})
if err := registry.Bind(e.Name, e.Interface, version, mgr); err == nil {
c.manager = mgr
}
}
})
// First roundtrip: discover globals and bind manager
syncCallback, err := display.Sync()
if err != nil {
return nil, fmt.Errorf("failed to sync display: %w", err)
}
syncCallback.SetDoneHandler(func(e wlclient.CallbackDoneEvent) {
if c.manager == nil {
c.err = fmt.Errorf("zwlr_output_manager_v1 protocol not supported by compositor")
c.done = true
}
// Otherwise wait for manager's DoneHandler
})
for !c.done {
if err := c.ctx.Dispatch(); err != nil {
return nil, fmt.Errorf("dispatch error: %w", err)
}
}
if c.err != nil {
return nil, c.err
}
return c.buildOutputs(), nil
}
func (c *randrClient) handleHead(e wlr_output_management.ZwlrOutputManagerV1HeadEvent) {
handle := e.Head
headID := handle.ID()
head := &randrHead{
modeIDs: make([]uint32, 0),
}
c.heads[headID] = head
handle.SetNameHandler(func(e wlr_output_management.ZwlrOutputHeadV1NameEvent) {
head.name = e.Name
})
handle.SetEnabledHandler(func(e wlr_output_management.ZwlrOutputHeadV1EnabledEvent) {
head.enabled = e.Enabled != 0
})
handle.SetScaleHandler(func(e wlr_output_management.ZwlrOutputHeadV1ScaleEvent) {
head.scale = e.Scale
})
handle.SetCurrentModeHandler(func(e wlr_output_management.ZwlrOutputHeadV1CurrentModeEvent) {
head.currentModeID = e.Mode.ID()
})
handle.SetModeHandler(func(e wlr_output_management.ZwlrOutputHeadV1ModeEvent) {
modeHandle := e.Mode
modeID := modeHandle.ID()
head.modeIDs = append(head.modeIDs, modeID)
mode := &randrMode{}
c.modes[modeID] = mode
modeHandle.SetSizeHandler(func(e wlr_output_management.ZwlrOutputModeV1SizeEvent) {
mode.width = e.Width
mode.height = e.Height
})
modeHandle.SetRefreshHandler(func(e wlr_output_management.ZwlrOutputModeV1RefreshEvent) {
mode.refresh = e.Refresh
})
})
}
func (c *randrClient) buildOutputs() []randrOutput {
outputs := make([]randrOutput, 0, len(c.heads))
for _, head := range c.heads {
out := randrOutput{
Name: head.name,
Scale: head.scale,
Enabled: head.enabled,
}
if mode, ok := c.modes[head.currentModeID]; ok {
out.Width = mode.width
out.Height = mode.height
out.Refresh = mode.refresh
}
outputs = append(outputs, out)
}
return outputs
}

View File

@@ -16,8 +16,6 @@ require (
github.com/sblinch/kdl-go v0.0.0-20260121213736-8b7053306ca6
github.com/spf13/cobra v1.10.2
github.com/stretchr/testify v1.11.1
github.com/yeqown/go-qrcode/v2 v2.2.5
github.com/yeqown/go-qrcode/writer/standard v1.3.0
github.com/yuin/goldmark v1.7.16
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
go.etcd.io/bbolt v1.4.3
@@ -34,19 +32,15 @@ require (
github.com/cyphar/filepath-securejoin v0.6.1 // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/fogleman/gg v1.3.0 // indirect
github.com/go-git/gcfg/v2 v2.0.2 // indirect
github.com/go-git/go-billy/v6 v6.0.0-20260209124918-37866f83c2d3 // indirect
github.com/go-logfmt/logfmt v0.6.1 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
github.com/kevinburke/ssh_config v1.6.0 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/pjbgf/sha1cd v0.5.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/sergi/go-diff v1.4.0 // indirect
github.com/stretchr/objx v0.5.3 // indirect
github.com/yeqown/reedsolomon v1.0.0 // indirect
golang.org/x/crypto v0.48.0 // indirect
golang.org/x/net v0.50.0 // indirect
)

View File

@@ -58,8 +58,6 @@ github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
@@ -77,8 +75,6 @@ github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=
github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -119,8 +115,6 @@ github.com/pilebones/go-udev v0.9.1 h1:uN72M1C1fgzhsVmBGEM8w9RD1JY4iVsPZpr+Z6rb3
github.com/pilebones/go-udev v0.9.1/go.mod h1:Bgcl07crebF3JSeS4+nuaRvhWFdCeFoBhXXeAp93XNo=
github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0=
github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
@@ -148,12 +142,6 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
github.com/yeqown/go-qrcode/v2 v2.2.5 h1:HCOe2bSjkhZyYoyyNaXNzh4DJZll6inVJQQw+8228Zk=
github.com/yeqown/go-qrcode/v2 v2.2.5/go.mod h1:uHpt9CM0V1HeXLz+Wg5MN50/sI/fQhfkZlOM+cOTHxw=
github.com/yeqown/go-qrcode/writer/standard v1.3.0 h1:chdyhEfRtUPgQtuPeaWVGQ/TQx4rE1PqeoW3U+53t34=
github.com/yeqown/go-qrcode/writer/standard v1.3.0/go.mod h1:O4MbzsotGCvy8upYPCR91j81dr5XLT7heuljcNXW+oQ=
github.com/yeqown/reedsolomon v1.0.0 h1:x1h/Ej/uJnNu8jaX7GLHBWmZKCAWjEJTetkqaabr4B0=
github.com/yeqown/reedsolomon v1.0.0/go.mod h1:P76zpcn2TCuL0ul1Fso373qHRc69LKwAw/Iy6g1WiiM=
github.com/yuin/goldmark v1.4.15/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE=
github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg=

View File

@@ -1,7 +1,9 @@
package matugen
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"math"
"os"
@@ -19,6 +21,8 @@ import (
"github.com/lucasb-eyer/go-colorful"
)
var ErrNoChanges = errors.New("no color changes")
type ColorMode string
const (
@@ -160,39 +164,45 @@ func Run(opts Options) error {
log.Infof("Building theme: %s %s (%s)", opts.Kind, opts.Value, opts.Mode)
buildErr := buildOnce(&opts)
changed, buildErr := buildOnce(&opts)
if buildErr != nil {
return buildErr
}
if !changed {
log.Info("No color changes detected, skipping refresh")
return ErrNoChanges
}
if opts.SyncModeWithPortal {
syncColorScheme(opts.Mode)
}
if buildErr != nil {
return buildErr
}
log.Info("Done")
return nil
}
func buildOnce(opts *Options) error {
func buildOnce(opts *Options) (bool, error) {
cfgFile, err := os.CreateTemp("", "matugen-config-*.toml")
if err != nil {
return fmt.Errorf("failed to create temp config: %w", err)
return false, fmt.Errorf("failed to create temp config: %w", err)
}
defer os.Remove(cfgFile.Name())
defer cfgFile.Close()
tmpDir, err := os.MkdirTemp("", "matugen-templates-*")
if err != nil {
return fmt.Errorf("failed to create temp dir: %w", err)
return false, fmt.Errorf("failed to create temp dir: %w", err)
}
defer os.RemoveAll(tmpDir)
if err := buildMergedConfig(opts, cfgFile, tmpDir); err != nil {
return fmt.Errorf("failed to build config: %w", err)
return false, fmt.Errorf("failed to build config: %w", err)
}
cfgFile.Close()
oldColors, _ := os.ReadFile(opts.ColorsOutput())
var primaryDark, primaryLight, surface string
var dank16JSON string
var importArgs []string
@@ -204,7 +214,7 @@ func buildOnce(opts *Options) error {
surface = extractNestedColor(opts.StockColors, "surface", "dark")
if primaryDark == "" {
return fmt.Errorf("failed to extract primary dark from stock colors")
return false, fmt.Errorf("failed to extract primary dark from stock colors")
}
if primaryLight == "" {
primaryLight = primaryDark
@@ -218,14 +228,14 @@ func buildOnce(opts *Options) error {
args := []string{"color", "hex", primaryDark, "-m", string(opts.Mode), "-t", opts.MatugenType, "-c", cfgFile.Name()}
args = append(args, importArgs...)
if err := runMatugen(args); err != nil {
return err
return false, err
}
} else {
log.Infof("Using dynamic theme from %s: %s", opts.Kind, opts.Value)
matJSON, err := runMatugenDryRun(opts)
if err != nil {
return fmt.Errorf("matugen dry-run failed: %w", err)
return false, fmt.Errorf("matugen dry-run failed: %w", err)
}
primaryDark = extractMatugenColor(matJSON, "primary", "dark")
@@ -233,7 +243,7 @@ func buildOnce(opts *Options) error {
surface = extractMatugenColor(matJSON, "surface", "dark")
if primaryDark == "" {
return fmt.Errorf("failed to extract primary color")
return false, fmt.Errorf("failed to extract primary color")
}
if primaryLight == "" {
primaryLight = primaryDark
@@ -254,10 +264,15 @@ func buildOnce(opts *Options) error {
args = append(args, "-m", string(opts.Mode), "-t", opts.MatugenType, "-c", cfgFile.Name())
args = append(args, importArgs...)
if err := runMatugen(args); err != nil {
return err
return false, err
}
}
newColors, _ := os.ReadFile(opts.ColorsOutput())
if bytes.Equal(oldColors, newColors) && len(oldColors) > 0 {
return false, nil
}
if isDMSGTKActive(opts.ConfigDir) {
switch opts.Mode {
case ColorModeLight:
@@ -275,7 +290,7 @@ func buildOnce(opts *Options) error {
signalTerminals(opts)
return nil
return true, nil
}
func buildMergedConfig(opts *Options, cfgFile *os.File, tmpDir string) error {

View File

@@ -2,6 +2,7 @@ package matugen
import (
"context"
"errors"
"sync"
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
@@ -93,10 +94,13 @@ func (q *Queue) runWorker() {
err := Run(job.Options)
var result Result
if err != nil {
result = Result{Success: false, Error: err}
} else {
switch {
case err == nil:
result = Result{Success: true}
case errors.Is(err, ErrNoChanges):
result = Result{Success: true}
default:
result = Result{Success: false, Error: err}
}
q.finishJob(result)

View File

@@ -1062,62 +1062,6 @@ func (_c *MockBackend_GetWiFiNetworkDetails_Call) RunAndReturn(run func(string)
return _c
}
// GetWiFiQRCodeContent provides a mock function with given fields: ssid
func (_m *MockBackend) GetWiFiQRCodeContent(ssid string) (string, error) {
ret := _m.Called(ssid)
if len(ret) == 0 {
panic("no return value specified for GetWiFiQRCodeContent")
}
var r0 string
var r1 error
if rf, ok := ret.Get(0).(func(string) (string, error)); ok {
return rf(ssid)
}
if rf, ok := ret.Get(0).(func(string) string); ok {
r0 = rf(ssid)
} else {
r0 = ret.Get(0).(string)
}
if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(ssid)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// MockBackend_GetWiFiQRCodeContent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWiFiQRCodeContent'
type MockBackend_GetWiFiQRCodeContent_Call struct {
*mock.Call
}
// GetWiFiQRCodeContent is a helper method to define mock.On call
// - ssid string
func (_e *MockBackend_Expecter) GetWiFiQRCodeContent(ssid interface{}) *MockBackend_GetWiFiQRCodeContent_Call {
return &MockBackend_GetWiFiQRCodeContent_Call{Call: _e.mock.On("GetWiFiQRCodeContent", ssid)}
}
func (_c *MockBackend_GetWiFiQRCodeContent_Call) Run(run func(ssid string)) *MockBackend_GetWiFiQRCodeContent_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(string))
})
return _c
}
func (_c *MockBackend_GetWiFiQRCodeContent_Call) Return(_a0 string, _a1 error) *MockBackend_GetWiFiQRCodeContent_Call {
_c.Call.Return(_a0, _a1)
return _c
}
func (_c *MockBackend_GetWiFiQRCodeContent_Call) RunAndReturn(run func(string) (string, error)) *MockBackend_GetWiFiQRCodeContent_Call {
_c.Call.Return(run)
return _c
}
// GetWiredConnections provides a mock function with no fields
func (_m *MockBackend) GetWiredConnections() ([]network.WiredConnection, error) {
ret := _m.Called()

View File

@@ -10,7 +10,6 @@ type Backend interface {
ScanWiFi() error
ScanWiFiDevice(device string) error
GetWiFiNetworkDetails(ssid string) (*NetworkInfoResponse, error)
GetWiFiQRCodeContent(ssid string) (string, error)
GetWiFiDevices() []WiFiDevice
ConnectWiFi(req ConnectionRequest) error

View File

@@ -111,10 +111,6 @@ func (b *HybridIwdNetworkdBackend) GetWiFiNetworkDetails(ssid string) (*NetworkI
return b.wifi.GetWiFiNetworkDetails(ssid)
}
func (b *HybridIwdNetworkdBackend) GetWiFiQRCodeContent(ssid string) (string, error) {
return b.wifi.GetWiFiQRCodeContent(ssid)
}
func (b *HybridIwdNetworkdBackend) ConnectWiFi(req ConnectionRequest) error {
if err := b.wifi.ConnectWiFi(req); err != nil {
return err

View File

@@ -1,9 +1,6 @@
package network
import (
"fmt"
"os"
)
import "fmt"
func (b *IWDBackend) GetWiredConnections() ([]WiredConnection, error) {
return nil, fmt.Errorf("wired connections not supported by iwd")
@@ -115,19 +112,3 @@ func (b *IWDBackend) getWiFiDevicesLocked() []WiFiDevice {
Networks: b.state.WiFiNetworks,
}}
}
func (b *IWDBackend) GetWiFiQRCodeContent(ssid string) (string, error) {
path := iwdConfigPath(ssid)
data, err := os.ReadFile(path)
if err != nil {
return "", fmt.Errorf("no saved iwd config for `%s`: %w", ssid, err)
}
passphrase, err := parseIWDPassphrase(string(data))
if err != nil {
return "", fmt.Errorf("failed to read passphrase for `%s`: %w", ssid, err)
}
return FormatWiFiQRString("WPA", ssid, passphrase), nil
}

View File

@@ -18,10 +18,6 @@ func (b *SystemdNetworkdBackend) GetWiFiNetworkDetails(ssid string) (*NetworkInf
return nil, fmt.Errorf("WiFi details not supported by networkd backend")
}
func (b *SystemdNetworkdBackend) GetWiFiQRCodeContent(ssid string) (string, error) {
return "", fmt.Errorf("WiFi QR Code not supported by networkd backend")
}
func (b *SystemdNetworkdBackend) ConnectWiFi(req ConnectionRequest) error {
return fmt.Errorf("WiFi connect not supported by networkd backend")
}

View File

@@ -196,65 +196,6 @@ func (b *NetworkManagerBackend) GetWiFiNetworkDetails(ssid string) (*NetworkInfo
}, nil
}
func (b *NetworkManagerBackend) GetWiFiQRCodeContent(ssid string) (string, error) {
conn, err := b.findConnection(ssid)
if err != nil {
return "", fmt.Errorf("no saved connection for `%s`: %w", ssid, err)
}
connSettings, err := conn.GetSettings()
if err != nil {
return "", fmt.Errorf("failed to get settings for `%s`: %w", ssid, err)
}
secSettings, ok := connSettings["802-11-wireless-security"]
if !ok {
return "", fmt.Errorf("network `%s` has no security settings", ssid)
}
keyMgmt, ok := secSettings["key-mgmt"].(string)
if !ok {
return "", fmt.Errorf("failed to identify security type of network `%s`", ssid)
}
var securityType string
switch keyMgmt {
case "none":
authAlg, _ := secSettings["auth-alg"].(string)
switch authAlg {
case "open":
securityType = "nopass"
default:
securityType = "WEP"
}
case "ieee8021x":
securityType = "WEP"
default:
securityType = "WPA"
}
if securityType != "WPA" {
return "", fmt.Errorf("QR code generation only supports WPA connections, `%s` uses %s", ssid, securityType)
}
secrets, err := conn.GetSecrets("802-11-wireless-security")
if err != nil {
return "", fmt.Errorf("failed to retrieve connection secrets for `%s`: %w", ssid, err)
}
secSecrets, ok := secrets["802-11-wireless-security"]
if !ok {
return "", fmt.Errorf("failed to retrieve password for `%s`", ssid)
}
psk, ok := secSecrets["psk"].(string)
if !ok {
return "", fmt.Errorf("failed to retrieve password for `%s`", ssid)
}
return FormatWiFiQRString(securityType, ssid, psk), nil
}
func (b *NetworkManagerBackend) ConnectWiFi(req ConnectionRequest) error {
devInfo, err := b.getWifiDeviceForConnection(req.Device)
if err != nil {

View File

@@ -4,7 +4,6 @@ import (
"encoding/json"
"fmt"
"net"
"os"
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
@@ -41,10 +40,6 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
handleSetPreference(conn, req, manager)
case "network.info":
handleGetNetworkInfo(conn, req, manager)
case "network.qrcode":
handleGetNetworkQRCode(conn, req, manager)
case "network.delete-qrcode":
handleDeleteQRCode(conn, req, manager)
case "network.ethernet.info":
handleGetWiredNetworkInfo(conn, req, manager)
case "network.subscribe":
@@ -325,42 +320,6 @@ func handleGetNetworkInfo(conn net.Conn, req models.Request, manager *Manager) {
models.Respond(conn, req.ID, network)
}
func handleGetNetworkQRCode(conn net.Conn, req models.Request, manager *Manager) {
ssid, err := params.String(req.Params, "ssid")
if err != nil {
models.RespondError(conn, req.ID, err.Error())
return
}
content, err := manager.GetNetworkQRCode(ssid)
if err != nil {
models.RespondError(conn, req.ID, err.Error())
return
}
models.Respond(conn, req.ID, content)
}
func handleDeleteQRCode(conn net.Conn, req models.Request, _ *Manager) {
path, err := params.String(req.Params, "path")
if err != nil {
models.RespondError(conn, req.ID, err.Error())
return
}
if !isValidQRCodePath(path) {
models.RespondError(conn, req.ID, "invalid QR code path")
return
}
if err := os.Remove(path); err != nil {
models.RespondError(conn, req.ID, err.Error())
return
}
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "QR code file deleted"})
}
func handleGetWiredNetworkInfo(conn net.Conn, req models.Request, manager *Manager) {
uuid, err := params.String(req.Params, "uuid")
if err != nil {

View File

@@ -6,8 +6,6 @@ import (
"time"
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
"github.com/yeqown/go-qrcode/v2"
"github.com/yeqown/go-qrcode/writer/standard"
)
func NewManager() (*Manager, error) {
@@ -440,43 +438,6 @@ func (m *Manager) GetNetworkInfoDetailed(ssid string) (*NetworkInfoResponse, err
return m.backend.GetWiFiNetworkDetails(ssid)
}
func (m *Manager) GetNetworkQRCode(ssid string) ([2]string, error) {
content, err := m.backend.GetWiFiQRCodeContent(ssid)
if err != nil {
return [2]string{}, err
}
qrc, err := qrcode.New(content)
if err != nil {
return [2]string{}, fmt.Errorf("failed to create QR code for `%s`: %w", ssid, err)
}
pathThemed, pathNormal := qrCodePaths(ssid)
wThemed, err := standard.New(
pathThemed,
standard.WithBuiltinImageEncoder(standard.PNG_FORMAT),
standard.WithBgTransparent(),
standard.WithFgColorRGBHex("#ffffff"),
)
if err != nil {
return [2]string{}, fmt.Errorf("failed to create QR code writer: %w", err)
}
if err := qrc.Save(wThemed); err != nil {
return [2]string{}, fmt.Errorf("failed to save QR code for `%s`: %w", ssid, err)
}
wNormal, err := standard.New(pathNormal, standard.WithBuiltinImageEncoder(standard.PNG_FORMAT))
if err != nil {
return [2]string{}, fmt.Errorf("failed to create QR code writer: %w", err)
}
if err := qrc.Save(wNormal); err != nil {
return [2]string{}, fmt.Errorf("failed to save QR code for `%s`: %w", ssid, err)
}
return [2]string{pathThemed, pathNormal}, nil
}
func (m *Manager) ToggleWiFi() error {
enabled, err := m.backend.GetWiFiEnabled()
if err != nil {

View File

@@ -1,59 +0,0 @@
package network
import (
"fmt"
"path/filepath"
"regexp"
"strings"
)
const qrCodeTmpPrefix = "/tmp/dank-wifi-qrcode-"
func FormatWiFiQRString(securityType, ssid, password string) string {
return fmt.Sprintf("WIFI:T:%s;S:%s;P:%s;;", securityType, ssid, password)
}
func qrCodePaths(ssid string) (themed, normal string) {
safe := sanitizeSSIDForPath(ssid)
themed = fmt.Sprintf("%s%s-themed.png", qrCodeTmpPrefix, safe)
normal = fmt.Sprintf("%s%s-normal.png", qrCodeTmpPrefix, safe)
return
}
func isValidQRCodePath(path string) bool {
clean := filepath.Clean(path)
return strings.HasPrefix(clean, qrCodeTmpPrefix) && strings.HasSuffix(clean, ".png")
}
var safePathChar = regexp.MustCompile(`[^a-zA-Z0-9_-]`)
func sanitizeSSIDForPath(ssid string) string {
return safePathChar.ReplaceAllString(ssid, "_")
}
var iwdVerbatimSSID = regexp.MustCompile(`^[a-zA-Z0-9 _-]+$`)
func iwdConfigPath(ssid string) string {
switch {
case iwdVerbatimSSID.MatchString(ssid):
return fmt.Sprintf("/var/lib/iwd/%s.psk", ssid)
default:
return fmt.Sprintf("/var/lib/iwd/=%x.psk", []byte(ssid))
}
}
func parseIWDPassphrase(data string) (string, error) {
inSecurity := false
for _, line := range strings.Split(data, "\n") {
line = strings.TrimSpace(line)
switch {
case line == "[Security]":
inSecurity = true
case strings.HasPrefix(line, "["):
inSecurity = false
case inSecurity && strings.HasPrefix(line, "Passphrase="):
return strings.TrimPrefix(line, "Passphrase="), nil
}
}
return "", fmt.Errorf("no passphrase found in iwd config")
}

View File

@@ -27,12 +27,12 @@ override_dh_auto_build:
# Verify core directory exists (native package format has source at root)
test -d core || (echo "ERROR: core directory not found!" && exit 1)
# Pin go.mod and vendor/modules.txt to the installed Go toolchain version
GO_INSTALLED=$$(go version | grep -oP 'go\K[0-9]+\.[0-9]+'); \
sed -i "s/^go [0-9]\+\.[0-9]\+\(\.[0-9]*\)\?$$/go $${GO_INSTALLED}/" core/go.mod; \
sed -i "s/^\(## explicit; go \)[0-9]\+\.[0-9]\+\(\.[0-9]*\)\?$$/\1$${GO_INSTALLED}/" core/vendor/modules.txt
# Patch go.mod to use Go 1.24 base version (Debian 13 has 1.23.x, may vary)
sed -i 's/^go 1\.24\.[0-9]*/go 1.24/' core/go.mod
# Build dms-cli (single shell to preserve variables; arch: Debian amd64/arm64 -> Makefile amd64/arm64)
# Build dms-cli from source using vendored dependencies
# Extract version info and build in single shell to preserve variables
# Architecture mapping: Debian amd64/arm64 -> Makefile amd64/arm64
VERSION="$(UPSTREAM_VERSION)"; \
COMMIT=$$(echo "$(UPSTREAM_VERSION)" | grep -oP '(?<=git)[0-9]+\.[a-f0-9]+' | cut -d. -f2 | head -c8 || echo "unknown"); \
if [ "$(DEB_HOST_ARCH)" = "amd64" ]; then \

View File

@@ -3,7 +3,6 @@
%global debug_package %{nil}
%global version {{{ git_repo_version }}}
%global pkg_summary DankMaterialShell - Material 3 inspired shell for Wayland compositors
%global go_toolchain_version 1.25.7
Name: dms
Epoch: 2
@@ -15,12 +14,12 @@ License: MIT
URL: https://github.com/AvengeMedia/DankMaterialShell
VCS: {{{ git_repo_vcs }}}
Source0: {{{ git_repo_pack }}}
Source1: https://go.dev/dl/go%{go_toolchain_version}.linux-amd64.tar.gz
Source2: https://go.dev/dl/go%{go_toolchain_version}.linux-arm64.tar.gz
BuildRequires: git-core
BuildRequires: gzip
BuildRequires: golang >= 1.24
BuildRequires: make
BuildRequires: wget
BuildRequires: systemd-rpm-macros
# Core requirements
@@ -29,7 +28,7 @@ Requires: accountsservice
Requires: dms-cli = %{epoch}:%{version}-%{release}
Requires: dgop
# Core utilities (Recommended for DMS functionality)
# Core utilities (Highly recommended for DMS functionality)
Recommends: cava
Recommends: danksearch
Recommends: matugen
@@ -67,28 +66,6 @@ Provides native DBus bindings, NetworkManager integration, and system utilities.
VERSION="%{version}"
COMMIT=$(echo "%{version}" | grep -oP '[a-f0-9]{7,}' | head -n1 || echo "unknown")
# Use pinned bundled Go toolchain (deterministic across chroots)
case "%{_arch}" in
x86_64)
GO_TARBALL="%{_sourcedir}/go%{go_toolchain_version}.linux-amd64.tar.gz"
;;
aarch64)
GO_TARBALL="%{_sourcedir}/go%{go_toolchain_version}.linux-arm64.tar.gz"
;;
*)
echo "Unsupported architecture for bundled Go: %{_arch}"
exit 1
;;
esac
rm -rf .go
tar -xzf "$GO_TARBALL"
mv go .go
export GOROOT="$PWD/.go"
export PATH="$GOROOT/bin:$PATH"
export GOTOOLCHAIN=local
go version
cd core
make dist VERSION="$VERSION" COMMIT="$COMMIT"

View File

@@ -56,10 +56,8 @@ mkdir -p $HOME $GOCACHE $GOMODCACHE
# OBS has no network access, so use local toolchain only
export GOTOOLCHAIN=local
# Pin go.mod and vendor/modules.txt to the installed Go toolchain version
GO_INSTALLED=$(go version | grep -oP 'go\K[0-9]+\.[0-9]+')
sed -i "s/^go [0-9]\+\.[0-9]\+\(\.[0-9]*\)\?$/go ${GO_INSTALLED}/" core/go.mod
sed -i "s/^\(## explicit; go \)[0-9]\+\.[0-9]\+\(\.[0-9]*\)\?$/\1${GO_INSTALLED}/" core/vendor/modules.txt
# Patch go.mod to use base Go version (e.g., go 1.24 instead of go 1.24.6)
sed -i 's/^go 1\.24\.[0-9]*/go 1.24/' core/go.mod
# Extract version info for embedding in binary
VERSION="%{version}"

View File

@@ -182,7 +182,6 @@
with pkgs;
[
go_1_25
go-mockery_2
gopls
delve
go-tools

View File

@@ -1 +1 @@
The Wolverine
Saffron Bloom

View File

@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import Quickshell
import QtCore
import qs.Services
Singleton {
id: root
@@ -83,7 +84,12 @@ Singleton {
if (desktopEntry && desktopEntry.icon) {
return Quickshell.iconPath(desktopEntry.icon, true);
}
return Quickshell.iconPath(appId, true);
const icon = Quickshell.iconPath(appId, true);
if (icon && icon !== "")
return icon;
return DesktopService.resolveIconPath(appId);
}
function getAppName(appId: string, desktopEntry: var): string {

View File

@@ -575,7 +575,7 @@ Singleton {
"maximizeWidgetIcons": false,
"maximizeWidgetText": false,
"removeWidgetPadding": false,
"widgetPadding": 12,
"widgetPadding": 8,
"gothCornersEnabled": false,
"gothCornerRadiusOverride": false,
"gothCornerRadiusValue": 12,

View File

@@ -398,7 +398,7 @@ var SPEC = {
maximizeWidgetIcons: false,
maximizeWidgetText: false,
removeWidgetPadding: false,
widgetPadding: 12,
widgetPadding: 8,
gothCornersEnabled: false,
gothCornerRadiusOverride: false,
gothCornerRadiusValue: 12,

View File

@@ -142,25 +142,45 @@ Item {
fadeDpmsWindowLoader.item.cancelFade();
}
}
function onRequestMonitorOn() {
if (!fadeDpmsWindowLoader.item)
return;
fadeDpmsWindowLoader.item.cancelFade();
}
}
}
}
property string _barLayoutStateJson: {
const configs = SettingsData.barConfigs;
const mapped = configs.map(c => ({
id: c.id,
position: c.position,
autoHide: c.autoHide,
visible: c.visible
})).sort((a, b) => {
const aVertical = a.position === SettingsData.Position.Left || a.position === SettingsData.Position.Right;
const bVertical = b.position === SettingsData.Position.Left || b.position === SettingsData.Position.Right;
if (aVertical !== bVertical) {
return aVertical - bVertical;
}
return String(a.id).localeCompare(String(b.id));
});
return JSON.stringify(mapped);
}
on_BarLayoutStateJsonChanged: {
if (typeof dockRecreateDebounce !== "undefined") {
dockRecreateDebounce.restart();
}
}
Repeater {
id: dankBarRepeater
model: ScriptModel {
id: barRepeaterModel
values: {
const configs = SettingsData.barConfigs;
return configs.map(c => ({
id: c.id,
position: c.position
})).sort((a, b) => {
const aVertical = a.position === SettingsData.Position.Left || a.position === SettingsData.Position.Right;
const bVertical = b.position === SettingsData.Position.Left || b.position === SettingsData.Position.Right;
return aVertical - bVertical;
});
}
values: JSON.parse(root._barLayoutStateJson)
}
property var hyprlandOverviewLoaderRef: hyprlandOverviewLoader
@@ -207,13 +227,6 @@ Item {
PolkitService.polkitAvailable;
}
Connections {
target: SettingsData
function onBarConfigsChanged() {
dockRecreateDebounce.restart();
}
}
Loader {
id: dockLoader
active: root.dockEnabled
@@ -265,6 +278,7 @@ Item {
sourceComponent: Component {
DankDashPopout {
id: dankDashPopout
onPopoutClosed: PopoutService.unloadDankDash()
}
}
}
@@ -284,8 +298,13 @@ Item {
active: false
Component.onCompleted: {
PopoutService.notificationCenterLoader = notificationCenterLoader;
}
NotificationCenterPopout {
id: notificationCenter
onPopoutClosed: PopoutService.unloadNotificationCenter()
Component.onCompleted: {
PopoutService.notificationCenterPopout = notificationCenter;
@@ -309,10 +328,15 @@ Item {
property var modalRef: colorPickerModal
property LazyLoader powerModalLoaderRef: powerMenuModalLoader
Component.onCompleted: {
PopoutService.controlCenterLoader = controlCenterLoader;
}
ControlCenterPopout {
id: controlCenterPopout
colorPickerModal: controlCenterLoader.modalRef
powerMenuModalLoader: controlCenterLoader.powerModalLoaderRef
onPopoutClosed: PopoutService.unloadControlCenter()
onLockRequested: {
lock.activate();
@@ -341,23 +365,6 @@ Item {
}
}
LazyLoader {
id: wifiQRCodeModalLoader
active: false
Component.onCompleted: {
PopoutService.wifiQRCodeModalLoader = wifiQRCodeModalLoader;
}
WifiQRCodeModal {
id: wifiQRCodeModalItem
Component.onCompleted: {
PopoutService.wifiQRCodeModal = wifiQRCodeModalItem;
}
}
}
LazyLoader {
id: polkitAuthModalLoader
active: false
@@ -437,8 +444,13 @@ Item {
active: false
Component.onCompleted: {
PopoutService.batteryPopoutLoader = batteryPopoutLoader;
}
BatteryPopout {
id: batteryPopout
onPopoutClosed: PopoutService.unloadBattery()
Component.onCompleted: {
PopoutService.batteryPopout = batteryPopout;
@@ -451,8 +463,13 @@ Item {
active: false
Component.onCompleted: {
PopoutService.layoutPopoutLoader = layoutPopoutLoader;
}
DWLLayoutPopout {
id: layoutPopout
onPopoutClosed: PopoutService.unloadLayoutPopout()
Component.onCompleted: {
PopoutService.layoutPopout = layoutPopout;
@@ -465,8 +482,13 @@ Item {
active: false
Component.onCompleted: {
PopoutService.vpnPopoutLoader = vpnPopoutLoader;
}
VpnPopout {
id: vpnPopout
onPopoutClosed: PopoutService.unloadVpn()
Component.onCompleted: {
PopoutService.vpnPopout = vpnPopout;
@@ -479,8 +501,13 @@ Item {
active: false
Component.onCompleted: {
PopoutService.processListPopoutLoader = processListPopoutLoader;
}
ProcessListPopout {
id: processListPopout
onPopoutClosed: PopoutService.unloadProcessListPopout()
Component.onCompleted: {
PopoutService.processListPopout = processListPopout;
@@ -523,8 +550,13 @@ Item {
active: false
Component.onCompleted: {
PopoutService.appDrawerLoader = appDrawerLoader;
}
AppDrawerPopout {
id: appDrawerPopout
onPopoutClosed: PopoutService.unloadAppDrawer()
Component.onCompleted: {
PopoutService.appDrawerPopout = appDrawerPopout;
@@ -556,8 +588,13 @@ Item {
active: false
Component.onCompleted: {
PopoutService.clipboardHistoryPopoutLoader = clipboardHistoryPopoutLoader;
}
ClipboardHistoryPopout {
id: clipboardHistoryPopout
onPopoutClosed: PopoutService.unloadClipboardHistoryPopout()
Component.onCompleted: {
PopoutService.clipboardHistoryPopout = clipboardHistoryPopout;
@@ -732,8 +769,13 @@ Item {
active: false
Component.onCompleted: {
PopoutService.systemUpdateLoader = systemUpdateLoader;
}
SystemUpdatePopout {
id: systemUpdatePopout
onPopoutClosed: PopoutService.unloadSystemUpdate()
Component.onCompleted: {
PopoutService.systemUpdatePopout = systemUpdatePopout;

View File

@@ -162,11 +162,6 @@ Item {
}
]
property string fileSearchType: "all"
property string fileSearchExt: ""
property string fileSearchFolder: ""
property string fileSearchSort: "score"
property string pluginFilter: ""
property string activePluginName: ""
property var activePluginCategories: []
@@ -351,10 +346,6 @@ Item {
previousSearchMode = "all";
autoSwitchedToFiles = false;
isFileSearching = false;
fileSearchType = "all";
fileSearchExt = "";
fileSearchFolder = "";
fileSearchSort = "score";
sections = [];
flatModel = [];
selectedFlatIndex = 0;
@@ -408,34 +399,6 @@ Item {
performSearch();
}
function setFileSearchType(type) {
if (fileSearchType === type)
return;
fileSearchType = type;
performFileSearch();
}
function setFileSearchExt(ext) {
if (fileSearchExt === ext)
return;
fileSearchExt = ext;
performFileSearch();
}
function setFileSearchFolder(folder) {
if (fileSearchFolder === folder)
return;
fileSearchFolder = folder;
performFileSearch();
}
function setFileSearchSort(sort) {
if (fileSearchSort === sort)
return;
fileSearchSort = sort;
performFileSearch();
}
function clearPluginFilter() {
if (pluginFilter) {
pluginFilter = "";
@@ -864,20 +827,10 @@ Item {
var params = {
limit: 20,
fuzzy: true,
sort: fileSearchSort || "score",
sort: "score",
desc: true
};
if (DSearchService.supportsTypeFilter) {
params.type = (fileSearchType && fileSearchType !== "all") ? fileSearchType : "all";
}
if (fileSearchExt) {
params.ext = fileSearchExt;
}
if (fileSearchFolder) {
params.folder = fileSearchFolder;
}
DSearchService.search(fileQuery, params, function (response) {
isFileSearching = false;
if (response.error)
@@ -887,73 +840,34 @@ Item {
for (var i = 0; i < hits.length; i++) {
var hit = hits[i];
var docTypes = hit.locations?.doc_type;
var isDir = docTypes ? !!docTypes["dir"] : false;
fileItems.push(transformFileResult({
path: hit.id || "",
score: hit.score || 0,
is_dir: isDir
score: hit.score || 0
}));
}
var fileSections = [];
var showType = fileSearchType || "all";
if (showType === "all" && DSearchService.supportsTypeFilter) {
var onlyFiles = [];
var onlyDirs = [];
for (var j = 0; j < fileItems.length; j++) {
if (fileItems[j].data?.is_dir)
onlyDirs.push(fileItems[j]);
else
onlyFiles.push(fileItems[j]);
}
if (onlyFiles.length > 0) {
fileSections.push({
id: "files",
title: I18n.tr("Files"),
icon: "insert_drive_file",
priority: 4,
items: onlyFiles,
collapsed: collapsedSections["files"] || false,
flatStartIndex: 0
});
}
if (onlyDirs.length > 0) {
fileSections.push({
id: "folders",
title: I18n.tr("Folders"),
icon: "folder",
priority: 4.1,
items: onlyDirs,
collapsed: collapsedSections["folders"] || false,
flatStartIndex: 0
});
}
} else {
var filesIcon = showType === "dir" ? "folder" : showType === "file" ? "insert_drive_file" : "folder";
var filesTitle = showType === "dir" ? I18n.tr("Folders") : I18n.tr("Files");
if (fileItems.length > 0) {
fileSections.push({
id: "files",
title: filesTitle,
icon: filesIcon,
priority: 4,
items: fileItems,
collapsed: collapsedSections["files"] || false,
flatStartIndex: 0
});
}
}
var fileSection = {
id: "files",
title: I18n.tr("Files"),
icon: "folder",
priority: 4,
items: fileItems,
collapsed: collapsedSections["files"] || false,
flatStartIndex: 0
};
var newSections;
if (searchMode === "files") {
newSections = fileSections;
newSections = fileItems.length > 0 ? [fileSection] : [];
} else {
var existingNonFile = sections.filter(function (s) {
return s.id !== "files" && s.id !== "folders";
return s.id !== "files";
});
newSections = existingNonFile.concat(fileSections);
if (fileItems.length > 0) {
newSections = existingNonFile.concat([fileSection]);
} else {
newSections = existingNonFile;
}
}
newSections.sort(function (a, b) {
return a.priority - b.priority;
@@ -999,7 +913,7 @@ Item {
}
function transformFileResult(file) {
return Transform.transformFileResult(file, I18n.tr("Open"), I18n.tr("Open folder"), I18n.tr("Copy path"), I18n.tr("Open in terminal"));
return Transform.transformFileResult(file, I18n.tr("Open"), I18n.tr("Open folder"), I18n.tr("Copy path"));
}
function detectTrigger(query) {
@@ -1667,9 +1581,6 @@ Item {
case "copy_path":
copyToClipboard(item.data.path);
break;
case "open_terminal":
openTerminal(item.data.path);
break;
case "copy":
copyToClipboard(item.name);
break;
@@ -1751,16 +1662,6 @@ Item {
Qt.openUrlExternally("file://" + folder);
}
function openTerminal(path) {
if (!path)
return;
var terminal = Quickshell.env("TERMINAL") || "xterm";
Quickshell.execDetached({
command: [terminal],
workingDirectory: path
});
}
function copyToClipboard(text) {
if (!text)
return;

View File

@@ -107,10 +107,6 @@ Item {
spotlightContent.controller.activePluginId = "";
spotlightContent.controller.activePluginName = "";
spotlightContent.controller.pluginFilter = "";
spotlightContent.controller.fileSearchType = "all";
spotlightContent.controller.fileSearchExt = "";
spotlightContent.controller.fileSearchFolder = "";
spotlightContent.controller.fileSearchSort = "score";
spotlightContent.controller.collapsedSections = {};
spotlightContent.controller.selectedFlatIndex = 0;
spotlightContent.controller.selectedItem = null;

View File

@@ -116,43 +116,31 @@ function transformBuiltInLauncherItem(item, pluginId, openLabel) {
};
}
function transformFileResult(file, openLabel, openFolderLabel, copyPathLabel, openTerminalLabel) {
function transformFileResult(file, openLabel, openFolderLabel, copyPathLabel) {
var filename = file.path ? file.path.split("/").pop() : "";
var dirname = file.path ? file.path.substring(0, file.path.lastIndexOf("/")) : "";
var isDir = file.is_dir || false;
var actions = [];
if (isDir) {
if (openTerminalLabel) {
actions.push({
name: openTerminalLabel,
icon: "terminal",
action: "open_terminal"
});
}
} else {
actions.push({
name: openFolderLabel,
icon: "folder_open",
action: "open_folder"
});
}
actions.push({
name: copyPathLabel,
icon: "content_copy",
action: "copy_path"
});
return {
id: file.path || "",
type: "file",
name: filename,
subtitle: dirname,
icon: isDir ? "folder" : Utils.getFileIcon(filename),
icon: Utils.getFileIcon(filename),
iconType: "material",
section: "files",
data: file,
actions: actions,
actions: [
{
name: openFolderLabel,
icon: "folder_open",
action: "open_folder"
},
{
name: copyPathLabel,
icon: "content_copy",
action: "copy_path"
}
],
primaryAction: {
name: openLabel,
icon: "open_in_new",

View File

@@ -549,151 +549,8 @@ FocusScope {
}
Item {
id: fileFilterRow
width: parent.width
height: showFileFilters ? fileFilterContent.height : 0
visible: showFileFilters
readonly property bool showFileFilters: controller.searchMode === "files"
Behavior on height {
NumberAnimation {
duration: Theme.shortDuration
easing.type: Theme.standardEasing
}
}
Row {
id: fileFilterContent
width: parent.width
spacing: Theme.spacingS
Row {
id: typeChips
anchors.verticalCenter: parent.verticalCenter
spacing: 2
visible: DSearchService.supportsTypeFilter
Repeater {
model: [
{
id: "all",
label: I18n.tr("All"),
icon: "search"
},
{
id: "file",
label: I18n.tr("Files"),
icon: "insert_drive_file"
},
{
id: "dir",
label: I18n.tr("Folders"),
icon: "folder"
}
]
Rectangle {
required property var modelData
required property int index
width: chipContent.width + Theme.spacingM * 2
height: sortDropdown.height
radius: Theme.cornerRadius
color: controller.fileSearchType === modelData.id || chipArea.containsMouse ? Theme.primaryContainer : "transparent"
Row {
id: chipContent
anchors.centerIn: parent
spacing: Theme.spacingXS
DankIcon {
anchors.verticalCenter: parent.verticalCenter
name: modelData.icon
size: 14
color: controller.fileSearchType === modelData.id ? Theme.primary : Theme.surfaceVariantText
}
StyledText {
anchors.verticalCenter: parent.verticalCenter
text: modelData.label
font.pixelSize: Theme.fontSizeSmall
color: controller.fileSearchType === modelData.id ? Theme.primary : Theme.surfaceText
}
}
MouseArea {
id: chipArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: controller.setFileSearchType(modelData.id)
}
}
}
}
Rectangle {
width: 1
height: 20
anchors.verticalCenter: parent.verticalCenter
color: Theme.outlineMedium
visible: typeChips.visible
}
DankDropdown {
id: sortDropdown
anchors.verticalCenter: parent.verticalCenter
width: Math.min(130, parent.width / 3)
compactMode: true
dropdownWidth: 130
popupWidth: 150
maxPopupHeight: 200
currentValue: {
switch (controller.fileSearchSort) {
case "score":
return I18n.tr("Score");
case "name":
return I18n.tr("Name");
case "modified":
return I18n.tr("Modified");
case "size":
return I18n.tr("Size");
default:
return I18n.tr("Score");
}
}
options: [I18n.tr("Score"), I18n.tr("Name"), I18n.tr("Modified"), I18n.tr("Size")]
onValueChanged: value => {
var sortMap = {};
sortMap[I18n.tr("Score")] = "score";
sortMap[I18n.tr("Name")] = "name";
sortMap[I18n.tr("Modified")] = "modified";
sortMap[I18n.tr("Size")] = "size";
controller.setFileSearchSort(sortMap[value] || "score");
}
}
DankTextField {
id: extFilterField
anchors.verticalCenter: parent.verticalCenter
width: Math.min(100, parent.width / 4)
height: sortDropdown.height
placeholderText: I18n.tr("ext")
font.pixelSize: Theme.fontSizeSmall
showClearButton: text.length > 0
onTextChanged: {
controller.setFileSearchExt(text.trim());
}
}
}
}
Item {
width: parent.width
height: parent.height - searchField.height - categoryRow.height - fileFilterRow.height - actionPanel.height - Theme.spacingXS * ((categoryRow.visible ? 1 : 0) + (fileFilterRow.visible ? 1 : 0) + 2)
height: parent.height - searchField.height - categoryRow.height - actionPanel.height - Theme.spacingXS * (categoryRow.visible ? 3 : 2)
opacity: root.parentModal?.isClosing ? 0 : 1
ResultsList {
@@ -729,9 +586,6 @@ FocusScope {
function onSearchQueryRequested(query) {
searchField.text = query;
}
function onModeChanged() {
extFilterField.text = "";
}
}
FocusScope {

View File

@@ -113,7 +113,6 @@ Rectangle {
font.family: Theme.fontFamily
color: Theme.surfaceVariantText
elide: Text.ElideRight
clip: true
visible: (root.item?.subtitle ?? "").length > 0
horizontalAlignment: Text.AlignLeft
}
@@ -182,7 +181,7 @@ Rectangle {
case "plugin":
return I18n.tr("Plugin");
case "file":
return root.item.data?.is_dir ? I18n.tr("Folder") : I18n.tr("File");
return I18n.tr("File");
default:
return "";
}

View File

@@ -435,15 +435,7 @@ Item {
var mode = root.controller?.searchMode ?? "all";
switch (mode) {
case "files":
var fileType = root.controller?.fileSearchType ?? "all";
switch (fileType) {
case "dir":
return "folder_open";
case "file":
return "insert_drive_file";
default:
return "folder_open";
}
return "folder_open";
case "plugins":
return "extension";
case "apps":
@@ -473,15 +465,7 @@ Item {
return I18n.tr("Type to search files");
if (root.controller.searchQuery.length < 2)
return I18n.tr("Type at least 2 characters");
var fileType = root.controller?.fileSearchType ?? "all";
switch (fileType) {
case "dir":
return I18n.tr("No folders found");
case "file":
return I18n.tr("No files found");
default:
return I18n.tr("No results found");
}
return I18n.tr("No files found");
case "plugins":
return hasQuery ? I18n.tr("No plugin results") : I18n.tr("Browse or search plugins");
case "apps":

View File

@@ -1,170 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Effects
import Quickshell
import Quickshell.Io
import qs.Modals.Common
import qs.Modals.FileBrowser
import qs.Common
import qs.Services
import qs.Widgets
DankModal {
id: root
visible: false
layerNamespace: "dms:wifi-qrcode"
property bool disablePopupTransparency: true
property string wifiSSID: ""
property string themedQrCodePath: ""
property string normalQrCodePath: ""
modalWidth: 420
modalHeight: 480
onBackgroundClicked: hide()
onOpened: {
Qt.callLater(() => {
modalFocusScope.forceActiveFocus();
contentLoader.item.wifiSSID = wifiSSID;
contentLoader.item.themedQrCodePath = themedQrCodePath;
contentLoader.item.saveBrowserLoader = saveBrowserLoader;
});
}
function show(ssid) {
wifiSSID = ssid;
fetchNetworkQRCode(ssid);
}
function hide() {
if (themedQrCodePath !== "") {
deleteQRCodeFile(themedQrCodePath);
}
if (normalQrCodePath !== "") {
deleteQRCodeFile(normalQrCodePath);
}
close();
}
function fetchNetworkQRCode(ssid) {
// TODO: Add loading UI?
DMSService.sendRequest("network.qrcode", {
ssid: ssid
}, response => {
if (response.error) {
ToastService.showError("Failed to fetch network QR code: ", JSON.stringify(response.error));
} else if (response.result) {
themedQrCodePath = response.result[0];
normalQrCodePath = response.result[1];
open();
}
});
}
function deleteQRCodeFile(path) {
DMSService.sendRequest("network.delete-qrcode", {
path: path
}, response => {
if (response.error) {
ToastService.showError(`Failed to remove QR code at ${path}: `, JSON.stringify(response.error));
}
})
}
LazyLoader {
id: saveBrowserLoader
active: false
FileBrowserSurfaceModal {
id: saveBrowser
browserTitle: I18n.tr("Save QR Code")
browserIcon: "qr_code"
browserType: "default"
fileExtensions: ["*.png"]
allowStacking: true
saveMode: true
defaultFileName: `${root.wifiSSID ?? "wifi-qrcode"}.png`
onFileSelected: path => {
const cleanPath = decodeURI(path.toString().replace(/^file:\/\//, ''));
const fileName = cleanPath.split('/').pop();
const fileUrl = "file://" + cleanPath;
copyQrCodeProcess.exec(["cp", root.normalQrCodePath, cleanPath, "-f"])
}
Process {
id: copyQrCodeProcess
stdout: StdioCollector {
onStreamFinished: {
saveBrowser.close();
}
}
}
}
}
content: Component {
Item {
id: theItem
property alias themedQrCodePath: qrCodeImg.source
property var saveBrowserLoader: null
property string wifiSSID: ""
anchors.fill: parent
Column {
anchors.fill: parent
anchors.margins: Theme.spacingL
spacing: Theme.spacingL
RowLayout {
id: modalTitle
width: parent.width
StyledText {
text: I18n.tr("WiFi QR code for ") + theItem.wifiSSID
font.pixelSize: Theme.fontSizeLarge
color: Theme.surfaceText
font.weight: Font.Bold
Layout.alignment: Qt.AlignLeft
}
DankActionButton {
iconName: "save"
iconSize: Theme.iconSize - 4
iconColor: Theme.surfaceText
onClicked: {
saveBrowserLoader.active = true;
if (saveBrowserLoader.item) {
saveBrowserLoader.item.open();
}
}
Layout.alignment: Qt.AlignRight
}
DankActionButton {
iconName: "close"
iconSize: Theme.iconSize - 4
iconColor: Theme.surfaceText
onClicked: root.hide()
Layout.alignment: Qt.AlignRight
}
}
Image {
id: qrCodeImg
height: parent.height - parent.spacing - modalTitle.height
width: height
anchors.horizontalCenter: parent.horizontalCenter
MultiEffect {
source: qrCodeImg
anchors.fill: source
colorization: 1.0
colorizationColor: Theme.primary
}
}
}
}
}
}

View File

@@ -85,12 +85,12 @@ Variants {
}
Component.onCompleted: {
if (typeof blurWallpaperWindow.updatesEnabled !== "undefined")
blurWallpaperWindow.updatesEnabled = Qt.binding(() => root.effectActive || root._renderSettling || currentWallpaper.status === Image.Loading || nextWallpaper.status === Image.Loading);
if (!source) {
isInitialized = true;
return;
root._renderSettling = false;
}
const formattedSource = source.startsWith("file://") ? source : encodeFileUrl(source);
setWallpaperImmediate(formattedSource);
isInitialized = true;
}
@@ -98,8 +98,25 @@ Variants {
property real transitionProgress: 0
readonly property bool transitioning: transitionAnimation.running
property bool effectActive: false
property bool _renderSettling: true
property bool useNextForEffect: false
Connections {
target: currentWallpaper
function onStatusChanged() {
if (currentWallpaper.status === Image.Ready) {
root._renderSettling = true;
renderSettleTimer.restart();
}
}
}
Timer {
id: renderSettleTimer
interval: 100
onTriggered: root._renderSettling = false
}
onSourceChanged: {
if (!source || source.startsWith("#")) {
setWallpaperImmediate("");
@@ -124,6 +141,8 @@ Variants {
transitionAnimation.stop();
root.transitionProgress = 0.0;
root.effectActive = false;
root._renderSettling = true;
renderSettleTimer.restart();
currentWallpaper.source = newSource;
nextWallpaper.source = "";
}

View File

@@ -651,7 +651,6 @@ Rectangle {
}
Rectangle {
id: pinButton
anchors.right: parent.right
anchors.rightMargin: optionsButton.width + Theme.spacingM + Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
@@ -712,19 +711,6 @@ Rectangle {
}
}
DankActionButton {
id: qrCodeButton
visible: modelData.secured && modelData.saved
anchors.right: parent.right
anchors.rightMargin: optionsButton.width + pinWifiRow.width + 3 * Theme.spacingM + Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
iconName: "qr_code"
buttonSize: 28
onClicked: {
PopoutService.showWifiQRCodeModal(modelData.ssid);
}
}
DankRipple {
id: wifiRipple
cornerRadius: parent.radius
@@ -733,7 +719,7 @@ Rectangle {
MouseArea {
id: networkMouseArea
anchors.fill: parent
anchors.rightMargin: optionsButton.width + pinWifiRow.width + (qrCodeButton.visible ? qrCodeButton.width : 0) + Theme.spacingS * 5 + Theme.spacingM
anchors.rightMargin: optionsButton.width + Theme.spacingM + Theme.spacingS + pinWifiRow.width + Theme.spacingS * 4
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onPressed: mouse => wifiRipple.trigger(mouse.x, mouse.y)

View File

@@ -21,73 +21,82 @@ Item {
property alias centerWidgetsModel: centerWidgetsModel
property alias rightWidgetsModel: rightWidgetsModel
property string _leftWidgetsJson: {
root.barConfig;
const leftWidgets = root.barConfig?.leftWidgets || [];
const mapped = leftWidgets.map((w, index) => {
if (typeof w === "string") {
return {
widgetId: w,
id: w + "_" + index,
enabled: true
};
} else {
const obj = Object.assign({}, w);
obj.widgetId = w.id || w.widgetId;
obj.id = (w.id || w.widgetId) + "_" + index;
obj.enabled = w.enabled !== false;
return obj;
}
});
return JSON.stringify(mapped);
}
property string _centerWidgetsJson: {
root.barConfig;
const centerWidgets = root.barConfig?.centerWidgets || [];
const mapped = centerWidgets.map((w, index) => {
if (typeof w === "string") {
return {
widgetId: w,
id: w + "_" + index,
enabled: true
};
} else {
const obj = Object.assign({}, w);
obj.widgetId = w.id || w.widgetId;
obj.id = (w.id || w.widgetId) + "_" + index;
obj.enabled = w.enabled !== false;
return obj;
}
});
return JSON.stringify(mapped);
}
property string _rightWidgetsJson: {
root.barConfig;
const rightWidgets = root.barConfig?.rightWidgets || [];
const mapped = rightWidgets.map((w, index) => {
if (typeof w === "string") {
return {
widgetId: w,
id: w + "_" + index,
enabled: true
};
} else {
const obj = Object.assign({}, w);
obj.widgetId = w.id || w.widgetId;
obj.id = (w.id || w.widgetId) + "_" + index;
obj.enabled = w.enabled !== false;
return obj;
}
});
return JSON.stringify(mapped);
}
ScriptModel {
id: leftWidgetsModel
values: {
root.barConfig;
const leftWidgets = root.barConfig?.leftWidgets || [];
return leftWidgets.map((w, index) => {
if (typeof w === "string") {
return {
widgetId: w,
id: w + "_" + index,
enabled: true
};
} else {
const obj = Object.assign({}, w);
obj.widgetId = w.id || w.widgetId;
obj.id = (w.id || w.widgetId) + "_" + index;
obj.enabled = w.enabled !== false;
return obj;
}
});
}
values: JSON.parse(root._leftWidgetsJson)
}
ScriptModel {
id: centerWidgetsModel
values: {
root.barConfig;
const centerWidgets = root.barConfig?.centerWidgets || [];
return centerWidgets.map((w, index) => {
if (typeof w === "string") {
return {
widgetId: w,
id: w + "_" + index,
enabled: true
};
} else {
const obj = Object.assign({}, w);
obj.widgetId = w.id || w.widgetId;
obj.id = (w.id || w.widgetId) + "_" + index;
obj.enabled = w.enabled !== false;
return obj;
}
});
}
values: JSON.parse(root._centerWidgetsJson)
}
ScriptModel {
id: rightWidgetsModel
values: {
root.barConfig;
const rightWidgets = root.barConfig?.rightWidgets || [];
return rightWidgets.map((w, index) => {
if (typeof w === "string") {
return {
widgetId: w,
id: w + "_" + index,
enabled: true
};
} else {
const obj = Object.assign({}, w);
obj.widgetId = w.id || w.widgetId;
obj.id = (w.id || w.widgetId) + "_" + index;
obj.enabled = w.enabled !== false;
return obj;
}
});
}
values: JSON.parse(root._rightWidgetsJson)
}
function triggerControlCenterOnFocusedScreen() {

View File

@@ -561,10 +561,7 @@ Item {
axis: barWindow.axis
section: topBarContent.getWidgetSection(parent)
parentScreen: barWindow.screen
popoutTarget: {
clipboardHistoryPopoutLoader.active = true;
return clipboardHistoryPopoutLoader.item;
}
popoutTarget: clipboardHistoryPopoutLoader.item ?? null
function openClipboardPopout(initialTab) {
clipboardHistoryPopoutLoader.active = true;
@@ -759,10 +756,7 @@ Item {
barThickness: barWindow.effectiveBarThickness
widgetThickness: barWindow.widgetThickness
section: topBarContent.getWidgetSection(parent) || "center"
popoutTarget: {
dankDashPopoutLoader.active = true;
return dankDashPopoutLoader.item;
}
popoutTarget: dankDashPopoutLoader.item ?? null
parentScreen: barWindow.screen
Component.onCompleted: {
@@ -826,10 +820,7 @@ Item {
barThickness: barWindow.effectiveBarThickness
widgetThickness: barWindow.widgetThickness
section: topBarContent.getWidgetSection(parent) || "center"
popoutTarget: {
dankDashPopoutLoader.active = true;
return dankDashPopoutLoader.item;
}
popoutTarget: dankDashPopoutLoader.item ?? null
parentScreen: barWindow.screen
onClicked: {
dankDashPopoutLoader.active = true;
@@ -881,10 +872,7 @@ Item {
barThickness: barWindow.effectiveBarThickness
widgetThickness: barWindow.widgetThickness
section: topBarContent.getWidgetSection(parent) || "center"
popoutTarget: {
dankDashPopoutLoader.active = true;
return dankDashPopoutLoader.item;
}
popoutTarget: dankDashPopoutLoader.item ?? null
parentScreen: barWindow.screen
onClicked: {
dankDashPopoutLoader.active = true;
@@ -968,10 +956,7 @@ Item {
widgetThickness: barWindow.widgetThickness
axis: barWindow.axis
section: topBarContent.getWidgetSection(parent) || "right"
popoutTarget: {
processListPopoutLoader.active = true;
return processListPopoutLoader.item;
}
popoutTarget: processListPopoutLoader.item ?? null
parentScreen: barWindow.screen
widgetData: parent.widgetData
onCpuClicked: {
@@ -1004,10 +989,7 @@ Item {
widgetThickness: barWindow.widgetThickness
axis: barWindow.axis
section: topBarContent.getWidgetSection(parent) || "right"
popoutTarget: {
processListPopoutLoader.active = true;
return processListPopoutLoader.item;
}
popoutTarget: processListPopoutLoader.item ?? null
parentScreen: barWindow.screen
widgetData: parent.widgetData
onRamClicked: {
@@ -1054,10 +1036,7 @@ Item {
widgetThickness: barWindow.widgetThickness
axis: barWindow.axis
section: topBarContent.getWidgetSection(parent) || "right"
popoutTarget: {
processListPopoutLoader.active = true;
return processListPopoutLoader.item;
}
popoutTarget: processListPopoutLoader.item ?? null
parentScreen: barWindow.screen
widgetData: parent.widgetData
onCpuTempClicked: {
@@ -1090,10 +1069,7 @@ Item {
widgetThickness: barWindow.widgetThickness
axis: barWindow.axis
section: topBarContent.getWidgetSection(parent) || "right"
popoutTarget: {
processListPopoutLoader.active = true;
return processListPopoutLoader.item;
}
popoutTarget: processListPopoutLoader.item ?? null
parentScreen: barWindow.screen
widgetData: parent.widgetData
onGpuTempClicked: {
@@ -1134,10 +1110,7 @@ Item {
barThickness: barWindow.effectiveBarThickness
axis: barWindow.axis
section: topBarContent.getWidgetSection(parent) || "right"
popoutTarget: {
notificationCenterLoader.active = true;
return notificationCenterLoader.item;
}
popoutTarget: notificationCenterLoader.item ?? null
parentScreen: barWindow.screen
onClicked: {
notificationCenterLoader.active = true;
@@ -1172,10 +1145,7 @@ Item {
section: topBarContent.getWidgetSection(parent) || "right"
barSpacing: barConfig?.spacing ?? 4
barConfig: topBarContent.barConfig
popoutTarget: {
batteryPopoutLoader.active = true;
return batteryPopoutLoader.item;
}
popoutTarget: batteryPopoutLoader.item ?? null
parentScreen: barWindow.screen
onToggleBatteryPopup: {
batteryPopoutLoader.active = true;
@@ -1208,10 +1178,7 @@ Item {
barThickness: barWindow.effectiveBarThickness
axis: barWindow.axis
section: topBarContent.getWidgetSection(parent) || "center"
popoutTarget: {
layoutPopoutLoader.active = true;
return layoutPopoutLoader.item;
}
popoutTarget: layoutPopoutLoader.item ?? null
parentScreen: barWindow.screen
onToggleLayoutPopup: {
layoutPopoutLoader.active = true;
@@ -1244,10 +1211,7 @@ Item {
barSpacing: barConfig?.spacing ?? 4
barConfig: topBarContent.barConfig
isAutoHideBar: topBarContent.barConfig?.autoHide ?? false
popoutTarget: {
vpnPopoutLoader.active = true;
return vpnPopoutLoader.item;
}
popoutTarget: vpnPopoutLoader.item ?? null
parentScreen: barWindow.screen
onToggleVpnPopup: {
vpnPopoutLoader.active = true;
@@ -1281,10 +1245,7 @@ Item {
barThickness: barWindow.effectiveBarThickness
axis: barWindow.axis
section: topBarContent.getWidgetSection(parent) || "right"
popoutTarget: {
controlCenterLoader.active = true;
return controlCenterLoader.item;
}
popoutTarget: controlCenterLoader.item ?? null
parentScreen: barWindow.screen
screenName: barWindow.screen?.name || ""
screenModel: barWindow.screen?.model || ""
@@ -1434,10 +1395,7 @@ Item {
barThickness: barWindow.effectiveBarThickness
axis: barWindow.axis
section: topBarContent.getWidgetSection(parent) || "right"
popoutTarget: {
systemUpdateLoader.active = true;
return systemUpdateLoader.item;
}
popoutTarget: systemUpdateLoader.item ?? null
parentScreen: barWindow.screen
onClicked: {
systemUpdateLoader.active = true;

View File

@@ -131,38 +131,55 @@ PanelWindow {
readonly property real _wingR: Math.max(0, wingtipsRadius)
readonly property color _surfaceContainer: Theme.surfaceContainer
readonly property string _barId: barConfig?.id ?? "default"
readonly property var _liveBarConfig: SettingsData.barConfigs.find(c => c.id === _barId) || barConfig
readonly property real _backgroundAlpha: _liveBarConfig?.transparency ?? 1.0
property real _backgroundAlpha: barConfig?.transparency ?? 1.0
readonly property color _bgColor: Theme.withAlpha(_surfaceContainer, _backgroundAlpha)
function _updateBackgroundAlpha() {
const live = SettingsData.barConfigs.find(c => c.id === _barId);
_backgroundAlpha = (live ?? barConfig)?.transparency ?? 1.0;
}
readonly property real _dpr: CompositorService.getScreenScale(barWindow.screen)
property string screenName: modelData.name
readonly property bool hasMaximizedToplevel: {
if (!(barConfig?.maximizeDetection ?? true))
return false;
if (!CompositorService.isHyprland && !CompositorService.isNiri)
return false;
property bool hasMaximizedToplevel: false
property bool shouldHideForWindows: false
function _updateHasMaximizedToplevel() {
if (!(barConfig?.maximizeDetection ?? true)) {
hasMaximizedToplevel = false;
return;
}
if (!CompositorService.isHyprland && !CompositorService.isNiri) {
hasMaximizedToplevel = false;
return;
}
const filtered = CompositorService.filterCurrentWorkspace(CompositorService.sortedToplevels, screenName);
for (let i = 0; i < filtered.length; i++) {
if (filtered[i]?.maximized)
return true;
if (filtered[i]?.maximized) {
hasMaximizedToplevel = true;
return;
}
}
return false;
hasMaximizedToplevel = false;
}
readonly property bool shouldHideForWindows: {
if (!(barConfig?.showOnWindowsOpen ?? false))
return false;
if (!(barConfig?.autoHide ?? false))
return false;
if (!CompositorService.isNiri && !CompositorService.isHyprland)
return false;
function _updateShouldHideForWindows() {
if (!(barConfig?.showOnWindowsOpen ?? false)) {
shouldHideForWindows = false;
return;
}
if (!(barConfig?.autoHide ?? false)) {
shouldHideForWindows = false;
return;
}
if (!CompositorService.isNiri && !CompositorService.isHyprland) {
shouldHideForWindows = false;
return;
}
if (CompositorService.isNiri) {
NiriService.windows;
let currentWorkspaceId = null;
for (let i = 0; i < NiriService.allWorkspaces.length; i++) {
const ws = NiriService.allWorkspaces[i];
@@ -172,8 +189,10 @@ PanelWindow {
}
}
if (currentWorkspaceId === null)
return false;
if (currentWorkspaceId === null) {
shouldHideForWindows = false;
return;
}
let hasTiled = false;
let hasFloatingTouchingBar = false;
@@ -217,14 +236,12 @@ PanelWindow {
}
}
if (hasTiled)
return true;
return hasFloatingTouchingBar;
shouldHideForWindows = hasTiled || hasFloatingTouchingBar;
return;
}
const filtered = CompositorService.filterCurrentWorkspace(CompositorService.sortedToplevels, screenName);
return filtered.length > 0;
shouldHideForWindows = filtered.length > 0;
}
property real effectiveSpacing: hasMaximizedToplevel ? 0 : (barConfig?.spacing ?? 4)
@@ -356,6 +373,9 @@ PanelWindow {
}
updateGpuTempConfig();
_updateBackgroundAlpha();
_updateHasMaximizedToplevel();
_updateShouldHideForWindows();
inhibitorInitTimer.start();
}
@@ -432,11 +452,37 @@ PanelWindow {
Connections {
function onBarConfigChanged() {
barWindow.updateGpuTempConfig();
barWindow._updateBackgroundAlpha();
barWindow._updateHasMaximizedToplevel();
barWindow._updateShouldHideForWindows();
}
target: rootWindow
}
Connections {
target: SettingsData
function onBarConfigsChanged() {
barWindow._updateBackgroundAlpha();
}
}
Connections {
target: CompositorService
function onToplevelsChanged() {
barWindow._updateHasMaximizedToplevel();
barWindow._updateShouldHideForWindows();
}
}
Connections {
target: NiriService
function onAllWorkspacesChanged() {
barWindow._updateHasMaximizedToplevel();
barWindow._updateShouldHideForWindows();
}
}
Connections {
function onNvidiaGpuTempEnabledChanged() {
barWindow.updateGpuTempConfig();

View File

@@ -584,8 +584,7 @@ BasePill {
property string tooltipText: {
root._desktopEntriesUpdateTrigger;
const moddedId = Paths.moddedAppId(appId);
const desktopEntry = moddedId ? DesktopEntries.heuristicLookup(moddedId) : null;
const desktopEntry = appId ? DesktopEntries.heuristicLookup(appId) : null;
const appName = appId ? Paths.getAppName(appId, desktopEntry) : "Unknown";
if (modelData.type === "grouped" && windowCount > 1) {
@@ -690,9 +689,8 @@ BasePill {
if (!appItem.appId)
return "";
if (modelData.isCoreApp)
return ""; // Explicitly skip if core app to avoid flickering or wrong look ups
const moddedId = Paths.moddedAppId(appItem.appId);
const desktopEntry = DesktopEntries.heuristicLookup(moddedId);
return "";
const desktopEntry = DesktopEntries.heuristicLookup(appItem.appId);
return Paths.getAppIcon(appItem.appId, desktopEntry);
}
smooth: true
@@ -749,8 +747,7 @@ BasePill {
root._desktopEntriesUpdateTrigger;
if (!appItem.appId)
return "?";
const moddedId = Paths.moddedAppId(appItem.appId);
const desktopEntry = DesktopEntries.heuristicLookup(moddedId);
const desktopEntry = DesktopEntries.heuristicLookup(appItem.appId);
const appName = Paths.getAppName(appItem.appId, desktopEntry);
return appName.charAt(0).toUpperCase();
}

View File

@@ -9,9 +9,6 @@ BasePill {
id: root
property bool isActive: false
property var popoutTarget: null
property var parentScreen: null
property Item windowRoot: (Window.window ? Window.window.contentItem : null)
property bool isAutoHideBar: false
signal clipboardClicked

View File

@@ -93,7 +93,7 @@ BasePill {
id: textBox
anchors.verticalCenter: parent.verticalCenter
implicitWidth: root.minimumWidth ? Math.max(cpuBaseline.width, cpuText.paintedWidth) : cpuText.paintedWidth
implicitWidth: root.minimumWidth ? Math.max(cpuBaseline.width, cpuCurrent.width) : cpuCurrent.width
implicitHeight: cpuText.implicitHeight
width: implicitWidth
@@ -105,6 +105,12 @@ BasePill {
text: "88%"
}
StyledTextMetrics {
id: cpuCurrent
font.pixelSize: Theme.barTextSize(root.barThickness, root.barConfig?.fontScale, root.barConfig?.maximizeWidgetText)
text: cpuText.text
}
StyledText {
id: cpuText
text: {

View File

@@ -18,9 +18,43 @@ BasePill {
readonly property real contentWidth: hasActivePrivacy ? (activeCount * 18 + (activeCount - 1) * Theme.spacingXS) : 0
readonly property real contentHeight: hasActivePrivacy ? (activeCount * 18 + (activeCount - 1) * Theme.spacingXS) : 0
visible: hasActivePrivacy
opacity: hasActivePrivacy ? 1 : 0
enabled: hasActivePrivacy
states: [
State {
name: "hidden_horizontal"
when: !hasActivePrivacy && !isVerticalOrientation
PropertyChanges {
target: root
width: 0
}
},
State {
name: "hidden_vertical"
when: !hasActivePrivacy && isVerticalOrientation
PropertyChanges {
target: root
height: 0
}
}
]
transitions: [
Transition {
NumberAnimation {
properties: "width,height"
duration: Theme.shortDuration
easing.type: Theme.standardEasing
}
}
]
Behavior on opacity {
NumberAnimation {
duration: Theme.shortDuration
easing.type: Theme.standardEasing
}
}
content: Component {
Item {
@@ -35,7 +69,7 @@ BasePill {
Item {
width: 18
height: 18
visible: PrivacyService.microphoneActive
visible: root.showMicIcon || PrivacyService.microphoneActive
anchors.horizontalCenter: parent.horizontalCenter
DankIcon {
@@ -47,8 +81,8 @@ BasePill {
return "mic";
}
size: Theme.iconSizeSmall
color: Theme.error
filled: true
color: PrivacyService.microphoneActive ? Theme.error : Theme.surfaceText
filled: PrivacyService.microphoneActive
anchors.centerIn: parent
}
}
@@ -56,14 +90,14 @@ BasePill {
Item {
width: 18
height: 18
visible: PrivacyService.cameraActive
visible: root.showCameraIcon || PrivacyService.cameraActive
anchors.horizontalCenter: parent.horizontalCenter
DankIcon {
name: "camera_video"
size: Theme.iconSizeSmall
color: Theme.widgetTextColor
filled: true
color: PrivacyService.cameraActive ? Theme.error : Theme.surfaceText
filled: PrivacyService.cameraActive
anchors.centerIn: parent
}
@@ -76,20 +110,21 @@ BasePill {
anchors.top: parent.top
anchors.rightMargin: -2
anchors.topMargin: -1
visible: PrivacyService.cameraActive
}
}
Item {
width: 18
height: 18
visible: PrivacyService.screensharingActive
visible: root.showScreenSharingIcon || PrivacyService.screensharingActive
anchors.horizontalCenter: parent.horizontalCenter
DankIcon {
name: "screen_share"
size: Theme.iconSizeSmall
color: Theme.warning
filled: true
color: PrivacyService.screensharingActive ? Theme.warning : Theme.surfaceText
filled: PrivacyService.screensharingActive
anchors.centerIn: parent
}
}
@@ -116,7 +151,7 @@ BasePill {
}
size: Theme.iconSizeSmall
color: PrivacyService.microphoneActive ? Theme.error : Theme.surfaceText
filled: true
filled: PrivacyService.microphoneActive
anchors.centerIn: parent
}
}
@@ -131,7 +166,7 @@ BasePill {
name: "camera_video"
size: Theme.iconSizeSmall
color: PrivacyService.cameraActive ? Theme.error : Theme.surfaceText
filled: true
filled: PrivacyService.cameraActive
anchors.centerIn: parent
}
@@ -158,7 +193,7 @@ BasePill {
name: "screen_share"
size: Theme.iconSizeSmall
color: PrivacyService.screensharingActive ? Theme.warning : Theme.surfaceText
filled: true
filled: PrivacyService.screensharingActive
anchors.centerIn: parent
}
}
@@ -209,22 +244,4 @@ BasePill {
}
}
}
Behavior on width {
enabled: hasActivePrivacy && visible && !isVerticalOrientation
NumberAnimation {
duration: Theme.mediumDuration
easing.type: Theme.emphasizedEasing
}
}
Behavior on height {
enabled: hasActivePrivacy && visible && isVerticalOrientation
NumberAnimation {
duration: Theme.mediumDuration
easing.type: Theme.emphasizedEasing
}
}
}

View File

@@ -241,14 +241,17 @@ BasePill {
property var toplevelData: isGrouped ? (modelData.windows.length > 0 ? modelData.windows[0].toplevel : null) : modelData
property bool isFocused: isGrouped ? (root.focusedAppId === appId) : (toplevelData ? toplevelData.activated : false)
property string appId: isGrouped ? modelData.appId : (modelData.appId || "")
readonly property string effectiveAppId: {
root._appIdSubstitutionsTrigger;
return Paths.moddedAppId(appId);
}
property string windowTitle: toplevelData ? (toplevelData.title || "(Unnamed)") : "(Unnamed)"
property var toplevelObject: toplevelData
property int windowCount: isGrouped ? modelData.windows.length : 1
property string tooltipText: {
root._desktopEntriesUpdateTrigger;
const moddedId = Paths.moddedAppId(appId);
const desktopEntry = moddedId ? DesktopEntries.heuristicLookup(moddedId) : null;
const appName = appId ? Paths.getAppName(appId, desktopEntry) : "Unknown";
const desktopEntry = effectiveAppId ? DesktopEntries.heuristicLookup(effectiveAppId) : null;
const appName = effectiveAppId ? Paths.getAppName(effectiveAppId, desktopEntry) : "Unknown";
if (isGrouped && windowCount > 1) {
return appName + " (" + windowCount + " windows)";
@@ -284,11 +287,10 @@ BasePill {
source: {
root._desktopEntriesUpdateTrigger;
root._appIdSubstitutionsTrigger;
if (!appId)
if (!effectiveAppId)
return "";
const moddedId = Paths.moddedAppId(appId);
const desktopEntry = DesktopEntries.heuristicLookup(moddedId);
return Paths.getAppIcon(appId, desktopEntry);
const desktopEntry = DesktopEntries.heuristicLookup(effectiveAppId);
return Paths.getAppIcon(effectiveAppId, desktopEntry);
}
smooth: true
mipmap: true
@@ -311,20 +313,18 @@ BasePill {
size: Theme.barIconSize(root.barThickness, undefined, root.barConfig?.maximizeWidgetIcons, root.barConfig?.iconScale)
name: "sports_esports"
color: Theme.widgetTextColor
visible: !iconImg.visible && Paths.isSteamApp(appId)
visible: !iconImg.visible && Paths.isSteamApp(effectiveAppId)
}
Text {
anchors.centerIn: parent
visible: !iconImg.visible && !Paths.isSteamApp(appId)
visible: !iconImg.visible && !Paths.isSteamApp(effectiveAppId)
text: {
root._desktopEntriesUpdateTrigger;
if (!appId)
if (!effectiveAppId)
return "?";
const moddedId = Paths.moddedAppId(appId);
const desktopEntry = DesktopEntries.heuristicLookup(moddedId);
const appName = Paths.getAppName(appId, desktopEntry);
const desktopEntry = DesktopEntries.heuristicLookup(effectiveAppId);
const appName = Paths.getAppName(effectiveAppId, desktopEntry);
return appName.charAt(0).toUpperCase();
}
font.pixelSize: 10
@@ -496,14 +496,17 @@ BasePill {
property var toplevelData: isGrouped ? (modelData.windows.length > 0 ? modelData.windows[0].toplevel : null) : modelData
property bool isFocused: isGrouped ? (root.focusedAppId === appId) : (toplevelData ? toplevelData.activated : false)
property string appId: isGrouped ? modelData.appId : (modelData.appId || "")
readonly property string effectiveAppId: {
root._appIdSubstitutionsTrigger;
return Paths.moddedAppId(appId);
}
property string windowTitle: toplevelData ? (toplevelData.title || "(Unnamed)") : "(Unnamed)"
property var toplevelObject: toplevelData
property int windowCount: isGrouped ? modelData.windows.length : 1
property string tooltipText: {
root._desktopEntriesUpdateTrigger;
const moddedId = Paths.moddedAppId(appId);
const desktopEntry = moddedId ? DesktopEntries.heuristicLookup(moddedId) : null;
const appName = appId ? Paths.getAppName(appId, desktopEntry) : "Unknown";
const desktopEntry = effectiveAppId ? DesktopEntries.heuristicLookup(effectiveAppId) : null;
const appName = effectiveAppId ? Paths.getAppName(effectiveAppId, desktopEntry) : "Unknown";
if (isGrouped && windowCount > 1) {
return appName + " (" + windowCount + " windows)";
@@ -538,11 +541,10 @@ BasePill {
source: {
root._desktopEntriesUpdateTrigger;
root._appIdSubstitutionsTrigger;
if (!appId)
if (!effectiveAppId)
return "";
const moddedId = Paths.moddedAppId(appId);
const desktopEntry = DesktopEntries.heuristicLookup(moddedId);
return Paths.getAppIcon(appId, desktopEntry);
const desktopEntry = DesktopEntries.heuristicLookup(effectiveAppId);
return Paths.getAppIcon(effectiveAppId, desktopEntry);
}
smooth: true
mipmap: true
@@ -565,20 +567,18 @@ BasePill {
size: Theme.barIconSize(root.barThickness, undefined, root.barConfig?.maximizeWidgetIcons, root.barConfig?.iconScale)
name: "sports_esports"
color: Theme.widgetTextColor
visible: !iconImg.visible && Paths.isSteamApp(appId)
visible: !iconImg.visible && Paths.isSteamApp(effectiveAppId)
}
Text {
anchors.centerIn: parent
visible: !iconImg.visible && !Paths.isSteamApp(appId)
visible: !iconImg.visible && !Paths.isSteamApp(effectiveAppId)
text: {
root._desktopEntriesUpdateTrigger;
if (!appId)
if (!effectiveAppId)
return "?";
const moddedId = Paths.moddedAppId(appId);
const desktopEntry = DesktopEntries.heuristicLookup(moddedId);
const appName = Paths.getAppName(appId, desktopEntry);
const desktopEntry = DesktopEntries.heuristicLookup(effectiveAppId);
const appName = Paths.getAppName(effectiveAppId, desktopEntry);
return appName.charAt(0).toUpperCase();
}
font.pixelSize: 10

View File

@@ -282,14 +282,15 @@ Item {
}
const keyBase = (w.app_id || w.appId || w.class || w.windowClass || "unknown");
const key = isActiveWs || !SettingsData.groupWorkspaceApps ? `${keyBase}_${i}` : keyBase;
const moddedId = Paths.moddedAppId(keyBase);
const key = isActiveWs || !SettingsData.groupWorkspaceApps ? `${moddedId}_${i}` : moddedId;
if (!byApp[key]) {
const isQuickshell = keyBase === "org.quickshell";
const isSteamApp = Paths.isSteamApp(keyBase);
const moddedId = Paths.moddedAppId(keyBase);
const isSteamApp = Paths.isSteamApp(moddedId);
const desktopEntry = DesktopEntries.heuristicLookup(moddedId);
const icon = Paths.getAppIcon(keyBase, desktopEntry);
const icon = Paths.getAppIcon(moddedId, desktopEntry);
const appName = Paths.getAppName(moddedId, desktopEntry);
byApp[key] = {
"type": "icon",
"icon": icon,
@@ -298,7 +299,7 @@ Item {
"active": !!((w.activated || w.is_focused) || (CompositorService.isNiri && w.is_focused)),
"count": 1,
"windowId": w.address || w.id,
"fallbackText": w.appId || w.class || w.title || ""
"fallbackText": appName || ""
};
} else {
byApp[key].count++;
@@ -1473,9 +1474,44 @@ Item {
IconImage {
id: rowAppIcon
anchors.fill: parent
source: modelData.icon
source: modelData.icon || ""
opacity: modelData.active ? 1.0 : rowAppMouseArea.containsMouse ? 0.8 : 0.6
visible: !modelData.isQuickshell && !modelData.isSteamApp
visible: !modelData.isQuickshell && !modelData.isSteamApp && status === Image.Ready
}
Rectangle {
anchors.fill: parent
visible: !modelData.isQuickshell && !modelData.isSteamApp && rowAppIcon.status !== Image.Ready
color: Theme.surfaceContainer
radius: Theme.cornerRadius * (root.appIconSize / 40)
border.width: 1
border.color: Theme.primarySelected
opacity: (modelData.active || isActive) ? 1.0 : rowAppMouseArea.containsMouse ? 0.8 : 0.6
StyledText {
anchors.centerIn: parent
text: (modelData.fallbackText || "?").charAt(0).toUpperCase()
font.pixelSize: parent.width * 0.45
color: Theme.primary
font.weight: Font.Bold
}
}
Rectangle {
anchors.fill: parent
visible: !modelData.isQuickshell && modelData.isSteamApp && rowSteamIcon.status !== Image.Ready
color: Theme.surfaceContainer
radius: Theme.cornerRadius * (root.appIconSize / 40)
border.width: 1
border.color: Theme.primarySelected
opacity: (modelData.active || isActive) ? 1.0 : rowAppMouseArea.containsMouse ? 0.8 : 0.6
DankIcon {
anchors.centerIn: parent
size: parent.width * 0.7
name: "sports_esports"
color: Theme.primary
}
}
IconImage {
@@ -1592,9 +1628,44 @@ Item {
IconImage {
id: colAppIcon
anchors.fill: parent
source: modelData.icon
source: modelData.icon || ""
opacity: modelData.active ? 1.0 : colAppMouseArea.containsMouse ? 0.8 : 0.6
visible: !modelData.isQuickshell && !modelData.isSteamApp
visible: !modelData.isQuickshell && !modelData.isSteamApp && status === Image.Ready
}
Rectangle {
anchors.fill: parent
visible: !modelData.isQuickshell && !modelData.isSteamApp && colAppIcon.status !== Image.Ready
color: Theme.surfaceContainer
radius: Theme.cornerRadius * (root.appIconSize / 40)
border.width: 1
border.color: Theme.primarySelected
opacity: (modelData.active || isActive) ? 1.0 : colAppMouseArea.containsMouse ? 0.8 : 0.6
StyledText {
anchors.centerIn: parent
text: (modelData.fallbackText || "?").charAt(0).toUpperCase()
font.pixelSize: parent.width * 0.45
color: Theme.primary
font.weight: Font.Bold
}
}
Rectangle {
anchors.fill: parent
visible: !modelData.isQuickshell && modelData.isSteamApp && colSteamIcon.status !== Image.Ready
color: Theme.surfaceContainer
radius: Theme.cornerRadius * (root.appIconSize / 40)
border.width: 1
border.color: Theme.primarySelected
opacity: (modelData.active || isActive) ? 1.0 : colAppMouseArea.containsMouse ? 0.8 : 0.6
DankIcon {
anchors.centerIn: parent
size: parent.width * 0.7
name: "sports_esports"
color: Theme.primary
}
}
IconImage {

View File

@@ -378,21 +378,27 @@ Variants {
const screenY = dock.screen ? (dock.screen.y || 0) : 0;
const screenHeight = dock.screen ? dock.screen.height : 0;
const gap = Theme.spacingS;
const bgMargin = barSpacing + SettingsData.dockMargin + 1 + dock.borderThickness;
const btnW = dock.hoveredButton.width;
const btnH = dock.hoveredButton.height;
if (!dock.isVertical) {
const isBottom = SettingsData.dockPosition === SettingsData.Position.Bottom;
const globalX = buttonGlobalPos.x + dock.hoveredButton.width / 2 + adjacentLeftBarWidth;
const globalX = buttonGlobalPos.x + btnW / 2 + adjacentLeftBarWidth;
const tooltipHeight = 32;
const tooltipOffset = dock.effectiveBarHeight + SettingsData.dockSpacing + SettingsData.dockBottomGap + SettingsData.dockMargin + barSpacing + Theme.spacingM;
const screenRelativeY = isBottom ? (screenHeight - tooltipOffset - tooltipHeight) : tooltipOffset;
const totalFromEdge = bgMargin + dockBackground.height + dock.borderThickness + gap;
const screenRelativeY = isBottom ? (screenHeight - totalFromEdge - tooltipHeight) : totalFromEdge;
dockTooltip.show(tooltipText, globalX, screenRelativeY, dock.screen, false, false);
return;
}
const isLeft = SettingsData.dockPosition === SettingsData.Position.Left;
const tooltipOffset = dock.effectiveBarHeight + SettingsData.dockSpacing + SettingsData.dockBottomGap + SettingsData.dockMargin + barSpacing + Theme.spacingM;
const tooltipX = isLeft ? tooltipOffset : (dock.screen.width - tooltipOffset);
const screenRelativeY = buttonGlobalPos.y - screenY + dock.hoveredButton.height / 2 + adjacentTopBarHeight;
dockTooltip.show(tooltipText, screenX + tooltipX, screenRelativeY, dock.screen, isLeft, !isLeft);
const screenWidth = dock.screen ? dock.screen.width : 0;
const totalFromEdge = bgMargin + dockBackground.width + dock.borderThickness + gap;
const tooltipX = isLeft ? (screenX + totalFromEdge) : (screenX + screenWidth - totalFromEdge);
const screenRelativeY = buttonGlobalPos.y - screenY + btnH / 2 + adjacentTopBarHeight;
dockTooltip.show(tooltipText, tooltipX, screenRelativeY, dock.screen, isLeft, !isLeft);
}
Connections {

View File

@@ -28,7 +28,58 @@ Item {
return pos === SettingsData.Position.Left || pos === SettingsData.Position.Right;
}
Timer {
id: horizontalBarChangeDebounce
interval: 500
repeat: false
onTriggered: {
const verticalBars = SettingsData.barConfigs.filter(cfg => {
const pos = cfg.position ?? SettingsData.Position.Top;
return pos === SettingsData.Position.Left || pos === SettingsData.Position.Right;
});
verticalBars.forEach(bar => {
if (!bar.enabled)
return;
SettingsData.updateBarConfig(bar.id, {
enabled: false
});
Qt.callLater(() => SettingsData.updateBarConfig(bar.id, {
enabled: true
}));
});
}
}
function _isBarActive(c) {
if (!c.enabled) return false;
const prefs = c.screenPreferences || ["all"];
if (prefs.length > 0) return true;
return (c.showOnLastDisplay ?? true) && Quickshell.screens.length === 1;
}
function notifyHorizontalBarChange() {
const configs = SettingsData.barConfigs;
if (configs.length < 2)
return;
const hasHorizontal = configs.some(c => {
if (!_isBarActive(c)) return false;
const p = c.position ?? SettingsData.Position.Top;
return p === SettingsData.Position.Top || p === SettingsData.Position.Bottom;
});
if (!hasHorizontal)
return;
const hasVertical = configs.some(c => {
if (!_isBarActive(c)) return false;
const p = c.position ?? SettingsData.Position.Top;
return p === SettingsData.Position.Left || p === SettingsData.Position.Right;
});
if (!hasVertical)
return;
horizontalBarChangeDebounce.restart();
}
function createNewBar() {
@@ -66,7 +117,12 @@ Item {
widgetOutlineColor: defaultBar.widgetOutlineColor || "primary",
widgetOutlineOpacity: defaultBar.widgetOutlineOpacity ?? 1.0,
widgetOutlineThickness: defaultBar.widgetOutlineThickness ?? 1,
widgetPadding: defaultBar.widgetPadding ?? 8,
maximizeWidgetIcons: defaultBar.maximizeWidgetIcons ?? false,
maximizeWidgetText: defaultBar.maximizeWidgetText ?? false,
removeWidgetPadding: defaultBar.removeWidgetPadding ?? false,
fontScale: defaultBar.fontScale ?? 1.0,
iconScale: defaultBar.iconScale ?? 1.0,
autoHide: defaultBar.autoHide ?? false,
autoHideDelay: defaultBar.autoHideDelay ?? 250,
showOnWindowsOpen: defaultBar.showOnWindowsOpen ?? false,
@@ -116,6 +172,7 @@ Item {
SettingsData.updateBarConfig(barId, {
screenPreferences: prefs
});
notifyHorizontalBarChange();
}
function getBarShowOnLastDisplay(barId) {
@@ -127,6 +184,8 @@ Item {
SettingsData.updateBarConfig(barId, {
showOnLastDisplay: value
});
if (Quickshell.screens.length === 1)
notifyHorizontalBarChange();
}
DankFlickable {
@@ -508,13 +567,10 @@ Item {
newPos = SettingsData.Position.Right;
break;
}
const wasVertical = selectedBarIsVertical;
SettingsData.updateBarConfig(selectedBarId, {
position: newPos
});
const isVertical = newPos === SettingsData.Position.Left || newPos === SettingsData.Position.Right;
if (wasVertical !== isVertical || !isVertical)
notifyHorizontalBarChange();
notifyHorizontalBarChange();
}
}
}
@@ -563,7 +619,6 @@ Item {
SettingsData.updateBarConfig(selectedBarId, {
autoHideDelay: newValue
});
notifyHorizontalBarChange();
}
Binding {
@@ -583,7 +638,6 @@ Item {
SettingsData.updateBarConfig(selectedBarId, {
showOnWindowsOpen: toggled
});
notifyHorizontalBarChange();
}
}
}
@@ -637,7 +691,6 @@ Item {
SettingsData.updateBarConfig(selectedBarId, {
openOnOverview: toggled
});
notifyHorizontalBarChange();
}
}
}
@@ -754,7 +807,6 @@ Item {
SettingsData.updateBarConfig(selectedBarId, {
spacing: finalValue
});
notifyHorizontalBarChange();
}
Binding {
@@ -776,7 +828,6 @@ Item {
SettingsData.updateBarConfig(selectedBarId, {
bottomGap: finalValue
});
notifyHorizontalBarChange();
}
Binding {
@@ -798,7 +849,6 @@ Item {
SettingsData.updateBarConfig(selectedBarId, {
innerPadding: finalValue
});
notifyHorizontalBarChange();
}
Binding {
@@ -811,13 +861,12 @@ Item {
SettingsSliderRow {
id: widgetPaddingSlider
text: I18n.tr("Widget Padding Base")
description: I18n.tr("Material 3 Expressive padding")
value: selectedBarConfig?.widgetPadding ?? 12
text: I18n.tr("Padding")
value: selectedBarConfig?.widgetPadding ?? 8
minimum: 0
maximum: 32
unit: "px"
defaultValue: 12
defaultValue: 8
opacity: (selectedBarConfig?.removeWidgetPadding ?? false) ? 0.5 : 1.0
enabled: !(selectedBarConfig?.removeWidgetPadding ?? false)
onSliderValueChanged: newValue => {
@@ -848,7 +897,6 @@ Item {
SettingsData.updateBarConfig(selectedBarId, {
popupGapsAuto: checked
});
notifyHorizontalBarChange();
}
}
@@ -877,7 +925,6 @@ Item {
SettingsData.updateBarConfig(selectedBarId, {
popupGapsManual: finalValue
});
notifyHorizontalBarChange();
}
Binding {
@@ -890,6 +937,107 @@ Item {
}
}
SettingsSliderCard {
id: fontScaleSliderCard
iconName: "text_fields"
title: I18n.tr("Font Scale")
description: I18n.tr("Scale DankBar font sizes independently")
visible: selectedBarConfig?.enabled
minimum: 50
maximum: 200
value: Math.round((selectedBarConfig?.fontScale ?? 1.0) * 100)
unit: "%"
defaultValue: 100
onSliderValueChanged: newValue => {
SettingsData.updateBarConfig(selectedBarId, {
fontScale: newValue / 100
});
}
Binding {
target: fontScaleSliderCard
property: "value"
value: Math.round((selectedBarConfig?.fontScale ?? 1.0) * 100)
restoreMode: Binding.RestoreBinding
}
}
SettingsSliderCard {
id: iconScaleSliderCard
iconName: "interests"
title: I18n.tr("Icon Scale")
description: I18n.tr("Scale DankBar icon sizes independently")
visible: selectedBarConfig?.enabled
minimum: 50
maximum: 200
value: Math.round((selectedBarConfig?.iconScale ?? 1.0) * 100)
unit: "%"
defaultValue: 100
onSliderValueChanged: newValue => {
SettingsData.updateBarConfig(selectedBarId, {
iconScale: newValue / 100
});
}
Binding {
target: iconScaleSliderCard
property: "value"
value: Math.round((selectedBarConfig?.iconScale ?? 1.0) * 100)
restoreMode: Binding.RestoreBinding
}
}
SettingsCard {
iconName: "opacity"
title: I18n.tr("Transparency")
settingKey: "barTransparency"
visible: selectedBarConfig?.enabled
SettingsSliderRow {
id: barTransparencySlider
text: I18n.tr("Bar Transparency")
value: (selectedBarConfig?.transparency ?? 1.0) * 100
minimum: 0
maximum: 100
unit: "%"
defaultValue: 100
onSliderDragFinished: finalValue => {
SettingsData.updateBarConfig(selectedBarId, {
transparency: finalValue / 100
});
}
Binding {
target: barTransparencySlider
property: "value"
value: (selectedBarConfig?.transparency ?? 1.0) * 100
restoreMode: Binding.RestoreBinding
}
}
SettingsSliderRow {
id: widgetTransparencySlider
text: I18n.tr("Widget Transparency")
value: (selectedBarConfig?.widgetTransparency ?? 1.0) * 100
minimum: 0
maximum: 100
unit: "%"
defaultValue: 100
onSliderDragFinished: finalValue => {
SettingsData.updateBarConfig(selectedBarId, {
widgetTransparency: finalValue / 100
});
}
Binding {
target: widgetTransparencySlider
property: "value"
value: (selectedBarConfig?.widgetTransparency ?? 1.0) * 100
restoreMode: Binding.RestoreBinding
}
}
}
SettingsCard {
iconName: "rounded_corner"
title: I18n.tr("Corners & Background")
@@ -1299,111 +1447,6 @@ Item {
}
}
}
SettingsCard {
iconName: "opacity"
title: I18n.tr("Transparency")
settingKey: "barTransparency"
visible: selectedBarConfig?.enabled
SettingsSliderRow {
id: barTransparencySlider
text: I18n.tr("Bar Transparency")
value: (selectedBarConfig?.transparency ?? 1.0) * 100
minimum: 0
maximum: 100
unit: "%"
defaultValue: 100
onSliderDragFinished: finalValue => {
SettingsData.updateBarConfig(selectedBarId, {
transparency: finalValue / 100
});
notifyHorizontalBarChange();
}
Binding {
target: barTransparencySlider
property: "value"
value: (selectedBarConfig?.transparency ?? 1.0) * 100
restoreMode: Binding.RestoreBinding
}
}
SettingsSliderRow {
id: widgetTransparencySlider
text: I18n.tr("Widget Transparency")
value: (selectedBarConfig?.widgetTransparency ?? 1.0) * 100
minimum: 0
maximum: 100
unit: "%"
defaultValue: 100
onSliderDragFinished: finalValue => {
SettingsData.updateBarConfig(selectedBarId, {
widgetTransparency: finalValue / 100
});
notifyHorizontalBarChange();
}
Binding {
target: widgetTransparencySlider
property: "value"
value: (selectedBarConfig?.widgetTransparency ?? 1.0) * 100
restoreMode: Binding.RestoreBinding
}
}
}
SettingsSliderCard {
id: fontScaleSliderCard
iconName: "text_fields"
title: I18n.tr("Font Scale")
description: I18n.tr("Scale DankBar font sizes independently")
visible: selectedBarConfig?.enabled
minimum: 50
maximum: 200
value: Math.round((selectedBarConfig?.fontScale ?? 1.0) * 100)
unit: "%"
defaultValue: 100
onSliderDragFinished: finalValue => {
SettingsData.updateBarConfig(selectedBarId, {
fontScale: finalValue / 100
});
notifyHorizontalBarChange();
}
Binding {
target: fontScaleSliderCard
property: "value"
value: Math.round((selectedBarConfig?.fontScale ?? 1.0) * 100)
restoreMode: Binding.RestoreBinding
}
}
SettingsSliderCard {
id: iconScaleSliderCard
iconName: "interests"
title: I18n.tr("Icon Scale")
description: I18n.tr("Scale DankBar icon sizes independently")
visible: selectedBarConfig?.enabled
minimum: 50
maximum: 200
value: Math.round((selectedBarConfig?.iconScale ?? 1.0) * 100)
unit: "%"
defaultValue: 100
onSliderDragFinished: finalValue => {
SettingsData.updateBarConfig(selectedBarId, {
iconScale: finalValue / 100
});
notifyHorizontalBarChange();
}
Binding {
target: iconScaleSliderCard
property: "value"
value: Math.round((selectedBarConfig?.iconScale ?? 1.0) * 100)
restoreMode: Binding.RestoreBinding
}
}
}
}
}

View File

@@ -231,13 +231,16 @@ Singleton {
const compositor = CompositorService.compositor;
const profilesDir = getProfilesDir();
const profileFile = profilesDir + "/" + profileId + getProfileExtension();
const isActive = SettingsData.getActiveDisplayProfile(compositor) === profileId;
profilesLoading = true;
Proc.runCommand("delete-profile", ["rm", "-f", profileFile], (output, exitCode) => {
profilesLoading = false;
SettingsData.removeDisplayProfile(compositor, profileId);
if (SettingsData.getActiveDisplayProfile(compositor) === profileId)
if (isActive) {
SettingsData.setActiveDisplayProfile(compositor, "");
backendWriteOutputsConfig(allOutputs);
}
const updated = JSON.parse(JSON.stringify(validatedProfiles));
delete updated[profileId];
validatedProfiles = updated;

View File

@@ -1281,15 +1281,6 @@ Item {
}
}
DankActionButton {
iconName: "qr_code"
buttonSize: 28
visible: modelData.secured && modelData.saved
onClicked: {
PopoutService.showWifiQRCodeModal(modelData.ssid);
}
}
DankActionButton {
iconName: isPinned ? "push_pin" : "push_pin"
buttonSize: 28

View File

@@ -386,12 +386,22 @@ Item {
radius: Theme.cornerRadius
color: Theme.surfaceVariant
CachingImage {
Image {
anchors.fill: parent
anchors.margins: 1
imagePath: (Theme.wallpaperPath && !Theme.wallpaperPath.startsWith("#")) ? Theme.wallpaperPath : ""
source: {
var wp = Theme.wallpaperPath;
if (!wp || wp === "" || wp.startsWith("#"))
return "";
if (wp.startsWith("file://"))
wp = wp.substring(7);
return "file://" + wp.split('/').map(s => encodeURIComponent(s)).join('/');
}
fillMode: Image.PreserveAspectCrop
visible: Theme.wallpaperPath && !Theme.wallpaperPath.startsWith("#")
sourceSize.width: 120
sourceSize.height: 120
asynchronous: true
layer.enabled: true
layer.effect: MultiEffect {
maskEnabled: true

View File

@@ -401,19 +401,25 @@ Item {
radius: Theme.cornerRadius
color: Theme.surfaceVariant
CachingImage {
Image {
anchors.fill: parent
anchors.margins: 1
imagePath: {
var lightWallpaper = SessionData.wallpaperPathLight;
return (lightWallpaper !== "" && !lightWallpaper.startsWith("#")) ? lightWallpaper : "";
source: {
var wp = SessionData.wallpaperPathLight;
if (wp === "" || wp.startsWith("#"))
return "";
if (wp.startsWith("file://"))
wp = wp.substring(7);
return "file://" + wp.split('/').map(s => encodeURIComponent(s)).join('/');
}
fillMode: Image.PreserveAspectCrop
visible: {
var lightWallpaper = SessionData.wallpaperPathLight;
return lightWallpaper !== "" && !lightWallpaper.startsWith("#");
}
maxCacheSize: 160
sourceSize.width: 160
sourceSize.height: 160
asynchronous: true
layer.enabled: true
layer.effect: MultiEffect {
maskEnabled: true
@@ -585,19 +591,25 @@ Item {
radius: Theme.cornerRadius
color: Theme.surfaceVariant
CachingImage {
Image {
anchors.fill: parent
anchors.margins: 1
imagePath: {
var darkWallpaper = SessionData.wallpaperPathDark;
return (darkWallpaper !== "" && !darkWallpaper.startsWith("#")) ? darkWallpaper : "";
source: {
var wp = SessionData.wallpaperPathDark;
if (wp === "" || wp.startsWith("#"))
return "";
if (wp.startsWith("file://"))
wp = wp.substring(7);
return "file://" + wp.split('/').map(s => encodeURIComponent(s)).join('/');
}
fillMode: Image.PreserveAspectCrop
visible: {
var darkWallpaper = SessionData.wallpaperPathDark;
return darkWallpaper !== "" && !darkWallpaper.startsWith("#");
}
maxCacheSize: 160
sourceSize.width: 160
sourceSize.height: 160
asynchronous: true
layer.enabled: true
layer.effect: MultiEffect {
maskEnabled: true

View File

@@ -83,8 +83,61 @@ Variants {
readonly property bool transitioning: transitionAnimation.running
property bool effectActive: false
property bool _renderSettling: true
property bool useNextForEffect: false
property string pendingWallpaper: ""
property string _deferredSource: ""
Connections {
target: currentWallpaper
function onStatusChanged() {
if (currentWallpaper.status === Image.Ready) {
root._renderSettling = true;
renderSettleTimer.restart();
}
}
}
function _recheckScreenScale() {
const newScale = CompositorService.getScreenScale(modelData);
if (newScale !== root.screenScale) {
console.info("WallpaperBackground: screen scale corrected for", modelData.name + ":", root.screenScale, "->", newScale);
root.screenScale = newScale;
}
}
Connections {
target: NiriService
function onDisplayScalesChanged() {
root._recheckScreenScale();
}
}
Connections {
target: WlrOutputService
function onWlrOutputAvailableChanged() {
root._recheckScreenScale();
}
}
Connections {
target: CompositorService
function onRandrDataReady() {
if (root._deferredSource) {
const src = root._deferredSource;
root._deferredSource = "";
root.setWallpaperImmediate(src);
} else {
root._recheckScreenScale();
}
}
}
Timer {
id: renderSettleTimer
interval: 100
onTriggered: root._renderSettling = false
}
function getFillMode(modeName) {
switch (modeName) {
@@ -110,12 +163,12 @@ Variants {
}
Component.onCompleted: {
if (typeof wallpaperWindow.updatesEnabled !== "undefined")
wallpaperWindow.updatesEnabled = Qt.binding(() => root.effectActive || root._renderSettling || currentWallpaper.status === Image.Loading || nextWallpaper.status === Image.Loading);
if (!source) {
isInitialized = true;
return;
root._renderSettling = false;
}
const formattedSource = source.startsWith("file://") ? source : encodeFileUrl(source);
setWallpaperImmediate(formattedSource);
isInitialized = true;
}
@@ -128,8 +181,11 @@ Variants {
const formattedSource = source.startsWith("file://") ? source : encodeFileUrl(source);
if (!isInitialized || !currentWallpaper.source) {
if (!CompositorService.randrReady) {
_deferredSource = formattedSource;
return;
}
setWallpaperImmediate(formattedSource);
isInitialized = true;
return;
}
if (CompositorService.isNiri && SessionData.isSwitchingMode) {
@@ -143,6 +199,9 @@ Variants {
transitionAnimation.stop();
root.transitionProgress = 0.0;
root.effectActive = false;
root._renderSettling = true;
renderSettleTimer.restart();
root.screenScale = CompositorService.getScreenScale(modelData);
currentWallpaper.source = newSource;
nextWallpaper.source = "";
}
@@ -171,6 +230,7 @@ Variants {
return;
if (!newPath || newPath.startsWith("#"))
return;
root.screenScale = CompositorService.getScreenScale(modelData);
if (root.transitioning || root.effectActive) {
root.pendingWallpaper = newPath;
return;
@@ -222,7 +282,7 @@ Variants {
}
readonly property int maxTextureSize: 8192
property real screenScale: CompositorService.getScreenScale(modelData)
property real screenScale: 1
property int textureWidth: Math.min(Math.round(modelData.width * screenScale), maxTextureSize)
property int textureHeight: Math.min(Math.round(modelData.height * screenScale), maxTextureSize)

View File

@@ -18,6 +18,8 @@ Singleton {
function registerWidget(widgetId, screenName, widgetRef) {
if (!widgetId || !screenName || !widgetRef)
return;
if (typeof widgetRegistry !== "object" || widgetRegistry === null)
widgetRegistry = ({});
if (!widgetRegistry[widgetId])
widgetRegistry[widgetId] = {};
@@ -29,6 +31,8 @@ Singleton {
function unregisterWidget(widgetId, screenName) {
if (!widgetId || !screenName)
return;
if (typeof widgetRegistry !== "object" || widgetRegistry === null)
return;
if (!widgetRegistry[widgetId])
return;

View File

@@ -11,7 +11,7 @@ Singleton {
id: root
readonly property string currentVersion: "1.4"
readonly property bool changelogEnabled: false
readonly property bool changelogEnabled: true
readonly property string configDir: Paths.strip(StandardPaths.writableLocation(StandardPaths.ConfigLocation)) + "/DankMaterialShell"
readonly property string changelogMarkerPath: configDir + "/.changelog-" + currentVersion

View File

@@ -29,11 +29,37 @@ Singleton {
readonly property string labwcPid: Quickshell.env("LABWC_PID")
property bool useNiriSorting: isNiri && NiriService
property var randrScales: ({})
property bool randrReady: false
signal randrDataReady
property var sortedToplevels: []
property bool _sortScheduled: false
signal toplevelsChanged
function fetchRandrData() {
Proc.runCommand("randr", ["dms", "randr", "--json"], (output, exitCode) => {
if (exitCode === 0 && output) {
try {
const data = JSON.parse(output.trim());
if (data.outputs && Array.isArray(data.outputs)) {
const scales = {};
for (const out of data.outputs) {
if (out.name && out.scale > 0)
scales[out.name] = out.scale;
}
randrScales = scales;
}
} catch (e) {
console.warn("CompositorService: failed to parse randr data:", e);
}
}
randrReady = true;
randrDataReady();
}, 0, 3000);
}
function getScreenScale(screen) {
if (!screen)
return 1;
@@ -42,6 +68,10 @@ Singleton {
return screen.devicePixelRatio || 1;
}
const randrScale = randrScales[screen.name];
if (randrScale !== undefined && randrScale > 0)
return Math.round(randrScale * 20) / 20;
if (WlrOutputService.wlrOutputAvailable && screen) {
const wlrOutput = WlrOutputService.getOutput(screen.name);
if (wlrOutput?.enabled && wlrOutput.scale !== undefined && wlrOutput.scale > 0) {
@@ -137,6 +167,7 @@ Singleton {
}
Component.onCompleted: {
fetchRandrData();
detectCompositor();
scheduleSort();
Qt.callLater(() => {

View File

@@ -1,6 +1,8 @@
pragma Singleton
pragma ComponentBehavior: Bound
import QtCore
import QtQuick
import Quickshell
import Quickshell.Io
@@ -11,9 +13,6 @@ Singleton {
property bool dsearchAvailable: false
property int searchIdCounter: 0
property int indexVersion: 0
property bool supportsTypeFilter: false
property bool versionChecked: false
signal searchResultsReceived(var results)
signal statsReceived(var stats)
@@ -27,157 +26,118 @@ Singleton {
stdout: SplitParser {
onRead: line => {
if (line && line.trim().length > 0) {
root.dsearchAvailable = true;
root.dsearchAvailable = true
}
}
}
onExited: exitCode => {
if (exitCode !== 0) {
root.dsearchAvailable = false;
} else {
root._checkVersion();
root.dsearchAvailable = false
}
}
}
function _checkVersion() {
Proc.runCommand("dsearch-version", ["dsearch", "version", "--json"], (stdout, exitCode) => {
root.versionChecked = true;
if (exitCode !== 0)
return;
const response = JSON.parse(stdout);
root.indexVersion = response.index_schema || 0;
root.supportsTypeFilter = root.indexVersion >= 2;
});
}
function ping(callback) {
if (!dsearchAvailable) {
if (callback) {
callback({
"error": "dsearch not available"
});
callback({ "error": "dsearch not available" })
}
return;
return
}
Proc.runCommand("dsearch-ping", ["dsearch", "ping", "--json"], (stdout, exitCode) => {
if (callback) {
if (exitCode === 0) {
try {
const response = JSON.parse(stdout);
callback({
"result": response
});
const response = JSON.parse(stdout)
callback({ "result": response })
} catch (e) {
callback({
"error": "failed to parse ping response"
});
callback({ "error": "failed to parse ping response" })
}
} else {
callback({
"error": "ping failed"
});
callback({ "error": "ping failed" })
}
}
});
})
}
function search(query, params, callback) {
if (!query || query.length === 0) {
if (callback) {
callback({
"error": "query is required"
});
callback({ "error": "query is required" })
}
return;
return
}
if (!dsearchAvailable) {
if (callback) {
callback({
"error": "dsearch not available"
});
callback({ "error": "dsearch not available" })
}
return;
return
}
const args = ["dsearch", "search", query, "--json"];
const args = ["dsearch", "search", query, "--json"]
if (params) {
if (params.limit !== undefined) {
args.push("-n", String(params.limit));
}
if (params.type) {
args.push("-t", params.type);
args.push("-n", String(params.limit))
}
if (params.ext) {
args.push("-e", params.ext);
}
if (params.folder) {
args.push("--folder", params.folder);
args.push("-e", params.ext)
}
if (params.field) {
args.push("-f", params.field);
args.push("-f", params.field)
}
if (params.fuzzy) {
args.push("--fuzzy");
args.push("--fuzzy")
}
if (params.sort) {
args.push("--sort", params.sort);
args.push("--sort", params.sort)
}
if (params.desc !== undefined) {
args.push("--desc=" + (params.desc ? "true" : "false"));
args.push("--desc=" + (params.desc ? "true" : "false"))
}
if (params.minSize !== undefined) {
args.push("--min-size", String(params.minSize));
args.push("--min-size", String(params.minSize))
}
if (params.maxSize !== undefined) {
args.push("--max-size", String(params.maxSize));
args.push("--max-size", String(params.maxSize))
}
}
Proc.runCommand("dsearch-search", args, (stdout, exitCode) => {
if (exitCode === 0) {
try {
const response = JSON.parse(stdout);
searchResultsReceived(response);
const response = JSON.parse(stdout)
searchResultsReceived(response)
if (callback) {
callback({
"result": response
});
callback({ "result": response })
}
} catch (e) {
const error = "failed to parse search response";
errorOccurred(error);
const error = "failed to parse search response"
errorOccurred(error)
if (callback) {
callback({
"error": error
});
callback({ "error": error })
}
}
} else if (exitCode === 124) {
const error = "search timed out";
errorOccurred(error);
const error = "search timed out"
errorOccurred(error)
if (callback) {
callback({
"error": error
});
callback({ "error": error })
}
} else {
const error = "search failed";
errorOccurred(error);
const error = "search failed"
errorOccurred(error)
if (callback) {
callback({
"error": error
});
callback({ "error": error })
}
}
}, 100, 5000);
}, 100, 5000)
}
function rediscover() {
checkProcess.running = true;
checkProcess.running = true
}
}

View File

@@ -8,52 +8,87 @@ import Quickshell.Io
Singleton {
id: root
property var _cache: ({})
function resolveIconPath(moddedAppId) {
const entry = DesktopEntries.heuristicLookup(moddedAppId)
const appIds = [moddedAppId, moddedAppId.toLowerCase()];
if (!moddedAppId)
return "";
const lastPart = moddedAppId.split('.').pop();
if (lastPart && lastPart !== moddedAppId) {
appIds.push(lastPart);
if (_cache[moddedAppId] !== undefined)
return _cache[moddedAppId];
const firstChar = lastPart.charAt(0);
const rest = lastPart.slice(1);
let toggled;
const result = (function() {
// 1. Try heuristic lookup (standard)
const entry = DesktopEntries.heuristicLookup(moddedAppId);
let icon = Quickshell.iconPath(entry?.icon, true);
if (icon && icon !== "")
return icon;
if (firstChar === firstChar.toLowerCase()) {
toggled = firstChar.toUpperCase() + rest;
} else {
toggled = firstChar.toLowerCase() + rest;
}
// 2. Try the appId itself as an icon name
icon = Quickshell.iconPath(moddedAppId, true);
if (icon && icon !== "")
return icon;
if (toggled !== lastPart) {
appIds.push(toggled);
}
}
for (const appId of appIds){
let icon = Quickshell.iconPath(entry?.icon, true)
if (icon && icon !== "") return icon
// 3. Try variations of the appId (lowercase, last part)
const appIds = [moddedAppId.toLowerCase()];
const lastPart = moddedAppId.split('.').pop();
if (lastPart && lastPart !== moddedAppId) {
appIds.push(lastPart);
appIds.push(lastPart.toLowerCase());
}
let execPath = entry?.execString?.replace(/\/bin.*/, "")
if (!execPath) continue
for (const id of appIds) {
icon = Quickshell.iconPath(id, true);
if (icon && icon !== "")
return icon;
}
//Check that the app is installed with nix/guix
if (execPath.startsWith("/nix/store/") || execPath.startsWith("/gnu/store/")) {
const basePath = execPath
const sizes = ["256x256", "128x128", "64x64", "48x48", "32x32", "24x24", "16x16"]
// 4. Deep search in all desktop entries (if the above fail)
// This is slow-ish but only happens once for failed icons
const strippedId = moddedAppId.replace(/-bin$/, "").toLowerCase();
const allEntries = DesktopEntries.applications.values;
for (let i = 0; i < allEntries.length; i++) {
const e = allEntries[i];
const eId = (e.id || "").toLowerCase();
const eName = (e.name || "").toLowerCase();
const eExec = (e.execString || "").toLowerCase();
let iconPath = `${basePath}/share/icons/hicolor/scalable/apps/${appId}.svg`
icon = Quickshell.iconPath(iconPath, true)
if (icon && icon !== "") return icon
if (eId.includes(strippedId) || eName.includes(strippedId) || eExec.includes(strippedId)) {
icon = Quickshell.iconPath(e.icon, true);
if (icon && icon !== "")
return icon;
}
}
for (const size of sizes) {
iconPath = `${basePath}/share/icons/hicolor/${size}/apps/${appId}.png`
icon = Quickshell.iconPath(iconPath, true)
if (icon && icon !== "") return icon
}
}
// 5. Nix/Guix specific store check (as a last resort)
for (const appId of appIds) {
let execPath = entry?.execString?.replace(/\/bin.*/, "");
if (!execPath)
continue;
if (execPath.startsWith("/nix/store/") || execPath.startsWith("/gnu/store/")) {
const basePath = execPath;
const sizes = ["256x256", "128x128", "64x64", "48x48", "32x32", "24x24", "16x16"];
let iconPath = `${basePath}/share/icons/hicolor/scalable/apps/${appId}.svg`;
icon = Quickshell.iconPath(iconPath, true);
if (icon && icon !== "")
return icon;
for (const size of sizes) {
iconPath = `${basePath}/share/icons/hicolor/${size}/apps/${appId}.png`;
icon = Quickshell.iconPath(iconPath, true);
if (icon && icon !== "")
return icon;
}
}
}
return "";
})();
_cache[moddedAppId] = result;
return result;
}
return ""
}
}

View File

@@ -66,7 +66,7 @@ Singleton {
Timer {
id: suppressResetTimer
interval: 2000
interval: 5000
onTriggered: root.matugenSuppression = false
}

View File

@@ -158,7 +158,10 @@ Singleton {
continue;
const urg = typeof item.urgency === "number" ? item.urgency : 1;
const body = item.body || "";
const htmlBody = item.htmlBody || _resolveHtmlBody(body);
let htmlBody = item.htmlBody || _resolveHtmlBody(body);
if (htmlBody) {
htmlBody = htmlBody.replace(/<img\b[^>]*>/gi, "");
}
loaded.push({
id: item.id || "",
summary: item.summary || "",
@@ -720,8 +723,8 @@ Singleton {
}
required property Notification notification
readonly property string summary: notification?.summary ?? ""
readonly property string body: notification?.body ?? ""
readonly property string summary: (notification?.summary ?? "").replace(/<img\b[^>]*>/gi, "")
readonly property string body: (notification?.body ?? "").replace(/<img\b[^>]*>/gi, "")
readonly property string htmlBody: root._resolveHtmlBody(body)
readonly property string appIcon: notification?.appIcon ?? ""
readonly property string appName: {
@@ -978,22 +981,34 @@ Singleton {
function _resolveHtmlBody(body) {
if (!body)
return "";
if (/<\/?[a-z][\s\S]*>/i.test(body))
return body;
// Decode percent-encoded URLs (e.g. https%3A%2F%2F → https://)
body = body.replace(/\bhttps?%3A%2F%2F[^\s]+/gi, match => {
try { return decodeURIComponent(match); }
catch (e) { return match; }
});
let result = body;
if (/&(#\d+|#x[0-9a-fA-F]+|[a-zA-Z][a-zA-Z0-9]+);/.test(body)) {
const decoded = _decodeEntities(body);
if (/<\/?[a-z][\s\S]*>/i.test(decoded))
return decoded;
return Markdown2Html.markdownToHtml(decoded);
if (/<\/?[a-z][\s\S]*>/i.test(body)) {
result = body;
} else {
// Decode percent-encoded URLs (e.g. https%3A%2F%2F → https://)
let processed = body.replace(/\bhttps?%3A%2F%2F[^\s]+/gi, match => {
try {
return decodeURIComponent(match);
} catch (e) {
return match;
}
});
if (/&(#\d+|#x[0-9a-fA-F]+|[a-zA-Z][a-zA-Z0-9]+);/.test(processed)) {
const decoded = _decodeEntities(processed);
if (/<\/?[a-z][\s\S]*>/i.test(decoded))
result = decoded;
else
result = Markdown2Html.markdownToHtml(decoded);
} else {
result = Markdown2Html.markdownToHtml(processed);
}
}
return Markdown2Html.markdownToHtml(body);
// Strip out image tags to prevent IP tracking
return result.replace(/<img\b[^>]*>/gi, "");
}
function getGroupKey(wrapper) {

View File

@@ -9,19 +9,29 @@ Singleton {
id: root
property var controlCenterPopout: null
property var controlCenterLoader: null
property var notificationCenterPopout: null
property var notificationCenterLoader: null
property var appDrawerPopout: null
property var appDrawerLoader: null
property var processListPopout: null
property var processListPopoutLoader: null
property var dankDashPopout: null
property var dankDashPopoutLoader: null
property var batteryPopout: null
property var batteryPopoutLoader: null
property var vpnPopout: null
property var vpnPopoutLoader: null
property var systemUpdatePopout: null
property var systemUpdateLoader: null
property var layoutPopout: null
property var layoutPopoutLoader: null
property var clipboardHistoryPopout: null
property var clipboardHistoryPopoutLoader: null
property var settingsModal: null
property var settingsModalLoader: null
property var clipboardHistoryModal: null
property var clipboardHistoryPopout: null
property var dankLauncherV2Modal: null
property var dankLauncherV2ModalLoader: null
property var powerMenuModal: null
@@ -31,8 +41,6 @@ Singleton {
property var notificationModal: null
property var wifiPasswordModal: null
property var wifiPasswordModalLoader: null
property var wifiQRCodeModal: null
property var wifiQRCodeModalLoader: null
property var polkitAuthModal: null
property var polkitAuthModalLoader: null
property var bluetoothPairingModal: null
@@ -61,6 +69,13 @@ Singleton {
controlCenterPopout?.close();
}
function unloadControlCenter() {
if (!controlCenterLoader)
return;
controlCenterPopout = null;
controlCenterLoader.active = false;
}
function toggleControlCenter(x, y, width, section, screen) {
if (controlCenterPopout) {
setPosition(controlCenterPopout, x, y, width, section, screen);
@@ -79,6 +94,13 @@ Singleton {
notificationCenterPopout?.close();
}
function unloadNotificationCenter() {
if (!notificationCenterLoader)
return;
notificationCenterPopout = null;
notificationCenterLoader.active = false;
}
function toggleNotificationCenter(x, y, width, section, screen) {
if (notificationCenterPopout) {
setPosition(notificationCenterPopout, x, y, width, section, screen);
@@ -97,6 +119,13 @@ Singleton {
appDrawerPopout?.close();
}
function unloadAppDrawer() {
if (!appDrawerLoader)
return;
appDrawerPopout = null;
appDrawerLoader.active = false;
}
function toggleAppDrawer(x, y, width, section, screen) {
if (appDrawerPopout) {
setPosition(appDrawerPopout, x, y, width, section, screen);
@@ -115,6 +144,13 @@ Singleton {
processListPopout?.close();
}
function unloadProcessListPopout() {
if (!processListPopoutLoader)
return;
processListPopout = null;
processListPopoutLoader.active = false;
}
function toggleProcessList(x, y, width, section, screen) {
if (processListPopout) {
setPosition(processListPopout, x, y, width, section, screen);
@@ -163,6 +199,13 @@ Singleton {
dankDashPopout.dashVisible = false;
}
function unloadDankDash() {
if (!dankDashPopoutLoader)
return;
dankDashPopout = null;
dankDashPopoutLoader.active = false;
}
function toggleDankDash(tabIndex, x, y, width, section, screen) {
_dankDashPendingTab = tabIndex || 0;
if (dankDashPopout) {
@@ -219,6 +262,13 @@ Singleton {
batteryPopout?.close();
}
function unloadBattery() {
if (!batteryPopoutLoader)
return;
batteryPopout = null;
batteryPopoutLoader.active = false;
}
function toggleBattery(x, y, width, section, screen) {
if (batteryPopout) {
setPosition(batteryPopout, x, y, width, section, screen);
@@ -237,6 +287,13 @@ Singleton {
vpnPopout?.close();
}
function unloadVpn() {
if (!vpnPopoutLoader)
return;
vpnPopout = null;
vpnPopoutLoader.active = false;
}
function toggleVpn(x, y, width, section, screen) {
if (vpnPopout) {
setPosition(vpnPopout, x, y, width, section, screen);
@@ -255,6 +312,13 @@ Singleton {
systemUpdatePopout?.close();
}
function unloadSystemUpdate() {
if (!systemUpdateLoader)
return;
systemUpdatePopout = null;
systemUpdateLoader.active = false;
}
function toggleSystemUpdate(x, y, width, section, screen) {
if (systemUpdatePopout) {
setPosition(systemUpdatePopout, x, y, width, section, screen);
@@ -415,6 +479,20 @@ Singleton {
clipboardHistoryModal?.close();
}
function unloadClipboardHistoryPopout() {
if (!clipboardHistoryPopoutLoader)
return;
clipboardHistoryPopout = null;
clipboardHistoryPopoutLoader.active = false;
}
function unloadLayoutPopout() {
if (!layoutPopoutLoader)
return;
layoutPopout = null;
layoutPopoutLoader.active = false;
}
property bool _dankLauncherV2WantsOpen: false
property bool _dankLauncherV2WantsToggle: false
property string _dankLauncherV2PendingQuery: ""
@@ -583,13 +661,6 @@ Singleton {
wifiPasswordModal.show(ssid);
}
function showWifiQRCodeModal(ssid) {
if (wifiQRCodeModalLoader)
wifiQRCodeModalLoader.active = true;
if (wifiQRCodeModal)
wifiQRCodeModal.show(ssid);
}
function showHiddenNetworkModal() {
if (wifiPasswordModalLoader)
wifiPasswordModalLoader.active = true;

View File

@@ -1 +1 @@
v1.5-beta
v1.4.3

View File

@@ -236,7 +236,14 @@ Item {
parent: Overlay.overlay
width: root.popupWidth === -1 ? undefined : (root.popupWidth > 0 ? root.popupWidth : (dropdown.width + root.popupWidthOffset))
height: Math.min(root.maxPopupHeight, (root.enableFuzzySearch ? 54 : 0) + Math.min(filteredOptions.length, 10) * 36 + 16)
height: {
let h = root.enableFuzzySearch ? 54 : 0;
if (root.options.length === 0 && root.emptyText !== "")
h += 32;
else
h += Math.min(filteredOptions.length, 10) * 36;
return Math.min(root.maxPopupHeight, h + 16);
}
padding: 0
modal: true
dim: false

View File

@@ -288,6 +288,10 @@ Item {
screen: root.screen
visible: false
color: "transparent"
Component.onCompleted: {
if (typeof updatesEnabled !== "undefined")
updatesEnabled = false;
}
WlrLayershell.namespace: root.layerNamespace + ":background"
WlrLayershell.layer: WlrLayershell.Top

File diff suppressed because it is too large Load Diff

View File

@@ -21,7 +21,7 @@
"%1 custom animation duration": ""
},
"%1 days ago": {
"%1 days ago": ""
"%1 days ago": "hace %1 días"
},
"%1 disconnected": {
"%1 disconnected": ""
@@ -45,7 +45,7 @@
"%1 job(s)": "%1 trabajo(s)"
},
"%1 notifications": {
"%1 notifications": ""
"%1 notifications": "%1 notificaciones"
},
"%1 printer(s)": {
"%1 printer(s)": "%1 impresora(s)"
@@ -57,13 +57,13 @@
"%1 widgets": "%1 widgets"
},
"%1m ago": {
"%1m ago": ""
"%1m ago": "hace %1m"
},
"(Unnamed)": {
"(Unnamed)": "(Sin nombre)"
},
"+ %1 more": {
"+ %1 more": ""
"+ %1 more": "+ %1 más"
},
"0 = square corners": {
"0 = square corners": "0 = esquinas cuadradas"
@@ -78,7 +78,7 @@
"1 minute": "1 minuto"
},
"1 notification": {
"1 notification": ""
"1 notification": "1 notificación"
},
"1 second": {
"1 second": "1 segundo"
@@ -183,7 +183,7 @@
"About": "Información"
},
"Accent Color": {
"Accent Color": ""
"Accent Color": "Color de acento"
},
"Accept Jobs": {
"Accept Jobs": "Aceptar trabajos"
@@ -560,7 +560,7 @@
"Available Screens (%1)": "Pantallas disponibles (%1)"
},
"Available in Detailed and Forecast view modes": {
"Available in Detailed and Forecast view modes": ""
"Available in Detailed and Forecast view modes": "Disponible en modo detallado y pronóstico"
},
"BSSID": {
"BSSID": "BSSID"
@@ -659,7 +659,7 @@
"Border Opacity": "Opacidad del borde"
},
"Border Size": {
"Border Size": ""
"Border Size": "Grosor del borde"
},
"Border Thickness": {
"Border Thickness": "Grosor del borde"
@@ -812,7 +812,7 @@
"Choose colors from palette": "Escoje colores de la paleta"
},
"Choose how the weather widget is displayed": {
"Choose how the weather widget is displayed": ""
"Choose how the weather widget is displayed": "Elige cómo se muestra el widget del tiempo"
},
"Choose icon": {
"Choose icon": "Elegir icono"
@@ -1010,7 +1010,7 @@
"Communication": "Comunicación"
},
"Compact": {
"Compact": ""
"Compact": "Compacto"
},
"Compact Mode": {
"Compact Mode": "Modo compacto"
@@ -1253,7 +1253,7 @@
"Custom": "Personal"
},
"Custom Color": {
"Custom Color": ""
"Custom Color": "Color personalizado"
},
"Custom Duration": {
"Custom Duration": "Duracion personalizada"
@@ -1439,7 +1439,7 @@
"Desktop Clock": "Reloj de escritorio"
},
"Detailed": {
"Detailed": ""
"Detailed": "Detallado"
},
"Development": {
"Development": "Desarrollo"
@@ -1541,7 +1541,7 @@
"Display currently focused application title": "Mostrar título de la aplicación enfocada"
},
"Display hourly weather predictions": {
"Display hourly weather predictions": ""
"Display hourly weather predictions": "Mostrar pronósticos por hora"
},
"Display only workspaces that contain windows": {
"Display only workspaces that contain windows": "Mostrar solo los espacios que contengan ventanas"
@@ -1826,7 +1826,7 @@
"Fade to lock screen": "Bloquear con transición suave"
},
"Fade to monitor off": {
"Fade to monitor off": ""
"Fade to monitor off": "Fundido antes de apagar monitor"
},
"Failed to activate configuration": {
"Failed to activate configuration": "Error al activar la configuración"
@@ -2006,7 +2006,7 @@
"Failed to write temp file for validation": "Fallo al escribir archivo temporal para la validacion"
},
"Feels": {
"Feels": ""
"Feels": "Sensación"
},
"Feels Like": {
"Feels Like": "Temperatura"
@@ -2089,6 +2089,12 @@
"Fog": {
"Fog": ""
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": ""
},
@@ -2123,7 +2129,7 @@
"Force terminal applications to always use dark color schemes": "Forzar que las aplicaciones de terminal usen esquemas de colores oscuros"
},
"Forecast": {
"Forecast": ""
"Forecast": "Pronóstico"
},
"Forecast Days": {
"Forecast Days": ""
@@ -2207,7 +2213,7 @@
"Gradually fade the screen before locking with a configurable grace period": "Desvanecer gradualmente la pantalla antes de bloquear, con una duración configurable"
},
"Gradually fade the screen before turning off monitors with a configurable grace period": {
"Gradually fade the screen before turning off monitors with a configurable grace period": ""
"Gradually fade the screen before turning off monitors with a configurable grace period": "La pantalla se funde a negro antes de apagar el monitor, tras un intervalo configurable"
},
"Graph Time Range": {
"Graph Time Range": "Gráfico Intervalo de tiempo"
@@ -2396,7 +2402,7 @@
"Humidity": "Humedad"
},
"Hyprland Layout Overrides": {
"Hyprland Layout Overrides": ""
"Hyprland Layout Overrides": "Sobreescribir opciones de Hyprland"
},
"Hyprland Options": {
"Hyprland Options": ""
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": ""
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "Tamaño de icono"
},
@@ -2894,7 +2903,7 @@
"Lock before suspend": "Bloquear pantalla antes de suspender"
},
"Lock fade grace period": {
"Lock fade grace period": ""
"Lock fade grace period": "Intervalo de fundido antes de bloquear la pantalla"
},
"Locked": {
"Locked": ""
@@ -2933,7 +2942,7 @@
"Management": "Gestión"
},
"MangoWC Layout Overrides": {
"MangoWC Layout Overrides": ""
"MangoWC Layout Overrides": "Sobreescribir opciones de MangoWC"
},
"Manual Coordinates": {
"Manual Coordinates": "Coordenadas manuales"
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "Maximizar la detección"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "Tamaño máximo de entrada"
},
@@ -3140,7 +3155,7 @@
"Monitor Configuration": "Configuracion del monitor"
},
"Monitor fade grace period": {
"Monitor fade grace period": ""
"Monitor fade grace period": "Intervalo de fundido antes de apagar el monitor"
},
"Monitor whose wallpaper drives dynamic theming colors": {
"Monitor whose wallpaper drives dynamic theming colors": "Seleccionar monitor que define los colores dinámicos"
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "Archivos no encontrados"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": ""
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": ""
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "Abrir barra de búsqueda para encontrar texto"
},
@@ -3883,7 +3904,7 @@
"Power source": "Fuente de energia"
},
"Precip": {
"Precip": ""
"Precip": "Precipitaciones"
},
"Precipitation": {
"Precipitation": ""
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "Remover"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "Eliminar espacios y bordes cuando las ventanas estan maximizadas"
},
@@ -4150,10 +4174,10 @@
"Rounded corners for windows": "Esquinas redondeadas para ventanas"
},
"Rounded corners for windows (border_radius)": {
"Rounded corners for windows (border_radius)": ""
"Rounded corners for windows (border_radius)": "Esquinas de ventana redondeadas (border_radius)"
},
"Rounded corners for windows (decoration.rounding)": {
"Rounded corners for windows (decoration.rounding)": ""
"Rounded corners for windows (decoration.rounding)": "Esquinas de ventana redondeadas (decoration.rounding)"
},
"Rule": {
"Rule": ""
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "Guardar archivo"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": ""
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "Escalar fuentes de la barra independientemente"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "Escala todos los tamaños de fuente en todo el shell"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "Ciencia"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": ""
},
@@ -4471,10 +4504,10 @@
"Show Dock": "Mostrar dock"
},
"Show Feels Like Temperature": {
"Show Feels Like Temperature": ""
"Show Feels Like Temperature": "Mostrar sensación térmica"
},
"Show Forecast": {
"Show Forecast": ""
"Show Forecast": "Mostrar pronóstico"
},
"Show GPU Temperature": {
"Show GPU Temperature": "Mostrar temperatura de la GPU"
@@ -4489,10 +4522,10 @@
"Show Hour Numbers": "Mostrar números de horas"
},
"Show Hourly Forecast": {
"Show Hourly Forecast": ""
"Show Hourly Forecast": "Mostrar pronóstico por hora"
},
"Show Humidity": {
"Show Humidity": ""
"Show Humidity": "Mostrar humedad"
},
"Show Launcher Button": {
"Show Launcher Button": ""
@@ -4501,7 +4534,7 @@
"Show Line Numbers": "Mostrar números de líneas"
},
"Show Location": {
"Show Location": ""
"Show Location": "Mostrar ubicación"
},
"Show Lock": {
"Show Lock": "Mostrar Bloquear"
@@ -4534,10 +4567,10 @@
"Show Power Off": "Mostrar Apagar"
},
"Show Precipitation Probability": {
"Show Precipitation Probability": ""
"Show Precipitation Probability": "Mostrar probabilidad de precipitaciones"
},
"Show Pressure": {
"Show Pressure": ""
"Show Pressure": "Mostrar presión"
},
"Show Reboot": {
"Show Reboot": "Mostrar Reiniciar"
@@ -4552,7 +4585,7 @@
"Show Seconds": "Mostrar segundos"
},
"Show Sunrise/Sunset": {
"Show Sunrise/Sunset": ""
"Show Sunrise/Sunset": "Mostrar amanecer/anochecer"
},
"Show Suspend": {
"Show Suspend": "Mostrar Suspender"
@@ -4561,13 +4594,13 @@
"Show Top Processes": "Mostrar procesos principales"
},
"Show Weather Condition": {
"Show Weather Condition": ""
"Show Weather Condition": "Mostrar estado del tiempo"
},
"Show Welcome": {
"Show Welcome": ""
"Show Welcome": "Mostrar bienvenida"
},
"Show Wind Speed": {
"Show Wind Speed": ""
"Show Wind Speed": "Mostrar velocidad del viento"
},
"Show Workspace Apps": {
"Show Workspace Apps": "Mostrar aplicaciones en el espacio de trabajo"
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": ""
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": ""
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "Sin titulo"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": ""
},
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "Dispositivo Wi-Fi"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "WiFi desactivado"
},
@@ -5765,6 +5807,9 @@
"events": {
"events": "eventos"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": ""
},
@@ -5781,28 +5826,28 @@
"GPU Monitoring": ""
},
"greeter back button": {
"Back": ""
"Back": "Atrás"
},
"greeter completion page subtitle": {
"DankMaterialShell is ready to use": ""
"DankMaterialShell is ready to use": "DankMaterialShell está listo para utilizarse"
},
"greeter completion page title": {
"You're All Set!": ""
},
"greeter configure keybinds link": {
"Configure Keybinds": ""
"Configure Keybinds": "Configurar atajos de teclado"
},
"greeter dankbar description": {
"Widgets, layout, style": ""
},
"greeter displays description": {
"Resolution, position, scale": ""
"Resolution, position, scale": "Resolución, posición, escala"
},
"greeter dock description": {
"Position, pinned apps": ""
"Position, pinned apps": "Posición de las aplicaciones fijadas"
},
"greeter doctor page button": {
"Run Again": ""
"Run Again": "Ejecutar de nuevo"
},
"greeter doctor page empty state": {
"No checks passed": "",
@@ -5811,46 +5856,46 @@
"No warnings": ""
},
"greeter doctor page error count": {
"%1 issue(s) found": ""
"%1 issue(s) found": "detectado(s) %1 problema(s)"
},
"greeter doctor page loading text": {
"Analyzing configuration...": ""
"Analyzing configuration...": "Analizando la configuración..."
},
"greeter doctor page status card": {
"Errors": "",
"Info": "",
"Errors": "Errores",
"Info": "Información",
"OK": "",
"Warnings": ""
},
"greeter doctor page success": {
"All checks passed": ""
"All checks passed": "Todas las comprobaciones fueron exitosas"
},
"greeter doctor page title": {
"System Check": ""
},
"greeter documentation link": {
"Docs": ""
"Docs": "Documentación"
},
"greeter explore section header": {
"Explore": ""
"Explore": "Explorar"
},
"greeter feature card description": {
"Background app icons": "",
"Colors from wallpaper": "",
"Community themes": "",
"Extensible architecture": "",
"GTK, Qt, IDEs, more": "",
"Modular widget bar": "",
"Colors from wallpaper": "Colores del fondo de pantalla",
"Community themes": "Temas de la comunidad",
"Extensible architecture": "Arquitectura extensible",
"GTK, Qt, IDEs, more": "GTK, Qt, IDE y más",
"Modular widget bar": "Barra de widgets modular",
"Night mode & gamma": "",
"Per-screen config": "",
"Quick system toggles": "",
"Quick system toggles": "Configuración rápida del sistema",
"Security & privacy": ""
},
"greeter feature card title": {
"App Theming": "",
"Control Center": "",
"Display Control": "",
"Dynamic Theming": "",
"Control Center": "Centro de control",
"Display Control": "Control del monitor",
"Dynamic Theming": "Temas dinámicos",
"Multi-Monitor": "",
"System Tray": "",
"Theme Registry": ""
@@ -5859,22 +5904,22 @@
"Plugins": ""
},
"greeter feature card title | greeter settings link": {
"DankBar": ""
"DankBar": "DankBar"
},
"greeter feature card title | lock screen notifications settings card": {
"Lock Screen": ""
},
"greeter finish button": {
"Finish": ""
"Finish": "Terminar"
},
"greeter first page button": {
"Get Started": ""
"Get Started": "Comenzar"
},
"greeter keybinds niri description": {
"niri shortcuts config": ""
},
"greeter keybinds section header": {
"DMS Shortcuts": ""
"DMS Shortcuts": "Atajos de DMS"
},
"greeter modal window title": {
"Welcome": ""
@@ -5886,39 +5931,39 @@
"No DMS shortcuts configured": ""
},
"greeter notifications description": {
"Popup behavior, position": ""
"Popup behavior, position": "Comportamiento y posición de las notificaciones emergentes"
},
"greeter settings link": {
"Displays": "",
"Dock": "",
"Keybinds": "",
"Displays": "Monitores",
"Dock": "Dock",
"Keybinds": "Atajos de teclado",
"Notifications": "",
"Theme & Colors": "",
"Wallpaper": ""
},
"greeter settings section header": {
"Configure": ""
"Configure": "Configurar"
},
"greeter skip button": {
"Skip": ""
"Skip": "Pasar"
},
"greeter skip button tooltip": {
"Skip setup": ""
},
"greeter theme description": {
"Dynamic colors, presets": ""
"Dynamic colors, presets": "Colores y esquemas dinámicos"
},
"greeter themes link": {
"Themes": ""
},
"greeter wallpaper description": {
"Background image": ""
"Background image": "Imagen de fondo"
},
"greeter welcome page section header": {
"Features": ""
"Features": "Funciones"
},
"greeter welcome page tagline": {
"A modern desktop shell for Wayland compositors": ""
"A modern desktop shell for Wayland compositors": "Un shell de escritorio moderno para compositores Wayland"
},
"greeter welcome page title": {
"Welcome to DankMaterialShell": ""
@@ -5963,20 +6008,20 @@
"Loading...": "Cargando..."
},
"lock screen notification mode option": {
"App Names": "",
"Count Only": "",
"Disabled": "",
"Full Content": ""
"App Names": "Nombre de la aplicación",
"Count Only": "Solo la cantidad",
"Disabled": "Desactivado",
"Full Content": "Contenido completo"
},
"lock screen notification mode option | notification rule match field option": {
"App Names": ""
},
"lock screen notification privacy setting": {
"Control what notification information is shown on the lock screen": "",
"Control what notification information is shown on the lock screen": "Controla cuánta información de las notificaciones se muestra en la pantalla de bloqueo",
"Notification Display": ""
},
"lock screen notifications settings card": {
"Lock Screen": ""
"Lock Screen": "Pantalla de bloqueo"
},
"loginctl not available - lock integration requires DMS socket connection": {
"loginctl not available - lock integration requires DMS socket connection": "loginctl no disponible - integración requiere conexión al socket DMS"
@@ -6044,45 +6089,45 @@
"No wallpaper selected": "No hay papel pintado seleccionado"
},
"notification center tab": {
"Current": "",
"History": ""
"Current": "Actuales",
"History": "Historial"
},
"notification history filter": {
"All": "",
"Last hour": "",
"Today": "",
"Yesterday": ""
"All": "Todas",
"Last hour": "Última hora",
"Today": "Hoy",
"Yesterday": "Ayer"
},
"notification history filter for content older than other filters": {
"Older": ""
"Older": "Más antiguas"
},
"notification history filter | notification history retention option": {
"30 days": "",
"7 days": ""
"30 days": "30 días",
"7 days": "7 días"
},
"notification history limit": {
"Maximum number of notifications to keep": ""
"Maximum number of notifications to keep": "Número máximo de notificaciones que se conservarán"
},
"notification history retention option": {
"1 day": "",
"14 days": "",
"3 days": "",
"Forever": ""
"1 day": "1 día",
"14 days": "14 días",
"3 days": "3 días",
"Forever": "Siempre"
},
"notification history retention settings label": {
"History Retention": ""
"History Retention": "Preservación del historial"
},
"notification history setting": {
"Auto-delete notifications older than this": "",
"Save critical priority notifications to history": "",
"Save low priority notifications to history": "",
"Save normal priority notifications to history": ""
"Auto-delete notifications older than this": "Eliminar automáticamente las notificaciones más antiguas",
"Save critical priority notifications to history": "Guardar en el historial las notificaciones de prioridad crítica",
"Save low priority notifications to history": "Guardar en el historial las notificaciones de prioridad baja",
"Save normal priority notifications to history": "Guardar en el historial las notificaciones de prioridad normal"
},
"notification history toggle description": {
"Save dismissed notifications to history": ""
"Save dismissed notifications to history": "Guardar en el historial las notificaciones ignoradas"
},
"notification history toggle label": {
"Enable History": ""
"Enable History": "Activar historial"
},
"notification privacy mode placeholder": {
"Message Content": ""
@@ -6112,7 +6157,7 @@
"Normal Priority": ""
},
"now": {
"now": ""
"now": "ahora"
},
"official": {
"official": "oficial"
@@ -6392,7 +6437,7 @@
"wtype not available - install wtype for paste support": "wtype no disponible - instala wtype para soporte de pegado"
},
"yesterday": {
"yesterday": ""
"yesterday": "ayer"
},
"• Install only from trusted sources": {
"• Install only from trusted sources": "• Instalar solo desde fuentes confiables"

View File

@@ -770,7 +770,7 @@
"Caps Lock Indicator": "نشانگر Caps Lock"
},
"Caps Lock is on": {
"Caps Lock is on": ""
"Caps Lock is on": "قفل حروف بزرگ روشن است"
},
"Center Section": {
"Center Section": "بخش مرکزی"
@@ -2089,6 +2089,12 @@
"Fog": {
"Fog": "مه"
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": "فوکوس مانیتور را دنبال کن"
},
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": "آیکون"
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "اندازه آیکون"
},
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "تشخیص بزرگ‌شدن پنجره"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "حداکثر اندازه مدخل"
},
@@ -3194,7 +3209,7 @@
"Named Workspace Icons": "آیکون محیط‌کارهای نام‌دار"
},
"Navigation": {
"Navigation": "مسیریابی"
"Navigation": "پیمایش"
},
"Network": {
"Network": "شبکه"
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "هیچ فایلی یافت نشد"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": "هیچ برنامه پنهانی موجود نیست."
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": "باز کردن در مرورگر"
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "باز‌کردن نوار جستجو برای یافتن متن"
},
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "حذف"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "حذف فاصله‌ها و حاشیه هنگام بزرگ‌کردن پنجره‌ها"
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "ذخیره فایل دفترچه یادداشت"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": "ذخیره و جابه‌جایی بین پیکربندی‌های نمایشگر"
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "اندازه فونت نوار دَنک را به صورت مستقل مقیاس کن"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "تمام اندازه‌های فونت در سراسر شِل مقیاس کن"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "علمی"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": "اشتراک‌گذاری صفحه"
},
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": "راه‌انداز: %1"
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": "یک جستجوی دیگر را امتحان کنید"
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "بدون عنوان"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": "بروزرسانی"
},
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "دستگاه وای‌فای"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "وای‌فای غیرفعال"
},
@@ -5765,6 +5807,9 @@
"events": {
"events": "رویداد‌ها"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": "کارت گرافیک ناشناخته"
},
@@ -6016,7 +6061,7 @@
"ms": "ms"
},
"nav": {
"nav": "جهت"
"nav": "پیمایش"
},
"neovim template description": {
"Requires lazy plugin manager": "به مدیریت افزونه lazy نیاز دارد"
@@ -6322,13 +6367,13 @@
"Wallpaper Error": "خطای تصویر پس‌زمینه"
},
"wallpaper fill mode": {
"Fill": "پرکن",
"Fit": "جاشدن",
"Fill": ُر",
"Fit": "متناسب",
"Pad": "حاشیه‌دار",
"Stretch": "کشیده",
"Tile": "کاشی",
"Tile H": "کاشی افقی",
"Tile V": "کاشی عمودی"
"Tile": "کاشی‌وار",
"Tile H": "کاشی‌وار افقی",
"Tile V": "کاشی‌وار عمودی"
},
"wallpaper interval": {
"1 hour": "۱ ساعت",
@@ -6434,6 +6479,6 @@
"• yyyy - Year (2024)": "• yyyy - سال (2024)"
},
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": {
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": ""
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": "↑/↓: پیمایش • Space: گسترش • Enter: اقدام/گسترش • E: متن"
}
}

View File

@@ -105,10 +105,10 @@
"2 minutes": "2 minutes"
},
"2 seconds": {
"2 seconds": ""
"2 seconds": "2 secondes"
},
"20 minutes": {
"20 minutes": ""
"20 minutes": "20 minutes"
},
"24-Hour Format": {
"24-Hour Format": "Format 24 Heures"
@@ -117,7 +117,7 @@
"24-hour format": "Format 24 heures"
},
"250 ms": {
"250 ms": ""
"250 ms": "250ms"
},
"270°": {
"270°": "270°"
@@ -126,7 +126,7 @@
"3 days": "3 jours"
},
"3 minutes": {
"3 minutes": ""
"3 minutes": "3 minutes"
},
"3 seconds": {
"3 seconds": "3 secondes"
@@ -141,7 +141,7 @@
"3rd party": "tiers"
},
"4 seconds": {
"4 seconds": ""
"4 seconds": "4 secondes"
},
"5 minutes": {
"5 minutes": "5 minutes"
@@ -150,13 +150,13 @@
"5 seconds": "5 secondes"
},
"500 ms": {
"500 ms": ""
"500 ms": "500ms"
},
"7 days": {
"7 days": "7 jours"
},
"750 ms": {
"750 ms": ""
"750 ms": "750ms"
},
"8 seconds": {
"8 seconds": "8 secondes"
@@ -770,7 +770,7 @@
"Caps Lock Indicator": "Indicateur Verr. Maj."
},
"Caps Lock is on": {
"Caps Lock is on": ""
"Caps Lock is on": "Verr Maj est activé"
},
"Center Section": {
"Center Section": "Partie centrale"
@@ -1418,7 +1418,7 @@
"Description": "Description"
},
"Desktop": {
"Desktop": ""
"Desktop": "Bureau"
},
"Desktop Clock": {
"Desktop Clock": "Horloge du bureau"
@@ -1592,7 +1592,7 @@
"Docs": "Documentation"
},
"Documents": {
"Documents": ""
"Documents": "Documents"
},
"Domain (optional)": {
"Domain (optional)": "Domaine (optionnel)"
@@ -1607,7 +1607,7 @@
"Door Open": "Porte ouverte"
},
"Downloads": {
"Downloads": ""
"Downloads": "Téléchargements"
},
"Drag to Reorder": {
"Drag to Reorder": "Glisser pour réorganiser"
@@ -2087,7 +2087,13 @@
"Focused Window": "Fenêtre active"
},
"Fog": {
"Fog": ""
"Fog": "Brouillard"
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": "Suivre le focus de lécran"
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": "Icône"
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "Taille d'icônes"
},
@@ -2819,10 +2828,10 @@
"Light Mode": "Mode Clair"
},
"Light Rain": {
"Light Rain": ""
"Light Rain": "Pluie légère"
},
"Light Snow": {
"Light Snow": ""
"Light Snow": "Neige légère"
},
"Light Snow Showers": {
"Light Snow Showers": ""
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "Détection de maximisation"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "Taille maximale dentrée"
},
@@ -3173,7 +3188,7 @@
"Moving to Paused": "Mise en pause en cours"
},
"Music": {
"Music": ""
"Music": "Musique"
},
"Mute popups for %1": {
"Mute popups for %1": "Popup en sourdine pour %1"
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "Aucun fichier trouvé"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": "Aucune appli masquée."
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": "Ouvrir dans le navigateur"
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "Ouvrir la barre de recherche pour trouver du texte"
},
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "Supprimer"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "Supprimer les marges et bordures lorsque les fenêtres sont maximisées"
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "Enregistrer le fichier"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": "Enregistrer et basculer entre les configurations daffichage"
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "Échelle des polices de la barre indépendamment"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "Échelle de toutes les polices dans le shell"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "Science"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": "Partage d'écran"
},
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": "Déclencheur : %1"
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": "Essayez une recherche différente"
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "Sans titre"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": "Mettre à jour"
},
@@ -5350,7 +5389,7 @@
"Vibrant palette with playful saturation.": "Palette vibrante avec saturation ludique."
},
"Videos": {
"Videos": ""
"Videos": "Vidéos"
},
"View Mode": {
"View Mode": "Mode daffichage"
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "Appareil Wi-Fi"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "Wi-Fi désactivé"
},
@@ -5765,6 +5807,9 @@
"events": {
"events": "événements"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": "GPU inconnu"
},
@@ -6118,22 +6163,22 @@
"official": "officiel"
},
"on Hyprland": {
"on Hyprland": ""
"on Hyprland": "sur Hyprland"
},
"on MangoWC": {
"on MangoWC": ""
"on MangoWC": "sur MangoWC"
},
"on Miracle WM": {
"on Miracle WM": ""
"on Miracle WM": "sur Miracle WM"
},
"on Niri": {
"on Niri": ""
"on Niri": "sur Niri"
},
"on Scroll": {
"on Scroll": ""
"on Scroll": "sur Scroll"
},
"on Sway": {
"on Sway": ""
"on Sway": "sur Sway"
},
"open": {
"open": "ouvrir"
@@ -6186,7 +6231,7 @@
"You need to set either:\nQT_QPA_PLATFORMTHEME=gtk3 OR\nQT_QPA_PLATFORMTHEME=qt6ct\nas environment variables, and then restart the shell.\n\nqt6ct requires qt6ct-kde to be installed.": ""
},
"qt theme env error title": {
"Missing Environment Variables": ""
"Missing Environment Variables": "Variables d'environnement manquantes"
},
"read-only settings warning for NixOS home-manager users": {
"Settings are read-only. Changes will not persist.": "Les paramètres sont en lecture seule. Les modifications ne seront pas conservées."
@@ -6246,7 +6291,7 @@
"Load Average": "Charge moyenne"
},
"theme auto mode tab": {
"Location": ""
"Location": "Localisation"
},
"theme auto mode tab | wallpaper cycling mode tab": {
"Time": ""
@@ -6292,7 +6337,7 @@
"Unknown": "Inconnu"
},
"up": {
"up": ""
"up": "allumé"
},
"update dms for NM integration.": {
"update dms for NM integration.": "Mettre à jour DMS pour l'intégration NM."
@@ -6331,29 +6376,29 @@
"Tile V": "Tuile V"
},
"wallpaper interval": {
"1 hour": "",
"1 hour 30 minutes": "",
"1 minute": "",
"10 seconds": "",
"12 hours": "",
"15 minutes": "",
"15 seconds": "",
"2 hours": "",
"20 seconds": "",
"25 seconds": "",
"3 hours": "",
"30 minutes": "",
"30 seconds": "",
"35 seconds": "",
"4 hours": "",
"40 seconds": "",
"45 seconds": "",
"5 minutes": "",
"5 seconds": "",
"50 seconds": "",
"55 seconds": "",
"6 hours": "",
"8 hours": ""
"1 hour": "1 heure",
"1 hour 30 minutes": "1 heure et 30 minutes",
"1 minute": "1 minute",
"10 seconds": "10 secondes",
"12 hours": "12 heures",
"15 minutes": "15 minutes",
"15 seconds": "15 secondes",
"2 hours": "2 heures",
"20 seconds": "20 secondes",
"25 seconds": "25 secondes",
"3 hours": "3 heures",
"30 minutes": "30 minutes",
"30 seconds": "30 secondes",
"35 seconds": "35 secondes",
"4 hours": "4 heures",
"40 seconds": "40 secondes",
"45 seconds": "45 secondes",
"5 minutes": "5 minutes",
"5 seconds": "5 secondes",
"50 seconds": "50 secondes",
"55 seconds": "55 secondes",
"6 hours": "6 heures",
"8 hours": "8 heures"
},
"wallpaper not set label": {
"Not set": ""
@@ -6434,6 +6479,6 @@
"• yyyy - Year (2024)": "• yyyy - Année (2024)"
},
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": {
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": ""
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": "↑/↓: Nav • Espace: Étendre • Entrée: Action/Étendre • E: Texte"
}
}

View File

@@ -105,10 +105,10 @@
"2 minutes": "2 דקות"
},
"2 seconds": {
"2 seconds": ""
"2 seconds": "2 שניות"
},
"20 minutes": {
"20 minutes": ""
"20 minutes": "20 דקות"
},
"24-Hour Format": {
"24-Hour Format": "תבנית 24 שעות"
@@ -117,7 +117,7 @@
"24-hour format": "תבנית 24 שעות"
},
"250 ms": {
"250 ms": ""
"250 ms": "250 ms"
},
"270°": {
"270°": "270°"
@@ -126,7 +126,7 @@
"3 days": "3 ימים"
},
"3 minutes": {
"3 minutes": ""
"3 minutes": "3 דקות"
},
"3 seconds": {
"3 seconds": "3 שניות"
@@ -141,7 +141,7 @@
"3rd party": "צד שלישי"
},
"4 seconds": {
"4 seconds": ""
"4 seconds": "4 שניות"
},
"5 minutes": {
"5 minutes": "5 דקות"
@@ -150,13 +150,13 @@
"5 seconds": "5 שניות"
},
"500 ms": {
"500 ms": ""
"500 ms": "500 מילישניות"
},
"7 days": {
"7 days": "7 ימים"
},
"750 ms": {
"750 ms": ""
"750 ms": "750 מילישניות"
},
"8 seconds": {
"8 seconds": "8 שניות"
@@ -171,7 +171,7 @@
"A file with this name already exists. Do you want to overwrite it?": "קיים כבר קובץ עם השם זה. האם ברצונך לדרוס אותו?"
},
"AC Power": {
"AC Power": ""
"AC Power": "חשמל AC"
},
"API": {
"API": "API"
@@ -770,7 +770,7 @@
"Caps Lock Indicator": "מחוון Caps Lock"
},
"Caps Lock is on": {
"Caps Lock is on": ""
"Caps Lock is on": "Caps Lock פעיל"
},
"Center Section": {
"Center Section": "קטע אמצעי"
@@ -863,7 +863,7 @@
"Clear History?": "לנקות את ההיסטוריה?"
},
"Clear Sky": {
"Clear Sky": ""
"Clear Sky": "שמיים בהירים"
},
"Clear all history when server starts": {
"Clear all history when server starts": "נקה/י את כל ההיסטוריה כאשר השרת מופעל"
@@ -1418,7 +1418,7 @@
"Description": "תיאור"
},
"Desktop": {
"Desktop": ""
"Desktop": "שולחן העבודה"
},
"Desktop Clock": {
"Desktop Clock": "שעון לשולחן העבודה"
@@ -1592,7 +1592,7 @@
"Docs": "דוקיומנטציה"
},
"Documents": {
"Documents": ""
"Documents": "מסמכים"
},
"Domain (optional)": {
"Domain (optional)": "דומיין (לא חובה)"
@@ -1607,7 +1607,7 @@
"Door Open": "דלת פתוחה"
},
"Downloads": {
"Downloads": ""
"Downloads": "הורדות"
},
"Drag to Reorder": {
"Drag to Reorder": "גרור/גררי לסידור מחדש"
@@ -1622,7 +1622,7 @@
"Driver": "מנהל התקן"
},
"Drizzle": {
"Drizzle": ""
"Drizzle": "טפטוף"
},
"Duplicate": {
"Duplicate": "שכפל/י"
@@ -2087,7 +2087,13 @@
"Focused Window": "חלון ממוקד"
},
"Fog": {
"Fog": ""
"Fog": "ערפל"
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": "מעקב אחרי המסך הממוקד"
@@ -2153,7 +2159,7 @@
"Free VRAM/memory when the launcher is closed. May cause a slight delay when reopening.": "שחרר/י VRAM/זיכרון כאשר המשגר נסגר. עלול לגרום לעיכוב קל בפתיחה מחדש."
},
"Freezing Drizzle": {
"Freezing Drizzle": ""
"Freezing Drizzle": "טפטוף קפוא"
},
"Frequency": {
"Frequency": "תדירות"
@@ -2261,13 +2267,13 @@
"Health": "בריאות"
},
"Heavy Rain": {
"Heavy Rain": ""
"Heavy Rain": "גשם כבד"
},
"Heavy Snow": {
"Heavy Snow": ""
"Heavy Snow": "שלג כבד"
},
"Heavy Snow Showers": {
"Heavy Snow Showers": ""
"Heavy Snow Showers": "מקלחות שלג כבדות"
},
"Height": {
"Height": "גובה"
@@ -2369,7 +2375,7 @@
"Hold to confirm (%1s)": "החזק/י לחוץ כדי לאשר (%1 שניות)"
},
"Home": {
"Home": ""
"Home": "בית"
},
"Hot Corners": {
"Hot Corners": "פינות חמות"
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": "סמל"
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "גודל סמל"
},
@@ -2819,13 +2828,13 @@
"Light Mode": "מצב בהיר"
},
"Light Rain": {
"Light Rain": ""
"Light Rain": "גשם קל"
},
"Light Snow": {
"Light Snow": ""
"Light Snow": "שלג קל"
},
"Light Snow Showers": {
"Light Snow Showers": ""
"Light Snow Showers": "מקלחות שלג קלות"
},
"Linear": {
"Linear": "ליניארי"
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "זיהוי הגדלה של החלון"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "גודל רשומה מקסימלי"
},
@@ -3173,7 +3188,7 @@
"Moving to Paused": "עובר להשהיה"
},
"Music": {
"Music": ""
"Music": "מוסיקה"
},
"Mute popups for %1": {
"Mute popups for %1": "השתק/י חלונות קופצים עבור %1"
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "לא נמצאו קבצים"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": "אין אפליקציות מוסתרות."
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": "פתח/י בדפדפן"
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "פתח/י שורת חיפוש כדי למצוא טקסט"
},
@@ -3593,7 +3614,7 @@
"Outputs Include Missing": "קובץ includes של פלטי תצוגה חסר"
},
"Overcast": {
"Overcast": ""
"Overcast": "מעונן"
},
"Overflow": {
"Overflow": "גלישה"
@@ -3653,7 +3674,7 @@
"Pairing...": "מתאים..."
},
"Partly Cloudy": {
"Partly Cloudy": ""
"Partly Cloudy": "מעונן חלקית"
},
"Passkey:": {
"Passkey:": "מפתח גישה:"
@@ -3763,7 +3784,7 @@
"Unavailable": "לא זמין"
},
"Pictures": {
"Pictures": ""
"Pictures": "תמונות"
},
"Pin": {
"Pin": "הצמד/י"
@@ -3991,7 +4012,7 @@
"Protocol": "פרוטוקול"
},
"Quick Access": {
"Quick Access": ""
"Quick Access": "גישה מהירה"
},
"Quick access to application launcher": {
"Quick access to application launcher": "גישה מהירה למשגר האפליקציות"
@@ -4012,7 +4033,7 @@
"Radius": "רדיוס"
},
"Rain": {
"Rain": ""
"Rain": "גשם"
},
"Rain Chance": {
"Rain Chance": "סיכוי לגשם"
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "הסר/י"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "הסר/י רווחים ומסגרת כאשר חלונות ממוקסמים"
},
@@ -4081,7 +4105,7 @@
"Requires DMS %1": "DMS %1 נדרש"
},
"Requires DWL compositor": {
"Requires DWL compositor": "דורש קומפוזיטור DWL"
"Requires DWL compositor": "קומפוזיטור DWL נדרש"
},
"Requires night mode support": {
"Requires night mode support": "תמיכה במצב לילה נדרשת"
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "שמור/י פתק כקובץ"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": "שמור/שמרי והחלף/החליפי בין תצורות תצוגה"
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "שנה/י את גודל הגופנים של DankBar באופן עצמאי"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "שנה/י קנה מידה של כל גדלי הגופנים בכל המעטפת"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "מדע"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": "שיתוף מסך"
},
@@ -4510,7 +4543,7 @@
"Show Log Out": "הצג/י התנתקות"
},
"Show Material Design ripple animations on interactive elements": {
"Show Material Design ripple animations on interactive elements": "הצג/י אנימציות של אדוות Material Design על רכיבים אינטראקטיביים"
"Show Material Design ripple animations on interactive elements": "הצג/י אנימציות של אדוות בעיצוב Material על גבי רכיבים אינטראקטיביים"
},
"Show Memory": {
"Show Memory": "הצג/י זיכרון"
@@ -4714,7 +4747,7 @@
"Snap": "הצמד/י"
},
"Snow": {
"Snow": ""
"Snow": "שלג"
},
"Some plugins require a newer version of DMS:": {
"Some plugins require a newer version of DMS:": "תוספים מסוימים דורשים גרסה חדשה יותר של DMS:"
@@ -4813,7 +4846,7 @@
"Suspend system after": "העבר/י את המערכת למצב השהיה לאחר"
},
"Suspend then Hibernate": {
"Suspend then Hibernate": ""
"Suspend then Hibernate": "השהיה ואחריה שינה עמוקה"
},
"Swap": {
"Swap": "זיכרון החלפה (Swap)"
@@ -4930,7 +4963,7 @@
"Third-Party Plugin Warning": "אזהרת תוסף צד שלישי"
},
"Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\n\nThese plugins may pose security and privacy risks - install at your own risk.": {
"Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\n\nThese plugins may pose security and privacy risks - install at your own risk.": "תוספי צד שלישי נוצרו על ידי הקהילה ואינם נתמכים רשמית על ידי DankMaterialShell.\n\nתוספים אלה עלולים להוות סיכוני אבטחה ופרטיות - התקן/י על אחריותך."
"Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\n\nThese plugins may pose security and privacy risks - install at your own risk.": "תוספי צד שלישי נוצרו על ידי הקהילה ואינם נתמכים רשמית על ידי DankMaterialShell.\n\nתוספים אלה עלולים להוות סיכוני אבטחה ופרטיות - התקן/י על אחריותך בלבד."
},
"Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": {
"Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": "תוספי צד שלישי נוצרים על ידי הקהילה ואינם נתמכים רשמית על ידי DankMaterialShell.\\n\\nתוספים אלה עלולים להוות סיכון אבטחה ופרטיות התקן/י אותם על אחריותך בלבד."
@@ -4954,10 +4987,10 @@
"This will permanently remove this saved clipboard item. This action cannot be undone.": "זה יסיר לצמיתות את פריט לוח ההעתקה השמור הזה. לא ניתן לבטל פעולה זו."
},
"Thunderstorm": {
"Thunderstorm": ""
"Thunderstorm": "סערת ברקים"
},
"Thunderstorm with Hail": {
"Thunderstorm with Hail": ""
"Thunderstorm with Hail": "סערת ברקים עם ברד"
},
"Tiled": {
"Tiled": "באריחים"
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": "מפעיל: %1"
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": "נסה/י חיפוש אחר"
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "ללא כותרת"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": "עדכן/י"
},
@@ -5350,7 +5389,7 @@
"Vibrant palette with playful saturation.": "פלטת צבעים עשירה עם רוויה משחקית."
},
"Videos": {
"Videos": ""
"Videos": "סרטונים"
},
"View Mode": {
"View Mode": "מצב תצוגה"
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "התקן WiFi"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "WiFi מושבת"
},
@@ -5622,7 +5664,7 @@
"Thickness": "עובי"
},
"brandon": {
"brandon": ""
"brandon": "brandon"
},
"browse themes button | theme browser header | theme browser window title": {
"Browse Themes": "עיין/י בערכות נושא"
@@ -5668,7 +5710,7 @@
"Click to select a custom theme JSON file": "לחץ/י כדי לבחור קובץ JSON של ערכת נושא מותאמת אישית"
},
"dark mode wallpaper color picker title": {
"Choose Dark Mode Color": ""
"Choose Dark Mode Color": "בחר/י צבע למצב כהה"
},
"dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": {
"Select Wallpaper": "בחר/י רקע"
@@ -5683,13 +5725,13 @@
"Month Date": "חודש תאריך",
"Numeric (D/M)": "מספרי (D/M)",
"Numeric (M/D)": "מספרי (M/D)",
"System Default": "ברירת מחדל מערכת"
"System Default": "ברירת מחדל של המערכת"
},
"days": {
"days": "ימים"
},
"default monitor label suffix": {
"(Default)": ""
"(Default)": "(ברירת מחדל)"
},
"dgop not available": {
"dgop not available": "dgop אינו זמין"
@@ -5765,6 +5807,9 @@
"events": {
"events": "אירועים"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": "GPU לא ידוע"
},
@@ -5957,7 +6002,7 @@
"leave empty for default": "השאר/י ריק לברירת מחדל"
},
"light mode wallpaper color picker title": {
"Choose Light Mode Color": ""
"Choose Light Mode Color": "בחר/י צבע למצב בהיר"
},
"loading indicator": {
"Loading...": "טוען..."
@@ -6019,7 +6064,7 @@
"nav": "ניווט"
},
"neovim template description": {
"Requires lazy plugin manager": ""
"Requires lazy plugin manager": "מנהל התוספים 'lazy' נדרש"
},
"network status": {
"Connected": "מחובר",
@@ -6035,7 +6080,7 @@
"No custom theme file": "אין קובץ ערכת נושא מותאמת אישית"
},
"no monitors available label": {
"No monitors": ""
"No monitors": "אין מסכים"
},
"no registry themes installed hint": {
"No themes installed. Browse themes to install from the registry.": "אין ערכות נושא מותקנות. עיין/י בערכות נושא להתקנה מהמאגר."
@@ -6118,22 +6163,22 @@
"official": "רשמי"
},
"on Hyprland": {
"on Hyprland": ""
"on Hyprland": "על Hyprland"
},
"on MangoWC": {
"on MangoWC": ""
"on MangoWC": "על MangoWC"
},
"on Miracle WM": {
"on Miracle WM": ""
"on Miracle WM": "על Miracle WM"
},
"on Niri": {
"on Niri": ""
"on Niri": "על Niri"
},
"on Scroll": {
"on Scroll": ""
"on Scroll": "על Scroll"
},
"on Sway": {
"on Sway": ""
"on Sway": "על Sway"
},
"open": {
"open": "פתח/י"
@@ -6183,10 +6228,10 @@
"Select Profile Image": "בחר/י תמונת פרופיל"
},
"qt theme env error body": {
"You need to set either:\nQT_QPA_PLATFORMTHEME=gtk3 OR\nQT_QPA_PLATFORMTHEME=qt6ct\nas environment variables, and then restart the shell.\n\nqt6ct requires qt6ct-kde to be installed.": ""
"You need to set either:\nQT_QPA_PLATFORMTHEME=gtk3 OR\nQT_QPA_PLATFORMTHEME=qt6ct\nas environment variables, and then restart the shell.\n\nqt6ct requires qt6ct-kde to be installed.": "עליך להגדיר את אחד מהמשתנים הבאים:\nQT_QPA_PLATFORMTHEME=gtk3 או\nQT_QPA_PLATFORMTHEME=qt6ct\nכמשתני סביבה ולאחר מכן להפעיל מחדש את DMS.\n\n* qt6ct דורש התקנה של qt6ct-kde."
},
"qt theme env error title": {
"Missing Environment Variables": ""
"Missing Environment Variables": "משתני סביבה חסרים"
},
"read-only settings warning for NixOS home-manager users": {
"Settings are read-only. Changes will not persist.": "ההגדרות הן לקריאה בלבד. שינויים לא יישמרו."
@@ -6246,10 +6291,10 @@
"Load Average": "עומס ממוצע"
},
"theme auto mode tab": {
"Location": ""
"Location": "מיקום"
},
"theme auto mode tab | wallpaper cycling mode tab": {
"Time": ""
"Time": "זמן"
},
"theme browser description": {
"Install color themes from the DMS theme registry": "התקן/י ערכות צבעים ממאגר ערכות הנושא של DMS"
@@ -6292,7 +6337,7 @@
"Unknown": "לא ידוע"
},
"up": {
"up": ""
"up": "פועל"
},
"update dms for NM integration.": {
"update dms for NM integration.": "עדכן/י את DMS כדי לאפשר אינטגרציה עם NM."
@@ -6307,10 +6352,10 @@
"Requires %1": "גרסה %1 נדרשת"
},
"wallpaper color picker title": {
"Choose Wallpaper Color": ""
"Choose Wallpaper Color": "בחר/י צבע לרקע"
},
"wallpaper cycling mode tab": {
"Interval": ""
"Interval": "מרווח זמן"
},
"wallpaper directory file browser title": {
"Select Wallpaper Directory": "בחר/י תיקיית רקעים"
@@ -6331,32 +6376,32 @@
"Tile V": "אריח אנכי"
},
"wallpaper interval": {
"1 hour": "",
"1 hour 30 minutes": "",
"1 minute": "",
"10 seconds": "",
"12 hours": "",
"15 minutes": "",
"15 seconds": "",
"2 hours": "",
"20 seconds": "",
"25 seconds": "",
"3 hours": "",
"30 minutes": "",
"30 seconds": "",
"35 seconds": "",
"4 hours": "",
"40 seconds": "",
"45 seconds": "",
"5 minutes": "",
"5 seconds": "",
"50 seconds": "",
"55 seconds": "",
"6 hours": "",
"8 hours": ""
"1 hour": "שעה אחת",
"1 hour 30 minutes": "שעה וחצי (ו30 דקות)",
"1 minute": "דקה אחת",
"10 seconds": "10 שניות",
"12 hours": "12 שעות",
"15 minutes": "15 דקות",
"15 seconds": "15 שניות",
"2 hours": "2 שעות",
"20 seconds": "20 שניות",
"25 seconds": "25 שניות",
"3 hours": "3 שעות",
"30 minutes": "30 דקות",
"30 seconds": "30 שניות",
"35 seconds": "35 שניות",
"4 hours": "4 שעות",
"40 seconds": "40 שניות",
"45 seconds": "45 שניות",
"5 minutes": "5 דקות",
"5 seconds": "5 שניות",
"50 seconds": "50 שניות",
"55 seconds": "55 שניות",
"6 hours": "6 שעות",
"8 hours": "8 שעות"
},
"wallpaper not set label": {
"Not set": ""
"Not set": "לא מוגדר"
},
"wallpaper processing error": {
"Wallpaper processing failed": "עיבוד תמונת הרקע נכשל"
@@ -6434,6 +6479,6 @@
"• yyyy - Year (2024)": "• yyyy - שנה (2024)"
},
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": {
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": ""
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": "↑/↓: ניווט • Space: הרחב • Enter: פעולה/הרחבה • E: טקסט"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -2089,6 +2089,12 @@
"Fog": {
"Fog": "Nebbia"
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": "Segui lo Schermo Attivo"
},
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": "Icona"
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "Dimensione Icona"
},
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "Rilevamento Finestra Massimizzata"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "Dimensione Massima della Voce"
},
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "Nessun file trovato"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": "Nessuna app nascosta."
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": "Apri nel Browser"
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "Apri barra di ricerca per cercare testo"
},
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "Rimuovi"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "Rimuovi spazi e bordo quando le finestre sono massimizzate"
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "Salva File Blocco Note"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": "Salva e passa tra le configurazioni dello schermo"
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "Scala le dimensioni dei font della DankBar in modo indipendente"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "Ridimensiona tutte le dimensioni dei caratteri nell'intera shell"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "Scienza"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": "Condivisione dello Schermo"
},
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": "Attivatore: %1"
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": "Prova una ricerca diversa"
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "Senza Titolo"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": "Aggiorna"
},
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "Dispositivo WiFi"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "WiFi disattivato"
},
@@ -5765,6 +5807,9 @@
"events": {
"events": "eventi"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": "GPU Sconosciuta"
},

View File

@@ -2089,6 +2089,12 @@
"Fog": {
"Fog": ""
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": ""
},
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": ""
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "アイコンサイズ"
},
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": ""
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": ""
},
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "ファイルが見つかりませんでした"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": ""
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": ""
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "検索バーを開いてテキストを検索"
},
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "削除"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": ""
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "メモ帳ファイルを保存"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": ""
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "Dank Barのフォントサイズを個別に調整"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": ""
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "科学"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": ""
},
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": ""
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": ""
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "無題"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": ""
},
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": ""
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "WiFiを無効化にしました"
},
@@ -5765,6 +5807,9 @@
"events": {
"events": "イベント"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": ""
},

View File

@@ -105,10 +105,10 @@
"2 minutes": "2 minuten"
},
"2 seconds": {
"2 seconds": ""
"2 seconds": "2 seconden"
},
"20 minutes": {
"20 minutes": ""
"20 minutes": "20 minuten"
},
"24-Hour Format": {
"24-Hour Format": "24-uursnotatie"
@@ -117,7 +117,7 @@
"24-hour format": "24-uursnotatie"
},
"250 ms": {
"250 ms": ""
"250 ms": "250 ms"
},
"270°": {
"270°": "270°"
@@ -126,7 +126,7 @@
"3 days": "3 dagen"
},
"3 minutes": {
"3 minutes": ""
"3 minutes": "3 minuten"
},
"3 seconds": {
"3 seconds": "3 seconden"
@@ -141,7 +141,7 @@
"3rd party": "Derden"
},
"4 seconds": {
"4 seconds": ""
"4 seconds": "4 seconden"
},
"5 minutes": {
"5 minutes": "5 minuten"
@@ -150,13 +150,13 @@
"5 seconds": "5 seconden"
},
"500 ms": {
"500 ms": ""
"500 ms": "500 ms"
},
"7 days": {
"7 days": "7 dagen"
},
"750 ms": {
"750 ms": ""
"750 ms": "750 ms"
},
"8 seconds": {
"8 seconds": "8 seconden"
@@ -171,7 +171,7 @@
"A file with this name already exists. Do you want to overwrite it?": "Er bestaat al een bestand met deze naam. Wilt u het overschrijven?"
},
"AC Power": {
"AC Power": ""
"AC Power": "Netstroom"
},
"API": {
"API": "API"
@@ -381,7 +381,7 @@
"Apps with custom display name, icon, or launch options. Right-click an app and select 'Edit App' to customize.": "Apps met aangepaste weergavenaam, pictogram of startopties. Klik rechts op een app en selecteer 'App bewerken' om aan te passen."
},
"Apps with notification popups muted. Unmute or delete to remove.": {
"Apps with notification popups muted. Unmute or delete to remove.": ""
"Apps with notification popups muted. Unmute or delete to remove.": "Apps met gedempte meldingspop-ups. Dempen opheffen of verwijderen om te wissen."
},
"Arrange displays and configure resolution, refresh rate, and VRR": {
"Arrange displays and configure resolution, refresh rate, and VRR": "Beeldschermen rangschikken en resolutie, verversingssnelheid en VRR configureren"
@@ -587,7 +587,7 @@
"Bar Transparency": "Balktransparantie"
},
"Base duration for animations (drag to use Custom)": {
"Base duration for animations (drag to use Custom)": ""
"Base duration for animations (drag to use Custom)": "Basisduur voor animaties (sleep om Aangepast te gebruiken)"
},
"Battery": {
"Battery": "Batterij"
@@ -770,7 +770,7 @@
"Caps Lock Indicator": "Caps Lock-indicator"
},
"Caps Lock is on": {
"Caps Lock is on": ""
"Caps Lock is on": "Caps Lock staat aan"
},
"Center Section": {
"Center Section": "Middensectie"
@@ -863,7 +863,7 @@
"Clear History?": "Geschiedenis wissen?"
},
"Clear Sky": {
"Clear Sky": ""
"Clear Sky": "Heldere hemel"
},
"Clear all history when server starts": {
"Clear all history when server starts": "Alle geschiedenis wissen wanneer server start"
@@ -1112,7 +1112,7 @@
"Control Center Tile Color": "Tegelkleur bedieningspaneel"
},
"Control animation duration for notification popups and history": {
"Control animation duration for notification popups and history": ""
"Control animation duration for notification popups and history": "Animatieduur voor meldingspop-ups en geschiedenis beheren"
},
"Control currently playing media": {
"Control currently playing media": "Huidige media bedienen"
@@ -1205,7 +1205,7 @@
"Create rules to mute, ignore, hide from history, or override notification priority.": "Maak regels om meldingen te dempen, te negeren, uit de geschiedenis te verbergen of de prioriteit te overschrijven."
},
"Create rules to mute, ignore, hide from history, or override notification priority. Default only overrides priority; notifications still show normally.": {
"Create rules to mute, ignore, hide from history, or override notification priority. Default only overrides priority; notifications still show normally.": ""
"Create rules to mute, ignore, hide from history, or override notification priority. Default only overrides priority; notifications still show normally.": "Regels maken om meldingen te dempen, negeren, verbergen in geschiedenis of prioriteit te overschrijven. Standaard wordt alleen de prioriteit overschreven; meldingen worden nog steeds normaal weergegeven."
},
"Creating...": {
"Creating...": "Aanmaken..."
@@ -1418,7 +1418,7 @@
"Description": "Beschrijving"
},
"Desktop": {
"Desktop": ""
"Desktop": "Bureaublad"
},
"Desktop Clock": {
"Desktop Clock": "Bureaubladklok"
@@ -1592,7 +1592,7 @@
"Docs": "Documentatie"
},
"Documents": {
"Documents": ""
"Documents": "Documenten"
},
"Domain (optional)": {
"Domain (optional)": "Domein (optioneel)"
@@ -1607,7 +1607,7 @@
"Door Open": "Deur open"
},
"Downloads": {
"Downloads": ""
"Downloads": "Downloads"
},
"Drag to Reorder": {
"Drag to Reorder": "Sleep om te rangschikken"
@@ -1622,7 +1622,7 @@
"Driver": "Stuurprogramma"
},
"Drizzle": {
"Drizzle": ""
"Drizzle": "Motregen"
},
"Duplicate": {
"Duplicate": "Dupliceren"
@@ -1631,7 +1631,7 @@
"Duplicate Wallpaper with Blur": "Achtergrond dupliceren met vervaging"
},
"Duration": {
"Duration": ""
"Duration": "Duur"
},
"Dusk (Astronomical Twilight)": {
"Dusk (Astronomical Twilight)": "Avondschemering (Astronomische schemering)"
@@ -2087,7 +2087,13 @@
"Focused Window": "Actieve venster"
},
"Fog": {
"Fog": ""
"Fog": "Mist"
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": "Monitorfocus volgen"
@@ -2150,10 +2156,10 @@
"Format Legend": "Legenda voor notatie"
},
"Free VRAM/memory when the launcher is closed. May cause a slight delay when reopening.": {
"Free VRAM/memory when the launcher is closed. May cause a slight delay when reopening.": ""
"Free VRAM/memory when the launcher is closed. May cause a slight delay when reopening.": "VRAM/geheugen vrijmaken wanneer het startmenu gesloten is. Dit kan een lichte vertraging veroorzaken bij het heropenen."
},
"Freezing Drizzle": {
"Freezing Drizzle": ""
"Freezing Drizzle": "IJzel"
},
"Frequency": {
"Frequency": "Frequentie"
@@ -2261,13 +2267,13 @@
"Health": "Gezondheid"
},
"Heavy Rain": {
"Heavy Rain": ""
"Heavy Rain": "Zware regen"
},
"Heavy Snow": {
"Heavy Snow": ""
"Heavy Snow": "Zware sneeuwval"
},
"Heavy Snow Showers": {
"Heavy Snow Showers": ""
"Heavy Snow Showers": "Zware sneeuwbuien"
},
"Height": {
"Height": "Hoogte"
@@ -2288,7 +2294,7 @@
"Hidden": "Verborgen"
},
"Hidden (%1)": {
"Hidden (%1)": ""
"Hidden (%1)": "Verborgen (%1)"
},
"Hidden Apps": {
"Hidden Apps": "Verborgen apps"
@@ -2330,13 +2336,13 @@
"Hide cursor when using touch input": "Cursor verbergen bij gebruik van aanraakinvoer"
},
"Hide device": {
"Hide device": ""
"Hide device": "Apparaat verbergen"
},
"Hide notification content until expanded": {
"Hide notification content until expanded": ""
"Hide notification content until expanded": "Meldingsinhoud verbergen tot uitgevouwen"
},
"Hide notification content until expanded; popups show collapsed by default": {
"Hide notification content until expanded; popups show collapsed by default": ""
"Hide notification content until expanded; popups show collapsed by default": "Meldingsinhoud verbergen tot uitgevouwen; pop-ups worden standaard ingeklapt weergegeven"
},
"Hide on Touch": {
"Hide on Touch": "Verbergen bij aanraking"
@@ -2369,7 +2375,7 @@
"Hold to confirm (%1s)": "Ingedrukt houden om te bevestigen (%1s)"
},
"Home": {
"Home": ""
"Home": "Persoonlijke map"
},
"Hot Corners": {
"Hot Corners": "Hot Corners"
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": "Pictogram"
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "Pictogramgrootte"
},
@@ -2819,13 +2828,13 @@
"Light Mode": "Lichte modus"
},
"Light Rain": {
"Light Rain": ""
"Light Rain": "Lichte regen"
},
"Light Snow": {
"Light Snow": ""
"Light Snow": "Lichte sneeuwval"
},
"Light Snow Showers": {
"Light Snow Showers": ""
"Light Snow Showers": "Lichte sneeuwbuien"
},
"Linear": {
"Linear": "Lineair"
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "Maximalisatiedetectie"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "Maximale grootte item"
},
@@ -3173,13 +3188,13 @@
"Moving to Paused": "Overschakelen naar gepauzeerd"
},
"Music": {
"Music": ""
"Music": "Muziek"
},
"Mute popups for %1": {
"Mute popups for %1": ""
"Mute popups for %1": "Pop-ups dempen voor %1"
},
"Muted Apps": {
"Muted Apps": ""
"Muted Apps": "Gedempte apps"
},
"Muted palette with subdued, calming tones.": {
"Muted palette with subdued, calming tones.": "Gedempt palet met ingetogen, rustgevende tinten."
@@ -3332,7 +3347,7 @@
"No apps have been launched yet.": "Er zijn nog geen apps gestart."
},
"No apps muted. Right-click a notification and choose \"Mute popups\" to add one here.": {
"No apps muted. Right-click a notification and choose \"Mute popups\" to add one here.": ""
"No apps muted. Right-click a notification and choose \"Mute popups\" to add one here.": "Geen apps gedempt. Klik met de rechtermuisknop op een melding en kies \"Pop-ups dempen\" om er hier een toe te voegen."
},
"No battery": {
"No battery": "Geen batterij"
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "Geen bestanden gevonden"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": "Geen verborgen apps."
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": "Openen in browser"
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "Zoekbalk openen om tekst te vinden"
},
@@ -3593,7 +3614,7 @@
"Outputs Include Missing": "Outputs-include ontbreekt"
},
"Overcast": {
"Overcast": ""
"Overcast": "Bewolkt"
},
"Overflow": {
"Overflow": "Overloop"
@@ -3653,7 +3674,7 @@
"Pairing...": "Koppelen..."
},
"Partly Cloudy": {
"Partly Cloudy": ""
"Partly Cloudy": "Half bewolkt"
},
"Passkey:": {
"Passkey:": "Toegangscode:"
@@ -3763,7 +3784,7 @@
"Unavailable": "Niet beschikbaar"
},
"Pictures": {
"Pictures": ""
"Pictures": "Afbeeldingen"
},
"Pin": {
"Pin": "Vastmaken"
@@ -3835,7 +3856,7 @@
"Popup Position": "Popup-positie"
},
"Popup Shadow": {
"Popup Shadow": ""
"Popup Shadow": "Pop-upschaduw"
},
"Popup Transparency": {
"Popup Transparency": "Popup-transparantie"
@@ -3946,7 +3967,7 @@
"Privacy Indicator": "Privacy-indicator"
},
"Privacy Mode": {
"Privacy Mode": ""
"Privacy Mode": "Privacy-modus"
},
"Private Key Password": {
"Private Key Password": "Wachtwoord privésleutel"
@@ -3991,7 +4012,7 @@
"Protocol": "Protocol"
},
"Quick Access": {
"Quick Access": ""
"Quick Access": "Snelle toegang"
},
"Quick access to application launcher": {
"Quick access to application launcher": "Snelle toegang tot app-starter"
@@ -4012,7 +4033,7 @@
"Radius": "Straal"
},
"Rain": {
"Rain": ""
"Rain": "Regen"
},
"Rain Chance": {
"Rain Chance": "Neerslagkans"
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "Verwijderen"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "Tussenruimte en rand verwijderen wanneer vensters gemaximaliseerd zijn"
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "Kladblok-bestand opslaan"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": "Opslaan en schakelen tussen beeldschermconfiguraties"
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "DankBar-lettergroottes onafhankelijk schalen"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "Alle lettergroottes in de shell schalen"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "Wetenschap"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": "Schermdelen"
},
@@ -4411,7 +4444,7 @@
"Set key and action to save": "Stel toets en actie in om op te slaan"
},
"Set notification rules": {
"Set notification rules": ""
"Set notification rules": "Meldingsregels instellen"
},
"Setup": {
"Setup": "Instellen"
@@ -4585,13 +4618,13 @@
"Show darkened overlay behind modal dialogs": "Verduisterde overlay tonen achter modale vensters"
},
"Show device": {
"Show device": ""
"Show device": "Apparaat tonen"
},
"Show dock when floating windows don't overlap its area": {
"Show dock when floating windows don't overlap its area": "Dock tonen wanneer zwevende vensters het gebied niet overlappen"
},
"Show drop shadow on notification popups": {
"Show drop shadow on notification popups": ""
"Show drop shadow on notification popups": "Slagschaduw tonen op meldingspop-ups"
},
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": {
"Show launcher overlay when typing in Niri overview. Disable to use another launcher.": "Starter-overlay tonen bij typen in Niri-overzicht. Schakel uit om een andere starter te gebruiken."
@@ -4714,7 +4747,7 @@
"Snap": "Vastklikken"
},
"Snow": {
"Snow": ""
"Snow": "Sneeuw"
},
"Some plugins require a newer version of DMS:": {
"Some plugins require a newer version of DMS:": "Sommige plug-ins vereisen een nieuwere versie van DMS:"
@@ -4813,7 +4846,7 @@
"Suspend system after": "Systeem in slaapstand zetten na"
},
"Suspend then Hibernate": {
"Suspend then Hibernate": ""
"Suspend then Hibernate": "Onderbreken dan Sluimerstand"
},
"Swap": {
"Swap": "Swap"
@@ -4954,10 +4987,10 @@
"This will permanently remove this saved clipboard item. This action cannot be undone.": "Dit verwijdert dit opgeslagen klemborditem permanent. Deze actie kan niet ongedaan worden gemaakt."
},
"Thunderstorm": {
"Thunderstorm": ""
"Thunderstorm": "Onweer"
},
"Thunderstorm with Hail": {
"Thunderstorm with Hail": ""
"Thunderstorm with Hail": "Onweer met hagel"
},
"Tiled": {
"Tiled": "Getegeld"
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": "Trigger: %1"
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": "Probeer een andere zoekopdracht"
},
@@ -5143,13 +5179,13 @@
"Unknown Title": "Onbekende titel"
},
"Unload on Close": {
"Unload on Close": ""
"Unload on Close": "Ontladen bij sluiten"
},
"Unmute": {
"Unmute": ""
"Unmute": "Dempen opheffen"
},
"Unmute popups for %1": {
"Unmute popups for %1": ""
"Unmute popups for %1": "Dempen van pop-ups opheffen voor %1"
},
"Unnamed Rule": {
"Unnamed Rule": "Naamloze regel"
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "Naamloos"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": "Bijwerken"
},
@@ -5350,7 +5389,7 @@
"Vibrant palette with playful saturation.": "Levendig palet met speelse verzadiging."
},
"Videos": {
"Videos": ""
"Videos": "Video's"
},
"View Mode": {
"View Mode": "Weergavemodus"
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "Wifi-apparaat"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "Wifi uitgeschakeld"
},
@@ -5622,7 +5664,7 @@
"Thickness": "Dikte"
},
"brandon": {
"brandon": ""
"brandon": "brandon"
},
"browse themes button | theme browser header | theme browser window title": {
"Browse Themes": "Thema's doorbladeren"
@@ -5653,7 +5695,7 @@
"Active tile background and icon color": "Achtergrond- en pictogramkleur van actieve tegel"
},
"count of hidden audio devices": {
"Hidden (%1)": ""
"Hidden (%1)": "Verborgen (%1)"
},
"current theme label": {
"Current Theme: %1": "Huidig thema: %1"
@@ -5668,7 +5710,7 @@
"Click to select a custom theme JSON file": "Klik om een aangepast thema-JSON-bestand te selecteren"
},
"dark mode wallpaper color picker title": {
"Choose Dark Mode Color": ""
"Choose Dark Mode Color": "Kleur donkere modus kiezen"
},
"dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": {
"Select Wallpaper": "Selecteer achtergrond"
@@ -5689,7 +5731,7 @@
"days": "dagen"
},
"default monitor label suffix": {
"(Default)": ""
"(Default)": "(Standaard)"
},
"dgop not available": {
"dgop not available": "dgop niet beschikbaar"
@@ -5765,6 +5807,9 @@
"events": {
"events": "afspraken"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": "Onbekende GPU"
},
@@ -5957,7 +6002,7 @@
"leave empty for default": "laat leeg voor standaard"
},
"light mode wallpaper color picker title": {
"Choose Light Mode Color": ""
"Choose Light Mode Color": "Kleur lichte modus kiezen"
},
"loading indicator": {
"Loading...": "Laden..."
@@ -6019,7 +6064,7 @@
"nav": "navigatie"
},
"neovim template description": {
"Requires lazy plugin manager": ""
"Requires lazy plugin manager": "Vereist lazy plugin manager"
},
"network status": {
"Connected": "Verbonden",
@@ -6035,7 +6080,7 @@
"No custom theme file": "Geen aangepast themabestand"
},
"no monitors available label": {
"No monitors": ""
"No monitors": "Geen beeldschermen"
},
"no registry themes installed hint": {
"No themes installed. Browse themes to install from the registry.": "Geen thema's geïnstalleerd. Blader door thema's om te installeren uit het register."
@@ -6085,7 +6130,7 @@
"Enable History": "Geschiedenis inschakelen"
},
"notification privacy mode placeholder": {
"Message Content": ""
"Message Content": "Berichtinhoud"
},
"notification rule action option": {
"Ignore Completely": "Volledig negeren",
@@ -6118,22 +6163,22 @@
"official": "officieel"
},
"on Hyprland": {
"on Hyprland": ""
"on Hyprland": "op Hyprland"
},
"on MangoWC": {
"on MangoWC": ""
"on MangoWC": "op MangoWC"
},
"on Miracle WM": {
"on Miracle WM": ""
"on Miracle WM": "op Miracle WM"
},
"on Niri": {
"on Niri": ""
"on Niri": "op Niri"
},
"on Scroll": {
"on Scroll": ""
"on Scroll": "op Scroll"
},
"on Sway": {
"on Sway": ""
"on Sway": "op Sway"
},
"open": {
"open": "openen"
@@ -6183,10 +6228,10 @@
"Select Profile Image": "Selecteer profielafbeelding"
},
"qt theme env error body": {
"You need to set either:\nQT_QPA_PLATFORMTHEME=gtk3 OR\nQT_QPA_PLATFORMTHEME=qt6ct\nas environment variables, and then restart the shell.\n\nqt6ct requires qt6ct-kde to be installed.": ""
"You need to set either:\nQT_QPA_PLATFORMTHEME=gtk3 OR\nQT_QPA_PLATFORMTHEME=qt6ct\nas environment variables, and then restart the shell.\n\nqt6ct requires qt6ct-kde to be installed.": "U moet het volgende instellen:\nQT_QPA_PLATFORMTHEME=gtk3 OF\nQT_QPA_PLATFORMTHEME=qt6ct\nals omgevingsvariabelen, en daarna de shell herstarten.\n\nqt6ct vereist dat qt6ct-kde is geïnstalleerd."
},
"qt theme env error title": {
"Missing Environment Variables": ""
"Missing Environment Variables": "Ontbrekende omgevingsvariabelen"
},
"read-only settings warning for NixOS home-manager users": {
"Settings are read-only. Changes will not persist.": "Instellingen zijn alleen-lezen. Wijzigingen worden niet opgeslagen."
@@ -6246,10 +6291,10 @@
"Load Average": "Gemiddelde belasting"
},
"theme auto mode tab": {
"Location": ""
"Location": "Locatie"
},
"theme auto mode tab | wallpaper cycling mode tab": {
"Time": ""
"Time": "Tijd"
},
"theme browser description": {
"Install color themes from the DMS theme registry": "Installeer kleurthema's uit het DMS-themaregister"
@@ -6270,7 +6315,7 @@
"Search themes...": "Thema's zoeken..."
},
"this app": {
"this app": ""
"this app": "deze app"
},
"tile color option": {
"Primary Container": "Primaire container",
@@ -6292,7 +6337,7 @@
"Unknown": "Onbekend"
},
"up": {
"up": ""
"up": "actief"
},
"update dms for NM integration.": {
"update dms for NM integration.": "update dms voor NM-integratie."
@@ -6307,10 +6352,10 @@
"Requires %1": "Vereist %1"
},
"wallpaper color picker title": {
"Choose Wallpaper Color": ""
"Choose Wallpaper Color": "Achtergrondkleur kiezen"
},
"wallpaper cycling mode tab": {
"Interval": ""
"Interval": "Interval"
},
"wallpaper directory file browser title": {
"Select Wallpaper Directory": "Selecteer achtergrondmap"
@@ -6331,32 +6376,32 @@
"Tile V": "Tegelen V"
},
"wallpaper interval": {
"1 hour": "",
"1 hour 30 minutes": "",
"1 minute": "",
"10 seconds": "",
"12 hours": "",
"15 minutes": "",
"15 seconds": "",
"2 hours": "",
"20 seconds": "",
"25 seconds": "",
"3 hours": "",
"30 minutes": "",
"30 seconds": "",
"35 seconds": "",
"4 hours": "",
"40 seconds": "",
"45 seconds": "",
"5 minutes": "",
"5 seconds": "",
"50 seconds": "",
"55 seconds": "",
"6 hours": "",
"8 hours": ""
"1 hour": "1 uur",
"1 hour 30 minutes": "1 uur 30 minuten",
"1 minute": "1 minuut",
"10 seconds": "10 seconden",
"12 hours": "12 uur",
"15 minutes": "15 minuten",
"15 seconds": "15 seconden",
"2 hours": "2 uur",
"20 seconds": "20 seconden",
"25 seconds": "25 seconden",
"3 hours": "3 uur",
"30 minutes": "30 minuten",
"30 seconds": "30 seconden",
"35 seconds": "35 seconden",
"4 hours": "4 uur",
"40 seconds": "40 seconden",
"45 seconds": "45 seconden",
"5 minutes": "5 minuten",
"5 seconds": "5 seconden",
"50 seconds": "50 seconden",
"55 seconds": "55 seconden",
"6 hours": "6 uur",
"8 hours": "8 uur"
},
"wallpaper not set label": {
"Not set": ""
"Not set": "Niet ingesteld"
},
"wallpaper processing error": {
"Wallpaper processing failed": "Verwerken achtergrond mislukt"
@@ -6434,6 +6479,6 @@
"• yyyy - Year (2024)": "• yyyy - Jaar (2024)"
},
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": {
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": ""
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": "↑/↓: Nav • Spatie: Uitvouwen • Enter: Actie/Uitvouwen • E: Tekst"
}
}

View File

@@ -2089,6 +2089,12 @@
"Fog": {
"Fog": ""
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": ""
},
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": ""
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "Rozmiar ikony"
},
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "Wykrywanie maksymalizacji"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "Maksymalny rozmiar wpisu"
},
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "Nie znaleziono plików"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": ""
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": ""
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "Otwórz pasek wyszukiwania, aby znaleźć tekst"
},
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "Usuń"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "Usuń odstępy i ramkę gdy okna są zmaksymalizowane"
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "Zapisz plik notatnika"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": ""
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "Skaluj rozmiary czcionek DankBar niezależnie"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "Skaluj wszystkie rozmiary czcionek w całej powłoce"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "Nauka"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": ""
},
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": ""
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": ""
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "Bez tytułu"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": ""
},
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "Urządzenie WiFi"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "WiFi wyłączone"
},
@@ -5765,6 +5807,9 @@
"events": {
"events": "wydarzenia"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": ""
},

View File

@@ -770,7 +770,7 @@
"Caps Lock Indicator": "Indicador de Caps Lock"
},
"Caps Lock is on": {
"Caps Lock is on": ""
"Caps Lock is on": "Caps Lock está ligado"
},
"Center Section": {
"Center Section": "Seção Central"
@@ -2089,6 +2089,12 @@
"Fog": {
"Fog": "Neblina"
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": "Seguir Foco do Monitor"
},
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": "Ícone"
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "Tamanho do Ícone"
},
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "Detecção de Maximizado"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "Tamanho Máximo de Entrada"
},
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "Nenhum arquivo encontrado"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": "Sem aplicativos ocultos."
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": "Abrir no Navegador"
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "Abrir barra de pesquisa e encontrar texto"
},
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "Remover"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "Remover espaçámentos e borda quando janelas estão maximizadas"
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "Salvar Arquivo do Bloco de Notas"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": "Salvar e alternar entre configurações de exibição"
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "Ajustar tamanho da fonte da DankBar de forma independente"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "Ajuste todos os tamanhos de fonte em todo o shell"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "Ciência"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": "Compartilhamento de Tela"
},
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": "Gatilho: %1"
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": "Tente uma pesquisa diferente"
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "Sem título"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": "Atualizar"
},
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "Dispositivo WiFi"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "WiFi desativado"
},
@@ -5765,6 +5807,9 @@
"events": {
"events": "eventos"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": "GPU Desconhecida"
},
@@ -6434,6 +6479,6 @@
"• yyyy - Year (2024)": "yyyy - Ano (2024)"
},
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": {
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": ""
"↑/↓: Nav • Space: Expand • Enter: Action/Expand • E: Text": "↑/↓: Navegar • Espaço: Expandir • Enter: Ação/Expandir • E: Texto"
}
}

View File

@@ -2089,6 +2089,12 @@
"Fog": {
"Fog": ""
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": ""
},
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": ""
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "Simge Boyutu"
},
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "Algılamayı En Üst Düzeye Çıkar"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "Maksimum Kayıt Boyutu"
},
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "Dosya bulunamadı"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": ""
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": ""
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "Metin bulmak için arama çubuğunu aç"
},
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "Kaldır"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "Pencereler ekranı kapladığında boşlukları ve kenarlıkları kaldır"
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "Not Defteri Dosyasını Kaydet"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": ""
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "DankBar yazı tipi boyutlarını bağımsız olarak ölçeklendir"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "Kabuk genelinde tüm yazı tipi boyutlarını ölçeklendir"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "Bilim"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": ""
},
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": ""
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": ""
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "Başlıksız"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": ""
},
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "WiFi Aygıtı"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "WiFi devre dışı"
},
@@ -5765,6 +5807,9 @@
"events": {
"events": "etkinlikler"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": ""
},

View File

@@ -24,10 +24,10 @@
"%1 days ago": "%1天之前"
},
"%1 disconnected": {
"%1 disconnected": ""
"%1 disconnected": "%1已断开连接"
},
"%1 disconnected (hidden)": {
"%1 disconnected (hidden)": ""
"%1 disconnected (hidden)": "%1已断开连接隐藏"
},
"%1 display(s)": {
"%1 display(s)": "%1 显示"
@@ -36,7 +36,7 @@
"%1 exists but is not included in config. Custom keybinds will not work until this is fixed.": "%1存在但并未被包含至配置文件。在此问题修复前自定义快捷键绑定将不会生效。"
},
"%1 exists but is not included. Window rules won't apply.": {
"%1 exists but is not included. Window rules won't apply.": ""
"%1 exists but is not included. Window rules won't apply.": "%1已存在但未被包含。窗口规则将不会生效。"
},
"%1 is now included in config": {
"%1 is now included in config": "%1现在已被包含至配置文件"
@@ -246,7 +246,7 @@
"Add Printer": "添加打印机"
},
"Add Title": {
"Add Title": ""
"Add Title": "添加标题"
},
"Add Widget": {
"Add Widget": "添加部件"
@@ -339,7 +339,7 @@
"App ID Substitutions": "应用ID替换"
},
"App ID regex (e.g. ^firefox$)": {
"App ID regex (e.g. ^firefox$)": ""
"App ID regex (e.g. ^firefox$)": "应用ID正则比如^firefox$"
},
"App Launcher": {
"App Launcher": "启动器"
@@ -617,10 +617,10 @@
"Bit Depth": "位深"
},
"Block Out": {
"Block Out": ""
"Block Out": "封锁"
},
"Block Out From": {
"Block Out From": ""
"Block Out From": "从此处封锁"
},
"Block notifications": {
"Block notifications": "屏蔽通知"
@@ -665,7 +665,7 @@
"Border Thickness": "边框厚度"
},
"Border with BG": {
"Border with BG": ""
"Border with BG": "带BG的边框"
},
"Bottom": {
"Bottom": "底部"
@@ -845,7 +845,7 @@
"Cipher": "密码"
},
"Class regex (e.g. ^firefox$)": {
"Class regex (e.g. ^firefox$)": ""
"Class regex (e.g. ^firefox$)": "窗口类型正则(比如^firefox$"
},
"Clear": {
"Clear": "清除"
@@ -875,7 +875,7 @@
"Click 'Setup' to create %1 and add include to config.": "点击设置以创建%1并将其包含至配置文件。"
},
"Click 'Setup' to create %1 and add include to your compositor config.": {
"Click 'Setup' to create %1 and add include to your compositor config.": ""
"Click 'Setup' to create %1 and add include to your compositor config.": "点击设置以创建%1并添加包含文件至合成器配置文件。"
},
"Click 'Setup' to create cursor config and add include to your compositor config.": {
"Click 'Setup' to create cursor config and add include to your compositor config.": "点击设置以创建光标配置,并导入至合成器配置文件。"
@@ -905,10 +905,10 @@
"Click to capture": "点击以捕获"
},
"Clip": {
"Clip": ""
"Clip": "裁剪"
},
"Clip to Geometry": {
"Clip to Geometry": ""
"Clip to Geometry": "裁剪至几何形"
},
"Clipboard": {
"Clipboard": "剪切板"
@@ -995,10 +995,10 @@
"Column": "列"
},
"Column Display": {
"Column Display": ""
"Column Display": "列式显示"
},
"Column Width": {
"Column Width": ""
"Column Width": "列宽"
},
"Command": {
"Command": "命令"
@@ -1025,7 +1025,7 @@
"Compositor Settings": "合成器设置"
},
"Compositor not supported": {
"Compositor not supported": ""
"Compositor not supported": "合成器不支持"
},
"Config Format": {
"Config Format": "配置格式"
@@ -1052,7 +1052,7 @@
"Configure icons for named workspaces. Icons take priority over numbers when both are enabled.": "为已命名工作区配置图标。当数字和图标同时启用时,图标优先生效。"
},
"Configure match criteria and actions": {
"Configure match criteria and actions": ""
"Configure match criteria and actions": "配置文件匹配条件与动作"
},
"Configure which displays show \"%1": {
"Configure which displays show \"%1\"": ""
@@ -1100,7 +1100,7 @@
"Connecting...": "连接中..."
},
"Content copied": {
"Content copied": ""
"Content copied": "内容已复制"
},
"Contrast": {
"Contrast": "对比度"
@@ -1148,7 +1148,7 @@
"Copy": "复制"
},
"Copy Content": {
"Copy Content": ""
"Copy Content": "复制内容"
},
"Copy Full Command": {
"Copy Full Command": "复制完整命令"
@@ -1187,7 +1187,7 @@
"Cover Open": "打印机盖已打开"
},
"Create": {
"Create": ""
"Create": "创建"
},
"Create Dir": {
"Create Dir": "创建目录"
@@ -1196,10 +1196,10 @@
"Create Printer": "创建打印机"
},
"Create Window Rule": {
"Create Window Rule": ""
"Create Window Rule": "创建窗口规则"
},
"Create rule for:": {
"Create rule for:": ""
"Create rule for:": "为此创建规则:"
},
"Create rules to mute, ignore, hide from history, or override notification priority.": {
"Create rules to mute, ignore, hide from history, or override notification priority.": ""
@@ -1382,7 +1382,7 @@
"Defaults": "复位"
},
"Define rules for window behavior. Saves to %1": {
"Define rules for window behavior. Saves to %1": ""
"Define rules for window behavior. Saves to %1": "定义窗口行为规则。保存至%1"
},
"Del: Clear • Shift+Del: Clear All • 1-9: Actions • F10: Help • Esc: Close": {
"Del: Clear • Shift+Del: Clear All • 1-9: Actions • F10: Help • Esc: Close": "Del: 清除 • Shift+Del: 清空 • 1-9: 操作 • F10: 帮助 • Esc: 关闭"
@@ -1505,7 +1505,7 @@
"Dismiss": "忽略"
},
"Display": {
"Display": ""
"Display": "显示"
},
"Display Assignment": {
"Display Assignment": "显示布局"
@@ -1514,7 +1514,7 @@
"Display Name Format": "显示名称格式"
},
"Display Profiles": {
"Display Profiles": ""
"Display Profiles": "显示档案"
},
"Display Settings": {
"Display Settings": "显示设置"
@@ -1562,7 +1562,7 @@
"Displays": "显示"
},
"Displays count when overflow is active": {
"Displays count when overflow is active": ""
"Displays count when overflow is active": "当溢出激活时显示计数"
},
"Displays the active keyboard layout and allows switching": {
"Displays the active keyboard layout and allows switching": "显示当前键盘布局并支持切换"
@@ -1643,7 +1643,7 @@
"Dusk (Nautical Twilight)": "黄昏(航海暮光)"
},
"Dynamic Properties": {
"Dynamic Properties": ""
"Dynamic Properties": "动态属性"
},
"Edge Spacing": {
"Edge Spacing": "边缘间距"
@@ -2089,6 +2089,12 @@
"Fog": {
"Fog": ""
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": "遵守显示器聚焦"
},
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": "图标"
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "图标大小"
},
@@ -2551,7 +2560,7 @@
"Clipboard sent": "已发送剪切板"
},
"KDE Connect clipboard action | Phone Connect clipboard action": {
"Clipboard sent": ""
"Clipboard sent": "剪切板已发送"
},
"KDE Connect clipboard tooltip": {
"Send Clipboard": "发送剪切板"
@@ -2597,7 +2606,7 @@
"No devices": "无设备"
},
"KDE Connect no devices status | bluetooth status": {
"No devices": ""
"No devices": "无设备"
},
"KDE Connect not paired status": {
"Not paired": "未配对"
@@ -2704,7 +2713,7 @@
"Unavailable": "不可用"
},
"KDE Connect unknown device status | battery status | power profile option | unknown author | widget status": {
"Unknown": ""
"Unknown": "未知"
},
"KDE Connect unknown device status | unknown author": {
"Unknown": "未知"
@@ -2713,7 +2722,7 @@
"Device unpaired": "设备已取消配对"
},
"KDE Connect unpair action | Phone Connect unpair action": {
"Device unpaired": ""
"Device unpaired": "设备已取消配对"
},
"KDE Connect unpair tooltip": {
"Unpair": "取消配对"
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "最大化检测"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "最大尺寸"
},
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "未找到文件"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": "无已隐藏应用。"
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": "在浏览器中打开"
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "打开搜索栏以查找文本"
},
@@ -3732,7 +3753,7 @@
"No devices": ""
},
"Phone Connect pairing action": {
"Device paired": "",
"Device paired": "设备已配对",
"Pairing request sent": ""
},
"Phone Connect pairing request notification": {
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "移除"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "当窗口最大化时移除间距和边框"
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "保存便签"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": ""
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "独立调整Dank Bar字体缩放"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "缩放整个 shell 中的所有字体大小"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "科学"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": "屏幕共享"
},
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": "触发器:%1"
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": "尝试不同的搜索"
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "无标题"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": ""
},
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "WiFi 设备"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "Wi-Fi 已停用"
},
@@ -5583,10 +5625,10 @@
"apps": "应用程序"
},
"audio status": {
"Muted": "",
"No input device": "",
"No output device": "",
"Select device": ""
"Muted": "已静音",
"No input device": "无输入设备",
"No output device": "无输出设备",
"Select device": "选择设备"
},
"author attribution": {
"by %1": "%1"
@@ -5598,19 +5640,19 @@
"Charging": "充电",
"Discharging": "放电",
"Empty": "空白",
"Fully Charged": "",
"No Battery": "",
"Pending Charge": "",
"Pending Discharge": "",
"Plugged In": ""
"Fully Charged": "已充满",
"No Battery": "无电池",
"Pending Charge": "待充电",
"Pending Discharge": "待放电",
"Plugged In": "已接入"
},
"bluetooth status": {
"Bluetooth": "蓝牙",
"Connected Device": "已连接的设备",
"Enabled": "",
"No adapter": "",
"No adapters": "",
"Off": ""
"Enabled": "启用",
"No adapter": "无适配器",
"No adapters": "无适配器",
"Off": ""
},
"bluetooth status | lock screen notification mode option": {
"Disabled": "禁用"
@@ -5641,13 +5683,13 @@
"Soothing pastel theme based on Catppuccin": "基于Catppuccin的舒缓且柔和的主题"
},
"color option | primary color | tile color option": {
"Primary": ""
"Primary": "首选"
},
"color option | secondary color | tile color option": {
"Secondary": ""
"Secondary": "次选"
},
"color option | shadow color option": {
"Surface": ""
"Surface": "表面"
},
"control center tile color setting description": {
"Active tile background and icon color": "激活平铺背景与图标颜色"
@@ -5677,13 +5719,13 @@
"Custom...": "自定义...",
"Day Date": "日 日期",
"Day Month Date": "日 月份 日期",
"Full Day & Month": "",
"Full with Year": "",
"ISO Date": "",
"Month Date": "",
"Numeric (D/M)": "",
"Numeric (M/D)": "",
"System Default": ""
"Full Day & Month": "日期与月份全写",
"Full with Year": "年份全写",
"ISO Date": "ISO日期",
"Month Date": "月份日期",
"Numeric (D/M)": "数字D/M",
"Numeric (M/D)": "数字M/D",
"System Default": "系统默认"
},
"days": {
"days": "天"
@@ -5721,13 +5763,13 @@
},
"dock indicator style option": {
"Circle": "圆形",
"Line": ""
"Line": "线条"
},
"dock position option": {
"Bottom": "底部",
"Left": "",
"Right": "",
"Top": ""
"Left": "左侧",
"Right": "右侧",
"Top": "顶部"
},
"dynamic colors description": {
"Dynamic colors from wallpaper": "自壁纸选取动态色"
@@ -5765,6 +5807,9 @@
"events": {
"events": "事件"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": "未知的GPU"
},
@@ -5983,14 +6028,14 @@
},
"matugen color scheme option": {
"Content": "内容",
"Expressive": "",
"Fidelity": "",
"Fruit Salad": "",
"Monochrome": "",
"Neutral": "",
"Rainbow": "",
"Tonal Spot": "",
"Vibrant": ""
"Expressive": "具有表现力的",
"Fidelity": "保真",
"Fruit Salad": "水果沙拉",
"Monochrome": "单色",
"Neutral": "中性",
"Rainbow": "彩虹",
"Tonal Spot": "音色斑点",
"Vibrant": "鲜艳"
},
"matugen error": {
"matugen not found - install matugen package for dynamic theming": "未找到matugen - 请为动态主题安装matugen包"
@@ -6004,7 +6049,7 @@
"media scroll wheel option": {
"Change Song": "切换歌曲",
"Change Volume": "切换音量",
"Nothing": ""
"Nothing": ""
},
"minutes": {
"minutes": "分钟"
@@ -6024,12 +6069,12 @@
"network status": {
"Connected": "",
"Disabling WiFi...": "正在禁用WiFi...",
"Enabling WiFi...": "",
"Ethernet": "",
"Not connected": "",
"Please wait...": "",
"Select network": "",
"WiFi off": ""
"Enabling WiFi...": "正在启用WiFi...",
"Ethernet": "以太网",
"Not connected": "未连接",
"Please wait...": "请稍候...",
"Select network": "选择网络",
"WiFi off": "WiFi关闭"
},
"no custom theme file status": {
"No custom theme file": "缺失自定义主题文件"
@@ -6159,13 +6204,13 @@
"power profile description": {
"Balance power and performance": "平衡与性能电源模式",
"Custom power profile": "自定义电源配置",
"Extend battery life": "",
"Prioritize performance": ""
"Extend battery life": "延长电池寿命",
"Prioritize performance": "优先考虑性能"
},
"power profile option": {
"Balanced": "平衡",
"Performance": "",
"Power Saver": ""
"Performance": "性能",
"Power Saver": "省电"
},
"primary color": {
"Primary": "首选"
@@ -6198,11 +6243,11 @@
"Bottom Center": "底部中间",
"Bottom Left": "底部左侧",
"Bottom Right": "底部右侧",
"Left Center": "",
"Right Center": "",
"Top Center": "",
"Top Left": "",
"Top Right": ""
"Left Center": "左侧中部",
"Right Center": "右侧中部",
"Top Center": "顶部中间",
"Top Left": "顶部左侧",
"Top Right": "顶部右侧"
},
"secondary color": {
"Secondary": "次选"
@@ -6258,7 +6303,7 @@
"Auto": "自动",
"Browse": "浏览",
"Custom": "自定义",
"Generic": ""
"Generic": "通用"
},
"theme installation confirmation": {
"Install theme '%1' from the DMS registry?": "要从DMS注册表安装主题%1吗"
@@ -6273,8 +6318,8 @@
"this app": ""
},
"tile color option": {
"Primary Container": "",
"Surface Variant": ""
"Primary Container": "首选容器",
"Surface Variant": "表面变体"
},
"uninstall action button": {
"Uninstall": "卸载"
@@ -6322,13 +6367,13 @@
"Wallpaper Error": "壁纸错误"
},
"wallpaper fill mode": {
"Fill": "",
"Fit": "",
"Pad": "",
"Stretch": "",
"Tile": "",
"Tile H": "",
"Tile V": ""
"Fill": "填充",
"Fit": "适合",
"Pad": "覆盖",
"Stretch": "拉伸",
"Tile": "平铺",
"Tile H": "水平平铺",
"Tile V": "垂直平铺"
},
"wallpaper interval": {
"1 hour": "",
@@ -6372,14 +6417,14 @@
},
"wallpaper transition option": {
"Disc": "Disc",
"Fade": "",
"Iris Bloom": "",
"None": "",
"Pixelate": "",
"Portal": "",
"Random": "",
"Stripes": "",
"Wipe": ""
"Fade": "淡入淡出",
"Iris Bloom": "光圈绽放",
"None": "",
"Pixelate": "像素化",
"Portal": "门户",
"Random": "随机",
"Stripes": "条纹",
"Wipe": "擦除"
},
"weather feels like temperature": {
"Feels Like %1°": "体感 %1°"

View File

@@ -2089,6 +2089,12 @@
"Fog": {
"Fog": ""
},
"Folder": {
"Folder": ""
},
"Folders": {
"Folders": ""
},
"Follow Monitor Focus": {
"Follow Monitor Focus": "跟隨螢幕焦點"
},
@@ -2413,6 +2419,9 @@
"Icon": {
"Icon": "圖示"
},
"Icon Scale": {
"Icon Scale": ""
},
"Icon Size": {
"Icon Size": "圖示大小"
},
@@ -3013,6 +3022,12 @@
"Maximize Detection": {
"Maximize Detection": "最大化偵測"
},
"Maximize Widget Icons": {
"Maximize Widget Icons": ""
},
"Maximize Widget Text": {
"Maximize Widget Text": ""
},
"Maximum Entry Size": {
"Maximum Entry Size": "單一項目最大大小"
},
@@ -3364,6 +3379,9 @@
"No files found": {
"No files found": "沒有找到"
},
"No folders found": {
"No folders found": ""
},
"No hidden apps.": {
"No hidden apps.": "沒有隱藏的應用程式。"
},
@@ -3556,6 +3574,9 @@
"Open in Browser": {
"Open in Browser": "在瀏覽器中開啟"
},
"Open in terminal": {
"Open in terminal": ""
},
"Open search bar to find text": {
"Open search bar to find text": "打開搜尋欄尋找文本"
},
@@ -4053,6 +4074,9 @@
"Remove": {
"Remove": "刪除"
},
"Remove Widget Padding": {
"Remove Widget Padding": ""
},
"Remove gaps and border when windows are maximized": {
"Remove gaps and border when windows are maximized": "視窗最大化時移除間距與邊框"
},
@@ -4203,6 +4227,9 @@
"Save Notepad File": {
"Save Notepad File": "儲存記事本"
},
"Save QR Code": {
"Save QR Code": ""
},
"Save and switch between display configurations": {
"Save and switch between display configurations": "儲存並切換顯示設定"
},
@@ -4230,6 +4257,9 @@
"Scale DankBar font sizes independently": {
"Scale DankBar font sizes independently": "獨立縮放 DankBar 字體大小"
},
"Scale DankBar icon sizes independently": {
"Scale DankBar icon sizes independently": ""
},
"Scale all font sizes throughout the shell": {
"Scale all font sizes throughout the shell": "縮放整個 Shell 中的所有字體大小"
},
@@ -4245,6 +4275,9 @@
"Science": {
"Science": "科學"
},
"Score": {
"Score": ""
},
"Screen Sharing": {
"Screen Sharing": "螢幕分享"
},
@@ -5076,6 +5109,9 @@
"Trigger: %1": {
"Trigger: %1": "觸發條件:%1"
},
"Trust": {
"Trust": ""
},
"Try a different search": {
"Try a different search": "嘗試不同的搜尋"
},
@@ -5172,6 +5208,9 @@
"Untitled": {
"Untitled": "無標題"
},
"Untrust": {
"Untrust": ""
},
"Update": {
"Update": "更新"
},
@@ -5431,6 +5470,9 @@
"WiFi Device": {
"WiFi Device": "WiFi 裝置"
},
"WiFi QR code for ": {
"WiFi QR code for ": ""
},
"WiFi disabled": {
"WiFi disabled": "關閉 WiFi"
},
@@ -5765,6 +5807,9 @@
"events": {
"events": "活動"
},
"ext": {
"ext": ""
},
"fallback gpu name": {
"Unknown GPU": "未知 GPU"
},

View File

@@ -5354,6 +5354,20 @@
"reference": "",
"comment": ""
},
{
"term": "Folder",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Folders",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Follow Monitor Focus",
"translation": "",
@@ -6215,6 +6229,13 @@
"reference": "",
"comment": ""
},
{
"term": "Icon Scale",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Icon Size",
"translation": "",
@@ -7300,6 +7321,20 @@
"reference": "",
"comment": ""
},
{
"term": "Maximize Widget Icons",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Maximize Widget Text",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Maximum Entry Size",
"translation": "",
@@ -8273,6 +8308,13 @@
"reference": "",
"comment": ""
},
{
"term": "No folders found",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "No hidden apps.",
"translation": "",
@@ -8875,6 +8917,13 @@
"reference": "",
"comment": ""
},
{
"term": "Open in terminal",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Open search bar to find text",
"translation": "",
@@ -10142,6 +10191,13 @@
"reference": "",
"comment": ""
},
{
"term": "Remove Widget Padding",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Remove gaps and border when windows are maximized",
"translation": "",
@@ -10541,6 +10597,13 @@
"reference": "",
"comment": ""
},
{
"term": "Save QR Code",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Save and switch between display configurations",
"translation": "",
@@ -10632,6 +10695,13 @@
"reference": "",
"comment": ""
},
{
"term": "Scale DankBar icon sizes independently",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Scale all font sizes throughout the shell",
"translation": "",
@@ -10667,6 +10737,13 @@
"reference": "",
"comment": ""
},
{
"term": "Score",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Screen Sharing",
"translation": "",
@@ -12900,6 +12977,13 @@
"reference": "",
"comment": ""
},
{
"term": "Trust",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Try a different search",
"translation": "",
@@ -13173,6 +13257,13 @@
"reference": "",
"comment": ""
},
{
"term": "Untrust",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "Update",
"translation": "",
@@ -13810,6 +13901,13 @@
"reference": "",
"comment": ""
},
{
"term": "WiFi QR code for ",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "WiFi disabled",
"translation": "",
@@ -14272,6 +14370,13 @@
"reference": "",
"comment": ""
},
{
"term": "ext",
"translation": "",
"context": "",
"reference": "",
"comment": ""
},
{
"term": "featured",
"translation": "",