Documentation Index
Fetch the complete documentation index at: https://mintlify.com/ryzhpolsos/redeye/llms.txt
Use this file to discover all available pages before exploring further.
RedEye intercepts keyboard input system-wide using a low-level Windows keyboard hook (WH_KEYBOARD_LL). This means hotkeys registered in keyBindings.xml fire regardless of which application currently has focus — they are true global shortcuts. The hotkey configuration lives in a single file and is loaded from the root <config> element, outside the <layout> block.
The keyBindings.xml file
All hotkey definitions are wrapped in a <hotkeys> element. RedEye registers each <hotkey> child as a global key combination when LoadConfig() runs at startup.
<!-- config/keyBindings.xml -->
<hotkeys>
<!-- System UI hotkeys -->
<hotkey keys="Win" action="window.toggle(startMenu)"/>
<hotkey keys="Win+R" action="powerSearch.open()"/>
<!-- Launcher hotkeys -->
<hotkey keys="Win+T" action="shellExecute('cmd.exe')"/>
<hotkey keys="Win+B" action="shellExecute('http:')"/>
<!-- Block Win key side-effect on Win+L -->
<hotkey keys="Win+L" action=""/>
</hotkeys>
This file is imported from config.xml at the root level:
<config>
<layout>...</layout>
<import from="config/keyBindings.xml"/>
</config>
<hotkey> syntax
<hotkey keys="Modifier+Key" action="expression"/>
| Attribute | Required | Description |
|---|
keys | yes | The key combination as a +-separated string |
action | yes | An RWML expression to evaluate when the hotkey fires |
continue | no | "true" to let the key event pass through to other applications after the action runs (default: "false") |
multiActivate | no | "true" to fire repeatedly while keys are held (default: "false", fires once on key-up) |
Key names are separated by +. The following modifier names are recognized:
| Name | Maps to |
|---|
Win | Left or right Windows key |
Ctrl | Left or right Control key |
Alt | Left or right Alt key |
Shift | Left or right Shift key |
Letter keys are written as single uppercase characters: A–Z. Digit keys use their character: 0–9. Two special characters are also supported:
| Symbol | Key |
|---|
. | Period / full stop |
, | Comma |
Any other key name that is not in the modifier map is matched literally against the .NET Keys enum string (e.g. F1, Home, Insert, Space).
Key combination ordering
Modifiers and the triggering key can be written in any order in the keys attribute. RedEye sorts all keys alphabetically before comparing, so Win+R and R+Win are treated identically.
Default key bindings
These are the bindings shipped with RedEye:
| Keys | Action | Description |
|---|
Win | window.toggle(startMenu) | Open or close the start menu |
Win+R | powerSearch.open() | Open the PowerSearch launcher |
Win+T | shellExecute('cmd.exe') | Launch a Command Prompt |
Win+B | shellExecute('http:') | Open the default web browser |
Win+L | (empty) | Blocked — see note below |
Available action expressions
The action attribute accepts any RWML expression, including function calls with arguments:
Shell window functions
<hotkey keys="Win" action="window.toggle(startMenu)"/>
<hotkey keys="Win+Esc" action="window.hide(startMenu)"/>
<hotkey keys="Win+C" action="window.show(configUtil)"/>
| Expression | Description |
|---|
window.show(id) | Show a shell window by its id |
window.hide(id) | Hide a shell window by its id |
window.toggle(id) | Toggle a shell window’s visibility |
Launching programs
<hotkey keys="Win+T" action="shellExecute('cmd.exe')"/>
<hotkey keys="Win+B" action="shellExecute('http:')"/>
<hotkey keys="Win+N" action="shellExecute('notepad.exe')"/>
<hotkey keys="Win+E" action="shellExecute('explorer.exe')"/>
| Expression | Description |
|---|
shellExecute(path) | Launch a program or open a URL/file |
shellExecute(path, args) | Launch a program with command-line arguments |
shellExecuteHidden(path, args) | Launch without a visible window (for background commands) |
PowerSearch
<hotkey keys="Win+R" action="powerSearch.open()"/>
Shell control
<hotkey keys="Win+Ctrl+R" action="shell.restart()"/>
Window manager (when enabled)
<hotkey keys="Win+D" action="wapi.toggleAllWindows()"/>
<hotkey keys="Win+M" action="wapi.minimizeAllWindows()"/>
| Expression | Description |
|---|
wapi.minimizeAllWindows() | Minimize all tracked application windows |
wapi.restoreAllWindows() | Restore all minimized windows |
wapi.toggleAllWindows() | Toggle between minimized and restored for all windows |
The Win+L system binding
Win+L is a hardcoded Windows system shortcut that locks the workstation. Because it is processed by winlogon.exe before any keyboard hook can intercept it, RedEye cannot change what Win+L does. However, the empty-action entry in keyBindings.xml serves a different purpose: it prevents the Win key’s release from triggering the start menu toggle after you press Win+L.
<hotkey keys="Win+L" action=""/>
<!-- Win+L is a system keybind, so RedEye can't really change its action,
but this will block Win keybind from activating when Win+L is pressed -->
You cannot intercept or override Win+L with a custom action. The empty action="" only suppresses the secondary Win key-up event that would otherwise fire window.toggle(startMenu).
Adding your own bindings
Open config/keyBindings.xml and add <hotkey> elements inside <hotkeys>:
Open the bindings file
Edit config/keyBindings.xml in any text editor.
Add a hotkey element
Insert a new <hotkey> with your chosen key combination and action:<hotkey keys="Win+Shift+S" action="shellExecute('SnippingTool.exe')"/>
Restart the shell
Changes take effect only after a shell restart. Run shell.restart() from PowerSearch or from a bound hotkey if you have one:<hotkey keys="Win+Ctrl+R" action="shell.restart()"/>
<keyHandler> for raw key events
In addition to <hotkey>, you can register a <keyHandler> to receive every individual key event and decide whether to pass it through. Key handlers run before hotkeys and receive two context variables: ${keyName} (the .NET Keys enum name for the pressed key) and ${isUp} ("true" on key-up, "false" on key-down):
<hotkeys>
<keyHandler action="..." continue="true"/>
</hotkeys>
A <keyHandler> fires on every keystroke system-wide, including inside other applications. Keep the action expression lightweight and always set continue="true" unless you deliberately want to consume the key event globally.