- 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
* 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
* updated dank to support aqueous
* further updates
* aqueous support work
* updated to support workspace options better in aqueous
* added blur to dms shell for aqueous
* added keybinding update
* remove unneeded blur
* clean up per claud review
* swapped to ipc
* aqueous: move IPC integration to QML, delete test fixtures (since we
dont have a QML test structure even setup), delete in-repo docs
* fix staticcheck
* aqueous: consolidate more aqueous specific stuff
* add aqueous logo
---------
Co-authored-by: Zoey <[email protected]>
* feat(screenshot): add touch and stylus input support for region capture
* fix(screenshot): guard against finishSelection on touch up during scroll phase
port 1.6
* feat(screenshot): add -g/--geometry flag to print selection coordinates
- Add -g/--geometry persistent flag to print region geometry (X,Y WxH) to stdout.
- Skip image buffer allocation, cropping, and file/clipboard/notification actions when in geometry mode.
- Support standard Enter/Space confirmation or mouse release via --no-confirm.
- Exit with code 1 when selection is cancelled, matching slurp behavior for script integrations.
- Support printing geometry across last, window, output, full, and all modes.
- Add unit tests in region_geometry_test.go.
* refactor(screenshot): deduplicate output bounds and clean geometry result helpers
- Add bounds() method on WaylandOutput to deduplicate Hyprland geometry lookup across output capture and search.
- Add geometryResult() helper in screenshot package to eliminate redundant CaptureResult literals.
- Add GeometryString() method on Region to unify geometry formatting.
- Refactor selectedLogicalGeometry() to return Region directly.
- Clean up flag validation in runScreenshot.
* fix(screenshot): address PR review on geometry coordinates and JSON output
- Derive selectedLogicalGeometry from selectionExtent and ext.logical to keep geometry in sync with inclusive selection bounds.
- Use pointer int for X and Y in screenshotMetadata so (0,0) origins are preserved in JSON output.
- Divide output dimensions by effectiveScale in bounds() for non-Hyprland compositors and handle transform rotation.
- Convert stored device coordinates to logical units in captureLastRegion geometry mode.
- Update and expand unit tests for inclusive bounds, preselection, and scaled outputs.
* fix(screenshot): prevent geometry query from clobbering last region and handle niri window geometry
- Guard SaveLastRegion in captureRegion with !s.config.Geometry to prevent overwriting saved region with logical coordinates.
- Return explicit error when attempting window -g on niri instead of printing bogus 0,0 0x0 rect.
- Populate Region dimensions in captureNiriWindow.
* feat(screenshot): add live preview panel for scroll capture
- Port scrolling live preview from dms-quick-capture backend to native screenshot.
- Calculate dynamic preview panel geometry placed beside the capture hole on the side with most available space.
- Render downscaled live stitched canvas with dark translucent background and white border in drawScrollOverlay.
- Include preview panel in Wayland input regions and allow completing capture by clicking the preview panel.
- Update cursor shape to pointer hand when hovering over preview or control buttons.
- Add unit tests for layout, hit testing, and canvas rendering.
* fix(screenshot): bound scroll preview aspect ratio to recent canvas tail
- Derive preview aspect ratio from a bounded tail window of the canvas (maxPreviewRows = frameW * maxHeight / minImageW).
- Prevent preview panel width from collapsing below minImageW and disappearing when stitched rows exceed ~4.5x width.
- Render the recent window rows in drawScrollPreview to maintain a stable panel size and display live incoming content.
- Add unit test for long scrolling capture preview bounds.
* feat(screenshot): support 4-corner resizing while holding Ctrl
- Hit-test selection corners when Ctrl is held to allow resizing.
- Set opposite corner as fixed anchor and update dynamic cursor shape
(NwseResize/NeswResize).
- Draw corner handle indicators when Ctrl is held or during active resize.
- Add 'Ctrl resize/move' to overlay HUD and provide complete glyph
coverage for HUD labels.
- Add comprehensive unit tests covering hit testing, inverted dragging,
incremental handle damage, and glyph coverage.
* fix(screenshot): invalidate background cache on handle and shift modifier changes
- Track backgroundHandles and backgroundShift in RenderSlot.cacheValid.
- Rebuild background slot and HUD when handle or shift modifier states
change with an existing selection, preventing incremental re-dimming
from punching holes in the HUD.
- Fix trailing newline in region_resize_test.go for golangci-lint.
* fix(screenshot): gate redraw and handle dimming on render modifier changes
- Only trigger redrawSurface when Shift or Ctrl modifier states actually
change, preventing redundant redraws when tapping Alt, Super, or Locks.
- Only re-dim and damage corner handle bounding boxes in overlayDelta and
overlayDamage when handles move or their visibility changes, preventing
unnecessary re-dimming of stationary handles over the HUD.
- Add TestOverlayDeltaIdenticalOverlayNoHandleDimming test.
* fix(screenshot): measure hud text advance accurately to prevent pill overflow
- Use (1+len(item.desc))*(charW+1) when calculating totalW in drawHUD,
matching the full 9px advance used when drawing space and description.
- Add TestHUDDimensionsContainText to verify HUD pill dimensions enclose
all text items with correct padding across all variant combinations.
* fix(screenshot): compare handle rect sets in overlay delta and damage
- Use slices.Equal to compare prev and cur handleRects in overlayDelta
and overlayDamage instead of interior equality.
- Properly re-dim and damage handles when selection corners cross monitor
boundaries where clamped interior is unchanged but top/bottom/left/right
flags change.
- Add TestOverlayDeltaHandlesClampedMonitorEdge test.
* test(screenshot): verify drawHUD output buffer pixels stay within pill bounds
- Extract hudDimensions helper on RegionSelector used by drawHUD.
- Update TestHUDDimensionsContainText to drive drawHUD directly into a
zeroed buffer and assert no lit pixel falls outside the computed
HUD pill boundary across all configuration variants.
* feat(screenshot): drag region with ctrl
* fix(screenshot): rehome moved regions
* fix(screenshot): clamp region to active output
* fix(screenshot): fall back to output union when moved region exceeds active output
---------
Co-authored-by: bbedward <[email protected]>
* core: fix security and concurrency issues found in backend audit
Security:
- privesc: pipe the sudo password via stdin (sudo -S) instead of
embedding it in the command string, so it no longer appears in argv
(readable by any local user via /proc/<pid>/cmdline or ps)
- greeter: tokenize a session .desktop Exec= line into argv and execve
directly instead of running it through /bin/sh -c, closing a command-
injection path via user-writable ~/.local/share/wayland-sessions
- plugins: reject path-separator/.. in plugin id/name before joining
into a filesystem path, closing an arbitrary-directory-delete in the
uninstall/update fallback
- keybinds/hyprland: always quote unrecognized bind actions/keys when
writing generated Lua; only re-emit genuine round-tripped custom Lua
verbatim (tracked via an explicit flag), closing a Lua-injection path
- desktop/mimeapps: reject newline/bracket in mime/desktop-id fields so
they can't inject fake sections into the shared mimeapps.list
Robustness / concurrency:
- server: recover panics in the request-dispatch path so one bad
handler can't crash the daemon and drop every client
- go-wayland: recover panics in the shared dispatch choke point so a
malformed compositor event can't crash CLI tools / the daemon
- server: per-connection D-Bus client ID instead of a shared constant,
fixing cross-client signal delivery and subscription teardown
- network: guard the NetworkManager device maps with a mutex (a
concurrent map read/write here is an unrecoverable fatal error)
- cups: close the event channel on Stop() so Unsubscribe() of the last
subscriber no longer deadlocks; allocate the fresh channel in Start()
- freedesktop: reuse the shared session conn for the settings watcher
and tear it down in Close(), fixing a per-Manager conn+goroutine leak
- clipboard: mutex-guard lazy dbusConn creation
- geolocation: use WithMatchMember for the GeoClue2 LocationUpdated
signal (was WithMatchSender with an interface.member string, so the
match never fired and live location updates never arrived)
- screenshot: set failed=true on buffer/pool creation errors so the
dispatch loop doesn't wait forever for a ready/failed that never comes
* apply code review comments
---------
Co-authored-by: bbedward <[email protected]>
* added reverse scrolling to settings and widget
* added support for dankbar scrolling
* Better settings description
* removed isNiri conditional from search index
* Added numpad enter key to finish screenshot selection