diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/peripherals/devices/PeripheralMouse.cpp | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/peripherals/devices/PeripheralMouse.cpp')
-rw-r--r-- | xbmc/peripherals/devices/PeripheralMouse.cpp | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/xbmc/peripherals/devices/PeripheralMouse.cpp b/xbmc/peripherals/devices/PeripheralMouse.cpp new file mode 100644 index 0000000..4f26236 --- /dev/null +++ b/xbmc/peripherals/devices/PeripheralMouse.cpp @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2017-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "PeripheralMouse.h" + +#include "games/GameServices.h" +#include "games/controllers/Controller.h" +#include "games/controllers/ControllerManager.h" +#include "input/InputManager.h" +#include "peripherals/Peripherals.h" + +#include <mutex> +#include <sstream> + +using namespace KODI; +using namespace PERIPHERALS; + +CPeripheralMouse::CPeripheralMouse(CPeripherals& manager, + const PeripheralScanResult& scanResult, + CPeripheralBus* bus) + : CPeripheral(manager, scanResult, bus) +{ + // Initialize CPeripheral + m_features.push_back(FEATURE_MOUSE); +} + +CPeripheralMouse::~CPeripheralMouse(void) +{ + m_manager.GetInputManager().UnregisterMouseDriverHandler(this); +} + +bool CPeripheralMouse::InitialiseFeature(const PeripheralFeature feature) +{ + bool bSuccess = false; + + if (CPeripheral::InitialiseFeature(feature)) + { + if (feature == FEATURE_MOUSE) + { + m_manager.GetInputManager().RegisterMouseDriverHandler(this); + } + + bSuccess = true; + } + + return bSuccess; +} + +void CPeripheralMouse::RegisterMouseDriverHandler(MOUSE::IMouseDriverHandler* handler, + bool bPromiscuous) +{ + using namespace KEYBOARD; + + std::unique_lock<CCriticalSection> lock(m_mutex); + + MouseHandle handle{handler, bPromiscuous}; + m_mouseHandlers.insert(m_mouseHandlers.begin(), handle); +} + +void CPeripheralMouse::UnregisterMouseDriverHandler(MOUSE::IMouseDriverHandler* handler) +{ + std::unique_lock<CCriticalSection> lock(m_mutex); + + auto it = + std::find_if(m_mouseHandlers.begin(), m_mouseHandlers.end(), + [handler](const MouseHandle& handle) { return handle.handler == handler; }); + + if (it != m_mouseHandlers.end()) + m_mouseHandlers.erase(it); +} + +GAME::ControllerPtr CPeripheralMouse::ControllerProfile() const +{ + if (m_controllerProfile) + return m_controllerProfile; + + return m_manager.GetControllerProfiles().GetDefaultMouse(); +} + +bool CPeripheralMouse::OnPosition(int x, int y) +{ + std::unique_lock<CCriticalSection> lock(m_mutex); + + bool bHandled = false; + + // Process promiscuous handlers + for (const MouseHandle& handle : m_mouseHandlers) + { + if (handle.bPromiscuous) + handle.handler->OnPosition(x, y); + } + + // Process handlers until one is handled + for (const MouseHandle& handle : m_mouseHandlers) + { + if (!handle.bPromiscuous) + { + bHandled = handle.handler->OnPosition(x, y); + if (bHandled) + break; + } + } + + if (bHandled) + m_lastActive = CDateTime::GetCurrentDateTime(); + + return bHandled; +} + +bool CPeripheralMouse::OnButtonPress(MOUSE::BUTTON_ID button) +{ + m_lastActive = CDateTime::GetCurrentDateTime(); + + std::unique_lock<CCriticalSection> lock(m_mutex); + + bool bHandled = false; + + // Process promiscuous handlers + for (const MouseHandle& handle : m_mouseHandlers) + { + if (handle.bPromiscuous) + handle.handler->OnButtonPress(button); + } + + // Process handlers until one is handled + for (const MouseHandle& handle : m_mouseHandlers) + { + if (!handle.bPromiscuous) + { + bHandled = handle.handler->OnButtonPress(button); + if (bHandled) + break; + } + } + + return bHandled; +} + +void CPeripheralMouse::OnButtonRelease(MOUSE::BUTTON_ID button) +{ + std::unique_lock<CCriticalSection> lock(m_mutex); + + for (const MouseHandle& handle : m_mouseHandlers) + handle.handler->OnButtonRelease(button); +} |