diff --git a/src/emucore/EventHandler.cxx b/src/emucore/EventHandler.cxx index aa0ad1bce..94a9b51b3 100644 --- a/src/emucore/EventHandler.cxx +++ b/src/emucore/EventHandler.cxx @@ -38,6 +38,7 @@ #include "StateManager.hxx" #include "RewindManager.hxx" #include "TimerManager.hxx" +#include "GlobalKeyHandler.hxx" #ifdef GUI_SUPPORT #include "HighScoresManager.hxx" #endif @@ -87,6 +88,8 @@ EventHandler::~EventHandler() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EventHandler::initialize() { + myGlobalKeyHandler = make_unique(myOSystem); + // Create keyboard handler (to handle all physical keyboard functionality) myPKeyHandler = make_unique(myOSystem, *this); @@ -377,388 +380,6 @@ void EventHandler::handleSystemEvent(SystemEvent e, int, int) } } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -EventHandler::AdjustGroup EventHandler::getAdjustGroup() -{ - if (myAdjustSetting >= AdjustSetting::START_DEBUG_ADJ && myAdjustSetting <= AdjustSetting::END_DEBUG_ADJ) - return AdjustGroup::DEBUG; - if(myAdjustSetting >= AdjustSetting::START_INPUT_ADJ && myAdjustSetting <= AdjustSetting::END_INPUT_ADJ) - return AdjustGroup::INPUT; - - return AdjustGroup::AV; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool EventHandler::isJoystick(const Controller& controller) const -{ - return controller.type() == Controller::Type::Joystick - || controller.type() == Controller::Type::BoosterGrip - || controller.type() == Controller::Type::Genesis; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool EventHandler::isPaddle(const Controller& controller) const -{ - return controller.type() == Controller::Type::Paddles - || controller.type() == Controller::Type::PaddlesIAxDr - || controller.type() == Controller::Type::PaddlesIAxis; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool EventHandler::isTrackball(const Controller& controller) const -{ - return controller.type() == Controller::Type::AmigaMouse - || controller.type() == Controller::Type::AtariMouse - || controller.type() == Controller::Type::TrakBall; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool EventHandler::skipAVSetting() const -{ - const bool isFullScreen = myOSystem.frameBuffer().fullScreen(); - const bool isCustomPalette = - myOSystem.settings().getString("palette") == PaletteHandler::SETTING_CUSTOM; - const bool isCustomFilter = - myOSystem.settings().getInt("tv.filter") == int(NTSCFilter::Preset::CUSTOM); - const bool isSoftwareRenderer = - myOSystem.settings().getString("video") == "software"; - - return (myAdjustSetting == AdjustSetting::OVERSCAN && !isFullScreen) - #ifdef ADAPTABLE_REFRESH_SUPPORT - || (myAdjustSetting == AdjustSetting::ADAPT_REFRESH && !isFullScreen) - #endif - || (myAdjustSetting >= AdjustSetting::PALETTE_PHASE - && myAdjustSetting <= AdjustSetting::PALETTE_BLUE_SHIFT - && !isCustomPalette) - || (myAdjustSetting >= AdjustSetting::NTSC_SHARPNESS - && myAdjustSetting <= AdjustSetting::NTSC_BLEEDING - && !isCustomFilter) - || (myAdjustSetting == AdjustSetting::INTERPOLATION && isSoftwareRenderer); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool EventHandler::skipInputSetting() const -{ - const bool grabMouseAllowed = myOSystem.frameBuffer().grabMouseAllowed(); - const bool analog = myOSystem.console().leftController().isAnalog() - || myOSystem.console().rightController().isAnalog(); - const bool joystick = isJoystick(myOSystem.console().leftController()) - || isJoystick(myOSystem.console().rightController()); - const bool paddle = isPaddle(myOSystem.console().leftController()) - || isPaddle(myOSystem.console().rightController()); - const bool trackball = isTrackball(myOSystem.console().leftController()) - || isTrackball(myOSystem.console().rightController()); - const bool driving = - myOSystem.console().leftController().type() == Controller::Type::Driving - || myOSystem.console().rightController().type() == Controller::Type::Driving; - const bool useMouse = - BSPF::equalsIgnoreCase("always", myOSystem.settings().getString("usemouse")) - || (BSPF::equalsIgnoreCase("analog", myOSystem.settings().getString("usemouse")) - && analog); - const bool stelladapter = myPJoyHandler->hasStelladaptors(); - - return (!grabMouseAllowed && myAdjustSetting == AdjustSetting::GRAB_MOUSE) - || (!joystick - && (myAdjustSetting == AdjustSetting::DEADZONE - || myAdjustSetting == AdjustSetting::FOUR_DIRECTIONS)) - || (!paddle - && (myAdjustSetting == AdjustSetting::ANALOG_DEADZONE - || myAdjustSetting == AdjustSetting::ANALOG_SENSITIVITY - || myAdjustSetting == AdjustSetting::ANALOG_LINEARITY - || myAdjustSetting == AdjustSetting::DEJITTER_AVERAGING - || myAdjustSetting == AdjustSetting::DEJITTER_REACTION - || myAdjustSetting == AdjustSetting::DIGITAL_SENSITIVITY - || myAdjustSetting == AdjustSetting::SWAP_PADDLES - || myAdjustSetting == AdjustSetting::PADDLE_CENTER_X - || myAdjustSetting == AdjustSetting::PADDLE_CENTER_Y)) - || ((!paddle || !useMouse) - && myAdjustSetting == AdjustSetting::PADDLE_SENSITIVITY) - || ((!trackball || !useMouse) - && myAdjustSetting == AdjustSetting::TRACKBALL_SENSITIVITY) - || (!driving - && myAdjustSetting == AdjustSetting::DRIVING_SENSITIVITY) // also affects digital device input sensitivity - || ((!hasMouseControl() || !useMouse) - && myAdjustSetting == AdjustSetting::MOUSE_CONTROL) - || ((!paddle || !useMouse) - && myAdjustSetting == AdjustSetting::MOUSE_RANGE) - || (!stelladapter - && myAdjustSetting == AdjustSetting::SA_PORT_ORDER); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool EventHandler::skipDebugSetting() const -{ - const bool isPAL = myOSystem.console().timing() == ConsoleTiming::pal; - - return (myAdjustSetting == AdjustSetting::COLOR_LOSS && !isPAL); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -AdjustFunction EventHandler::cycleAdjustSetting(int direction) -{ - bool skip = false; - do - { - switch (getAdjustGroup()) - { - case AdjustGroup::AV: - myAdjustSetting = - AdjustSetting(BSPF::clampw(int(myAdjustSetting) + direction, - int(AdjustSetting::START_AV_ADJ), int(AdjustSetting::END_AV_ADJ))); - // skip currently non-relevant adjustments - skip = skipAVSetting(); - break; - - case AdjustGroup::INPUT: - myAdjustSetting = - AdjustSetting(BSPF::clampw(int(myAdjustSetting) + direction, - int(AdjustSetting::START_INPUT_ADJ), int(AdjustSetting::END_INPUT_ADJ))); - // skip currently non-relevant adjustments - skip = skipInputSetting(); - break; - - case AdjustGroup::DEBUG: - myAdjustSetting = - AdjustSetting(BSPF::clampw(int(myAdjustSetting) + direction, - int(AdjustSetting::START_DEBUG_ADJ), int(AdjustSetting::END_DEBUG_ADJ))); - // skip currently non-relevant adjustments - skip = skipDebugSetting(); - break; - - default: - break; - } - // avoid endless loop - if(skip && !direction) - direction = 1; - } while(skip); - - return getAdjustSetting(myAdjustSetting); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -AdjustFunction EventHandler::getAdjustSetting(AdjustSetting setting) -{ - // Notes: - // - All methods MUST show a message - // - This array MUST have the same order as AdjustSetting - const AdjustFunction ADJUST_FUNCTIONS[int(AdjustSetting::NUM_ADJ)] = - { - // *** Audio & Video settings *** - std::bind(&Sound::adjustVolume, &myOSystem.sound(), _1), - std::bind(&FrameBuffer::switchVideoMode, &myOSystem.frameBuffer(), _1), - std::bind(&FrameBuffer::toggleFullscreen, &myOSystem.frameBuffer(), _1), - #ifdef ADAPTABLE_REFRESH_SUPPORT - std::bind(&FrameBuffer::toggleAdaptRefresh, &myOSystem.frameBuffer(), _1), - #endif - std::bind(&FrameBuffer::changeOverscan, &myOSystem.frameBuffer(), _1), - std::bind(&Console::selectFormat, &myOSystem.console(), _1), // property, not persisted - std::bind(&Console::changeVerticalCenter, &myOSystem.console(), _1), // property, not persisted - std::bind(&Console::toggleCorrectAspectRatio, &myOSystem.console(), _1), - std::bind(&Console::changeVSizeAdjust, &myOSystem.console(), _1), - // Palette adjustables - std::bind(&PaletteHandler::cyclePalette, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::PHASE_SHIFT, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::RED_SCALE, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::RED_SHIFT, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::GREEN_SCALE, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::GREEN_SHIFT, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::BLUE_SCALE, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::BLUE_SHIFT, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::HUE, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::SATURATION, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::CONTRAST, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::BRIGHTNESS, _1), - std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), - PaletteHandler::GAMMA, _1), - // NTSC filter adjustables - std::bind(&TIASurface::changeNTSC, &myOSystem.frameBuffer().tiaSurface(), _1), - std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), - int(NTSCFilter::Adjustables::SHARPNESS), _1), - std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), - int(NTSCFilter::Adjustables::RESOLUTION), _1), - std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), - int(NTSCFilter::Adjustables::ARTIFACTS), _1), - std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), - int(NTSCFilter::Adjustables::FRINGING), _1), - std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), - int(NTSCFilter::Adjustables::BLEEDING), _1), - std::bind(&Console::changePhosphor, &myOSystem.console(), _1), - std::bind(&TIASurface::setScanlineIntensity, &myOSystem.frameBuffer().tiaSurface(), _1), - std::bind(&Console::toggleInter, &myOSystem.console(), _1), - - // *** Input settings *** - std::bind(&PhysicalJoystickHandler::changeDigitalDeadZone, &joyHandler(), _1), - std::bind(&PhysicalJoystickHandler::changeAnalogPaddleDeadZone, &joyHandler(), _1), - std::bind(&PhysicalJoystickHandler::changeAnalogPaddleSensitivity, &joyHandler(), _1), - std::bind(&PhysicalJoystickHandler::changeAnalogPaddleLinearity, &joyHandler(), _1), - std::bind(&PhysicalJoystickHandler::changePaddleDejitterAveraging, &joyHandler(), _1), - std::bind(&PhysicalJoystickHandler::changePaddleDejitterReaction, &joyHandler(), _1), - std::bind(&PhysicalJoystickHandler::changeDigitalPaddleSensitivity, &joyHandler(), _1), - std::bind(&Console::changeAutoFireRate, &myOSystem.console(), _1), - std::bind(&EventHandler::toggleAllow4JoyDirections, this, _1), - std::bind(&PhysicalKeyboardHandler::toggleModKeys, &keyHandler(), _1), - std::bind(&EventHandler::toggleSAPortOrder, this, _1), - std::bind(&EventHandler::changeMouseControllerMode, this, _1), - std::bind(&PhysicalJoystickHandler::changeMousePaddleSensitivity, &joyHandler(), _1), - std::bind(&PhysicalJoystickHandler::changeMouseTrackballSensitivity, &joyHandler(), _1), - std::bind(&PhysicalJoystickHandler::changeDrivingSensitivity, &joyHandler(), _1), - std::bind(&EventHandler::changeMouseCursor, this, _1), - std::bind(&FrameBuffer::toggleGrabMouse, &myOSystem.frameBuffer(), _1), - // Game properties/Controllers - std::bind(&Console::changeLeftController, &myOSystem.console(), _1), // property, not persisted - std::bind(&Console::changeRightController, &myOSystem.console(), _1), // property, not persisted - std::bind(&Console::toggleSwapPorts, &myOSystem.console(), _1), // property, not persisted - std::bind(&Console::toggleSwapPaddles, &myOSystem.console(), _1), // property, not persisted - std::bind(&Console::changePaddleCenterX, &myOSystem.console(), _1), // property, not persisted - std::bind(&Console::changePaddleCenterY, &myOSystem.console(), _1), // property, not persisted - std::bind(&EventHandler::changeMouseControl, this, _1), // property, not persisted - std::bind(&Console::changePaddleAxesRange, &myOSystem.console(), _1), // property, not persisted - - // *** Debug settings *** - std::bind(&FrameBuffer::toggleFrameStats, &myOSystem.frameBuffer(), _1), - std::bind(&Console::toggleP0Bit, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleP1Bit, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleM0Bit, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleM1Bit, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleBLBit, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::togglePFBit, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleBits, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleP0Collision, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleP1Collision, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleM0Collision, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleM1Collision, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleBLCollision, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::togglePFCollision, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleCollisions, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleFixedColors, &myOSystem.console(), _1), // debug, not persisted - std::bind(&Console::toggleColorLoss, &myOSystem.console(), _1), - std::bind(&Console::toggleJitter, &myOSystem.console(), _1), - - // *** Following functions are not used when cycling settings but for "direct only" hotkeys *** - std::bind(&StateManager::changeState, &myOSystem.state(), _1), // temporary, not persisted - std::bind(&PaletteHandler::changeCurrentAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), _1), - std::bind(&TIASurface::changeCurrentNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), _1), - std::bind(&Console::changeSpeed, &myOSystem.console(), _1), - }; - - return ADJUST_FUNCTIONS[int(setting)]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool EventHandler::isAdjustRepeated(AdjustSetting setting) -{ - const bool ADJUST_REPEATED[int(AdjustSetting::NUM_ADJ)] = - { - // *** Audio & Video group *** - true, // VOLUME - false, // ZOOM (always repeating) - false, // FULLSCREEN (always repeating) - #ifdef ADAPTABLE_REFRESH_SUPPORT - false, // ADAPT_REFRESH (always repeating) -#endif - true, // OVERSCAN - false, // TVFORMAT - true, // VCENTER - false, // ASPECT_RATIO (always repeating) - true, // VSIZE - // Palette adjustables - false, // PALETTE - true, // PALETTE_PHASE - true, // PALETTE_RED_SCALE - true, // PALETTE_RED_SHIFT - true, // PALETTE_GREEN_SCALE - true, // PALETTE_GREEN_SHIFT - true, // PALETTE_BLUE_SCALE - true, // PALETTE_BLUE_SHIFT - true, // PALETTE_HUE - true, // PALETTE_SATURATION - true, // PALETTE_CONTRAST - true, // PALETTE_BRIGHTNESS - true, // PALETTE_GAMMA - // NTSC filter adjustables - false, // NTSC_PRESET - true, // NTSC_SHARPNESS - true, // NTSC_RESOLUTION - true, // NTSC_ARTIFACTS - true, // NTSC_FRINGING - true, // NTSC_BLEEDING - // Other TV effects adjustables - true, // PHOSPHOR - true, // SCANLINES - false, // INTERPOLATION - // *** Input group *** - true, // DEADZONE - true, // ANALOG_DEADZONE - true, // ANALOG_SENSITIVITY - true, // ANALOG_LINEARITY - true, // DEJITTER_AVERAGING - true, // DEJITTER_REACTION - true, // DIGITAL_SENSITIVITY - true, // AUTO_FIRE - false, // FOUR_DIRECTIONS - false, // MOD_KEY_COMBOS - false, // SA_PORT_ORDER - false, // USE_MOUSE - true, // PADDLE_SENSITIVITY - true, // TRACKBALL_SENSITIVITY - true, // DRIVING_SENSITIVITY - false, // MOUSE_CURSOR - false, // GRAB_MOUSE - false, // LEFT_PORT - false, // RIGHT_PORT - false, // SWAP_PORTS - false, // SWAP_PADDLES - true, // PADDLE_CENTER_X - true, // PADDLE_CENTER_Y - false, // MOUSE_CONTROL - true, // MOUSE_RANGE - // *** Debug group *** - false, // STATS - false, // P0_ENAM - false, // P1_ENAM - false, // M0_ENAM - false, // M1_ENAM - false, // BL_ENAM - false, // PF_ENAM - false, // ALL_ENAM - false, // P0_CX - false, // P1_CX - false, // M0_CX - false, // M1_CX - false, // BL_CX - false, // PF_CX - false, // ALL_CX - false, // FIXED_COL - false, // COLOR_LOSS - false, // JITTER - // *** Only used via direct hotkeys *** - true, // STATE - true, // PALETTE_CHANGE_ATTRIBUTE - true, // NTSC_CHANGE_ATTRIBUTE - true, // CHANGE_SPEED - }; - return ADJUST_REPEATED[int(setting)]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void EventHandler::setAdjustSetting(AdjustSetting setting) -{ - myAdjustSetting = setting; - myAdjustActive = true; -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) { @@ -766,107 +387,12 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) // or need to be preprocessed before passing them on const bool pressed = (value != 0); - // The global settings keys change settings or values as long as the setting - // message from the previous settings event is still displayed. - // Therefore, do not change global settings/values or direct values if - // a) the setting message is no longer shown - // b) other keys have been pressed - if(!myOSystem.frameBuffer().messageShown()) - { - myAdjustActive = false; - myAdjustDirect = AdjustSetting::NONE; - } - - const bool adjustActive = myAdjustActive; - const AdjustSetting adjustAVDirect = myAdjustDirect; - - if(pressed) - { - myAdjustActive = false; - myAdjustDirect = AdjustSetting::NONE; - } + // Abort if global keys are pressed + if(myGlobalKeyHandler->handleEvent(event, pressed, repeated)) + return; switch(event) { - //////////////////////////////////////////////////////////////////////// - // Allow adjusting several (mostly repeated) settings using the same six hotkeys - case Event::PreviousSettingGroup: - case Event::NextSettingGroup: - if(pressed && !repeated) - { - const int direction = event == Event::PreviousSettingGroup ? -1 : +1; - AdjustGroup adjustGroup = AdjustGroup(BSPF::clampw(int(getAdjustGroup()) + direction, - 0, int(AdjustGroup::NUM_GROUPS) - 1)); - string msg; - - switch(adjustGroup) - { - case AdjustGroup::AV: - msg = "Audio & Video"; - myAdjustSetting = AdjustSetting::START_AV_ADJ; - break; - - case AdjustGroup::INPUT: - msg = "Input Devices & Ports"; - myAdjustSetting = AdjustSetting::START_INPUT_ADJ; - break; - - case AdjustGroup::DEBUG: - msg = "Debug"; - myAdjustSetting = AdjustSetting::START_DEBUG_ADJ; - break; - - default: - break; - } - myOSystem.frameBuffer().showTextMessage(msg + " settings"); - myAdjustActive = false; - } - break; - - // Allow adjusting several (mostly repeated) settings using the same four hotkeys - case Event::PreviousSetting: - case Event::NextSetting: - if(pressed && !repeated) - { - const int direction = event == Event::PreviousSetting ? -1 : +1; - - // Get (and display) the previous|next adjustment function, - // but do not change its value - cycleAdjustSetting(adjustActive ? direction : 0)(0); - // Fallback message when no message is displayed by method - //if(!myOSystem.frameBuffer().messageShown()) - // myOSystem.frameBuffer().showMessage("Message " + std::to_string(int(myAdjustSetting))); - myAdjustActive = true; - } - break; - - case Event::SettingDecrease: - case Event::SettingIncrease: - if(pressed) - { - const int direction = event == Event::SettingDecrease ? -1 : +1; - - // if a "direct only" hotkey was pressed last, use this one - if(adjustAVDirect != AdjustSetting::NONE) - { - myAdjustDirect = adjustAVDirect; - if(!repeated || isAdjustRepeated(myAdjustDirect)) - getAdjustSetting(myAdjustDirect)(direction); - } - else - { - // Get (and display) the current adjustment function, - // but only change its value if the function was already active before - if(!repeated || isAdjustRepeated(myAdjustSetting)) - { - getAdjustSetting(myAdjustSetting)(adjustActive ? direction : 0); - myAdjustActive = true; - } - } - } - return; - //////////////////////////////////////////////////////////////////////// // If enabled, make sure 'impossible' joystick directions aren't allowed case Event::LeftJoystickUp: @@ -955,7 +481,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.sound().adjustVolume(-1); - setAdjustSetting(AdjustSetting::VOLUME); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::VOLUME); } return; @@ -963,7 +489,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.sound().adjustVolume(+1); - setAdjustSetting(AdjustSetting::VOLUME); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::VOLUME); } return; @@ -971,7 +497,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.sound().toggleMute(); - setAdjustSetting(AdjustSetting::VOLUME); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::VOLUME); } return; @@ -979,7 +505,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().switchVideoMode(-1); - setAdjustSetting(AdjustSetting::ZOOM); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ZOOM); } return; @@ -987,7 +513,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().switchVideoMode(+1); - setAdjustSetting(AdjustSetting::ZOOM); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ZOOM); } return; @@ -995,7 +521,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().toggleFullscreen(); - setAdjustSetting(AdjustSetting::FULLSCREEN); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::FULLSCREEN); } return; @@ -1004,7 +530,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().toggleAdaptRefresh(); - setAdjustSetting(AdjustSetting::ADAPT_REFRESH); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ADAPT_REFRESH); } return; #endif @@ -1013,7 +539,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().changeOverscan(-1); - setAdjustSetting(AdjustSetting::OVERSCAN); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::OVERSCAN); } return; @@ -1021,7 +547,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().changeOverscan(+1); - setAdjustSetting(AdjustSetting::OVERSCAN); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::OVERSCAN); } return; @@ -1029,7 +555,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().selectFormat(-1); - setAdjustSetting(AdjustSetting::TVFORMAT); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::TVFORMAT); } return; @@ -1037,7 +563,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().selectFormat(+1); - setAdjustSetting(AdjustSetting::TVFORMAT); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::TVFORMAT); } return; @@ -1045,7 +571,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changeVerticalCenter(-1); - setAdjustSetting(AdjustSetting::VCENTER); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::VCENTER); } return; @@ -1053,14 +579,14 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changeVerticalCenter(+1); - setAdjustSetting(AdjustSetting::VCENTER); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::VCENTER); } return; case Event::VSizeAdjustDecrease: if(pressed) { myOSystem.console().changeVSizeAdjust(-1); - setAdjustSetting(AdjustSetting::VSIZE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::VSIZE); } return; @@ -1068,7 +594,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changeVSizeAdjust(+1); - setAdjustSetting(AdjustSetting::VSIZE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::VSIZE); } return; @@ -1076,7 +602,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleCorrectAspectRatio(); - setAdjustSetting(AdjustSetting::ASPECT_RATIO); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ASPECT_RATIO); } break; @@ -1084,7 +610,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().paletteHandler().cyclePalette(-1); - setAdjustSetting(AdjustSetting::PALETTE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PALETTE); } return; @@ -1092,7 +618,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().paletteHandler().cyclePalette(+1); - setAdjustSetting(AdjustSetting::PALETTE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PALETTE); } return; @@ -1100,7 +626,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().changeNTSC(-1); - setAdjustSetting(AdjustSetting::NTSC_PRESET); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::NTSC_PRESET); } return; @@ -1108,7 +634,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().changeNTSC(+1); - setAdjustSetting(AdjustSetting::NTSC_PRESET); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::NTSC_PRESET); } return; @@ -1116,7 +642,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::OFF); - setAdjustSetting(AdjustSetting::NTSC_PRESET); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::NTSC_PRESET); } return; @@ -1124,7 +650,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::RGB); - setAdjustSetting(AdjustSetting::NTSC_PRESET); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::NTSC_PRESET); } return; @@ -1132,7 +658,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::SVIDEO); - setAdjustSetting(AdjustSetting::NTSC_PRESET); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::NTSC_PRESET); } return; @@ -1140,7 +666,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::COMPOSITE); - setAdjustSetting(AdjustSetting::NTSC_PRESET); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::NTSC_PRESET); } return; @@ -1148,7 +674,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::BAD); - setAdjustSetting(AdjustSetting::NTSC_PRESET); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::NTSC_PRESET); } return; @@ -1156,14 +682,14 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::CUSTOM); - setAdjustSetting(AdjustSetting::NTSC_PRESET); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::NTSC_PRESET); } return; case Event::PhosphorDecrease: if(pressed) { myOSystem.console().changePhosphor(-1); - setAdjustSetting(AdjustSetting::PHOSPHOR); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PHOSPHOR); } return; @@ -1171,7 +697,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changePhosphor(+1); - setAdjustSetting(AdjustSetting::PHOSPHOR); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PHOSPHOR); } return; @@ -1179,7 +705,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().togglePhosphor(); - setAdjustSetting(AdjustSetting::PHOSPHOR); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PHOSPHOR); } return; @@ -1187,7 +713,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(-1); - setAdjustSetting(AdjustSetting::SCANLINES); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::SCANLINES); } return; @@ -1195,7 +721,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(+1); - setAdjustSetting(AdjustSetting::SCANLINES); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::SCANLINES); } return; @@ -1203,7 +729,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleInter(); - setAdjustSetting(AdjustSetting::INTERPOLATION); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::INTERPOLATION); } return; @@ -1213,7 +739,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().paletteHandler().cycleAdjustable(-1); - myAdjustDirect = AdjustSetting::PALETTE_CHANGE_ATTRIBUTE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::PALETTE_CHANGE_ATTRIBUTE); } return; @@ -1221,7 +747,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().paletteHandler().cycleAdjustable(+1); - myAdjustDirect = AdjustSetting::PALETTE_CHANGE_ATTRIBUTE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::PALETTE_CHANGE_ATTRIBUTE); } return; @@ -1229,7 +755,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().paletteHandler().changeCurrentAdjustable(-1); - myAdjustDirect = AdjustSetting::PALETTE_CHANGE_ATTRIBUTE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::PALETTE_CHANGE_ATTRIBUTE); } return; @@ -1237,7 +763,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().paletteHandler().changeCurrentAdjustable(+1); - myAdjustDirect = AdjustSetting::PALETTE_CHANGE_ATTRIBUTE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::PALETTE_CHANGE_ATTRIBUTE); } return; @@ -1245,7 +771,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().setNTSCAdjustable(-1); - myAdjustDirect = AdjustSetting::NTSC_CHANGE_ATTRIBUTE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::NTSC_CHANGE_ATTRIBUTE); } return; @@ -1253,7 +779,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().setNTSCAdjustable(+1); - myAdjustDirect = AdjustSetting::NTSC_CHANGE_ATTRIBUTE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::NTSC_CHANGE_ATTRIBUTE); } return; @@ -1261,7 +787,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().changeCurrentNTSCAdjustable(-1); - myAdjustDirect = AdjustSetting::NTSC_CHANGE_ATTRIBUTE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::NTSC_CHANGE_ATTRIBUTE); } return; @@ -1269,7 +795,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.frameBuffer().tiaSurface().changeCurrentNTSCAdjustable(+1); - myAdjustDirect = AdjustSetting::NTSC_CHANGE_ATTRIBUTE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::NTSC_CHANGE_ATTRIBUTE); } return; @@ -1279,7 +805,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.frameBuffer().toggleFrameStats(); - setAdjustSetting(AdjustSetting::STATS); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::STATS); } return; @@ -1287,7 +813,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleP0Collision(); - setAdjustSetting(AdjustSetting::P0_CX); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::P0_CX); } return; @@ -1295,7 +821,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleP0Bit(); - setAdjustSetting(AdjustSetting::P0_ENAM); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::P0_ENAM); } return; @@ -1303,7 +829,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleP1Collision(); - setAdjustSetting(AdjustSetting::P1_CX); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::P1_CX); } return; @@ -1311,7 +837,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleP1Bit(); - setAdjustSetting(AdjustSetting::P1_ENAM); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::P1_ENAM); } return; @@ -1319,7 +845,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleM0Collision(); - setAdjustSetting(AdjustSetting::M0_CX); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::M0_CX); } return; @@ -1327,7 +853,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleM0Bit(); - setAdjustSetting(AdjustSetting::M0_ENAM); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::M0_ENAM); } return; @@ -1335,7 +861,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleM1Collision(); - setAdjustSetting(AdjustSetting::M1_CX); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::M1_CX); } return; @@ -1343,7 +869,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleM1Bit(); - setAdjustSetting(AdjustSetting::M1_ENAM); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::M1_ENAM); } return; @@ -1351,7 +877,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleBLCollision(); - setAdjustSetting(AdjustSetting::BL_CX); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::BL_CX); } return; @@ -1359,7 +885,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleBLBit(); - setAdjustSetting(AdjustSetting::BL_ENAM); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::BL_ENAM); } return; @@ -1367,7 +893,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().togglePFCollision(); - setAdjustSetting(AdjustSetting::PF_CX); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PF_CX); } return; @@ -1375,7 +901,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().togglePFBit(); - setAdjustSetting(AdjustSetting::PF_ENAM); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PF_ENAM); } return; @@ -1383,7 +909,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleCollisions(); - setAdjustSetting(AdjustSetting::ALL_CX); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ALL_CX); } return; @@ -1391,7 +917,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleBits(); - setAdjustSetting(AdjustSetting::ALL_ENAM); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ALL_ENAM); } return; @@ -1399,7 +925,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleFixedColors(); - setAdjustSetting(AdjustSetting::FIXED_COL); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::FIXED_COL); } return; @@ -1407,7 +933,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleColorLoss(); - setAdjustSetting(AdjustSetting::COLOR_LOSS); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::COLOR_LOSS); } return; @@ -1415,7 +941,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleJitter(); - setAdjustSetting(AdjustSetting::JITTER); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::JITTER); } return; @@ -1425,7 +951,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeDigitalDeadZone(-1); - setAdjustSetting(AdjustSetting::DEADZONE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DEADZONE); } return; @@ -1433,7 +959,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeDigitalDeadZone(+1); - setAdjustSetting(AdjustSetting::DEADZONE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DEADZONE); } return; @@ -1441,7 +967,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeAnalogPaddleDeadZone(-1); - setAdjustSetting(AdjustSetting::ANALOG_DEADZONE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ANALOG_DEADZONE); } return; @@ -1449,7 +975,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeAnalogPaddleDeadZone(+1); - setAdjustSetting(AdjustSetting::ANALOG_DEADZONE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ANALOG_DEADZONE); } return; @@ -1457,7 +983,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeAnalogPaddleSensitivity(-1); - setAdjustSetting(AdjustSetting::ANALOG_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ANALOG_SENSITIVITY); } return; @@ -1465,7 +991,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeAnalogPaddleSensitivity(+1); - setAdjustSetting(AdjustSetting::ANALOG_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ANALOG_SENSITIVITY); } return; @@ -1473,7 +999,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeAnalogPaddleLinearity(-1); - setAdjustSetting(AdjustSetting::ANALOG_LINEARITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ANALOG_LINEARITY); } return; @@ -1481,7 +1007,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeAnalogPaddleLinearity(+1); - setAdjustSetting(AdjustSetting::ANALOG_LINEARITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::ANALOG_LINEARITY); } return; @@ -1489,7 +1015,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changePaddleDejitterAveraging(-1); - setAdjustSetting(AdjustSetting::DEJITTER_AVERAGING); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DEJITTER_AVERAGING); } return; @@ -1497,7 +1023,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changePaddleDejitterAveraging(+1); - setAdjustSetting(AdjustSetting::DEJITTER_AVERAGING); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DEJITTER_AVERAGING); } return; @@ -1505,7 +1031,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changePaddleDejitterReaction(-1); - setAdjustSetting(AdjustSetting::DEJITTER_REACTION); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DEJITTER_REACTION); } return; @@ -1513,7 +1039,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changePaddleDejitterReaction(+1); - setAdjustSetting(AdjustSetting::DEJITTER_REACTION); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DEJITTER_REACTION); } return; @@ -1521,7 +1047,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeDigitalPaddleSensitivity(-1); - setAdjustSetting(AdjustSetting::DIGITAL_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DIGITAL_SENSITIVITY); } return; @@ -1529,7 +1055,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeDigitalPaddleSensitivity(+1); - setAdjustSetting(AdjustSetting::DIGITAL_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DIGITAL_SENSITIVITY); } return; @@ -1537,7 +1063,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changeAutoFireRate(-1); - setAdjustSetting(AdjustSetting::AUTO_FIRE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::AUTO_FIRE); } return; @@ -1545,7 +1071,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changeAutoFireRate(+1); - setAdjustSetting(AdjustSetting::AUTO_FIRE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::AUTO_FIRE); } return; @@ -1553,7 +1079,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { toggleAllow4JoyDirections(); - setAdjustSetting(AdjustSetting::FOUR_DIRECTIONS); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::FOUR_DIRECTIONS); } return; @@ -1561,7 +1087,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myPKeyHandler->toggleModKeys(); - setAdjustSetting(AdjustSetting::MOD_KEY_COMBOS); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::MOD_KEY_COMBOS); } return; @@ -1569,7 +1095,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { toggleSAPortOrder(); - setAdjustSetting(AdjustSetting::SA_PORT_ORDER); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::SA_PORT_ORDER); } return; @@ -1577,7 +1103,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { changeMouseControllerMode(-1); - setAdjustSetting(AdjustSetting::USE_MOUSE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::USE_MOUSE); } return; @@ -1585,7 +1111,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { changeMouseControllerMode(+1); - setAdjustSetting(AdjustSetting::USE_MOUSE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::USE_MOUSE); } return; @@ -1593,7 +1119,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeMousePaddleSensitivity(-1); - setAdjustSetting(AdjustSetting::PADDLE_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PADDLE_SENSITIVITY); } return; @@ -1601,7 +1127,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeMousePaddleSensitivity(+1); - setAdjustSetting(AdjustSetting::PADDLE_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PADDLE_SENSITIVITY); } return; @@ -1609,7 +1135,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeMouseTrackballSensitivity(-1); - setAdjustSetting(AdjustSetting::TRACKBALL_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::TRACKBALL_SENSITIVITY); } return; @@ -1617,7 +1143,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeMouseTrackballSensitivity(+1); - setAdjustSetting(AdjustSetting::TRACKBALL_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::TRACKBALL_SENSITIVITY); } return; @@ -1625,7 +1151,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeDrivingSensitivity(-1); - setAdjustSetting(AdjustSetting::DRIVING_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DRIVING_SENSITIVITY); } return; @@ -1633,7 +1159,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myPJoyHandler->changeDrivingSensitivity(+1); - setAdjustSetting(AdjustSetting::DRIVING_SENSITIVITY); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::DRIVING_SENSITIVITY); } return; @@ -1641,7 +1167,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { changeMouseCursor(-1); - setAdjustSetting(AdjustSetting::MOUSE_CURSOR); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::MOUSE_CURSOR); } return; @@ -1649,7 +1175,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { changeMouseCursor(+1); - setAdjustSetting(AdjustSetting::MOUSE_CURSOR); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::MOUSE_CURSOR); } return; @@ -1657,7 +1183,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated && !myOSystem.frameBuffer().fullScreen()) { myOSystem.frameBuffer().toggleGrabMouse(); - setAdjustSetting(AdjustSetting::GRAB_MOUSE); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::GRAB_MOUSE); } return; @@ -1665,7 +1191,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().changeLeftController(-1); - setAdjustSetting(AdjustSetting::LEFT_PORT); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::LEFT_PORT); } return; @@ -1673,7 +1199,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().changeLeftController(+1); - setAdjustSetting(AdjustSetting::LEFT_PORT); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::LEFT_PORT); } return; @@ -1682,7 +1208,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().changeRightController(-1); - setAdjustSetting(AdjustSetting::RIGHT_PORT); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::RIGHT_PORT); } return; @@ -1690,7 +1216,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().changeRightController(+1); - setAdjustSetting(AdjustSetting::RIGHT_PORT); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::RIGHT_PORT); } return; @@ -1698,7 +1224,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleSwapPorts(); - setAdjustSetting(AdjustSetting::SWAP_PORTS); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::SWAP_PORTS); } return; @@ -1706,7 +1232,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { myOSystem.console().toggleSwapPaddles(); - setAdjustSetting(AdjustSetting::SWAP_PADDLES); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::SWAP_PADDLES); } return; @@ -1714,7 +1240,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changePaddleCenterX(-1); - setAdjustSetting(AdjustSetting::PADDLE_CENTER_X); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PADDLE_CENTER_X); } return; @@ -1722,7 +1248,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changePaddleCenterX(+1); - setAdjustSetting(AdjustSetting::PADDLE_CENTER_X); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PADDLE_CENTER_X); } return; @@ -1730,7 +1256,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changePaddleCenterY(-1); - setAdjustSetting(AdjustSetting::PADDLE_CENTER_Y); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PADDLE_CENTER_Y); } return; @@ -1738,7 +1264,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changePaddleCenterY(+1); - setAdjustSetting(AdjustSetting::PADDLE_CENTER_Y); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::PADDLE_CENTER_Y); } return; @@ -1746,7 +1272,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { changeMouseControl(-1); - setAdjustSetting(AdjustSetting::MOUSE_CONTROL); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::MOUSE_CONTROL); } return; @@ -1754,7 +1280,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed && !repeated) { changeMouseControl(+1); - setAdjustSetting(AdjustSetting::MOUSE_CONTROL); + myGlobalKeyHandler->setAdjustSetting(GlobalKeyHandler::AdjustSetting::MOUSE_CONTROL); } return; @@ -1764,7 +1290,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if (pressed && !repeated) { myOSystem.state().saveState(); - myAdjustDirect = AdjustSetting::STATE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::STATE); } return; @@ -1777,7 +1303,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if (pressed) { myOSystem.state().changeState(-1); - myAdjustDirect = AdjustSetting::STATE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::STATE); } return; @@ -1785,7 +1311,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if (pressed) { myOSystem.state().changeState(+1); - myAdjustDirect = AdjustSetting::STATE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::STATE); } return; @@ -1797,7 +1323,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if (pressed && !repeated) { myOSystem.state().loadState(); - myAdjustDirect = AdjustSetting::STATE; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::STATE); } return; @@ -1848,7 +1374,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changeSpeed(-1); - myAdjustDirect = AdjustSetting::CHANGE_SPEED; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::CHANGE_SPEED); } return; @@ -1856,7 +1382,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) if(pressed) { myOSystem.console().changeSpeed(+1); - myAdjustDirect = AdjustSetting::CHANGE_SPEED; + myGlobalKeyHandler->setAdjustDirect(GlobalKeyHandler::AdjustSetting::CHANGE_SPEED); } return; diff --git a/src/emucore/EventHandler.hxx b/src/emucore/EventHandler.hxx index 2be01bb32..80fc8bade 100644 --- a/src/emucore/EventHandler.hxx +++ b/src/emucore/EventHandler.hxx @@ -26,6 +26,7 @@ class MouseControl; class DialogContainer; class PhysicalJoystick; class Variant; +class GlobalKeyHandler; namespace GUI { class Font; @@ -34,7 +35,6 @@ namespace GUI { #include "Event.hxx" #include "EventHandlerConstants.hxx" #include "Control.hxx" -#include "StellaKeys.hxx" #include "PKeyboardHandler.hxx" #include "PJoystickHandler.hxx" #include "bspf.hxx" @@ -181,6 +181,11 @@ class EventHandler StringList getComboListForEvent(Event::Type event) const; void setComboListForEvent(Event::Type event, const StringList& events); + /** Provide the joystick handler for the global hotkey handler */ + PhysicalJoystickHandler& joyHandler() const { return *myPJoyHandler; } + /** Provide the keyboard handler for the global hotkey handler */ + PhysicalKeyboardHandler& keyHandler() const { return *myPKeyHandler; } + /** Convert keys and physical joystick events into Stella events. */ Event::Type eventForKey(EventMode mode, StellaKey key, StellaMod mod) const { return myPKeyHandler->eventForKey(mode, key, mod); @@ -430,114 +435,6 @@ class EventHandler */ void removePhysicalJoystick(int index); - private: - enum class AdjustSetting - { - NONE = -1, - // *** Audio & Video group *** - VOLUME, - ZOOM, - FULLSCREEN, - #ifdef ADAPTABLE_REFRESH_SUPPORT - ADAPT_REFRESH, - #endif - OVERSCAN, - TVFORMAT, - VCENTER, - ASPECT_RATIO, - VSIZE, - // Palette adjustables - PALETTE, - PALETTE_PHASE, - PALETTE_RED_SCALE, - PALETTE_RED_SHIFT, - PALETTE_GREEN_SCALE, - PALETTE_GREEN_SHIFT, - PALETTE_BLUE_SCALE, - PALETTE_BLUE_SHIFT, - PALETTE_HUE, - PALETTE_SATURATION, - PALETTE_CONTRAST, - PALETTE_BRIGHTNESS, - PALETTE_GAMMA, - // NTSC filter adjustables - NTSC_PRESET, - NTSC_SHARPNESS, - NTSC_RESOLUTION, - NTSC_ARTIFACTS, - NTSC_FRINGING, - NTSC_BLEEDING, - // Other TV effects adjustables - PHOSPHOR, - SCANLINES, - INTERPOLATION, - // *** Input group *** - DEADZONE, - ANALOG_DEADZONE, - ANALOG_SENSITIVITY, - ANALOG_LINEARITY, - DEJITTER_AVERAGING, - DEJITTER_REACTION, - DIGITAL_SENSITIVITY, - AUTO_FIRE, - FOUR_DIRECTIONS, - MOD_KEY_COMBOS, - SA_PORT_ORDER, - USE_MOUSE, - PADDLE_SENSITIVITY, - TRACKBALL_SENSITIVITY, - DRIVING_SENSITIVITY, - MOUSE_CURSOR, - GRAB_MOUSE, - LEFT_PORT, - RIGHT_PORT, - SWAP_PORTS, - SWAP_PADDLES, - PADDLE_CENTER_X, - PADDLE_CENTER_Y, - MOUSE_CONTROL, - MOUSE_RANGE, - // *** Debug group *** - STATS, - P0_ENAM, - P1_ENAM, - M0_ENAM, - M1_ENAM, - BL_ENAM, - PF_ENAM, - ALL_ENAM, - P0_CX, - P1_CX, - M0_CX, - M1_CX, - BL_CX, - PF_CX, - ALL_CX, - FIXED_COL, - COLOR_LOSS, - JITTER, - // *** Only used via direct hotkeys *** - STATE, - PALETTE_CHANGE_ATTRIBUTE, - NTSC_CHANGE_ATTRIBUTE, - CHANGE_SPEED, - // *** Ranges *** - NUM_ADJ, - START_AV_ADJ = VOLUME, - END_AV_ADJ = INTERPOLATION, - START_INPUT_ADJ = DEADZONE, - END_INPUT_ADJ = MOUSE_RANGE, - START_DEBUG_ADJ = STATS, - END_DEBUG_ADJ = JITTER, - }; - enum class AdjustGroup - { - AV, - INPUT, - DEBUG, - NUM_GROUPS - }; - private: // Define event groups static const Event::EventSet MiscEvents; @@ -566,27 +463,6 @@ class EventHandler int getEmulActionListIndex(int idx, const Event::EventSet& events) const; int getActionListIndex(int idx, Event::Group group) const; - // The following methods are used for adjusting several settings using global hotkeys - // They return the function used to adjust the currenly selected setting - AdjustGroup getAdjustGroup(); - AdjustFunction cycleAdjustSetting(int direction); - AdjustFunction getAdjustSetting(AdjustSetting setting); - // Check if the current adjustment should be repeated - bool isAdjustRepeated(AdjustSetting setting); - void setAdjustSetting(AdjustSetting setting); - - PhysicalJoystickHandler& joyHandler() const { return *myPJoyHandler; } - PhysicalKeyboardHandler& keyHandler() const { return *myPKeyHandler; } - - bool isJoystick(const Controller& controller) const; - bool isPaddle(const Controller& controller) const; - bool isTrackball(const Controller& controller) const; - - // Check if a currently non-relevant adjustment can be skipped - bool skipAVSetting() const; - bool skipInputSetting() const; - bool skipDebugSetting() const; - private: // Structure used for action menu items struct ActionList { @@ -595,19 +471,15 @@ class EventHandler string key; }; - // If true, the setting is visible and its value can be changed - bool myAdjustActive{false}; - // ID of the currently selected global setting - AdjustSetting myAdjustSetting{AdjustSetting::START_AV_ADJ}; - // ID of the currently selected direct hotkey setting (0 if none) - AdjustSetting myAdjustDirect{AdjustSetting::NONE}; - // Global Event object Event myEvent; // Indicates current overlay object DialogContainer* myOverlay{nullptr}; + // Handler for all global key events + unique_ptr myGlobalKeyHandler; + // Handler for all keyboard-related events unique_ptr myPKeyHandler; diff --git a/src/emucore/GlobalKeyHandler.cxx b/src/emucore/GlobalKeyHandler.cxx new file mode 100644 index 000000000..0537f3807 --- /dev/null +++ b/src/emucore/GlobalKeyHandler.cxx @@ -0,0 +1,544 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2021 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#include "Console.hxx" +#include "FrameBuffer.hxx" +#include "PaletteHandler.hxx" +#include "QuadTari.hxx" +#include "Sound.hxx" +#include "StateManager.hxx" +#include "TIASurface.hxx" + +#include "GlobalKeyHandler.hxx" + +using namespace std::placeholders; + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +GlobalKeyHandler::GlobalKeyHandler(OSystem& osystem) + : myOSystem{osystem} +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GlobalKeyHandler::handleEvent(const Event::Type event, bool pressed, bool repeated) +{ + // The global settings keys change settings or values as long as the setting + // message from the previous settings event is still displayed. + // Therefore, do not change global settings/values or direct values if + // a) the setting message is no longer shown + // b) other keys have been pressed + if(!myOSystem.frameBuffer().messageShown()) + { + myAdjustActive = false; + myAdjustDirect = AdjustSetting::NONE; + } + + const bool adjustActive = myAdjustActive; + const AdjustSetting adjustAVDirect = myAdjustDirect; + + if(pressed) + { + myAdjustActive = false; + myAdjustDirect = AdjustSetting::NONE; + } + + bool handled = true; + + switch(event) + { + //////////////////////////////////////////////////////////////////////// + // Allow adjusting several (mostly repeated) settings using the same six hotkeys + case Event::PreviousSettingGroup: + case Event::NextSettingGroup: + if(pressed && !repeated) + { + const int direction = event == Event::PreviousSettingGroup ? -1 : +1; + AdjustGroup adjustGroup = AdjustGroup(BSPF::clampw(int(getAdjustGroup()) + direction, + 0, int(AdjustGroup::NUM_GROUPS) - 1)); + string msg; + + switch(adjustGroup) + { + case AdjustGroup::AV: + msg = "Audio & Video"; + myAdjustSetting = AdjustSetting::START_AV_ADJ; + break; + + case AdjustGroup::INPUT: + msg = "Input Devices & Ports"; + myAdjustSetting = AdjustSetting::START_INPUT_ADJ; + break; + + case AdjustGroup::DEBUG: + msg = "Debug"; + myAdjustSetting = AdjustSetting::START_DEBUG_ADJ; + break; + + default: + break; + } + myOSystem.frameBuffer().showTextMessage(msg + " settings"); + myAdjustActive = false; + } + break; + + // Allow adjusting several (mostly repeated) settings using the same four hotkeys + case Event::PreviousSetting: + case Event::NextSetting: + if(pressed && !repeated) + { + const int direction = event == Event::PreviousSetting ? -1 : +1; + + // Get (and display) the previous|next adjustment function, + // but do not change its value + cycleAdjustSetting(adjustActive ? direction : 0)(0); + // Fallback message when no message is displayed by method + //if(!myOSystem.frameBuffer().messageShown()) + // myOSystem.frameBuffer().showMessage("Message " + std::to_string(int(myAdjustSetting))); + myAdjustActive = true; + } + break; + + case Event::SettingDecrease: + case Event::SettingIncrease: + if(pressed) + { + const int direction = event == Event::SettingDecrease ? -1 : +1; + + // if a "direct only" hotkey was pressed last, use this one + if(adjustAVDirect != AdjustSetting::NONE) + { + myAdjustDirect = adjustAVDirect; + if(!repeated || isAdjustRepeated(myAdjustDirect)) + getAdjustSetting(myAdjustDirect)(direction); + } + else + { + // Get (and display) the current adjustment function, + // but only change its value if the function was already active before + if(!repeated || isAdjustRepeated(myAdjustSetting)) + { + getAdjustSetting(myAdjustSetting)(adjustActive ? direction : 0); + myAdjustActive = true; + } + } + } + break; + + default: + handled = false; + } + return handled; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GlobalKeyHandler::setAdjustSetting(const AdjustSetting setting) +{ + myAdjustSetting = setting; + myAdjustActive = true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void GlobalKeyHandler::setAdjustDirect(const AdjustSetting setting) +{ + myAdjustDirect = setting; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +const GlobalKeyHandler::AdjustGroup GlobalKeyHandler::getAdjustGroup() const +{ + if(myAdjustSetting >= AdjustSetting::START_DEBUG_ADJ && myAdjustSetting <= AdjustSetting::END_DEBUG_ADJ) + return AdjustGroup::DEBUG; + if(myAdjustSetting >= AdjustSetting::START_INPUT_ADJ && myAdjustSetting <= AdjustSetting::END_INPUT_ADJ) + return AdjustGroup::INPUT; + + return AdjustGroup::AV; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GlobalKeyHandler::isJoystick(const Controller& controller) const +{ + //const Controller* pleft = &controller; + //const QuadTari* pleftQT = dynamic_cast(pleft); + //const Controller& c = (dynamic_cast(&controller))->firstController(); + return controller.type() == Controller::Type::Joystick + || controller.type() == Controller::Type::BoosterGrip + || controller.type() == Controller::Type::Genesis + || (controller.type() == Controller::Type::QuadTari + && (isJoystick(dynamic_cast(&controller)->firstController()) + || isJoystick(dynamic_cast(&controller)->secondController()))); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GlobalKeyHandler::isPaddle(const Controller& controller) const +{ + return controller.type() == Controller::Type::Paddles + || controller.type() == Controller::Type::PaddlesIAxDr + || controller.type() == Controller::Type::PaddlesIAxis + || (controller.type() == Controller::Type::QuadTari + && (isPaddle(dynamic_cast(&controller)->firstController()) + || isPaddle(dynamic_cast(&controller)->secondController()))); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GlobalKeyHandler::isTrackball(const Controller& controller) const +{ + return controller.type() == Controller::Type::AmigaMouse + || controller.type() == Controller::Type::AtariMouse + || controller.type() == Controller::Type::TrakBall; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GlobalKeyHandler::skipAVSetting() const +{ + const bool isFullScreen = myOSystem.frameBuffer().fullScreen(); + const bool isCustomPalette = + myOSystem.settings().getString("palette") == PaletteHandler::SETTING_CUSTOM; + const bool isCustomFilter = + myOSystem.settings().getInt("tv.filter") == int(NTSCFilter::Preset::CUSTOM); + const bool isSoftwareRenderer = + myOSystem.settings().getString("video") == "software"; + + return (myAdjustSetting == AdjustSetting::OVERSCAN && !isFullScreen) + #ifdef ADAPTABLE_REFRESH_SUPPORT + || (myAdjustSetting == AdjustSetting::ADAPT_REFRESH && !isFullScreen) + #endif + || (myAdjustSetting >= AdjustSetting::PALETTE_PHASE + && myAdjustSetting <= AdjustSetting::PALETTE_BLUE_SHIFT + && !isCustomPalette) + || (myAdjustSetting >= AdjustSetting::NTSC_SHARPNESS + && myAdjustSetting <= AdjustSetting::NTSC_BLEEDING + && !isCustomFilter) + || (myAdjustSetting == AdjustSetting::INTERPOLATION && isSoftwareRenderer); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GlobalKeyHandler::skipInputSetting() const +{ + const bool grabMouseAllowed = myOSystem.frameBuffer().grabMouseAllowed(); + const bool analog = myOSystem.console().leftController().isAnalog() + || myOSystem.console().rightController().isAnalog(); + const bool joystick = isJoystick(myOSystem.console().leftController()) + || isJoystick(myOSystem.console().rightController()); + const bool paddle = isPaddle(myOSystem.console().leftController()) + || isPaddle(myOSystem.console().rightController()); + const bool trackball = isTrackball(myOSystem.console().leftController()) + || isTrackball(myOSystem.console().rightController()); + const bool driving = + myOSystem.console().leftController().type() == Controller::Type::Driving + || myOSystem.console().rightController().type() == Controller::Type::Driving; + const bool useMouse = + BSPF::equalsIgnoreCase("always", myOSystem.settings().getString("usemouse")) + || (BSPF::equalsIgnoreCase("analog", myOSystem.settings().getString("usemouse")) + && analog); + const bool stelladapter = joyHandler().hasStelladaptors(); + + return (!grabMouseAllowed && myAdjustSetting == AdjustSetting::GRAB_MOUSE) + || (!joystick + && (myAdjustSetting == AdjustSetting::DEADZONE + || myAdjustSetting == AdjustSetting::FOUR_DIRECTIONS)) + || (!paddle + && (myAdjustSetting == AdjustSetting::ANALOG_DEADZONE + || myAdjustSetting == AdjustSetting::ANALOG_SENSITIVITY + || myAdjustSetting == AdjustSetting::ANALOG_LINEARITY + || myAdjustSetting == AdjustSetting::DEJITTER_AVERAGING + || myAdjustSetting == AdjustSetting::DEJITTER_REACTION + || myAdjustSetting == AdjustSetting::DIGITAL_SENSITIVITY + || myAdjustSetting == AdjustSetting::SWAP_PADDLES + || myAdjustSetting == AdjustSetting::PADDLE_CENTER_X + || myAdjustSetting == AdjustSetting::PADDLE_CENTER_Y)) + || ((!paddle || !useMouse) + && myAdjustSetting == AdjustSetting::PADDLE_SENSITIVITY) + || ((!trackball || !useMouse) + && myAdjustSetting == AdjustSetting::TRACKBALL_SENSITIVITY) + || (!driving + && myAdjustSetting == AdjustSetting::DRIVING_SENSITIVITY) // also affects digital device input sensitivity + || ((!myOSystem.eventHandler().hasMouseControl() || !useMouse) + && myAdjustSetting == AdjustSetting::MOUSE_CONTROL) + || ((!paddle || !useMouse) + && myAdjustSetting == AdjustSetting::MOUSE_RANGE) + || (!stelladapter + && myAdjustSetting == AdjustSetting::SA_PORT_ORDER); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GlobalKeyHandler::skipDebugSetting() const +{ + const bool isPAL = myOSystem.console().timing() == ConsoleTiming::pal; + + return (myAdjustSetting == AdjustSetting::COLOR_LOSS && !isPAL); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +const AdjustFunction GlobalKeyHandler::cycleAdjustSetting(int direction) +{ + bool skip = false; + do + { + switch(getAdjustGroup()) + { + case AdjustGroup::AV: + myAdjustSetting = + AdjustSetting(BSPF::clampw(int(myAdjustSetting) + direction, + int(AdjustSetting::START_AV_ADJ), int(AdjustSetting::END_AV_ADJ))); + // skip currently non-relevant adjustments + skip = skipAVSetting(); + break; + + case AdjustGroup::INPUT: + myAdjustSetting = + AdjustSetting(BSPF::clampw(int(myAdjustSetting) + direction, + int(AdjustSetting::START_INPUT_ADJ), int(AdjustSetting::END_INPUT_ADJ))); + // skip currently non-relevant adjustments + skip = skipInputSetting(); + break; + + case AdjustGroup::DEBUG: + myAdjustSetting = + AdjustSetting(BSPF::clampw(int(myAdjustSetting) + direction, + int(AdjustSetting::START_DEBUG_ADJ), int(AdjustSetting::END_DEBUG_ADJ))); + // skip currently non-relevant adjustments + skip = skipDebugSetting(); + break; + + default: + break; + } + // avoid endless loop + if(skip && !direction) + direction = 1; + } while(skip); + + return getAdjustSetting(myAdjustSetting); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +const AdjustFunction GlobalKeyHandler::getAdjustSetting(const AdjustSetting setting) const +{ + // Notes: + // - All methods MUST show a message + // - This array MUST have the same order as AdjustSetting + const AdjustFunction ADJUST_FUNCTIONS[int(AdjustSetting::NUM_ADJ)] = + { + // *** Audio & Video settings *** + std::bind(&Sound::adjustVolume, &myOSystem.sound(), _1), + std::bind(&FrameBuffer::switchVideoMode, &myOSystem.frameBuffer(), _1), + std::bind(&FrameBuffer::toggleFullscreen, &myOSystem.frameBuffer(), _1), + #ifdef ADAPTABLE_REFRESH_SUPPORT + std::bind(&FrameBuffer::toggleAdaptRefresh, &myOSystem.frameBuffer(), _1), + #endif + std::bind(&FrameBuffer::changeOverscan, &myOSystem.frameBuffer(), _1), + std::bind(&Console::selectFormat, &myOSystem.console(), _1), // property, not persisted + std::bind(&Console::changeVerticalCenter, &myOSystem.console(), _1), // property, not persisted + std::bind(&Console::toggleCorrectAspectRatio, &myOSystem.console(), _1), + std::bind(&Console::changeVSizeAdjust, &myOSystem.console(), _1), + // Palette adjustables + std::bind(&PaletteHandler::cyclePalette, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::PHASE_SHIFT, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::RED_SCALE, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::RED_SHIFT, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::GREEN_SCALE, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::GREEN_SHIFT, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::BLUE_SCALE, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::BLUE_SHIFT, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::HUE, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::SATURATION, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::CONTRAST, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::BRIGHTNESS, _1), + std::bind(&PaletteHandler::changeAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), + PaletteHandler::GAMMA, _1), + // NTSC filter adjustables + std::bind(&TIASurface::changeNTSC, &myOSystem.frameBuffer().tiaSurface(), _1), + std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), + int(NTSCFilter::Adjustables::SHARPNESS), _1), + std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), + int(NTSCFilter::Adjustables::RESOLUTION), _1), + std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), + int(NTSCFilter::Adjustables::ARTIFACTS), _1), + std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), + int(NTSCFilter::Adjustables::FRINGING), _1), + std::bind(&TIASurface::changeNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), + int(NTSCFilter::Adjustables::BLEEDING), _1), + std::bind(&Console::changePhosphor, &myOSystem.console(), _1), + std::bind(&TIASurface::setScanlineIntensity, &myOSystem.frameBuffer().tiaSurface(), _1), + std::bind(&Console::toggleInter, &myOSystem.console(), _1), + + // *** Input settings *** + std::bind(&PhysicalJoystickHandler::changeDigitalDeadZone, &joyHandler(), _1), + std::bind(&PhysicalJoystickHandler::changeAnalogPaddleDeadZone, &joyHandler(), _1), + std::bind(&PhysicalJoystickHandler::changeAnalogPaddleSensitivity, &joyHandler(), _1), + std::bind(&PhysicalJoystickHandler::changeAnalogPaddleLinearity, &joyHandler(), _1), + std::bind(&PhysicalJoystickHandler::changePaddleDejitterAveraging, &joyHandler(), _1), + std::bind(&PhysicalJoystickHandler::changePaddleDejitterReaction, &joyHandler(), _1), + std::bind(&PhysicalJoystickHandler::changeDigitalPaddleSensitivity, &joyHandler(), _1), + std::bind(&Console::changeAutoFireRate, &myOSystem.console(), _1), + std::bind(&EventHandler::toggleAllow4JoyDirections, &myOSystem.eventHandler(), _1), + std::bind(&PhysicalKeyboardHandler::toggleModKeys, &keyHandler(), _1), + std::bind(&EventHandler::toggleSAPortOrder, &myOSystem.eventHandler(), _1), + std::bind(&EventHandler::changeMouseControllerMode, &myOSystem.eventHandler(), _1), + std::bind(&PhysicalJoystickHandler::changeMousePaddleSensitivity, &joyHandler(), _1), + std::bind(&PhysicalJoystickHandler::changeMouseTrackballSensitivity, &joyHandler(), _1), + std::bind(&PhysicalJoystickHandler::changeDrivingSensitivity, &joyHandler(), _1), + std::bind(&EventHandler::changeMouseCursor, &myOSystem.eventHandler(), _1), + std::bind(&FrameBuffer::toggleGrabMouse, &myOSystem.frameBuffer(), _1), + // Game properties/Controllers + std::bind(&Console::changeLeftController, &myOSystem.console(), _1), // property, not persisted + std::bind(&Console::changeRightController, &myOSystem.console(), _1), // property, not persisted + std::bind(&Console::toggleSwapPorts, &myOSystem.console(), _1), // property, not persisted + std::bind(&Console::toggleSwapPaddles, &myOSystem.console(), _1), // property, not persisted + std::bind(&Console::changePaddleCenterX, &myOSystem.console(), _1), // property, not persisted + std::bind(&Console::changePaddleCenterY, &myOSystem.console(), _1), // property, not persisted + std::bind(&EventHandler::changeMouseControl, &myOSystem.eventHandler(), _1), // property, not persisted + std::bind(&Console::changePaddleAxesRange, &myOSystem.console(), _1), // property, not persisted + + // *** Debug settings *** + std::bind(&FrameBuffer::toggleFrameStats, &myOSystem.frameBuffer(), _1), + std::bind(&Console::toggleP0Bit, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleP1Bit, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleM0Bit, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleM1Bit, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleBLBit, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::togglePFBit, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleBits, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleP0Collision, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleP1Collision, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleM0Collision, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleM1Collision, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleBLCollision, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::togglePFCollision, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleCollisions, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleFixedColors, &myOSystem.console(), _1), // debug, not persisted + std::bind(&Console::toggleColorLoss, &myOSystem.console(), _1), + std::bind(&Console::toggleJitter, &myOSystem.console(), _1), + + // *** Following functions are not used when cycling settings, but for "direct only" hotkeys *** + std::bind(&StateManager::changeState, &myOSystem.state(), _1), // temporary, not persisted + std::bind(&PaletteHandler::changeCurrentAdjustable, &myOSystem.frameBuffer().tiaSurface().paletteHandler(), _1), + std::bind(&TIASurface::changeCurrentNTSCAdjustable, &myOSystem.frameBuffer().tiaSurface(), _1), + std::bind(&Console::changeSpeed, &myOSystem.console(), _1), + }; + + return ADJUST_FUNCTIONS[int(setting)]; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool GlobalKeyHandler::isAdjustRepeated(const AdjustSetting setting) const +{ + const bool ADJUST_REPEATED[int(AdjustSetting::NUM_ADJ)] = + { + // *** Audio & Video group *** + true, // VOLUME + false, // ZOOM (always repeating) + false, // FULLSCREEN (always repeating) + #ifdef ADAPTABLE_REFRESH_SUPPORT + false, // ADAPT_REFRESH (always repeating) + #endif + true, // OVERSCAN + false, // TVFORMAT + true, // VCENTER + false, // ASPECT_RATIO (always repeating) + true, // VSIZE + // Palette adjustables + false, // PALETTE + true, // PALETTE_PHASE + true, // PALETTE_RED_SCALE + true, // PALETTE_RED_SHIFT + true, // PALETTE_GREEN_SCALE + true, // PALETTE_GREEN_SHIFT + true, // PALETTE_BLUE_SCALE + true, // PALETTE_BLUE_SHIFT + true, // PALETTE_HUE + true, // PALETTE_SATURATION + true, // PALETTE_CONTRAST + true, // PALETTE_BRIGHTNESS + true, // PALETTE_GAMMA + // NTSC filter adjustables + false, // NTSC_PRESET + true, // NTSC_SHARPNESS + true, // NTSC_RESOLUTION + true, // NTSC_ARTIFACTS + true, // NTSC_FRINGING + true, // NTSC_BLEEDING + // Other TV effects adjustables + true, // PHOSPHOR + true, // SCANLINES + false, // INTERPOLATION + // *** Input group *** + true, // DEADZONE + true, // ANALOG_DEADZONE + true, // ANALOG_SENSITIVITY + true, // ANALOG_LINEARITY + true, // DEJITTER_AVERAGING + true, // DEJITTER_REACTION + true, // DIGITAL_SENSITIVITY + true, // AUTO_FIRE + false, // FOUR_DIRECTIONS + false, // MOD_KEY_COMBOS + false, // SA_PORT_ORDER + false, // USE_MOUSE + true, // PADDLE_SENSITIVITY + true, // TRACKBALL_SENSITIVITY + true, // DRIVING_SENSITIVITY + false, // MOUSE_CURSOR + false, // GRAB_MOUSE + false, // LEFT_PORT + false, // RIGHT_PORT + false, // SWAP_PORTS + false, // SWAP_PADDLES + true, // PADDLE_CENTER_X + true, // PADDLE_CENTER_Y + false, // MOUSE_CONTROL + true, // MOUSE_RANGE + // *** Debug group *** + false, // STATS + false, // P0_ENAM + false, // P1_ENAM + false, // M0_ENAM + false, // M1_ENAM + false, // BL_ENAM + false, // PF_ENAM + false, // ALL_ENAM + false, // P0_CX + false, // P1_CX + false, // M0_CX + false, // M1_CX + false, // BL_CX + false, // PF_CX + false, // ALL_CX + false, // FIXED_COL + false, // COLOR_LOSS + false, // JITTER + // *** Only used via direct hotkeys *** + true, // STATE + true, // PALETTE_CHANGE_ATTRIBUTE + true, // NTSC_CHANGE_ATTRIBUTE + true, // CHANGE_SPEED + }; + + return ADJUST_REPEATED[int(setting)]; +} diff --git a/src/emucore/GlobalKeyHandler.hxx b/src/emucore/GlobalKeyHandler.hxx new file mode 100644 index 000000000..926a7c001 --- /dev/null +++ b/src/emucore/GlobalKeyHandler.hxx @@ -0,0 +1,183 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2021 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#ifndef GLOBALKEYHANDLER_HXX +#define GLOBALKEYHANDLER_HXX + +#include "EventHandler.hxx" + +/** + This class takes care of event handling of global hotkeys. + + @author Thomas Jentzsch +*/ +class GlobalKeyHandler +{ + public: + GlobalKeyHandler(OSystem& osystem); + + public: + enum class AdjustSetting + { + NONE = -1, + // *** Audio & Video group *** + VOLUME, + ZOOM, + FULLSCREEN, + #ifdef ADAPTABLE_REFRESH_SUPPORT + ADAPT_REFRESH, + #endif + OVERSCAN, + TVFORMAT, + VCENTER, + ASPECT_RATIO, + VSIZE, + // Palette adjustables + PALETTE, + PALETTE_PHASE, + PALETTE_RED_SCALE, + PALETTE_RED_SHIFT, + PALETTE_GREEN_SCALE, + PALETTE_GREEN_SHIFT, + PALETTE_BLUE_SCALE, + PALETTE_BLUE_SHIFT, + PALETTE_HUE, + PALETTE_SATURATION, + PALETTE_CONTRAST, + PALETTE_BRIGHTNESS, + PALETTE_GAMMA, + // NTSC filter adjustables + NTSC_PRESET, + NTSC_SHARPNESS, + NTSC_RESOLUTION, + NTSC_ARTIFACTS, + NTSC_FRINGING, + NTSC_BLEEDING, + // Other TV effects adjustables + PHOSPHOR, + SCANLINES, + INTERPOLATION, + // *** Input group *** + DEADZONE, + ANALOG_DEADZONE, + ANALOG_SENSITIVITY, + ANALOG_LINEARITY, + DEJITTER_AVERAGING, + DEJITTER_REACTION, + DIGITAL_SENSITIVITY, + AUTO_FIRE, + FOUR_DIRECTIONS, + MOD_KEY_COMBOS, + SA_PORT_ORDER, + USE_MOUSE, + PADDLE_SENSITIVITY, + TRACKBALL_SENSITIVITY, + DRIVING_SENSITIVITY, + MOUSE_CURSOR, + GRAB_MOUSE, + LEFT_PORT, + RIGHT_PORT, + SWAP_PORTS, + SWAP_PADDLES, + PADDLE_CENTER_X, + PADDLE_CENTER_Y, + MOUSE_CONTROL, + MOUSE_RANGE, + // *** Debug group *** + STATS, + P0_ENAM, + P1_ENAM, + M0_ENAM, + M1_ENAM, + BL_ENAM, + PF_ENAM, + ALL_ENAM, + P0_CX, + P1_CX, + M0_CX, + M1_CX, + BL_CX, + PF_CX, + ALL_CX, + FIXED_COL, + COLOR_LOSS, + JITTER, + // *** Only used via direct hotkeys *** + STATE, + PALETTE_CHANGE_ATTRIBUTE, + NTSC_CHANGE_ATTRIBUTE, + CHANGE_SPEED, + // *** Ranges *** + NUM_ADJ, + START_AV_ADJ = VOLUME, + END_AV_ADJ = INTERPOLATION, + START_INPUT_ADJ = DEADZONE, + END_INPUT_ADJ = MOUSE_RANGE, + START_DEBUG_ADJ = STATS, + END_DEBUG_ADJ = JITTER, + }; + + public: + bool handleEvent(const Event::Type event, bool pressed, bool repeated); + void setAdjustSetting(const AdjustSetting setting); + void setAdjustDirect(const AdjustSetting setting); + + private: + enum class AdjustGroup + { + AV, + INPUT, + DEBUG, + NUM_GROUPS + }; + + private: + // The following methods are used for adjusting several settings using global hotkeys + // They return the function used to adjust the currenly selected setting + const AdjustGroup getAdjustGroup() const; + const AdjustFunction cycleAdjustSetting(int direction); + const AdjustFunction getAdjustSetting(const AdjustSetting setting) const; + // Check if the current adjustment should be repeated + bool isAdjustRepeated(const AdjustSetting setting) const; + + PhysicalJoystickHandler& joyHandler() const { return myOSystem.eventHandler().joyHandler(); } + PhysicalKeyboardHandler& keyHandler() const { return myOSystem.eventHandler().keyHandler(); } + + bool isJoystick(const Controller& controller) const; + bool isPaddle(const Controller& controller) const; + bool isTrackball(const Controller& controller) const; + + // Check if a currently non-relevant adjustment can be skipped + bool skipAVSetting() const; + bool skipInputSetting() const; + bool skipDebugSetting() const; + + private: + // Global OSystem object + OSystem& myOSystem; + + // If true, the setting's message is visible and its value can be changed + bool myAdjustActive{false}; + + // ID of the currently selected global setting + AdjustSetting myAdjustSetting{AdjustSetting::START_AV_ADJ}; + + // ID of the currently selected direct hotkey setting (0 if none) + AdjustSetting myAdjustDirect{AdjustSetting::NONE}; +}; + +#endif diff --git a/src/emucore/QuadTari.hxx b/src/emucore/QuadTari.hxx index e176b3076..50b68c20a 100644 --- a/src/emucore/QuadTari.hxx +++ b/src/emucore/QuadTari.hxx @@ -80,6 +80,16 @@ class QuadTari : public Controller */ string name() const override; + /** + Returns the first attached controller. + */ + const Controller& firstController() const { return *myFirstController; } + + /** + Returns the second attached controller. + */ + const Controller& secondController() const { return *mySecondController; } + /** Answers whether the controller is intrinsically an analog controller. Depends on the attached controllers. diff --git a/src/emucore/module.mk b/src/emucore/module.mk index 78a056812..c8f0d96bd 100644 --- a/src/emucore/module.mk +++ b/src/emucore/module.mk @@ -65,6 +65,7 @@ MODULE_OBJS := \ src/emucore/FBSurface.o \ src/emucore/FSNode.o \ src/emucore/Genesis.o \ + src/emucore/GlobalKeyHandler.o \ src/emucore/Joystick.o \ src/emucore/Keyboard.o \ src/emucore/KidVid.o \ diff --git a/src/windows/Stella.vcxproj b/src/windows/Stella.vcxproj index 2e12c2a1d..b66b64569 100755 --- a/src/windows/Stella.vcxproj +++ b/src/windows/Stella.vcxproj @@ -879,6 +879,7 @@ + @@ -2070,6 +2071,7 @@ + @@ -2358,4 +2360,4 @@ - + \ No newline at end of file diff --git a/src/windows/Stella.vcxproj.filters b/src/windows/Stella.vcxproj.filters index 6cc7fabba..d3a301a74 100644 --- a/src/windows/Stella.vcxproj.filters +++ b/src/windows/Stella.vcxproj.filters @@ -1113,6 +1113,9 @@ Source Files\debugger + + Source Files\emucore + @@ -2288,6 +2291,9 @@ Header Files\emucore + + Header Files\emucore +