Repository navigation
Bannerlator 3.1.7-pre3
Pre-releaseBannerlator 3.1.7-pre3
Run Windows apps and games on Android — no PC and no root required.
3.1.7-pre3 is the controller release. Controller input now runs on BANNERIN, a new Rust transport written for Bannerlator: sticks stop the moment you let go, XInput games can read the pad directly, and the controller's settings can be changed while the game runs. DirectInput games can now vibrate the controller, and save backups finally include the saves that Steam emulators keep outside your user folder.
- BANNERIN controller input: stick updates follow the game's frame rate (at most 60 a second by default), so a fast spin no longer keeps moving after you let go; idle controllers no longer wake the CPU.
- Direct XInput: XInput games can read the controller straight from BANNERIN — 32-bit, 64-bit and ARM64X — with rumble on one or both motors. Off by default for now; one switch turns it on, also in game.
- Live controller settings: controller type, XInput source, DirectInput visibility and stick updates in the in-game menu (Controls › Pad), without restarting the game.
- DirectInput vibration: DirectInput games get force-feedback effects on the pad, mixed into its two motors. On by default.
- Save backups: game and container backups now include emulator saves such as
ProgramData/Steam/<name>/<app id>.
New to BANNERIN? Tap the box below for a one-picture explanation of old vs new.
👉 🔍 OLD SYSTEM vs NEW — tap here to see what changed for your controller
In one sentence: same controller, same Wine — but a smarter pipe in between: sticks stop when you let go, plus a direct XInput shortcut, controller settings you can change while playing, more controller types and DirectInput vibration.
OLD SYSTEM NEW SYSTEM (BANNERIN)
---------- ---------------------
Your controller Your controller
| |
v v
Bannerlator app Bannerlator app
| |
v v
old pipe ("mmap ring") BANNERIN pipe (new, Rust)
every stick wiggle sent stick moves sent at the game's
at once, 500 a second own pace, up to 60/s
| |
v +----------------------+
Wine's controller layer Wine's controller layer Direct XInput
| | (optional, straight
v v to the game)
Wine's input queue (holds 32) Wine's input queue |
<- filled up when spinning fast, <- never overfills now |
so sticks kept moving after | |
you let go v |
| Wine's XInput / DirectInput |
v | |
Wine's XInput / DirectInput v v
| GAME <--------------------+
v
GAME
| Old system | New (BANNERIN) | |
|---|---|---|
| Fast stick spin, then let go | kept moving for a few seconds | stops at once |
| Button presses | instant | instant (never delayed) |
| Route for XInput games | always through Wine | Wine or Direct — your choice |
| Change controller settings while playing | no (restart needed) | yes — Controls › Pad in the in-game menu |
| Controller type games see | Generic only | Generic, Xbox 360 / One / Series, PlayStation, Switch, Steam Deck… |
| Phantom extra controllers | games saw 4 controllers | only the real ones |
| Vibration in XInput games | yes | yes, plus a Single motor option |
| Vibration in DirectInput games | no | yes (on by default) |
| Idle controller | woke the CPU constantly | sleeps (saves battery) |
| Games with their own XInput file (e.g. Dark Souls) | worked | still works, handled automatically |
| Save backups | missed emulator saves | include them |
✅ Nothing to set up. Controllers switch to BANNERIN automatically; your containers and games keep their settings.
⬇️ Small update. On 3.1.6 or 3.1.7-pre2 the in-app updater downloads about 22–23 MB instead of the whole app (about 528 MB). Older versions, first installs and this page give the full APK.
What's New — since 3.1.7-pre2
🎮 BANNERIN — new controller input
The way the app hands controller input to Wine has been replaced with BANNERIN, written from scratch in Rust for Bannerlator.
- Sticks stop when you let go. Stick updates now follow the game's own frame rate, at most 60 a second by default, so a game that reads input slowly never falls behind. Spinning a stick fast and letting go stops the movement at once.
- Buttons are never delayed — only stick-only updates are paced.
- Idle controllers no longer wake the CPU, and a game that starts helper processes keeps its controller.
- No phantom controllers: games list only the controllers you actually have (before, four were always shown).
🕹️ Direct XInput
- XInput games read the controller straight from BANNERIN instead of through Wine's XInput, with no input queue in between — for 32-bit and 64-bit games and Wine's own ARM64 programs (one ARM64X DLL).
- Off by default in this pre-release. Turn it on with Direct XInput (BANNERIN) in a container's or a game's Controller settings, or live in game: Controls › Pad › XInput source › Direct. Allow in-game switching (on by default) keeps that switch available without a restart.
- Rumble goes to the controller directly. Rumble motors: Both or Single — one motor, for handhelds whose sticks slow down while both vibrate. Single is the default on the AYANEO Pocket FIT's built-in controller, Both everywhere else.
- A game's own XInput DLL (for example Dark Souls Remastered) no longer stops its controls: Bannerlator uses Wine's XInput for it and tells you once. A new per-game option, Use Direct XInput over the game's own XInput DLL, moves the game's copy aside while it plays and always puts it back.
🎛️ Controller settings in game
The in-game menu has a new Controls › Pad tab. Changes apply while the game runs; ones that need it reconnect the controller for about a second.
- Controller type: Generic, Xbox 360, Xbox One, Xbox Series X|S or a classic DirectInput pad, plus (experimental) DualShock 4, DualSense, Switch Pro, a Joy-Con pair and Steam Deck — games see that controller (names, button prompts). PlayStation types keep the pad (Wine's hidraw is turned off for them). Switching to or from the classic DirectInput pad applies at the next launch.
- XInput source: Direct (BANNERIN) or Wine's XInput.
- DirectInput games can see the controller: visible or hidden (one switch replaces the old XInput / DirectInput options).
- Stick updates: Auto (up to N a second), Fixed or Unpaced, set with − / + buttons.
- Changes are saved for this game by default, or for the container.
- The same settings are in the container editor, a game's Controller tab, the Deck settings and the XMB, each with a ? help.
📳 DirectInput vibration
DirectInput games could not vibrate the controller: it only offered plain rumble, so Wine reported no force feedback. Now it offers DirectInput effects — constant force, ramp, sine, square, triangle and sawtooth — and BANNERIN mixes the playing effects into the two motors, with their timing, fades and strength.
- Steady forces fade after about 2 seconds if they don't change, so a racing game's steering forces don't buzz forever.
- On by default. DirectInput vibration in the container, the game's Controller tab, the Deck, the XMB and Controls › Pad (reconnects the controller).
- XInput rumble — Direct or Wine's — works as before.
💾 Save backups that include emulator saves
Many Steam emulators keep saves and achievements outside your user folder, and backups only copied the user folder, so those saves were never backed up.
- Container backups now also take every
ProgramData/Steam/<name>/<app id>,Users/Public/Documents/Steam/<group>/<app id>, OnlineFix and EMPRESS folder. - A game's backups (incl. the automatic one at the end of a session) take that game's emulator folders, found by its Steam app id (from the game, or the emulator's ini or
steam_appid.txtbeside it), plus its Goldberg / GSE and EMPRESS folders. - Restore puts them back where they were. Older backups restore as before.
🧭 Smaller fixes
- Side menu: Back and a tap beside it close it on every screen (the container editor's didn't).
- Headless Steam: accepts Valve's Steam build 1791918634, checks itself before use, and reads the client's zip correctly.
⚠️ Known issues
- BANNERIN is new — if a controller misbehaves in a game, please report it with the game and the controller type.
- Wine 9.5 (and other older Wine builds): Game Controllers' DInput tab lists the effects but can't play them — a bug in that Wine's control panel; Proton 11's plays them. Games are not affected.
- XInput source = Wine + DirectInput visible: Wine's own XInput then ignores the controller (that's what "visible" tells it). Direct XInput is not affected.
- Everything listed under 3.1.7-pre2's known issues still applies.
🙏 Credits (tap to expand)
BANNERIN (controller transport, force-feedback engine and the BANNERIN XInput DLLs) is original work written for Bannerlator. The evdev layer it plugs into comes from Winlator by brunodev85; Direct XInput's forward mode uses Wine's own XInput, and Wine's SDL bus and DirectInput carry the controller and its force feedback. The XInput DLLs are built with llvm-mingw (Martin Storsjö) and checked under Hangover and FEX-Emu.
Everything credited in 3.1.7-pre2, 3.1.7-pre1 and 3.1.6 still applies: DroidDeck (component recommendations), Sora and Nunito Sans (SIL Open Font License), Headless Steam and the Steam bridge, the SSBS fix (Wine MR 12262 by Jacek Caban, found by Sonicadvance1), the Mali PanVK work (FristOneRR), winhandler.exe (Winlator by brunodev85), box64 (ptitSeb), FEX-Emu, DXVK, VKD3D-Proton, Wine, Proton / GE-Proton, SDL, SteamKit2 and Wayland.
Entirely app-side — no ImageFS reinstall. Install over 3.1.6, 3.1.7-pre2 or any earlier 3.1.x; everything carries over.
