- Settings, plugins and session state are backed up before dms changes w/restore options when returning to stable
- Snapshots are only taken when dms itself changes channel
- Info annotated on danklinux docs
Qt skips QPA plugins built for a different major.minor without any
visible error. Out-of-tree plugins such as the AUR qt6ct-kde keep the
file in place after a Qt update, so the check reported them as
installed while Qt apps and tray icons lost their theme. Compare the
version in the plugin's .note.qt.metadata ELF note with the installed
Qt and warn on a mismatch.
qtengine had its own plugin check, which printed its rows at the end of
the Environment section instead of under QT_QPA_PLATFORMTHEME, with
different names and messages than qt6ct or kde.
Fold it into the shared platform theme check: the Qt6 plugin is always
checked, the Qt5 plugin too when QT_QPA_PLATFORMTHEME names qtengine and
a Qt5 build tool can be asked. Also add a row for
~/.config/qtengine/config.json, which is what makes Qt apps follow the
DMS colors, and say in verbose mode that an unset
QT_QPA_PLATFORMTHEME_QT6 falls back to QT_QPA_PLATFORMTHEME.
The XDG_MENU_PREFIX check only looked in /etc/xdg/menus, so a menu file
in ~/.config/menus, which the menu spec searches first, was reported as
missing. Search the user config dir and every XDG_CONFIG_DIRS entry.
- new blur variants, glow, wobble, motion blur and groupbar support
- new inputs support for mouse, touchpad and keyboard settings
- greeter, cheatsheet and scroll capture dispatch in Lua
- scrolling workspace screenshot focus fix
- fix scrolling screenshots from being cut-off on fractional-scale displays
- workspaces are keyed by address on the beta branch and upcoming stable release where named workspaces have no id
- bind flags, per-device binds, new window-rule keys and effects
- outputs default to preferred/auto/auto and gate HDR/VRR on hardwareDetails
- new dms setup/installer systemd session support on hyprland-session.target
- Auto detect the snake_case dialect of Mango master from the binary, write configs and respell existing fragments with:
`dms config mango-migrate`
- Setup backs up and replaces config.conf, moves binds and rules into dms/
- Start DMS from mango-session.target with systemd or exec-once without
- fix cheatsheet run action and bind precedence, window-rule and display save updates
- Support urgent active tag, greeter loading /etc/mango, per-screen overviews
dms screenshot put only image/png on the clipboard. Terminals can only
paste text, so pasting a screenshot into a terminal app (e.g. a CLI
that attaches images from a pasted path) did nothing, while a file
copied through the server's clipboard.copyFile pastes its path.
When the screenshot is saved to a file, copy it the same way:
gnome-copied-files, text/uri-list, the path as text/plain, and the
image bytes. The server is asked first so the copy lands in history;
without it, the same offers are served locally. The offer list is
shared with Manager.CopyFile through clipboard.FileOffers.
copyMultiFork now waits for the child to take the selection, like
copyForkCached, so a failed local copy is reported instead of lost.
dms cl copy --download shares this path and now falls back to a local
copy when the server is down or rejects the file. --no-file and PPM
keep the image-only copy.
* policy: load the CLI policy file from an internal package
The plugin and theme registries need to read the policy too, and
internal packages cannot import package main.
* registries: let the CLI policy turn the registries off
With disable_registries set in /usr/share/dms/cli-policy.json or
/etc/dms/cli-policy.json (the /etc file wins), the plugin and theme
registries start without sources, so nothing is cloned or pulled.
Installed plugins and themes keep working.
deprecation notice to plugin compatibility shims
- When qml-common became a thing, we left qs.Widgets shims in place for
plugin compatibility
- It's annoying to need to maintain them when qml-common has any change,
add a warning so we can safely deprecate them in the future
- One shot rename the common stuff to D to make it shorter and nicer to
write
* added launcher dmenu mode
* fixed prechecker issues
* added unit tests for dms dmenu command
* added workaround for matugen printing error message to stdout
* correct help message: matching is case-*in*sensitive
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
* no longer save dmenu selections to history; now properly close dmenu sockets
* increased parity with rofi -dmenu flags; added -i as an ignored flag to match dmenu
* go mod tidied
---------
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
* feat(screenshot): add Ctrl+C shortcut to copy selection without saving
Add Ctrl+C shortcut in interactive region selection mode to immediately
copy the current selection (or hovered snap target) to clipboard without
saving to a file.
- Works during mid-drag, on hovered targets, or on existing selections
- Bypasses file saving and forces clipboard output
- Emits aborted status in JSON mode so external callers (such as Quick
Capture) exit cleanly without launching an annotation editor
- Exits cleanly without error if triggered with no selection
- Updates HUD items with Ctrl+C copy shortcut
- Hides corner resize handles and maintains crosshair cursor while dragging with Ctrl held
* fix(screenshot): bypass stdout and scroll phase when copyOnly is active
- Disable stdout output when copyOnly is active to ensure the image
is copied to the clipboard instead of being written to stdout.
- Write 'Copied to clipboard' to stderr if --stdout was originally passed.
- Bypass entering scrollPhase in finishSelection() if copyOnly is set,
immediately capturing and copying the selected region.
* feat(screenshot): snap to active popouts and modals in region mode
Allow region screenshot selector to detect and snap to visible shell
popouts and modals on hover and click or keyboard confirmation.
- PopoutManager.qml: add getActiveSurfaces() collecting visible
DankPopout and DankModal global bounding boxes
- DMSShellIPC.qml: add screenshot.getSurfaces IPC endpoint
- core: fetch snap targets from shell IPC during region screenshot init
- selector: highlight snap targets on hover with surface name and dimensions
- selector: click or Enter/Space on hovered target locks selection to surface bounds
- selector: allow hover snap over pre-selection (SelectionState.fromPreSelect)
- selector: reset selection on degenerate (1x1) click release for quick re-selection
- unit tests for display name formatting, hover detection, and render bounds
* fix(screenshot): correct snap off-by-one and drag-away cancellation
- region_input: fix drag-away snap cancellation by setting hasSelection=true
and clearing preSelect so freeform dragging renders and is not discarded
- region_input: add snapToTarget helper subtracting 1 device pixel (devPxX/Y)
from currentX/currentY to prevent inclusive coordinate off-by-one (420x580 -> 420x580)
- region_render: compute hover bounds with w = round(width * scaleX) and
x2 = x1 + w - 1 to eliminate +1 device pixel in render bounds
- region_snap_test: assert exact 420x580 bounds for both hover and snapped states
* style(screenshot): format region_snap_test.go with golangci-lint-fmt
A compositor resolves a bind's keysym on the first level of the active
layout. Layouts that put punctuation higher up therefore cannot reach it
at all: de:neo has bracketleft on layer 4 and plain de on AltGr, so
Mod+bracketleft is a bind that can never fire. The editor recorded and
stored it anyway and gave no sign that anything was wrong (#3585).
`dms keybinds keymap` now reports what the seat's xkb keymap puts on the
first level of every physical key, and the editor says so instead of
letting a dead bind through.
The keymap a compositor hands out writes its keysyms as hex, so only the
range the keymap package can name back is usable for the comparison.
That is the ASCII range, which is where the problem lives, and the
command reports the vocabulary alongside the keys so the caller can tell
"the layout cannot reach this" from "we could not name it" and stay
quiet in the second case.
scrollbar: interface style toggle and no scrollbars in the dash
dash: never allow scrollbars
cc: widget sheet cards, header close button and content-sized dialogs