fix: add path qualification to Files app pathbar

This commit is contained in:
2026-07-18 12:07:53 +02:00
parent b319399139
commit 2319858e8c
2 changed files with 38 additions and 2 deletions
+1 -1
View File
@@ -12,4 +12,4 @@
#pragma once #pragma once
#define MONTAUK_BUILD_NUMBER 42 #define MONTAUK_BUILD_NUMBER 43
@@ -164,6 +164,42 @@ void filemanager_cancel_pathbar(FileManagerState* fm) {
fm->pathbar_editing = false; fm->pathbar_editing = false;
} }
// True if `path` begins with a "N:/" volume prefix (one or more digits then ":/").
static bool filemanager_has_volume_prefix(const char* path) {
int i = 0;
while (path[i] >= '0' && path[i] <= '9') i++;
return i > 0 && path[i] == ':' && path[i + 1] == '/';
}
// Resolve a user-typed path into a fully-qualified "N:/..." path. Paths without
// a volume number (e.g. "/os" or "os") are drive-relative; the kernel resolves
// them against drive 0, but filemanager_read_dir strips a drive-root-relative
// prefix, so an unqualified path would leave the returned basenames with their
// full sub-path. Qualify it here so the prefix stripping matches. The drive of
// the current location is preferred, falling back to drive 0.
static void filemanager_qualify_path(FileManagerState* fm, char* out, int out_max) {
const char* in = fm->pathbar_buf;
if (filemanager_has_volume_prefix(in)) {
montauk::strcpy(out, in);
return;
}
char drive[8] = "0";
if (filemanager_has_volume_prefix(fm->current_path)) {
int i = 0;
while (fm->current_path[i] >= '0' && fm->current_path[i] <= '9' && i < 6) {
drive[i] = fm->current_path[i];
i++;
}
drive[i] = '\0';
}
montauk::strcpy(out, drive);
str_append(out, ":", out_max);
if (in[0] != '/') str_append(out, "/", out_max);
str_append(out, in, out_max);
}
void filemanager_commit_pathbar(FileManagerState* fm) { void filemanager_commit_pathbar(FileManagerState* fm) {
fm->pathbar_editing = false; fm->pathbar_editing = false;
if (fm->pathbar_len == 0) { if (fm->pathbar_len == 0) {
@@ -171,7 +207,7 @@ void filemanager_commit_pathbar(FileManagerState* fm) {
filemanager_push_history(fm); filemanager_push_history(fm);
return; return;
} }
montauk::strcpy(fm->current_path, fm->pathbar_buf); filemanager_qualify_path(fm, fm->current_path, sizeof(fm->current_path));
filemanager_read_dir(fm); filemanager_read_dir(fm);
filemanager_push_history(fm); filemanager_push_history(fm);
} }