summaryrefslogtreecommitdiffstats
path: root/xbmc/input/InputManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/input/InputManager.h')
-rw-r--r--xbmc/input/InputManager.h310
1 files changed, 310 insertions, 0 deletions
diff --git a/xbmc/input/InputManager.h b/xbmc/input/InputManager.h
new file mode 100644
index 0000000..52ad459
--- /dev/null
+++ b/xbmc/input/InputManager.h
@@ -0,0 +1,310 @@
+/*
+ * Copyright (C) 2005-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.
+ */
+
+#pragma once
+
+#include "input/KeyboardStat.h"
+#include "input/actions/Action.h"
+#include "input/button/ButtonStat.h"
+#include "input/mouse/MouseStat.h"
+#include "input/mouse/interfaces/IMouseInputProvider.h"
+#include "interfaces/IActionListener.h"
+#include "settings/lib/ISettingCallback.h"
+#include "threads/CriticalSection.h"
+#include "utils/Observer.h"
+#include "windowing/XBMC_events.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+class CButtonTranslator;
+class CCustomControllerTranslator;
+class CJoystickMapper;
+class CKey;
+class CProfileManager;
+class CTouchTranslator;
+class IKeymapEnvironment;
+class IWindowKeymap;
+
+namespace KODI
+{
+
+namespace KEYBOARD
+{
+class IKeyboardDriverHandler;
+}
+
+namespace MOUSE
+{
+class IMouseDriverHandler;
+}
+} // namespace KODI
+
+/// \addtogroup input
+/// \{
+
+/*!
+ * \ingroup input keyboard mouse touch joystick
+ * \brief Main input processing class.
+ *
+ * This class consolidates all input generated from different sources such as
+ * mouse, keyboard, joystick or touch (in \ref OnEvent).
+ *
+ * \copydoc keyboard
+ * \copydoc mouse
+ */
+class CInputManager : public ISettingCallback, public IActionListener, public Observable
+{
+public:
+ CInputManager();
+ CInputManager(const CInputManager&) = delete;
+ CInputManager const& operator=(CInputManager const&) = delete;
+ ~CInputManager() override;
+
+ /*! \brief decode a mouse event and reset idle timers.
+ *
+ * \param windowId Currently active window
+ * \return true if event is handled, false otherwise
+ */
+ bool ProcessMouse(int windowId);
+
+ /*! \brief decode an event from the event service, this can be mouse, key, joystick, reset idle
+ * timers.
+ *
+ * \param windowId Currently active window
+ * \param frameTime Time in seconds since last call
+ * \return true if event is handled, false otherwise
+ */
+ bool ProcessEventServer(int windowId, float frameTime);
+
+ /*! \brief decode an event from peripherals.
+ *
+ * \param frameTime Time in seconds since last call
+ * \return true if event is handled, false otherwise
+ */
+ bool ProcessPeripherals(float frameTime);
+
+ /*! \brief Process all inputs
+ *
+ * \param windowId Currently active window
+ * \param frameTime Time in seconds since last call
+ * \return true on success, false otherwise
+ */
+ bool Process(int windowId, float frameTime);
+
+ /*!
+ * \brief Call once during application startup to initialize peripherals that need it
+ */
+ void InitializeInputs();
+
+ /*!
+ * \brief Deinitialize input and keymaps
+ */
+ void Deinitialize();
+
+ /*! \brief Handle an input event
+ *
+ * \param newEvent event details
+ * \return true on successfully handled event
+ * \sa XBMC_Event
+ */
+ bool OnEvent(XBMC_Event& newEvent);
+
+ /*! \brief Control if the mouse is actively used or not
+ *
+ * \param[in] active sets mouse active or inactive
+ */
+ void SetMouseActive(bool active = true);
+
+ /*! \brief Control if we should use a mouse or not
+ *
+ * \param[in] mouseEnabled sets mouse enabled or disabled
+ */
+ void SetMouseEnabled(bool mouseEnabled = true);
+
+ /*! \brief Set the current state of the mouse such as click, drag operation
+ *
+ * \param[in] mouseState which state the mouse should be set to
+ * \sa MOUSE_STATE
+ */
+ void SetMouseState(MOUSE_STATE mouseState);
+
+ /*! \brief Check if the mouse is currently active
+ *
+ * \return true if active, false otherwise
+ */
+ bool IsMouseActive();
+
+ /*! \brief Get the current state of the mouse, such as click or drag operation
+ *
+ * \return the current state of the mouse as a value from MOUSE_STATE
+ * \sa MOUSE_STATE
+ */
+ MOUSE_STATE GetMouseState();
+
+ /*! \brief Get the current mouse positions x and y coordinates
+ *
+ * \return a struct containing the x and y coordinates
+ * \sa MousePosition
+ */
+ MousePosition GetMousePosition();
+
+ /*! \brief Set the current screen resolution and pointer speed
+ *
+ * \param[in] maxX screen width
+ * \param[in] maxY screen height
+ * \param[in] speedX mouse speed in x dimension
+ * \param[in] speedY mouse speed in y dimension
+ * \return
+ */
+ void SetMouseResolution(int maxX, int maxY, float speedX, float speedY);
+
+ /*! \brief Get the status of the controller-enable setting
+ * \return True if controller input is enabled for the UI, false otherwise
+ */
+ bool IsControllerEnabled() const;
+
+ /*! \brief Returns whether or not we can handle a given built-in command.
+ *
+ */
+ bool HasBuiltin(const std::string& command);
+
+ /*! \brief Parse a builtin command and execute any input action
+ * currently only LIRC commands implemented
+ *
+ * \param[in] execute Command to execute
+ * \param[in] params parameters that was passed to the command
+ * \return 0 on success, -1 on failure
+ */
+ int ExecuteBuiltin(const std::string& execute, const std::vector<std::string>& params);
+
+ // Button translation
+ bool LoadKeymaps();
+ bool ReloadKeymaps();
+ void ClearKeymaps();
+ void AddKeymap(const std::string& keymap);
+ void RemoveKeymap(const std::string& keymap);
+
+ const IKeymapEnvironment* KeymapEnvironment() const { return m_keymapEnvironment.get(); }
+
+ /*! \brief Obtain the action configured for a given window and key
+ *
+ * \param window the window id
+ * \param key the key to query the action for
+ * \param fallback if no action is directly configured for the given window, obtain the action
+ * from fallback window, if exists or from global config as last resort
+ *
+ * \return the action matching the key
+ */
+ CAction GetAction(int window, const CKey& key, bool fallback = true);
+
+ bool TranslateCustomControllerString(int windowId,
+ const std::string& controllerName,
+ int buttonId,
+ int& action,
+ std::string& strAction);
+
+ bool TranslateTouchAction(
+ int windowId, int touchAction, int touchPointers, int& action, std::string& actionString);
+
+ std::vector<std::shared_ptr<const IWindowKeymap>> GetJoystickKeymaps() const;
+
+ /*!
+ * \brief Queue an action to be processed on the next call to Process()
+ */
+ void QueueAction(const CAction& action);
+
+ // implementation of ISettingCallback
+ void OnSettingChanged(const std::shared_ptr<const CSetting>& setting) override;
+
+ // implementation of IActionListener
+ bool OnAction(const CAction& action) override;
+
+ void RegisterKeyboardDriverHandler(KODI::KEYBOARD::IKeyboardDriverHandler* handler);
+ void UnregisterKeyboardDriverHandler(KODI::KEYBOARD::IKeyboardDriverHandler* handler);
+
+ virtual void RegisterMouseDriverHandler(KODI::MOUSE::IMouseDriverHandler* handler);
+ virtual void UnregisterMouseDriverHandler(KODI::MOUSE::IMouseDriverHandler* handler);
+
+private:
+ /*! \brief Process keyboard event and translate into an action
+ *
+ * \param key keypress details
+ * \return true on successfully handled event
+ * \sa CKey
+ */
+ bool OnKey(const CKey& key);
+
+ /*! \brief Process key up event
+ *
+ * \param key details of released key
+ * \sa CKey
+ */
+ void OnKeyUp(const CKey& key);
+
+ /*! \brief Handle keypress
+ *
+ * \param key keypress details
+ * \return true on successfully handled event
+ */
+ bool HandleKey(const CKey& key);
+
+ /*! \brief Determine if an action should be processed or just
+ * cancel the screensaver
+ *
+ * \param action Action that is about to be processed
+ * \return true on any poweractions such as shutdown/reboot/sleep/suspend, false otherwise
+ * \sa CAction
+ */
+ bool AlwaysProcess(const CAction& action);
+
+ /*! \brief Send the Action to CApplication for further handling,
+ * play a sound before or after sending the action.
+ *
+ * \param action Action to send to CApplication
+ * \return result from CApplication::OnAction
+ * \sa CAction
+ */
+ bool ExecuteInputAction(const CAction& action);
+
+ /*! \brief Dispatch actions queued since the last call to Process()
+ */
+ void ProcessQueuedActions();
+
+ CKeyboardStat m_Keyboard;
+ KODI::INPUT::CButtonStat m_buttonStat;
+ CMouseStat m_Mouse;
+ CKey m_LastKey;
+
+ std::map<std::string, std::map<int, float>> m_lastAxisMap;
+
+ std::vector<CAction> m_queuedActions;
+ CCriticalSection m_actionMutex;
+
+ // Button translation
+ std::unique_ptr<IKeymapEnvironment> m_keymapEnvironment;
+ std::unique_ptr<CButtonTranslator> m_buttonTranslator;
+ std::unique_ptr<CCustomControllerTranslator> m_customControllerTranslator;
+ std::unique_ptr<CTouchTranslator> m_touchTranslator;
+ std::unique_ptr<CJoystickMapper> m_joystickTranslator;
+
+ std::vector<KODI::KEYBOARD::IKeyboardDriverHandler*> m_keyboardHandlers;
+ std::vector<KODI::MOUSE::IMouseDriverHandler*> m_mouseHandlers;
+
+ std::unique_ptr<KODI::KEYBOARD::IKeyboardDriverHandler> m_keyboardEasterEgg;
+
+ // Input state
+ bool m_enableController = true;
+
+ // Settings
+ static const std::string SETTING_INPUT_ENABLE_CONTROLLER;
+};
+
+/// \}