From 2b358a98d3c528ec42ed73719afafe00aa729927 Mon Sep 17 00:00:00 2001 From: EddyFrc Date: Mon, 15 Jun 2026 10:41:16 +0200 Subject: [PATCH 1/5] KeyboardController has a default position which is the center of the screen --- src/input/api/Keyboard/KeyboardController.cpp | 6 ++++++ src/input/api/Keyboard/KeyboardController.h | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/src/input/api/Keyboard/KeyboardController.cpp b/src/input/api/Keyboard/KeyboardController.cpp index 0514cd5d..3c6cd29e 100644 --- a/src/input/api/Keyboard/KeyboardController.cpp +++ b/src/input/api/Keyboard/KeyboardController.cpp @@ -9,6 +9,12 @@ KeyboardController::KeyboardController() } +glm::vec2 KeyboardController::get_position() +{ + // arbitrary values for test purpose + return {0.5, 0.5}; +} + std::string KeyboardController::get_button_name(uint64 button) const { return WindowSystem::GetKeyCodeName(button); diff --git a/src/input/api/Keyboard/KeyboardController.h b/src/input/api/Keyboard/KeyboardController.h index 281d3aff..e6f74358 100644 --- a/src/input/api/Keyboard/KeyboardController.h +++ b/src/input/api/Keyboard/KeyboardController.h @@ -19,6 +19,10 @@ public: bool has_axis() const override { return false; } + bool has_position() override { return true; } + glm::vec2 get_position() override; + PositionVisibility GetPositionVisibility() override { return PositionVisibility::FULL; } + std::string get_button_name(uint64 button) const override; protected: From 71075104438efbd706d9e6be3a5e4bc04365c1d6 Mon Sep 17 00:00:00 2001 From: EddyFrc Date: Mon, 15 Jun 2026 19:24:05 +0200 Subject: [PATCH 2/5] Bind KeyboardController position data to actual mouse position relative to the render canvas. This makes (or at least should make) the mouse pointer act as the wiimote pointer --- src/gui/wxgui/MainWindow.cpp | 6 ++++++ src/input/InputManager.cpp | 10 ++++++++++ src/input/InputManager.h | 7 +++++++ src/input/api/Keyboard/KeyboardController.cpp | 3 +-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/gui/wxgui/MainWindow.cpp b/src/gui/wxgui/MainWindow.cpp index c1cfc242..ab40fc22 100644 --- a/src/gui/wxgui/MainWindow.cpp +++ b/src/gui/wxgui/MainWindow.cpp @@ -1389,6 +1389,12 @@ void MainWindow::OnMouseMove(wxMouseEvent& event) std::unique_lock lock(instance.m_main_mouse.m_mutex); auto physPos = ToPhys(event.GetPosition()); instance.m_main_mouse.position = { physPos.x, physPos.y }; + auto renderCanvasMouse = m_render_canvas->ScreenToClient(m_mouse_position); + instance.SetMousePositionInRenderBox + ({ + static_cast(renderCanvasMouse.x) / m_render_canvas->m_width, + static_cast(renderCanvasMouse.y) / m_render_canvas->m_height, + }); lock.unlock(); if (!IsFullScreen()) diff --git a/src/input/InputManager.cpp b/src/input/InputManager.cpp index 44973d8d..3ebaa908 100644 --- a/src/input/InputManager.cpp +++ b/src/input/InputManager.cpp @@ -928,6 +928,16 @@ std::optional InputManager::get_right_down_mouse_info(bool* is_pad) return {}; } +glm::vec2 InputManager::GetMousePositionInRenderBox() const +{ + return m_mouseInRenderCanvas; +} + +void InputManager::SetMousePositionInRenderBox(glm::vec2 newMousePosition) +{ + m_mouseInRenderCanvas = newMousePosition; +} + void InputManager::update_thread() { SetThreadName("Input_update"); diff --git a/src/input/InputManager.h b/src/input/InputManager.h index b510474b..9383f5d3 100644 --- a/src/input/InputManager.h +++ b/src/input/InputManager.h @@ -91,10 +91,17 @@ public: glm::ivec2 get_mouse_position(bool pad_window) const; std::optional get_left_down_mouse_info(bool* is_pad); std::optional get_right_down_mouse_info(bool* is_pad); + // Returns the mouse position relative to the render canvas (see MainWindow::m_render_canvas). + // (0, 0) is up left; (1, 1) is down right. The values may be negative or above 1 if the mouse cursor + // is outside the render canvas. At the time of writing this, it is used only for mouse-to-wiimote pointer feature. + glm::vec2 GetMousePositionInRenderBox() const; + void SetMousePositionInRenderBox(glm::vec2 newMousePosition); std::atomic m_mouse_wheel; private: + glm::vec2 m_mouseInRenderCanvas{}; + void update_thread(); std::thread m_update_thread; diff --git a/src/input/api/Keyboard/KeyboardController.cpp b/src/input/api/Keyboard/KeyboardController.cpp index 3c6cd29e..3e2d4022 100644 --- a/src/input/api/Keyboard/KeyboardController.cpp +++ b/src/input/api/Keyboard/KeyboardController.cpp @@ -11,8 +11,7 @@ KeyboardController::KeyboardController() glm::vec2 KeyboardController::get_position() { - // arbitrary values for test purpose - return {0.5, 0.5}; + return InputManager::instance().GetMousePositionInRenderBox(); } std::string KeyboardController::get_button_name(uint64 button) const From 6da40ce5a73b9cdf689d8d83126052d8ff43d932 Mon Sep 17 00:00:00 2001 From: EddyFrc Date: Wed, 17 Jun 2026 11:14:38 +0200 Subject: [PATCH 3/5] Move the mouse to wiimote pointer implementation in separate classes --- src/gui/wxgui/MainWindow.cpp | 4 ++-- src/gui/wxgui/input/InputAPIAddWindow.cpp | 17 +++++++++++++-- src/input/CMakeLists.txt | 4 ++++ src/input/ControllerFactory.cpp | 5 +++++ src/input/InputManager.cpp | 6 ++++++ src/input/api/InputAPI.h | 5 +++++ src/input/api/Keyboard/KeyboardController.cpp | 5 ----- src/input/api/Keyboard/KeyboardController.h | 4 ---- src/input/api/Mouse/MouseController.cpp | 13 ++++++++++++ src/input/api/Mouse/MouseController.h | 21 +++++++++++++++++++ .../api/Mouse/MouseControllerProvider.cpp | 10 +++++++++ src/input/api/Mouse/MouseControllerProvider.h | 17 +++++++++++++++ 12 files changed, 98 insertions(+), 13 deletions(-) create mode 100644 src/input/api/Mouse/MouseController.cpp create mode 100644 src/input/api/Mouse/MouseController.h create mode 100644 src/input/api/Mouse/MouseControllerProvider.cpp create mode 100644 src/input/api/Mouse/MouseControllerProvider.h diff --git a/src/gui/wxgui/MainWindow.cpp b/src/gui/wxgui/MainWindow.cpp index ab40fc22..335eeddd 100644 --- a/src/gui/wxgui/MainWindow.cpp +++ b/src/gui/wxgui/MainWindow.cpp @@ -1392,8 +1392,8 @@ void MainWindow::OnMouseMove(wxMouseEvent& event) auto renderCanvasMouse = m_render_canvas->ScreenToClient(m_mouse_position); instance.SetMousePositionInRenderBox ({ - static_cast(renderCanvasMouse.x) / m_render_canvas->m_width, - static_cast(renderCanvasMouse.y) / m_render_canvas->m_height, + static_cast(renderCanvasMouse.x) / m_render_canvas->m_clientWidth, + static_cast(renderCanvasMouse.y) / m_render_canvas->m_clientHeight, }); lock.unlock(); diff --git a/src/gui/wxgui/input/InputAPIAddWindow.cpp b/src/gui/wxgui/input/InputAPIAddWindow.cpp index b10a2c75..c3fcde60 100644 --- a/src/gui/wxgui/input/InputAPIAddWindow.cpp +++ b/src/gui/wxgui/input/InputAPIAddWindow.cpp @@ -173,10 +173,23 @@ void InputAPIAddWindow::on_api_selected(wxCommandEvent& event) m_controller_list->SetSelection(wxNOT_FOUND); const auto selection = m_input_api->GetStringSelection(); - // keyboard is a special case, as theres only one device supported atm + // keyboard and mouse are special cases, as theres only one device supported atm + bool isSingleDeviceOnly{false}; + InputAPI::Type singleDeviceAPI; if (selection == wxString::FromUTF8(to_string(InputAPI::Keyboard))) { - const auto controllers = InputManager::instance().get_api_provider(InputAPI::Keyboard)->get_controllers(); + isSingleDeviceOnly = true; + singleDeviceAPI = InputAPI::Keyboard; + } + else if (selection == wxString::FromUTF8(to_string(InputAPI::Mouse))) + { + isSingleDeviceOnly = true; + singleDeviceAPI = InputAPI::Mouse; + } + + if (isSingleDeviceOnly) + { + const auto controllers = InputManager::instance().get_api_provider(singleDeviceAPI)->get_controllers(); if (!controllers.empty()) { m_controller = controllers[0]; diff --git a/src/input/CMakeLists.txt b/src/input/CMakeLists.txt index 4978ef0a..b485f309 100644 --- a/src/input/CMakeLists.txt +++ b/src/input/CMakeLists.txt @@ -19,6 +19,10 @@ add_library(CemuInput api/Keyboard/KeyboardControllerProvider.cpp api/Keyboard/KeyboardController.cpp api/Keyboard/KeyboardController.h + api/Mouse/MouseControllerProvider.h + api/Mouse/MouseControllerProvider.cpp + api/Mouse/MouseController.cpp + api/Mouse/MouseController.h emulated/ProController.cpp emulated/EmulatedController.h emulated/EmulatedController.cpp diff --git a/src/input/ControllerFactory.cpp b/src/input/ControllerFactory.cpp index 3827e1d4..4e331815 100644 --- a/src/input/ControllerFactory.cpp +++ b/src/input/ControllerFactory.cpp @@ -1,5 +1,6 @@ #include "input/ControllerFactory.h" +#include "api/Mouse/MouseController.h" #include "input/emulated/VPADController.h" #include "input/emulated/ProController.h" #include "input/emulated/ClassicController.h" @@ -31,6 +32,10 @@ ControllerPtr ControllerFactory::CreateController(InputAPI::Type api, std::strin case InputAPI::Keyboard: return std::make_shared(); #endif +#if HAS_MOUSE + case InputAPI::Mouse: + return std::make_shared(); +#endif #if HAS_DIRECTINPUT case InputAPI::DirectInput: { diff --git a/src/input/InputManager.cpp b/src/input/InputManager.cpp index 3ebaa908..efbcd84b 100644 --- a/src/input/InputManager.cpp +++ b/src/input/InputManager.cpp @@ -5,6 +5,7 @@ #include #include "Cafe/GameProfile/GameProfile.h" #include "util/EventService.h" +#include "input/api/Mouse/MouseControllerProvider.h" InputManager::InputManager() { @@ -28,6 +29,9 @@ InputManager::InputManager() #if HAS_KEYBOARD create_provider(); #endif +#if HAS_MOUSE + create_provider(); +#endif #ifdef HAS_SDL create_provider(); #endif @@ -233,6 +237,8 @@ bool InputManager::migrate_config(const fs::path& file_path) std::string uuid; if (api_string == to_string(InputAPI::Keyboard)) uuid = to_string(InputAPI::Keyboard); + else if (api_string == to_string(InputAPI::Mouse)) + uuid = to_string(InputAPI::Mouse); else { if (!uuid_opt) diff --git a/src/input/api/InputAPI.h b/src/input/api/InputAPI.h index a5f1f926..646042af 100644 --- a/src/input/api/InputAPI.h +++ b/src/input/api/InputAPI.h @@ -7,6 +7,7 @@ namespace InputAPI enum Type { Keyboard, + Mouse, SDLController, XInput, DirectInput, @@ -26,6 +27,8 @@ namespace InputAPI { case Keyboard: return "Keyboard"; + case Mouse: + return "Mouse"; case DirectInput: return "DirectInput"; case XInput: @@ -53,6 +56,8 @@ namespace InputAPI { if (str == to_string(Keyboard)) return Keyboard; + else if (str == to_string(Mouse)) + return Mouse; else if (str == to_string(DirectInput)) return DirectInput; else if (str == to_string(XInput)) diff --git a/src/input/api/Keyboard/KeyboardController.cpp b/src/input/api/Keyboard/KeyboardController.cpp index 3e2d4022..0514cd5d 100644 --- a/src/input/api/Keyboard/KeyboardController.cpp +++ b/src/input/api/Keyboard/KeyboardController.cpp @@ -9,11 +9,6 @@ KeyboardController::KeyboardController() } -glm::vec2 KeyboardController::get_position() -{ - return InputManager::instance().GetMousePositionInRenderBox(); -} - std::string KeyboardController::get_button_name(uint64 button) const { return WindowSystem::GetKeyCodeName(button); diff --git a/src/input/api/Keyboard/KeyboardController.h b/src/input/api/Keyboard/KeyboardController.h index e6f74358..281d3aff 100644 --- a/src/input/api/Keyboard/KeyboardController.h +++ b/src/input/api/Keyboard/KeyboardController.h @@ -19,10 +19,6 @@ public: bool has_axis() const override { return false; } - bool has_position() override { return true; } - glm::vec2 get_position() override; - PositionVisibility GetPositionVisibility() override { return PositionVisibility::FULL; } - std::string get_button_name(uint64 button) const override; protected: diff --git a/src/input/api/Mouse/MouseController.cpp b/src/input/api/Mouse/MouseController.cpp new file mode 100644 index 00000000..8d7345ae --- /dev/null +++ b/src/input/api/Mouse/MouseController.cpp @@ -0,0 +1,13 @@ +#include "MouseController.h" +#include "input/api/Controller.h" + +std::string_view MouseController::api_name() const +{ + static_assert(to_string(InputAPI::Mouse) == "Mouse"); + return to_string(InputAPI::Mouse); +} + +glm::vec2 MouseController::get_position() +{ + return InputManager::instance().GetMousePositionInRenderBox(); +} diff --git a/src/input/api/Mouse/MouseController.h b/src/input/api/Mouse/MouseController.h new file mode 100644 index 00000000..dd81cc31 --- /dev/null +++ b/src/input/api/Mouse/MouseController.h @@ -0,0 +1,21 @@ +#pragma once + +#include "MouseControllerProvider.h" +#include "input/api/Controller.h" + + +class MouseController : public Controller +{ +public: + MouseController() : base_type("mouse", "Mouse") {} + + std::string_view api_name() const override; + InputAPI::Type api() const override { return InputAPI::Mouse; } + bool is_connected() override { return true; } + ControllerState raw_state() override { return {}; } + + bool has_position() override { return true; } + glm::vec2 get_position() override; + PositionVisibility GetPositionVisibility() override { return PositionVisibility::FULL; } +}; + diff --git a/src/input/api/Mouse/MouseControllerProvider.cpp b/src/input/api/Mouse/MouseControllerProvider.cpp new file mode 100644 index 00000000..5c96ee85 --- /dev/null +++ b/src/input/api/Mouse/MouseControllerProvider.cpp @@ -0,0 +1,10 @@ +#include "MouseControllerProvider.h" + +#include "MouseController.h" + +std::vector> MouseControllerProvider::get_controllers() +{ + std::vector> result; + result.emplace_back(std::make_shared()); + return result; +} diff --git a/src/input/api/Mouse/MouseControllerProvider.h b/src/input/api/Mouse/MouseControllerProvider.h new file mode 100644 index 00000000..fdf957e1 --- /dev/null +++ b/src/input/api/Mouse/MouseControllerProvider.h @@ -0,0 +1,17 @@ +#pragma once + +#include "input/api/ControllerProvider.h" + +#ifndef HAS_MOUSE +#define HAS_MOUSE 1 +#endif + +class MouseControllerProvider : public ControllerProviderBase +{ +public: + inline static InputAPI::Type kAPIType = InputAPI::Mouse; + InputAPI::Type api() const override { return kAPIType; } + + std::vector> get_controllers() override; +}; + From 0277f2e60e6cd67b599d86223a385184e3240301 Mon Sep 17 00:00:00 2001 From: EddyFrc Date: Mon, 29 Jun 2026 08:57:50 +0200 Subject: [PATCH 4/5] UI: Add MouseController settings to enable/disable position through a checkbox --- src/gui/wxgui/CMakeLists.txt | 2 + src/gui/wxgui/input/InputSettings2.cpp | 11 ++- .../settings/MouseControllerSettings.cpp | 72 +++++++++++++++++++ .../input/settings/MouseControllerSettings.h | 25 +++++++ src/input/api/Mouse/MouseController.cpp | 13 ++++ src/input/api/Mouse/MouseController.h | 7 +- 6 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/gui/wxgui/input/settings/MouseControllerSettings.cpp create mode 100644 src/gui/wxgui/input/settings/MouseControllerSettings.h diff --git a/src/gui/wxgui/CMakeLists.txt b/src/gui/wxgui/CMakeLists.txt index 079a78cd..90e9a5a7 100644 --- a/src/gui/wxgui/CMakeLists.txt +++ b/src/gui/wxgui/CMakeLists.txt @@ -88,6 +88,8 @@ add_library(CemuWxGui STATIC input/settings/DefaultControllerSettings.h input/settings/WiimoteControllerSettings.cpp input/settings/WiimoteControllerSettings.h + input/settings/MouseControllerSettings.cpp + input/settings/MouseControllerSettings.h LoggingWindow.cpp LoggingWindow.h MainWindow.cpp diff --git a/src/gui/wxgui/input/InputSettings2.cpp b/src/gui/wxgui/input/InputSettings2.cpp index d77e1430..dae93b8f 100644 --- a/src/gui/wxgui/input/InputSettings2.cpp +++ b/src/gui/wxgui/input/InputSettings2.cpp @@ -25,6 +25,7 @@ #include "wxgui/input/PairingDialog.h" #endif +#include "input/api/Mouse/MouseController.h" #include "wxgui/input/panels/VPADInputPanel.h" #include "wxgui/input/panels/ProControllerInputPanel.h" @@ -35,6 +36,7 @@ #include "util/EventService.h" #include "resource/embedded/resources.h" +#include "settings/MouseControllerSettings.h" bool g_inputConfigWindowHasFocus = false; @@ -960,7 +962,14 @@ void InputSettings2::on_controller_settings(wxCommandEvent& event) wnd.ShowModal(); break; } - + case InputAPI::Mouse: + { + const auto mouse_controller = std::dynamic_pointer_cast(controller); + wxASSERT(mouse_controller); + MouseControllerSettings wnd(this, wxGetMousePosition() + wxSize(5, 5), mouse_controller); + wnd.ShowModal(); + break; + } case InputAPI::Keyboard: break; #ifdef SUPPORTS_WIIMOTE diff --git a/src/gui/wxgui/input/settings/MouseControllerSettings.cpp b/src/gui/wxgui/input/settings/MouseControllerSettings.cpp new file mode 100644 index 00000000..7f877d16 --- /dev/null +++ b/src/gui/wxgui/input/settings/MouseControllerSettings.cpp @@ -0,0 +1,72 @@ +#include "MouseControllerSettings.h" + +#include "input/api/Mouse/MouseController.h" + +#include +#include +#include +#include + +#include "wxgui/helpers/wxHelpers.h" +#include "wxgui/input/InputAPIAddWindow.h" + + +MouseControllerSettings::MouseControllerSettings(wxWindow* parent, const wxPoint& position, std::shared_ptr controller) + : wxDialog(parent, wxID_ANY, _("Controller settings"), position, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE), m_controller(std::move(controller)) +{ + this->SetSizeHints(wxDefaultSize, wxDefaultSize); + + auto* sizer = new wxBoxSizer(wxVERTICAL); + + // options + { + auto* box = new wxStaticBox(this, wxID_ANY, _("Options")); + auto* box_sizer = new wxStaticBoxSizer(box, wxVERTICAL); + + // Position (wiimote pointer) + m_usePosition = new wxCheckBox(box, wxID_ANY, _("Use position")); + m_usePosition->SetValue(m_controller->IsPositionEnabled()); + m_usePosition->Enable(m_controller->has_position()); + box_sizer->Add(m_usePosition, 0, wxEXPAND | wxALL, 5); + + sizer->Add(box_sizer, 1, wxALL|wxEXPAND, 5); + } + + { + auto* control_sizer = new wxFlexGridSizer(0, 3, 0, 0); + control_sizer->AddGrowableCol(2); + + auto* ok_button = new wxButton(this, wxID_ANY, _("OK")); + ok_button->Bind(wxEVT_BUTTON, [this](auto&) { UpdateSettings(); EndModal(wxID_OK); }); + control_sizer->Add(ok_button, 0, wxALL, 5); + + control_sizer->Add(0, 0, 0, wxEXPAND, 5); + + auto* cancel_button = new wxButton(this, wxID_ANY, _("Cancel")); + cancel_button->Bind(wxEVT_BUTTON, [this](auto&) { EndModal(wxID_CANCEL); }); + control_sizer->Add(cancel_button, 0, wxALL, 5); + + sizer->Add(control_sizer, 0, wxEXPAND, 5); + } + + this->SetSizer(sizer); + this->Layout(); + this->Fit(); + + this->Bind(wxEVT_CLOSE_WINDOW, &MouseControllerSettings::OnClose, this); +} + +void MouseControllerSettings::UpdateSettings() +{ + if (m_usePosition) + m_controller->SetPositionEnabled(m_usePosition->GetValue()); +} + +void MouseControllerSettings::OnClose(wxCloseEvent& event) +{ + if (this->GetReturnCode() == 0 || this->GetReturnCode() == wxID_OK) + UpdateSettings(); + + event.Skip(); +} diff --git a/src/gui/wxgui/input/settings/MouseControllerSettings.h b/src/gui/wxgui/input/settings/MouseControllerSettings.h new file mode 100644 index 00000000..77d58476 --- /dev/null +++ b/src/gui/wxgui/input/settings/MouseControllerSettings.h @@ -0,0 +1,25 @@ +#pragma once + +#include "input/api/Controller.h" +#include "wx/dialog.h" + +#include + +class wxCheckBox; +class wxPoint; +class wxWindow; +class MouseController; + +class MouseControllerSettings : public wxDialog +{ +public: + MouseControllerSettings(wxWindow* parent, const wxPoint& position, std::shared_ptr controller); + +private: + std::shared_ptr m_controller; + + wxCheckBox* m_usePosition = nullptr; + + void UpdateSettings(); + void OnClose(wxCloseEvent& event); +}; diff --git a/src/input/api/Mouse/MouseController.cpp b/src/input/api/Mouse/MouseController.cpp index 8d7345ae..fe92231a 100644 --- a/src/input/api/Mouse/MouseController.cpp +++ b/src/input/api/Mouse/MouseController.cpp @@ -7,7 +7,20 @@ std::string_view MouseController::api_name() const return to_string(InputAPI::Mouse); } +MouseController& MouseController::SetPositionEnabled(bool value) +{ + m_isPositionEnabled = value; + return *this; +} + glm::vec2 MouseController::get_position() { return InputManager::instance().GetMousePositionInRenderBox(); } + +PositionVisibility MouseController::GetPositionVisibility() +{ + return IsPositionEnabled() + ? PositionVisibility::FULL + : PositionVisibility::NONE; +} diff --git a/src/input/api/Mouse/MouseController.h b/src/input/api/Mouse/MouseController.h index dd81cc31..55953f48 100644 --- a/src/input/api/Mouse/MouseController.h +++ b/src/input/api/Mouse/MouseController.h @@ -15,7 +15,12 @@ public: ControllerState raw_state() override { return {}; } bool has_position() override { return true; } + bool IsPositionEnabled() const { return m_isPositionEnabled; } + MouseController& SetPositionEnabled(bool value); glm::vec2 get_position() override; - PositionVisibility GetPositionVisibility() override { return PositionVisibility::FULL; } + PositionVisibility GetPositionVisibility() override; + +private: + bool m_isPositionEnabled = false; }; From 6b80581896185a82abd7e9cb6f177ef8c207fc27 Mon Sep 17 00:00:00 2001 From: EddyFrc Date: Wed, 1 Jul 2026 15:22:41 +0200 Subject: [PATCH 5/5] fix: previously used members of wxWindow that seems inaccessible or missing on Windows --- src/gui/wxgui/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/wxgui/MainWindow.cpp b/src/gui/wxgui/MainWindow.cpp index c0dd8724..7354d5a7 100644 --- a/src/gui/wxgui/MainWindow.cpp +++ b/src/gui/wxgui/MainWindow.cpp @@ -1386,8 +1386,8 @@ void MainWindow::OnMouseMove(wxMouseEvent& event) auto renderCanvasMouse = m_render_canvas->ScreenToClient(m_mouse_position); instance.SetMousePositionInRenderBox ({ - static_cast(renderCanvasMouse.x) / m_render_canvas->m_clientWidth, - static_cast(renderCanvasMouse.y) / m_render_canvas->m_clientHeight, + static_cast(renderCanvasMouse.x) / m_render_canvas->GetClientSize().GetWidth(), + static_cast(renderCanvasMouse.y) / m_render_canvas->GetClientSize().GetHeight(), }); lock.unlock();