Skip to content

Add 'Move Window' drag effect - #1860

Open
miguelAngelo1999 wants to merge 2 commits into
noah-nuebling:masterfrom
miguelAngelo1999:feature/window-move-drag
Open

Add 'Move Window' drag effect#1860
miguelAngelo1999 wants to merge 2 commits into
noah-nuebling:masterfrom
miguelAngelo1999:feature/window-move-drag

Conversation

@miguelAngelo1999

Copy link
Copy Markdown

Hold a button and drag to move the window under the cursor.

Uses Accessibility API to find the window at the mouse position and reposition it via kAXPositionAttribute.

Like the classic 'move window from anywhere' feature in Linux window managers, or BetterTouchTool's window moving.

New files: ModifiedDragOutputWindowMove.h/.m

miguelAngelo1999 and others added 2 commits April 30, 2026 15:12
…a buttons

Fixes noah-nuebling#1791, noah-nuebling#1790, noah-nuebling#1800, noah-nuebling#1740, noah-nuebling#1744

Logitech mice with extra buttons (thumb, tilt wheel, precision, side buttons)
use HID++ 2.0 ReprogControlsV4 (feature 0x1B04). These buttons are silently
consumed by the mouse firmware until the host sends a SetCidReporting command
to divert them. Once diverted, they arrive as 0x11 long reports.

This implementation calls Buttons.handleInput() directly — no CGEvent
round-trip needed, no extra event tap overhead.

Protocol:
- GetFeature(0x1B04) -> feature index
- GetCount -> number of controls on this device
- GetCidInfo for each control -> CID, TID, capability flags
- Skip controls whose TID maps to a native HID button (L/R/M/Back/Fwd)
- SetCidReporting with flags=0x03 (divert=1, divert_valid=1) for the rest

The flags byte follows the 'valid bit' pattern documented in Solaar
(pwr-Solaar/Solaar hidpp20.py): each flag bit has a corresponding valid bit
= flag << 1, telling firmware the field is being intentionally set.

TID-based filtering correctly excludes natively-reported buttons across all
Logitech models without any per-device hardcoding.

Tested on: Logitech M720 Triathlon (Bluetooth), macOS 15 Sequoia, macOS 26
- Left tilt  (CID=0x005B) -> button 6 in MMF ✅
- Right tilt (CID=0x005D) -> button 7 in MMF ✅
- Thumb      (CID=0x00D0) -> button 8 in MMF ✅
- Back/forward continue working natively (not diverted) ✅

References:
- https://github.com/pwr-Solaar/Solaar (hidpp20.py)
- https://github.com/libratbag/libratbag (hidpp20.c)
- https://lekensteyn.nl/files/logitech/x1b04_specialkeysmsebuttons.html
Hold a button and drag to move the window under the cursor.
Uses Accessibility API (AXUIElementSetAttributeValue with kAXPositionAttribute).
Finds the window element at the mouse position on activation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants