-// $Id$
-//
// SuperTux
// Copyright (C) 2006 Matthias Braun <matze@braunis.de>,
// 2007 Ingo Ruhnke <grumbel@gmx.de>
//
-// 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
// 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 <http://www.gnu.org/licenses/>.
-#include <config.h>
+#include "control/joystickkeyboardcontroller.hpp"
-#include <sstream>
-#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 <iostream>
-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/menu_storage.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)
{
// initialize default keyboard map
keymap[SDLK_LEFT] = LEFT;
keymap[SDLK_KP_ENTER] = MENU_SELECT;
keymap[SDLK_CARET] = CONSOLE;
keymap[SDLK_DELETE] = PEEK_LEFT;
- keymap[SDLK_END] = PEEK_RIGHT;
-
- jump_with_up = 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);
+ keymap[SDLK_PAGEDOWN] = PEEK_RIGHT;
+ keymap[SDLK_HOME] = PEEK_UP;
+ keymap[SDLK_END] = PEEK_DOWN;
- if(SDL_JoystickNumButtons(joystick) > max_joybuttons)
- max_joybuttons = SDL_JoystickNumButtons(joystick);
+ jump_with_up_joy = false;
+ jump_with_up_kbd = false;
- 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;
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()
+{
+ for(std::vector<SDL_Joystick*>::iterator i = joysticks.begin();
+ i != joysticks.end(); ++i) {
+ if(*i != 0)
+ SDL_JoystickClose(*i);
}
}
-JoystickKeyboardController::~JoystickKeyboardController()
+void
+JoystickKeyboardController::updateAvailableJoysticks()
{
for(std::vector<SDL_Joystick*>::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);
+ }
+ }
- delete key_options_menu;
- delete joystick_options_menu;
+ // 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 lisp::Lisp& lisp)
+JoystickKeyboardController::read(const Reader& lisp)
{
const lisp::Lisp* keymap_lisp = lisp.get_lisp("keymap");
if(keymap_lisp) {
keymap.clear();
+ keymap_lisp->get("jump-with-up", jump_with_up_kbd);
lisp::ListIterator iter(keymap_lisp);
while(iter.next()) {
if(iter.item() == "map") {
continue;
}
keymap[(SDLKey) key] = (Control)i;
- } else {
- log_info << "Invalid lisp element '" << iter.item() << "' in keymap" << std::endl;
}
}
}
const lisp::Lisp* joystick_lisp = lisp.get_lisp("joystick");
if(joystick_lisp) {
joystick_lisp->get("dead-zone", dead_zone);
- joystick_lisp->get("jump-with-up", jump_with_up);
+ joystick_lisp->get("jump-with-up", jump_with_up_joy);
lisp::ListIterator iter(joystick_lisp);
while(iter.next()) {
if(iter.item() == "map") {
}
void
-JoystickKeyboardController::write(lisp::Writer& writer)
+JoystickKeyboardController::write(Writer& writer)
{
writer.start_list("keymap");
+ 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);
+ 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");
}
void
JoystickKeyboardController::set_joy_controls(Control id, bool value)
{
- if (jump_with_up && id == Controller::UP)
+ if (jump_with_up_joy && id == Controller::UP)
controls[Controller::JUMP] = value;
controls[(Control)id] = value;
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);
+ MenuStorage::get_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));
+
+ MenuStorage::get_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
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;
- }
+ MenuStorage::get_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;
}
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);
+ if (jump_with_up_kbd && control == UP){
+ controls[JUMP] = (event.type == SDL_KEYDOWN);
+ }
}
}
}
default:
int c = event.key.keysym.unicode;
if ((c >= 32) && (c <= 126)) {
- Console::instance->input((char)c);
+ Console::instance->input((char)c);
}
break;
}
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();
- key_options_menu->update();
+ MenuStorage::get_key_options_menu()->update();
wait_for_key = -1;
return;
}
if(wait_for_joystick >= 0) {
if(event.key.keysym.sym == SDLK_ESCAPE) {
reset();
- joystick_options_menu->update();
+ MenuStorage::get_joystick_options_menu()->update();
wait_for_joystick = -1;
}
return;
return -1;
}
-Menu*
-JoystickKeyboardController::get_key_options_menu()
-{
- if(key_options_menu == 0) {
- key_options_menu = new KeyboardMenu(this);
- }
-
- return key_options_menu;
-}
-
-Menu*
-JoystickKeyboardController::get_joystick_options_menu()
-{
- if(joystick_options_menu == 0) {
- joystick_options_menu = new JoystickMenu(this);
- }
-
- 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_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)
-{
- assert(item->id >= 0 && item->id < Controller::CONTROLCOUNT);
- item->change_input(_("Press Key"));
- controller->wait_for_key = item->id;
-}
-
-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)));
- }
-}
-
-//---------------------------------------------------------------------------
-
-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);
- } 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 = 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;
-}
+/* EOF */