2 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>,
3 // 2007 Ingo Ruhnke <grumbel@gmx.de>
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.
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.
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/>.
18 #include "control/joystickkeyboardcontroller.hpp"
22 #include "gui/menu.hpp"
23 #include "util/writer.hpp"
24 #include "lisp/list_iterator.hpp"
25 #include "supertux/gameconfig.hpp"
26 #include "supertux/console.hpp"
27 #include "util/gettext.hpp"
30 const int SCAN_JOYSTICKS = Controller::CONTROLCOUNT + 1;
33 class JoystickKeyboardController::JoystickMenu : public Menu
36 JoystickMenu(JoystickKeyboardController* controller);
37 virtual ~JoystickMenu();
40 std::string get_button_name(int button);
41 void update_menu_item(Control id);
42 virtual void menu_action(MenuItem* item);
43 JoystickKeyboardController* controller;
48 class JoystickKeyboardController::KeyboardMenu : public Menu
51 KeyboardMenu(JoystickKeyboardController* controller);
55 std::string get_key_name(SDLKey key);
56 virtual void menu_action(MenuItem* item);
57 JoystickKeyboardController* controller;
60 JoystickKeyboardController::JoystickKeyboardController()
62 wait_for_key(-1), wait_for_joystick(-1),
63 key_options_menu(0), joystick_options_menu(0)
65 // initialize default keyboard map
66 keymap[SDLK_LEFT] = LEFT;
67 keymap[SDLK_RIGHT] = RIGHT;
69 keymap[SDLK_DOWN] = DOWN;
70 keymap[SDLK_SPACE] = JUMP;
71 keymap[SDLK_LCTRL] = ACTION;
72 keymap[SDLK_LALT] = ACTION;
73 keymap[SDLK_ESCAPE] = PAUSE_MENU;
74 keymap[SDLK_p] = PAUSE_MENU;
75 keymap[SDLK_PAUSE] = PAUSE_MENU;
76 keymap[SDLK_RETURN] = MENU_SELECT;
77 keymap[SDLK_KP_ENTER] = MENU_SELECT;
78 keymap[SDLK_CARET] = CONSOLE;
79 keymap[SDLK_DELETE] = PEEK_LEFT;
80 keymap[SDLK_PAGEDOWN] = PEEK_RIGHT;
81 keymap[SDLK_HOME] = PEEK_UP;
82 keymap[SDLK_END] = PEEK_DOWN;
84 jump_with_up_joy = false;
85 jump_with_up_kbd = false;
87 updateAvailableJoysticks();
91 // Default joystick button configuration
92 joy_button_map[0] = JUMP;
93 joy_button_map[1] = ACTION;
95 if( min_joybuttons > 5 ){
96 joy_button_map[4] = PEEK_LEFT;
97 joy_button_map[5] = PEEK_RIGHT;
99 if(min_joybuttons > 7)
100 joy_button_map[min_joybuttons-1] = PAUSE_MENU;
102 // map the last 2 buttons to menu and pause
103 if(min_joybuttons > 2)
104 joy_button_map[min_joybuttons-1] = PAUSE_MENU;
105 // map all remaining joystick buttons to MENU_SELECT
106 for(int i = 2; i < max_joybuttons; ++i) {
107 if(i != min_joybuttons-1)
108 joy_button_map[i] = MENU_SELECT;
112 // Default joystick axis configuration
113 joy_axis_map[-1] = LEFT;
114 joy_axis_map[ 1] = RIGHT;
115 joy_axis_map[-2] = UP;
116 joy_axis_map[ 2] = DOWN;
119 JoystickKeyboardController::~JoystickKeyboardController()
121 for(std::vector<SDL_Joystick*>::iterator i = joysticks.begin();
122 i != joysticks.end(); ++i) {
124 SDL_JoystickClose(*i);
127 delete key_options_menu;
128 delete joystick_options_menu;
132 JoystickKeyboardController::updateAvailableJoysticks()
134 for(std::vector<SDL_Joystick*>::iterator i = joysticks.begin();
135 i != joysticks.end(); ++i) {
137 SDL_JoystickClose(*i);
141 SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
142 SDL_InitSubSystem(SDL_INIT_JOYSTICK);
144 int joystick_count = SDL_NumJoysticks();
150 if( joystick_count > 0 ){
151 for(int i = 0; i < joystick_count; ++i) {
152 SDL_Joystick* joystick = SDL_JoystickOpen(i);
154 if(SDL_JoystickNumButtons(joystick) < 2) {
155 log_info << "Joystick " << i << ": " << SDL_JoystickName(i) << " has less than 2 buttons" << std::endl;
158 if(SDL_JoystickNumAxes(joystick) < 2
159 && SDL_JoystickNumHats(joystick) == 0) {
160 log_info << "Joystick " << i << ": " << SDL_JoystickName(i) << " has less than 2 axes and no hat" << std::endl;
164 SDL_JoystickClose(joystick);
168 if(min_joybuttons < 0 || SDL_JoystickNumButtons(joystick) < min_joybuttons)
169 min_joybuttons = SDL_JoystickNumButtons(joystick);
171 if(SDL_JoystickNumButtons(joystick) > max_joybuttons)
172 max_joybuttons = SDL_JoystickNumButtons(joystick);
174 if(SDL_JoystickNumAxes(joystick) > max_joyaxis)
175 max_joyaxis = SDL_JoystickNumAxes(joystick);
177 if(SDL_JoystickNumHats(joystick) > max_joyhats)
178 max_joyhats = SDL_JoystickNumHats(joystick);
180 joysticks.push_back(joystick);
184 // some joysticks or SDL seem to produce some bogus events after being opened
185 Uint32 ticks = SDL_GetTicks();
186 while(SDL_GetTicks() - ticks < 200) {
188 SDL_PollEvent(&event);
193 JoystickKeyboardController::read(const Reader& lisp)
195 const lisp::Lisp* keymap_lisp = lisp.get_lisp("keymap");
198 keymap_lisp->get("jump-with-up", jump_with_up_kbd);
199 lisp::ListIterator iter(keymap_lisp);
201 if(iter.item() == "map") {
204 const lisp::Lisp* map = iter.lisp();
205 map->get("key", key);
206 map->get("control", control);
207 if(key < SDLK_FIRST || key >= SDLK_LAST) {
208 log_info << "Invalid key '" << key << "' in keymap" << std::endl;
213 for(i = 0; controlNames[i] != 0; ++i) {
214 if(control == controlNames[i])
217 if(controlNames[i] == 0) {
218 log_info << "Invalid control '" << control << "' in keymap" << std::endl;
221 keymap[(SDLKey) key] = (Control)i;
226 const lisp::Lisp* joystick_lisp = lisp.get_lisp("joystick");
228 joystick_lisp->get("dead-zone", dead_zone);
229 joystick_lisp->get("jump-with-up", jump_with_up_joy);
230 lisp::ListIterator iter(joystick_lisp);
232 if(iter.item() == "map") {
237 const lisp::Lisp* map = iter.lisp();
239 map->get("control", control);
241 for(i = 0; controlNames[i] != 0; ++i) {
242 if(control == controlNames[i])
245 if(controlNames[i] == 0) {
246 log_info << "Invalid control '" << control << "' in buttonmap" << std::endl;
250 if (map->get("button", button)) {
251 if(button < 0 || button >= max_joybuttons) {
252 log_info << "Invalid button '" << button << "' in buttonmap" << std::endl;
255 bind_joybutton(button, (Control) i);
258 if (map->get("axis", axis)) {
259 if (axis == 0 || abs(axis) > max_joyaxis) {
260 log_info << "Invalid axis '" << axis << "' in axismap" << std::endl;
263 bind_joyaxis(axis, (Control) i);
266 if (map->get("hat", hat)) {
267 if (hat != SDL_HAT_UP &&
268 hat != SDL_HAT_DOWN &&
269 hat != SDL_HAT_LEFT &&
270 hat != SDL_HAT_RIGHT) {
271 log_info << "Invalid axis '" << axis << "' in axismap" << std::endl;
274 bind_joyhat(hat, (Control) i);
283 JoystickKeyboardController::write(Writer& writer)
285 writer.start_list("keymap");
286 writer.write("jump-with-up", jump_with_up_kbd);
287 for(KeyMap::iterator i = keymap.begin(); i != keymap.end(); ++i) {
288 writer.start_list("map");
289 writer.write("key", (int) i->first);
290 writer.write("control", controlNames[i->second]);
291 writer.end_list("map");
293 writer.end_list("keymap");
295 writer.start_list("joystick");
296 writer.write("dead-zone", dead_zone);
297 writer.write("jump-with-up", jump_with_up_joy);
299 for(ButtonMap::iterator i = joy_button_map.begin(); i != joy_button_map.end();
301 writer.start_list("map");
302 writer.write("button", i->first);
303 writer.write("control", controlNames[i->second]);
304 writer.end_list("map");
307 for(HatMap::iterator i = joy_hat_map.begin(); i != joy_hat_map.end(); ++i) {
308 writer.start_list("map");
309 writer.write("hat", i->first);
310 writer.write("control", controlNames[i->second]);
311 writer.end_list("map");
314 for(AxisMap::iterator i = joy_axis_map.begin(); i != joy_axis_map.end(); ++i) {
315 writer.start_list("map");
316 writer.write("axis", i->first);
317 writer.write("control", controlNames[i->second]);
318 writer.end_list("map");
321 writer.end_list("joystick");
325 JoystickKeyboardController::reset()
331 JoystickKeyboardController::set_joy_controls(Control id, bool value)
333 if (jump_with_up_joy && id == Controller::UP)
334 controls[Controller::JUMP] = value;
336 controls[(Control)id] = value;
340 JoystickKeyboardController::process_event(const SDL_Event& event)
345 process_key_event(event);
348 case SDL_JOYAXISMOTION:
349 process_axis_event(event.jaxis);
352 case SDL_JOYHATMOTION:
353 process_hat_event(event.jhat);
356 case SDL_JOYBUTTONDOWN:
357 case SDL_JOYBUTTONUP:
358 process_button_event(event.jbutton);
367 JoystickKeyboardController::process_button_event(const SDL_JoyButtonEvent& jbutton)
369 if(wait_for_joystick >= 0)
371 if(jbutton.state == SDL_PRESSED)
373 bind_joybutton(jbutton.button, (Control)wait_for_joystick);
374 joystick_options_menu->update();
376 wait_for_joystick = -1;
381 ButtonMap::iterator i = joy_button_map.find(jbutton.button);
382 if(i == joy_button_map.end()) {
383 log_debug << "Unmapped joybutton " << (int)jbutton.button << " pressed" << std::endl;
385 set_joy_controls(i->second, (jbutton.state == SDL_PRESSED));
391 JoystickKeyboardController::process_axis_event(const SDL_JoyAxisEvent& jaxis)
393 if (wait_for_joystick >= 0)
395 if (abs(jaxis.value) > dead_zone) {
397 bind_joyaxis(-(jaxis.axis + 1), Control(wait_for_joystick));
399 bind_joyaxis(jaxis.axis + 1, Control(wait_for_joystick));
401 joystick_options_menu->update();
402 wait_for_joystick = -1;
407 // Split the axis into left and right, so that both can be
408 // mapped separately (needed for jump/down vs up/down)
409 int axis = jaxis.axis + 1;
411 AxisMap::iterator left = joy_axis_map.find(-axis);
412 AxisMap::iterator right = joy_axis_map.find(axis);
414 if(left == joy_axis_map.end()) {
415 std::cout << "Unmapped joyaxis " << (int)jaxis.axis << " moved" << std::endl;
417 if (jaxis.value < -dead_zone)
418 set_joy_controls(left->second, true);
419 else if (jaxis.value > dead_zone)
420 set_joy_controls(left->second, false);
422 set_joy_controls(left->second, false);
425 if(right == joy_axis_map.end()) {
426 std::cout << "Unmapped joyaxis " << (int)jaxis.axis << " moved" << std::endl;
428 if (jaxis.value < -dead_zone)
429 set_joy_controls(right->second, false);
430 else if (jaxis.value > dead_zone)
431 set_joy_controls(right->second, true);
433 set_joy_controls(right->second, false);
439 JoystickKeyboardController::process_hat_event(const SDL_JoyHatEvent& jhat)
441 Uint8 changed = hat_state ^ jhat.value;
443 if (wait_for_joystick >= 0)
445 if (changed & SDL_HAT_UP && jhat.value & SDL_HAT_UP)
446 bind_joyhat(SDL_HAT_UP, (Control)wait_for_joystick);
448 if (changed & SDL_HAT_DOWN && jhat.value & SDL_HAT_DOWN)
449 bind_joyhat(SDL_HAT_DOWN, (Control)wait_for_joystick);
451 if (changed & SDL_HAT_LEFT && jhat.value & SDL_HAT_LEFT)
452 bind_joyhat(SDL_HAT_LEFT, (Control)wait_for_joystick);
454 if (changed & SDL_HAT_RIGHT && jhat.value & SDL_HAT_RIGHT)
455 bind_joyhat(SDL_HAT_RIGHT, (Control)wait_for_joystick);
457 joystick_options_menu->update();
458 wait_for_joystick = -1;
462 if (changed & SDL_HAT_UP)
464 HatMap::iterator it = joy_hat_map.find(SDL_HAT_UP);
465 if (it != joy_hat_map.end())
466 set_joy_controls(it->second, jhat.value & SDL_HAT_UP);
469 if (changed & SDL_HAT_DOWN)
471 HatMap::iterator it = joy_hat_map.find(SDL_HAT_DOWN);
472 if (it != joy_hat_map.end())
473 set_joy_controls(it->second, jhat.value & SDL_HAT_DOWN);
476 if (changed & SDL_HAT_LEFT)
478 HatMap::iterator it = joy_hat_map.find(SDL_HAT_LEFT);
479 if (it != joy_hat_map.end())
480 set_joy_controls(it->second, jhat.value & SDL_HAT_LEFT);
483 if (changed & SDL_HAT_RIGHT)
485 HatMap::iterator it = joy_hat_map.find(SDL_HAT_RIGHT);
486 if (it != joy_hat_map.end())
487 set_joy_controls(it->second, jhat.value & SDL_HAT_RIGHT);
491 hat_state = jhat.value;
495 JoystickKeyboardController::process_key_event(const SDL_Event& event)
497 KeyMap::iterator key_mapping = keymap.find(event.key.keysym.sym);
499 // if console key was pressed: toggle console
500 if ((key_mapping != keymap.end()) && (key_mapping->second == CONSOLE)) {
501 if (event.type == SDL_KEYDOWN)
502 Console::instance->toggle();
504 if (Console::instance->hasFocus()) {
505 // if console is open: send key there
506 process_console_key_event(event);
507 } else if (Menu::current()) {
508 // if menu mode: send key there
509 process_menu_key_event(event);
510 } else if(key_mapping == keymap.end()) {
511 // default action: update controls
512 //log_debug << "Key " << event.key.keysym.sym << " is unbound" << std::endl;
514 Control control = key_mapping->second;
515 controls[control] = (event.type == SDL_KEYDOWN);
516 if (jump_with_up_kbd && control == UP){
517 controls[JUMP] = (event.type == SDL_KEYDOWN);
524 JoystickKeyboardController::process_console_key_event(const SDL_Event& event)
526 if (event.type != SDL_KEYDOWN) return;
528 switch (event.key.keysym.sym) {
530 Console::instance->enter();
533 Console::instance->backspace();
536 Console::instance->autocomplete();
539 Console::instance->scroll(-1);
542 Console::instance->scroll(+1);
545 Console::instance->move_cursor(-65535);
548 Console::instance->move_cursor(+65535);
551 Console::instance->show_history(-1);
554 Console::instance->show_history(+1);
557 Console::instance->move_cursor(-1);
560 Console::instance->move_cursor(+1);
563 int c = event.key.keysym.unicode;
564 if ((c >= 32) && (c <= 126)) {
565 Console::instance->input((char)c);
572 JoystickKeyboardController::process_menu_key_event(const SDL_Event& event)
574 // wait for key mode?
575 if(wait_for_key >= 0) {
576 if(event.type == SDL_KEYUP)
579 if(event.key.keysym.sym != SDLK_ESCAPE
580 && event.key.keysym.sym != SDLK_PAUSE) {
581 bind_key(event.key.keysym.sym, (Control) wait_for_key);
584 key_options_menu->update();
588 if(wait_for_joystick >= 0) {
589 if(event.key.keysym.sym == SDLK_ESCAPE) {
591 joystick_options_menu->update();
592 wait_for_joystick = -1;
598 /* we use default keys when the menu is open (to avoid problems when
599 * redefining keys to invalid settings
601 switch(event.key.keysym.sym) {
617 control = MENU_SELECT;
621 control = PAUSE_MENU;
628 controls[control] = (event.type == SDL_KEYDOWN);
632 JoystickKeyboardController::unbind_joystick_control(Control control)
634 // remove all previous mappings for that control
635 for(AxisMap::iterator i = joy_axis_map.begin(); i != joy_axis_map.end(); /* no ++i */) {
636 if(i->second == control)
637 joy_axis_map.erase(i++);
642 for(ButtonMap::iterator i = joy_button_map.begin(); i != joy_button_map.end(); /* no ++i */) {
643 if(i->second == control)
644 joy_button_map.erase(i++);
649 for(HatMap::iterator i = joy_hat_map.begin(); i != joy_hat_map.end(); /* no ++i */) {
650 if(i->second == control)
651 joy_hat_map.erase(i++);
658 JoystickKeyboardController::bind_joyaxis(int axis, Control control)
660 // axis isn't the SDL axis number, but axisnumber + 1 with sign
661 // changed depending on if the positive or negative end is to be
662 // used (negative axis 0 becomes -1, positive axis 2 becomes +3,
665 unbind_joystick_control(control);
668 joy_axis_map[axis] = control;
672 JoystickKeyboardController::bind_joyhat(int dir, Control c)
674 unbind_joystick_control(c);
677 joy_hat_map[dir] = c;
681 JoystickKeyboardController::bind_joybutton(int button, Control control)
683 unbind_joystick_control(control);
686 joy_button_map[button] = control;
690 JoystickKeyboardController::bind_key(SDLKey key, Control control)
692 // remove all previous mappings for that control and for that key
693 for(KeyMap::iterator i = keymap.begin();
694 i != keymap.end(); /* no ++i */) {
695 if(i->second == control) {
696 KeyMap::iterator e = i;
704 KeyMap::iterator i = keymap.find(key);
705 if(i != keymap.end())
709 keymap[key]= control;
713 JoystickKeyboardController::print_joystick_mappings()
715 std::cout << "Joystick Mappings" << std::endl;
716 std::cout << "-----------------" << std::endl;
717 for(AxisMap::iterator i = joy_axis_map.begin(); i != joy_axis_map.end(); ++i) {
718 std::cout << "Axis: " << i->first << " -> " << i->second << std::endl;
721 for(ButtonMap::iterator i = joy_button_map.begin(); i != joy_button_map.end(); ++i) {
722 std::cout << "Button: " << i->first << " -> " << i->second << std::endl;
725 for(HatMap::iterator i = joy_hat_map.begin(); i != joy_hat_map.end(); ++i) {
726 std::cout << "Hat: " << i->first << " -> " << i->second << std::endl;
728 std::cout << std::endl;
732 JoystickKeyboardController::reversemap_key(Control c)
734 for(KeyMap::iterator i = keymap.begin(); i != keymap.end(); ++i) {
743 JoystickKeyboardController::reversemap_joyaxis(Control c)
745 for(AxisMap::iterator i = joy_axis_map.begin(); i != joy_axis_map.end(); ++i) {
754 JoystickKeyboardController::reversemap_joybutton(Control c)
756 for(ButtonMap::iterator i = joy_button_map.begin(); i != joy_button_map.end(); ++i) {
765 JoystickKeyboardController::reversemap_joyhat(Control c)
767 for(HatMap::iterator i = joy_hat_map.begin(); i != joy_hat_map.end(); ++i) {
776 JoystickKeyboardController::get_key_options_menu()
778 if(key_options_menu == 0) {
779 key_options_menu = new KeyboardMenu(this);
782 return key_options_menu;
786 JoystickKeyboardController::get_joystick_options_menu()
788 if(joystick_options_menu == 0) {
789 joystick_options_menu = new JoystickMenu(this);
792 return joystick_options_menu;
795 //----------------------------------------------------------------------------
797 JoystickKeyboardController::KeyboardMenu::KeyboardMenu(
798 JoystickKeyboardController* _controller)
799 : controller(_controller)
801 add_label(_("Setup Keyboard"));
803 add_controlfield(Controller::UP, _("Up"));
804 add_controlfield(Controller::DOWN, _("Down"));
805 add_controlfield(Controller::LEFT, _("Left"));
806 add_controlfield(Controller::RIGHT, _("Right"));
807 add_controlfield(Controller::JUMP, _("Jump"));
808 add_controlfield(Controller::ACTION, _("Action"));
809 add_controlfield(Controller::PEEK_LEFT, _("Peek Left"));
810 add_controlfield(Controller::PEEK_RIGHT, _("Peek Right"));
811 add_controlfield(Controller::PEEK_UP, _("Peek Up"));
812 add_controlfield(Controller::PEEK_DOWN, _("Peek Down"));
813 if (g_config->console_enabled) {
814 add_controlfield(Controller::CONSOLE, _("Console"));
816 add_toggle(Controller::CONTROLCOUNT, _("Jump with Up"), controller->jump_with_up_kbd);
822 JoystickKeyboardController::KeyboardMenu::~KeyboardMenu()
826 JoystickKeyboardController::KeyboardMenu::get_key_name(SDLKey key)
832 return _("Up cursor");
834 return _("Down cursor");
836 return _("Left cursor");
838 return _("Right cursor");
844 return _("Right Shift");
846 return _("Left Shift");
848 return _("Right Control");
850 return _("Left Control");
852 return _("Right Alt");
854 return _("Left Alt");
856 return SDL_GetKeyName((SDLKey) key);
861 JoystickKeyboardController::KeyboardMenu::menu_action(MenuItem* item)
863 if(item->id >= 0 && item->id < Controller::CONTROLCOUNT){
864 item->change_input(_("Press Key"));
865 controller->wait_for_key = item->id;
866 } else if( item->id == Controller::CONTROLCOUNT) {
867 controller->jump_with_up_kbd = item->toggled;
872 JoystickKeyboardController::KeyboardMenu::update()
875 get_item_by_id((int) Controller::UP).change_input(get_key_name(
876 controller->reversemap_key(Controller::UP)));
877 get_item_by_id((int) Controller::DOWN).change_input(get_key_name(
878 controller->reversemap_key(Controller::DOWN)));
879 get_item_by_id((int) Controller::LEFT).change_input(get_key_name(
880 controller->reversemap_key(Controller::LEFT)));
881 get_item_by_id((int) Controller::RIGHT).change_input(get_key_name(
882 controller->reversemap_key(Controller::RIGHT)));
883 get_item_by_id((int) Controller::JUMP).change_input(get_key_name(
884 controller->reversemap_key(Controller::JUMP)));
885 get_item_by_id((int) Controller::ACTION).change_input(get_key_name(
886 controller->reversemap_key(Controller::ACTION)));
887 get_item_by_id((int) Controller::PEEK_LEFT).change_input(get_key_name(
888 controller->reversemap_key(Controller::PEEK_LEFT)));
889 get_item_by_id((int) Controller::PEEK_RIGHT).change_input(get_key_name(
890 controller->reversemap_key(Controller::PEEK_RIGHT)));
891 get_item_by_id((int) Controller::PEEK_UP).change_input(get_key_name(
892 controller->reversemap_key(Controller::PEEK_UP)));
893 get_item_by_id((int) Controller::PEEK_DOWN).change_input(get_key_name(
894 controller->reversemap_key(Controller::PEEK_DOWN)));
895 if (g_config->console_enabled) {
896 get_item_by_id((int) Controller::CONSOLE).change_input(get_key_name(
897 controller->reversemap_key(Controller::CONSOLE)));
899 get_item_by_id(Controller::CONTROLCOUNT).toggled = controller->jump_with_up_kbd;
902 //---------------------------------------------------------------------------
904 JoystickKeyboardController::JoystickMenu::JoystickMenu(
905 JoystickKeyboardController* _controller)
906 : controller(_controller)
911 JoystickKeyboardController::JoystickMenu::~JoystickMenu()
915 JoystickKeyboardController::JoystickMenu::recreateMenu()
918 add_label(_("Setup Joystick"));
920 if(controller->joysticks.size() > 0) {
921 add_controlfield(Controller::UP, _("Up"));
922 add_controlfield(Controller::DOWN, _("Down"));
923 add_controlfield(Controller::LEFT, _("Left"));
924 add_controlfield(Controller::RIGHT, _("Right"));
925 add_controlfield(Controller::JUMP, _("Jump"));
926 add_controlfield(Controller::ACTION, _("Action"));
927 add_controlfield(Controller::PAUSE_MENU, _("Pause/Menu"));
928 add_controlfield(Controller::PEEK_LEFT, _("Peek Left"));
929 add_controlfield(Controller::PEEK_RIGHT, _("Peek Right"));
930 add_controlfield(Controller::PEEK_UP, _("Peek Up"));
931 add_controlfield(Controller::PEEK_DOWN, _("Peek Down"));
933 add_toggle(Controller::CONTROLCOUNT, _("Jump with Up"), controller->jump_with_up_joy);
935 add_inactive(-1, _("No Joysticks found"));
938 add_entry(SCAN_JOYSTICKS, _("Scan for Joysticks"));
940 //Show Joysticks currently activated:
941 for(std::vector<SDL_Joystick*>::iterator i = controller->joysticks.begin();
942 i != controller->joysticks.end(); ++i) {
944 add_inactive(-1, SDL_JoystickName(SDL_JoystickIndex(*i)) );
953 JoystickKeyboardController::JoystickMenu::get_button_name(int button)
958 std::ostringstream name;
959 name << "Button " << button;
964 JoystickKeyboardController::JoystickMenu::menu_action(MenuItem* item)
966 if (item->id >= 0 && item->id < Controller::CONTROLCOUNT) {
967 item->change_input(_("Press Button"));
968 controller->wait_for_joystick = item->id;
969 } else if (item->id == Controller::CONTROLCOUNT) {
970 controller->jump_with_up_joy = item->toggled;
971 } else if( item->id == SCAN_JOYSTICKS) {
972 controller->updateAvailableJoysticks();
978 JoystickKeyboardController::JoystickMenu::update_menu_item(Control id)
980 int button = controller->reversemap_joybutton(id);
981 int axis = controller->reversemap_joyaxis(id);
982 int hat_dir = controller->reversemap_joyhat(id);
985 get_item_by_id((int)id).change_input(get_button_name(button));
986 } else if (axis != 0) {
987 std::ostringstream name;
998 else if (abs(axis) == 2)
1000 else if (abs(axis) == 2)
1002 else if (abs(axis) == 3)
1007 get_item_by_id((int)id).change_input(name.str());
1008 } else if (hat_dir != -1) {
1030 name = "Unknown hat_dir";
1034 get_item_by_id((int)id).change_input(name);
1036 get_item_by_id((int)id).change_input("None");
1041 JoystickKeyboardController::JoystickMenu::update()
1043 if(controller->joysticks.size() == 0)
1046 update_menu_item(Controller::UP);
1047 update_menu_item(Controller::DOWN);
1048 update_menu_item(Controller::LEFT);
1049 update_menu_item(Controller::RIGHT);
1051 update_menu_item(Controller::JUMP);
1052 update_menu_item(Controller::ACTION);
1053 update_menu_item(Controller::PAUSE_MENU);
1054 update_menu_item(Controller::PEEK_LEFT);
1055 update_menu_item(Controller::PEEK_RIGHT);
1056 update_menu_item(Controller::PEEK_UP);
1057 update_menu_item(Controller::PEEK_DOWN);
1059 get_item_by_id(Controller::CONTROLCOUNT).toggled = controller->jump_with_up_joy;