Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
16e110c
Add retro console emulation backend (libretro) alongside the Wine path
maxjivi05 Jul 13, 2026
1093ce1
Add in-game retro drawer menu and per-system gated emulator settings
maxjivi05 Jul 13, 2026
31a0074
Restyle retro in-game drawer and settings to match the PC surfaces
maxjivi05 Jul 13, 2026
566b822
Style retro on-screen controls in the GameHub glass look by default
maxjivi05 Jul 13, 2026
bedc104
Fix retro overlay placement, drawer sizing parity, recency sort, and …
maxjivi05 Jul 13, 2026
5ae45bb
Lay out retro Library Artwork pickers in a 2x2 grid like PC settings
maxjivi05 Jul 13, 2026
f6b8081
Raise Start/Select pills further above the face buttons and align Men…
maxjivi05 Jul 13, 2026
65a7df6
Make the retro drawer's first action a Pause/Resume toggle that pause…
maxjivi05 Jul 13, 2026
bc2b740
Let the ROM import dialog change the detected console
maxjivi05 Jul 13, 2026
8bccdfa
Match retro overlay button sizes and stroke weight to the PC GameHub …
maxjivi05 Jul 13, 2026
96cfa2a
Improve physical controller support for retro games
maxjivi05 Jul 13, 2026
680b75c
Align the retro in-game drawer with the PC xservermenu and add a retr…
maxjivi05 Jul 13, 2026
75a6fb9
Use the real draggable FrameRating HUD for retro games
maxjivi05 Jul 13, 2026
3108342
Draw the retro drawer above the performance HUD and make menu cards p…
maxjivi05 Jul 13, 2026
169a8b0
Fix launch crash when the retro HUD is enabled at startup
maxjivi05 Jul 13, 2026
27c48a9
Merge branch 'main' into feature/retro-console-emulation
maxjivi05 Jul 14, 2026
02ceac0
Raise touch controls, add portrait mode for handhelds, and fix retro …
maxjivi05 Jul 14, 2026
e9b108f
Cap the retro drawer height in portrait to its landscape size instead…
maxjivi05 Jul 14, 2026
9ba206c
Rework the N64 touch layout
maxjivi05 Jul 14, 2026
a351397
Add N64 C buttons to the touch overlay
maxjivi05 Jul 14, 2026
3f5bc87
Tune N64 overlay spacing
maxjivi05 Jul 14, 2026
ed3f95d
Vendor LibretroDroid, fix hardware-core shader switching, add SGSR up…
maxjivi05 Jul 14, 2026
abf942f
Add vertical console ribbons to retro game cards in the library
maxjivi05 Jul 14, 2026
27970ad
Fix layout clipping on retro console spine ribbons and apply console-…
maxjivi05 Jul 14, 2026
206e3ad
Merge branch 'WinNative-Emu:main' into feature/retro-console-emulation
maxjivi05 Jul 14, 2026
fc4b936
Use one uniform color for all retro console ribbons
maxjivi05 Jul 15, 2026
660a909
Allow full rotation for retro games with per-system portrait layouts
maxjivi05 Jul 15, 2026
948becf
Add HUD tab to retro drawer, wrap oversized HUD rows, count only real…
maxjivi05 Jul 15, 2026
94682d3
Chain SGSR passes with selectable upscale up to native resolution
maxjivi05 Jul 15, 2026
8cd83ca
Move HUD tab after Display and show HUD elements as chip toggles
maxjivi05 Jul 15, 2026
b9b3230
Hit-test overlay buttons before the dpad grab zone
maxjivi05 Jul 15, 2026
508db01
Make SGSR a stackable toggle that runs after the selected video filter
maxjivi05 Jul 15, 2026
3fb0e63
Give retro touch controls authentic per-console themes with 3D button…
maxjivi05 Jul 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ app/src/main/assets/imagefs.tzst filter=lfs diff=lfs merge=lfs -text
app/src/main/assets/imagefs.part*.tzst filter=lfs diff=lfs merge=lfs -text
reference/tooling/jadx.zip filter=lfs diff=lfs merge=lfs -text
reference/tooling/jadx/lib/jadx-1.5.3-all.jar filter=lfs diff=lfs merge=lfs -text

app/src/main/jniLibs/arm64-v8a/*_libretro_android.so filter=lfs diff=lfs merge=lfs -text
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
[submodule "app/src/main/cpp/adrenotools"]
path = app/src/main/cpp/adrenotools
url = https://github.com/Pipetto-crypto/libadrenotools.git
[submodule "libretrodroid/src/main/cpp/oboe"]
path = libretrodroid/src/main/cpp/oboe
url = https://github.com/google/oboe
[submodule "libretrodroid/src/main/cpp/libretro/libretro-common"]
path = libretrodroid/src/main/cpp/libretro/libretro-common
url = https://github.com/libretro/libretro-common
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,24 @@ Designed for enthusiasts and power users, WinNative delivers the full Winlator e

---

### Retro Console Support

WinNative can also run classic console games alongside your PC library. Retro games live in the same Library and launch just like PC games, but run on an embedded libretro backend instead of Wine.

Supported systems (bundled cores):

| System | Core | ROM extensions |
| --- | --- | --- |
| NES | FCEUmm | `.nes` `.unf` `.unif` |
| SNES | Snes9x | `.smc` `.sfc` `.swc` `.fig` |
| Game Boy / Color | Gambatte | `.gb` `.gbc` |
| Game Boy Advance | mGBA | `.gba` |
| Genesis / Mega Drive, Master System, Game Gear | Genesis Plus GX | `.gen` `.md` `.smd` `.sms` `.gg` |
| Nintendo 64 | Mupen64Plus-Next | `.n64` `.z64` `.v64` |
| PlayStation | PCSX-ReARMed | `.cue` `.chd` `.pbp` `.m3u` `.iso` |

**How to use:** In the Library, tap **Add Custom Game** and select a ROM instead of an `.exe`. WinNative detects the console and adds the game to your Library. Tap **Play** to launch it with on-screen touch controls and physical gamepad support; the in-game menu (Back button or on-screen **MENU**) offers save/load state, reset, and fast-forward. PlayStation BIOS files (e.g. `scph5501.bin`) can be placed in the app's `files/retro/system` folder for better compatibility.

### Contributing

We welcome community contributions! Feel free to open a pull request for bug fixes, driver updates, UI improvements, or anything else you'd like to add.
Expand All @@ -56,3 +74,5 @@ Please match the existing code style and ensure any AI-assisted code is thorough
- **Pluvia** features by the [Pluvia](https://github.com/oxters168/Pluvia) / [GameNative](https://github.com/utkarshdalal/GameNative) community
- **Mesa/Turnip** contributions by the [Mesa3D](https://www.mesa3d.org/) team
- **Goldberg Steam Emulator** by [Mr. Goldberg](https://gitlab.com/Mr_Goldberg/goldberg_emulator), maintained by [Detanup01](https://github.com/Detanup01/gbe_fork)
- **LibretroDroid** by [Filippo Scognamiglio](https://github.com/Swordfish90/LibretroDroid) (GPL-3.0) — the embedded libretro host for retro console support
- **libretro / RetroArch** and the individual core authors (FCEUmm, Snes9x, Gambatte, mGBA, Genesis Plus GX, Mupen64Plus-Next, PCSX-ReARMed)
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,8 @@ dependencies {
implementation libs.playServicesGamesV2

implementation libs.workRuntimeKtx

implementation project(':libretrodroid')
}

spotless {
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,14 @@
android:screenOrientation="sensorLandscape"
android:exported="false" />

<activity
android:name="com.winlator.cmod.feature.retro.RetroActivity"
android:theme="@style/AppThemeFullscreen"
android:launchMode="singleTask"
android:screenOrientation="sensorLandscape"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|density|navigation"
android:exported="false" />

<receiver
android:name="com.winlator.cmod.feature.shortcuts.ShortcutBroadcastReceiver"
android:exported="true">
Expand Down
47 changes: 25 additions & 22 deletions app/src/main/app/shell/LibraryGameLaunchScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ internal fun LibraryGameLaunchScreen(
lastPlayedMillis: Long,
installSizeText: String?,
isCustom: Boolean,
isRetro: Boolean = false,
hasPinnedShortcut: Boolean,
steamMenuEnabled: Boolean = false,
areSteamActionsEnabled: Boolean = true,
Expand Down Expand Up @@ -165,7 +166,7 @@ internal fun LibraryGameLaunchScreen(
val actionIconSize = 46.dp
val actionIconSpacing = 8.dp
// Action icons: Settings, Boot, CloudSync, Shortcut, Delete.
val actionIconCount = 5
val actionIconCount = if (isRetro) 2 else 5
val actionWidth = actionIconSize * actionIconCount + actionIconSpacing * (actionIconCount - 1)
val playHeight = 56.dp
val contentGap = 18.dp
Expand Down Expand Up @@ -391,27 +392,29 @@ internal fun LibraryGameLaunchScreen(
size = actionIconSize,
onClick = onSettings,
)
LaunchIconActionButton(
icon = Icons.Outlined.DesktopWindows,
contentDescription = stringResource(R.string.hero_boot_to_desktop_title),
size = actionIconSize,
onClick = onBootToDesktop,
)
LaunchIconActionButton(
icon = Icons.Outlined.CloudSync,
contentDescription = stringResource(R.string.cloud_saves_title),
size = actionIconSize,
onClick = onCloudSaves,
)
LaunchIconActionButton(
icon = Icons.Outlined.Home,
contentDescription =
stringResource(
if (hasPinnedShortcut) R.string.common_ui_remove else R.string.common_ui_shortcut,
),
size = actionIconSize,
onClick = onShortcut,
)
if (!isRetro) {
LaunchIconActionButton(
icon = Icons.Outlined.DesktopWindows,
contentDescription = stringResource(R.string.hero_boot_to_desktop_title),
size = actionIconSize,
onClick = onBootToDesktop,
)
LaunchIconActionButton(
icon = Icons.Outlined.CloudSync,
contentDescription = stringResource(R.string.cloud_saves_title),
size = actionIconSize,
onClick = onCloudSaves,
)
LaunchIconActionButton(
icon = Icons.Outlined.Home,
contentDescription =
stringResource(
if (hasPinnedShortcut) R.string.common_ui_remove else R.string.common_ui_shortcut,
),
size = actionIconSize,
onClick = onShortcut,
)
}
Box {
LaunchIconActionButton(
icon = Icons.Outlined.Delete,
Expand Down
Loading
Loading