Fix desktop designer click handling and add goHome API
Designer click handling: - Fix DPI scaling in MouseButtonCallback and CursorPosCallback - Scale coordinates from window space to framebuffer/RmlUi context - Remove window resizing in ResizeToPhone (caused DPI mismatches) Test framework: - Fix SendMouseDown to use MOUSEEVENTF_MOVE before button down - Remove double-scaling in ScaleToPhysical (WindowController handles it) - All 5 UI navigation tests now pass Kernel API: - Add goHome() Lua function to return to home screen - Stops any running third-party apps before navigating Test app: - Update sandbox-test to use goHome() instead of goBack() Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -156,10 +156,30 @@ static void MouseButtonCallback(GLFWwindow* window, int button, int action, int
|
||||
double xpos, ypos;
|
||||
glfwGetCursorPos(window, &xpos, &ypos);
|
||||
|
||||
// GLFW cursor callbacks report coordinates in screen/window coordinates (logical pixels)
|
||||
// which match the RmlUi context dimensions, so no scaling needed
|
||||
int mouseX = static_cast<int>(xpos);
|
||||
int mouseY = static_cast<int>(ypos);
|
||||
// glfwGetCursorPos returns position in screen coordinates (same as window size)
|
||||
// which may differ from framebuffer size on high-DPI displays.
|
||||
// We need to scale to match the RmlUi context (which matches framebuffer).
|
||||
int winWidth, winHeight;
|
||||
glfwGetWindowSize(window, &winWidth, &winHeight);
|
||||
|
||||
int fbWidth, fbHeight;
|
||||
glfwGetFramebufferSize(window, &fbWidth, &fbHeight);
|
||||
|
||||
// Scale cursor position: screen coords -> framebuffer coords -> RmlUi context
|
||||
// On high DPI: winWidth=432, fbWidth=540, g_width=540
|
||||
// Cursor in screen space needs to scale to framebuffer/context space
|
||||
int mouseX = static_cast<int>(xpos * fbWidth / winWidth);
|
||||
int mouseY = static_cast<int>(ypos * fbHeight / winHeight);
|
||||
|
||||
// Debug logging for click events
|
||||
std::cout << "MouseButton: " << (action == GLFW_PRESS ? "DOWN" : "UP")
|
||||
<< " at raw(" << xpos << "," << ypos << ") -> scaled(" << mouseX << "," << mouseY << ")"
|
||||
<< " win=" << winWidth << "x" << winHeight << " fb=" << fbWidth << "x" << fbHeight << std::endl;
|
||||
if (g_log_file.is_open()) {
|
||||
g_log_file << "[DEBUG] MouseButton: " << (action == GLFW_PRESS ? "DOWN" : "UP")
|
||||
<< " at raw(" << xpos << "," << ypos << ") -> scaled(" << mouseX << "," << mouseY << ")" << std::endl;
|
||||
g_log_file.flush();
|
||||
}
|
||||
|
||||
int key_modifier = 0;
|
||||
if (mods & GLFW_MOD_CONTROL) key_modifier |= Rml::Input::KM_CTRL;
|
||||
@@ -187,10 +207,15 @@ static void MouseButtonCallback(GLFWwindow* window, int button, int action, int
|
||||
static void CursorPosCallback(GLFWwindow* window, double xpos, double ypos) {
|
||||
if (!g_context) return;
|
||||
|
||||
// GLFW cursor callbacks report coordinates in screen/window coordinates (logical pixels)
|
||||
// which match the RmlUi context dimensions, so no scaling needed
|
||||
int mouseX = static_cast<int>(xpos);
|
||||
int mouseY = static_cast<int>(ypos);
|
||||
// Scale from screen coordinates to framebuffer/RmlUi context coordinates
|
||||
int winWidth, winHeight;
|
||||
glfwGetWindowSize(window, &winWidth, &winHeight);
|
||||
|
||||
int fbWidth, fbHeight;
|
||||
glfwGetFramebufferSize(window, &fbWidth, &fbHeight);
|
||||
|
||||
int mouseX = static_cast<int>(xpos * fbWidth / winWidth);
|
||||
int mouseY = static_cast<int>(ypos * fbHeight / winHeight);
|
||||
|
||||
g_context->ProcessMouseMove(mouseX, mouseY, 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user