From 6da40ce5a73b9cdf689d8d83126052d8ff43d932 Mon Sep 17 00:00:00 2001 From: EddyFrc Date: Wed, 17 Jun 2026 11:14:38 +0200 Subject: [PATCH] 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; +}; +