fix scroll direction: use RmlUi native touch API
Switch from mouse event emulation to RmlUi's native touch API (ProcessTouchStart/Move/End) for natural scrolling behavior. When dragging on scrollable content, the content now follows the finger/cursor direction instead of scrolling in reverse. - Designer: Use touch API when left mouse button is pressed - Android kernel: Use touch API for all touch events
This commit is contained in:
@@ -59,6 +59,11 @@ static std::string g_test_output_path; // Output file for record/screenshot/hie
|
||||
static mosis::testing::ActionRecorder* g_action_recorder = nullptr;
|
||||
static mosis::testing::ActionPlayer* g_action_player = nullptr;
|
||||
|
||||
// Touch simulation state for natural scrolling behavior
|
||||
static bool g_touch_active = false;
|
||||
static int g_touch_start_x = 0;
|
||||
static int g_touch_start_y = 0;
|
||||
|
||||
// Logging and hierarchy dump for testing
|
||||
static std::string g_log_file_path; // Log file path (--log)
|
||||
static std::string g_hierarchy_file_path; // Continuous hierarchy dump path (--hierarchy)
|
||||
@@ -211,12 +216,20 @@ static void MouseButtonCallback(GLFWwindow* window, int button, int action, int
|
||||
if (g_action_recorder && g_action_recorder->IsRecording()) {
|
||||
g_action_recorder->RecordMouseDown(mouseX, mouseY);
|
||||
}
|
||||
g_context->ProcessMouseButtonDown(0, key_modifier);
|
||||
// Use touch API for natural scrolling behavior
|
||||
g_touch_active = true;
|
||||
g_touch_start_x = mouseX;
|
||||
g_touch_start_y = mouseY;
|
||||
Rml::TouchList touches = {{0, Rml::Vector2f(static_cast<float>(mouseX), static_cast<float>(mouseY))}};
|
||||
g_context->ProcessTouchStart(touches, 0);
|
||||
} else if (action == GLFW_RELEASE) {
|
||||
if (g_action_recorder && g_action_recorder->IsRecording()) {
|
||||
g_action_recorder->RecordMouseUp(mouseX, mouseY);
|
||||
}
|
||||
g_context->ProcessMouseButtonUp(0, key_modifier);
|
||||
// End touch for natural scrolling
|
||||
g_touch_active = false;
|
||||
Rml::TouchList touches = {{0, Rml::Vector2f(static_cast<float>(mouseX), static_cast<float>(mouseY))}};
|
||||
g_context->ProcessTouchEnd(touches, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -234,7 +247,14 @@ static void CursorPosCallback(GLFWwindow* window, double xpos, double ypos) {
|
||||
int mouseX = static_cast<int>(xpos * fbWidth / winWidth);
|
||||
int mouseY = static_cast<int>(ypos * fbHeight / winHeight);
|
||||
|
||||
// Always update mouse position for hover effects
|
||||
g_context->ProcessMouseMove(mouseX, mouseY, 0);
|
||||
|
||||
// If touch is active (left button pressed), also send touch move for natural scrolling
|
||||
if (g_touch_active) {
|
||||
Rml::TouchList touches = {{0, Rml::Vector2f(static_cast<float>(mouseX), static_cast<float>(mouseY))}};
|
||||
g_context->ProcessTouchMove(touches, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void ScrollCallback(GLFWwindow* window, double xoffset, double yoffset) {
|
||||
|
||||
@@ -761,9 +761,13 @@ void Kernel::on_touch_down(float x, float y)
|
||||
m_tasks.emplace_back([x, y](Rml::Context* context){
|
||||
int px = static_cast<int>(x * 540);
|
||||
int py = static_cast<int>(y * 960);
|
||||
bool move_handled = context->ProcessMouseMove(px, py, 0);
|
||||
bool down_handled = context->ProcessMouseButtonDown(0, 0);
|
||||
Logger::Log(std::format("Touch at ({}, {}): move={}, down={}", px, py, move_handled, down_handled));
|
||||
|
||||
// Use native touch API for proper scroll direction (natural scrolling)
|
||||
// Touch ID 0 for primary touch point
|
||||
Rml::TouchList touches = {{0, Rml::Vector2f(static_cast<float>(px), static_cast<float>(py))}};
|
||||
context->ProcessTouchStart(touches, 0);
|
||||
|
||||
Logger::Log(std::format("Touch start at ({}, {})", px, py));
|
||||
|
||||
// Debug: Check if there's a hover element
|
||||
auto* hover_elem = context->GetHoverElement();
|
||||
@@ -782,7 +786,11 @@ void Kernel::on_touch_move(float x, float y)
|
||||
Logger::Log(std::format("on_touch_move {} - {}", x, y));
|
||||
std::lock_guard _lock(m_mutex);
|
||||
m_tasks.emplace_back([x, y](Rml::Context* context){
|
||||
context->ProcessMouseMove(static_cast<int>(x * 540), static_cast<int>(y * 960), 0);
|
||||
int px = static_cast<int>(x * 540);
|
||||
int py = static_cast<int>(y * 960);
|
||||
// Use native touch API for proper scroll direction
|
||||
Rml::TouchList touches = {{0, Rml::Vector2f(static_cast<float>(px), static_cast<float>(py))}};
|
||||
context->ProcessTouchMove(touches, 0);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -791,8 +799,11 @@ void Kernel::on_touch_up(float x, float y)
|
||||
Logger::Log(std::format("on_touch_up {} - {}", x, y));
|
||||
std::lock_guard _lock(m_mutex);
|
||||
m_tasks.emplace_back([x, y](Rml::Context* context){
|
||||
context->ProcessMouseMove(static_cast<int>(x * 540), static_cast<int>(y * 960), 0);
|
||||
context->ProcessMouseButtonUp(0, 0);
|
||||
int px = static_cast<int>(x * 540);
|
||||
int py = static_cast<int>(y * 960);
|
||||
// Use native touch API for proper scroll direction
|
||||
Rml::TouchList touches = {{0, Rml::Vector2f(static_cast<float>(px), static_cast<float>(py))}};
|
||||
context->ProcessTouchEnd(touches, 0);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user