Patch for multiple joysticks from const86 <const@mimas.ru>
[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 class KeyboardMenu;
33 class JoystickMenu;
34 class Controller;
35
36 class JoystickKeyboardController
37 {
38 private:
39   friend class KeyboardMenu;
40   friend class JoystickMenu;
41
42   typedef Controller::Control Control;
43   typedef Uint8 JoyId;
44
45   typedef std::map<SDLKey, Control> KeyMap;
46   typedef std::map<std::pair<JoyId, int>, Control> ButtonMap;
47   typedef std::map<std::pair<JoyId, int>, Control> AxisMap;
48   typedef std::map<std::pair<JoyId, int>, Control> HatMap;
49
50 public:
51   JoystickKeyboardController();
52   virtual ~JoystickKeyboardController();
53
54   /** Process an SDL Event and return true if the event has been used
55    */
56   void process_event(const SDL_Event& event);
57
58   void write(Writer& writer);
59   void read(const Reader& lisp);
60   void update();
61   void reset();
62
63   void updateAvailableJoysticks();
64
65   Controller *get_main_controller();
66
67 private:
68   void process_key_event(const SDL_KeyboardEvent& event);
69   void process_hat_event(const SDL_JoyHatEvent& jhat);
70   void process_axis_event(const SDL_JoyAxisEvent& jaxis);
71   void process_button_event(const SDL_JoyButtonEvent& jbutton);
72   void process_console_key_event(const SDL_KeyboardEvent& event);
73   void process_menu_key_event(const SDL_KeyboardEvent& event);
74
75   void print_joystick_mappings();
76
77   SDLKey reversemap_key(Control c);
78   int    reversemap_joybutton(Control c);
79   int    reversemap_joyaxis(Control c);
80   int    reversemap_joyhat(Control c);
81
82   void unbind_joystick_control(Control c);
83
84   void bind_joybutton(JoyId joy_id, int button, Control c);
85   void bind_joyaxis(JoyId joy_id, int axis, Control c);
86   void bind_joyhat(JoyId joy_id, int dir, Control c);
87   void bind_key(SDLKey key, Control c);
88
89   void set_joy_controls(Control id, bool value);
90
91 private:
92   Controller *controller;
93
94   KeyMap keymap;
95
96   ButtonMap joy_button_map;
97
98   AxisMap joy_axis_map;
99
100   HatMap joy_hat_map;
101
102   std::vector<SDL_Joystick*> joysticks;
103
104   std::string name;
105
106   int dead_zone;
107   /// the number of buttons all joysticks have
108   int min_joybuttons;
109   /// the max number of buttons a joystick has
110   int max_joybuttons;
111
112   int max_joyaxis;
113
114   int max_joyhats;
115
116   Uint8 hat_state;
117
118   bool jump_with_up_joy; // Joystick up jumps
119   bool jump_with_up_kbd; // Keyboard up jumps
120
121   int wait_for_key;
122   int wait_for_joystick;
123
124 private:
125   JoystickKeyboardController(const JoystickKeyboardController&);
126   JoystickKeyboardController& operator=(const JoystickKeyboardController&);
127 };
128
129 #endif
130
131 /* EOF */