kodi
InputManager.h
1 /*
2  * Copyright (C) 2005-2024 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "input/actions/Action.h"
12 #include "input/actions/interfaces/IActionListener.h"
13 #include "input/keyboard/KeyboardStat.h"
14 #include "input/keymaps/ButtonStat.h"
15 #include "input/mouse/MouseStat.h"
16 #include "input/mouse/interfaces/IMouseInputProvider.h"
17 #include "settings/lib/ISettingCallback.h"
18 #include "threads/CriticalSection.h"
19 #include "utils/Observer.h"
20 #include "windowing/XBMC_events.h"
21 
22 #include <map>
23 #include <memory>
24 #include <string>
25 #include <vector>
26 
27 class CKey;
28 class CProfileManager;
29 
30 namespace KODI
31 {
32 
33 namespace KEYBOARD
34 {
35 class IKeyboardDriverHandler;
36 }
37 
38 namespace KEYMAP
39 {
40 class CButtonTranslator;
41 class CCustomControllerTranslator;
42 class CJoystickMapper;
43 class CTouchTranslator;
44 class IKeymapEnvironment;
45 class IWindowKeymap;
46 } // namespace KEYMAP
47 
48 namespace MOUSE
49 {
50 class IMouseDriverHandler;
51 }
52 } // namespace KODI
53 
56 
70  public Observable
71 {
72 public:
73  CInputManager();
74  CInputManager(const CInputManager&) = delete;
75  CInputManager const& operator=(CInputManager const&) = delete;
76  ~CInputManager() override;
77 
83  bool ProcessMouse(int windowId);
84 
92  bool ProcessEventServer(int windowId, float frameTime);
93 
99  bool ProcessPeripherals(float frameTime);
100 
107  bool Process(int windowId, float frameTime);
108 
112  void InitializeInputs();
113 
117  void Deinitialize();
118 
125  bool OnEvent(XBMC_Event& newEvent);
126 
131  void SetMouseActive(bool active = true);
132 
137  void SetMouseEnabled(bool mouseEnabled = true);
138 
144  void SetMouseState(MOUSE_STATE mouseState);
145 
150  bool IsMouseActive();
151 
157  MOUSE_STATE GetMouseState();
158 
164  MousePosition GetMousePosition();
165 
174  void SetMouseResolution(int maxX, int maxY, float speedX, float speedY);
175 
179  bool IsControllerEnabled() const;
180 
184  bool HasBuiltin(const std::string& command);
185 
193  int ExecuteBuiltin(const std::string& execute, const std::vector<std::string>& params);
194 
195  // Button translation
196  bool LoadKeymaps();
197  bool ReloadKeymaps();
198  void ClearKeymaps();
199  void AddKeymap(const std::string& keymap);
200  void RemoveKeymap(const std::string& keymap);
201 
202  const KODI::KEYMAP::IKeymapEnvironment* KeymapEnvironment() const;
203 
213  CAction GetAction(int window, const CKey& key, bool fallback = true);
214 
215  bool TranslateCustomControllerString(int windowId,
216  const std::string& controllerName,
217  int buttonId,
218  int& action,
219  std::string& strAction);
220 
221  bool TranslateTouchAction(
222  int windowId, int touchAction, int touchPointers, int& action, std::string& actionString);
223 
224  std::vector<std::shared_ptr<const KODI::KEYMAP::IWindowKeymap>> GetJoystickKeymaps() const;
225 
229  void QueueAction(const CAction& action);
230 
231  // implementation of ISettingCallback
232  void OnSettingChanged(const std::shared_ptr<const CSetting>& setting) override;
233 
234  // implementation of IActionListener
235  bool OnAction(const CAction& action) override;
236 
237  void RegisterKeyboardDriverHandler(KODI::KEYBOARD::IKeyboardDriverHandler* handler);
238  void UnregisterKeyboardDriverHandler(KODI::KEYBOARD::IKeyboardDriverHandler* handler);
239 
240  virtual void RegisterMouseDriverHandler(KODI::MOUSE::IMouseDriverHandler* handler);
241  virtual void UnregisterMouseDriverHandler(KODI::MOUSE::IMouseDriverHandler* handler);
242 
243 private:
250  bool OnKey(const CKey& key);
251 
257  void OnKeyUp(const CKey& key);
258 
264  bool HandleKey(const CKey& key);
265 
273  bool AlwaysProcess(const CAction& action);
274 
282  bool ExecuteInputAction(const CAction& action);
283 
286  void ProcessQueuedActions();
287 
289  KODI::KEYMAP::CButtonStat m_buttonStat;
290  CMouseStat m_Mouse;
291  CKey m_LastKey;
292 
293  std::map<std::string, std::map<int, float>> m_lastAxisMap;
294 
295  std::vector<CAction> m_queuedActions;
296  CCriticalSection m_actionMutex;
297 
298  // Button translation
299  std::unique_ptr<KODI::KEYMAP::IKeymapEnvironment> m_keymapEnvironment;
300  std::unique_ptr<KODI::KEYMAP::CButtonTranslator> m_buttonTranslator;
301  std::unique_ptr<KODI::KEYMAP::CCustomControllerTranslator> m_customControllerTranslator;
302  std::unique_ptr<KODI::KEYMAP::CTouchTranslator> m_touchTranslator;
303  std::unique_ptr<KODI::KEYMAP::CJoystickMapper> m_joystickTranslator;
304 
305  std::vector<KODI::KEYBOARD::IKeyboardDriverHandler*> m_keyboardHandlers;
306  std::vector<KODI::MOUSE::IMouseDriverHandler*> m_mouseHandlers;
307 
308  std::unique_ptr<KODI::KEYBOARD::IKeyboardDriverHandler> m_keyboardEasterEgg;
309 
310  // Input state
311  bool m_enableController = true;
312 
313  // Settings
314  static const std::string SETTING_INPUT_ENABLE_CONTROLLER;
315 };
316 
Main input processing class.
Definition: InputManager.h:68
Definition: ISettingCallback.h:16
Definition: MouseStat.h:94
Customizes the environment in which keymapping is performed.
Definition: IKeymapEnvironment.h:27
Definition: ButtonStat.h:23
Class encapsulating information regarding a particular user action to be sent to windows and controls...
Definition: Action.h:21
Definition: AudioDecoder.h:18
Definition: KeyboardStat.h:40
Definition: ProfileManager.h:25
Interface for handling mouse driver events.
Definition: IMouseDriverHandler.h:22
Definition: XBMC_events.h:117
Definition: MouseStat.h:102
Interface for handling keyboard events.
Definition: IKeyboardDriverHandler.h:22
Interface defining methods to handle GUI actions.
Definition: IActionListener.h:22
Definition: Observer.h:44
Definition: Key.h:17