xbmc
InputManager.h
1 /*
2  * Copyright (C) 2005-2018 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/KeyboardStat.h"
12 #include "input/actions/Action.h"
13 #include "input/button/ButtonStat.h"
14 #include "input/mouse/MouseStat.h"
15 #include "input/mouse/interfaces/IMouseInputProvider.h"
16 #include "interfaces/IActionListener.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 CButtonTranslator;
29 class CJoystickMapper;
30 class CKey;
31 class CProfileManager;
32 class CTouchTranslator;
33 class IKeymapEnvironment;
34 class IWindowKeymap;
35 
36 namespace KODI
37 {
38 
39 namespace KEYBOARD
40 {
41 class IKeyboardDriverHandler;
42 }
43 
44 namespace MOUSE
45 {
46 class IMouseDriverHandler;
47 }
48 } // namespace KODI
49 
52 
64 {
65 public:
66  CInputManager();
67  CInputManager(const CInputManager&) = delete;
68  CInputManager const& operator=(CInputManager const&) = delete;
69  ~CInputManager() override;
70 
76  bool ProcessMouse(int windowId);
77 
85  bool ProcessEventServer(int windowId, float frameTime);
86 
92  bool ProcessPeripherals(float frameTime);
93 
100  bool Process(int windowId, float frameTime);
101 
105  void InitializeInputs();
106 
110  void Deinitialize();
111 
118  bool OnEvent(XBMC_Event& newEvent);
119 
124  void SetMouseActive(bool active = true);
125 
130  void SetMouseEnabled(bool mouseEnabled = true);
131 
137  void SetMouseState(MOUSE_STATE mouseState);
138 
143  bool IsMouseActive();
144 
150  MOUSE_STATE GetMouseState();
151 
157  MousePosition GetMousePosition();
158 
167  void SetMouseResolution(int maxX, int maxY, float speedX, float speedY);
168 
172  bool IsControllerEnabled() const;
173 
177  bool HasBuiltin(const std::string& command);
178 
186  int ExecuteBuiltin(const std::string& execute, const std::vector<std::string>& params);
187 
188  // Button translation
189  bool LoadKeymaps();
190  bool ReloadKeymaps();
191  void ClearKeymaps();
192  void AddKeymap(const std::string& keymap);
193  void RemoveKeymap(const std::string& keymap);
194 
195  const IKeymapEnvironment* KeymapEnvironment() const { return m_keymapEnvironment.get(); }
196 
206  CAction GetAction(int window, const CKey& key, bool fallback = true);
207 
208  bool TranslateCustomControllerString(int windowId,
209  const std::string& controllerName,
210  int buttonId,
211  int& action,
212  std::string& strAction);
213 
214  bool TranslateTouchAction(
215  int windowId, int touchAction, int touchPointers, int& action, std::string& actionString);
216 
217  std::vector<std::shared_ptr<const IWindowKeymap>> GetJoystickKeymaps() const;
218 
222  void QueueAction(const CAction& action);
223 
224  // implementation of ISettingCallback
225  void OnSettingChanged(const std::shared_ptr<const CSetting>& setting) override;
226 
227  // implementation of IActionListener
228  bool OnAction(const CAction& action) override;
229 
230  void RegisterKeyboardDriverHandler(KODI::KEYBOARD::IKeyboardDriverHandler* handler);
231  void UnregisterKeyboardDriverHandler(KODI::KEYBOARD::IKeyboardDriverHandler* handler);
232 
233  virtual void RegisterMouseDriverHandler(KODI::MOUSE::IMouseDriverHandler* handler);
234  virtual void UnregisterMouseDriverHandler(KODI::MOUSE::IMouseDriverHandler* handler);
235 
236 private:
243  bool OnKey(const CKey& key);
244 
250  void OnKeyUp(const CKey& key);
251 
257  bool HandleKey(const CKey& key);
258 
266  bool AlwaysProcess(const CAction& action);
267 
275  bool ExecuteInputAction(const CAction& action);
276 
279  void ProcessQueuedActions();
280 
281  CKeyboardStat m_Keyboard;
282  KODI::INPUT::CButtonStat m_buttonStat;
283  CMouseStat m_Mouse;
284  CKey m_LastKey;
285 
286  std::map<std::string, std::map<int, float>> m_lastAxisMap;
287 
288  std::vector<CAction> m_queuedActions;
289  CCriticalSection m_actionMutex;
290 
291  // Button translation
292  std::unique_ptr<IKeymapEnvironment> m_keymapEnvironment;
293  std::unique_ptr<CButtonTranslator> m_buttonTranslator;
294  std::unique_ptr<CCustomControllerTranslator> m_customControllerTranslator;
295  std::unique_ptr<CTouchTranslator> m_touchTranslator;
296  std::unique_ptr<CJoystickMapper> m_joystickTranslator;
297 
298  std::vector<KODI::KEYBOARD::IKeyboardDriverHandler*> m_keyboardHandlers;
299  std::vector<KODI::MOUSE::IMouseDriverHandler*> m_mouseHandlers;
300 
301  std::unique_ptr<KODI::KEYBOARD::IKeyboardDriverHandler> m_keyboardEasterEgg;
302 
303  // Input state
304  bool m_enableController = true;
305 
306  // Settings
307  static const std::string SETTING_INPUT_ENABLE_CONTROLLER;
308 };
309 
Definition: ButtonStat.h:21
Main input processing class.
Definition: InputManager.h:63
Definition: ISettingCallback.h:16
Definition: MouseStat.h:91
Definition: KeyboardStat.h:33
Definition: TouchTranslator.h:18
Definition: JoystickMapper.h:24
class encapsulating information regarding a particular user action to be sent to windows and controls...
Definition: Action.h:22
Controller configuration window.
Definition: AudioDecoder.h:18
Definition: CustomControllerTranslator.h:18
Definition: IActionListener.h:13
Definition: ProfileManager.h:25
Interface for handling mouse driver events.
Definition: IMouseDriverHandler.h:21
Definition: XBMC_events.h:109
Definition: MouseStat.h:99
Interface for handling keyboard events.
Definition: IKeyboardDriverHandler.h:21
Interface for mapping buttons to Kodi actions for specific windows.
Definition: IKeymap.h:54
Definition: Observer.h:44
singleton class to map from buttons to actions Warning: not threadsafe!
Definition: ButtonTranslator.h:27
Definition: Key.h:135
Customizes the environment in which keymapping is performed.
Definition: IKeymapEnvironment.h:21