// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2026 A-La-Karte Contributors #include "inputmanager.h" #include "gamepadmanager.h" #include #include #include InputManager *InputManager::s_instance = nullptr; InputManager::InputManager(QObject *parent) : QObject(parent) { if (QCoreApplication::instance()) { QCoreApplication::instance()->installEventFilter(this); } auto *pad = GamepadManager::instance(); connect(pad, &GamepadManager::activeChanged, this, [this, pad]() { if (pad->active()) { if (!m_hasSeenGamepad) { m_hasSeenGamepad = true; Q_EMIT inputHistoryChanged(); } setActiveInput(Gamepad); } }); connect(pad, &GamepadManager::connectedChanged, this, [this, pad]() { if (!pad->connected() && m_activeInput == Gamepad) { setActiveInput(KeyboardMouse); } }); } InputManager *InputManager::instance() { if (!s_instance) { s_instance = new InputManager(); } return s_instance; } InputManager *InputManager::create(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) Q_UNUSED(scriptEngine) return instance(); } InputManager::ActiveInput InputManager::activeInput() const { return m_activeInput; } bool InputManager::hasSeenKeyboardMouse() const { return m_hasSeenKeyboardMouse; } bool InputManager::hasSeenGamepad() const { return m_hasSeenGamepad; } void InputManager::setActiveInput(ActiveInput input) { if (m_activeInput == input) { return; } m_activeInput = input; Q_EMIT activeInputChanged(); } bool InputManager::eventFilter(QObject *watched, QEvent *event) { Q_UNUSED(watched) if (!event) { return false; } switch (event->type()) { case QEvent::KeyPress: case QEvent::KeyRelease: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::Wheel: if (!m_hasSeenKeyboardMouse) { m_hasSeenKeyboardMouse = true; Q_EMIT inputHistoryChanged(); } setActiveInput(KeyboardMouse); break; default: break; } return false; }