6d4ab11048d8df722fb3731326fb498fd98e0b39
[supertux.git] / src / control / input_manager.cpp
1 //  SuperTux
2 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>,
3 //                2007 Ingo Ruhnke <grumbel@gmx.de>
4 //
5 //  This program is free software: you can redistribute it and/or modify
6 //  it under the terms of the GNU General Public License as published by
7 //  the Free Software Foundation, either version 3 of the License, or
8 //  (at your option) any later version.
9 //
10 //  This program is distributed in the hope that it will be useful,
11 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //  GNU General Public License for more details.
14 //
15 //  You should have received a copy of the GNU General Public License
16 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 #include "control/input_manager.hpp"
19
20 #include <iostream>
21
22 #include "control/keyboard_manager.hpp"
23 #include "control/joystick_manager.hpp"
24 #include "control/game_controller_manager.hpp"
25 #include "gui/menu_manager.hpp"
26 #include "lisp/list_iterator.hpp"
27 #include "supertux/gameconfig.hpp"
28 #include "util/gettext.hpp"
29 #include "util/writer.hpp"
30
31 InputManager::InputManager() :
32   controller(new Controller),
33   m_use_game_controller(true),
34   keyboard_manager(new KeyboardManager(this)),
35   joystick_manager(new JoystickManager(this)),
36   game_controller_manager(new GameControllerManager(this))
37 {
38 }
39
40 InputManager::~InputManager()
41 {
42 }
43
44 Controller*
45 InputManager::get_controller()
46 {
47   return controller.get();
48 }
49
50 void
51 InputManager::use_game_controller(bool v)
52 {
53   m_use_game_controller = v;
54 }
55
56 void
57 InputManager::read(const Reader& lisp)
58 {
59   const lisp::Lisp* keymap_lisp = lisp.get_lisp("keymap");
60   if (keymap_lisp) 
61   {
62     keyboard_manager->read(keymap_lisp);
63   }
64
65   const lisp::Lisp* joystick_lisp = lisp.get_lisp(_("joystick"));
66   if (joystick_lisp) 
67   {
68     joystick_manager->read(joystick_lisp);
69   }
70 }
71
72 void
73 InputManager::write(Writer& writer)
74 {
75   writer.start_list("keymap");
76   keyboard_manager->write(writer);
77   writer.end_list("keymap");
78
79   writer.start_list("joystick");
80   joystick_manager->write(writer);
81   writer.end_list("joystick");
82 }
83
84 void
85 InputManager::update()
86 {
87   controller->update();
88 }
89
90 void
91 InputManager::reset()
92 {
93   controller->reset();
94 }
95
96 void
97 InputManager::process_event(const SDL_Event& event)
98 {
99   switch(event.type) {
100     case SDL_TEXTINPUT:
101       keyboard_manager->process_text_input_event(event.text);
102       break;
103
104     case SDL_KEYUP:
105     case SDL_KEYDOWN:
106       keyboard_manager->process_key_event(event.key);
107       break;
108
109     case SDL_JOYAXISMOTION:
110       if (!m_use_game_controller) joystick_manager->process_axis_event(event.jaxis);
111       break;
112
113     case SDL_JOYHATMOTION:
114       if (!m_use_game_controller) joystick_manager->process_hat_event(event.jhat);
115       break;
116
117     case SDL_JOYBUTTONDOWN:
118     case SDL_JOYBUTTONUP:
119       if (!m_use_game_controller) joystick_manager->process_button_event(event.jbutton);
120       break;
121
122     case SDL_JOYDEVICEADDED:
123       joystick_manager->on_joystick_added(event.jdevice.which);
124       break;
125
126     case SDL_JOYDEVICEREMOVED:
127       joystick_manager->on_joystick_removed(event.jdevice.which);
128       break;
129
130     case SDL_CONTROLLERAXISMOTION:
131       if (m_use_game_controller) game_controller_manager->process_axis_event(event.caxis);
132       break;
133
134     case SDL_CONTROLLERBUTTONDOWN:
135       if (m_use_game_controller) game_controller_manager->process_button_event(event.cbutton);
136       break;
137
138     case SDL_CONTROLLERBUTTONUP:
139       if (m_use_game_controller) game_controller_manager->process_button_event(event.cbutton);
140       break;
141
142     case SDL_CONTROLLERDEVICEADDED:
143       std::cout << "SDL_CONTROLLERDEVICEADDED" << std::endl;
144       game_controller_manager->on_controller_added(event.cdevice.which);
145       break;
146
147     case SDL_CONTROLLERDEVICEREMOVED:
148       std::cout << "SDL_CONTROLLERDEVICEREMOVED" << std::endl;
149       game_controller_manager->on_controller_removed(event.cdevice.which);
150       break;
151
152     case SDL_CONTROLLERDEVICEREMAPPED:
153       std::cout << "SDL_CONTROLLERDEVICEREMAPPED" << std::endl;
154       break;
155
156     default:
157       break;
158   }
159 }
160
161 /* EOF */