openQ4 supports Steam Deck through the dedicated openQ4-steamdeck launcher shipped in Linux packages as of March 30, 2026.
- Use
openQ4-steamdeckinstead ofopenQ4-client_x64. - The launcher adds
+set com_platformProfile steamdeck, exportsOPENQ4_STEAMDECK=1, and preserves any extra command-line arguments you pass. - Native Wayland is the default SDL choice when available. To force the old XWayland fallback path, launch with
OPENQ4_FORCE_X11=1; the dedicated launcher and direct client launches both honor it unless an explicit SDL video-driver override is already set. - If native Wayland hits a libdecor startup or window-decoration issue on a specific compositor stack, launch with
OPENQ4_WAYLAND_DISABLE_LIBDECOR=1. - If you launch
openQ4-client_x64directly on a Steam Deck or SteamOS host, openQ4 auto-selects thesteamdeckplatform profile whencom_platformProfileis stilldefault. SetOPENQ4_NO_STEAMDECK_AUTODETECT=1orOPENQ4_DISABLE_STEAMDECK_AUTODETECT=1to disable that fallback.
Default gameplay bindings shipped by the stock openQ4 config:
JOY15= attackJOY16= zoomJOY3= jumpJOY4= crouchJOY6= reloadJOY5= flashlightJOY1= weapon wheelJOY2= last weaponJOY13= run toggle / walk modifierJOY18= show objectives / scoresJOY19= jump if exposed as right rear paddle 1JOY20= crouch if exposed as left rear paddle 1JOY21= reload if exposed as right rear paddle 2JOY22= weapon wheel if exposed as left rear paddle 2
Menu behavior:
JOY7andJOY8both open the in-game menu;JOY17also opens the menu when the OS delivers the Guide button to the game.JOY3selects the focused menu item, whileJOY4,JOY7, andJOY8back out of menus.- The D-pad is reserved for menu focus movement whenever a menu is open, even though those same buttons also have gameplay bindings.
- The movement stick can also move menu focus, and holding the D-pad, movement stick, or shoulder buttons repeats navigation/scrolling for longer lists.
- Extra
JOY23throughJOY32andAUX1throughAUX16buttons are bindable but left unbound by default for user customization.
Tuning and haptics:
- Controller rumble is driven from Quake 4 sound shake/rumble metadata during gameplay.
- Use
in_joystickRumble 0to disable motor output, or tune strength within_joystickRumbleScale. - The Steam Deck profile sets
in_joystickLowBatteryRumbleThreshold 20andin_joystickLowBatteryRumbleScale 0.75, which caps effective rumble output while SDL reports a controller battery at or below 20 percent. This does not rewrite your configured rumble strength. - The Steam Deck profile enables native SDL gyro aiming with a conservative
in_gyroSensitivity 0.20; raise or lower that cvar if gyro aim feels slow or fast. in_touchpadMode 1routes gamepad touchpad motion to menu/console cursor movement. Usein_touchpadMode 2for touchpad mouse-look,0to disable touchpad motion, or3to leave touchpad motion off while keeping touchpad button binds.in_touchscreen 1routes direct touchscreen taps and drags to menus, console, and loading-continue input when SDL delivers native touch events.- The in-game menu exposes controller controls under
Settings -> Game Options -> Controller, including stick layout, radial dead-zone, look sensitivity, look curve, invert-look, trigger threshold, rumble tuning, gyro, touchpad mode, touchscreen input, and low-battery rumble caps. - For the full input settings guide, see input-settings.md.
For native Steam Deck testing, use a Steam Input profile that exposes the Deck as a gamepad with its gyro and touchpad capabilities available to SDL. Steam-level gyro-to-mouse or touchpad-to-mouse mappings can still be useful for users, but they hide those inputs from openQ4's native in_gyro and in_touchpadMode paths.
If a build expects native touchscreen or multi-touch events, enable Touch API pass-through in the Steamworks/partner configuration. Without that partner-side setting, Steam may deliver touch as mouse emulation instead of SDL touchscreen events.
Run listControllers from the console when diagnosing Deck input. It prints the active SDL gamepad/joystick, GUID, type, path, power state, touchpad count, sensor capability, gyro/touchpad cvars, touchscreen routing, and low-battery rumble state. Save the log output with bug reports when gyro, touchpad, touchscreen, or rumble behavior is unclear.
- When the Steam Deck profile is active,
com_steamDeckAutoFrameCap 1applies a Deck-friendlycom_maxfpsonly ifcom_maxfpsis still the global default of240. - The automatic cap uses SDL's current display refresh and clamps it to the Deck-oriented
40..90range. LCD Deck sessions normally land on60; OLED or higher-refresh sessions can land higher. - Set
com_maxfpsyourself to preserve a specific cap. Setcom_steamDeckAutoFrameCap 0to disable the automatic default, or setcom_steamDeckFrameCapto a nonzero value to choose the Deck default cap explicitly.
Shadow maps run well on Deck-class hardware with a bounded update budget. Recommended settings:
seta r_shadows 1
seta r_useShadowMap 1
seta r_shadowMapSize 1024
seta r_shadowMapPointSize 512
seta r_shadowMapCSM 1
seta r_shadowMapCascadeCount 3
seta r_shadowMapMaxUpdatesPerView 2
vid_restartWith the update budget set, the renderer spends each frame's shadow renders on the most important stale lights and serves the rest from the resident cache, so shadow cost stays bounded in dense scenes. See docs/user/shadow-mapping.md for the full settings reference.
Linux Steam auto-discovery checks these roots and then expands any additional library folders from libraryfolders.vdf:
OPENQ4_STEAM_ROOT/OPENQ4_STEAM_ROOTSSTEAM_COMPAT_CLIENT_INSTALL_PATH$XDG_DATA_HOME/Steam~/.steam/steam~/.steam/root~/.local/share/Steam~/.var/app/com.valvesoftware.Steam/.local/share/Steam
openQ4 then looks for steamapps/common/Quake 4 under each Steam library root.
For deterministic testing, set OPENQ4_QUAKE4_PATH or OPENQ4_QUAKE4_ROOT to the Quake 4 install root directly, or set OPENQ4_STEAM_LIBRARY / OPENQ4_STEAM_LIBRARIES to Steam library roots that contain steamapps/common/Quake 4. On Linux, multiple roots may be separated with : or ;.
- Steam Deck support is still profile-driven, but the engine now has a Deck/SteamOS fallback detector for direct client launches.
- Suspend/resume and foreground/background SDL events release captured input, stop rumble, write the current config, and reacquire controllers when the app returns.
- Native Wayland is supported through the SDL3 backend; XWayland remains available through
OPENQ4_FORCE_X11=1or explicit SDL video-driver environment variables. OPENQ4_WAYLAND_DISABLE_LIBDECOR=1is available as a native Wayland troubleshooting switch for compositor/libdecor problems.- The developer-facing Deck QA checklist lives in ../dev/steam-deck-qa.md.