Skip to content

Commit 36223ca

Browse files
committed
Restore focus after native file dialogs
1 parent 4b31346 commit 36223ca

4 files changed

Lines changed: 42 additions & 8 deletions

File tree

platforms/macos/macos.mm

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,24 @@ - (void)dealloc
8888
[win toggleFullScreen:nil];
8989
}
9090
}
91+
92+
extern "C" void macos_refocus_window(void* nswindow)
93+
{
94+
NSWindow* win = (__bridge NSWindow*)nswindow;
95+
if (!win)
96+
return;
97+
98+
if (@available(macOS 14.0, *))
99+
{
100+
[NSApp activate];
101+
}
102+
else
103+
{
104+
#pragma clang diagnostic push
105+
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
106+
[NSApp activateIgnoringOtherApps:YES];
107+
#pragma clang diagnostic pop
108+
}
109+
110+
[win makeKeyAndOrderFront:nil];
111+
}

platforms/shared/desktop/application.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ static void* macos_fullscreen_observer = NULL;
6666
static void* macos_nswindow = NULL;
6767
extern "C" void* macos_install_fullscreen_observer(void* nswindow, void(*enter_cb)(), void(*exit_cb)());
6868
extern "C" void macos_set_native_fullscreen(void* nswindow, bool enter);
69+
extern "C" void macos_refocus_window(void* nswindow);
6970
#endif
7071

7172
int application_init(const char* rom_file, const char* symbol_file, bool force_fullscreen, bool force_windowed, int mcp_mode, int mcp_tcp_port)
@@ -239,6 +240,17 @@ void application_trigger_fit_to_content(int width, int height)
239240
SDL_SetWindowSize(application_sdl_window, width, height);
240241
}
241242

243+
void application_refocus_window(void)
244+
{
245+
if (!application_sdl_window)
246+
return;
247+
248+
SDL_RaiseWindow(application_sdl_window);
249+
250+
#if defined(__APPLE__)
251+
macos_refocus_window(macos_nswindow);
252+
#endif
253+
}
242254

243255
void application_update_title_with_rom(const char* rom)
244256
{
@@ -470,7 +482,7 @@ static void sdl_events_app(const SDL_Event* event)
470482
{
471483
const char* dropped_filedir = event->drop.data;
472484
gui_load_rom(dropped_filedir);
473-
SDL_RaiseWindow(application_sdl_window);
485+
application_refocus_window();
474486
break;
475487
}
476488
case SDL_EVENT_WINDOW_FOCUS_GAINED:

platforms/shared/desktop/application.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ EXTERN void application_mainloop(void);
4141
EXTERN void application_trigger_quit(void);
4242
EXTERN void application_trigger_fullscreen(bool fullscreen);
4343
EXTERN void application_trigger_fit_to_content(int width, int height);
44+
EXTERN void application_refocus_window(void);
4445
EXTERN void application_update_title_with_rom(const char* rom);
4546
EXTERN void application_input_pump(void);
4647
EXTERN bool application_check_single_instance(const char* rom_file, const char* symbol_file);

platforms/shared/desktop/gui_filedialogs.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,8 @@ void gui_file_dialog_load_palette(void)
309309

310310
void gui_file_dialog_process_results(void)
311311
{
312+
bool refocus_window = pending_refocus_window && !dialog_active;
313+
312314
#if !defined(__APPLE__)
313315
if (was_exclusive_fullscreen && !dialog_active)
314316
{
@@ -317,11 +319,8 @@ void gui_file_dialog_process_results(void)
317319
}
318320
#endif
319321

320-
if (pending_refocus_window && !dialog_active)
321-
{
322+
if (refocus_window)
322323
pending_refocus_window = false;
323-
SDL_RaiseWindow(application_sdl_window);
324-
}
325324

326325
if (pending_dialog_id != FileDialog_None)
327326
{
@@ -331,6 +330,9 @@ void gui_file_dialog_process_results(void)
331330
pending_dialog_path.clear();
332331
process_dialog_result(id, path.c_str());
333332
}
333+
334+
if (refocus_window)
335+
application_refocus_window();
334336
}
335337

336338
bool gui_file_dialog_is_active(void)
@@ -342,14 +344,12 @@ static void SDLCALL file_dialog_callback(void* userdata, const char* const* file
342344
{
343345
(void)filter;
344346
dialog_active = false;
347+
pending_refocus_window = true;
345348

346349
FileDialogID id = (FileDialogID)(intptr_t)userdata;
347350

348351
if (!filelist || !filelist[0])
349-
{
350-
pending_refocus_window = true;
351352
return;
352-
}
353353

354354
pending_dialog_id = id;
355355
pending_dialog_path = filelist[0];

0 commit comments

Comments
 (0)