This commit is contained in:
twinaphex 2020-08-18 15:48:13 +02:00
parent 79db13d5e7
commit ed52146f8c

View File

@ -51,10 +51,10 @@ using namespace Windows::Foundation::Collections;
using namespace Windows::Graphics::Display; using namespace Windows::Graphics::Display;
using namespace Windows::Devices::Enumeration; using namespace Windows::Devices::Enumeration;
char uwp_dir_install[PATH_MAX_LENGTH]; char uwp_dir_install[PATH_MAX_LENGTH] = { 0 };
char uwp_dir_data[PATH_MAX_LENGTH]; char uwp_dir_data[PATH_MAX_LENGTH] = { 0 };
char uwp_device_family[128]; char uwp_device_family[128] = { 0 };
char win32_cpu_model_name[128] = { 0 }; char win32_cpu_model_name[128] = { 0 };
// Some keys are unavailable in the VirtualKey enum (wtf) but the old-style constants work // Some keys are unavailable in the VirtualKey enum (wtf) but the old-style constants work
const struct rarch_key_map rarch_key_map_uwp[] = { const struct rarch_key_map rarch_key_map_uwp[] = {
@ -172,32 +172,35 @@ const struct rarch_key_map rarch_key_map_uwp[] = {
}; };
#define MAX_TOUCH 16 #define MAX_TOUCH 16
struct input_pointer { struct input_pointer
{
int id; int id;
short x;
short y;
short full_x;
short full_y;
bool isInContact; bool isInContact;
short x, y;
short full_x, full_y;
}; };
struct uwp_input_state_t { struct uwp_input_state_t
{
struct input_pointer touch[MAX_TOUCH]; /* int alignment */
unsigned touch_count;
short mouse_screen_x; short mouse_screen_x;
short mouse_screen_y; short mouse_screen_y;
short mouse_rel_x; short mouse_rel_x;
short mouse_rel_y; short mouse_rel_y;
short mouse_wheel_left;
short mouse_wheel_up;
bool mouse_left; bool mouse_left;
bool mouse_right; bool mouse_right;
bool mouse_middle; bool mouse_middle;
bool mouse_button4; bool mouse_button4;
bool mouse_button5; bool mouse_button5;
short mouse_wheel_left;
short mouse_wheel_up;
unsigned touch_count;
struct input_pointer touch[MAX_TOUCH];
}; };
struct uwp_input_state_t uwp_current_input, uwp_next_input; struct uwp_input_state_t uwp_current_input, uwp_next_input;
// Taken from DirectX UWP samples - on Xbox, everything is scaled 200% so getting the DPI calculation correct is crucial // Taken from DirectX UWP samples - on Xbox, everything is scaled 200% so getting the DPI calculation correct is crucial
static inline float ConvertDipsToPixels(float dips, float dpi) static inline float ConvertDipsToPixels(float dips, float dpi)
{ {
@ -210,11 +213,13 @@ static inline float ConvertDipsToPixels(float dips, float dpi)
int main(Platform::Array<Platform::String^>^) int main(Platform::Array<Platform::String^>^)
{ {
Platform::String^ install_dir = Windows::ApplicationModel::Package::Current->InstalledLocation->Path + L"\\"; Platform::String^ install_dir = Windows::ApplicationModel::Package::Current->InstalledLocation->Path + L"\\";
wcstombs(uwp_dir_install, install_dir->Data(), PATH_MAX_LENGTH); wcstombs(uwp_dir_install, install_dir->Data(), sizeof(upw_dir_install));
Platform::String^ data_dir = Windows::Storage::ApplicationData::Current->LocalFolder->Path + L"\\"; Platform::String^ data_dir = Windows::Storage::ApplicationData::Current->LocalFolder->Path + L"\\";
wcstombs(uwp_dir_data, data_dir->Data(), PATH_MAX_LENGTH); wcstombs(uwp_dir_data, data_dir->Data(), sizeof(uwp_dir_data));
wcstombs(uwp_device_family, AnalyticsInfo::VersionInfo->DeviceFamily->Data(), 128); wcstombs(uwp_device_family,
AnalyticsInfo::VersionInfo->DeviceFamily->Data(),
sizeof(uwp_device_family));
RARCH_LOG("Data dir: %ls\n", data_dir->Data()); RARCH_LOG("Data dir: %ls\n", data_dir->Data());
RARCH_LOG("Install dir: %ls\n", install_dir->Data()); RARCH_LOG("Install dir: %ls\n", install_dir->Data());
@ -525,11 +530,11 @@ void App::OnPointer(CoreWindow^ sender, PointerEventArgs^ args)
struct video_viewport vp; struct video_viewport vp;
/* convert from event coordinates to core and screen coordinates */ /* convert from event coordinates to core and screen coordinates */
vp.x = 0; vp.x = 0;
vp.y = 0; vp.y = 0;
vp.width = 0; vp.width = 0;
vp.height = 0; vp.height = 0;
vp.full_width = 0; vp.full_width = 0;
vp.full_height = 0; vp.full_height = 0;
video_driver_translate_coord_viewport_wrap( video_driver_translate_coord_viewport_wrap(
@ -626,35 +631,35 @@ extern "C" {
bool win32_get_metrics(void* data, bool win32_get_metrics(void* data,
enum display_metric_types type, float* value) enum display_metric_types type, float* value)
{ {
int pixels_x = DisplayInformation::GetForCurrentView()->ScreenWidthInRawPixels; int pixels_x = DisplayInformation::GetForCurrentView()->ScreenWidthInRawPixels;
int pixels_y = DisplayInformation::GetForCurrentView()->ScreenHeightInRawPixels; int pixels_y = DisplayInformation::GetForCurrentView()->ScreenHeightInRawPixels;
int raw_dpi_x = DisplayInformation::GetForCurrentView()->RawDpiX; int raw_dpi_x = DisplayInformation::GetForCurrentView()->RawDpiX;
int raw_dpi_y = DisplayInformation::GetForCurrentView()->RawDpiY; int raw_dpi_y = DisplayInformation::GetForCurrentView()->RawDpiY;
int physical_width = pixels_x / raw_dpi_x; int physical_width = pixels_x / raw_dpi_x;
int physical_height = pixels_y / raw_dpi_y; int physical_height = pixels_y / raw_dpi_y;
switch (type) switch (type)
{ {
case DISPLAY_METRIC_PIXEL_WIDTH: case DISPLAY_METRIC_PIXEL_WIDTH:
*value = pixels_x; *value = pixels_x;
return true; return true;
case DISPLAY_METRIC_PIXEL_HEIGHT: case DISPLAY_METRIC_PIXEL_HEIGHT:
*value = pixels_y; *value = pixels_y;
return true; return true;
case DISPLAY_METRIC_MM_WIDTH: case DISPLAY_METRIC_MM_WIDTH:
/* 25.4 mm in an inch. */ /* 25.4 mm in an inch. */
*value = 254 * physical_width / 10; *value = 254 * physical_width / 10;
return true; return true;
case DISPLAY_METRIC_MM_HEIGHT: case DISPLAY_METRIC_MM_HEIGHT:
/* 25.4 mm in an inch. */ /* 25.4 mm in an inch. */
*value = 254 * physical_height / 10; *value = 254 * physical_height / 10;
return true; return true;
case DISPLAY_METRIC_DPI: case DISPLAY_METRIC_DPI:
*value = raw_dpi_x; *value = raw_dpi_x;
return true; return true;
case DISPLAY_METRIC_NONE: case DISPLAY_METRIC_NONE:
default: default:
*value = 0; *value = 0;
break; break;
} }
return false; return false;
@ -716,41 +721,41 @@ extern "C" {
} }
int16_t uwp_mouse_state(unsigned port, unsigned id, bool screen) int16_t uwp_mouse_state(unsigned port, unsigned id, bool screen)
{ {
int16_t state = 0; int16_t state = 0;
switch (id) switch (id)
{ {
case RETRO_DEVICE_ID_MOUSE_X: case RETRO_DEVICE_ID_MOUSE_X:
return screen return screen
? uwp_current_input.mouse_screen_x ? uwp_current_input.mouse_screen_x
: uwp_current_input.mouse_rel_x; : uwp_current_input.mouse_rel_x;
case RETRO_DEVICE_ID_MOUSE_Y: case RETRO_DEVICE_ID_MOUSE_Y:
return screen return screen
? uwp_current_input.mouse_screen_y ? uwp_current_input.mouse_screen_y
: uwp_current_input.mouse_rel_y; : uwp_current_input.mouse_rel_y;
case RETRO_DEVICE_ID_MOUSE_LEFT: case RETRO_DEVICE_ID_MOUSE_LEFT:
return uwp_current_input.mouse_left; return uwp_current_input.mouse_left;
case RETRO_DEVICE_ID_MOUSE_RIGHT: case RETRO_DEVICE_ID_MOUSE_RIGHT:
return uwp_current_input.mouse_right; return uwp_current_input.mouse_right;
case RETRO_DEVICE_ID_MOUSE_WHEELUP: case RETRO_DEVICE_ID_MOUSE_WHEELUP:
return uwp_current_input.mouse_wheel_up > WHEEL_DELTA; return uwp_current_input.mouse_wheel_up > WHEEL_DELTA;
case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
return uwp_current_input.mouse_wheel_up < -WHEEL_DELTA; return uwp_current_input.mouse_wheel_up < -WHEEL_DELTA;
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP:
return uwp_current_input.mouse_wheel_left > WHEEL_DELTA; return uwp_current_input.mouse_wheel_left > WHEEL_DELTA;
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN:
return uwp_current_input.mouse_wheel_left < -WHEEL_DELTA; return uwp_current_input.mouse_wheel_left < -WHEEL_DELTA;
case RETRO_DEVICE_ID_MOUSE_MIDDLE: case RETRO_DEVICE_ID_MOUSE_MIDDLE:
return uwp_current_input.mouse_middle; return uwp_current_input.mouse_middle;
case RETRO_DEVICE_ID_MOUSE_BUTTON_4: case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
return uwp_current_input.mouse_button4; return uwp_current_input.mouse_button4;
case RETRO_DEVICE_ID_MOUSE_BUTTON_5: case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
return uwp_current_input.mouse_button5; return uwp_current_input.mouse_button5;
} }
return 0; return 0;
} }
int16_t uwp_pointer_state(unsigned idx, unsigned id, bool screen) int16_t uwp_pointer_state(unsigned idx, unsigned id, bool screen)
{ {
@ -787,10 +792,10 @@ extern "C" {
char lang_bcp[16] = { 0 }; char lang_bcp[16] = { 0 };
char lang_iso[16] = { 0 }; char lang_iso[16] = { 0 };
wcstombs(lang_bcp, lang->Data(), 16); wcstombs(lang_bcp, lang->Data(), sizeof(lang_bcp));
/* Trying to convert BCP 47 language codes to ISO 639 ones */ /* Trying to convert BCP 47 language codes to ISO 639 ones */
split = string_split(lang_bcp, "-"); split = string_split(lang_bcp, "-");
strlcat(lang_iso, split->elems[0].data, sizeof(lang_iso)); strlcat(lang_iso, split->elems[0].data, sizeof(lang_iso));
@ -843,7 +848,7 @@ extern "C" {
if (!cpu_name) if (!cpu_name)
return "Unknown"; return "Unknown";
wcstombs(win32_cpu_model_name, cpu_name->Data(), 128); wcstombs(win32_cpu_model_name, cpu_name->Data(), sizeof(win32_cpu_model_name));
return win32_cpu_model_name; return win32_cpu_model_name;
} }
} }