4 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>,
5 // 2007 Ingo Ruhnke <grumbel@gmx.de>
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 #include "joystickkeyboardcontroller.hpp"
26 #include "gui/menu.hpp"
27 #include "gettext.hpp"
28 #include "lisp/lisp.hpp"
29 #include "lisp/list_iterator.hpp"
30 #include "game_session.hpp"
31 #include "console.hpp"
32 #include "gameconfig.hpp"
34 class JoystickKeyboardController::JoystickMenu : public Menu
37 JoystickMenu(JoystickKeyboardController* controller);
38 virtual ~JoystickMenu();
41 std::string get_button_name(int button);
42 void update_menu_item(Control id);
43 virtual void menu_action(MenuItem* item);
44 JoystickKeyboardController* controller;
47 class JoystickKeyboardController::KeyboardMenu : public Menu
50 KeyboardMenu(JoystickKeyboardController* controller);
54 std::string get_key_name(SDLKey key);
55 virtual void menu_action(MenuItem* item);
56 JoystickKeyboardController* controller;
59 JoystickKeyboardController::JoystickKeyboardController()
61 wait_for_key(-1), wait_for_joystick(-1),
62 key_options_menu(0), joystick_options_menu(0)
64 // initialize default keyboard map
65 keymap[SDLK_LEFT] = LEFT;
66 keymap[SDLK_RIGHT] = RIGHT;
68 keymap[SDLK_DOWN] = DOWN;
69 keymap[SDLK_SPACE] = JUMP;
70 keymap[SDLK_LCTRL] = ACTION;
71 keymap[SDLK_LALT] = ACTION;
72 keymap[SDLK_ESCAPE] = PAUSE_MENU;
73 keymap[SDLK_p] = PAUSE_MENU;
74 keymap[SDLK_PAUSE] = PAUSE_MENU;
75 keymap[SDLK_RETURN] = MENU_SELECT;
76 keymap[SDLK_KP_ENTER] = MENU_SELECT;
77 keymap[SDLK_CARET] = CONSOLE;
78 keymap[SDLK_DELETE] = PEEK_LEFT;
79 keymap[SDLK_END] = PEEK_RIGHT;
80 keymap[SDLK_PAGEUP] = PEEK_UP;
81 keymap[SDLK_PAGEDOWN] = PEEK_DOWN;
83 jump_with_up_joy = false;
84 jump_with_up_kbd = false;
86 int joystick_count = SDL_NumJoysticks();
92 for(int i = 0; i < joystick_count; ++i) {
93 SDL_Joystick* joystick = SDL_JoystickOpen(i);
95 if(SDL_JoystickNumButtons(joystick) < 2) {
96 log_info << "Joystick " << i << " has less than 2 buttons" << std::endl;
99 if(SDL_JoystickNumAxes(joystick) < 2
100 && SDL_JoystickNumHats(joystick) == 0) {
101 log_info << "Joystick " << i << " has less than 2 axes and no hat" << std::endl;
105 SDL_JoystickClose(joystick);
109 if(min_joybuttons < 0 || SDL_JoystickNumButtons(joystick) < min_joybuttons)
110 min_joybuttons = SDL_JoystickNumButtons(joystick);
112 if(SDL_JoystickNumButtons(joystick) > max_joybuttons)
113 max_joybuttons = SDL_JoystickNumButtons(joystick);
115 if(SDL_JoystickNumAxes(joystick) > max_joyaxis)
116 max_joyaxis = SDL_JoystickNumAxes(joystick);
118 if(SDL_JoystickNumHats(joystick) > max_joyhats)
119 max_joyhats = SDL_JoystickNumHats(joystick);
121 joysticks.push_back(joystick);
126 // Default joystick button configuration
127 joy_button_map[0] = JUMP;
128 joy_button_map[1] = ACTION;
130 if( min_joybuttons > 5 ){
131 joy_button_map[4] = PEEK_LEFT;
132 joy_button_map[5] = PEEK_RIGHT;
134 if(min_joybuttons > 7)
135 joy_button_map[min_joybuttons-1] = PAUSE_MENU;
137 // map the last 2 buttons to menu and pause
138 if(min_joybuttons > 2)
139 joy_button_map[min_joybuttons-1] = PAUSE_MENU;
140 // map all remaining joystick buttons to MENU_SELECT
141 for(int i = 2; i < max_joybuttons; ++i) {
142 if(i != min_joybuttons-1)
143 joy_button_map[i] = MENU_SELECT;
147 // Default joystick axis configuration
148 joy_axis_map[-1] = LEFT;
149 joy_axis_map[ 1] = RIGHT;
150 joy_axis_map[-2] = UP;
151 joy_axis_map[ 2] = DOWN;
153 // some joysticks or SDL seem to produce some bogus events after being opened
154 Uint32 ticks = SDL_GetTicks();
155 while(SDL_GetTicks() - ticks < 200) {
157 SDL_PollEvent(&event);
161 JoystickKeyboardController::~JoystickKeyboardController()
163 for(std::vector<SDL_Joystick*>::iterator i = joysticks.begin();
164 i != joysticks.end(); ++i) {
166 SDL_JoystickClose(*i);
169 delete key_options_menu;
170 delete joystick_options_menu;
174 JoystickKeyboardController::read(const lisp::Lisp& lisp)
176 const lisp::Lisp* keymap_lisp = lisp.get_lisp("keymap");
179 keymap_lisp->get("jump-with-up", jump_with_up_kbd);
180 lisp::ListIterator iter(keymap_lisp);
182 if(iter.item() == "map") {
185 const lisp::Lisp* map = iter.lisp();
186 map->get("key", key);
187 map->get("control", control);
188 if(key < SDLK_FIRST || key >= SDLK_LAST) {
189 log_info << "Invalid key '" << key << "' in keymap" << std::endl;
194 for(i = 0; controlNames[i] != 0; ++i) {
195 if(control == controlNames[i])
198 if(controlNames[i] == 0) {
199 log_info << "Invalid control '" << control << "' in keymap" << std::endl;
202 keymap[(SDLKey) key] = (Control)i;
207 const lisp::Lisp* joystick_lisp = lisp.get_lisp("joystick");
209 joystick_lisp->get("dead-zone", dead_zone);
210 joystick_lisp->get("jump-with-up", jump_with_up_joy);
211 lisp::ListIterator iter(joystick_lisp);
213 if(iter.item() == "map") {
218 const lisp::Lisp* map = iter.lisp();
220 map->get("control", control);
222 for(i = 0; controlNames[i] != 0; ++i) {
223 if(control == controlNames[i])
226 if(controlNames[i] == 0) {
227 log_info << "Invalid control '" << control << "' in buttonmap" << std::endl;
231 if (map->get("button", button)) {
232 if(button < 0 || button >= max_joybuttons) {
233 log_info << "Invalid button '" << button << "' in buttonmap" << std::endl;
236 bind_joybutton(button, (Control) i);
239 if (map->get("axis", axis)) {
240 if (axis == 0 || abs(axis) > max_joyaxis) {
241 log_info << "Invalid axis '" << axis << "' in axismap" << std::endl;
244 bind_joyaxis(axis, (Control) i);
247 if (map->get("hat", hat)) {
248 if (hat != SDL_HAT_UP &&
249 hat != SDL_HAT_DOWN &&
250 hat != SDL_HAT_LEFT &&
251 hat != SDL_HAT_RIGHT) {
252 log_info << "Invalid axis '" << axis << "' in axismap" << std::endl;
255 bind_joyhat(hat, (Control) i);
264 JoystickKeyboardController::write(lisp::Writer& writer)
266 writer.start_list("keymap");
267 writer.write_bool("jump-with-up", jump_with_up_kbd);
268 for(KeyMap::iterator i = keymap.begin(); i != keymap.end(); ++i) {
269 writer.start_list("map");
270 writer.write_int("key", (int) i->first);
271 writer.write_string("control", controlNames[i->second]);
272 writer.end_list("map");
274 writer.end_list("keymap");
276 writer.start_list("joystick");
277 writer.write_int("dead-zone", dead_zone);
278 writer.write_bool("jump-with-up", jump_with_up_joy);
280 for(ButtonMap::iterator i = joy_button_map.begin(); i != joy_button_map.end();
282 writer.start_list("map");
283 writer.write_int("button", i->first);
284 writer.write_string("control", controlNames[i->second]);
285 writer.end_list("map");
288 for(HatMap::iterator i = joy_hat_map.begin(); i != joy_hat_map.end(); ++i) {
289 writer.start_list("map");
290 writer.write_int("hat", i->first);
291 writer.write_string("control", controlNames[i->second]);
292 writer.end_list("map");
295 for(AxisMap::iterator i = joy_axis_map.begin(); i != joy_axis_map.end(); ++i) {
296 writer.start_list("map");
297 writer.write_int("axis", i->first);
298 writer.write_string("control", controlNames[i->second]);
299 writer.end_list("map");
302 writer.end_list("joystick");
306 JoystickKeyboardController::reset()
312 JoystickKeyboardController::set_joy_controls(Control id, bool value)
314 if (jump_with_up_joy && id == Controller::UP)
315 controls[Controller::JUMP] = value;
317 controls[(Control)id] = value;
321 JoystickKeyboardController::process_event(const SDL_Event& event)
326 process_key_event(event);
329 case SDL_JOYAXISMOTION:
330 process_axis_event(event.jaxis);
333 case SDL_JOYHATMOTION:
334 process_hat_event(event.jhat);
337 case SDL_JOYBUTTONDOWN:
338 case SDL_JOYBUTTONUP:
339 process_button_event(event.jbutton);
348 JoystickKeyboardController::process_button_event(const SDL_JoyButtonEvent& jbutton)
350 if(wait_for_joystick >= 0)
352 if(jbutton.state == SDL_PRESSED)
354 bind_joybutton(jbutton.button, (Control)wait_for_joystick);
355 joystick_options_menu->update();
357 wait_for_joystick = -1;
362 ButtonMap::iterator i = joy_button_map.find(jbutton.button);
363 if(i == joy_button_map.end()) {
364 log_debug << "Unmapped joybutton " << (int)jbutton.button << " pressed" << std::endl;
366 set_joy_controls(i->second, (jbutton.state == SDL_PRESSED));
372 JoystickKeyboardController::process_axis_event(const SDL_JoyAxisEvent& jaxis)
374 if (wait_for_joystick >= 0)
376 if (abs(jaxis.value) > dead_zone) {
378 bind_joyaxis(-(jaxis.axis + 1), Control(wait_for_joystick));
380 bind_joyaxis(jaxis.axis + 1, Control(wait_for_joystick));
382 joystick_options_menu->update();
383 wait_for_joystick = -1;
388 // Split the axis into left and right, so that both can be
389 // mapped seperatly (needed for jump/down vs up/down)
390 int axis = jaxis.axis + 1;
392 AxisMap::iterator left = joy_axis_map.find(-axis);
393 AxisMap::iterator right = joy_axis_map.find(axis);
395 if(left == joy_axis_map.end()) {
396 std::cout << "Unmapped joyaxis " << (int)jaxis.axis << " moved" << std::endl;
398 if (jaxis.value < -dead_zone)
399 set_joy_controls(left->second, true);
400 else if (jaxis.value > dead_zone)
401 set_joy_controls(left->second, false);
403 set_joy_controls(left->second, false);
406 if(right == joy_axis_map.end()) {
407 std::cout << "Unmapped joyaxis " << (int)jaxis.axis << " moved" << std::endl;
409 if (jaxis.value < -dead_zone)
410 set_joy_controls(right->second, false);
411 else if (jaxis.value > dead_zone)
412 set_joy_controls(right->second, true);
414 set_joy_controls(right->second, false);
420 JoystickKeyboardController::process_hat_event(const SDL_JoyHatEvent& jhat)
422 Uint8 changed = hat_state ^ jhat.value;
424 if (wait_for_joystick >= 0)
426 if (changed & SDL_HAT_UP && jhat.value & SDL_HAT_UP)
427 bind_joyhat(SDL_HAT_UP, (Control)wait_for_joystick);
429 if (changed & SDL_HAT_DOWN && jhat.value & SDL_HAT_DOWN)
430 bind_joyhat(SDL_HAT_DOWN, (Control)wait_for_joystick);
432 if (changed & SDL_HAT_LEFT && jhat.value & SDL_HAT_LEFT)
433 bind_joyhat(SDL_HAT_LEFT, (Control)wait_for_joystick);
435 if (changed & SDL_HAT_RIGHT && jhat.value & SDL_HAT_RIGHT)
436 bind_joyhat(SDL_HAT_RIGHT, (Control)wait_for_joystick);
438 joystick_options_menu->update();
439 wait_for_joystick = -1;
443 if (changed & SDL_HAT_UP)
445 HatMap::iterator it = joy_hat_map.find(SDL_HAT_UP);
446 if (it != joy_hat_map.end())
447 set_joy_controls(it->second, jhat.value & SDL_HAT_UP);
450 if (changed & SDL_HAT_DOWN)
452 HatMap::iterator it = joy_hat_map.find(SDL_HAT_DOWN);
453 if (it != joy_hat_map.end())
454 set_joy_controls(it->second, jhat.value & SDL_HAT_DOWN);
457 if (changed & SDL_HAT_LEFT)
459 HatMap::iterator it = joy_hat_map.find(SDL_HAT_LEFT);
460 if (it != joy_hat_map.end())
461 set_joy_controls(it->second, jhat.value & SDL_HAT_LEFT);
464 if (changed & SDL_HAT_RIGHT)
466 HatMap::iterator it = joy_hat_map.find(SDL_HAT_RIGHT);
467 if (it != joy_hat_map.end())
468 set_joy_controls(it->second, jhat.value & SDL_HAT_RIGHT);
472 hat_state = jhat.value;
476 JoystickKeyboardController::process_key_event(const SDL_Event& event)
478 KeyMap::iterator key_mapping = keymap.find(event.key.keysym.sym);
480 // if console key was pressed: toggle console
481 if ((key_mapping != keymap.end()) && (key_mapping->second == CONSOLE)) {
482 if (event.type == SDL_KEYDOWN)
483 Console::instance->toggle();
485 if (Console::instance->hasFocus()) {
486 // if console is open: send key there
487 process_console_key_event(event);
488 } else if (Menu::current()) {
489 // if menu mode: send key there
490 process_menu_key_event(event);
491 } else if(key_mapping == keymap.end()) {
492 // default action: update controls
493 log_debug << "Key " << event.key.keysym.sym << " is unbound" << std::endl;
495 Control control = key_mapping->second;
496 controls[control] = (event.type == SDL_KEYDOWN);
497 if (jump_with_up_kbd && control == UP){
498 controls[JUMP] = (event.type == SDL_KEYDOWN);
505 JoystickKeyboardController::process_console_key_event(const SDL_Event& event)
507 if (event.type != SDL_KEYDOWN) return;
509 switch (event.key.keysym.sym) {
511 Console::instance->enter();
514 Console::instance->backspace();
517 Console::instance->autocomplete();
520 Console::instance->scroll(-1);
523 Console::instance->scroll(+1);
526 Console::instance->move_cursor(-65535);
529 Console::instance->move_cursor(+65535);
532 Console::instance->show_history(-1);
535 Console::instance->show_history(+1);
538 Console::instance->move_cursor(-1);
541 Console::instance->move_cursor(+1);
544 int c = event.key.keysym.unicode;
545 if ((c >= 32) && (c <= 126)) {
546 Console::instance->input((char)c);
553 JoystickKeyboardController::process_menu_key_event(const SDL_Event& event)
555 // wait for key mode?
556 if(wait_for_key >= 0) {
557 if(event.type == SDL_KEYUP)
560 if(event.key.keysym.sym != SDLK_ESCAPE
561 && event.key.keysym.sym != SDLK_PAUSE) {
562 bind_key(event.key.keysym.sym, (Control) wait_for_key);
565 key_options_menu->update();
569 if(wait_for_joystick >= 0) {
570 if(event.key.keysym.sym == SDLK_ESCAPE) {
572 joystick_options_menu->update();
573 wait_for_joystick = -1;
579 /* we use default keys when the menu is open (to avoid problems when
580 * redefining keys to invalid settings
582 switch(event.key.keysym.sym) {
598 control = MENU_SELECT;
602 control = PAUSE_MENU;
609 controls[control] = (event.type == SDL_KEYDOWN);
613 JoystickKeyboardController::unbind_joystick_control(Control control)
615 // remove all previous mappings for that control
616 for(AxisMap::iterator i = joy_axis_map.begin(); i != joy_axis_map.end(); /* no ++i */) {
617 if(i->second == control)
618 joy_axis_map.erase(i++);
623 for(ButtonMap::iterator i = joy_button_map.begin(); i != joy_button_map.end(); /* no ++i */) {
624 if(i->second == control)
625 joy_button_map.erase(i++);
630 for(HatMap::iterator i = joy_hat_map.begin(); i != joy_hat_map.end(); /* no ++i */) {
631 if(i->second == control)
632 joy_hat_map.erase(i++);
639 JoystickKeyboardController::bind_joyaxis(int axis, Control control)
641 // axis isn't the SDL axis number, but axisnumber + 1 with sign
642 // changed depending on if the positive or negative end is to be
643 // used (negative axis 0 becomes -1, positive axis 2 becomes +3,
646 unbind_joystick_control(control);
649 joy_axis_map[axis] = control;
653 JoystickKeyboardController::bind_joyhat(int dir, Control c)
655 unbind_joystick_control(c);
658 joy_hat_map[dir] = c;
662 JoystickKeyboardController::bind_joybutton(int button, Control control)
664 unbind_joystick_control(control);
667 joy_button_map[button] = control;
671 JoystickKeyboardController::bind_key(SDLKey key, Control control)
673 // remove all previous mappings for that control and for that key
674 for(KeyMap::iterator i = keymap.begin();
675 i != keymap.end(); /* no ++i */) {
676 if(i->second == control) {
677 KeyMap::iterator e = i;
685 KeyMap::iterator i = keymap.find(key);
686 if(i != keymap.end())
690 keymap[key]= control;
694 JoystickKeyboardController::print_joystick_mappings()
696 std::cout << "Joystick Mappings" << std::endl;
697 std::cout << "-----------------" << std::endl;
698 for(AxisMap::iterator i = joy_axis_map.begin(); i != joy_axis_map.end(); ++i) {
699 std::cout << "Axis: " << i->first << " -> " << i->second << std::endl;
702 for(ButtonMap::iterator i = joy_button_map.begin(); i != joy_button_map.end(); ++i) {
703 std::cout << "Button: " << i->first << " -> " << i->second << std::endl;
706 for(HatMap::iterator i = joy_hat_map.begin(); i != joy_hat_map.end(); ++i) {
707 std::cout << "Hat: " << i->first << " -> " << i->second << std::endl;
709 std::cout << std::endl;
713 JoystickKeyboardController::reversemap_key(Control c)
715 for(KeyMap::iterator i = keymap.begin(); i != keymap.end(); ++i) {
724 JoystickKeyboardController::reversemap_joyaxis(Control c)
726 for(AxisMap::iterator i = joy_axis_map.begin(); i != joy_axis_map.end(); ++i) {
735 JoystickKeyboardController::reversemap_joybutton(Control c)
737 for(ButtonMap::iterator i = joy_button_map.begin(); i != joy_button_map.end(); ++i) {
746 JoystickKeyboardController::reversemap_joyhat(Control c)
748 for(HatMap::iterator i = joy_hat_map.begin(); i != joy_hat_map.end(); ++i) {
757 JoystickKeyboardController::get_key_options_menu()
759 if(key_options_menu == 0) {
760 key_options_menu = new KeyboardMenu(this);
763 return key_options_menu;
767 JoystickKeyboardController::get_joystick_options_menu()
769 if(joystick_options_menu == 0) {
770 joystick_options_menu = new JoystickMenu(this);
773 return joystick_options_menu;
776 //----------------------------------------------------------------------------
778 JoystickKeyboardController::KeyboardMenu::KeyboardMenu(
779 JoystickKeyboardController* _controller)
780 : controller(_controller)
782 add_label(_("Setup Keyboard"));
784 add_controlfield(Controller::UP, _("Up"));
785 add_controlfield(Controller::DOWN, _("Down"));
786 add_controlfield(Controller::LEFT, _("Left"));
787 add_controlfield(Controller::RIGHT, _("Right"));
788 add_controlfield(Controller::JUMP, _("Jump"));
789 add_controlfield(Controller::ACTION, _("Action"));
790 add_controlfield(Controller::PEEK_LEFT, _("Peek Left"));
791 add_controlfield(Controller::PEEK_RIGHT, _("Peek Right"));
792 add_controlfield(Controller::PEEK_UP, _("Peek Up"));
793 add_controlfield(Controller::PEEK_DOWN, _("Peek Down"));
794 if (config->console_enabled) {
795 add_controlfield(Controller::CONSOLE, _("Console"));
797 add_toggle(Controller::CONTROLCOUNT, _("Jump with Up"), controller->jump_with_up_kbd);
803 JoystickKeyboardController::KeyboardMenu::~KeyboardMenu()
807 JoystickKeyboardController::KeyboardMenu::get_key_name(SDLKey key)
813 return _("Up cursor");
815 return _("Down cursor");
817 return _("Left cursor");
819 return _("Right cursor");
825 return _("Right Shift");
827 return _("Left Shift");
829 return _("Right Control");
831 return _("Left Control");
833 return _("Right Alt");
835 return _("Left Alt");
837 return SDL_GetKeyName((SDLKey) key);
842 JoystickKeyboardController::KeyboardMenu::menu_action(MenuItem* item)
844 if(item->id >= 0 && item->id < Controller::CONTROLCOUNT){
845 item->change_input(_("Press Key"));
846 controller->wait_for_key = item->id;
847 } else if( item->id == Controller::CONTROLCOUNT) {
848 controller->jump_with_up_kbd = item->toggled;
853 JoystickKeyboardController::KeyboardMenu::update()
856 get_item_by_id((int) Controller::UP).change_input(get_key_name(
857 controller->reversemap_key(Controller::UP)));
858 get_item_by_id((int) Controller::DOWN).change_input(get_key_name(
859 controller->reversemap_key(Controller::DOWN)));
860 get_item_by_id((int) Controller::LEFT).change_input(get_key_name(
861 controller->reversemap_key(Controller::LEFT)));
862 get_item_by_id((int) Controller::RIGHT).change_input(get_key_name(
863 controller->reversemap_key(Controller::RIGHT)));
864 get_item_by_id((int) Controller::JUMP).change_input(get_key_name(
865 controller->reversemap_key(Controller::JUMP)));
866 get_item_by_id((int) Controller::ACTION).change_input(get_key_name(
867 controller->reversemap_key(Controller::ACTION)));
868 get_item_by_id((int) Controller::PEEK_LEFT).change_input(get_key_name(
869 controller->reversemap_key(Controller::PEEK_LEFT)));
870 get_item_by_id((int) Controller::PEEK_RIGHT).change_input(get_key_name(
871 controller->reversemap_key(Controller::PEEK_RIGHT)));
872 get_item_by_id((int) Controller::PEEK_UP).change_input(get_key_name(
873 controller->reversemap_key(Controller::PEEK_UP)));
874 get_item_by_id((int) Controller::PEEK_DOWN).change_input(get_key_name(
875 controller->reversemap_key(Controller::PEEK_DOWN)));
876 if (config->console_enabled) {
877 get_item_by_id((int) Controller::CONSOLE).change_input(get_key_name(
878 controller->reversemap_key(Controller::CONSOLE)));
880 get_item_by_id(Controller::CONTROLCOUNT).toggled = controller->jump_with_up_kbd;
883 //---------------------------------------------------------------------------
885 JoystickKeyboardController::JoystickMenu::JoystickMenu(
886 JoystickKeyboardController* _controller)
887 : controller(_controller)
889 add_label(_("Setup Joystick"));
891 if(controller->joysticks.size() > 0) {
892 add_controlfield(Controller::UP, _("Up"));
893 add_controlfield(Controller::DOWN, _("Down"));
894 add_controlfield(Controller::LEFT, _("Left"));
895 add_controlfield(Controller::RIGHT, _("Right"));
896 add_controlfield(Controller::JUMP, _("Jump"));
897 add_controlfield(Controller::ACTION, _("Action"));
898 add_controlfield(Controller::PAUSE_MENU, _("Pause/Menu"));
899 add_controlfield(Controller::PEEK_LEFT, _("Peek Left"));
900 add_controlfield(Controller::PEEK_RIGHT, _("Peek Right"));
901 add_controlfield(Controller::PEEK_UP, _("Peek Up"));
902 add_controlfield(Controller::PEEK_DOWN, _("Peek Down"));
904 add_toggle(Controller::CONTROLCOUNT, _("Jump with Up"), controller->jump_with_up_joy);
906 add_deactive(-1, _("No Joysticks found"));
913 JoystickKeyboardController::JoystickMenu::~JoystickMenu()
917 JoystickKeyboardController::JoystickMenu::get_button_name(int button)
922 std::ostringstream name;
923 name << "Button " << button;
928 JoystickKeyboardController::JoystickMenu::menu_action(MenuItem* item)
930 if (item->id >= 0 && item->id < Controller::CONTROLCOUNT) {
931 item->change_input(_("Press Button"));
932 controller->wait_for_joystick = item->id;
933 } else if (item->id == Controller::CONTROLCOUNT) {
934 controller->jump_with_up_joy = item->toggled;
939 JoystickKeyboardController::JoystickMenu::update_menu_item(Control id)
941 int button = controller->reversemap_joybutton(id);
942 int axis = controller->reversemap_joyaxis(id);
943 int hat_dir = controller->reversemap_joyhat(id);
946 get_item_by_id((int)id).change_input(get_button_name(button));
947 } else if (axis != 0) {
948 std::ostringstream name;
959 else if (abs(axis) == 2)
961 else if (abs(axis) == 2)
963 else if (abs(axis) == 3)
968 get_item_by_id((int)id).change_input(name.str());
969 } else if (hat_dir != -1) {
991 name = "Unknown hat_dir";
995 get_item_by_id((int)id).change_input(name);
997 get_item_by_id((int)id).change_input("None");
1002 JoystickKeyboardController::JoystickMenu::update()
1004 if(controller->joysticks.size() == 0)
1007 update_menu_item(Controller::UP);
1008 update_menu_item(Controller::DOWN);
1009 update_menu_item(Controller::LEFT);
1010 update_menu_item(Controller::RIGHT);
1012 update_menu_item(Controller::JUMP);
1013 update_menu_item(Controller::ACTION);
1014 update_menu_item(Controller::PAUSE_MENU);
1015 update_menu_item(Controller::PEEK_LEFT);
1016 update_menu_item(Controller::PEEK_RIGHT);
1017 update_menu_item(Controller::PEEK_UP);
1018 update_menu_item(Controller::PEEK_DOWN);
1020 get_item_by_id(Controller::CONTROLCOUNT).toggled = controller->jump_with_up_joy;