Merged changes from branches/supertux-milestone2-grumbel/ to trunk/supertux/
[supertux.git] / src / control / joystickkeyboardcontroller.cpp
index 3a0b7da..a8b9950 100644 (file)
@@ -1,13 +1,11 @@
-//  $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 "control/joystickkeyboardcontroller.hpp"
 
-#include <config.h>
+#include <iostream>
 
-#include <sstream>
-#include "joystickkeyboardcontroller.hpp"
-#include "log.hpp"
 #include "gui/menu.hpp"
-#include "gettext.hpp"
-#include "lisp/lisp.hpp"
+#include "util/writer.hpp"
 #include "lisp/list_iterator.hpp"
-#include "game_session.hpp"
-#include "console.hpp"
-#include "gameconfig.hpp"
+#include "supertux/gameconfig.hpp"
+#include "supertux/console.hpp"
+#include "util/gettext.hpp"
 
 namespace{
   const int SCAN_JOYSTICKS = Controller::CONTROLCOUNT + 1;
@@ -195,7 +190,7 @@ JoystickKeyboardController::updateAvailableJoysticks()
 }
 
 void
-JoystickKeyboardController::read(const lisp::Lisp& lisp)
+JoystickKeyboardController::read(const Reader& lisp)
 {
   const lisp::Lisp* keymap_lisp = lisp.get_lisp("keymap");
   if(keymap_lisp) {
@@ -285,41 +280,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");
   }
 
@@ -372,72 +367,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 separately (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
@@ -446,52 +441,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;
 }
@@ -567,7 +562,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;
   }
@@ -582,7 +577,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();
@@ -800,28 +795,28 @@ JoystickKeyboardController::get_joystick_options_menu()
 //----------------------------------------------------------------------------
 
 JoystickKeyboardController::KeyboardMenu::KeyboardMenu(
-    JoystickKeyboardController* _controller)
+  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"));
-    add_controlfield(Controller::PEEK_UP,    _("Peek Up"));
-    add_controlfield(Controller::PEEK_DOWN,  _("Peek Down"));
-    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();
+  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"));
+  add_controlfield(Controller::PEEK_UP,    _("Peek Up"));
+  add_controlfield(Controller::PEEK_DOWN,  _("Peek Down"));
+  if (g_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()
@@ -878,28 +873,28 @@ JoystickKeyboardController::KeyboardMenu::update()
 {
   // update menu
   get_item_by_id((int) Controller::UP).change_input(get_key_name(
-    controller->reversemap_key(Controller::UP)));
+                                                      controller->reversemap_key(Controller::UP)));
   get_item_by_id((int) Controller::DOWN).change_input(get_key_name(
-    controller->reversemap_key(Controller::DOWN)));
+                                                        controller->reversemap_key(Controller::DOWN)));
   get_item_by_id((int) Controller::LEFT).change_input(get_key_name(
-    controller->reversemap_key(Controller::LEFT)));
+                                                        controller->reversemap_key(Controller::LEFT)));
   get_item_by_id((int) Controller::RIGHT).change_input(get_key_name(
-    controller->reversemap_key(Controller::RIGHT)));
+                                                         controller->reversemap_key(Controller::RIGHT)));
   get_item_by_id((int) Controller::JUMP).change_input(get_key_name(
-    controller->reversemap_key(Controller::JUMP)));
+                                                        controller->reversemap_key(Controller::JUMP)));
   get_item_by_id((int) Controller::ACTION).change_input(get_key_name(
-    controller->reversemap_key(Controller::ACTION)));
+                                                          controller->reversemap_key(Controller::ACTION)));
   get_item_by_id((int) Controller::PEEK_LEFT).change_input(get_key_name(
-    controller->reversemap_key(Controller::PEEK_LEFT)));
+                                                             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)));
+                                                              controller->reversemap_key(Controller::PEEK_RIGHT)));
   get_item_by_id((int) Controller::PEEK_UP).change_input(get_key_name(
-    controller->reversemap_key(Controller::PEEK_UP)));
+                                                           controller->reversemap_key(Controller::PEEK_UP)));
   get_item_by_id((int) Controller::PEEK_DOWN).change_input(get_key_name(
-    controller->reversemap_key(Controller::PEEK_DOWN)));
-  if (config->console_enabled) {
+                                                             controller->reversemap_key(Controller::PEEK_DOWN)));
+  if (g_config->console_enabled) {
     get_item_by_id((int) Controller::CONSOLE).change_input(get_key_name(
-      controller->reversemap_key(Controller::CONSOLE)));
+                                                             controller->reversemap_key(Controller::CONSOLE)));
   }
   get_item_by_id(Controller::CONTROLCOUNT).toggled = controller->jump_with_up_kbd;
 }
@@ -1014,27 +1009,27 @@ JoystickKeyboardController::JoystickMenu::update_menu_item(Control id)
     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;
-      }
+    {
+      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 {
@@ -1063,3 +1058,5 @@ JoystickKeyboardController::JoystickMenu::update()
 
   get_item_by_id(Controller::CONTROLCOUNT).toggled = controller->jump_with_up_joy;
 }
+
+/* EOF */