- Refactored worldmap a bit to reuse GameObject from the rest of the game
[supertux.git] / src / control / joystickkeyboardcontroller.cpp
index d314dae..6bebf6b 100644 (file)
 //  along with this program; if not, write to the Free Software
 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 //  02111-1307, USA.
-
 #include <config.h>
 
 #include <sstream>
 #include "joystickkeyboardcontroller.h"
 #include "gui/menu.h"
-#include "app/gettext.h"
+#include "gettext.h"
 #include "lisp/lisp.h"
 #include "lisp/list_iterator.h"
 #include "game_session.h"
@@ -53,7 +52,8 @@ public:
 };
   
 JoystickKeyboardController::JoystickKeyboardController()
-  : wait_for_key(-1), wait_for_joybutton(-1)
+  : wait_for_key(-1), wait_for_joybutton(-1), key_options_menu(0),
+    joystick_options_menu(0)
 {
   memset(last_keys, 0, sizeof(last_keys));
 
@@ -71,12 +71,9 @@ JoystickKeyboardController::JoystickKeyboardController()
   keymap.insert(std::make_pair(SDLK_RETURN, MENU_SELECT));
   keymap.insert(std::make_pair(SDLK_KP_ENTER, MENU_SELECT));
   
-  joystick_count = SDL_NumJoysticks();
+  int joystick_count = SDL_NumJoysticks();
   min_joybuttons = -1;
   max_joybuttons = -1;
-#ifdef DEBUG
-  std::cout << "Found " << joystick_count << " joysticks.\n";
-#endif
   for(int i = 0; i < joystick_count; ++i) {
     SDL_Joystick* joystick = SDL_JoystickOpen(i);
     bool good = true;
@@ -91,8 +88,6 @@ JoystickKeyboardController::JoystickKeyboardController()
     }
     if(!good) {
       SDL_JoystickClose(joystick);
-      joysticks.push_back(0);
-      joystick_names.push_back("");
       continue;
     }
     
@@ -102,7 +97,6 @@ JoystickKeyboardController::JoystickKeyboardController()
       max_joybuttons = SDL_JoystickNumButtons(joystick);
     }
 
-    joystick_names.push_back(SDL_JoystickName(i));
     joysticks.push_back(joystick);
   }
 
@@ -122,6 +116,13 @@ JoystickKeyboardController::JoystickKeyboardController()
     if(i != min_joybuttons-1)
       joy_button_map.insert(std::make_pair(i, MENU_SELECT));
   }
+
+  // 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()
@@ -234,6 +235,14 @@ JoystickKeyboardController::write(lisp::Writer& writer)
 }
 
 void
+JoystickKeyboardController::reset()
+{
+  Controller::reset();
+  for(size_t i = 0; i < sizeof(last_keys); ++i)
+      last_keys[i] = 0;
+}
+
+void
 JoystickKeyboardController::process_event(const SDL_Event& event)
 {
   switch(event.type) {
@@ -618,9 +627,13 @@ JoystickKeyboardController::JoystickMenu::JoystickMenu(
 {
   add_label(_("Joystick Setup"));
   add_hl();
-  add_controlfield(Controller::JUMP, _("Jump"));
-  add_controlfield(Controller::ACTION, _("Shoot/Run"));
-  add_controlfield(Controller::PAUSE_MENU, _("Pause/Menu"));
+  if(controller->joysticks.size() > 0) {
+    add_controlfield(Controller::JUMP, _("Jump"));
+    add_controlfield(Controller::ACTION, _("Shoot/Run"));
+    add_controlfield(Controller::PAUSE_MENU, _("Pause/Menu"));
+  } else {
+    add_deactive(-1, _("No Joysticks found"));
+  }
   add_hl();
   add_back(_("Back"));
   update();
@@ -651,6 +664,9 @@ JoystickKeyboardController::JoystickMenu::menu_action(MenuItem* item)
 void
 JoystickKeyboardController::JoystickMenu::update()
 {
+  if(controller->joysticks.size() == 0)
+    return;
+
   // update menu
   get_item_by_id((int) Controller::JUMP).change_input(get_button_name(
     controller->reversemap_joybutton(Controller::JUMP)));