[Desktop] Add reset and snap-to-position controls for floating Pad and voice mode

Open 💬 0 comments Opened Aug 5, 2026 by BobbyWang0120

Summary

The Codex desktop app’s floating Pad and voice-mode control can be dragged freely, but there is no way to reset it to a known default position or align it precisely to common screen locations.

Current behavior

  • The floating Pad/voice control can be dragged anywhere.
  • After moving it, users must manually position it by eye.
  • There is no Reset position action.
  • There are no docking or snap targets, so the control can end up at an arbitrary, slightly misaligned location.

Requested behavior

  1. Add a Reset position action that returns the control to its default location, preferably bottom-center.
  2. Add optional snap/dock targets at:
  • bottom-center
  • center-left
  • center-right
  • top-left
  • top-right
  • bottom-left
  • bottom-right
  1. While dragging near a target, show a subtle shadow or ghost preview indicating the final aligned position.
  2. When released near a target, snap the control into that position.
  3. Preserve free placement when released away from a target.
  4. Apply the behavior consistently to both the regular floating Pad and the voice-mode floating control.
  5. For multiple displays, reset and snap relative to the display containing the control, while respecting the menu bar, Dock, and safe screen margins.

Why this would help

The floating control is useful, but developers and other users often prefer screen elements to be predictably aligned. Reset and snapping would make placement tidy, repeatable, and recoverable without requiring pixel-perfect manual dragging.

Suggested acceptance criteria

  • A user can restore the floating control to bottom-center with one action.
  • All seven predefined targets provide a visible drag preview.
  • Releasing near a target results in consistent alignment.
  • Moving between displays does not place the control off-screen.
  • Pad and voice mode share the same positioning behavior.

View original on GitHub ↗