Skip to content

feat(gui): add capability-driven actions ring - #528

Merged
davidbudnick merged 13 commits into
AprilNEA:masterfrom
jericho0521:feat/actions-ring
Aug 13, 2026
Merged

feat(gui): add capability-driven actions ring#528
davidbudnick merged 13 commits into
AprilNEA:masterfrom
jericho0521:feat/actions-ring

Conversation

@jericho0521

@jericho0521 jericho0521 commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds a capability-driven Actions Ring vertical slice, including MX Master 4 Haptic Sense Panel capture, agent-owned sessions, haptic feedback, a warm non-activating GPUI overlay, and an editor for radial actions.

Changes

  • core: add Actions Ring layouts, per-application overrides, custom presentation icons, typed keyboard shortcuts, and application/folder/URL targets
  • hidpp/hid: add reverse-engineered 0x19B0 haptic feedback and 0x19C0 force-sensing wrappers; discover and divert Haptic Sense Panel CID 0x01A0; preserve prior reporting state
  • hook/inject: expose cross-platform cursor positions and execute typed shortcuts or expanded application/path targets
  • agent/ipc: add validated, snapshotted ring sessions with expiry, hover deduplication, cancellation, activation, and haptic playback; bump the positional protocol to version 13 with wire goldens
  • gui: add an eight-slot radial editor, categorized action library, 53 custom icon choices, shortcut/path inputs, and the warm circular overlay without focus activation or native window borders/shadows
  • packaging: ship and sign openlogi-overlay in macOS, Linux, and Windows artifacts
  • i18n/docs: localize the new UI across all locale files and document schema version 3 Actions Ring configuration

The 0x19B0, 0x19C0, and CID 0x01A0 behavior is documented in code as reverse-engineered rather than treated as an official protocol guarantee.

Screenshots

image

Testing

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test --workspace
  • cargo run -p xtask -- macos bundle
  • codesign --verify --deep --strict --verbose=2 target/release/bundle/osx/OpenLogi.app
  • launched the development and release-shaped app bundles on macOS 26.4 arm64
  • verified GUI, agent, and warm overlay processes launch together
  • verified selecting a radial slot and assigning Left Click persists the expected slot configuration
  • verified every custom gallery icon resolves to an embedded asset
  • verified the release-shaped local bundle can replace the installed application
  • MX Master 3S detection was runtime-tested
  • not runtime-tested on MX Master 4 hardware: CID 0x01A0 capture, waveform playback, force thresholds, and press-to-first-frame latency remain to be verified
  • not runtime-tested on Linux or Windows; CI is required for cfg-gated behavior

Related to #92 and #313.

Fixes #15

@davidbudnick
davidbudnick marked this pull request as ready for review August 10, 2026 00:55
@davidbudnick davidbudnick added this to the v0.6.24 milestone Aug 10, 2026
@davidbudnick

Copy link
Copy Markdown
Collaborator

@greptile-apps

@davidbudnick davidbudnick modified the milestones: v0.6.24, v0.6.25 Aug 10, 2026
@greptile-apps

greptile-apps Bot commented Aug 10, 2026

Copy link
Copy Markdown

Greptile Summary

The PR adds a capability-driven Actions Ring spanning configuration, device capture, agent-owned IPC sessions, a warm overlay, action execution, packaging, and localization.

  • Adds snapshotted ring sessions with hover, activation, cancellation, expiry, and haptic feedback.
  • Adds the radial editor, presentation assets, typed shortcuts, and application/path/URL targets.
  • Ships the overlay helper across macOS, Linux, and Windows artifacts.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains; the current command worker retains terminal work during connection failures and stalled RPCs, and newer terminal commands promptly supersede stale-session work.

Important Files Changed

Filename Overview
crates/openlogi-gui/src/bin/openlogi-overlay.rs Implements the warm radial overlay and now preserves terminal commands across reconnects while allowing newer session commands to supersede stale work.
crates/openlogi-agent-core/src/action_ring.rs Adds authoritative, expiring ring sessions with snapshotted actions and validated hover, activation, and cancellation.
crates/openlogi-agent/src/server.rs Exposes the ring session RPCs and dispatches validated activations through the shared action path.
crates/openlogi-agent/src/overlay.rs Adds supervision and packaged-binary discovery for the warm overlay helper.
crates/openlogi-core/src/binding/action_ring.rs Defines persisted ring layouts, slots, overrides, and presentation configuration.
xtask/src/commands/macos/bundle.rs Embeds and signs the overlay helper as a nested macOS application.

Sequence Diagram

sequenceDiagram
  participant Input as Device input
  participant Agent as OpenLogi agent
  participant Session as ActionRingManager
  participant Overlay as Overlay helper
  participant Dispatch as ActionDispatcher

  Input->>Agent: Show Actions Ring
  Agent->>Session: Begin snapshotted session
  Overlay->>Agent: Long-poll next_action_ring
  Agent-->>Overlay: Session ID and presentation slots
  Overlay->>Agent: Hover / activate / cancel
  Agent->>Session: Validate active session and slot
  Session-->>Agent: Snapshotted action
  Agent->>Dispatch: Execute selected action
Loading

Reviews (3): Last reviewed commit: "fix(gui): interrupt stalled ring request..." | Re-trigger Greptile

Comment thread crates/openlogi-gui/src/bin/openlogi-overlay.rs Outdated
@davidbudnick

Copy link
Copy Markdown
Collaborator

@jericho0521 Great work so far! 🎉 Can you ensure you update the PR and review comments from greptile-apps?

@davidbudnick davidbudnick added the type: feature New feature request label Aug 10, 2026
@davidbudnick

Copy link
Copy Markdown
Collaborator

@greptile-apps

Comment thread crates/openlogi-gui/src/bin/openlogi-overlay.rs
@davidbudnick

Copy link
Copy Markdown
Collaborator

@jericho0521 Great work on adding the config for the action ring!

Can you add a screen recording of the PR working locally on your computer?

Also a noticed some functionality in the following Logi youtube video; https://www.youtube.com/watch?v=sXXIQt9mjDQ

Did you cover most of the features of the OG product offering?

@davidbudnick davidbudnick modified the milestones: v0.6.25, v0.6.26 Aug 10, 2026
@jericho0521

Copy link
Copy Markdown
Contributor Author

Thanks! I’ll add a local screen recording.

Covered in this PR:

  • Assign Show Actions Ring to a supported mouse button.
  • Customizable eight-slot ring.
  • Shortcuts, application/path actions, and custom icon choices.
  • Active-app layout resolution.
  • Haptic Sense Panel feedback.

Not yet covered:

  • Per-application profile editing in the GUI.
  • Drag-and-drop editing.
  • Arbitrary icon uploads/recoloring.
  • Marketplace, plugins, and native app-specific tools.

This covers the core local-first workflow, but not full Options+ parity. The remaining features are better handled as follow-up work.

@jericho0521

Copy link
Copy Markdown
Contributor Author
Screen.Recording.2026-08-11.at.6.26.20.AM.mov

@jericho0521

Copy link
Copy Markdown
Contributor Author

@greptile-apps

@davidbudnick davidbudnick added the platform: all Cross-platform issue label Aug 13, 2026
@greptile-apps

greptile-apps Bot commented Aug 13, 2026

Copy link
Copy Markdown

Too many files changed for review (112 files, 100 file limit).

Bypass the limit by tagging @greptile-apps to review.

@davidbudnick
davidbudnick merged commit 896e09d into AprilNEA:master Aug 13, 2026
16 checks passed
tagawa0525 added a commit to tagawa0525/OpenLogi that referenced this pull request Aug 13, 2026
## Why
Gesture mode was a device-level property: exactly one button could own
it, chosen from a dedicated selector row above the mouse model. That
lock had no hardware basis — an MX Master can divert its gesture
button, its thumb wheel and OS-hook side buttons at once — and it put
gestures outside the flow every other binding uses, so assigning them
meant leaving the button you were editing.

## What
- Gesture mode becomes shape-driven in the config: any button carrying
  a Gesture-shaped map is in gesture mode, so the owner field and its
  transition shims are gone (with v3 migration materializing the old
  HID++ owner's seeded map).
- The action picker leads a gesture-capable button with a pinned
  "Gestures" entry; a gesture-mode button's popover gains a "Turn off
  gestures" footer. The device-level owner selector row is removed.
- Every gesture-mode HID++ source is armed in the capture plan, and
  every OS-hook gesture button dispatches — first hold wins, with hold
  takeover, overlap suppression and arm unwind across two sources.
- A demoted button's map is stashed so re-enabling restores its swipe
  arms, and a hold whose button-up was lost is recovered.

## Impact
openlogi-core config + migration, openlogi-agent-core gesture planning
and dispatch, openlogi-hid capture arming, openlogi-gui picker and
state. New "Gestures" / "Turn off gestures" strings in every locale.
Not runtime-tested on hardware — the two-source paths (gesture button
plus thumb wheel) still need a physical MX Master pass.

Merge resolution: reconciled with upstream's capability-driven actions
ring (AprilNEA#528) — the haptic panel's default is now Single(ShowActionsRing)
(still plain-diverted, not gesture mode), and the multi-source raw-XY
arming adopts upstream's original-reporting restore (ArmedCid) so
teardown hands every control back exactly as found.
tagawa0525 added a commit to tagawa0525/OpenLogi that referenced this pull request Aug 13, 2026
## Why
Gesture mode was a device-level property: exactly one button could own
it, chosen from a dedicated selector row above the mouse model. That
lock had no hardware basis — an MX Master can divert its gesture
button, its thumb wheel and OS-hook side buttons at once — and it put
gestures outside the flow every other binding uses, so assigning them
meant leaving the button you were editing.

## What
- Gesture mode becomes shape-driven in the config: any button carrying
  a Gesture-shaped map is in gesture mode, so the owner field and its
  transition shims are gone (with v3 migration materializing the old
  HID++ owner's seeded map).
- The action picker leads a gesture-capable button with a pinned
  "Gestures" entry; a gesture-mode button's popover gains a "Turn off
  gestures" footer. The device-level owner selector row is removed.
- Every gesture-mode HID++ source is armed in the capture plan, and
  every OS-hook gesture button dispatches — first hold wins, with hold
  takeover, overlap suppression and arm unwind across two sources.
- A demoted button's map is stashed so re-enabling restores its swipe
  arms, and a hold whose button-up was lost is recovered.

## Impact
openlogi-core config + migration, openlogi-agent-core gesture planning
and dispatch, openlogi-hid capture arming, openlogi-gui picker and
state. New "Gestures" / "Turn off gestures" strings in every locale.
Not runtime-tested on hardware — the two-source paths (gesture button
plus thumb wheel) still need a physical MX Master pass.

Merge resolution: reconciled with upstream's capability-driven actions
ring (AprilNEA#528) — the haptic panel's default is now Single(ShowActionsRing)
(still plain-diverted, not gesture mode), and the multi-source raw-XY
arming adopts upstream's original-reporting restore (ArmedCid) so
teardown hands every control back exactly as found.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

platform: all Cross-platform issue type: feature New feature request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Action Ring

2 participants