@@ -434,23 +434,58 @@ void sys_main_c::SpawnProcess(std::filesystem::path cmdName, const char* argList
434
434
#endif
435
435
}
436
436
437
+ std::string GetWineHostVersion ()
438
+ {
439
+ #ifdef _WIN32
440
+ using WineHostVersionFun = void (const char ** /* sysname*/ , const char ** /* release*/ );
441
+ HMODULE mod = GetModuleHandleA (" ntdll.dll" );
442
+ if (!mod)
443
+ return " " ;
444
+ auto ptr = GetProcAddress (mod, " wine_get_host_version" );
445
+ if (!ptr)
446
+ return " " ;
447
+ auto fun = (WineHostVersionFun*)ptr;
448
+ const char * sysname{};
449
+ const char * release{};
450
+ fun (&sysname, &release);
451
+ return sysname ? sysname : " " ;
452
+ #else
453
+ return " " ;
454
+ #endif
455
+ }
456
+
437
457
#if _WIN32 || __linux__
438
- void PlatformOpenURL (const char * url)
458
+ const char * PlatformOpenURL (const char * url)
439
459
{
440
460
#ifdef _WIN32
461
+ const std::string wineHost = GetWineHostVersion ();
462
+ /*
463
+ Wine has some loosely determined maximum length on how long of an URL
464
+ can be, so we pick a "safe" maximum and refuse to open anything longer.
465
+ */
466
+ if ((wineHost == " Linux" || wineHost == " Darwin" ) && strlen (url) > 1500 )
467
+ return AllocString (" Did not open URL, length likely too long for the OS." );
441
468
ShellExecuteA (NULL , " open" , url, NULL , NULL , SW_SHOWDEFAULT);
469
+ return nullptr ;
442
470
#else
443
471
#warning LV: URL opening not implemented on this OS.
444
472
// TODO(LV): Implement URL opening for other OSes.
473
+ return AllocString (" URL opening not implemented on this OS." );
445
474
#endif
446
475
}
447
476
#else
448
- void PlatformOpenURL (const char * url);
477
+ const char * PlatformOpenURL (const char * url);
449
478
#endif
450
479
451
- void sys_main_c::OpenURL (const char * url)
480
+ std::optional<std::string> sys_main_c::OpenURL (const char * url)
452
481
{
453
- PlatformOpenURL (url);
482
+ if (auto err = PlatformOpenURL (url))
483
+ {
484
+ std::string ret = err;
485
+ FreeString (err);
486
+ return ret;
487
+ }
488
+ return {};
454
489
}
455
490
456
491
// ==============================
0 commit comments