Fixed grabmouse and show cursor to match Stella 3.9.3 functionality.

Added 'hidecursor' commandline option, to always disable showing the
mouse cursor (useful for fullscreen-only frontends).


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2908 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2014-06-04 16:01:45 +00:00
parent f7f80ff05b
commit 80bbfadb4c
7 changed files with 62 additions and 28 deletions

View File

@ -20,6 +20,10 @@
context menu item to the debugger TIA output area. This saves the context menu item to the debugger TIA output area. This saves the
current TIA image to a PNG file. current TIA image to a PNG file.
* Added 'hidecursor' commandline option, which allows to completely
disable showing the mouse cursor (useful on systems that don't have
a mouse).
* Removed 'uipalette' option, as the original palette is no longer * Removed 'uipalette' option, as the original palette is no longer
supported. supported.

View File

@ -1953,11 +1953,6 @@
and always allows all 4 directions.</td> and always allows all 4 directions.</td>
</tr> </tr>
<tr>
<td><pre>FIXSDL-grabmouse &lt;1|0&gt;</pre></td>
<td>Keeps the mouse in the game window in emulation mode.</td>
</tr>
<tr> <tr>
<td><pre>-usemouse &lt;always|analog|never&gt;</pre></td> <td><pre>-usemouse &lt;always|analog|never&gt;</pre></td>
<td>Use mouse as a controller as specified by ROM properties in specific case. <td>Use mouse as a controller as specified by ROM properties in specific case.
@ -1965,6 +1960,16 @@
(paddles, trackball, etc).</td> (paddles, trackball, etc).</td>
</tr> </tr>
<tr>
<td><pre>-grabmouse &lt;1|0&gt;</pre></td>
<td>Locks the mouse cursor in the game window in emulation mode.</td>
</tr>
<tr>
<td><pre>-hidecursor &lt;1|0&gt;</pre></td>
<td>Always hide the mouse cursor, or show it when appropriate.</td>
</tr>
<tr> <tr>
<td><pre>-dsense &lt;number&gt;</pre></td> <td><pre>-dsense &lt;number&gt;</pre></td>
<td>Sensitivity for emulation of paddles when using a digital device <td>Sensitivity for emulation of paddles when using a digital device

View File

@ -108,8 +108,9 @@ bool FrameBufferSDL2::setVideoMode(const string& title, const VideoMode& mode,
SDL_DestroyRenderer(myRenderer); SDL_DestroyRenderer(myRenderer);
myRenderer = NULL; myRenderer = NULL;
} }
// Don't re-create the window if its size hasn't changed, as it is
// wasteful, and causing flashing in fullscreen mode // Don't re-create the window if its size hasn't changed, as it's not
// necessary, and causes flashing in fullscreen mode
if(myWindow) if(myWindow)
{ {
int w, h; int w, h;
@ -120,8 +121,12 @@ bool FrameBufferSDL2::setVideoMode(const string& title, const VideoMode& mode,
myWindow = NULL; myWindow = NULL;
} }
} }
if(myWindow)
if(!myWindow) {
// Even though window size stayed the same, the title may have changed
SDL_SetWindowTitle(myWindow, title.c_str());
}
else
{ {
int pos = myOSystem.settings().getBool("center") int pos = myOSystem.settings().getBool("center")
? SDL_WINDOWPOS_CENTERED : SDL_WINDOWPOS_UNDEFINED; ? SDL_WINDOWPOS_CENTERED : SDL_WINDOWPOS_UNDEFINED;
@ -191,13 +196,13 @@ void FrameBufferSDL2::invalidate()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBufferSDL2::showCursor(bool show) void FrameBufferSDL2::showCursor(bool show)
{ {
//FIXSDL SDL_ShowCursor(show ? SDL_ENABLE : SDL_DISABLE); SDL_ShowCursor(show ? SDL_ENABLE : SDL_DISABLE);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBufferSDL2::grabMouse(bool grab) void FrameBufferSDL2::grabMouse(bool grab)
{ {
//FIXSDL SDL_WM_GrabInput(grab ? SDL_GRAB_ON : SDL_GRAB_OFF); SDL_SetRelativeMouseMode(grab ? SDL_TRUE : SDL_FALSE);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -535,12 +535,14 @@ void FrameBuffer::refresh()
case EventHandler::S_PAUSE: case EventHandler::S_PAUSE:
invalidate(); invalidate();
drawTIA(); drawTIA();
#if 0 // FIXME: eliminate stuttering in TIA mode; do we really need this?
if(isDoubleBuffered()) if(isDoubleBuffered())
{ {
postFrameUpdate(); postFrameUpdate();
invalidate(); invalidate();
drawTIA(); drawTIA();
} }
#endif
break; break;
case EventHandler::S_MENU: case EventHandler::S_MENU:
@ -731,13 +733,12 @@ bool FrameBuffer::changeWindowedVidMode(int direction)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBuffer::setCursorState() void FrameBuffer::setCursorState()
{ {
// Always grab mouse in fullscreen or during emulation (if enabled), // Always grab mouse in emulation (if enabled),
// and don't show the cursor during emulation // and don't show the cursor during emulation (if enabled)
bool emulation = bool emulation =
myOSystem.eventHandler().state() == EventHandler::S_EMULATE; myOSystem.eventHandler().state() == EventHandler::S_EMULATE;
grabMouse(fullScreen() || grabMouse(emulation && myOSystem.settings().getBool("grabmouse"));
(emulation && myOSystem.settings().getBool("grabmouse"))); showCursor(!(emulation || myOSystem.settings().getBool("hidecursor")));
showCursor(!emulation);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -42,7 +42,6 @@ Settings::Settings(OSystem& osystem)
setInternal("vsync", "true"); setInternal("vsync", "true");
setInternal("fullscreen", "false"); setInternal("fullscreen", "false");
setInternal("center", "false"); setInternal("center", "false");
setInternal("grabmouse", "true");
setInternal("palette", "standard"); setInternal("palette", "standard");
setInternal("colorloss", "true"); setInternal("colorloss", "true");
setInternal("timing", "sleep"); setInternal("timing", "sleep");
@ -84,6 +83,8 @@ Settings::Settings(OSystem& osystem)
setInternal("joydeadzone", "13"); setInternal("joydeadzone", "13");
setInternal("joyallow4", "false"); setInternal("joyallow4", "false");
setInternal("usemouse", "analog"); setInternal("usemouse", "analog");
setInternal("grabmouse", "true");
setInternal("hidecursor", "false");
setInternal("dsense", "5"); setInternal("dsense", "5");
setInternal("msense", "7"); setInternal("msense", "7");
setInternal("saport", "lr"); setInternal("saport", "lr");
@ -391,10 +392,11 @@ void Settings::usage()
<< " -logtoconsole <1|0> Log output to console/commandline\n" << " -logtoconsole <1|0> Log output to console/commandline\n"
<< " -joydeadzone <number> Sets 'deadzone' area for analog joysticks (0-29)\n" << " -joydeadzone <number> Sets 'deadzone' area for analog joysticks (0-29)\n"
<< " -joyallow4 <1|0> Allow all 4 directions on a joystick to be pressed simultaneously\n" << " -joyallow4 <1|0> Allow all 4 directions on a joystick to be pressed simultaneously\n"
<< "FIXSDL -grabmouse <1|0> Keeps the mouse in the game window\n"
<< " -usemouse <always|\n" << " -usemouse <always|\n"
<< " analog|\n" << " analog|\n"
<< " never> Use mouse as a controller as specified by ROM properties in given mode(see manual)\n" << " never> Use mouse as a controller as specified by ROM properties in given mode(see manual)\n"
<< " -grabmouse <1|0> Locks the mouse cursor in the TIA window\n"
<< " -hidecursor <1|0> Always hide the cursor, or show it when appropriate\n"
<< " -dsense <number> Sensitivity of digital emulated paddle movement (1-10)\n" << " -dsense <number> Sensitivity of digital emulated paddle movement (1-10)\n"
<< " -msense <number> Sensitivity of mouse emulated paddle movement (1-15)\n" << " -msense <number> Sensitivity of mouse emulated paddle movement (1-15)\n"
<< " -saport <lr|rl> How to assign virtual ports to multiple Stelladaptor/2600-daptors\n" << " -saport <lr|rl> How to assign virtual ports to multiple Stelladaptor/2600-daptors\n"

View File

@ -198,6 +198,15 @@ void InputDialog::addDevicePortTab(const GUI::Font& font)
myGrabMouse->clearFlags(WIDGET_ENABLED); myGrabMouse->clearFlags(WIDGET_ENABLED);
#endif #endif
// Hide mouse cursor
ypos += lineHeight + 4;
myHideCursor = new CheckboxWidget(myTab, font, xpos, ypos,
"Always hide mouse cursor");
wid.push_back(myHideCursor);
#ifndef WINDOWED_SUPPORT
myHideCursor->clearFlags(WIDGET_ENABLED);
#endif
// Add items for virtual device ports // Add items for virtual device ports
addToFocusList(wid, myTab, tabID); addToFocusList(wid, myTab, tabID);
} }
@ -216,9 +225,6 @@ void InputDialog::loadConfig()
myDeadzone->setValue(instance().settings().getInt("joydeadzone")); myDeadzone->setValue(instance().settings().getInt("joydeadzone"));
myDeadzoneLabel->setValue(Joystick::deadzone()); myDeadzoneLabel->setValue(Joystick::deadzone());
// Grab mouse
myGrabMouse->setState(instance().settings().getBool("grabmouse"));
// Paddle speed (digital and mouse) // Paddle speed (digital and mouse)
myDPaddleSpeed->setValue(instance().settings().getInt("dsense")); myDPaddleSpeed->setValue(instance().settings().getInt("dsense"));
myDPaddleLabel->setLabel(instance().settings().getString("dsense")); myDPaddleLabel->setLabel(instance().settings().getString("dsense"));
@ -231,6 +237,12 @@ void InputDialog::loadConfig()
// Allow all 4 joystick directions // Allow all 4 joystick directions
myAllowAll4->setState(instance().settings().getBool("joyallow4")); myAllowAll4->setState(instance().settings().getBool("joyallow4"));
// Grab mouse
myGrabMouse->setState(instance().settings().getBool("grabmouse"));
// Hide cursor
myHideCursor->setState(instance().settings().getBool("hidecursor"));
myTab->loadConfig(); myTab->loadConfig();
} }
@ -250,10 +262,6 @@ void InputDialog::saveConfig()
instance().settings().setValue("joydeadzone", deadzone); instance().settings().setValue("joydeadzone", deadzone);
Joystick::setDeadZone(deadzone); Joystick::setDeadZone(deadzone);
// Grab mouse
instance().settings().setValue("grabmouse", myGrabMouse->getState());
instance().frameBuffer().setCursorState();
// Paddle speed (digital and mouse) // Paddle speed (digital and mouse)
int sensitivity = myDPaddleSpeed->getValue(); int sensitivity = myDPaddleSpeed->getValue();
instance().settings().setValue("dsense", sensitivity); instance().settings().setValue("dsense", sensitivity);
@ -269,6 +277,11 @@ void InputDialog::saveConfig()
bool allowall4 = myAllowAll4->getState(); bool allowall4 = myAllowAll4->getState();
instance().settings().setValue("joyallow4", allowall4); instance().settings().setValue("joyallow4", allowall4);
instance().eventHandler().allowAllDirections(allowall4); instance().eventHandler().allowAllDirections(allowall4);
// Grab mouse and hide cursor
instance().settings().setValue("grabmouse", myGrabMouse->getState());
instance().settings().setValue("hidecursor", myHideCursor->getState());
instance().frameBuffer().setCursorState();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -296,9 +309,6 @@ void InputDialog::setDefaults()
myDeadzone->setValue(0); myDeadzone->setValue(0);
myDeadzoneLabel->setValue(3200); myDeadzoneLabel->setValue(3200);
// Grab mouse
myGrabMouse->setState(true);
// Paddle speed (digital and mouse) // Paddle speed (digital and mouse)
myDPaddleSpeed->setValue(5); myDPaddleSpeed->setValue(5);
myDPaddleLabel->setLabel("5"); myDPaddleLabel->setLabel("5");
@ -311,6 +321,12 @@ void InputDialog::setDefaults()
// Allow all 4 joystick directions // Allow all 4 joystick directions
myAllowAll4->setState(false); myAllowAll4->setState(false);
// Grab mouse
myGrabMouse->setState(true);
// Hide cursor
myHideCursor->setState(false);
break; break;
} }

View File

@ -79,6 +79,7 @@ class InputDialog : public Dialog
StaticTextWidget* myMPaddleLabel; StaticTextWidget* myMPaddleLabel;
CheckboxWidget* myAllowAll4; CheckboxWidget* myAllowAll4;
CheckboxWidget* myGrabMouse; CheckboxWidget* myGrabMouse;
CheckboxWidget* myHideCursor;
}; };
#endif #endif