|
|
|
@ -43,11 +43,12 @@
|
|
|
|
|
#include "../../verbosity.h"
|
|
|
|
|
#include "../../ui/drivers/ui_win32.h"
|
|
|
|
|
|
|
|
|
|
#ifdef __WINRT__
|
|
|
|
|
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
|
|
|
|
#include "../../uwp/uwp_func.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef __WINRT__
|
|
|
|
|
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
|
|
|
|
#else
|
|
|
|
|
/* We only load this library once, so we let it be
|
|
|
|
|
* unloaded at application shutdown, since unloading
|
|
|
|
|
* it early seems to cause issues on some systems.
|
|
|
|
@ -157,7 +158,6 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor)
|
|
|
|
|
char buildStr[11] = {0};
|
|
|
|
|
bool server = false;
|
|
|
|
|
const char *arch = "";
|
|
|
|
|
bool serverR2 = false;
|
|
|
|
|
|
|
|
|
|
#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500
|
|
|
|
|
/* Windows 2000 and later */
|
|
|
|
@ -171,9 +171,6 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor)
|
|
|
|
|
GetVersionEx((OSVERSIONINFO*)&vi);
|
|
|
|
|
|
|
|
|
|
server = vi.wProductType != VER_NT_WORKSTATION;
|
|
|
|
|
#ifndef __WINRT__
|
|
|
|
|
serverR2 = GetSystemMetrics(SM_SERVERR2);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
switch (si.wProcessorArchitecture)
|
|
|
|
|
{
|
|
|
|
@ -253,10 +250,14 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor)
|
|
|
|
|
{
|
|
|
|
|
case 2:
|
|
|
|
|
if (server)
|
|
|
|
|
if (serverR2)
|
|
|
|
|
strlcpy(s, "Windows Server 2003 R2", len);
|
|
|
|
|
else
|
|
|
|
|
strlcpy(s, "Windows Server 2003", len);
|
|
|
|
|
{
|
|
|
|
|
strlcpy(s, "Windows Server 2003", len);
|
|
|
|
|
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
|
|
|
|
#else
|
|
|
|
|
if (GetSystemMetrics(SM_SERVERR2))
|
|
|
|
|
strlcat(s, " R2", len);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* Yes, XP Pro x64 is a higher version number than XP x86 */
|
|
|
|
@ -311,7 +312,7 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor)
|
|
|
|
|
strlcat(s, vi.szCSDVersion, len);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef __WINRT__
|
|
|
|
|
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
|
|
|
|
if (!string_is_empty(uwp_device_family))
|
|
|
|
|
{
|
|
|
|
|
strlcat(s, " ", len);
|
|
|
|
@ -322,7 +323,8 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor)
|
|
|
|
|
|
|
|
|
|
static void frontend_win32_init(void *data)
|
|
|
|
|
{
|
|
|
|
|
#ifndef __WINRT__
|
|
|
|
|
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
|
|
|
|
#else
|
|
|
|
|
typedef BOOL (WINAPI *isProcessDPIAwareProc)();
|
|
|
|
|
typedef BOOL (WINAPI *setProcessDPIAwareProc)();
|
|
|
|
|
#ifdef HAVE_DYNAMIC
|
|
|
|
@ -407,22 +409,7 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content)
|
|
|
|
|
enum msg_hash_enums enum_idx = load_content ?
|
|
|
|
|
MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR :
|
|
|
|
|
MSG_UNKNOWN;
|
|
|
|
|
#ifndef __WINRT__
|
|
|
|
|
size_t i = 0;
|
|
|
|
|
unsigned drives = GetLogicalDrives();
|
|
|
|
|
char drive[] = " :\\";
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 32; i++)
|
|
|
|
|
{
|
|
|
|
|
drive[0] = 'A' + i;
|
|
|
|
|
if (drives & (1 << i))
|
|
|
|
|
menu_entries_append_enum(list,
|
|
|
|
|
drive,
|
|
|
|
|
msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR),
|
|
|
|
|
enum_idx,
|
|
|
|
|
FILE_TYPE_DIRECTORY, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
|
|
|
|
/* TODO (krzys_h): UWP storage sandboxing */
|
|
|
|
|
|
|
|
|
|
char *home_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
|
|
|
|
@ -437,6 +424,21 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content)
|
|
|
|
|
FILE_TYPE_DIRECTORY, 0, 0);
|
|
|
|
|
|
|
|
|
|
free(home_dir);
|
|
|
|
|
#else
|
|
|
|
|
size_t i = 0;
|
|
|
|
|
unsigned drives = GetLogicalDrives();
|
|
|
|
|
char drive[] = " :\\";
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 32; i++)
|
|
|
|
|
{
|
|
|
|
|
drive[0] = 'A' + i;
|
|
|
|
|
if (drives & (1 << i))
|
|
|
|
|
menu_entries_append_enum(list,
|
|
|
|
|
drive,
|
|
|
|
|
msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR),
|
|
|
|
|
enum_idx,
|
|
|
|
|
FILE_TYPE_DIRECTORY, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@ -446,56 +448,7 @@ static int frontend_win32_parse_drive_list(void *data, bool load_content)
|
|
|
|
|
static void frontend_win32_environment_get(int *argc, char *argv[],
|
|
|
|
|
void *args, void *params_data)
|
|
|
|
|
{
|
|
|
|
|
#ifndef __WINRT__
|
|
|
|
|
gfx_set_dwm();
|
|
|
|
|
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS],
|
|
|
|
|
":\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER],
|
|
|
|
|
":\\filters\\audio", sizeof(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER],
|
|
|
|
|
":\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS],
|
|
|
|
|
":\\cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE],
|
|
|
|
|
":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CURSOR],
|
|
|
|
|
":\\database\\cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST],
|
|
|
|
|
":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG],
|
|
|
|
|
":\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT],
|
|
|
|
|
":\\recordings", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG],
|
|
|
|
|
":\\config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_REMAP],
|
|
|
|
|
":\\config\\remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS],
|
|
|
|
|
":\\assets\\wallpapers", sizeof(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS],
|
|
|
|
|
":\\thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_OVERLAY],
|
|
|
|
|
":\\overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE],
|
|
|
|
|
":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_INFO],
|
|
|
|
|
":\\info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG],
|
|
|
|
|
":\\autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SHADER],
|
|
|
|
|
":\\shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS],
|
|
|
|
|
":\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT],
|
|
|
|
|
":\\screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SRAM],
|
|
|
|
|
":\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE],
|
|
|
|
|
":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
|
|
|
|
|
":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
|
|
|
|
|
#else
|
|
|
|
|
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
|
|
|
|
/* On UWP, we have to use the writable directory instead of the install directory */
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS],
|
|
|
|
|
"~\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
|
|
|
|
@ -545,6 +498,55 @@ static void frontend_win32_environment_get(int *argc, char *argv[],
|
|
|
|
|
"~\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
|
|
|
|
|
"~\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
|
|
|
|
|
#else
|
|
|
|
|
gfx_set_dwm();
|
|
|
|
|
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS],
|
|
|
|
|
":\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER],
|
|
|
|
|
":\\filters\\audio", sizeof(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER],
|
|
|
|
|
":\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS],
|
|
|
|
|
":\\cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE],
|
|
|
|
|
":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CURSOR],
|
|
|
|
|
":\\database\\cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST],
|
|
|
|
|
":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG],
|
|
|
|
|
":\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT],
|
|
|
|
|
":\\recordings", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG],
|
|
|
|
|
":\\config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_REMAP],
|
|
|
|
|
":\\config\\remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS],
|
|
|
|
|
":\\assets\\wallpapers", sizeof(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS],
|
|
|
|
|
":\\thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_OVERLAY],
|
|
|
|
|
":\\overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE],
|
|
|
|
|
":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_INFO],
|
|
|
|
|
":\\info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG],
|
|
|
|
|
":\\autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SHADER],
|
|
|
|
|
":\\shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS],
|
|
|
|
|
":\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT],
|
|
|
|
|
":\\screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SRAM],
|
|
|
|
|
":\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE],
|
|
|
|
|
":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE]));
|
|
|
|
|
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
|
|
|
|
|
":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_MENU
|
|
|
|
@ -589,7 +591,8 @@ static uint64_t frontend_win32_get_mem_used(void)
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef __WINRT__
|
|
|
|
|
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
|
|
|
|
#else
|
|
|
|
|
static void frontend_win32_attach_console(void)
|
|
|
|
|
{
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
@ -672,12 +675,12 @@ frontend_ctx_driver_t frontend_ctx_win32 = {
|
|
|
|
|
NULL, /* get_sighandler_state */
|
|
|
|
|
NULL, /* set_sighandler_state */
|
|
|
|
|
NULL, /* destroy_sighandler_state */
|
|
|
|
|
#ifndef __WINRT__
|
|
|
|
|
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
#else
|
|
|
|
|
frontend_win32_attach_console, /* attach_console */
|
|
|
|
|
frontend_win32_detach_console, /* detach_console */
|
|
|
|
|
#else
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
#endif
|
|
|
|
|
NULL, /* watch_path_for_changes */
|
|
|
|
|
NULL, /* check_for_path_changes */
|
|
|
|
|