You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
6.3 KiB
253 lines
6.3 KiB
/*
|
|
Copyright 2020-2021 Brad Parker
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
#include <QKeyEvent>
|
|
#include <QMouseEvent>
|
|
#include "input.h"
|
|
#include "../frontend/mainwindow.h"
|
|
#include "../core/core.h"
|
|
|
|
InputState::InputState(QObject *parent) :
|
|
QObject(parent)
|
|
,m_inputState()
|
|
,m_analogInputState()
|
|
,m_mousePosAbs()
|
|
,m_mousePos()
|
|
,m_mouseButtonsState()
|
|
,m_core(nullptr)
|
|
,m_mainwindow(nullptr)
|
|
{
|
|
m_core = Core::instance();
|
|
m_mainwindow = MainWindow::instance();
|
|
}
|
|
|
|
InputState* InputState::instance() {
|
|
static InputState instance;
|
|
return &instance;
|
|
}
|
|
|
|
Qt::MouseButtons InputState::getMouseButtonsState() {
|
|
return m_mouseButtonsState;
|
|
}
|
|
|
|
int InputState::getMousePosRelX() {
|
|
int p = m_mousePos.x();
|
|
m_mousePos.setX(0);
|
|
return p;
|
|
}
|
|
|
|
int InputState::getMousePosRelY() {
|
|
int p = m_mousePos.y();
|
|
m_mousePos.setY(0);
|
|
return p;
|
|
}
|
|
|
|
void InputState::mousePressEvent(QMouseEvent *event) {
|
|
m_mouseButtonsState |= event->button();
|
|
|
|
event->ignore();
|
|
}
|
|
|
|
void InputState::mouseReleaseEvent(QMouseEvent *event) {
|
|
m_mouseButtonsState &= ~(event->button());
|
|
|
|
event->ignore();
|
|
}
|
|
|
|
void InputState::mouseMoveEvent(QMouseEvent *event) {
|
|
QPoint p = event->pos();
|
|
|
|
m_mousePos.setX(p.x() - m_mousePosAbs.x());
|
|
m_mousePos.setY(p.y() - m_mousePosAbs.y());
|
|
|
|
m_mousePosAbs = p;
|
|
|
|
event->ignore();
|
|
}
|
|
|
|
bool InputState::keyPressEvent(QKeyEvent *event) {
|
|
bool handled = true;
|
|
|
|
switch(event->key()) {
|
|
case Qt::Key_Up:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_UP] = 1;
|
|
break;
|
|
case Qt::Key_Down:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_DOWN] = 1;
|
|
break;
|
|
case Qt::Key_Left:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_LEFT] = 1;
|
|
break;
|
|
case Qt::Key_Right:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_RIGHT] = 1;
|
|
break;
|
|
case Qt::Key_Home:
|
|
m_analogInputState[RETRO_DEVICE_ID_ANALOG_Y] = -0x7fff;
|
|
break;
|
|
case Qt::Key_End:
|
|
m_analogInputState[RETRO_DEVICE_ID_ANALOG_Y] = 0x7fff;
|
|
break;
|
|
case Qt::Key_Delete:
|
|
m_analogInputState[RETRO_DEVICE_ID_ANALOG_X] = -0x7fff;
|
|
break;
|
|
case Qt::Key_PageDown:
|
|
m_analogInputState[RETRO_DEVICE_ID_ANALOG_X] = 0x7fff;
|
|
break;
|
|
case Qt::Key_Shift:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_SELECT] = 1;
|
|
break;
|
|
case Qt::Key_Return:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_START] = 1;
|
|
break;
|
|
case Qt::Key_A:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_L] = 1;
|
|
break;
|
|
case Qt::Key_Z:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_R] = 1;
|
|
break;
|
|
case Qt::Key_W:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_L2] = 1;
|
|
break;
|
|
case Qt::Key_T:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_R2] = 1;
|
|
break;
|
|
case Qt::Key_S:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_X] = 1;
|
|
break;
|
|
case Qt::Key_X:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_Y] = 1;
|
|
break;
|
|
case Qt::Key_D:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_A] = 1;
|
|
break;
|
|
case Qt::Key_C:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_B] = 1;
|
|
break;
|
|
case Qt::Key_R:
|
|
m_core->reset();
|
|
break;
|
|
/*case Qt::Key_Escape:
|
|
case Qt::Key_Q:
|
|
QTimer::singleShot(0, qApp, &QCoreApplication::quit);
|
|
break;*/
|
|
case Qt::Key_P:
|
|
m_core->setPaused(!m_core->isPaused());
|
|
break;
|
|
case Qt::Key_F:
|
|
m_mainwindow->setFullScreen(!m_mainwindow->isFullScreen());
|
|
break;
|
|
case Qt::Key_M:
|
|
m_mainwindow->setCoreMuted(!m_core->isMuted());
|
|
break;
|
|
case Qt::Key_U:
|
|
m_mainwindow->openCoreOptionsDialog();
|
|
break;
|
|
case Qt::Key_F2:
|
|
m_mainwindow->saveState();
|
|
break;
|
|
case Qt::Key_F3:
|
|
m_core->saveSRAM();
|
|
break;
|
|
case Qt::Key_F4:
|
|
m_mainwindow->loadState();
|
|
break;
|
|
default:
|
|
handled = false;
|
|
break;
|
|
}
|
|
|
|
return handled;
|
|
}
|
|
|
|
bool InputState::keyReleaseEvent(QKeyEvent *event) {
|
|
bool handled = true;
|
|
|
|
switch(event->key()) {
|
|
case Qt::Key_Up:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_UP] = 0;
|
|
break;
|
|
case Qt::Key_Down:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_DOWN] = 0;
|
|
break;
|
|
case Qt::Key_Left:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_LEFT] = 0;
|
|
break;
|
|
case Qt::Key_Right:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_RIGHT] = 0;
|
|
break;
|
|
case Qt::Key_Home:
|
|
m_analogInputState[RETRO_DEVICE_ID_ANALOG_Y] = 0;
|
|
break;
|
|
case Qt::Key_End:
|
|
m_analogInputState[RETRO_DEVICE_ID_ANALOG_Y] = 0;
|
|
break;
|
|
case Qt::Key_Delete:
|
|
m_analogInputState[RETRO_DEVICE_ID_ANALOG_X] = 0;
|
|
break;
|
|
case Qt::Key_PageDown:
|
|
m_analogInputState[RETRO_DEVICE_ID_ANALOG_X] = 0;
|
|
break;
|
|
case Qt::Key_Shift:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_SELECT] = 0;
|
|
break;
|
|
case Qt::Key_Return:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_START] = 0;
|
|
break;
|
|
case Qt::Key_A:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_L] = 0;
|
|
break;
|
|
case Qt::Key_Z:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_R] = 0;
|
|
break;
|
|
case Qt::Key_W:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_L2] = 0;
|
|
break;
|
|
case Qt::Key_T:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_R2] = 0;
|
|
break;
|
|
case Qt::Key_S:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_X] = 0;
|
|
break;
|
|
case Qt::Key_X:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_Y] = 0;
|
|
break;
|
|
case Qt::Key_D:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_A] = 0;
|
|
break;
|
|
case Qt::Key_C:
|
|
m_inputState[RETRO_DEVICE_ID_JOYPAD_B] = 0;
|
|
break;
|
|
default:
|
|
handled = false;
|
|
break;
|
|
}
|
|
|
|
return handled;
|
|
}
|
|
|
|
int16_t InputState::getInputState(unsigned id) {
|
|
if(id >= (sizeof(m_inputState) / sizeof(m_inputState[0])))
|
|
return 0;
|
|
|
|
return m_inputState[id];
|
|
}
|
|
|
|
int16_t InputState::getAnalogInputState(unsigned id) {
|
|
if(id >= (sizeof(m_analogInputState) / sizeof(m_analogInputState[0])))
|
|
return 0;
|
|
|
|
return m_analogInputState[id];
|
|
}
|
|
|