Log a mod folder that cannot be listed, and let the game take long paths where Windows allows them.

A folder in a mod's RomFS that could not be listed (no permission, or a path longer than 260 characters, as a mod
deep in a long game folder makes) lost its files without a word in the log; the walk now names it. The manifest
asks for long path support, so where Windows has it switched on (LongPathsEnabled) those files are served.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
chrg6
2026-11-08 08:57:58 -05:00
parent d0e9ba6b30
commit 771c4f4fb1
2 changed files with 10 additions and 2 deletions

View File

@@ -5,7 +5,11 @@
dpiAwareness PerMonitorV2 (dpiAware true/pm on Windows 10 before 1607): window, monitor and cursor sizes are physical
pixels and the swapchain matches the screen. A DPI-unaware process gets them divided by the display scale and its
image stretched back up by Windows, so 4K at 150% presented a 2560x1440 image, blurred. gfx_window.c follows a
change of the window's DPI (WM_GETDPISCALEDSIZE, WM_DPICHANGED). -->
change of the window's DPI (WM_GETDPISCALEDSIZE, WM_DPICHANGED).
longPathAware lets the wide file functions of platform/win32.c take paths longer than 260 characters (a mod's
files deep in a long game folder) where Windows has long paths switched on (LongPathsEnabled); elsewhere it does
nothing. -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
@@ -19,6 +23,7 @@
<activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
</assembly>

View File

@@ -455,7 +455,10 @@ static int mod_walk_cb(const char *leaf, int kind, uint64_t size, void *ctx) {
// The files under dir (a mod's RomFS root; rel: the RomFS path of dir, "" at the root) as overlays of mod k.
static void mod_walk(int k, int prio, const char *dir, const char *rel) {
ModWalk w = {k, prio, dir, rel};
plat_fs_list(dir, mod_walk_cb, &w);
// a folder that cannot be listed (no permission, a path longer than Windows allows) loses its files: say so
if (plat_fs_list(dir, mod_walk_cb, &w) != PLAT_FS_OK)
rt_log("mods: %s: cannot list %s (error %d); its files are left out", mods_at(k)->name, dir,
plat_fs_os_error());
}
// What overlays compete on: the RomFS index, an added file's path; the higher prio first.