Universal FMC Keyboard Input is an X-Plane plugin that routes physical keyboard input to the FMC, FMS, or GPS command set of supported aircraft.
| Aircraft | Detection | Captain / first officer | Notes |
|---|---|---|---|
| Zibo 737 | B738 plus Zibo command probe |
Yes | Uses laminar/B738/button/fmc* commands |
| X-Plane default 737 | B738 without the Zibo probe |
Yes | Uses sim/FMS and sim/FMS2 |
| X-Plane default A330 | A330 |
Yes | Uses sim/FMS and sim/FMS2 |
| X-Plane default SR22 | SR22 |
Single system | Uses sim/GPS/gcu478 |
Unsupported aircraft are left untouched; their key events continue through X-Plane normally.
Copy the complete UniversalFMCKeyboardInput directory into:
X-Plane 11/Resources/plugins/
or:
X-Plane 12/Resources/plugins/
A release package has this layout:
UniversalFMCKeyboardInput/
├── lin_x64/UniversalFMCKeyboardInput.xpl
├── mac_x64/UniversalFMCKeyboardInput.xpl
├── win_x64/UniversalFMCKeyboardInput.xpl
├── LICENSE
├── README.md
└── VERSION
Bind either or both commands in X-Plane's keyboard or joystick settings:
Universal/FMC_Keyboard/Toggle_Keyboard_Input_Captain
Universal/FMC_Keyboard/Toggle_Keyboard_Input_FO
Invoking the active side's command again disables capture. Invoking the other side while capture is active switches sides without an intermediate disable. The first-officer command controls the same single GPS unit on the SR22.
When capture is active, a small KB:CAP, KB:FO, or KB:SR22 indicator appears at the bottom-right of X-Plane's global desktop.
The plugin handles letters, digits, space, Backspace/Clear, Delete, Enter, slash, period, plus, and minus where the aircraft exposes a matching command. Control- and Alt-modified shortcuts pass through. Key-up events and unsupported keys also pass through.
Plus and minus share one FMC command on the 737 and A330. The plugin tracks the expected sign independently for each side so repeated requests for the already-selected sign do not toggle it accidentally. The state resets whenever the aircraft or selected system changes.
Requirements:
- CMake 3.25 or newer
- A C++20 compiler
- The platform toolchain for Linux, macOS, or 64-bit Windows
Run the complete developer build and test workflow:
cmake --workflow --preset devThe installable platform package is written directly to:
build/dev/package/UniversalFMCKeyboardInput/
For an optimized build:
cmake --workflow --preset releaseOn macOS, a universal release can be configured explicitly before building:
cmake --preset release \
'-DCMAKE_OSX_ARCHITECTURES=x86_64;arm64' \
-DCMAKE_OSX_DEPLOYMENT_TARGET=11.0
cmake --build --preset release
ctest --preset releaseThe repository vendors only the SDK headers and import libraries required by this plugin. To use another X-Plane SDK installation:
cmake --preset dev -DXPLANE_SDK_ROOT=/absolute/path/to/XPSDK
cmake --build --preset dev
ctest --preset devLinux deliberately does not link against XPLM_64.so; X-Plane resolves the SDK symbols when it loads the plugin. The Linux ABI test verifies this and checks all five required plugin entry points.
src/core/ Pure aircraft, keyboard, routing, and state logic
src/xplane/ Thin XPLM lifecycle and UI adapter
tests/ Behavioral and binary ABI tests
third_party/ Minimal, licensed X-Plane SDK subset
.github/ CI and relevant issue forms
The core has no dependency on XPLM, which keeps behavior deterministic and directly testable. The adapter owns all X-Plane handles, callback registration, aircraft refresh, command lookup caching, and status-window lifecycle.
The plugin compiles against XPLM 2.00, 2.10, 3.00, and 3.01 declarations. It does not opt into XPLM 4-only APIs, preserving compatibility with X-Plane 11 while still using modern global-desktop windows.
Changing an aircraft's command names requires a code and test update. Missing target commands are not swallowed: the keyboard event passes through so another X-Plane handler can process it.
The plugin is released under the MIT License. The vendored X-Plane SDK subset remains under Laminar Research's SDK license in third_party/xplane-sdk/license.txt.