6f6ab3757d4dd95e752d20d8436788977cabcfd6
[supertux.git] / src / control / input_manager.cpp
1 //  SuperTux
2 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>,
3 //           2007,2014 Ingo Ruhnke <grumbel@gmail.com>
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/game_controller_manager.hpp"
23 #include "control/joystick_manager.hpp"
24 #include "control/keyboard_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/log.hpp"
30 #include "util/writer.hpp"
31
32 InputManager::InputManager() :
33   controller(new Controller),
34   m_use_game_controller(true),
35   keyboard_manager(new KeyboardManager(this)),
36   joystick_manager(new JoystickManager(this)),
37   game_controller_manager(new GameControllerManager(this))
38 {
39 }
40
41 InputManager::~InputManager()
42 {
43 }
44
45 Controller*
46 InputManager::get_controller()
47 {
48   return controller.get();
49 }
50
51 void
52 InputManager::use_game_controller(bool v)
53 {
54   m_use_game_controller = v;
55 }
56
57 void
58 InputManager::read(const Reader& lisp)
59 {
60   const lisp::Lisp* keymap_lisp = lisp.get_lisp("keymap");
61   if (keymap_lisp) 
62   {
63     keyboard_manager->read(keymap_lisp);
64   }
65
66   const lisp::Lisp* joystick_lisp = lisp.get_lisp(_("joystick"));
67   if (joystick_lisp) 
68   {
69     joystick_manager->read(joystick_lisp);
70   }
71 }
72
73 void
74 InputManager::write(Writer& writer)
75 {
76   writer.start_list("keymap");
77   keyboard_manager->write(writer);
78   writer.end_list("keymap");
79
80   writer.start_list("joystick");
81   joystick_manager->write(writer);
82   writer.end_list("joystick");
83 }
84
85 void
86 InputManager::update()
87 {
88   controller->update();
89 }
90
91 void
92 InputManager::reset()
93 {
94   controller->reset();
95 }
96
97 void
98 InputManager::process_event(const SDL_Event& event)
99 {
100   switch(event.type) {
101     case SDL_TEXTINPUT:
102       keyboard_manager->process_text_input_event(event.text);
103       break;
104
105     case SDL_KEYUP:
106     case SDL_KEYDOWN:
107       keyboard_manager->process_key_event(event.key);
108       break;
109
110     case SDL_JOYAXISMOTION:
111       if (!m_use_game_controller) joystick_manager->process_axis_event(event.jaxis);
112       break;
113
114     case SDL_JOYHATMOTION:
115       if (!m_use_game_controller) joystick_manager->process_hat_event(event.jhat);
116       break;
117
118     case SDL_JOYBUTTONDOWN:
119     case SDL_JOYBUTTONUP:
120       if (!m_use_game_controller) joystick_manager->process_button_event(event.jbutton);
121       break;
122
123     case SDL_JOYDEVICEADDED:
124       joystick_manager->on_joystick_added(event.jdevice.which);
125       break;
126
127     case SDL_JOYDEVICEREMOVED:
128       joystick_manager->on_joystick_removed(event.jdevice.which);
129       break;
130
131     case SDL_CONTROLLERAXISMOTION:
132       if (m_use_game_controller) game_controller_manager->process_axis_event(event.caxis);
133       break;
134
135     case SDL_CONTROLLERBUTTONDOWN:
136       if (m_use_game_controller) game_controller_manager->process_button_event(event.cbutton);
137       break;
138
139     case SDL_CONTROLLERBUTTONUP:
140       if (m_use_game_controller) game_controller_manager->process_button_event(event.cbutton);
141       break;
142
143     case SDL_CONTROLLERDEVICEADDED:
144       log_debug << "SDL_CONTROLLERDEVICEADDED" << std::endl;
145       game_controller_manager->on_controller_added(event.cdevice.which);
146       break;
147
148     case SDL_CONTROLLERDEVICEREMOVED:
149       log_debug << "SDL_CONTROLLERDEVICEREMOVED" << std::endl;
150       game_controller_manager->on_controller_removed(event.cdevice.which);
151       break;
152
153     case SDL_CONTROLLERDEVICEREMAPPED:
154       log_debug << "SDL_CONTROLLERDEVICEREMAPPED" << std::endl;
155       break;
156
157     default:
158       break;
159   }
160 }
161
162 /* EOF */