DankSlideout always held WlrKeyboardFocus.OnDemand regardless of modals,
causing Notepad to steal focus back when Launcher was opened.
ModalManager: clone currentModalsByScreen on mutation so QML bindings
re-evaluate when modals open/close.
DankSlideout: set keyboardFocus to None while a modal is active on the
same screen, letting the modal (launcher) claim focus exclusively.
(cherry picked from commit 9981fcf529)
closeHoverSurfaces() called TrayMenuManager.closeAllMenus(), tearing down
every registered tray menu including ones opened by right-click. With
hoverPopouts enabled, moving the pointer after a right-click re-ran the
hit test and closed the menu before it could be reached.
Tag each menu with how it was opened and add closeHoverMenus(), which
only closes hover-opened menus. The hover controller now uses that.
Click-driven callers pass no argument, so byHover stays undefined and
`byHover === true` evaluates to false.
Fixes#2978
Claude-Session: https://claude.ai/code/session_01DYF9vdsaToU4Usu7kxPCNB
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 34626070af)
The current isIdle detection only works if the player has a title _and_ artist metadata,
which is not appropriate for all cases, e.g. MPV playing a video does not set artist.
In the current implementation, after a video stops playing in MPV, and the window closes
(but MPV and the MPRIS plugin server is still running as a background process), the playback controls remain
shown on the bar, and have non-functional controls.
It is sufficient to only check for the "Stopped" playing state. The MPRIS specification
states that Playback_Status==Stopped should be used to indicate that *NO* track is currently
playing. A compliant player should set that, and should also set the CanPlay/CanPause boolean
to false is not track is being played.
See: https://specifications.freedesktop.org/mpris/latest/Player_Interface.html#Enum:Playback_Status
(cherry picked from commit 49f968d26b)
* feat(BatteryService): dismiss sticky critical battery notifications
If critical notifications do not timeout, dismiss the battery-related
ones automatically when battery is plugged in.
* fix(BatteryService): use material icons for battery alerts
Since the previously specified icons are not resolved, instead reuse
icons from DMS first-party plugin for critical battery alerts.
(cherry picked from commit df396bfa43)
* fix(mpris): enrich metadata across equivalent players
* fix(mpris): address review feedback on source stealing and title stripping
- _bestPlayingPlayer: when the active player is playing but not
controllable, only hand ownership to a controllable peer that passes
isSameTrack; unrelated players can no longer steal the active source.
- displayTrackTitle: keep the full trackTitle for display. Suffix
stripping now only applies to the isSameTrack matching key, and only
for a known app-name allowlist (YouTube, SoundCloud, browsers, etc.)
so legitimate titles containing ' | ' are never mangled.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Port 1.5
(cherry picked from commit 594a2cde19)
Reopening the autostart "Browse" picker crashed in
QQmlIncubatorPrivate::incubate. Drop the ListView model on hide()
and rebind it on show() so each open starts with a fresh
QQmlDelegateModel instead of reusing a stale incubation queue.
(cherry picked from commit 3182c70857)
* fix(spotlight): fix empty results on restoring last file search query
- When "remember last query" is enabled and the last query is file search, it shows "no results" until the query is manually modified in full launcher mode.
* fix(spotlight): properly restore last selected mode(tab) when enabled in full launcher mode
* fix(spotlight): allow file trigger in plugins mode(tab)
* fix(spotlight): restore previous mode when clearing '/' file search prefix
When the '/' prefix is removed from the query, the controller now correctly reverts to the previous mode instead of remaining stuck in "files" mode.
* fix(spotlight): code review fix
(cherry picked from commit 367ad5f69a)
lock-before-suspend released the logind sleep delay inhibitor as soon as Qt
reported the lock rendered (afterAnimating/afterRendering). That signal fires
before the compositor has committed/presented the ext-session-lock surface, so
the machine could freeze ~1 frame later with the desktop still the last
presented frame. On resume the desktop was briefly visible before the lock
appeared (both suspend and hibernate).
Gate lockerReady on WlSessionLock.secure (the ext-session-lock `locked` event),
so the inhibitor is held until the compositor confirms the session is locked and
the desktop is hidden. LockSurface passes the WlSessionLock down as sessionLock;
the readiness check returns early until secure, and re-fires on secureChanged.
The Go-side fallback timer in loginctl monitor remains as the backstop.
Reproduced on niri / s2idle with 3 outputs: debug log showed lockerReady sent
18 ms before `PM: suspend entry`; with this change the desktop no longer flashes
on resume.
Signed-off-by: Thomas Kroll <99196436+tkroll-ionos@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 237fb57d5e)