| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(inject): switch spaces on a mirrored display set (#2148) `cursor_display()` failed closed unless `CGGetDisplaysWithPoint` returned exactly one display. A mirror set reports every display it drives at the same point, so a hardware mirror and its primary returned two IDs and every Previous/Next Desktop press stopped at "cursor display unavailable". Resolve each hit to its mirror set's root through a `MirrorSets` seam (`CGDisplayPrimaryDisplay`, then `CGDisplayMirrorsDisplay` of that primary) and accept the hits when they all name one root. Hits from two different sets, or none, still fail closed. Fixes #2147 | 1 天前 | |
feat(core): accept Print Screen in shortcuts (#2128) * feat(inject): map the Print Screen key on every backend Linux maps HID usage 0x46 to KEY_SYSRQ, which the uinput device already registers for the Screenshot action, and Windows maps it to VK_SNAPSHOT. A Mac keyboard has no Print Screen key and macOS reads a PC keyboard's Print Screen as F13, so the macOS keycode table folds 0x46 onto F13 in the press direction only; F13 still reads back as F13. * feat(core): accept Print Screen in shortcuts KeyboardUsage accepts 0x46, rendered as PrintScreen, and the parser also reads Print-Screen, Print, PrtSc, PrtScn and PrtScr. A custom shortcut can now press the key itself, which screenshot tools such as ShareX and Greenshot listen for. On Windows and macOS, the Screenshot and CaptureRegion actions press the system's own screenshot chords instead. Master is already at the unreleased v42, so the change joins that version's history line. CONFIGURATION.md lists the new key name. Fixes #1641 * fix(inject): count a macOS Print Screen hold as an F13 hold macOS presses F13 for Print Screen, but held chords counted owners by the original usage. A PrintScreen hold and an F13 hold therefore owned two keys, and the first release sent F13-up while the other hold was still down. HeldKey::key now resolves the usage the platform presses, the way Cmd already shares Control's owner on Linux and Windows, so both holds own one F13. | 1 天前 | |
feat(inject,gui): slide desktop switches like a three-finger swipe (#1921) On macOS, Previous Desktop and Next Desktop now slide to the neighbouring Space the way a three-finger swipe does. The switch posts DockSwipe frames on the Logi Options+ timing: one frame every 16.6 ms, each covering 15% of the distance left, then an Ended frame with an exit velocity at progress 0.954, about 315 ms in all. Up to macOS 26 the frames carry the private fields #1672 found; macOS 27 carries the same progress in an attached IOHIDEvent. One LazyLock owns that layout choice, and an ast-grep rule keeps it the only owner. The new app setting animate_desktop_switch is on by default. Off keeps the two-frame switch with no slide. The agent sets the mode at start-up and on every config reload, and the General settings page shows the switch only on macOS. Windows and Linux do not change. The posting loop is space_switch::pace, tested with a fake clock. Verified on macOS 26.7 with a screen recording. The macOS 27 slide is tested only as event construction. Fixes #1673. Co-authored-by: SMRehan <rio.syed@gmail.com> Co-authored-by: Manus <dev-agent@manus.ai> | 10 天前 | |
fix(linux): stop counting our own pass-through mouse in the input access probe (#1971) * fix(linux): stop counting our own pass-through mouse in the input access probe The event-node probe added in #787 counts every Logitech node that clicks and moves. The agent's uinput pass-through mouse mirrors the input_id and capabilities of the mouse it re-injects, so it passes that filter too, and its node carries no uaccess ACL. With the agent hooking a mouse, Settings reported "Input device access: Not granted" on a working uaccess setup. Exclude OpenLogi's own uinput devices by name, the one identity the pass-through mouse does not mirror and the same test the hook already uses to avoid grabbing them. The sysfs path cannot tell them apart: a Bluetooth-direct mouse also lives under /devices/virtual. The name predicate moves to openlogi-core so the permissions crate can share it without linking evdev and zbus; openlogi-inject re-exports it. The node selection is now a pure function over node names, a sysfs attribute reader and an open() outcome, with fixture tests for the virtual mouse, a legacy-named one, and a genuinely denied physical node. Fixes #1959 * test(permissions): rename the fixture node field clippy flags clippy::struct_field_names rejects a `node` field on the `Node` fixture; call it `entry`, the /dev/input directory entry it names. * refactor(core): own the uinput device names beside the check that recognizes them Moving is_own_device into openlogi-core left its prefix there while the device names stayed in openlogi-inject, splitting the single owner the inject-uinput-device-owner ast-grep guard enforces. Move the Device enum and its names into openlogi_core::uinput too, keep only the evdev builder in openlogi-inject (re-exporting Device and is_own_device), and move the guard beside its new owner as core-uinput-device-owner. The permissions fixture now names the pass-through mouse through Device::name instead of a literal. | 8 天前 |