From dfa597bbd5c85744777f21bb1d044c59fb692a65 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 12 Apr 2003 02:15:23 +0000 Subject: [PATCH] Add InputHandler for SDL input types, instead of handling them as a special case in RageInput. --- .../arch/InputHandler/InputHandler_SDL.cpp | 141 ++++++++++++++++++ .../src/arch/InputHandler/InputHandler_SDL.h | 27 ++++ 2 files changed, 168 insertions(+) create mode 100644 stepmania/src/arch/InputHandler/InputHandler_SDL.cpp create mode 100644 stepmania/src/arch/InputHandler/InputHandler_SDL.h diff --git a/stepmania/src/arch/InputHandler/InputHandler_SDL.cpp b/stepmania/src/arch/InputHandler/InputHandler_SDL.cpp new file mode 100644 index 0000000000..3964d1bc92 --- /dev/null +++ b/stepmania/src/arch/InputHandler/InputHandler_SDL.cpp @@ -0,0 +1,141 @@ +#include "global.h" + +/* This input handler checks for SDL device input messages and sends them off to + * InputFilter. If we add mouse support, it should go here, too. + * + * Note that the SDL video event systems are interlinked--you can't use events + * until video is initialized. So, if we aren't using SDL for video, we can't + * use SDL events at all, and so we lose input support, too. In that case, you'll + * need to write other input handlers for those cases and load them instead of this. + * (Part of this is probably because, in Windows, you need a window to get input.) + */ +#include "InputHandler_SDL.h" +#include "SDL_utils.h" +#include "InputFilter.h" +#include "RageLog.h" + +static const Sint8 Handled_SDL_Events[] = { + SDL_KEYDOWN, SDL_KEYUP, SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP, + SDL_JOYAXISMOTION, SDL_JOYHATMOTION, -1 +}; +static int SDL_EventMask; + +InputHandler_SDL::InputHandler_SDL() +{ + SDL_InitSubSystem( SDL_INIT_JOYSTICK ); + + SDL_EnableKeyRepeat( 0, 0 ); + + /* We can do this to get Unicode values in the key struct, which (with + * a little more work) will make us work better on international keyboards. + * Not all archs support this well. */ + // SDL_EnableUNICODE( 1 ); + + // + // Init joysticks + // + int iNumJoySticks = min( SDL_NumJoysticks(), NUM_JOYSTICKS ); + LOG->Info( "Found %d joysticks", iNumJoySticks ); + int i; + for( i=0; iInfo(" %d: '%s' Error opening: %s", + i, SDL_JoystickName(i), SDL_GetError()); + continue; + } + + LOG->Info( " %d: '%s' axes: %d, hats: %d, buttons: %d", + i, + SDL_JoystickName(i), + SDL_JoystickNumAxes(pJoystick), + SDL_JoystickNumHats(pJoystick), + SDL_JoystickNumButtons(pJoystick) ); + + /* For some weird reason, we won't get any joystick events at all + * if we don't keep the joystick open. (Why? The joystick event + * API is completely separate from the SDL_Joystick polling API ...) */ + Joysticks.push_back(pJoystick); + } + + for(i = 0; Handled_SDL_Events[i] != -1; ++i) + { + SDL_EventState(Handled_SDL_Events[i], SDL_ENABLE); + SDL_EventMask |= SDL_EVENTMASK(Handled_SDL_Events[i]); + } +} + +InputHandler_SDL::~InputHandler_SDL() +{ + unsigned i; + for(i = 0; i < Joysticks.size(); ++i) + SDL_JoystickClose(Joysticks[i]); + + SDL_QuitSubSystem( SDL_INIT_JOYSTICK ); + + for(i = 0; Handled_SDL_Events[i] != -1; ++i) + SDL_EventState(Handled_SDL_Events[i], SDL_IGNORE); +} + +void InputHandler_SDL::Update(float fDeltaTime) +{ + SDL_Event event; + while(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EventMask)) + { + switch(event.type) + { + case SDL_KEYDOWN: + case SDL_KEYUP: + { + DeviceInput di(DEVICE_KEYBOARD, event.key.keysym.sym); + INPUTFILTER->ButtonPressed(di, event.key.state == SDL_PRESSED); + } + continue; + + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + { + InputDevice i = InputDevice(DEVICE_JOY1 + event.jbutton.which); + JoystickButton Button = JoystickButton(JOY_1 + event.jbutton.button); + if(Button >= NUM_JOYSTICK_BUTTONS) + { + LOG->Warn("Ignored joystick event (button too high)"); + continue; + } + DeviceInput di(i, Button); + INPUTFILTER->ButtonPressed(di, event.jbutton.state == SDL_PRESSED); + continue; + } + + case SDL_JOYAXISMOTION: + { + InputDevice i = InputDevice(DEVICE_JOY1 + event.jaxis.which); + JoystickButton neg = (JoystickButton)(JOY_LEFT+2*event.jaxis.axis); + JoystickButton pos = (JoystickButton)(JOY_RIGHT+2*event.jaxis.axis); + INPUTFILTER->ButtonPressed(DeviceInput(i, neg), event.jaxis.value < -16000); + INPUTFILTER->ButtonPressed(DeviceInput(i, pos), event.jaxis.value > +16000); + continue; + } + + case SDL_JOYHATMOTION: + { + InputDevice i = InputDevice(DEVICE_JOY1 + event.jhat.which); + INPUTFILTER->ButtonPressed(DeviceInput(i, JOY_HAT_UP), !!(event.jhat.value & SDL_HAT_UP)); + INPUTFILTER->ButtonPressed(DeviceInput(i, JOY_HAT_DOWN), !!(event.jhat.value & SDL_HAT_DOWN)); + INPUTFILTER->ButtonPressed(DeviceInput(i, JOY_HAT_LEFT), !!(event.jhat.value & SDL_HAT_LEFT)); + INPUTFILTER->ButtonPressed(DeviceInput(i, JOY_HAT_RIGHT), !!(event.jhat.value & SDL_HAT_RIGHT)); + continue; + } + } + } +} + +/* +----------------------------------------------------------------------------- + Copyright (c) 2001-2003 by the person(s) listed below. All rights reserved. + Chris Danford + Glenn Maynard +----------------------------------------------------------------------------- +*/ diff --git a/stepmania/src/arch/InputHandler/InputHandler_SDL.h b/stepmania/src/arch/InputHandler/InputHandler_SDL.h new file mode 100644 index 0000000000..8b3904abea --- /dev/null +++ b/stepmania/src/arch/InputHandler/InputHandler_SDL.h @@ -0,0 +1,27 @@ +#ifndef INPUT_HANDLER_SDL_KEYBOARD_H +#define INPUT_HANDLER_SDL_KEYBOARD_H + +#include "InputHandler.h" + +struct _SDL_Joystick; +typedef struct _SDL_Joystick SDL_Joystick; + +class InputHandler_SDL: public InputHandler +{ + vector Joysticks; + +public: + void Update(float fDeltaTime); + InputHandler_SDL(); + ~InputHandler_SDL(); +}; + + +#endif +/* +----------------------------------------------------------------------------- + Copyright (c) 2001-2003 by the person(s) listed below. All rights reserved. + Chris Danford + Glenn Maynard +----------------------------------------------------------------------------- +*/