#include <config.h>
-#include <sstream>
#include "joystickkeyboardcontroller.hpp"
+
+#include <sstream>
+
#include "log.hpp"
#include "gui/menu.hpp"
#include "gettext.hpp"
+#include "lisp/writer.hpp"
#include "lisp/lisp.hpp"
#include "lisp/list_iterator.hpp"
#include "game_session.hpp"
void update_menu_item(Control id);
virtual void menu_action(MenuItem* item);
JoystickKeyboardController* controller;
+private:
+ void recreateMenu();
};
class JoystickKeyboardController::KeyboardMenu : public Menu
keymap[SDLK_KP_ENTER] = MENU_SELECT;
keymap[SDLK_CARET] = CONSOLE;
keymap[SDLK_DELETE] = PEEK_LEFT;
- keymap[SDLK_END] = PEEK_RIGHT;
- keymap[SDLK_PAGEUP] = PEEK_UP;
- keymap[SDLK_PAGEDOWN] = PEEK_DOWN;
+ 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;
SDL_JoystickClose(*i);
}
joysticks.clear();
+
+ SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
+ SDL_InitSubSystem(SDL_INIT_JOYSTICK);
int joystick_count = SDL_NumJoysticks();
min_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 << ": " << 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( 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(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_JoystickNumButtons(joystick) > max_joybuttons)
+ max_joybuttons = SDL_JoystickNumButtons(joystick);
- if(SDL_JoystickNumAxes(joystick) > max_joyaxis)
- max_joyaxis = SDL_JoystickNumAxes(joystick);
+ if(SDL_JoystickNumAxes(joystick) > max_joyaxis)
+ max_joyaxis = SDL_JoystickNumAxes(joystick);
- if(SDL_JoystickNumHats(joystick) > max_joyhats)
- max_joyhats = SDL_JoystickNumHats(joystick);
+ if(SDL_JoystickNumHats(joystick) > max_joyhats)
+ max_joyhats = SDL_JoystickNumHats(joystick);
- joysticks.push_back(joystick);
+ joysticks.push_back(joystick);
+ }
}
// some joysticks or SDL seem to produce some bogus events after being opened
JoystickKeyboardController::write(lisp::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");
}
else
{
// Split the axis into left and right, so that both can be
- // mapped seperatly (needed for jump/down vs up/down)
+ // mapped separately (needed for jump/down vs up/down)
int axis = jaxis.axis + 1;
AxisMap::iterator left = joy_axis_map.find(-axis);
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);
default:
int c = event.key.keysym.unicode;
if ((c >= 32) && (c <= 126)) {
- Console::instance->input((char)c);
+ Console::instance->input((char)c);
}
break;
}
JoystickKeyboardController* _controller)
: controller(_controller)
{
+ recreateMenu();
+}
+
+JoystickKeyboardController::JoystickMenu::~JoystickMenu()
+{}
+
+void
+JoystickKeyboardController::JoystickMenu::recreateMenu()
+{
+ clear();
add_label(_("Setup Joystick"));
add_hl();
if(controller->joysticks.size() > 0) {
add_toggle(Controller::CONTROLCOUNT, _("Jump with Up"), controller->jump_with_up_joy);
} else {
- add_deactive(-1, _("No Joysticks found"));
+ add_inactive(-1, _("No Joysticks found"));
}
- add_deactive(-1,"");
+ add_inactive(-1,"");
add_entry(SCAN_JOYSTICKS, _("Scan for Joysticks"));
+
+ //Show Joysticks currently activated:
+ for(std::vector<SDL_Joystick*>::iterator i = controller->joysticks.begin();
+ i != controller->joysticks.end(); ++i) {
+ if(*i != 0)
+ add_inactive(-1, SDL_JoystickName(SDL_JoystickIndex(*i)) );
+ }
+
add_hl();
add_back(_("Back"));
update();
}
-JoystickKeyboardController::JoystickMenu::~JoystickMenu()
-{}
-
std::string
JoystickKeyboardController::JoystickMenu::get_button_name(int button)
{
controller->jump_with_up_joy = item->toggled;
} else if( item->id == SCAN_JOYSTICKS) {
controller->updateAvailableJoysticks();
+ recreateMenu();
}
}