Skip to content

feat: Improve Actions Ring latency, shape, positioning, and focus behavior - #649

Open
the-long-ride wants to merge 4 commits into
AprilNEA:masterfrom
the-long-ride:feat/actions-ring-picker
Open

feat: Improve Actions Ring latency, shape, positioning, and focus behavior#649
the-long-ride wants to merge 4 commits into
AprilNEA:masterfrom
the-long-ride:feat/actions-ring-picker

Conversation

@the-long-ride

@the-long-ride the-long-ride commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Summary

Hi, I want OpenLogi also help MX Master 2/3 user like me also can use action rings.

Improve the Actions Ring overlay so it behaves like a lightweight native gesture overlay instead of a normal application window.

This keeps the existing Actions Ring interaction semantics while reducing startup latency, fixing DPI/positioning issues, tightening the overlay to the visible ring, and ensuring it appears above the application currently being used without stealing focus.

Changes

  • Add ShowActionsRing as a selectable system action.
  • Keep a persistent warm overlay process/window instead of creating a new overlay window for every invocation.
  • Preserve the existing toggle behavior:
    • first trigger opens the Actions Ring
    • second trigger while visible dismisses it
    • a later trigger can open it again
  • Reduce the overlay from the previous oversized transparent window to the actual ring size.
  • Make the visible ring fill the overlay bounds.
  • Remove the unnecessary outer inset/shadow area.
  • Add a circular native hit region on Windows so transparent corners are not clickable.
  • Derive the Windows region from the actual native HWND size instead of a hard-coded pixel diameter, keeping it correct under display scaling.
  • Fix warm-window initialization so GPUI establishes the correct native size before the HWND is hidden and reused.
  • Fix cursor-centered placement across monitors with different DPI settings.
  • Handle GPUI/Windows WM_DPICHANGED behavior when moving the persistent overlay between monitors.
  • Keep the overlay hidden while intermediate DPI/position adjustments happen
    to avoid visible jumps or rectangular flashes.
  • Show the Actions Ring relative to the currently focused application instead of making it permanently always-on-top.
  • Keep the previously focused application active while the Actions Ring is displayed and interacted with.

Now it will be like this:
image

Platform behavior

Windows

  • Position the ring directly above the current foreground window in Z-order.
  • Do not make the overlay permanently HWND_TOPMOST.
  • Use non-activating window behavior so the foreground application retains keyboard focus.
  • Preserve the circular native window/input region.
  • Keep DPI-aware placement and sizing.

macOS

  • Reuse the persistent overlay window.
  • Order the Actions Ring above the frontmost application's relevant window.
  • Preserve the non-activating panel behavior so the current application remains focused.

Linux / X11

  • Reuse the persistent overlay.
  • Resolve _NET_ACTIVE_WINDOW and stack the ring directly above the active application's root-level window.
  • Do not request keyboard focus.

Linux / Wayland

  • Keep the existing safe compositor-managed fallback.
  • Do not assume access to global window ordering, since Wayland does not expose
    the same relative Z-order controls as Windows, macOS, or X11.

Why

The previous overlay behavior had several issues:

  • creating/showing the ring could feel slower than necessary
  • the native window was larger than the visible circle
  • transparent corners could still participate in input handling
  • hard-coded native dimensions broke under Windows display scaling
  • moving the warm window between monitors could conflict with GPUI's WM_DPICHANGED handling
  • a hidden GPUI window did not initially have the requested native dimensions
  • preserving the existing Z-order could leave the ring behind the currently focused application
  • using a globally topmost window would unnecessarily place the ring above unrelated floating/system windows

The updated implementation keeps the overlay warm, sizes and positions it using its actual native bounds, and only elevates it as much as needed to appear above the application the user is currently working in.

Focus behavior

Opening or clicking the Actions Ring must not move keyboard focus away from the application that was active before the ring appeared.

For example:

Other window
Actions Ring
Focused application  <- remains active
Other windows

Related issues:

@greptile-apps

greptile-apps Bot commented Aug 16, 2026

Copy link
Copy Markdown

Greptile Summary

The PR makes the Actions Ring selectable and replaces per-invocation overlay construction with a persistent, non-activating native window where supported.

  • Adds platform-specific cursor placement, window shaping, and foreground-relative stacking on Windows, macOS, and X11.
  • Adds session-aware dismissal and timeout handling for reused overlay windows.
  • Adds post-hold gesture hysteresis and picker/catalog coverage for the Actions Ring.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
crates/openlogi-gui/src/platform/overlay.rs Adds native warm-window support, DPI-aware placement, circular shaping, non-activating behavior, and foreground-relative stacking across supported desktop platforms.
crates/openlogi-gui/src/bin/openlogi-overlay.rs Reworks the overlay lifecycle around a reusable RingView with session-safe installation, dismissal, timeout, and cold-window fallback paths.
crates/openlogi-core/src/binding/swipe.rs Adds post-hold movement hysteresis so pre-gate drift cannot become a swipe after one small late sample.
crates/openlogi-core/src/binding/action.rs Makes ShowActionsRing available through the normal action catalog while preserving recursive-ring rejection.
crates/openlogi-gui/Cargo.toml Adds target-specific native-window dependencies required by the new Windows, macOS, and X11 overlay implementations.
Cargo.lock Records the target-specific dependency additions without changing the versions associated with the reviewed advisory leads.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  Trigger[Actions Ring invocation] --> Backend{Warm window supported?}
  Backend -->|Yes| Install[Install invocation into retained RingView]
  Install --> Position[Position and shape native window]
  Position --> Stack[Stack above active application without activation]
  Stack --> Show[Show ring and register live session]
  Backend -->|No / Wayland| Cold[Create temporary GPUI window]
  Cold --> Show
  Show --> End{Click, second trigger, click-away, or timeout}
  End -->|Warm| Hide[Clear session and hide native window]
  End -->|Cold| Remove[Remove temporary window]
Loading

Reviews (5): Last reviewed commit: "fix failed tests" | Re-trigger Greptile

Comment thread crates/openlogi-gui/src/platform/overlay.rs
@the-long-ride

Copy link
Copy Markdown
Contributor Author

Hi @AprilNEA and @davidbudnick ,
I want to implement the new features like:

  • allow user to use macro with OS's script like powershell, bash, etc. to bind it in the action option list.
  • instead of current only open 1 app or url or folder, I want to open a set of them
    So, what do think about them, if you agree I'll create PR for them in the future.

Comment thread crates/openlogi-gui/src/platform/overlay.rs Outdated
the-long-ride and others added 4 commits August 17, 2026 10:28
I want OpenLogi also help MX Master 2/3 user also can use action rings.
I also want to make the action rings UX/UI better but trade off is RAM 50MB RAM usage for keep overlay running in background
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
@the-long-ride
the-long-ride force-pushed the feat/actions-ring-picker branch from 8702660 to e679190 Compare August 17, 2026 03:28
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.

1 participant