Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/input/src/core/InputHandler.cc @ 1236

Last change on this file since 1236 was 1236, checked in by rgrieder, 16 years ago
  • feature: Automatic key repetition in InputBuffer, configurable in orxonox.ini
  • replaced std::list and std::map with std::vector in InputManager where necessary
  • new mouseWheelTurned event
  • some renaming
  • OIS:: calls only necessary in InputManager now
File size: 13.7 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30 @file
31 @brief Implementation of the different input handlers.
32 */
33
34#include "InputHandler.h"
35#include "util/Convert.h"
36#include "Debug.h"
37#include "ConfigValueIncludes.h"
38#include "CoreIncludes.h"
39#include "CommandExecutor.h"
40
41namespace orxonox
42{
43  // ###############################
44  // ######     KeyBinder     ######
45  // ###############################
46
47  /**
48    @brief Constructor that does as little as necessary.
49  */
50  KeyBinder::KeyBinder()
51  {
52    RegisterObject(KeyBinder);
53    clearBindings();
54
55    std::string keyNames[] = {
56    "UNASSIGNED",
57                "ESCAPE",
58                "1",
59                "2",
60                "3",
61                "4",
62                "5",
63                "6",
64                "7",
65                "8",
66                "9",
67                "0",
68                "MINUS",
69                "EQUALS",
70                "BACK",
71                "TAB",
72                "Q",
73                "W",
74                "E",
75                "R",
76                "T",
77                "Y",
78                "U",
79                "I",
80                "O",
81                "P",
82                "LBRACKET",
83                "RBRACKET",
84                "RETURN",
85                "LCONTROL",
86                "A",
87                "S",
88                "D",
89                "F",
90                "G",
91                "H",
92                "J",
93                "K",
94                "L",
95                "SEMICOLON",
96                "APOSTROPHE",
97                "GRAVE",
98                "LSHIFT",
99                "BACKSLASH",
100                "Z",
101                "X",
102                "C",
103                "V",
104                "B",
105                "N",
106                "M",
107                "COMMA",
108                "PERIOD",
109                "SLASH",
110                "RSHIFT",
111                "MULTIPLY",
112                "LMENU",
113                "SPACE",
114                "CAPITAL",
115                "F1",
116                "F2",
117                "F3",
118                "F4",
119                "F5",
120                "F6",
121                "F7",
122                "F8",
123                "F9",
124                "F10",
125                "NUMLOCK",
126                "SCROLL",
127                "NUMPAD7",
128                "NUMPAD8",
129                "NUMPAD9",
130                "SUBTRACT",
131                "NUMPAD4",
132                "NUMPAD5",
133                "NUMPAD6",
134                "ADD",
135                "NUMPAD1",
136                "NUMPAD2",
137                "NUMPAD3",
138                "NUMPAD0",
139                "DECIMAL",
140    "","",
141                "OEM_102",
142                "F11",
143                "F12",
144    "","","","","","","","","","","",
145                "F13",
146                "F14",
147                "F15",
148    "","","","","","","","","","",
149                "KANA",
150    "","",
151                "ABNT_C1",
152    "","","","","",
153                "CONVERT",
154    "",
155                "NOCONVERT",
156    "",
157                "YEN",
158                "ABNT_C2",
159    "","","","","","","","","","","","","","",
160                "NUMPADEQUALS",
161    "","",
162                "PREVTRACK",
163                "AT",
164                "COLON",
165                "UNDERLINE",
166                "KANJI",
167                "STOP",
168                "AX",
169                "UNLABELED",
170                "NEXTTRACK",
171    "","",
172                "NUMPADENTER",
173                "RCONTROL",
174    "","",
175                "MUTE",
176                "CALCULATOR",
177                "PLAYPAUSE",
178    "",
179                "MEDIASTOP",
180    "","","","","","","","","",
181                "VOLUMEDOWN",
182    "",
183                "VOLUMEUP",
184    "",
185                "WEBHOME",
186                "NUMPADCOMMA",
187    "",
188                "DIVIDE",
189    "",
190                "SYSRQ",
191                "RMENU",
192    "","","","","","","","","","","","",
193                "PAUSE",
194    "",
195                "HOME",
196                "UP",
197                "PGUP",
198    "",
199                "LEFT",
200    "",
201                "RIGHT",
202    "",
203                "END",
204                "DOWN",
205                "PGDOWN",
206                "INSERT",
207                "DELETE",
208    "","","","","","","",
209                "LWIN",
210                "RWIN",
211                "APPS",
212                "POWER",
213                "SLEEP",
214    "","","",
215                "WAKE",
216    "",
217                "WEBSEARCH",
218                "WEBFAVORITES",
219                "WEBREFRESH",
220                "WEBSTOP",
221                "WEBFORWARD",
222                "WEBBACK",
223                "MYCOMPUTER",
224                "MAIL",
225                "MEDIASELECT"
226    };
227    for (int i = 0; i < numberOfKeys_s; i++)
228      keyNames_[i] = keyNames[i];
229
230    std::string mouseButtonNames[] = {
231    "MouseLeft", "MouseRight", "MouseMiddle",
232    "MouseButton3", "MouseButton4", "MouseButton5",
233    "MouseButton6", "MouseButton7" };
234    for (int i = 0; i < numberOfMouseButtons_s; i++)
235      mouseButtonNames_[i] = mouseButtonNames[i];
236
237    for (int i = 0; i < numberOfJoyStickButtons_s; i++)
238      joyStickButtonNames_[i] = "JoyStick" + getConvertedValue<int, std::string>(i);
239  }
240
241  /**
242    @brief Destructor
243  */
244  KeyBinder::~KeyBinder()
245  {
246  }
247
248  /**
249    @brief Loader for the key bindings, managed by config values.
250  */
251  void KeyBinder::setConfigValues()
252  {
253    ConfigValueContainer* cont;
254    std::string modes[] = {"P_", "R_", "H_"};
255
256    // keys
257    for (int i = 0; i < numberOfKeys_s; i++)
258    {
259      for (int j = 0; j < 3; j++)
260      {
261        cont = getIdentifier()->getConfigValueContainer(modes[j] + keyNames_[i]);
262        if (!cont)
263        {
264          cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), modes[j] + keyNames_[i], "");
265          getIdentifier()->addConfigValueContainer(modes[j] + keyNames_[i], cont);
266        }
267        switch (j)
268        {
269          case 0:
270            cont->getValue(&bindingsKeyPress_[i].commandStr);
271            break;
272          case 1:
273            cont->getValue(&bindingsKeyRelease_[i].commandStr);
274            break;
275          case 2:
276            cont->getValue(&bindingsKeyHold_[i].commandStr);
277        }
278      }
279    }
280
281    // mouse buttons
282    for (int i = 0; i < numberOfMouseButtons_s; i++)
283    {
284      for (int j = 0; j < 3; j++)
285      {
286        cont = getIdentifier()->getConfigValueContainer(modes[j] + mouseButtonNames_[i]);
287        if (!cont)
288        {
289          cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), modes[j] + mouseButtonNames_[i], "");
290          getIdentifier()->addConfigValueContainer(modes[j] + mouseButtonNames_[i], cont);
291        }
292        switch (j)
293        {
294          case 0:
295            cont->getValue(&bindingsMouseButtonPress_[i].commandStr);
296            break;
297          case 1:
298            cont->getValue(&bindingsMouseButtonRelease_[i].commandStr);
299            break;
300          case 2:
301            cont->getValue(&bindingsMouseButtonHold_[i].commandStr);
302        }
303      }
304    }
305
306    // joy stick buttons
307    for (int i = 0; i < numberOfJoyStickButtons_s; i++)
308    {
309      for (int j = 0; j < 3; j++)
310      {
311        cont = getIdentifier()->getConfigValueContainer(modes[j] + joyStickButtonNames_[i]);
312        if (!cont)
313        {
314          cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), modes[j] + joyStickButtonNames_[i], "");
315          getIdentifier()->addConfigValueContainer(modes[j] + joyStickButtonNames_[i], cont);
316        }
317        switch (j)
318        {
319          case 0:
320            cont->getValue(&bindingsJoyStickButtonPress_[i].commandStr);
321            break;
322          case 1:
323            cont->getValue(&bindingsJoyStickButtonRelease_[i].commandStr);
324            break;
325          case 2:
326            cont->getValue(&bindingsJoyStickButtonHold_[i].commandStr);
327        }
328      }
329    }
330  }
331
332  /**
333    @brief Overwrites all bindings with ""
334  */
335  void KeyBinder::clearBindings()
336  {
337    for (int i = 0; i < numberOfKeys_s; i++)
338    {
339      bindingsKeyPress_  [i].commandStr = "";
340      bindingsKeyRelease_[i].commandStr = "";
341      bindingsKeyHold_   [i].commandStr = "";
342    }
343    for (int i = 0; i < numberOfMouseButtons_s; i++)
344    {
345      bindingsMouseButtonPress_  [i].commandStr = "";
346      bindingsMouseButtonRelease_[i].commandStr = "";
347      bindingsMouseButtonHold_   [i].commandStr = "";
348    }
349    for (int i = 0; i < numberOfJoyStickButtons_s; i++)
350    {
351      bindingsJoyStickButtonPress_  [i].commandStr = "";
352      bindingsJoyStickButtonRelease_[i].commandStr = "";
353      bindingsJoyStickButtonHold_   [i].commandStr = "";
354    }
355  }
356
357  /**
358    @brief Loads the key and button bindings.
359    @return True if loading succeeded.
360  */
361  bool KeyBinder::loadBindings()
362  {
363    COUT(ORX_DEBUG) << "KeyBinder: Loading key bindings..." << std::endl;
364
365    ConfigFileManager::getSingleton()->setFile(CFT_Keybindings, "keybindings.ini");
366    setConfigValues();
367
368    // evaluate the key bindings
369    // TODO: what if binding is invalid?
370    for (int i = 0; i < numberOfKeys_s; i++)
371    {
372      if (bindingsKeyPress_[i].commandStr != "")
373      {
374        bindingsKeyPress_[i].evaluation = CommandExecutor::evaluate(bindingsKeyPress_[i].commandStr);
375        bindingsKeyPress_[i].commandStr = bindingsKeyPress_[i].evaluation.getCommandString();
376      }
377    }
378
379    COUT(ORX_DEBUG) << "KeyBinder: Loading key bindings done." << std::endl;
380    return true;
381  }
382
383  bool KeyBinder::executeBinding(KeyBinding& binding)
384  {
385    if (binding.commandStr != "")
386    {
387      if (binding.commandStr != binding.evaluation.getCommandString())
388      {
389        // key binding has changed, reevaluate the command string.
390        binding.evaluation = CommandExecutor::evaluate(binding.commandStr);
391        binding.commandStr = binding.evaluation.getCommandString();
392      }
393      COUT(3) << "Executing command: " << binding.commandStr << std::endl;
394      CommandExecutor::execute(binding.commandStr);
395    }
396
397    return true;
398  }
399
400
401  /**
402    @brief Event handler for the keyPressed Event.
403    @param e Event information
404  */
405  bool KeyBinder::keyPressed(const KeyEvent& evt)
406  {
407    // find the appropriate key binding
408    executeBinding(bindingsKeyPress_[int(evt.key)]);
409
410    return true;
411  }
412
413  /**
414    @brief Event handler for the keyReleased Event.
415    @param e Event information
416  */
417  bool KeyBinder::keyReleased(const KeyEvent& evt)
418  {
419    // find the appropriate key binding
420    executeBinding(bindingsKeyRelease_[int(evt.key)]);
421
422    return true;
423  }
424
425  /**
426    @brief Event handler for the keyHeld Event.
427    @param e Mouse state information
428  */
429  bool KeyBinder::keyHeld(const KeyEvent& evt)
430  {
431    // find the appropriate key binding
432    executeBinding(bindingsKeyHold_[int(evt.key)]);
433
434    return true;
435  }
436
437  /**
438    @brief Event handler for the mouseMoved Event.
439    @param e Mouse state information
440  */
441  bool KeyBinder::mouseMoved(const MouseState &evt)
442  {
443    return true;
444  }
445
446  /**
447    @brief Event handler for the mouseWheelTurned Event.
448    @param e Mouse state information
449  */
450  bool KeyBinder::mouseWheelTurned(const MouseState &evt)
451  {
452    return true;
453  }
454
455  /**
456    @brief Event handler for the mousePressed Event.
457    @param e Event information
458    @param id The ID of the mouse button
459  */
460  bool KeyBinder::mouseButtonPressed(const MouseState& state, MouseButton::Enum id)
461  {
462    // find the appropriate key binding
463    executeBinding(bindingsMouseButtonPress_[int(id)]);
464
465    return true;
466  }
467
468  /**
469    @brief Event handler for the mouseReleased Event.
470    @param e Event information
471    @param id The ID of the mouse button
472  */
473  bool KeyBinder::mouseButtonReleased(const MouseState& state, MouseButton::Enum id)
474  {
475    // find the appropriate key binding
476    executeBinding(bindingsMouseButtonRelease_[int(id)]);
477
478    return true;
479  }
480
481  /**
482    @brief Event handler for the mouseHeld Event.
483    @param e Event information
484    @param id The ID of the mouse button
485  */
486  bool KeyBinder::mouseButtonHeld(const MouseState& state, MouseButton::Enum id)
487  {
488    // find the appropriate key binding
489    executeBinding(bindingsMouseButtonHold_[int(id)]);
490
491    return true;
492  }
493
494  bool KeyBinder::joyStickButtonPressed(const JoyStickState& state, int button)
495  {
496    // find the appropriate key binding
497    executeBinding(bindingsJoyStickButtonPress_[button]);
498
499    return true;
500  }
501
502  bool KeyBinder::joyStickButtonReleased(const JoyStickState& state, int button)
503  {
504    // find the appropriate key binding
505    executeBinding(bindingsJoyStickButtonRelease_[button]);
506
507    return true;
508  }
509
510  bool KeyBinder::joyStickButtonHeld(const JoyStickState& state, int button)
511  {
512    // find the appropriate key binding
513    executeBinding(bindingsJoyStickButtonHold_[button]);
514
515    return true;
516  }
517
518  bool KeyBinder::joyStickAxisMoved(const JoyStickState& state, int axis)
519  {
520    return true;
521  }
522
523  bool KeyBinder::joyStickSliderMoved(const JoyStickState& state, int index)
524  {
525    return true;
526  }
527
528  bool KeyBinder::joyStickPovMoved(const JoyStickState& state, int index)
529  {
530    return true;
531  }
532
533  bool KeyBinder::joyStickVector3Moved(const JoyStickState& state, int index)
534  {
535    return true;
536  }
537
538
539
540  // ###############################
541  // ###     GUIInputHandler     ###
542  // ###############################
543
544  ///**
545  //  @brief standard constructor
546  //*/
547  //GUIInputHandler::GUIInputHandler()
548  //{
549  //}
550
551  ///**
552  //  @brief Destructor
553  //*/
554  //GUIInputHandler::~GUIInputHandler()
555  //{
556  //}
557
558  ///**
559  //  @brief Event handler for the keyPressed Event.
560  //  @param e Event information
561  //*/
562  //bool GUIInputHandler::keyPressed(const OIS::KeyEvent &e)
563  //{
564                ////CEGUI::System::getSingleton().injectKeyDown( arg.key );
565                ////CEGUI::System::getSingleton().injectChar( arg.text );
566  //  return true;
567  //}
568
569  ///**
570  //  @brief Event handler for the keyReleased Event.
571  //  @param e Event information
572  //*/
573  //bool GUIInputHandler::keyReleased(const OIS::KeyEvent &e)
574  //{
575                ////CEGUI::System::getSingleton().injectKeyUp( arg.key );
576  //  return true;
577  //}
578
579  ///**
580  //  @brief Event handler for the mouseMoved Event.
581  //  @param e Event information
582  //*/
583  //bool GUIInputHandler::mouseMoved(const OIS::MouseEvent &e)
584  //{
585                ////CEGUI::System::getSingleton().injectMouseMove( arg.state.X.rel, arg.state.Y.rel );
586  //  return true;
587  //}
588
589  ///**
590  //  @brief Event handler for the mousePressed Event.
591  //  @param e Event information
592  //  @param id The ID of the mouse button
593  //*/
594  //bool GUIInputHandler::mousePressed(const OIS::MouseEvent &e, OIS::MouseButton id)
595  //{
596                ////CEGUI::System::getSingleton().injectMouseButtonDown(convertOISMouseButtonToCegui(id));
597  //  return true;
598  //}
599
600  ///**
601  //  @brief Event handler for the mouseReleased Event.
602  //  @param e Event information
603  //  @param id The ID of the mouse button
604  //*/
605  //bool GUIInputHandler::mouseReleased(const OIS::MouseEvent &e, OIS::MouseButton id)
606  //{
607                ////CEGUI::System::getSingleton().injectMouseButtonUp(convertOISMouseButtonToCegui(id));
608  //  return true;
609  //}
610
611}
Note: See TracBrowser for help on using the repository browser.