Skip to content

Modes overview ​

Think of KeySteer as three operating layers: Idle waits quietly, Normal handles everyday movement and clicking, and a targeting mode helps you find an exact target.

---
config:
    layout: dagre
    look: classic
    flowchart:
        curve: linear
        nodeSpacing: 24
        rankSpacing: 44
---
flowchart LR
    idle("Idle<br/>Standby"):::mode-step
    normal("Normal<br/>Everyday control"):::mode-primary
    grid("Grid<br/>Screen regions"):::mode-step
    rg("Recursive Grid<br/>Precise targeting"):::mode-step
    bs("Bisect<br/>Directional halves"):::mode-step
    ui("UI Hint<br/>Controls and text"):::mode-step
    idle -->|"Primary+E"| normal
    normal -->|G| grid
    normal -->|F| ui
    normal -->|"Primary+G"| rg
    normal -->|"Primary+F"| bs
    class idle diagram-blue
    class normal diagram-violet
    class grid diagram-green
    class rg diagram-amber
    class bs diagram-cyan
    class ui diagram-rose

All four targeting modes return to Normal with Esc or Primary+Q. In Normal, press Esc or q to return to Idle.

Which mode should I choose? ​

Your goalRecommended modeWhy
Move, scroll, click, or drag directlyNormalBest for everyday control.
Reach a screen area quicklyGridDoes not rely on application accessibility information.
Precisely target a small button or iconRecursive GridKeeps subdividing the current area.
Narrow with direction keys, without labelsBisectHalves only width or height per press.
Find a button, link, menu, or inputUI HintLabels controls from the accessibility tree or visual recognition.
Arrange windows, group tabs, or restore a workspaceWindowMove one window or build a reusable layout.

Idle: quiet waiting ​

Idle is the startup state. It listens only for entries in [hotkeys] and does not intercept normal typing. The usual entry is Primary+E: Command+E on macOS and Alt+E on Windows unless you override the Primary alias.

You can start any Mode directly from Idle:

toml
[hotkeys]
"primary+e" = "normal"
"primary+g" = "grid"

Keep at least one entry key.

Temporarily use Normal ​

Need a small pointer adjustment while targeting? Hold Primary to use Normal movement, scrolling, and clicks. Release it to continue selecting.

These are Grid's default settings. Recursive Grid, Bisect and UI Hint work the same way:

toml
[grid]
inherits = ["hotkeys", "normal"]
temporary_mode = "normal"
temporary_mode_keys = ["primary"]

The temporary layer consumes its activation keys: Primary+H uses Normal's H movement binding. Explicit full chords in the current mode remain available, such as Primary+Q to return to Normal. See Temporary input layers to change the modifier or resolve conflicts.

End states ​

After locating a target, return to Normal or keep working in the selected area. Configure this with lifecycle:

toml
[grid.lifecycle]
after_finish = "normal"
after_click = "finish"
FieldWhen it applies
after_finishThe last grid level or a complete label finishes targeting
after_clickA click made through KeySteer succeeds; physical mouse clicks do not trigger it
ValueEffect
keepKeep the mode and current selection
restartStay in the mode and start selecting again
Mode name, such as normal or idleSwitch to that mode
finishFollow after_finish; only valid for after_click
left_click / right_click / middle_click / double_clickClick as soon as targeting finishes; only valid for after_finish

Default behavior

Grid and UI Hint return to Normal after locating or clicking. Recursive Grid and Bisect keep the current area so you can subdivide it further.

Multiple displays ​

Grid, Recursive Grid and Bisect target the display containing the pointer by default. The built-in Screen Selector plugin uses Primary+S to move to another display and can preserve the current targeting path.

Important ​

Elevated windows may reject input

Windows Task Manager and other elevated windows may reject simulated input. When that happens, KeySteer releases its input state and returns to Idle.