X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fcontrol%2Fjoystickkeyboardcontroller.cpp;h=53a252d1b22f3dc5570292a78c21bf8b7212af23;hb=9ca6ad8086995cde21a4ae247dac53de336c15ec;hp=f9e1408651655b54d793387916dc4397ff967a4c;hpb=6c048de80b00a88e9c43290b1e5ccd1dd35e74a4;p=supertux.git diff --git a/src/control/joystickkeyboardcontroller.cpp b/src/control/joystickkeyboardcontroller.cpp index f9e140865..53a252d1b 100644 --- a/src/control/joystickkeyboardcontroller.cpp +++ b/src/control/joystickkeyboardcontroller.cpp @@ -1,13 +1,11 @@ -// $Id$ -// // SuperTux // Copyright (C) 2006 Matthias Braun , // 2007 Ingo Ruhnke // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,51 +13,40 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// along with this program. If not, see . -#include +#include "control/joystickkeyboardcontroller.hpp" -#include -#include "joystickkeyboardcontroller.hpp" -#include "log.hpp" -#include "gui/menu.hpp" -#include "gettext.hpp" -#include "lisp/lisp.hpp" -#include "lisp/list_iterator.hpp" -#include "game_session.hpp" -#include "console.hpp" -#include "gameconfig.hpp" +#include -class JoystickKeyboardController::JoystickMenu : public Menu -{ -public: - JoystickMenu(JoystickKeyboardController* controller); - virtual ~JoystickMenu(); - - void update(); - std::string get_button_name(int button); - void update_menu_item(Control id); - virtual void menu_action(MenuItem* item); - JoystickKeyboardController* controller; -}; - -class JoystickKeyboardController::KeyboardMenu : public Menu -{ -public: - KeyboardMenu(JoystickKeyboardController* controller); - ~KeyboardMenu(); - - void update(); - std::string get_key_name(SDLKey key); - virtual void menu_action(MenuItem* item); - JoystickKeyboardController* controller; -}; - -JoystickKeyboardController::JoystickKeyboardController() - : hat_state(0), - wait_for_key(-1), wait_for_joystick(-1), - key_options_menu(0), joystick_options_menu(0) +#include "lisp/list_iterator.hpp" +#include "gui/menu_manager.hpp" +#include "supertux/console.hpp" +#include "supertux/gameconfig.hpp" +#include "supertux/menu/joystick_menu.hpp" +#include "supertux/menu/keyboard_menu.hpp" +#include "util/gettext.hpp" +#include "util/writer.hpp" + +JoystickKeyboardController::JoystickKeyboardController() : + keymap(), + joy_button_map(), + joy_axis_map(), + joy_hat_map(), + joysticks(), + name(), + dead_zone(), + min_joybuttons(), + max_joybuttons(), + max_joyaxis(), + max_joyhats(), + hat_state(0), + jump_with_up_joy(), + jump_with_up_kbd(), + wait_for_key(-1), + wait_for_joystick(-1), + key_options_menu(0), + joystick_options_menu(0) { // initialize default keyboard map keymap[SDLK_LEFT] = LEFT; @@ -76,48 +63,14 @@ JoystickKeyboardController::JoystickKeyboardController() keymap[SDLK_KP_ENTER] = MENU_SELECT; keymap[SDLK_CARET] = CONSOLE; keymap[SDLK_DELETE] = PEEK_LEFT; - keymap[SDLK_END] = PEEK_RIGHT; + keymap[SDLK_PAGEDOWN] = PEEK_RIGHT; + keymap[SDLK_HOME] = PEEK_UP; + keymap[SDLK_END] = PEEK_DOWN; jump_with_up_joy = false; jump_with_up_kbd = false; - int joystick_count = SDL_NumJoysticks(); - min_joybuttons = -1; - max_joybuttons = -1; - max_joyaxis = -1; - max_joyhats = -1; - - for(int i = 0; i < joystick_count; ++i) { - SDL_Joystick* joystick = SDL_JoystickOpen(i); - bool good = true; - if(SDL_JoystickNumButtons(joystick) < 2) { - log_info << "Joystick " << i << " has less than 2 buttons" << std::endl; - good = false; - } - if(SDL_JoystickNumAxes(joystick) < 2 - && SDL_JoystickNumHats(joystick) == 0) { - log_info << "Joystick " << i << " has less than 2 axes and no hat" << std::endl; - good = false; - } - if(!good) { - SDL_JoystickClose(joystick); - continue; - } - - if(min_joybuttons < 0 || SDL_JoystickNumButtons(joystick) < min_joybuttons) - min_joybuttons = SDL_JoystickNumButtons(joystick); - - if(SDL_JoystickNumButtons(joystick) > max_joybuttons) - max_joybuttons = SDL_JoystickNumButtons(joystick); - - if(SDL_JoystickNumAxes(joystick) > max_joyaxis) - max_joyaxis = SDL_JoystickNumAxes(joystick); - - if(SDL_JoystickNumHats(joystick) > max_joyhats) - max_joyhats = SDL_JoystickNumHats(joystick); - - joysticks.push_back(joystick); - } + updateAvailableJoysticks(); dead_zone = 1000; @@ -147,13 +100,6 @@ JoystickKeyboardController::JoystickKeyboardController() joy_axis_map[ 1] = RIGHT; joy_axis_map[-2] = UP; joy_axis_map[ 2] = DOWN; - - // some joysticks or SDL seem to produce some bogus events after being opened - Uint32 ticks = SDL_GetTicks(); - while(SDL_GetTicks() - ticks < 200) { - SDL_Event event; - SDL_PollEvent(&event); - } } JoystickKeyboardController::~JoystickKeyboardController() @@ -169,7 +115,68 @@ JoystickKeyboardController::~JoystickKeyboardController() } void -JoystickKeyboardController::read(const lisp::Lisp& lisp) +JoystickKeyboardController::updateAvailableJoysticks() +{ + for(std::vector::iterator i = joysticks.begin(); + i != joysticks.end(); ++i) { + if(*i != 0) + SDL_JoystickClose(*i); + } + joysticks.clear(); + + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + SDL_InitSubSystem(SDL_INIT_JOYSTICK); + + int joystick_count = SDL_NumJoysticks(); + min_joybuttons = -1; + max_joybuttons = -1; + max_joyaxis = -1; + max_joyhats = -1; + + if( joystick_count > 0 ){ + for(int i = 0; i < joystick_count; ++i) { + SDL_Joystick* joystick = SDL_JoystickOpen(i); + bool good = true; + if(SDL_JoystickNumButtons(joystick) < 2) { + log_info << "Joystick " << i << ": " << SDL_JoystickName(i) << " has less than 2 buttons" << std::endl; + good = false; + } + if(SDL_JoystickNumAxes(joystick) < 2 + && SDL_JoystickNumHats(joystick) == 0) { + log_info << "Joystick " << i << ": " << SDL_JoystickName(i) << " has less than 2 axes and no hat" << std::endl; + good = false; + } + if(!good) { + SDL_JoystickClose(joystick); + continue; + } + + if(min_joybuttons < 0 || SDL_JoystickNumButtons(joystick) < min_joybuttons) + min_joybuttons = SDL_JoystickNumButtons(joystick); + + if(SDL_JoystickNumButtons(joystick) > max_joybuttons) + max_joybuttons = SDL_JoystickNumButtons(joystick); + + if(SDL_JoystickNumAxes(joystick) > max_joyaxis) + max_joyaxis = SDL_JoystickNumAxes(joystick); + + if(SDL_JoystickNumHats(joystick) > max_joyhats) + max_joyhats = SDL_JoystickNumHats(joystick); + + joysticks.push_back(joystick); + } + } + + // some joysticks or SDL seem to produce some bogus events after being opened + Uint32 ticks = SDL_GetTicks(); + while(SDL_GetTicks() - ticks < 200) { + SDL_Event event; + SDL_PollEvent(&event); + } +} + +void +JoystickKeyboardController::read(const Reader& lisp) { const lisp::Lisp* keymap_lisp = lisp.get_lisp("keymap"); if(keymap_lisp) { @@ -259,41 +266,41 @@ JoystickKeyboardController::read(const lisp::Lisp& lisp) } void -JoystickKeyboardController::write(lisp::Writer& writer) +JoystickKeyboardController::write(Writer& writer) { writer.start_list("keymap"); - writer.write_bool("jump-with-up", jump_with_up_kbd); + writer.write("jump-with-up", jump_with_up_kbd); for(KeyMap::iterator i = keymap.begin(); i != keymap.end(); ++i) { writer.start_list("map"); - writer.write_int("key", (int) i->first); - writer.write_string("control", controlNames[i->second]); + writer.write("key", (int) i->first); + writer.write("control", controlNames[i->second]); writer.end_list("map"); } writer.end_list("keymap"); writer.start_list("joystick"); - writer.write_int("dead-zone", dead_zone); - writer.write_bool("jump-with-up", jump_with_up_joy); + writer.write("dead-zone", dead_zone); + writer.write("jump-with-up", jump_with_up_joy); for(ButtonMap::iterator i = joy_button_map.begin(); i != joy_button_map.end(); ++i) { writer.start_list("map"); - writer.write_int("button", i->first); - writer.write_string("control", controlNames[i->second]); + writer.write("button", i->first); + writer.write("control", controlNames[i->second]); writer.end_list("map"); } for(HatMap::iterator i = joy_hat_map.begin(); i != joy_hat_map.end(); ++i) { writer.start_list("map"); - writer.write_int("hat", i->first); - writer.write_string("control", controlNames[i->second]); + writer.write("hat", i->first); + writer.write("control", controlNames[i->second]); writer.end_list("map"); } for(AxisMap::iterator i = joy_axis_map.begin(); i != joy_axis_map.end(); ++i) { writer.start_list("map"); - writer.write_int("axis", i->first); - writer.write_string("control", controlNames[i->second]); + writer.write("axis", i->first); + writer.write("control", controlNames[i->second]); writer.end_list("map"); } @@ -346,72 +353,72 @@ void JoystickKeyboardController::process_button_event(const SDL_JoyButtonEvent& jbutton) { if(wait_for_joystick >= 0) + { + if(jbutton.state == SDL_PRESSED) { - if(jbutton.state == SDL_PRESSED) - { - bind_joybutton(jbutton.button, (Control)wait_for_joystick); - joystick_options_menu->update(); - reset(); - wait_for_joystick = -1; - } - } + bind_joybutton(jbutton.button, (Control)wait_for_joystick); + joystick_options_menu->update(); + reset(); + wait_for_joystick = -1; + } + } else - { - ButtonMap::iterator i = joy_button_map.find(jbutton.button); - if(i == joy_button_map.end()) { - log_debug << "Unmapped joybutton " << (int)jbutton.button << " pressed" << std::endl; - } else { - set_joy_controls(i->second, (jbutton.state == SDL_PRESSED)); - } + { + ButtonMap::iterator i = joy_button_map.find(jbutton.button); + if(i == joy_button_map.end()) { + log_debug << "Unmapped joybutton " << (int)jbutton.button << " pressed" << std::endl; + } else { + set_joy_controls(i->second, (jbutton.state == SDL_PRESSED)); } + } } void JoystickKeyboardController::process_axis_event(const SDL_JoyAxisEvent& jaxis) { if (wait_for_joystick >= 0) - { - if (abs(jaxis.value) > dead_zone) { - if (jaxis.value < 0) - bind_joyaxis(-(jaxis.axis + 1), Control(wait_for_joystick)); - else - bind_joyaxis(jaxis.axis + 1, Control(wait_for_joystick)); - - joystick_options_menu->update(); - wait_for_joystick = -1; - } + { + if (abs(jaxis.value) > dead_zone) { + if (jaxis.value < 0) + bind_joyaxis(-(jaxis.axis + 1), Control(wait_for_joystick)); + else + bind_joyaxis(jaxis.axis + 1, Control(wait_for_joystick)); + + joystick_options_menu->update(); + wait_for_joystick = -1; } + } else - { - // Split the axis into left and right, so that both can be - // mapped seperatly (needed for jump/down vs up/down) - int axis = jaxis.axis + 1; - - AxisMap::iterator left = joy_axis_map.find(-axis); - AxisMap::iterator right = joy_axis_map.find(axis); - - if(left == joy_axis_map.end()) { - std::cout << "Unmapped joyaxis " << (int)jaxis.axis << " moved" << std::endl; - } else { - if (jaxis.value < -dead_zone) - set_joy_controls(left->second, true); - else if (jaxis.value > dead_zone) - set_joy_controls(left->second, false); - else - set_joy_controls(left->second, false); - } + { + // Split the axis into left and right, so that both can be + // mapped separately (needed for jump/down vs up/down) + int axis = jaxis.axis + 1; - if(right == joy_axis_map.end()) { - std::cout << "Unmapped joyaxis " << (int)jaxis.axis << " moved" << std::endl; - } else { - if (jaxis.value < -dead_zone) - set_joy_controls(right->second, false); - else if (jaxis.value > dead_zone) - set_joy_controls(right->second, true); - else - set_joy_controls(right->second, false); - } + AxisMap::iterator left = joy_axis_map.find(-axis); + AxisMap::iterator right = joy_axis_map.find(axis); + + if(left == joy_axis_map.end()) { + std::cout << "Unmapped joyaxis " << (int)jaxis.axis << " moved" << std::endl; + } else { + if (jaxis.value < -dead_zone) + set_joy_controls(left->second, true); + else if (jaxis.value > dead_zone) + set_joy_controls(left->second, false); + else + set_joy_controls(left->second, false); } + + if(right == joy_axis_map.end()) { + std::cout << "Unmapped joyaxis " << (int)jaxis.axis << " moved" << std::endl; + } else { + if (jaxis.value < -dead_zone) + set_joy_controls(right->second, false); + else if (jaxis.value > dead_zone) + set_joy_controls(right->second, true); + else + set_joy_controls(right->second, false); + } + } } void @@ -420,52 +427,52 @@ JoystickKeyboardController::process_hat_event(const SDL_JoyHatEvent& jhat) Uint8 changed = hat_state ^ jhat.value; if (wait_for_joystick >= 0) - { - if (changed & SDL_HAT_UP && jhat.value & SDL_HAT_UP) - bind_joyhat(SDL_HAT_UP, (Control)wait_for_joystick); + { + if (changed & SDL_HAT_UP && jhat.value & SDL_HAT_UP) + bind_joyhat(SDL_HAT_UP, (Control)wait_for_joystick); - if (changed & SDL_HAT_DOWN && jhat.value & SDL_HAT_DOWN) - bind_joyhat(SDL_HAT_DOWN, (Control)wait_for_joystick); + if (changed & SDL_HAT_DOWN && jhat.value & SDL_HAT_DOWN) + bind_joyhat(SDL_HAT_DOWN, (Control)wait_for_joystick); - if (changed & SDL_HAT_LEFT && jhat.value & SDL_HAT_LEFT) - bind_joyhat(SDL_HAT_LEFT, (Control)wait_for_joystick); + if (changed & SDL_HAT_LEFT && jhat.value & SDL_HAT_LEFT) + bind_joyhat(SDL_HAT_LEFT, (Control)wait_for_joystick); - if (changed & SDL_HAT_RIGHT && jhat.value & SDL_HAT_RIGHT) - bind_joyhat(SDL_HAT_RIGHT, (Control)wait_for_joystick); + if (changed & SDL_HAT_RIGHT && jhat.value & SDL_HAT_RIGHT) + bind_joyhat(SDL_HAT_RIGHT, (Control)wait_for_joystick); - joystick_options_menu->update(); - wait_for_joystick = -1; - } + joystick_options_menu->update(); + wait_for_joystick = -1; + } else + { + if (changed & SDL_HAT_UP) { - if (changed & SDL_HAT_UP) - { - HatMap::iterator it = joy_hat_map.find(SDL_HAT_UP); - if (it != joy_hat_map.end()) - set_joy_controls(it->second, jhat.value & SDL_HAT_UP); - } + HatMap::iterator it = joy_hat_map.find(SDL_HAT_UP); + if (it != joy_hat_map.end()) + set_joy_controls(it->second, jhat.value & SDL_HAT_UP); + } - if (changed & SDL_HAT_DOWN) - { - HatMap::iterator it = joy_hat_map.find(SDL_HAT_DOWN); - if (it != joy_hat_map.end()) - set_joy_controls(it->second, jhat.value & SDL_HAT_DOWN); - } + if (changed & SDL_HAT_DOWN) + { + HatMap::iterator it = joy_hat_map.find(SDL_HAT_DOWN); + if (it != joy_hat_map.end()) + set_joy_controls(it->second, jhat.value & SDL_HAT_DOWN); + } - if (changed & SDL_HAT_LEFT) - { - HatMap::iterator it = joy_hat_map.find(SDL_HAT_LEFT); - if (it != joy_hat_map.end()) - set_joy_controls(it->second, jhat.value & SDL_HAT_LEFT); - } + if (changed & SDL_HAT_LEFT) + { + HatMap::iterator it = joy_hat_map.find(SDL_HAT_LEFT); + if (it != joy_hat_map.end()) + set_joy_controls(it->second, jhat.value & SDL_HAT_LEFT); + } - if (changed & SDL_HAT_RIGHT) - { - HatMap::iterator it = joy_hat_map.find(SDL_HAT_RIGHT); - if (it != joy_hat_map.end()) - set_joy_controls(it->second, jhat.value & SDL_HAT_RIGHT); - } + if (changed & SDL_HAT_RIGHT) + { + HatMap::iterator it = joy_hat_map.find(SDL_HAT_RIGHT); + if (it != joy_hat_map.end()) + set_joy_controls(it->second, jhat.value & SDL_HAT_RIGHT); } + } hat_state = jhat.value; } @@ -483,12 +490,12 @@ JoystickKeyboardController::process_key_event(const SDL_Event& event) if (Console::instance->hasFocus()) { // if console is open: send key there process_console_key_event(event); - } else if (Menu::current()) { + } else if (MenuManager::current()) { // if menu mode: send key there process_menu_key_event(event); } else if(key_mapping == keymap.end()) { // default action: update controls - log_debug << "Key " << event.key.keysym.sym << " is unbound" << std::endl; + //log_debug << "Key " << event.key.keysym.sym << " is unbound" << std::endl; } else { Control control = key_mapping->second; controls[control] = (event.type == SDL_KEYDOWN); @@ -541,7 +548,7 @@ JoystickKeyboardController::process_console_key_event(const SDL_Event& event) default: int c = event.key.keysym.unicode; if ((c >= 32) && (c <= 126)) { - Console::instance->input((char)c); + Console::instance->input((char)c); } break; } @@ -556,7 +563,7 @@ JoystickKeyboardController::process_menu_key_event(const SDL_Event& event) return; if(event.key.keysym.sym != SDLK_ESCAPE - && event.key.keysym.sym != SDLK_PAUSE) { + && event.key.keysym.sym != SDLK_PAUSE) { bind_key(event.key.keysym.sym, (Control) wait_for_key); } reset(); @@ -771,239 +778,4 @@ JoystickKeyboardController::get_joystick_options_menu() return joystick_options_menu; } -//---------------------------------------------------------------------------- - -JoystickKeyboardController::KeyboardMenu::KeyboardMenu( - JoystickKeyboardController* _controller) - : controller(_controller) -{ - add_label(_("Setup Keyboard")); - add_hl(); - add_controlfield(Controller::UP, _("Up")); - add_controlfield(Controller::DOWN, _("Down")); - add_controlfield(Controller::LEFT, _("Left")); - add_controlfield(Controller::RIGHT, _("Right")); - add_controlfield(Controller::JUMP, _("Jump")); - add_controlfield(Controller::ACTION, _("Action")); - add_controlfield(Controller::PEEK_LEFT, _("Peek Left")); - add_controlfield(Controller::PEEK_RIGHT, _("Peek Right")); - if (config->console_enabled) { - add_controlfield(Controller::CONSOLE, _("Console")); - } - add_toggle(Controller::CONTROLCOUNT, _("Jump with Up"), controller->jump_with_up_kbd); - add_hl(); - add_back(_("Back")); - update(); -} - -JoystickKeyboardController::KeyboardMenu::~KeyboardMenu() -{} - -std::string -JoystickKeyboardController::KeyboardMenu::get_key_name(SDLKey key) -{ - switch(key) { - case SDLK_UNKNOWN: - return _("None"); - case SDLK_UP: - return _("Up cursor"); - case SDLK_DOWN: - return _("Down cursor"); - case SDLK_LEFT: - return _("Left cursor"); - case SDLK_RIGHT: - return _("Right cursor"); - case SDLK_RETURN: - return _("Return"); - case SDLK_SPACE: - return _("Space"); - case SDLK_RSHIFT: - return _("Right Shift"); - case SDLK_LSHIFT: - return _("Left Shift"); - case SDLK_RCTRL: - return _("Right Control"); - case SDLK_LCTRL: - return _("Left Control"); - case SDLK_RALT: - return _("Right Alt"); - case SDLK_LALT: - return _("Left Alt"); - default: - return SDL_GetKeyName((SDLKey) key); - } -} - -void -JoystickKeyboardController::KeyboardMenu::menu_action(MenuItem* item) -{ - if(item->id >= 0 && item->id < Controller::CONTROLCOUNT){ - item->change_input(_("Press Key")); - controller->wait_for_key = item->id; - } else if( item->id == Controller::CONTROLCOUNT) { - controller->jump_with_up_kbd = item->toggled; - } -} - -void -JoystickKeyboardController::KeyboardMenu::update() -{ - // update menu - get_item_by_id((int) Controller::UP).change_input(get_key_name( - controller->reversemap_key(Controller::UP))); - get_item_by_id((int) Controller::DOWN).change_input(get_key_name( - controller->reversemap_key(Controller::DOWN))); - get_item_by_id((int) Controller::LEFT).change_input(get_key_name( - controller->reversemap_key(Controller::LEFT))); - get_item_by_id((int) Controller::RIGHT).change_input(get_key_name( - controller->reversemap_key(Controller::RIGHT))); - get_item_by_id((int) Controller::JUMP).change_input(get_key_name( - controller->reversemap_key(Controller::JUMP))); - get_item_by_id((int) Controller::ACTION).change_input(get_key_name( - controller->reversemap_key(Controller::ACTION))); - get_item_by_id((int) Controller::PEEK_LEFT).change_input(get_key_name( - controller->reversemap_key(Controller::PEEK_LEFT))); - get_item_by_id((int) Controller::PEEK_RIGHT).change_input(get_key_name( - controller->reversemap_key(Controller::PEEK_RIGHT))); - if (config->console_enabled) { - get_item_by_id((int) Controller::CONSOLE).change_input(get_key_name( - controller->reversemap_key(Controller::CONSOLE))); - } - get_item_by_id(Controller::CONTROLCOUNT).toggled = controller->jump_with_up_kbd; -} - -//--------------------------------------------------------------------------- - -JoystickKeyboardController::JoystickMenu::JoystickMenu( - JoystickKeyboardController* _controller) - : controller(_controller) -{ - add_label(_("Setup Joystick")); - add_hl(); - if(controller->joysticks.size() > 0) { - add_controlfield(Controller::UP, _("Up")); - add_controlfield(Controller::DOWN, _("Down")); - add_controlfield(Controller::LEFT, _("Left")); - add_controlfield(Controller::RIGHT, _("Right")); - add_controlfield(Controller::JUMP, _("Jump")); - add_controlfield(Controller::ACTION, _("Action")); - add_controlfield(Controller::PAUSE_MENU, _("Pause/Menu")); - add_controlfield(Controller::PEEK_LEFT, _("Peek Left")); - add_controlfield(Controller::PEEK_RIGHT, _("Peek Right")); - - add_toggle(Controller::CONTROLCOUNT, _("Jump with Up"), controller->jump_with_up_joy); - } else { - add_deactive(-1, _("No Joysticks found")); - } - add_hl(); - add_back(_("Back")); - update(); -} - -JoystickKeyboardController::JoystickMenu::~JoystickMenu() -{} - -std::string -JoystickKeyboardController::JoystickMenu::get_button_name(int button) -{ - if(button < 0) - return _("None"); - - std::ostringstream name; - name << "Button " << button; - return name.str(); -} - -void -JoystickKeyboardController::JoystickMenu::menu_action(MenuItem* item) -{ - if (item->id >= 0 && item->id < Controller::CONTROLCOUNT) { - item->change_input(_("Press Button")); - controller->wait_for_joystick = item->id; - } else if (item->id == Controller::CONTROLCOUNT) { - controller->jump_with_up_joy = item->toggled; - } -} - -void -JoystickKeyboardController::JoystickMenu::update_menu_item(Control id) -{ - int button = controller->reversemap_joybutton(id); - int axis = controller->reversemap_joyaxis(id); - int hat_dir = controller->reversemap_joyhat(id); - - if (button != -1) { - get_item_by_id((int)id).change_input(get_button_name(button)); - } else if (axis != 0) { - std::ostringstream name; - - name << "Axis "; - - if (axis < 0) - name << "-"; - else - name << "+"; - - if (abs(axis) == 1) - name << "X"; - else if (abs(axis) == 2) - name << "Y"; - else if (abs(axis) == 2) - name << "X2"; - else if (abs(axis) == 3) - name << "Y2"; - else - name << abs(axis); - - get_item_by_id((int)id).change_input(name.str()); - } else if (hat_dir != -1) { - std::string name; - - switch (hat_dir) - { - case SDL_HAT_UP: - name = "Hat Up"; - break; - - case SDL_HAT_DOWN: - name = "Hat Down"; - break; - - case SDL_HAT_LEFT: - name = "Hat Left"; - break; - - case SDL_HAT_RIGHT: - name = "Hat Right"; - break; - - default: - name = "Unknown hat_dir"; - break; - } - - get_item_by_id((int)id).change_input(name); - } else { - get_item_by_id((int)id).change_input("None"); - } -} - -void -JoystickKeyboardController::JoystickMenu::update() -{ - if(controller->joysticks.size() == 0) - return; - - update_menu_item(Controller::UP); - update_menu_item(Controller::DOWN); - update_menu_item(Controller::LEFT); - update_menu_item(Controller::RIGHT); - - update_menu_item(Controller::JUMP); - update_menu_item(Controller::ACTION); - update_menu_item(Controller::PAUSE_MENU); - update_menu_item(Controller::PEEK_LEFT); - update_menu_item(Controller::PEEK_RIGHT); - - get_item_by_id(Controller::CONTROLCOUNT).toggled = controller->jump_with_up_joy; -} +/* EOF */