Cleaned up event gathering loop and moved it from mainSDL into the

EventHandler class.  Eventually, *all* event-related stuff will move
to this class (which makes sense, considering its name).

Removed all references to joystick stuff for now.  It will be re-added later.

Re-enabled snapshot support.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@389 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2005-04-03 19:37:32 +00:00
parent 088210251e
commit cad03a19cb
7 changed files with 249 additions and 559 deletions

View File

@ -13,7 +13,7 @@
## See the file "license" for information on usage and redistribution of
## this file, and for a DISCLAIMER OF ALL WARRANTIES.
##
## $Id: makefile,v 1.69 2005-03-28 00:04:49 stephena Exp $
## $Id: makefile,v 1.70 2005-04-03 19:37:32 stephena Exp $
##============================================================================
##============================================================================
@ -32,7 +32,7 @@ OPTIMIZATIONS =
### to include support for saving snapshots in png format
### (requires PNG library)
# SNAPSHOT_SUPPORT = 1
SNAPSHOT_SUPPORT = 1
### to include support for game developers
### enables some extra commandline options that allow the user

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: FrameBufferGL.cxx,v 1.15 2005-03-28 00:04:53 stephena Exp $
// $Id: FrameBufferGL.cxx,v 1.16 2005-04-03 19:37:32 stephena Exp $
//============================================================================
#include <SDL.h>
@ -334,7 +334,7 @@ void FrameBufferGL::toggleFilter()
void FrameBufferGL::hLine(uInt32 x, uInt32 y, uInt32 x2, OverlayColor color)
{
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
glLineWidth(1);
glLineWidth(2);
glColor4f(myGUIPalette[color][0],
myGUIPalette[color][1],
myGUIPalette[color][2],
@ -349,7 +349,7 @@ void FrameBufferGL::hLine(uInt32 x, uInt32 y, uInt32 x2, OverlayColor color)
void FrameBufferGL::vLine(uInt32 x, uInt32 y, uInt32 y2, OverlayColor color)
{
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
glLineWidth(1);
glLineWidth(2);
glColor4f(myGUIPalette[color][0],
myGUIPalette[color][1],
myGUIPalette[color][2],

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: Snapshot.cxx,v 1.4 2005-02-13 19:17:02 stephena Exp $
// $Id: Snapshot.cxx,v 1.5 2005-04-03 19:37:32 stephena Exp $
//============================================================================
#include <png.h>
@ -22,7 +22,6 @@
#include "bspf.hxx"
#include "FrameBuffer.hxx"
#include "FrameBufferSDL.hxx"
#include "Snapshot.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: mainSDL.cxx,v 1.29 2005-03-26 04:19:53 stephena Exp $
// $Id: mainSDL.cxx,v 1.30 2005-04-03 19:37:32 stephena Exp $
//============================================================================
#include <fstream>
@ -33,7 +33,6 @@
#include "bspf.hxx"
#include "Console.hxx"
#include "Event.hxx"
#include "StellaEvent.hxx"
#include "EventHandler.hxx"
#include "FrameBuffer.hxx"
#include "FrameBufferSoft.hxx"
@ -60,62 +59,9 @@
static void mainGameLoop();
static Console* CreateConsole(const string& romfile);
static void Cleanup();
static bool SetupJoystick();
static void HandleEvents();
static uInt32 GetTicks();
static void SetupProperties(PropertiesSet& set);
static void ShowInfo(const string& msg);
static void SetPaddleMode(Int32 mode);
#ifdef JOYSTICK_SUPPORT
// Lookup table for joystick numbers and events
StellaEvent::JoyStick joyList[StellaEvent::LastJSTICK] = {
StellaEvent::JSTICK_0, StellaEvent::JSTICK_1, StellaEvent::JSTICK_2,
StellaEvent::JSTICK_3, StellaEvent::JSTICK_5, StellaEvent::JSTICK_5
};
StellaEvent::JoyCode joyButtonList[StellaEvent::LastJCODE] = {
StellaEvent::JBUTTON_0, StellaEvent::JBUTTON_1, StellaEvent::JBUTTON_2,
StellaEvent::JBUTTON_3, StellaEvent::JBUTTON_4, StellaEvent::JBUTTON_5,
StellaEvent::JBUTTON_6, StellaEvent::JBUTTON_7, StellaEvent::JBUTTON_8,
StellaEvent::JBUTTON_9, StellaEvent::JBUTTON_10, StellaEvent::JBUTTON_11,
StellaEvent::JBUTTON_12, StellaEvent::JBUTTON_13, StellaEvent::JBUTTON_14,
StellaEvent::JBUTTON_15, StellaEvent::JBUTTON_16, StellaEvent::JBUTTON_17,
StellaEvent::JBUTTON_18, StellaEvent::JBUTTON_19
};
enum JoyType { JT_NONE, JT_REGULAR, JT_STELLADAPTOR_1, JT_STELLADAPTOR_2 };
struct Stella_Joystick
{
SDL_Joystick* stick;
JoyType type;
};
static Stella_Joystick theJoysticks[StellaEvent::LastJSTICK];
// Static lookup tables for Stelladaptor axis support
static Event::Type SA_Axis[2][2][3] = {
Event::JoystickZeroLeft, Event::JoystickZeroRight, Event::PaddleZeroResistance,
Event::JoystickZeroUp, Event::JoystickZeroDown, Event::PaddleOneResistance,
Event::JoystickOneLeft, Event::JoystickOneRight, Event::PaddleTwoResistance,
Event::JoystickOneUp, Event::JoystickOneDown, Event::PaddleThreeResistance
};
static Event::Type SA_DrivingValue[2] = {
Event::DrivingZeroValue, Event::DrivingOneValue
};
#endif
// Lookup table for paddle resistance events
static Event::Type Paddle_Resistance[4] = {
Event::PaddleZeroResistance, Event::PaddleOneResistance,
Event::PaddleTwoResistance, Event::PaddleThreeResistance
};
// Lookup table for paddle button events
static Event::Type Paddle_Button[4] = {
Event::PaddleZeroFire, Event::PaddleOneFire,
Event::PaddleTwoFire, Event::PaddleThreeFire
};
// Pointer to the main parent osystem object or the null pointer
static OSystem* theOSystem = (OSystem*) NULL;
@ -132,47 +78,14 @@ static Sound* theSound = (Sound*) NULL;
// Pointer to the settings object or the null pointer
static Settings* theSettings = (Settings*) NULL;
// Indicates if the mouse should be grabbed
static bool theGrabMouseIndicator = false;
// Indicates if the mouse cursor should be hidden
static bool theHideCursorIndicator = false;
// Indicates the current paddle mode
static Int32 thePaddleMode;
// Indicates relative mouse position horizontally
static Int32 mouseX = 0;
// Indicates whether to show information during program execution
static bool theShowInfoFlag;
struct KeyList
{
SDLKey scanCode;
StellaEvent::KeyCode keyCode;
};
/**
Set the mouse to emulate the given paddle
*/
void SetPaddleMode(Int32 mode)
{
thePaddleMode = mode;
ostringstream buf;
buf << "Mouse is paddle " << mode;
theDisplay->showMessage(buf.str());
theSettings->setInt("paddle",thePaddleMode);
}
/**
Prints given message based on 'theShowInfoFlag'
*/
static void ShowInfo(const string& msg)
static inline void ShowInfo(const string& msg)
{
if(theShowInfoFlag && msg != "")
cout << msg << endl;
@ -198,431 +111,6 @@ inline uInt32 GetTicks()
#endif
/**
This routine should be called once setupDisplay is called
to create the joystick stuff.
*/
bool SetupJoystick()
{
#ifdef JOYSTICK_SUPPORT
ostringstream message;
// Keep track of how many Stelladaptors we've found
uInt8 saCount = 0;
// First clear the joystick array
for(uInt32 i = 0; i < StellaEvent::LastJSTICK; i++)
{
theJoysticks[i].stick = (SDL_Joystick*) NULL;
theJoysticks[i].type = JT_NONE;
}
// Initialize the joystick subsystem
if((SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) || (SDL_NumJoysticks() <= 0))
{
ShowInfo("No joysticks present, use the keyboard.");
return true;
}
// Try to open 4 regular joysticks and 2 Stelladaptor devices
uInt32 limit = SDL_NumJoysticks() <= StellaEvent::LastJSTICK ?
SDL_NumJoysticks() : StellaEvent::LastJSTICK;
for(uInt32 i = 0; i < limit; i++)
{
message.str("");
string name = SDL_JoystickName(i);
theJoysticks[i].stick = SDL_JoystickOpen(i);
// Skip if we couldn't open it for any reason
if(theJoysticks[i].stick == NULL)
continue;
// Figure out what type of joystick this is
if(name.find("Stelladaptor", 0) != string::npos)
{
saCount++;
if(saCount > 2) // Ignore more than 2 Stelladaptors
{
theJoysticks[i].type = JT_NONE;
continue;
}
else if(saCount == 1)
{
name = "Left Stelladaptor (Left joystick, Paddles 0 and 1, Left driving controller)";
theJoysticks[i].type = JT_STELLADAPTOR_1;
}
else if(saCount == 2)
{
name = "Right Stelladaptor (Right joystick, Paddles 2 and 3, Right driving controller)";
theJoysticks[i].type = JT_STELLADAPTOR_2;
}
message << "Joystick " << i << ": " << name;
ShowInfo(message.str());
}
else
{
theJoysticks[i].type = JT_REGULAR;
message << "Joystick " << i << ": " << SDL_JoystickName(i)
<< " with " << SDL_JoystickNumButtons(theJoysticks[i].stick)
<< " buttons.";
ShowInfo(message.str());
}
}
#endif
return true;
}
/**
This routine should be called regularly to handle events
*/
void HandleEvents()
{
SDL_Event event;
// Check for an event
while(SDL_PollEvent(&event))
{
switch(event.type)
{
// keyboard events
case SDL_KEYUP:
case SDL_KEYDOWN:
{
SDLKey key = event.key.keysym.sym;
SDLMod mod = event.key.keysym.mod;
uInt8 state = event.key.type == SDL_KEYDOWN ? 1 : 0;
// An attempt to speed up event processing
// All SDL-specific event actions are accessed by either
// Control or Alt keys. So we quickly check for those.
if(mod & KMOD_ALT && state)
{
switch(int(key))
{
case SDLK_EQUALS:
theDisplay->resize(1);
break;
case SDLK_MINUS:
theDisplay->resize(-1);
break;
case SDLK_RETURN:
theDisplay->toggleFullscreen();
break;
case SDLK_LEFTBRACKET:
theSound->adjustVolume(-1);
break;
case SDLK_RIGHTBRACKET:
theSound->adjustVolume(1);
break;
case SDLK_f:
theDisplay->toggleFilter();
break;
}
#ifdef DEVELOPER_SUPPORT
if(theOSystem->eventHandler().state() == EventHandler::S_EMULATE)
{
switch(int(key))
{
case SDLK_END: // Alt-End increases XStart
theOSystem->console().changeXStart(1);
theDisplay->resize(0);
break;
case SDLK_HOME: // Alt-Home decreases XStart
theOSystem->console().changeXStart(0);
theDisplay->resize(0);
break;
case SDLK_PAGEUP: // Alt-PageUp increases YStart
theOSystem->console().changeYStart(1);
theDisplay->resize(0);
break;
case SDLK_PAGEDOWN: // Alt-PageDown decreases YStart
theOSystem->console().changeYStart(0);
theDisplay->resize(0);
break;
}
}
#endif
}
else if(mod & KMOD_CTRL && state)
{
if(key == SDLK_q)
{
theOSystem->eventHandler().handleEvent(Event::Quit, 1);
}
else if(theOSystem->eventHandler().state() == EventHandler::S_EMULATE)
{
switch(int(key))
{
case SDLK_g:
// don't change grabmouse in fullscreen mode
if(!theDisplay->fullScreen())
{
theGrabMouseIndicator = !theGrabMouseIndicator;
theSettings->setBool("grabmouse", theGrabMouseIndicator);
theDisplay->grabMouse(theGrabMouseIndicator);
}
break;
case SDLK_h:
// don't change hidecursor in fullscreen mode
if(!theDisplay->fullScreen())
{
theHideCursorIndicator = !theHideCursorIndicator;
theSettings->setBool("hidecursor", theHideCursorIndicator);
theDisplay->showCursor(!theHideCursorIndicator);
}
break;
case SDLK_0: // Ctrl-0 sets the mouse to paddle 0
SetPaddleMode(0);
break;
case SDLK_1: // Ctrl-1 sets the mouse to paddle 1
SetPaddleMode(1);
break;
case SDLK_2: // Ctrl-2 sets the mouse to paddle 2
SetPaddleMode(2);
break;
case SDLK_3: // Ctrl-3 sets the mouse to paddle 3
SetPaddleMode(3);
break;
case SDLK_f: // Ctrl-f toggles NTSC/PAL mode
theOSystem->console().toggleFormat();
theDisplay->setupPalette();
break;
case SDLK_p: // Ctrl-p toggles different palettes
theOSystem->console().togglePalette();
// theDisplay->setupPalette();
break;
#ifdef DEVELOPER_SUPPORT
case SDLK_END: // Ctrl-End increases Width
theOSystem->console().changeWidth(1);
theDisplay->resize(0);
break;
case SDLK_HOME: // Ctrl-Home decreases Width
theOSystem->console().changeWidth(0);
theDisplay->resize(0);
break;
case SDLK_PAGEUP: // Ctrl-PageUp increases Height
theOSystem->console().changeHeight(1);
theDisplay->resize(0);
break;
case SDLK_PAGEDOWN: // Ctrl-PageDown decreases Height
theOSystem->console().changeHeight(0);
theDisplay->resize(0);
break;
#endif
case SDLK_s: // Ctrl-s saves properties to a file
// Attempt to merge with propertiesSet
if(theSettings->getBool("mergeprops"))
theOSystem->console().saveProperties(theOSystem->propertiesOutputFilename(), true);
else // Save to file in home directory
{
string newPropertiesFile = theOSystem->baseDir() + "/" + \
theOSystem->console().properties().get("Cartridge.Name") + ".pro";
theOSystem->console().saveProperties(newPropertiesFile);
}
break;
}
}
}
// Otherwise, let the event handler deal with it
theOSystem->eventHandler().handleKeyEvent(key, mod, state);
break; // SDL_KEYUP, SDL_KEYDOWN
}
case SDL_MOUSEMOTION:
{
theOSystem->eventHandler().handleMouseMotionEvent(event);
break; // SDL_MOUSEMOTION
}
case SDL_MOUSEBUTTONUP:
case SDL_MOUSEBUTTONDOWN:
{
uInt8 state = event.button.type == SDL_MOUSEBUTTONDOWN ? 1 : 0;
theOSystem->eventHandler().handleMouseButtonEvent(event, state);
break; // SDL_MOUSEBUTTONUP, SDL_MOUSEBUTTONDOWN
}
case SDL_ACTIVEEVENT:
{
if((event.active.state & SDL_APPACTIVE) && (event.active.gain == 0))
{
if(!theOSystem->eventHandler().doPause())
theOSystem->eventHandler().handleEvent(Event::Pause, 1);
}
break; // SDL_ACTIVEEVENT
}
case SDL_QUIT:
{
theOSystem->eventHandler().handleEvent(Event::Quit, 1);
break; // SDL_QUIT
}
case SDL_VIDEOEXPOSE:
{
theDisplay->refresh();
break; // SDL_VIDEOEXPOSE
}
}
#ifdef JOYSTICK_SUPPORT
// Read joystick events and modify event states
StellaEvent::JoyStick stick;
StellaEvent::JoyCode code;
Int32 state;
Uint8 axis;
Uint8 button;
Int32 resistance;
Sint16 value;
JoyType type;
if(event.jbutton.which >= StellaEvent::LastJSTICK)
return;
stick = joyList[event.jbutton.which];
type = theJoysticks[event.jbutton.which].type;
// Figure put what type of joystick we're dealing with
// Stelladaptors behave differently, and can't be remapped
switch(type)
{
case JT_NONE:
break;
case JT_REGULAR:
switch(event.type)
{
case SDL_JOYBUTTONUP:
case SDL_JOYBUTTONDOWN:
if(event.jbutton.button >= StellaEvent::LastJCODE)
return;
code = joyButtonList[event.jbutton.button];
state = event.jbutton.state == SDL_PRESSED ? 1 : 0;
theOSystem->eventHandler().sendJoyEvent(stick, code, state);
break;
case SDL_JOYAXISMOTION:
axis = event.jaxis.axis;
value = event.jaxis.value;
if(axis == 0) // x-axis
{
theOSystem->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_LEFT,
(value < -16384) ? 1 : 0);
theOSystem->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_RIGHT,
(value > 16384) ? 1 : 0);
}
else if(axis == 1) // y-axis
{
theOSystem->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_UP,
(value < -16384) ? 1 : 0);
theOSystem->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_DOWN,
(value > 16384) ? 1 : 0);
}
break;
}
break; // Regular joystick
case JT_STELLADAPTOR_1:
case JT_STELLADAPTOR_2:
switch(event.type)
{
case SDL_JOYBUTTONUP:
case SDL_JOYBUTTONDOWN:
button = event.jbutton.button;
state = event.jbutton.state == SDL_PRESSED ? 1 : 0;
// Send button events for the joysticks/paddles/driving controllers
if(button == 0)
{
if(type == JT_STELLADAPTOR_1)
{
theOSystem->eventHandler().handleEvent(Event::JoystickZeroFire, state);
theOSystem->eventHandler().handleEvent(Event::DrivingZeroFire, state);
theOSystem->eventHandler().handleEvent(Event::PaddleZeroFire, state);
}
else
{
theOSystem->eventHandler().handleEvent(Event::JoystickOneFire, state);
theOSystem->eventHandler().handleEvent(Event::DrivingOneFire, state);
theOSystem->eventHandler().handleEvent(Event::PaddleTwoFire, state);
}
}
else if(button == 1)
{
if(type == JT_STELLADAPTOR_1)
theOSystem->eventHandler().handleEvent(Event::PaddleOneFire, state);
else
theOSystem->eventHandler().handleEvent(Event::PaddleThreeFire, state);
}
break;
case SDL_JOYAXISMOTION:
axis = event.jaxis.axis;
value = event.jaxis.value;
// Send axis events for the joysticks
theOSystem->eventHandler().handleEvent(SA_Axis[type-2][axis][0],
(value < -16384) ? 1 : 0);
theOSystem->eventHandler().handleEvent(SA_Axis[type-2][axis][1],
(value > 16384) ? 1 : 0);
// Send axis events for the paddles
resistance = (Int32) (1000000.0 * (32767 - value) / 65534);
theOSystem->eventHandler().handleEvent(SA_Axis[type-2][axis][2], resistance);
// Send events for the driving controllers
if(axis == 1)
{
if(value <= -16384-4096)
theOSystem->eventHandler().handleEvent(SA_DrivingValue[type-2],2);
else if(value > 16384+4096)
theOSystem->eventHandler().handleEvent(SA_DrivingValue[type-2],1);
else if(value >= 16384-4096)
theOSystem->eventHandler().handleEvent(SA_DrivingValue[type-2],0);
else
theOSystem->eventHandler().handleEvent(SA_DrivingValue[type-2],3);
}
break;
}
break; // Stelladaptor joystick
default:
break;
}
#endif
}
}
/**
Setup the properties set by first checking for a user file,
then a system-wide file.
@ -690,6 +178,8 @@ Console* CreateConsole(const string& romfile)
}
// FIXME - move this into OSystem, so that different systems can make use
// of system-specific timers (probably more accurate than SDL can provide)
/**
Runs the main game loop until the current game exits.
*/
@ -717,7 +207,7 @@ void mainGameLoop()
break;
startTime = GetTicks();
HandleEvents();
theOSystem->eventHandler().poll();
theOSystem->frameBuffer().update();
// Now, waste time if we need to so that we are at the desired frame rate
@ -752,7 +242,7 @@ void mainGameLoop()
break;
startTime = GetTicks();
HandleEvents();
theOSystem->eventHandler().poll();
theOSystem->frameBuffer().update();
currentTime = GetTicks();
@ -790,6 +280,7 @@ void mainGameLoop()
*/
void Cleanup()
{
/* FIXME
#ifdef JOYSTICK_SUPPORT
if(SDL_WasInit(SDL_INIT_JOYSTICK) & SDL_INIT_JOYSTICK)
{
@ -800,6 +291,7 @@ void Cleanup()
}
}
#endif
*/
if(theSound)
delete theSound;
@ -853,10 +345,7 @@ int main(int argc, char* argv[])
theEventHandler = new EventHandler(theOSystem);
// Cache some settings so they don't have to be repeatedly searched for
thePaddleMode = theSettings->getInt("paddle");
theShowInfoFlag = theSettings->getBool("showinfo");
theGrabMouseIndicator = theSettings->getBool("grabmouse");
theHideCursorIndicator = theSettings->getBool("hidecursor");
bool theRomLauncherFlag = false;//true;//FIXMEtheSettings->getBool("romlauncher");
// Create a properties set for us to use and set it up
@ -913,12 +402,14 @@ int main(int argc, char* argv[])
theSound = new Sound(theOSystem);
// Setup the SDL joysticks (must be done after FrameBuffer is created)
if(!SetupJoystick())
/* FIXME - don't exit if joysticks can't be initialized
if(!theOSystem->eventHandler().setupJoystick()) // move this into eventhandler
{
cerr << "ERROR: Couldn't set up joysticks.\n";
Cleanup();
return 0;
}
*/
// Print message about the framerate
ostringstream message;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: EventHandler.cxx,v 1.39 2005-03-28 00:04:53 stephena Exp $
// $Id: EventHandler.cxx,v 1.40 2005-04-03 19:37:32 stephena Exp $
//============================================================================
#include <algorithm>
@ -42,7 +42,9 @@ EventHandler::EventHandler(OSystem* osystem)
myLSState(0),
myPauseFlag(false),
myExitGameFlag(false),
myQuitFlag(false)
myQuitFlag(false),
myGrabMouseFlag(false),
myPaddleMode(0)
{
// Add this eventhandler object to the OSystem
myOSystem->attach(this);
@ -76,6 +78,8 @@ EventHandler::EventHandler(OSystem* osystem)
setKeymap();
setJoymap();
myGrabMouseFlag = myOSystem->settings().getBool("grabmouse");
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -99,6 +103,105 @@ void EventHandler::reset(State state)
myPauseFlag = false;
myExitGameFlag = false;
myQuitFlag = false;
myPaddleMode = 0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EventHandler::poll() // FIXME - add modifiers for OSX
{
SDL_Event event;
// Check for an event
while(SDL_PollEvent(&event))
{
switch(event.type)
{
// keyboard events
case SDL_KEYUP:
case SDL_KEYDOWN:
{
SDLKey key = event.key.keysym.sym;
SDLMod mod = event.key.keysym.mod;
uInt8 state = event.key.type == SDL_KEYDOWN ? 1 : 0;
// An attempt to speed up event processing
// All SDL-specific event actions are accessed by either
// Control or Alt keys. So we quickly check for those.
if(mod & KMOD_ALT && state)
{
switch(int(key))
{
case SDLK_EQUALS:
myOSystem->frameBuffer().resize(1);
break;
case SDLK_MINUS:
myOSystem->frameBuffer().resize(-1);
break;
case SDLK_RETURN:
myOSystem->frameBuffer().toggleFullscreen();
break;
case SDLK_f:
myOSystem->frameBuffer().toggleFilter();
break;
}
}
else if(mod & KMOD_CTRL && state)
{
switch(int(key))
{
case SDLK_q:
handleEvent(Event::Quit, 1);
break;
case SDLK_g:
// don't change grabmouse in fullscreen mode
if(!myOSystem->frameBuffer().fullScreen())
{
myGrabMouseFlag = !myGrabMouseFlag;
myOSystem->settings().setBool("grabmouse", myGrabMouseFlag);
myOSystem->frameBuffer().grabMouse(myGrabMouseFlag);
}
break;
}
}
// Otherwise, let the event handler deal with it
handleKeyEvent(key, mod, state);
break; // SDL_KEYUP, SDL_KEYDOWN
}
case SDL_MOUSEMOTION:
handleMouseMotionEvent(event);
break; // SDL_MOUSEMOTION
case SDL_MOUSEBUTTONUP:
case SDL_MOUSEBUTTONDOWN:
{
uInt8 state = event.button.type == SDL_MOUSEBUTTONDOWN ? 1 : 0;
handleMouseButtonEvent(event, state);
break; // SDL_MOUSEBUTTONUP, SDL_MOUSEBUTTONDOWN
}
case SDL_ACTIVEEVENT:
if((event.active.state & SDL_APPACTIVE) && (event.active.gain == 0))
if(!myPauseFlag)
handleEvent(Event::Pause, 1);
break; // SDL_ACTIVEEVENT
case SDL_QUIT:
handleEvent(Event::Quit, 1);
break; // SDL_QUIT
case SDL_VIDEOEXPOSE:
myOSystem->frameBuffer().refresh();
break; // SDL_VIDEOEXPOSE
}
// FIXME - joystick stuff goes here
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -107,7 +210,7 @@ void EventHandler::handleKeyEvent(SDLKey key, SDLMod mod, uInt8 state)
// Handle keys here that are accessible no matter which mode we're in
// Toggle menu mode
if(key == SDLK_TAB && state == 1 && !myPauseFlag)
if(key == SDLK_TAB && state == 1 && !myPauseFlag) // FIXME - add remappable 'enter menu mode key here'
{
if(myState == S_EMULATE)
{
@ -132,13 +235,72 @@ void EventHandler::handleKeyEvent(SDLKey key, SDLMod mod, uInt8 state)
switch(myState)
{
case S_EMULATE:
// if(mod & KMOD_ALT && state)
// handleEvent(myAltKeyTable[key], state);
// else if(mod & KMOD_CTRL && state)
// handleEvent(myCtrlKeyTable[key], state);
// else
handleEvent(myKeyTable[key], state);
break;
// An attempt to speed up event processing
// All SDL-specific event actions are accessed by either
// Control or Alt keys. So we quickly check for those.
if(mod & KMOD_ALT && state)
{
switch(int(key))
{
case SDLK_LEFTBRACKET:
myOSystem->sound().adjustVolume(-1);
break;
case SDLK_RIGHTBRACKET:
myOSystem->sound().adjustVolume(1);
break;
}
// FIXME - alt developer stuff goes here
}
else if(mod & KMOD_CTRL && state)
{
switch(int(key))
{
case SDLK_0: // Ctrl-0 sets the mouse to paddle 0
setPaddleMode(0);
break;
case SDLK_1: // Ctrl-1 sets the mouse to paddle 1
setPaddleMode(1);
break;
case SDLK_2: // Ctrl-2 sets the mouse to paddle 2
setPaddleMode(2);
break;
case SDLK_3: // Ctrl-3 sets the mouse to paddle 3
setPaddleMode(3);
break;
case SDLK_f: // Ctrl-f toggles NTSC/PAL mode
myOSystem->console().toggleFormat();
myOSystem->frameBuffer().setupPalette();
break;
case SDLK_p: // Ctrl-p toggles different palettes
myOSystem->console().togglePalette();
myOSystem->frameBuffer().setupPalette();
break;
// FIXME - Ctrl developer support goes here
case SDLK_s: // Ctrl-s saves properties to a file
// Attempt to merge with propertiesSet
if(myOSystem->settings().getBool("mergeprops"))
myOSystem->console().saveProperties(myOSystem->propertiesOutputFilename(), true);
else // Save to file in base directory
{
string newPropertiesFile = myOSystem->baseDir() + "/" + \
myOSystem->console().properties().get("Cartridge.Name") + ".pro";
myOSystem->console().saveProperties(newPropertiesFile);
}
break;
}
}
else
handleEvent(myKeyTable[key], state);
break; // S_EMULATE
case S_MENU:
myOSystem->menu().handleKeyEvent(key, mod, state);
@ -483,6 +645,12 @@ void EventHandler::setDefaultKeymap()
#ifndef MAC_OSX
myKeyTable[ SDLK_ESCAPE ] = Event::ExitGame;
#endif
// Iterate through the keymap table and create a colon-separated list
ostringstream keybuf;
for(uInt32 i = 0; i < 256; ++i)
keybuf << myKeyTable[i] << ":";
myOSystem->settings().setString("keymap", keybuf.str());
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -621,3 +789,15 @@ void EventHandler::takeSnapshot()
myOSystem->frameBuffer().showMessage("Snapshots unsupported");
#endif
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EventHandler::setPaddleMode(Int8 num)
{
myPaddleMode = num;
ostringstream buf;
buf << "Mouse is paddle " << num;
myOSystem->frameBuffer().showMessage(buf.str());
myOSystem->settings().setInt("paddle", myPaddleMode);
}

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: EventHandler.hxx,v 1.19 2005-03-14 04:08:14 stephena Exp $
// $Id: EventHandler.hxx,v 1.20 2005-04-03 19:37:32 stephena Exp $
//============================================================================
#ifndef EVENTHANDLER_HXX
@ -50,7 +50,7 @@ enum MouseButton {
mapping can take place.
@author Stephen Anthony
@version $Id: EventHandler.hxx,v 1.19 2005-03-14 04:08:14 stephena Exp $
@version $Id: EventHandler.hxx,v 1.20 2005-04-03 19:37:32 stephena Exp $
*/
class EventHandler
{
@ -75,6 +75,12 @@ class EventHandler
*/
Event* event();
/**
Collects and dispatches any pending events. This method should be
called regularly (at X times per second, where X is the game framerate).
*/
void poll();
/**
Returns the current state of the EventHandler
@ -89,6 +95,26 @@ class EventHandler
*/
void reset(State state);
/**
This method indicates whether a pause event has been received.
*/
inline bool doPause() { return myPauseFlag; }
/**
This method indicates whether a exit game event has been received.
*/
inline bool doExitGame() { return myExitGameFlag; }
/**
This method indicates whether a quit event has been received.
*/
inline bool doQuit() { return myQuitFlag; }
void getKeymapArray(Event::Type** array, uInt32* size);
void getJoymapArray(Event::Type** array, uInt32* size);
private:
/**
Send an event directly to the event handler.
These events cannot be remapped.
@ -130,26 +156,14 @@ class EventHandler
*/
void sendJoyEvent(StellaEvent::JoyStick stick, StellaEvent::JoyCode code,
Int32 state);
/**
This method indicates whether a pause event has been received.
*/
inline bool doPause() { return myPauseFlag; }
/**
This method indicates whether a exit game event has been received.
Sets the mouse to act as paddle 'which'
@param which The paddle which the mouse should emulate
*/
inline bool doExitGame() { return myExitGameFlag; }
void setPaddleMode(Int8 which);
/**
This method indicates whether a quit event has been received.
*/
inline bool doQuit() { return myQuitFlag; }
void getKeymapArray(Event::Type** array, uInt32* size);
void getJoymapArray(Event::Type** array, uInt32* size);
private:
void setKeymap();
void setJoymap();
void setDefaultKeymap();
@ -199,6 +213,12 @@ class EventHandler
// Indicates whether to quit the emulator
bool myQuitFlag;
// Indicates whether the mouse cursor is grabbed
bool myGrabMouseFlag;
// Indicates which paddle the mouse currently emulates
Int8 myPaddleMode;
// The current keymap in string form
string myKeymapString;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: FrameBuffer.hxx,v 1.23 2005-03-28 00:04:54 stephena Exp $
// $Id: FrameBuffer.hxx,v 1.24 2005-04-03 19:37:32 stephena Exp $
//============================================================================
#ifndef FRAMEBUFFER_HXX
@ -41,7 +41,7 @@ class OSystem;
All GUI elements (ala ScummVM) are drawn here as well.
@author Stephen Anthony
@version $Id: FrameBuffer.hxx,v 1.23 2005-03-28 00:04:54 stephena Exp $
@version $Id: FrameBuffer.hxx,v 1.24 2005-04-03 19:37:32 stephena Exp $
*/
class FrameBuffer
{
@ -106,7 +106,7 @@ class FrameBuffer
@return The current width
*/
// inline const uInt32 imageWidth() { return myImageDim.w; }
inline const uInt32 imageWidth() { return myImageDim.w; }
/**
Returns the current height of the framebuffer image.
@ -114,7 +114,7 @@ class FrameBuffer
@return The current height
*/
// inline const uInt32 imageHeight() { return myImageDim.h; }
inline const uInt32 imageHeight() { return myImageDim.h; }
/**
Sets the pause status. While pause is selected, the