OpenMW
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
inputmanagerimp.hpp
Go to the documentation of this file.
1 #ifndef MWINPUT_MWINPUTMANAGERIMP_H
2 #define MWINPUT_MWINPUTMANAGERIMP_H
3 
4 #include "../mwgui/mode.hpp"
5 
6 #include <osg/ref_ptr>
7 #include <osgViewer/ViewerEventHandlers>
8 
9 #include <extern/oics/ICSChannelListener.h>
10 #include <extern/oics/ICSInputControlSystem.h>
11 
15 
16 #include "../mwbase/inputmanager.hpp"
17 
18 namespace MWWorld
19 {
20  class Player;
21 }
22 
23 namespace MWBase
24 {
25  class WindowManager;
26 }
27 
28 namespace ICS
29 {
30  class InputControlSystem;
31 }
32 
33 namespace MyGUI
34 {
35  struct MouseButton;
36 }
37 
38 namespace Files
39 {
40  struct ConfigurationManager;
41 }
42 
43 namespace SDLUtil
44 {
45  class InputWrapper;
46  class VideoWrapper;
47 }
48 
49 namespace osgViewer
50 {
51  class Viewer;
52  class ScreenCaptureHandler;
53 }
54 
55 struct SDL_Window;
56 
57 namespace MWInput
58 {
59 
63  class InputManager :
64  public MWBase::InputManager,
65  public SDLUtil::KeyListener,
69  public ICS::ChannelListener,
70  public ICS::DetectingBindingListener
71  {
72  public:
74  SDL_Window* window,
75  osg::ref_ptr<osgViewer::Viewer> viewer,
76  osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler,
78  const std::string& userFile, bool userFileExists,
79  const std::string& controllerBindingsFile, bool grab);
80 
81  virtual ~InputManager();
82 
83  virtual bool isWindowVisible();
84 
86  virtual void clear();
87 
88  virtual void update(float dt, bool disableControls=false, bool disableEvents=false);
89 
90  void setPlayer (MWWorld::Player* player) { mPlayer = player; }
91 
92  virtual void changeInputMode(bool guiMode);
93 
94  virtual void processChangedSettings(const Settings::CategorySettingVector& changed);
95 
96  virtual void setDragDrop(bool dragDrop);
97 
98  virtual void toggleControlSwitch (const std::string& sw, bool value);
99  virtual bool getControlSwitch (const std::string& sw);
100 
101  virtual std::string getActionDescription (int action);
102  virtual std::string getActionKeyBindingName (int action);
103  virtual std::string getActionControllerBindingName (int action);
104  virtual int getNumActions() { return A_Last; }
105  virtual std::vector<int> getActionKeySorting();
106  virtual std::vector<int> getActionControllerSorting();
107  virtual void enableDetectingBindingMode (int action, bool keyboard);
108  virtual void resetToDefaultKeyBindings();
109  virtual void resetToDefaultControllerBindings();
110 
111  virtual bool joystickLastUsed() {return mJoystickLastUsed;}
112 
113  public:
114  virtual void keyPressed(const SDL_KeyboardEvent &arg );
115  virtual void keyReleased( const SDL_KeyboardEvent &arg );
116  virtual void textInput (const SDL_TextInputEvent &arg);
117 
118  virtual void mousePressed( const SDL_MouseButtonEvent &arg, Uint8 id );
119  virtual void mouseReleased( const SDL_MouseButtonEvent &arg, Uint8 id );
120  virtual void mouseMoved( const SDLUtil::MouseMotionEvent &arg );
121 
122  virtual void buttonPressed(int deviceID, const SDL_ControllerButtonEvent &arg);
123  virtual void buttonReleased(int deviceID, const SDL_ControllerButtonEvent &arg);
124  virtual void axisMoved(int deviceID, const SDL_ControllerAxisEvent &arg);
125  virtual void controllerAdded(int deviceID, const SDL_ControllerDeviceEvent &arg);
126  virtual void controllerRemoved(const SDL_ControllerDeviceEvent &arg);
127 
128  virtual void windowVisibilityChange( bool visible );
129  virtual void windowFocusChange( bool have_focus );
130  virtual void windowResized (int x, int y);
131  virtual void windowClosed ();
132 
133  virtual void channelChanged(ICS::Channel* channel, float currentValue, float previousValue);
134 
135  virtual void mouseAxisBindingDetected(ICS::InputControlSystem* ICS, ICS::Control* control
136  , ICS::InputControlSystem::NamedAxis axis, ICS::Control::ControlChangingDirection direction);
137 
138  virtual void keyBindingDetected(ICS::InputControlSystem* ICS, ICS::Control* control
139  , SDL_Scancode key, ICS::Control::ControlChangingDirection direction);
140 
141  virtual void mouseButtonBindingDetected(ICS::InputControlSystem* ICS, ICS::Control* control
142  , unsigned int button, ICS::Control::ControlChangingDirection direction);
143 
144  virtual void joystickAxisBindingDetected(ICS::InputControlSystem* ICS, int deviceID, ICS::Control* control
145  , int axis, ICS::Control::ControlChangingDirection direction);
146 
147  virtual void joystickButtonBindingDetected(ICS::InputControlSystem* ICS, int deviceID, ICS::Control* control
148  , unsigned int button, ICS::Control::ControlChangingDirection direction);
149 
150  void clearAllKeyBindings (ICS::Control* control);
151  void clearAllControllerBindings (ICS::Control* control);
152 
153  virtual int countSavedGameRecords() const;
154  virtual void write(ESM::ESMWriter& writer, Loading::Listener& progress);
155  virtual void readRecord(ESM::ESMReader& reader, uint32_t type);
156 
157  private:
158  SDL_Window* mWindow;
160  osg::ref_ptr<osgViewer::Viewer> mViewer;
161  osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
163 
166 
167  ICS::InputControlSystem* mInputBinder;
168 
171 
172  std::string mUserFile;
173 
174  bool mDragDrop;
175 
177 
178  bool mInvertY;
179 
181 
185  float mTimeIdle;
186 
189 
191 
193 
194  float mGuiCursorX;
195  float mGuiCursorY;
200  bool mSneaking;
202 
203  std::map<std::string, bool> mControlSwitch;
204 
206 
207  private:
208  void convertMousePosForMyGUI(int& x, int& y);
209 
210  MyGUI::MouseButton sdlButtonToMyGUI(Uint8 button);
211 
212  virtual std::string sdlControllerAxisToString(int axis);
213  virtual std::string sdlControllerButtonToString(int button);
214 
215  void resetIdleTime();
216  void updateIdleTime(float dt);
217 
218  void setPlayerControlsEnabled(bool enabled);
219  void handleGuiArrowKey(int action);
220 
221  void updateCursorMode();
222 
223  bool checkAllowedToUseItems() const;
224 
225  private:
226  void toggleMainMenu();
227  void toggleSpell();
228  void toggleWeapon();
229  void toggleInventory();
230  void toggleConsole();
231  void screenshot();
232  void toggleJournal();
233  void activate();
234  void toggleWalking();
235  void toggleSneaking();
236  void toggleAutoMove();
237  void rest();
238  void quickLoad();
239  void quickSave();
240 
241  void quickKey (int index);
242  void showQuickKeysMenu();
243 
244  bool actionIsActive (int id);
245 
246  void loadKeyDefaults(bool force = false);
247  void loadControllerDefaults(bool force = false);
248 
249  int mFakeDeviceID; //As we only support one controller at a time, use a fake deviceID so we don't lose bindings when switching controllers
250 
251  private:
252  enum Actions
253  {
254  // please add new actions at the bottom, in order to preserve the channel IDs in the key configuration files
255 
257 
259 
260  A_Screenshot, // Take a screenshot
261 
262  A_Inventory, // Toggle inventory screen
263 
264  A_Console, // Toggle console screen
265 
266  A_MoveLeft, // Move player left / right
268  A_MoveForward, // Forward / Backward
270 
272 
273  A_Use, //Use weapon, spell, etc.
275  A_AutoMove, //Toggle Auto-move forward
276  A_Rest, //Rest
277  A_Journal, //Journal
278  A_Weapon, //Draw/Sheath weapon
279  A_Spell, //Ready/Unready Casting
280  A_Run, //Run when held
281  A_CycleSpellLeft, //cycling through spells
283  A_CycleWeaponLeft,//Cycling through weapons
285  A_ToggleSneak, //Toggles Sneak
286  A_AlwaysRun, //Toggle Walking/Running
288 
294 
296 
307 
309 
311 
313 
314  A_LookUpDown, //Joystick look
318 
319  A_Last // Marker for the last item
320  };
321  };
322 }
323 #endif
Definition: inputmanagerimp.hpp:269
bool mAlwaysRunActive
Definition: inputmanagerimp.hpp:198
Definition: inputmanagerimp.hpp:273
void toggleConsole()
Definition: inputmanagerimp.cpp:1083
virtual void resetToDefaultControllerBindings()
Definition: inputmanagerimp.cpp:1727
virtual void keyBindingDetected(ICS::InputControlSystem *ICS, ICS::Control *control, SDL_Scancode key, ICS::Control::ControlChangingDirection direction)
Definition: inputmanagerimp.cpp:1608
osg::ref_ptr< osgViewer::Viewer > mViewer
Definition: inputmanagerimp.hpp:160
Definition: sdlvideowrapper.hpp:18
void rest()
Definition: inputmanagerimp.cpp:1024
Interface for input manager (implemented in MWInput)
Definition: inputmanager.hpp:24
void handleGuiArrowKey(int action)
Definition: inputmanagerimp.cpp:191
virtual void readRecord(ESM::ESMReader &reader, uint32_t type)
Definition: inputmanagerimp.cpp:1705
int mMouseWheel
Definition: inputmanagerimp.hpp:196
virtual void mouseMoved(const SDLUtil::MouseMotionEvent &arg)
Definition: inputmanagerimp.cpp:803
Definition: inputmanagerimp.hpp:304
float mInvUiScalingFactor
Definition: inputmanagerimp.hpp:205
virtual int countSavedGameRecords() const
Definition: inputmanagerimp.cpp:1684
void updateCursorMode()
Definition: inputmanagerimp.cpp:377
Definition: inputmanagerimp.hpp:277
virtual void controllerRemoved(const SDL_ControllerDeviceEvent &arg)
Definition: inputmanagerimp.cpp:922
virtual void windowVisibilityChange(bool visible)
Definition: inputmanagerimp.cpp:931
Definition: inputmanagerimp.hpp:275
float mTimeIdle
Definition: inputmanagerimp.hpp:185
Definition: inputmanagerimp.hpp:266
virtual void keyPressed(const SDL_KeyboardEvent &arg)
Definition: inputmanagerimp.cpp:712
MyGUI::MouseButton sdlButtonToMyGUI(Uint8 button)
Definition: inputmanagerimp.cpp:1732
void quickSave()
Definition: inputmanagerimp.cpp:971
void clearAllControllerBindings(ICS::Control *control)
Definition: inputmanagerimp.cpp:1675
virtual void mouseButtonBindingDetected(ICS::InputControlSystem *ICS, ICS::Control *control, unsigned int button, ICS::Control::ControlChangingDirection direction)
Definition: inputmanagerimp.cpp:1628
Definition: inputmanagerimp.hpp:285
Definition: esmreader.hpp:21
Definition: inputmanagerimp.hpp:319
A wrapper around SDL's event queue, mostly used for handling input-related events.
Definition: sdlinputwrapper.hpp:22
void toggleAutoMove()
Definition: inputmanagerimp.cpp:1161
virtual void buttonReleased(int deviceID, const SDL_ControllerButtonEvent &arg)
Definition: inputmanagerimp.cpp:889
Definition: inputmanagerimp.hpp:260
virtual bool getControlSwitch(const std::string &sw)
Definition: inputmanagerimp.cpp:685
NPC object representing the player and additional player data.
Definition: player.hpp:32
Definition: events.hpp:65
Definition: inputmanagerimp.hpp:284
Definition: inputmanagerimp.hpp:268
Definition: inputmanagerimp.hpp:312
void quickKey(int index)
Definition: inputmanagerimp.cpp:1120
Definition: inputmanagerimp.hpp:315
Definition: events.hpp:15
Definition: inputmanagerimp.hpp:300
void setPlayer(MWWorld::Player *player)
Definition: inputmanagerimp.hpp:90
Definition: inputmanagerimp.hpp:308
virtual void windowFocusChange(bool have_focus)
Definition: inputmanagerimp.cpp:927
int mFakeDeviceID
Definition: inputmanagerimp.hpp:249
Definition: inputmanagerimp.hpp:282
virtual std::string sdlControllerButtonToString(int button)
Definition: inputmanagerimp.cpp:1457
Definition: inputmanagerimp.hpp:298
virtual std::string getActionDescription(int action)
Definition: inputmanagerimp.cpp:1376
virtual void changeInputMode(bool guiMode)
Definition: inputmanagerimp.cpp:632
bool mUserFileExists
Definition: inputmanagerimp.hpp:197
void setPlayerControlsEnabled(bool enabled)
Definition: inputmanagerimp.cpp:166
Definition: loadinglistener.hpp:8
Definition: inputmanagerimp.hpp:302
Definition: inputmanagerimp.hpp:306
Definition: inputmanagerimp.hpp:258
Definition: inputmanagerimp.hpp:314
Actions
Definition: inputmanagerimp.hpp:252
void loadControllerDefaults(bool force=false)
Definition: inputmanagerimp.cpp:1307
virtual void channelChanged(ICS::Channel *channel, float currentValue, float previousValue)
Definition: inputmanagerimp.cpp:220
Definition: inputmanagerimp.hpp:297
std::set< std::pair< std::string, std::string > > CategorySettingVector
Definition: settings.hpp:11
InputManager()
Definition: inputmanager.hpp:34
osgViewer::ScreenCaptureHandler::CaptureOperation * mScreenCaptureOperation
Definition: inputmanagerimp.hpp:162
void showQuickKeysMenu()
Definition: inputmanagerimp.cpp:1131
Definition: inputmanagerimp.hpp:317
std::map< std::string, bool > mControlSwitch
Definition: inputmanagerimp.hpp:203
SDL_Window * mWindow
Definition: inputmanagerimp.hpp:158
Definition: esmwriter.hpp:17
bool mWindowVisible
Definition: inputmanagerimp.hpp:159
MWWorld::Player * mPlayer
Definition: inputmanagerimp.hpp:165
Definition: inputmanagerimp.hpp:281
virtual std::vector< int > getActionControllerSorting()
Actions available for binding to controller buttons.
Definition: inputmanagerimp.cpp:1558
Definition: events.hpp:26
virtual int getNumActions()
Definition: inputmanagerimp.hpp:104
bool mMouseLookEnabled
Definition: inputmanagerimp.hpp:187
bool mDragDrop
Definition: inputmanagerimp.hpp:174
Definition: inputmanagerimp.hpp:310
Definition: inputmanagerimp.hpp:292
Definition: inputmanagerimp.hpp:290
virtual void joystickButtonBindingDetected(ICS::InputControlSystem *ICS, int deviceID, ICS::Control *control, unsigned int button, ICS::Control::ControlChangingDirection direction)
Definition: inputmanagerimp.cpp:1655
Definition: inputmanagerimp.hpp:283
virtual void mousePressed(const SDL_MouseButtonEvent &arg, Uint8 id)
Definition: inputmanagerimp.cpp:758
float mPreviewPOVDelay
Definition: inputmanagerimp.hpp:184
Definition: inputmanagerimp.hpp:301
virtual bool joystickLastUsed()
Definition: inputmanagerimp.hpp:111
Definition: events.hpp:44
std::string mUserFile
Definition: inputmanagerimp.hpp:172
bool mSneakToggles
Definition: inputmanagerimp.hpp:199
virtual void setDragDrop(bool dragDrop)
Definition: inputmanagerimp.cpp:627
void updateIdleTime(float dt)
Definition: inputmanagerimp.cpp:1191
ICS::InputControlSystem * mInputBinder
Definition: inputmanagerimp.hpp:167
void resetIdleTime()
Definition: inputmanagerimp.cpp:1184
void toggleSpell()
Definition: inputmanagerimp.cpp:975
bool mGrabCursor
Definition: inputmanagerimp.hpp:176
virtual void update(float dt, bool disableControls=false, bool disableEvents=false)
Definition: inputmanagerimp.cpp:412
void toggleMainMenu()
Definition: inputmanagerimp.cpp:949
void toggleJournal()
Definition: inputmanagerimp.cpp:1101
bool mControlsDisabled
Definition: inputmanagerimp.hpp:180
virtual void joystickAxisBindingDetected(ICS::InputControlSystem *ICS, int deviceID, ICS::Control *control, int axis, ICS::Control::ControlChangingDirection direction)
Definition: inputmanagerimp.cpp:1639
virtual ~InputManager()
Definition: inputmanagerimp.cpp:150
Class that handles all input and key bindings for OpenMW.
Definition: inputmanagerimp.hpp:63
virtual void clear()
Clear all savegame-specific data.
Definition: inputmanagerimp.cpp:143
Definition: inputmanagerimp.hpp:279
void quickLoad()
Definition: inputmanagerimp.cpp:966
Definition: inputmanagerimp.hpp:264
virtual void keyReleased(const SDL_KeyboardEvent &arg)
Definition: inputmanagerimp.cpp:748
virtual void controllerAdded(int deviceID, const SDL_ControllerDeviceEvent &arg)
Definition: inputmanagerimp.cpp:918
float mCameraSensitivity
Definition: inputmanagerimp.hpp:182
virtual std::string sdlControllerAxisToString(int axis)
Definition: inputmanagerimp.cpp:1495
virtual void resetToDefaultKeyBindings()
Definition: inputmanagerimp.cpp:1722
Definition: inputmanagerimp.hpp:287
virtual std::string getActionKeyBindingName(int action)
Definition: inputmanagerimp.cpp:1425
Definition: inputmanagerimp.hpp:256
Definition: inputmanagerimp.hpp:280
virtual bool isWindowVisible()
Definition: inputmanagerimp.cpp:161
float mGuiCursorY
Definition: inputmanagerimp.hpp:195
Definition: inputmanagerimp.hpp:293
virtual void write(ESM::ESMWriter &writer, Loading::Listener &progress)
Definition: inputmanagerimp.cpp:1689
virtual void mouseReleased(const SDL_MouseButtonEvent &arg, Uint8 id)
Definition: inputmanagerimp.cpp:785
Definition: events.hpp:35
void clearAllKeyBindings(ICS::Control *control)
Definition: inputmanagerimp.cpp:1666
Definition: inputmanagerimp.hpp:305
Definition: inputmanagerimp.hpp:291
bool actionIsActive(int id)
Definition: inputmanagerimp.cpp:1203
bool mAttemptJump
Definition: inputmanagerimp.hpp:201
float mOverencumberedMessageDelay
Definition: inputmanagerimp.hpp:192
void toggleSneaking()
Definition: inputmanagerimp.cpp:1177
virtual void buttonPressed(int deviceID, const SDL_ControllerButtonEvent &arg)
Definition: inputmanagerimp.cpp:855
virtual void windowClosed()
Definition: inputmanagerimp.cpp:944
virtual void toggleControlSwitch(const std::string &sw, bool value)
Definition: inputmanagerimp.cpp:690
Definition: inputmanagerimp.hpp:299
Definition: inputmanagerimp.hpp:303
osg::ref_ptr< osgViewer::ScreenCaptureHandler > mScreenCaptureHandler
Definition: inputmanagerimp.hpp:161
Definition: inputmanagerimp.hpp:276
SDLUtil::InputWrapper * mInputManager
Definition: inputmanagerimp.hpp:169
Definition: inputmanagerimp.hpp:262
virtual void textInput(const SDL_TextInputEvent &arg)
Definition: inputmanagerimp.cpp:740
bool mInvertY
Definition: inputmanagerimp.hpp:178
Definition: inputmanagerimp.hpp:289
Definition: inputmanagerimp.hpp:271
virtual std::string getActionControllerBindingName(int action)
Definition: inputmanagerimp.cpp:1442
void convertMousePosForMyGUI(int &x, int &y)
void loadKeyDefaults(bool force=false)
Definition: inputmanagerimp.cpp:1208
Definition: inputmanagerimp.hpp:316
bool mSneaking
Definition: inputmanagerimp.hpp:200
bool mGuiCursorEnabled
Definition: inputmanagerimp.hpp:188
Definition: inputmanagerimp.hpp:278
virtual void enableDetectingBindingMode(int action, bool keyboard)
If keyboard is true, only pay attention to keyboard events. If false, only pay attention to controlle...
Definition: inputmanagerimp.cpp:1594
virtual void axisMoved(int deviceID, const SDL_ControllerAxisEvent &arg)
Definition: inputmanagerimp.cpp:912
Definition: inputmanagerimp.hpp:274
Definition: inputmanagerimp.hpp:286
void toggleInventory()
Definition: inputmanagerimp.cpp:1062
void activate()
Definition: inputmanagerimp.cpp:1150
float mGuiCursorX
Definition: inputmanagerimp.hpp:194
bool mDetectingKeyboard
Definition: inputmanagerimp.hpp:190
virtual void mouseAxisBindingDetected(ICS::InputControlSystem *ICS, ICS::Control *control, ICS::InputControlSystem::NamedAxis axis, ICS::Control::ControlChangingDirection direction)
Definition: inputmanagerimp.cpp:1601
void screenshot()
Definition: inputmanagerimp.cpp:1036
virtual std::vector< int > getActionKeySorting()
Actions available for binding to keyboard buttons.
Definition: inputmanagerimp.cpp:1516
virtual void windowResized(int x, int y)
Definition: inputmanagerimp.cpp:936
bool checkAllowedToUseItems() const
Definition: inputmanagerimp.cpp:400
virtual void processChangedSettings(const Settings::CategorySettingVector &changed)
Definition: inputmanagerimp.cpp:642
Definition: inputmanagerimp.hpp:267
float mCameraYMultiplier
Definition: inputmanagerimp.hpp:183
Definition: inputmanagerimp.hpp:295
void toggleWeapon()
Definition: inputmanagerimp.cpp:1002
SDLUtil::VideoWrapper * mVideoWrapper
Definition: inputmanagerimp.hpp:170
bool mJoystickLastUsed
Definition: inputmanagerimp.hpp:164
void toggleWalking()
Definition: inputmanagerimp.cpp:1169