Skip to content

Commit

Permalink
Moved keyboard code into KeyboardManager class
Browse files Browse the repository at this point in the history
  • Loading branch information
Grumbel committed Aug 6, 2014
1 parent a87aaf1 commit b26a4e8
Show file tree
Hide file tree
Showing 15 changed files with 412 additions and 295 deletions.
4 changes: 2 additions & 2 deletions src/control/game_controller_manager.cpp
Expand Up @@ -40,7 +40,7 @@ void
GameControllerManager::process_button_event(const SDL_ControllerButtonEvent& ev)
{
//log_info << "button event: " << static_cast<int>(ev.button) << " " << static_cast<int>(ev.state) << std::endl;
auto controller = m_parent->get_main_controller();
auto controller = m_parent->get_controller();
switch(ev.button)
{
case SDL_CONTROLLER_BUTTON_A:
Expand Down Expand Up @@ -112,7 +112,7 @@ GameControllerManager::process_axis_event(const SDL_ControllerAxisEvent& ev)
// to OR the values together

//log_info << "axis event: " << static_cast<int>(ev.axis) << " " << ev.value << std::endl;
auto controller = m_parent->get_main_controller();
auto controller = m_parent->get_controller();
auto axis2button = [this, &controller](int value,
Controller::Control control_left, Controller::Control control_right)
{
Expand Down
4 changes: 2 additions & 2 deletions src/control/joystick_manager.cpp
Expand Up @@ -452,10 +452,10 @@ JoystickManager::set_joy_controls(Controller::Control id, bool value)
{
if (jump_with_up_joy && id == Controller::UP)
{
parent->get_main_controller()->set_control(Controller::JUMP, value);
parent->get_controller()->set_control(Controller::JUMP, value);
}

parent->get_main_controller()->set_control(id, value);
parent->get_controller()->set_control(id, value);
}

/* EOF */
2 changes: 1 addition & 1 deletion src/control/joystick_manager.hpp
Expand Up @@ -29,7 +29,7 @@

class JoystickKeyboardController;

class JoystickManager
class JoystickManager final
{
private:
typedef Uint8 JoyId;
Expand Down
251 changes: 10 additions & 241 deletions src/control/joystickkeyboardcontroller.cpp
Expand Up @@ -19,55 +19,30 @@

#include <iostream>

#include "control/keyboard_manager.hpp"
#include "control/joystick_manager.hpp"
#include "control/game_controller_manager.hpp"
#include "gui/menu_manager.hpp"
#include "lisp/list_iterator.hpp"
#include "supertux/console.hpp"
#include "supertux/gameconfig.hpp"
#include "supertux/menu/joystick_menu.hpp"
#include "supertux/menu/keyboard_menu.hpp"
#include "supertux/menu/menu_storage.hpp"
#include "util/gettext.hpp"
#include "util/writer.hpp"

JoystickKeyboardController::JoystickKeyboardController() :
controller(new Controller),
m_use_game_controller(true),
keyboard_manager(new KeyboardManager(this)),
joystick_manager(new JoystickManager(this)),
game_controller_manager(new GameControllerManager(this)),
keymap(),
jump_with_up_kbd(),
wait_for_key(-1)
game_controller_manager(new GameControllerManager(this))
{
// initialize default keyboard map
keymap[SDLK_LEFT] = Controller::LEFT;
keymap[SDLK_RIGHT] = Controller::RIGHT;
keymap[SDLK_UP] = Controller::UP;
keymap[SDLK_DOWN] = Controller::DOWN;
keymap[SDLK_SPACE] = Controller::JUMP;
keymap[SDLK_LCTRL] = Controller::ACTION;
keymap[SDLK_LALT] = Controller::ACTION;
keymap[SDLK_ESCAPE] = Controller::PAUSE_MENU;
keymap[SDLK_p] = Controller::PAUSE_MENU;
keymap[SDLK_PAUSE] = Controller::PAUSE_MENU;
keymap[SDLK_RETURN] = Controller::MENU_SELECT;
keymap[SDLK_KP_ENTER] = Controller::MENU_SELECT;
keymap[SDLK_CARET] = Controller::CONSOLE;
keymap[SDLK_DELETE] = Controller::PEEK_LEFT;
keymap[SDLK_PAGEDOWN] = Controller::PEEK_RIGHT;
keymap[SDLK_HOME] = Controller::PEEK_UP;
keymap[SDLK_END] = Controller::PEEK_DOWN;

jump_with_up_kbd = false;
}

JoystickKeyboardController::~JoystickKeyboardController()
{
}

Controller*
JoystickKeyboardController::get_main_controller()
JoystickKeyboardController::get_controller()
{
return controller.get();
}
Expand All @@ -76,30 +51,9 @@ void
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") {
int key = -1;
std::string control;
const lisp::Lisp* map = iter.lisp();
map->get("key", key);
map->get("control", control);

int i = 0;
for(i = 0; Controller::controlNames[i] != 0; ++i) {
if (control == Controller::controlNames[i])
break;
}
if (Controller::controlNames[i] == 0) {
log_info << "Invalid control '" << control << "' in keymap" << std::endl;
continue;
}
keymap[SDL_Keycode(key)] = Control(i);
}
}
if (keymap_lisp)
{
keyboard_manager->read(keymap_lisp);
}

const lisp::Lisp* joystick_lisp = lisp.get_lisp(_("joystick"));
Expand All @@ -113,13 +67,7 @@ void
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("key", (int) i->first);
writer.write("control", Controller::controlNames[i->second]);
writer.end_list("map");
}
keyboard_manager->write(writer);
writer.end_list("keymap");

writer.start_list("joystick");
Expand All @@ -144,12 +92,12 @@ JoystickKeyboardController::process_event(const SDL_Event& event)
{
switch(event.type) {
case SDL_TEXTINPUT:
process_text_input_event(event.text);
keyboard_manager->process_text_input_event(event.text);
break;

case SDL_KEYUP:
case SDL_KEYDOWN:
process_key_event(event.key);
keyboard_manager->process_key_event(event.key);
break;

case SDL_JOYAXISMOTION:
Expand Down Expand Up @@ -204,183 +152,4 @@ JoystickKeyboardController::process_event(const SDL_Event& event)
}
}

void
JoystickKeyboardController::process_text_input_event(const SDL_TextInputEvent& event)
{
if (Console::instance->hasFocus()) {
for(int i = 0; event.text[i] != '\0'; ++i)
{
Console::instance->input(event.text[i]);
}
}
}

void
JoystickKeyboardController::process_key_event(const SDL_KeyboardEvent& event)
{
KeyMap::iterator key_mapping = keymap.find(event.keysym.sym);

// if console key was pressed: toggle console
if ((key_mapping != keymap.end()) && (key_mapping->second == Controller::CONSOLE)) {
if (event.type == SDL_KEYDOWN)
Console::instance->toggle();
} else {
if (Console::instance->hasFocus()) {
// if console is open: send key there
process_console_key_event(event);
} 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.SDL_Keycode.sym << " is unbound" << std::endl;
} else {
Control control = key_mapping->second;
bool value = (event.type == SDL_KEYDOWN);
controller->set_control(control, value);
if (jump_with_up_kbd && control == Controller::UP){
controller->set_control(Controller::JUMP, value);
}
}
}
}

void
JoystickKeyboardController::process_console_key_event(const SDL_KeyboardEvent& event)
{
if (event.type != SDL_KEYDOWN) return;

switch (event.keysym.sym) {
case SDLK_RETURN:
Console::instance->enter();
break;
case SDLK_BACKSPACE:
Console::instance->backspace();
break;
case SDLK_TAB:
Console::instance->autocomplete();
break;
case SDLK_PAGEUP:
Console::instance->scroll(-1);
break;
case SDLK_PAGEDOWN:
Console::instance->scroll(+1);
break;
case SDLK_HOME:
Console::instance->move_cursor(-65535);
break;
case SDLK_END:
Console::instance->move_cursor(+65535);
break;
case SDLK_UP:
Console::instance->show_history(-1);
break;
case SDLK_DOWN:
Console::instance->show_history(+1);
break;
case SDLK_LEFT:
Console::instance->move_cursor(-1);
break;
case SDLK_RIGHT:
Console::instance->move_cursor(+1);
break;
default:
break;
}
}

void
JoystickKeyboardController::process_menu_key_event(const SDL_KeyboardEvent& event)
{
// wait for key mode?
if (wait_for_key >= 0) {
if (event.type == SDL_KEYUP)
return;

if (event.keysym.sym != SDLK_ESCAPE
&& event.keysym.sym != SDLK_PAUSE) {
bind_key(event.keysym.sym, Control(wait_for_key));
}
reset();
MenuStorage::get_key_options_menu()->update();
wait_for_key = -1;
return;
}
if (joystick_manager->wait_for_joystick >= 0) {
if (event.keysym.sym == SDLK_ESCAPE) {
reset();
MenuStorage::get_joystick_options_menu()->update();
joystick_manager->wait_for_joystick = -1;
}
return;
}

Control control;
/* we use default keys when the menu is open (to avoid problems when
* redefining keys to invalid settings
*/
switch(event.keysym.sym) {
case SDLK_UP:
control = Controller::UP;
break;
case SDLK_DOWN:
control = Controller::DOWN;
break;
case SDLK_LEFT:
control = Controller::LEFT;
break;
case SDLK_RIGHT:
control = Controller::RIGHT;
break;
case SDLK_SPACE:
case SDLK_RETURN:
case SDLK_KP_ENTER:
control = Controller::MENU_SELECT;
break;
case SDLK_ESCAPE:
case SDLK_PAUSE:
control = Controller::PAUSE_MENU;
break;
default:
return;
break;
}

controller->set_control(control, (event.type == SDL_KEYDOWN));
}

void
JoystickKeyboardController::bind_key(SDL_Keycode key, Control control)
{
// remove all previous mappings for that control and for that key
for(KeyMap::iterator i = keymap.begin();
i != keymap.end(); /* no ++i */) {
if (i->second == control) {
KeyMap::iterator e = i;
++i;
keymap.erase(e);
} else {
++i;
}
}

KeyMap::iterator i = keymap.find(key);
if (i != keymap.end())
keymap.erase(i);

// add new mapping
keymap[key] = control;
}

SDL_Keycode
JoystickKeyboardController::reversemap_key(Control c)
{
for(KeyMap::iterator i = keymap.begin(); i != keymap.end(); ++i) {
if (i->second == c)
return i->first;
}

return SDLK_UNKNOWN;
}

/* EOF */

0 comments on commit b26a4e8

Please sign in to comment.