Merged changes from branches/supertux-milestone2-grumbel/ to trunk/supertux/
[supertux.git] / src / control / joystickkeyboardcontroller.hpp
1 //  SuperTux
2 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
3 //
4 //  This program is free software: you can redistribute it and/or modify
5 //  it under the terms of the GNU General Public License as published by
6 //  the Free Software Foundation, either version 3 of the License, or
7 //  (at your option) any later version.
8 //
9 //  This program is distributed in the hope that it will be useful,
10 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 //  GNU General Public License for more details.
13 //
14 //  You should have received a copy of the GNU General Public License
15 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 #ifndef HEADER_SUPERTUX_CONTROL_JOYSTICKKEYBOARDCONTROLLER_HPP
18 #define HEADER_SUPERTUX_CONTROL_JOYSTICKKEYBOARDCONTROLLER_HPP
19
20 #include "control/controller.hpp"
21
22 #include <SDL.h>
23
24 #include <map>
25 #include <string>
26 #include <vector>
27
28 #include "util/reader_fwd.hpp"
29 #include "util/writer_fwd.hpp"
30
31 class Menu;
32
33 class JoystickKeyboardController : public Controller
34 {
35 public:
36   JoystickKeyboardController();
37   virtual ~JoystickKeyboardController();
38
39   /** Process an SDL Event and return true if the event has been used
40    */
41   void process_event(const SDL_Event& event);
42
43   void write(lisp::Writer& writer);
44   void read(const Reader& lisp);
45   void reset();
46
47   Menu* get_key_options_menu();
48   Menu* get_joystick_options_menu();
49   void updateAvailableJoysticks();
50
51 private:
52   void process_key_event(const SDL_Event& event);
53   void process_hat_event(const SDL_JoyHatEvent& jhat);
54   void process_axis_event(const SDL_JoyAxisEvent& jaxis);
55   void process_button_event(const SDL_JoyButtonEvent& jbutton);
56   void process_console_key_event(const SDL_Event& event);
57   void process_menu_key_event(const SDL_Event& event);
58
59   void print_joystick_mappings();
60
61   typedef std::map<SDLKey, Control> KeyMap;
62   KeyMap keymap;
63
64   typedef std::map<int, Control> ButtonMap;
65   ButtonMap joy_button_map;
66
67   typedef std::map<int, Control> AxisMap;
68   AxisMap joy_axis_map;
69
70   typedef std::map<int, Control> HatMap;
71   HatMap joy_hat_map;
72
73   std::vector<SDL_Joystick*> joysticks;
74
75   std::string name;
76
77   int dead_zone;
78   /// the number of buttons all joysticks have
79   int min_joybuttons;
80   /// the max number of buttons a joystick has
81   int max_joybuttons;
82
83   int max_joyaxis;
84
85   int max_joyhats;
86
87   Uint8 hat_state;
88
89   bool jump_with_up_joy; // Joystick up jumps
90   bool jump_with_up_kbd; // Keyboard up jumps
91
92   SDLKey reversemap_key(Control c);
93   int    reversemap_joybutton(Control c);
94   int    reversemap_joyaxis(Control c);
95   int    reversemap_joyhat(Control c);
96
97   void unbind_joystick_control(Control c);
98
99   void bind_joybutton(int button, Control c);
100   void bind_joyaxis(int axis, Control c);
101   void bind_joyhat(int dir, Control c);
102   void bind_key(SDLKey key, Control c);
103
104   void set_joy_controls(Control id, bool value);
105
106   int wait_for_key;
107   int wait_for_joystick;
108
109   class KeyboardMenu;
110   class JoystickMenu;
111
112   KeyboardMenu* key_options_menu;
113   JoystickMenu* joystick_options_menu;
114   friend class KeyboardMenu;
115   friend class JoystickMenu;
116
117 private:
118   JoystickKeyboardController(const JoystickKeyboardController&);
119   JoystickKeyboardController& operator=(const JoystickKeyboardController&);
120 };
121
122 #endif
123
124 /* EOF */