* Fix gaps and overlaps when filtering clipboard history
* feat(Clipboard-Bar-Hist): Add search/filter to saved clipboard entries as well. Change title on toggle between recent/saved.
* keep Pinned/Saved icon highlighted when selected
* add back filter animations
* Implement snap state for list views based on animation settings
---------
Co-authored-by: purian23 <purian23@gmail.com>
* feat: add native powerprofile IPC target for power profiles management
* feat: show centered PowerProfileModal with 3 square buttons for powerprofile IPC toggle
* style: enhance PowerProfileModal size, icons, description, and keyboard hints
* feat: add Space key binding to select highlighted power profile
* feat(WidgetsTabSection.qml): added dynamic width and static padding for DiskUsage
* feat(DiskUsage.qml):added functionality for dynamic width and static padding, also changed spacing to work like in cpu and ram monitor. Now they look complete and same
* fix(DiskUsage): restore display modes & formatting
---------
Co-authored-by: purian23 <purian23@gmail.com>
Add applyStoredIconTheme() calls alongside existing applyStoredTheme()
calls in loadSettings(), onLoaded, and onLoadFailed, ensuring the stored
icon theme is synced to GTK/Qt/Cosmic configs on every startup and reload.
The applyStoredIconTheme() function and its _hooks entry already existed
in the codebase but were never invoked during initial settings loading.
Co-authored-by: lingdiansr <2077258365@qq.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* fix(Mpris): exclude idle players from active-player selection
Add MprisController.isIdle() (player Stopped with empty title and
artist). _resolveActivePlayer excludes idle players from every
selection path, and re-resolves when the active player itself goes
idle. Existing triggers (availablePlayers change, isPlaying becoming
true) do not fire for a player merely stopping.
The fallback now gates on !isIdle(p) instead of p.canPlay. canPlay
describes whether Play() would succeed; !isIdle describes whether
there is anything to surface. canControl unchanged.
When no eligible player remains, activePlayer becomes null and
consumers that gate on it unload (the bar media widget via
WidgetHost; the dash via the companion fix).
* fix(DankDash): show no-player state when active player resolves to null
showNoPlayerNow gated on _noneAvailable (player count === 0) or
activePlayer being idle. Neither covers activePlayer being null
while players remain registered, which is now possible (an
always-on player sitting stopped with empty metadata).
Key showNoPlayerNow on !activePlayer; drop the unreachable
_trulyIdle.
* add(MprisController): add track artist change handling to active player resolution
---------
* feat: unify media controls dropdown interactions, hover behavior and cycle controls
- Implement hover-to-show and hover-to-hide for all media control dropdowns.
- Make clicking the Output Devices and Media Players buttons cycle through items when expanded.
- Always display the 'speaker' icon for Output Devices to maintain visual consistency.
- Bind dropdown player properties dynamically to fix list stale rendering states.
* fix(DankDash): use trackArtist property for artist label in MediaPlayerTab
* fix(DankDash): simplify active player label for consistency with output devices
* feat(DankDash): display volume levels for audio output devices in dropdown
* fix(DankDash): display Unknown Artist when artist is empty in player list
* feat(DankDash): add keyboard shortcuts for seeking, track cycling and playback control in Media popout
* feat(DankDash): change Up/Down arrow keys to adjust volume in Media popout
* feat(DankDash): auto-open volume dropdown overlay when using Up/Down shortcuts
* feat(DankDash): add Key M shortcut to toggle mute in Media popout
* fix(mpris): clamp minimum seek position to 0.1s to prevent browser player reset
* fix(mpris): cache stable length to prevent browser transient reset issues
* fix(mpris): persist activePlayerStableLength in MprisController singleton
* fix(mpris): resolve browser player album art with raw metadata and YouTube url fallbacks
* fix(mpris): resolve browser player album art with local caching and 16:9 youtube fallbacks
* style(mpris): trim trailing whitespace in TrackArtService
* fix(mpris): address code review feedback on remote caching, stale artwork, and hover state
* fix: secure curl commands and prevent premature dropdown overlays closing on button re-hover
The toast Rectangle uses `layer.enabled: true`, which renders to a
texture before compositing. With fractional implicit/content sizes
(derived from text and icon metrics), the cached texture was being
sampled with sub-pixel interpolation and the toast looked blurry
under fractional-scale-aware compositors (e.g., niri).
Wrap toastWidth/toastHeight and implicitWidth/implicitHeight with
Theme.px(value, dpr), matching the alignment NotificationPopup.qml
already applies to its surface.
* feat(clipboard): Add editing capability to clipboard entries
* Add split save menu for clipboard editor
* Add clipboard editor shortcuts and hints
* Show full clipboard text in editor
* feat(Clipboard): Revive ClipboardEditor PR
- Original PR #1916 by @nabaco
* fix(clipboard): restore Save button targets in editor
---------
Co-authored-by: Nachum Barcohen <38861757+nabaco@users.noreply.github.com>
- Introduce multi-account greeter login with per-user theme previews
- Add `dms greeter sync --profile` for secondary users with or without sudo
- Add Manage greeter group membership from Settings UI → Users Tab
- Core user is logged in tty1 while user two is in tty3, you can now seamlessly switch bewteen them
New IPC options:
- `dms ipc call sessions list`
- `dms switch-user [target]`
- New Powermenu switch users option
Fixes#2354
Root cause (tray freeze): In clickThrough mode, the PanelWindow mask uses
sectionRect() with mapToItem() to compute input regions. After DPMS resume,
the PanelWindow is recreated with width=0, and mapToItem() returns wrong
positions. The right section's implicitWidth doesn't change after creation
(fixed-size tray icons), so the mask binding is never re-evaluated when the
compositor sets the actual screen width. Adding barWindow.width as a binding
dependency ensures the mask recalculates on resize.
Root cause (wallpaper loss): Wallpaper PanelWindows are recreated by Variants
during screen reconnection before the compositor finishes output initialization.
The wallpaper Image renders at 0x0 dimensions, resulting in a black screen.
Changes:
- DankBarWindow: add barWindow.width dependency to clickThrough mask bindings
- DMSShell: add surface recovery mechanism (screen reconnect + session resume)
with progressive 2-pass timer (800ms + 2800ms) that recreates bar, Frame,
wallpaper, and dock surfaces after the compositor is ready
- WlrOutputService: re-request output state on session resume
Pulses the WiFi and Bluetooth status icons while a connection is in
progress (lock screen, DankBar control center button, control center
compound pill). The pulse is implemented as a reusable Widgets/DankBlink
component, and the wifi-connecting condition is centralized as
NetworkService.isWifiConnecting.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(Spotlight): fix submenu keyboard navigation
* feat(Launcher/Spotlight): disable persisting last mode when changed by triggers
* feat(Launcher/Spotlight): add option to disable last mode being persisted
* fix(Launcher/Spotlight): fix context menu keys navigation
* fix(NiriOverviewOverlay): fix context menu keys navigation and position
Sort networks by signal bucket of 25 with SSID as tiebreaker so minor
RSSI fluctuations between scans no longer reshuffle the list while the
user is selecting a network.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- New Spotlight toggle to show/hide chips, off by default
- Updated blur effects on all launcher inputs and footers
- Fixed previous queries resurfacing
- Upated Spotlight keyboard navigation
- Added functionality to show and shortcut to keybinds from the Launcher tab
- Update to add DMS Action keys in Keyboard Shortcuts
- Defaulted in niri/hyprland includes file as `Alt+Space`
- New (IPC): `dms ipc call spotlight-bar toggle`
- Slight UI update to follow user radius
Some monitors, especially cheaper models, are slow to power on after sleep and may not be present in Quickshell.screens
when onScreensChanged is triggered. This change adds a 3-second delay before updating currentOSDsByScreen to ensure all
screens are detected, mitigating the issue of OSDs not appearing on certain monitors after resume.
Co-authored-by: Klesh Wong <kleshwong@gmail.com>
* networkd: classify links by Type instead of name prefix
The systemd-networkd backend decided wifi-vs-ethernet by checking
whether the interface name started with "wlan" or "wlp". Anything
else (that was not on a small virtual-prefix denylist) was treated
as wired ethernet. That misclassified two common cases:
* Nebula tunnels (kernel name like "nebula.homelab", Type=none,
Kind=tun) showed up as a wired ethernet device — DMS rendered an
"Ethernet connected" indicator whenever the overlay was up, even
with no physical NIC plugged in.
* Renamed wifi interfaces (e.g. systemd link files that rename
wlan0 to a friendlier name like "wifi") were also miscategorised
as ethernet, because they no longer matched wlan*/wlp*.
networkd already publishes the real link kind in the JSON returned
by the per-link Describe method ("ether", "wlan", "loopback",
"none"). Fetch it during enumerateLinks, cache it on linkInfo, and
classify against that. The old prefix logic is kept as a fallback
for the case where Describe ever fails to populate Type.
The package-level looksVirtual() helper replaces the unexported
isVirtualInterface method so the new classification helpers and
their tests can use it without needing a live backend.
Tests cover both the Type-based and fallback paths, including the
Nebula-shaped Type=none/tun case that motivated this change.
* networkd: cache linkType across signal ticks and unit-test Describe fallback
enumerateLinks runs on every PropertiesChanged signal under
/org/freedesktop/network1, which fires on carrier flap, DHCP renew, and
each address change. The previous version rebuilt every linkInfo from
scratch on each tick, including a synchronous Describe D-Bus round-trip
per link, despite the link Type being fixed at netlink creation. Preserve
existing entries when the D-Bus path matches, refreshing only ifindex,
and only call fetchLinkType on a genuinely new entry. A link torn down
and re-created at a different path still triggers a refetch.
Extract parseDescribeType from fetchLinkType so the JSON failure path —
malformed payload, missing Type field, wrong type for Type — can be
exercised without a live D-Bus connection. The classifier's fallback to
name-prefix heuristics already had coverage; this locks in that the seam
between Describe and the classifier surfaces an empty string on every
failure mode rather than misclassifying a link.
- Replaced fullscreen hide/reveal toggles with Show Over Fullscreen layer toggles
- Added Launcher opt to Show Over Fullscreen setting
- Kept fullscreen stacking compositor-owned via top/overlay layer choices
- Fixed Hyrland Special Workspaces
- Updated DMS Advanced Configuration docs