diff --git a/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp b/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp index f0e87dc7cc..7c0c11cb7e 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp @@ -256,9 +256,28 @@ namespace rsx break; } + // TODO: does the y offset need to be added or subtracted? + + // Calculate initial position and analog movement range. constexpr f32 margin = 50.0f; // Let's add a minimal margin on all sides - const u16 frame_x = static_cast(std::clamp(origin_x + m_x_offset, margin, static_cast(virtual_width - frame_w) - margin)); - const u16 frame_y = static_cast(std::clamp(origin_y + m_y_offset, margin, static_cast(virtual_height - (frame_h + button_height + button_margin)) - margin)); + const u16 x_min = static_cast(margin); + const u16 x_max = static_cast(static_cast(virtual_width - frame_w) - margin); + const u16 y_min = static_cast(margin); + const u16 y_max = static_cast(static_cast(virtual_height - (frame_h + button_height + button_margin)) - margin); + u16 frame_x = 0; + u16 frame_y = 0; + + // x pos should only be 0 the first time + if (m_x_pos == 0) + { + frame_x = m_x_pos = static_cast(std::clamp(origin_x + m_x_offset, x_min, x_max)); + frame_y = m_y_pos = static_cast(std::clamp(origin_y + m_y_offset, y_min, y_max)); + } + else + { + frame_x = m_x_pos = std::clamp(m_x_pos, x_min, x_max); + frame_y = m_y_pos = std::clamp(m_y_pos, y_min, y_max); + } m_frame.set_pos(frame_x, frame_y); m_frame.set_size(frame_w, frame_h); @@ -484,6 +503,20 @@ namespace rsx } }; + // Increase auto repeat interval for some buttons + switch (button_press) + { + case pad_button::rs_left: + case pad_button::rs_right: + case pad_button::rs_down: + case pad_button::rs_up: + m_auto_repeat_ms_interval = 10; + break; + default: + m_auto_repeat_ms_interval = m_auto_repeat_ms_interval_default; + break; + } + bool play_cursor_sound = true; switch (button_press) @@ -632,6 +665,26 @@ namespace rsx step_panel(true); break; } + case pad_button::rs_left: + case pad_button::rs_right: + case pad_button::rs_down: + case pad_button::rs_up: + { + if (!(flags & CELL_OSKDIALOG_NO_INPUT_ANALOG)) + { + switch (button_press) + { + case pad_button::rs_left: m_x_pos -= 5; break; + case pad_button::rs_right: m_x_pos += 5; break; + case pad_button::rs_down: m_y_pos += 5; break; + case pad_button::rs_up: m_y_pos -= 5; break; + default: break; + } + update_panel(); + } + play_cursor_sound = false; + break; + } default: break; } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_osk.h b/rpcs3/Emu/RSX/Overlays/overlay_osk.h index e97f967a35..12bb6b6d46 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_osk.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_osk.h @@ -57,6 +57,10 @@ namespace rsx // Pointer cursor_item m_pointer{}; + // Analog movement + u16 m_x_pos = 0; + u16 m_y_pos = 0; + // Grid u16 cell_size_x = 0; u16 cell_size_y = 0; diff --git a/rpcs3/Emu/RSX/Overlays/overlays.cpp b/rpcs3/Emu/RSX/Overlays/overlays.cpp index abceef070c..2a8ebe5de0 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlays.cpp @@ -49,11 +49,10 @@ namespace rsx { m_interactive = true; - const u64 ms_interval = 200; std::array timestamp; timestamp.fill(steady_clock::now()); - const u64 ms_threshold = 500; + constexpr u64 ms_threshold = 500; std::array initial_timestamp; initial_timestamp.fill(steady_clock::now()); @@ -98,7 +97,7 @@ namespace rsx { if (last_auto_repeat_button[pad_index] == button_id && m_input_timer.GetMsSince(initial_timestamp[pad_index]) > ms_threshold - && m_input_timer.GetMsSince(timestamp[pad_index]) > ms_interval) + && m_input_timer.GetMsSince(timestamp[pad_index]) > m_auto_repeat_ms_interval) { // The auto-repeat button was pressed for at least the given threshold in ms and will trigger at an interval. timestamp[pad_index] = steady_clock::now(); diff --git a/rpcs3/Emu/RSX/Overlays/overlays.h b/rpcs3/Emu/RSX/Overlays/overlays.h index 9fb468760d..3b12282822 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.h +++ b/rpcs3/Emu/RSX/Overlays/overlays.h @@ -91,11 +91,17 @@ namespace rsx protected: Timer m_input_timer; + static constexpr u64 m_auto_repeat_ms_interval_default = 200; + u64 m_auto_repeat_ms_interval = m_auto_repeat_ms_interval_default; std::set m_auto_repeat_buttons = { pad_button::dpad_up, pad_button::dpad_down, pad_button::dpad_left, pad_button::dpad_right, + pad_button::rs_up, + pad_button::rs_down, + pad_button::rs_left, + pad_button::rs_right, pad_button::ls_up, pad_button::ls_down, pad_button::ls_left,