mirror of
https://github.com/valentderah/totk-pc-recomp.git
synced 2026-11-11 01:41:02 +00:00
The Amiibo tab's folder field took no typing: the menu never passes typed characters to Dear ImGui, so "Open" only re-read "./amiibo". A missing folder said so at the bottom of the right pane, below its scroll. "Open" now shows the shell's folder dialog on Windows (IFileOpenDialog on a thread of its own, owned by the game window) and SDL_ShowOpenFolderDialog on the SDL window thread elsewhere; the tab shows the folder as text and names a missing one inside the empty list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
1.2 KiB
C
43 lines
1.2 KiB
C
// The SDL front end of folder_pick.h: SDL_ShowOpenFolderDialog (the desktop portal, else zenity), started on the window
|
|
// thread, which runs SDL's event loop that delivers the portal's answer.
|
|
#include <limits.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include "folder_pick.h"
|
|
#include "host.h"
|
|
#include "input_sdl.h"
|
|
|
|
typedef struct {
|
|
char start[PATH_MAX]; // absolute, or empty: the dialog's own default
|
|
FolderPickDone done;
|
|
void *ctx;
|
|
} PickReq;
|
|
|
|
static void SDLCALL on_pick(void *userdata, const char *const *list, int filter) {
|
|
(void)filter;
|
|
PickReq *r = userdata;
|
|
if (!list) rt_log("folder_pick: the folder dialog failed (%s)", SDL_GetError());
|
|
r->done(list && list[0] ? list[0] : NULL, r->ctx);
|
|
free(r);
|
|
}
|
|
|
|
static void show(void *arg) {
|
|
PickReq *r = arg;
|
|
SDL_ShowOpenFolderDialog(on_pick, r, gfx_window_sdl(), r->start[0] ? r->start : NULL, false);
|
|
}
|
|
|
|
void folder_pick(const char *start, FolderPickDone done, void *ctx) {
|
|
PickReq *r = calloc(1, sizeof *r);
|
|
if (!r) {
|
|
done(NULL, ctx);
|
|
return;
|
|
}
|
|
r->done = done;
|
|
r->ctx = ctx;
|
|
if (start && *start && !realpath(start, r->start)) r->start[0] = 0;
|
|
gfx_window_sdl_run(show, r);
|
|
}
|