diff options
Diffstat (limited to 'community/retroarch/touch_scale.patch')
-rw-r--r-- | community/retroarch/touch_scale.patch | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/community/retroarch/touch_scale.patch b/community/retroarch/touch_scale.patch new file mode 100644 index 00000000000..23ce96a17fb --- /dev/null +++ b/community/retroarch/touch_scale.patch @@ -0,0 +1,271 @@ +v1.9.1 doesn't include a recently merged patch to properly handle touch scale on devices with scaled screen. +The original patch can be found here https://github.com/libretro/RetroArch/pull/12213. +This commit aims to introduce this patch. + +diff --git a/config.def.h b/config.def.h +index 4f199f3..c20a434 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -62,6 +62,8 @@ + #define DEFAULT_MOUSE_SCALE 1 + #endif + ++#define DEFAULT_TOUCH_SCALE 1 ++ + #if defined(RARCH_MOBILE) || defined(HAVE_LIBNX) || defined(__WINRT__) + #define DEFAULT_POINTER_ENABLE true + #else +diff --git a/configuration.c b/configuration.c +index 82f2c32..f6a94d0 100644 +--- a/configuration.c ++++ b/configuration.c +@@ -1887,6 +1887,7 @@ static struct config_uint_setting *populate_settings_uint( + #ifdef GEKKO + SETTING_UINT("input_mouse_scale", &settings->uints.input_mouse_scale, true, DEFAULT_MOUSE_SCALE, false); + #endif ++ SETTING_UINT("input_touch_scale", &settings->uints.input_touch_scale, true, DEFAULT_TOUCH_SCALE, false); + #if defined(DINGUX) && defined(HAVE_LIBSHAKE) + SETTING_UINT("input_dingux_rumble_gain", &settings->uints.input_dingux_rumble_gain, true, DEFAULT_DINGUX_RUMBLE_GAIN, false); + #endif +diff --git a/configuration.h b/configuration.h +index 660d2db..8c51156 100644 +--- a/configuration.h ++++ b/configuration.h +@@ -151,6 +151,7 @@ typedef struct settings + #ifdef GEKKO + unsigned input_mouse_scale; + #endif ++ unsigned input_touch_scale; + unsigned input_hotkey_block_delay; + unsigned input_menu_toggle_gamepad_combo; + unsigned input_keyboard_gamepad_mapping_type; +diff --git a/input/input_overlay.h b/input/input_overlay.h +index d9ae163..3f9052a 100644 +--- a/input/input_overlay.h ++++ b/input/input_overlay.h +@@ -217,6 +217,7 @@ typedef struct + float y_separation_portrait; + float x_offset_portrait; + float y_offset_portrait; ++ float touch_scale; + bool auto_scale; + } overlay_layout_desc_t; + +diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h +index 709f1d7..8808a8f 100644 +--- a/intl/msg_hash_lbl.h ++++ b/intl/msg_hash_lbl.h +@@ -1410,6 +1410,10 @@ MSG_HASH( + "input_mouse_scale" + ) + #endif ++MSG_HASH( ++ MENU_ENUM_LABEL_INPUT_TOUCH_SCALE, ++ "input_touch_scale" ++ ) + MSG_HASH( + MENU_ENUM_LABEL_INPUT_BIND_MODE, + "input_bind_mode" +diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h +index 2e0df9d..cb8cb98 100644 +--- a/intl/msg_hash_us.h ++++ b/intl/msg_hash_us.h +@@ -12191,6 +12191,14 @@ MSG_HASH( + "Adjust x/y scale for Wiimote light gun speed." + ) + #endif ++MSG_HASH( ++ MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_SCALE, ++ "Touch Scale" ++ ) ++MSG_HASH( ++ MENU_ENUM_SUBLABEL_INPUT_TOUCH_SCALE, ++ "Adjust x/y scale of touchscreen coordinates to accommodate OS-level display scaling." ++ ) + #ifdef HAVE_ODROIDGO2 + MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_RGA_SCALING, +diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c +index 9875942..3453f83 100644 +--- a/menu/cbs/menu_cbs_sublabel.c ++++ b/menu/cbs/menu_cbs_sublabel.c +@@ -343,6 +343,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_audio_sync, MENU_ + #if defined(GEKKO) + DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_mouse_scale, MENU_ENUM_SUBLABEL_INPUT_MOUSE_SCALE) + #endif ++DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_touch_scale, MENU_ENUM_SUBLABEL_INPUT_TOUCH_SCALE) + DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_axis_threshold, MENU_ENUM_SUBLABEL_INPUT_BUTTON_AXIS_THRESHOLD) + DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_period, MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD) + DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_duty_cycle, MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE) +@@ -3393,6 +3394,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_mouse_scale); + break; + #endif ++ case MENU_ENUM_LABEL_INPUT_TOUCH_SCALE: ++ BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_touch_scale); ++ break; + case MENU_ENUM_LABEL_AUDIO_SYNC: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_sync); + break; +diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c +index 32d6890..2ac43d3 100644 +--- a/menu/menu_displaylist.c ++++ b/menu/menu_displaylist.c +@@ -6128,6 +6128,10 @@ unsigned menu_displaylist_build_list( + PARSE_ONLY_UINT, false) == 0) + count++; + #endif ++ if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, ++ MENU_ENUM_LABEL_INPUT_TOUCH_SCALE, ++ PARSE_ONLY_UINT, false) == 0) ++ count++; + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_INPUT_ANALOG_DEADZONE, + PARSE_ONLY_FLOAT, false) == 0) +diff --git a/menu/menu_setting.c b/menu/menu_setting.c +index 7d966e5..0d4e667 100644 +--- a/menu/menu_setting.c ++++ b/menu/menu_setting.c +@@ -6388,6 +6388,13 @@ static void setting_get_string_representation_poll_type_behavior( + } + } + ++static void setting_get_string_representation_input_touch_scale(rarch_setting_t *setting, ++ char *s, size_t len) ++{ ++ if (setting) ++ snprintf(s, len, "x%d", *setting->value.target.unsigned_integer); ++} ++ + #ifdef HAVE_LANGEXTRA + static void setting_get_string_representation_uint_user_language( + rarch_setting_t *setting, +@@ -12028,6 +12035,23 @@ static bool setting_append_list( + menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true); + #endif + ++ CONFIG_UINT( ++ list, list_info, ++ &settings->uints.input_touch_scale, ++ MENU_ENUM_LABEL_INPUT_TOUCH_SCALE, ++ MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_SCALE, ++ DEFAULT_TOUCH_SCALE, ++ &group_info, ++ &subgroup_info, ++ parent_group, ++ general_write_handler, ++ general_read_handler); ++ (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; ++ (*list)[list_info->index - 1].get_string_representation = ++ &setting_get_string_representation_input_touch_scale; ++ (*list)[list_info->index - 1].offset_by = 1; ++ menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true); ++ + #ifdef VITA + CONFIG_BOOL( + list, list_info, +diff --git a/msg_hash.h b/msg_hash.h +index 811c01e..d4bfca6 100644 +--- a/msg_hash.h ++++ b/msg_hash.h +@@ -953,6 +953,7 @@ enum msg_hash_enums + #if defined(GEKKO) + MENU_LABEL(INPUT_MOUSE_SCALE), + #endif ++ MENU_LABEL(INPUT_TOUCH_SCALE), + MENU_LABEL(INPUT_ANALOG_DEADZONE), + MENU_LABEL(INPUT_ANALOG_SENSITIVITY), + MENU_LABEL(INPUT_BIND_TIMEOUT), +diff --git a/retroarch.c b/retroarch.c +index 77fa18a..9238cb6 100644 +--- a/retroarch.c ++++ b/retroarch.c +@@ -14329,6 +14329,7 @@ bool command_event(enum event_command cmd, void *data) + layout_desc.y_separation_portrait = settings->floats.input_overlay_y_separation_portrait; + layout_desc.x_offset_portrait = settings->floats.input_overlay_x_offset_portrait; + layout_desc.y_offset_portrait = settings->floats.input_overlay_y_offset_portrait; ++ layout_desc.touch_scale = (float)settings->uints.input_touch_scale; + layout_desc.auto_scale = settings->bools.input_overlay_auto_scale; + + input_overlay_set_scale_factor(p_rarch, p_rarch->overlay_ptr, &layout_desc); +@@ -21451,7 +21452,7 @@ static bool inside_hitbox(const struct overlay_desc *desc, float x, float y) + static void input_overlay_poll( + input_overlay_t *ol, + input_overlay_state_t *out, +- int16_t norm_x, int16_t norm_y) ++ int16_t norm_x, int16_t norm_y, float touch_scale) + { + size_t i; + +@@ -21465,6 +21466,9 @@ static void input_overlay_poll( + x /= ol->active->mod_w; + y /= ol->active->mod_h; + ++ x *= touch_scale; ++ y *= touch_scale; ++ + for (i = 0; i < ol->active->size; i++) + { + float x_dist, y_dist; +@@ -21778,6 +21782,7 @@ static void input_poll_overlay( + settings_t *settings = p_rarch->configuration_settings; + bool input_overlay_show_physical_inputs = settings->bools.input_overlay_show_physical_inputs; + unsigned input_overlay_show_physical_inputs_port = settings->uints.input_overlay_show_physical_inputs_port; ++ float touch_scale = (float)settings->uints.input_touch_scale; + + if (!ol_state) + return; +@@ -21845,7 +21850,7 @@ static void input_poll_overlay( + memset(&polled_data, 0, sizeof(struct input_overlay_state)); + + if (ol->enable) +- input_overlay_poll(ol, &polled_data, x, y); ++ input_overlay_poll(ol, &polled_data, x, y, touch_scale); + else + ol->blocked = false; + +@@ -21979,6 +21984,8 @@ static void retroarch_overlay_init(struct rarch_state *p_rarch) + float overlay_y_separation_portrait = settings->floats.input_overlay_y_separation_portrait; + float overlay_x_offset_portrait = settings->floats.input_overlay_x_offset_portrait; + float overlay_y_offset_portrait = settings->floats.input_overlay_y_offset_portrait; ++ float overlay_touch_scale = (float)settings->uints.input_touch_scale; ++ + bool load_enabled = input_overlay_enable; + #ifdef HAVE_MENU + bool overlay_hide_in_menu = settings->bools.input_overlay_hide_in_menu; +@@ -22023,6 +22030,7 @@ static void retroarch_overlay_init(struct rarch_state *p_rarch) + layout_desc.y_separation_portrait = overlay_y_separation_portrait; + layout_desc.x_offset_portrait = overlay_x_offset_portrait; + layout_desc.y_offset_portrait = overlay_y_offset_portrait; ++ layout_desc.touch_scale = overlay_touch_scale; + layout_desc.auto_scale = input_overlay_auto_scale; + + task_push_overlay_load_default(input_overlay_loaded, +@@ -23395,6 +23403,7 @@ static void menu_input_get_touchscreen_hw_state( + static bool last_cancel_pressed = false; + bool overlay_active = false; + bool pointer_enabled = settings->bools.menu_pointer_enable; ++ unsigned input_touch_scale = settings->uints.input_touch_scale; + #ifdef HAVE_MFI + const input_device_driver_t + *sec_joypad = p_rarch->sec_joypad; +@@ -23454,7 +23463,8 @@ static void menu_input_get_touchscreen_hw_state( + p_rarch->keyboard_mapping_blocked, + 0, pointer_device, + 0, RETRO_DEVICE_ID_POINTER_X); +- hw_state->x = ((pointer_x + 0x7fff) * (int)fb_width) / 0xFFFF; ++ hw_state->x = ((pointer_x + 0x7fff) * (int)fb_width) / 0xFFFF; ++ hw_state->x *= input_touch_scale; + + /* > An annoyance - we get different starting positions + * depending upon whether pointer_device is +@@ -23484,7 +23494,8 @@ static void menu_input_get_touchscreen_hw_state( + p_rarch->keyboard_mapping_blocked, + 0, pointer_device, + 0, RETRO_DEVICE_ID_POINTER_Y); +- hw_state->y = ((pointer_y + 0x7fff) * (int)fb_height) / 0xFFFF; ++ hw_state->y = ((pointer_y + 0x7fff) * (int)fb_height) / 0xFFFF; ++ hw_state->y *= input_touch_scale; + + if (pointer_device == RARCH_DEVICE_POINTER_SCREEN) + { |