allow repeat for selected keyboard events

This commit is contained in:
thrust26 2019-06-01 22:29:18 +02:00
parent 1c5fa872c0
commit 288eb5b1e5
7 changed files with 72 additions and 71 deletions

View File

@ -71,10 +71,10 @@ void EventHandlerSDL2::pollEvent()
case SDL_KEYUP: case SDL_KEYUP:
case SDL_KEYDOWN: case SDL_KEYDOWN:
{ {
if(!myEvent.key.repeat)
handleKeyEvent(StellaKey(myEvent.key.keysym.scancode), handleKeyEvent(StellaKey(myEvent.key.keysym.scancode),
StellaMod(myEvent.key.keysym.mod), StellaMod(myEvent.key.keysym.mod),
myEvent.key.type == SDL_KEYDOWN); myEvent.key.type == SDL_KEYDOWN,
myEvent.key.repeat);
break; break;
} }

View File

@ -317,7 +317,7 @@ bool PhysicalKeyboardHandler::addMapping(Event::Type event, EventMode mode,
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void PhysicalKeyboardHandler::handleEvent(StellaKey key, StellaMod mod, bool pressed) void PhysicalKeyboardHandler::handleEvent(StellaKey key, StellaMod mod, bool pressed, bool repeat)
{ {
// Swallow KBDK_TAB under certain conditions // Swallow KBDK_TAB under certain conditions
// See commments on 'myAltKeyCounter' for more information // See commments on 'myAltKeyCounter' for more information
@ -353,15 +353,15 @@ void PhysicalKeyboardHandler::handleEvent(StellaKey key, StellaMod mod, bool pre
{ {
case EventHandlerState::EMULATION: case EventHandlerState::EMULATION:
case EventHandlerState::PAUSE: case EventHandlerState::PAUSE:
myHandler.handleEvent(myKeyMap.get(kEmulationMode, key, mod), pressed); myHandler.handleEvent(myKeyMap.get(kEmulationMode, key, mod), pressed, repeat);
break; break;
default: default:
#ifdef GUI_SUPPORT #ifdef GUI_SUPPORT
if (myHandler.hasOverlay()) if (myHandler.hasOverlay())
myHandler.overlay().handleKeyEvent(key, mod, pressed); myHandler.overlay().handleKeyEvent(key, mod, pressed, repeat);
#endif #endif
myHandler.handleEvent(myKeyMap.get(kMenuMode, key, mod), pressed); myHandler.handleEvent(myKeyMap.get(kMenuMode, key, mod), pressed, repeat);
break; break;
} }
} }

View File

@ -54,7 +54,7 @@ class PhysicalKeyboardHandler
bool addMapping(Event::Type event, EventMode mode, StellaKey key, StellaMod mod); bool addMapping(Event::Type event, EventMode mode, StellaKey key, StellaMod mod);
/** Handle a physical keyboard event. */ /** Handle a physical keyboard event. */
void handleEvent(StellaKey key, StellaMod mod, bool pressed); void handleEvent(StellaKey key, StellaMod mod, bool pressed, bool repeat);
Event::Type eventForKey(EventMode mode, StellaKey key, StellaMod mod) const { Event::Type eventForKey(EventMode mode, StellaKey key, StellaMod mod) const {
return myKeyMap.get(mode, key, mod); return myKeyMap.get(mode, key, mod);

View File

@ -333,7 +333,7 @@ void EventHandler::handleSystemEvent(SystemEvent e, int, int)
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EventHandler::handleEvent(Event::Type event, bool pressed) void EventHandler::handleEvent(Event::Type event, bool pressed, bool repeat)
{ {
// Take care of special events that aren't part of the emulation core // Take care of special events that aren't part of the emulation core
// or need to be preprocessed before passing them on // or need to be preprocessed before passing them on
@ -383,11 +383,11 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
case Event::Fry: case Event::Fry:
/*if(myPKeyHandler->useModKeys())*/ myFryingFlag = pressed; if (!repeat) myFryingFlag = pressed;
return; return;
case Event::ReloadConsole: case Event::ReloadConsole:
if (pressed) myOSystem.reloadConsole(); if (pressed && !repeat) myOSystem.reloadConsole();
return; return;
case Event::VolumeDecrease: case Event::VolumeDecrease:
@ -399,7 +399,7 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::SoundToggle: case Event::SoundToggle:
if(pressed) myOSystem.sound().toggleMute(); if(pressed && !repeat) myOSystem.sound().toggleMute();
return; return;
case Event::VidmodeDecrease: case Event::VidmodeDecrease:
@ -411,31 +411,31 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::ToggleFullScreen: case Event::ToggleFullScreen:
if (pressed) myOSystem.frameBuffer().toggleFullscreen(); if (pressed && !repeat) myOSystem.frameBuffer().toggleFullscreen();
return; return;
case Event::VidmodeStd: case Event::VidmodeStd:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::OFF); if (pressed && !repeat) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::OFF);
return; return;
case Event::VidmodeRGB: case Event::VidmodeRGB:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::RGB); if (pressed && !repeat) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::RGB);
return; return;
case Event::VidmodeSVideo: case Event::VidmodeSVideo:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::SVIDEO); if (pressed && !repeat) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::SVIDEO);
return; return;
case Event::VidModeComposite: case Event::VidModeComposite:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::COMPOSITE); if (pressed && !repeat) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::COMPOSITE);
return; return;
case Event::VidModeBad: case Event::VidModeBad:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::BAD); if (pressed && !repeat) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::BAD);
return; return;
case Event::VidModeCustom: case Event::VidModeCustom:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::CUSTOM); if (pressed && !repeat) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::CUSTOM);
return; return;
case Event::ScanlinesDecrease: case Event::ScanlinesDecrease:
@ -491,19 +491,19 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::TogglePhosphor: case Event::TogglePhosphor:
if (pressed) myOSystem.console().togglePhosphor(); if (pressed && !repeat) myOSystem.console().togglePhosphor();
return; return;
case Event::ToggleColorLoss: case Event::ToggleColorLoss:
if (pressed) myOSystem.console().toggleColorLoss(); if (pressed && !repeat) myOSystem.console().toggleColorLoss();
return; return;
case Event::TogglePalette: case Event::TogglePalette:
if (pressed) myOSystem.console().togglePalette(); if (pressed && !repeat) myOSystem.console().togglePalette();
return; return;
case Event::ToggleJitter: case Event::ToggleJitter:
if (pressed) myOSystem.console().toggleJitter(); if (pressed && !repeat) myOSystem.console().toggleJitter();
return; return;
case Event::ToggleFrameStats: case Event::ToggleFrameStats:
@ -511,25 +511,25 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::ToggleTimeMachine: case Event::ToggleTimeMachine:
if (pressed) myOSystem.state().toggleTimeMachine(); if (pressed && !repeat) myOSystem.state().toggleTimeMachine();
return; return;
#ifdef PNG_SUPPORT #ifdef PNG_SUPPORT
case Event::ToggleContSnapshots: case Event::ToggleContSnapshots:
if (pressed) myOSystem.png().toggleContinuousSnapshots(false); if (pressed && !repeat) myOSystem.png().toggleContinuousSnapshots(false);
return; return;
case Event::ToggleContSnapshotsFrame: case Event::ToggleContSnapshotsFrame:
if (pressed) myOSystem.png().toggleContinuousSnapshots(true); if (pressed && !repeat) myOSystem.png().toggleContinuousSnapshots(true);
return; return;
#endif #endif
case Event::HandleMouseControl: case Event::HandleMouseControl:
if (pressed) handleMouseControl(); if (pressed && !repeat) handleMouseControl();
return; return;
case Event::ToggleSAPortOrder: case Event::ToggleSAPortOrder:
if (pressed) toggleSAPortOrder(); if (pressed && !repeat) toggleSAPortOrder();
return; return;
case Event::DecreaseFormat: case Event::DecreaseFormat:
@ -541,7 +541,7 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::ToggleGrabMouse: case Event::ToggleGrabMouse:
if (pressed && !myOSystem.frameBuffer().fullScreen()) if (pressed && !repeat && !myOSystem.frameBuffer().fullScreen())
{ {
myOSystem.frameBuffer().toggleGrabMouse(); myOSystem.frameBuffer().toggleGrabMouse();
myOSystem.frameBuffer().showMessage(myOSystem.frameBuffer().grabMouseEnabled() myOSystem.frameBuffer().showMessage(myOSystem.frameBuffer().grabMouseEnabled()
@ -550,39 +550,39 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::ToggleP0Collision: case Event::ToggleP0Collision:
if (pressed) myOSystem.console().toggleP0Collision(); if (pressed && !repeat) myOSystem.console().toggleP0Collision();
return; return;
case Event::ToggleP0Bit: case Event::ToggleP0Bit:
if (pressed) myOSystem.console().toggleP0Bit(); if (pressed && !repeat) myOSystem.console().toggleP0Bit();
return; return;
case Event::ToggleP1Collision: case Event::ToggleP1Collision:
if (pressed) myOSystem.console().toggleP1Collision(); if (pressed && !repeat) myOSystem.console().toggleP1Collision();
return; return;
case Event::ToggleP1Bit: case Event::ToggleP1Bit:
if (pressed) myOSystem.console().toggleP1Bit(); if (pressed && !repeat) myOSystem.console().toggleP1Bit();
return; return;
case Event::ToggleM0Collision: case Event::ToggleM0Collision:
if (pressed) myOSystem.console().toggleM0Collision(); if (pressed && !repeat) myOSystem.console().toggleM0Collision();
return; return;
case Event::ToggleM0Bit: case Event::ToggleM0Bit:
if (pressed) myOSystem.console().toggleM0Bit(); if (pressed && !repeat) myOSystem.console().toggleM0Bit();
return; return;
case Event::ToggleM1Collision: case Event::ToggleM1Collision:
if (pressed) myOSystem.console().toggleM1Collision(); if (pressed && !repeat) myOSystem.console().toggleM1Collision();
return; return;
case Event::ToggleM1Bit: case Event::ToggleM1Bit:
if (pressed) myOSystem.console().toggleM1Bit(); if (pressed && !repeat) myOSystem.console().toggleM1Bit();
return; return;
case Event::ToggleBLCollision: case Event::ToggleBLCollision:
if (pressed) myOSystem.console().toggleBLCollision(); if (pressed && !repeat) myOSystem.console().toggleBLCollision();
return; return;
case Event::ToggleBLBit: case Event::ToggleBLBit:
@ -590,11 +590,11 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::TogglePFCollision: case Event::TogglePFCollision:
if (pressed) myOSystem.console().togglePFCollision(); if (pressed && !repeat) myOSystem.console().togglePFCollision();
return; return;
case Event::TogglePFBit: case Event::TogglePFBit:
if (pressed) myOSystem.console().togglePFBit(); if (pressed && !repeat) myOSystem.console().togglePFBit();
return; return;
case Event::ToggleFixedColors: case Event::ToggleFixedColors:
@ -602,19 +602,19 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::ToggleCollisions: case Event::ToggleCollisions:
if (pressed) myOSystem.console().toggleCollisions(); if (pressed && !repeat) myOSystem.console().toggleCollisions();
return; return;
case Event::ToggleBits: case Event::ToggleBits:
if (pressed) myOSystem.console().toggleBits(); if (pressed && !repeat) myOSystem.console().toggleBits();
return; return;
case Event::SaveState: case Event::SaveState:
if(pressed) myOSystem.state().saveState(); if(pressed && !repeat) myOSystem.state().saveState();
return; return;
case Event::SaveAllStates: case Event::SaveAllStates:
if (pressed) if (pressed && !repeat)
myOSystem.frameBuffer().showMessage(myOSystem.state().rewindManager().saveAllStates()); myOSystem.frameBuffer().showMessage(myOSystem.state().rewindManager().saveAllStates());
return; return;
@ -623,11 +623,11 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::LoadState: case Event::LoadState:
if(pressed) myOSystem.state().loadState(); if(pressed && !repeat) myOSystem.state().loadState();
return; return;
case Event::LoadAllStates: case Event::LoadAllStates:
if (pressed) if (pressed && !repeat)
myOSystem.frameBuffer().showMessage(myOSystem.state().rewindManager().loadAllStates()); myOSystem.frameBuffer().showMessage(myOSystem.state().rewindManager().loadAllStates());
return; return;
@ -664,7 +664,7 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::TakeSnapshot: case Event::TakeSnapshot:
if(pressed) myOSystem.frameBuffer().tiaSurface().saveSnapShot(); if(pressed && !repeat) myOSystem.frameBuffer().tiaSurface().saveSnapShot();
return; return;
case Event::ExitMode: case Event::ExitMode:
@ -673,25 +673,25 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
switch (myState) switch (myState)
{ {
case EventHandlerState::PAUSE: case EventHandlerState::PAUSE:
if (pressed) changeStateByEvent(Event::TogglePauseMode); if (pressed && !repeat) changeStateByEvent(Event::TogglePauseMode);
return; return;
case EventHandlerState::CMDMENU: case EventHandlerState::CMDMENU:
if (pressed) changeStateByEvent(Event::CmdMenuMode); if (pressed && !repeat) changeStateByEvent(Event::CmdMenuMode);
return; return;
case EventHandlerState::TIMEMACHINE: case EventHandlerState::TIMEMACHINE:
if (pressed) changeStateByEvent(Event::TimeMachineMode); if (pressed && !repeat) changeStateByEvent(Event::TimeMachineMode);
return; return;
#if 0 // FIXME - exits ROM too, when it should just go back to ROM #if 0 // FIXME - exits ROM too, when it should just go back to ROM
case EventHandlerState::DEBUGGER: case EventHandlerState::DEBUGGER:
if (pressed) changeStateByEvent(Event::DebuggerMode); if (pressed && !repeat) changeStateByEvent(Event::DebuggerMode);
return; return;
#endif #endif
case EventHandlerState::EMULATION: case EventHandlerState::EMULATION:
if (pressed) if (pressed && !repeat)
{ {
// Go back to the launcher, or immediately quit // Go back to the launcher, or immediately quit
if (myOSystem.settings().getBool("exitlauncher") || if (myOSystem.settings().getBool("exitlauncher") ||
@ -707,7 +707,7 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
} }
case Event::Quit: case Event::Quit:
if(pressed) if(pressed && !repeat)
{ {
saveKeyMapping(); saveKeyMapping();
saveJoyMapping(); saveJoyMapping();
@ -716,7 +716,7 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::StartPauseMode: case Event::StartPauseMode:
if (pressed && myState == EventHandlerState::EMULATION) if (pressed && !repeat && myState == EventHandlerState::EMULATION)
setState(EventHandlerState::PAUSE); setState(EventHandlerState::PAUSE);
return; return;
@ -741,28 +741,28 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
case Event::Combo16: case Event::Combo16:
for(int i = 0, combo = event - Event::Combo1; i < EVENTS_PER_COMBO; ++i) for(int i = 0, combo = event - Event::Combo1; i < EVENTS_PER_COMBO; ++i)
if(myComboTable[combo][i] != Event::NoType) if(myComboTable[combo][i] != Event::NoType)
handleEvent(myComboTable[combo][i], pressed); handleEvent(myComboTable[combo][i], pressed, repeat);
return; return;
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
// Events which relate to switches() // Events which relate to switches()
case Event::ConsoleColor: case Event::ConsoleColor:
if(pressed) if(pressed && !repeat)
{ {
myEvent.set(Event::ConsoleBlackWhite, 0); myEvent.set(Event::ConsoleBlackWhite, 0);
myOSystem.frameBuffer().showMessage(myIs7800 ? "Pause released" : "Color Mode"); myOSystem.frameBuffer().showMessage(myIs7800 ? "Pause released" : "Color Mode");
} }
break; break;
case Event::ConsoleBlackWhite: case Event::ConsoleBlackWhite:
if(pressed) if(pressed && !repeat)
{ {
myEvent.set(Event::ConsoleColor, 0); myEvent.set(Event::ConsoleColor, 0);
myOSystem.frameBuffer().showMessage(myIs7800 ? "Pause pushed" : "B/W Mode"); myOSystem.frameBuffer().showMessage(myIs7800 ? "Pause pushed" : "B/W Mode");
} }
break; break;
case Event::ConsoleColorToggle: case Event::ConsoleColorToggle:
if(pressed) if(pressed && !repeat)
{ {
if(myOSystem.console().switches().tvColor()) if(myOSystem.console().switches().tvColor())
{ {
@ -781,7 +781,7 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::Console7800Pause: case Event::Console7800Pause:
if(pressed) if(pressed && !repeat)
{ {
myEvent.set(Event::ConsoleBlackWhite, 0); myEvent.set(Event::ConsoleBlackWhite, 0);
myEvent.set(Event::ConsoleColor, 0); myEvent.set(Event::ConsoleColor, 0);
@ -791,21 +791,21 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::ConsoleLeftDiffA: case Event::ConsoleLeftDiffA:
if(pressed) if(pressed && !repeat)
{ {
myEvent.set(Event::ConsoleLeftDiffB, 0); myEvent.set(Event::ConsoleLeftDiffB, 0);
myOSystem.frameBuffer().showMessage(GUI::LEFT_DIFFICULTY + " A"); myOSystem.frameBuffer().showMessage(GUI::LEFT_DIFFICULTY + " A");
} }
return; return;
case Event::ConsoleLeftDiffB: case Event::ConsoleLeftDiffB:
if(pressed) if(pressed && !repeat)
{ {
myEvent.set(Event::ConsoleLeftDiffA, 0); myEvent.set(Event::ConsoleLeftDiffA, 0);
myOSystem.frameBuffer().showMessage(GUI::LEFT_DIFFICULTY + " B"); myOSystem.frameBuffer().showMessage(GUI::LEFT_DIFFICULTY + " B");
} }
return; return;
case Event::ConsoleLeftDiffToggle: case Event::ConsoleLeftDiffToggle:
if(pressed) if(pressed && !repeat)
{ {
if(myOSystem.console().switches().leftDifficultyA()) if(myOSystem.console().switches().leftDifficultyA())
{ {
@ -824,21 +824,21 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
return; return;
case Event::ConsoleRightDiffA: case Event::ConsoleRightDiffA:
if(pressed) if(pressed && !repeat)
{ {
myEvent.set(Event::ConsoleRightDiffB, 0); myEvent.set(Event::ConsoleRightDiffB, 0);
myOSystem.frameBuffer().showMessage(GUI::RIGHT_DIFFICULTY + " A"); myOSystem.frameBuffer().showMessage(GUI::RIGHT_DIFFICULTY + " A");
} }
return; return;
case Event::ConsoleRightDiffB: case Event::ConsoleRightDiffB:
if(pressed) if(pressed && !repeat)
{ {
myEvent.set(Event::ConsoleRightDiffA, 0); myEvent.set(Event::ConsoleRightDiffA, 0);
myOSystem.frameBuffer().showMessage(GUI::RIGHT_DIFFICULTY + " B"); myOSystem.frameBuffer().showMessage(GUI::RIGHT_DIFFICULTY + " B");
} }
return; return;
case Event::ConsoleRightDiffToggle: case Event::ConsoleRightDiffToggle:
if(pressed) if(pressed && !repeat)
{ {
if(myOSystem.console().switches().rightDifficultyA()) if(myOSystem.console().switches().rightDifficultyA())
{ {

View File

@ -139,8 +139,9 @@ class EventHandler
@param type The event @param type The event
@param pressed Pressed (true) or released (false) @param pressed Pressed (true) or released (false)
@param repeat Repeated key (true) or first press/release (false)
*/ */
void handleEvent(Event::Type type, bool pressed = true); void handleEvent(Event::Type type, bool pressed = true, bool repeat = false);
/** /**
Handle events that must be processed each time a new console is Handle events that must be processed each time a new console is
@ -318,8 +319,8 @@ class EventHandler
void handleTextEvent(char text); void handleTextEvent(char text);
void handleMouseMotionEvent(int x, int y, int xrel, int yrel); void handleMouseMotionEvent(int x, int y, int xrel, int yrel);
void handleMouseButtonEvent(MouseButton b, bool pressed, int x, int y); void handleMouseButtonEvent(MouseButton b, bool pressed, int x, int y);
void handleKeyEvent(StellaKey key, StellaMod mod, bool pressed) { void handleKeyEvent(StellaKey key, StellaMod mod, bool pressed, bool repeat) {
myPKeyHandler->handleEvent(key, mod, pressed); myPKeyHandler->handleEvent(key, mod, pressed, repeat);
} }
void handleJoyBtnEvent(int stick, int button, bool pressed) { void handleJoyBtnEvent(int stick, int button, bool pressed) {
myPJoyHandler->handleBtnEvent(stick, button, pressed); myPJoyHandler->handleBtnEvent(stick, button, pressed);

View File

@ -177,7 +177,7 @@ void DialogContainer::handleTextEvent(char text)
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void DialogContainer::handleKeyEvent(StellaKey key, StellaMod mod, bool pressed) void DialogContainer::handleKeyEvent(StellaKey key, StellaMod mod, bool pressed, bool repeat)
{ {
if(myDialogStack.empty()) if(myDialogStack.empty())
return; return;

View File

@ -72,7 +72,7 @@ class DialogContainer
@param mod Modifiers @param mod Modifiers
@param pressed Pressed (true) or released (false) @param pressed Pressed (true) or released (false)
*/ */
void handleKeyEvent(StellaKey key, StellaMod mod, bool pressed); void handleKeyEvent(StellaKey key, StellaMod mod, bool pressed, bool repeat);
/** /**
Handle a mouse motion event. Handle a mouse motion event.