a bit of frontend refactoring

This commit is contained in:
RSDuck 2023-07-29 21:27:28 +02:00
parent 8fd46e5f8c
commit 3efbf1b813
5 changed files with 766 additions and 737 deletions

View File

@ -27,28 +27,48 @@
namespace Frontend namespace Frontend
{ {
enum ScreenLayout
{
screenLayout_Natural, // top screen above bottom screen always
screenLayout_Horizontal,
screenLayout_Vertical,
screenLayout_Hybrid,
screenLayout_MAX,
};
enum ScreenRotation
{
screenRot_0Deg,
screenRot_90Deg,
screenRot_180Deg,
screenRot_270Deg,
screenRot_MAX,
};
enum ScreenSizing
{
screenSizing_Even, // both screens get same size
screenSizing_EmphTop, // make top screen as big as possible, fit bottom screen in remaining space
screenSizing_EmphBot,
screenSizing_Auto, // not applied in SetupScreenLayout
screenSizing_TopOnly,
screenSizing_BotOnly,
screenSizing_MAX,
};
// setup the display layout based on the provided display size and parameters // setup the display layout based on the provided display size and parameters
// * screenWidth/screenHeight: size of the host display // * screenWidth/screenHeight: size of the host display
// * screenLayout: how the DS screens are laid out // * screenLayout: how the DS screens are laid out
// 0 = natural (top screen above bottom screen always) // * rotation: angle at which the DS screens are presented
// 1 = vertical
// 2 = horizontal
// 3 = hybrid
// * rotation: angle at which the DS screens are presented: 0/1/2/3 = 0/90/180/270
// * sizing: how the display size is shared between the two screens // * sizing: how the display size is shared between the two screens
// 0 = even (both screens get same size) // * screenGap: size of the gap between the two screens in pixels
// 1 = emphasize top screen (make top screen as big as possible, fit bottom screen in remaining space)
// 2 = emphasize bottom screen
// 4 = top only
// 5 = bottom only
// * screenGap: size of the gap between the two screens
// * integerScale: force screens to be scaled up at integer scaling factors // * integerScale: force screens to be scaled up at integer scaling factors
// * screenSwap: whether to swap the position of both screens // * screenSwap: whether to swap the position of both screens
// * topAspect/botAspect: ratio by which to scale the top and bottom screen respectively // * topAspect/botAspect: ratio by which to scale the top and bottom screen respectively
void SetupScreenLayout(int screenWidth, int screenHeight, void SetupScreenLayout(int screenWidth, int screenHeight,
int screenLayout, ScreenLayout screenLayout,
int rotation, ScreenRotation rotation,
int sizing, ScreenSizing sizing,
int screenGap, int screenGap,
bool integerScale, bool integerScale,
bool swapScreens, bool swapScreens,

View File

@ -123,9 +123,9 @@ void M23_Transform(float* m, float& x, float& y)
void SetupScreenLayout(int screenWidth, int screenHeight, void SetupScreenLayout(int screenWidth, int screenHeight,
int screenLayout, ScreenLayout screenLayout,
int rotation, ScreenRotation rotation,
int sizing, ScreenSizing sizing,
int screenGap, int screenGap,
bool integerScale, bool integerScale,
bool swapScreens, bool swapScreens,
@ -134,8 +134,8 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
HybEnable = screenLayout == 3; HybEnable = screenLayout == 3;
if (HybEnable) if (HybEnable)
{ {
screenLayout = 0; screenLayout = screenLayout_Natural;
sizing = 0; sizing = screenSizing_Even;
HybScreen = swapScreens ? 1 : 0; HybScreen = swapScreens ? 1 : 0;
swapScreens = false; swapScreens = false;
topAspect = botAspect = 1; topAspect = botAspect = 1;
@ -149,7 +149,7 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
{0, 0}, {256, 192} {0, 0}, {256, 192}
}; };
int layout = screenLayout == 0 int layout = screenLayout == screenLayout_Natural
? rotation % 2 ? rotation % 2
: screenLayout - 1; : screenLayout - 1;
@ -187,11 +187,11 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
int posRefPointOffset = 0; int posRefPointOffset = 0;
int posRefPointCount = HybEnable ? 6 : 4; int posRefPointCount = HybEnable ? 6 : 4;
if (sizing == 4 || sizing == 5) if (sizing == screenSizing_TopOnly || sizing == screenSizing_BotOnly)
{ {
float* mtx = sizing == 4 ? TopScreenMtx : BotScreenMtx; float* mtx = sizing == screenSizing_TopOnly ? TopScreenMtx : BotScreenMtx;
int primOffset = sizing == 4 ? 0 : 2; int primOffset = sizing == screenSizing_TopOnly ? 0 : 2;
int secOffset = sizing == 5 ? 2 : 0; int secOffset = sizing == screenSizing_BotOnly ? 2 : 0;
float hSize = fabsf(refpoints[primOffset][0] - refpoints[primOffset+1][0]); float hSize = fabsf(refpoints[primOffset][0] - refpoints[primOffset+1][0]);
float vSize = fabsf(refpoints[primOffset][1] - refpoints[primOffset+1][1]); float vSize = fabsf(refpoints[primOffset][1] - refpoints[primOffset+1][1]);
@ -200,8 +200,8 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
if (integerScale) if (integerScale)
scale = floorf(scale); scale = floorf(scale);
TopEnable = sizing == 4; TopEnable = sizing == screenSizing_TopOnly;
BotEnable = sizing == 5; BotEnable = sizing == screenSizing_BotOnly;
botScale = scale; botScale = scale;
M23_Scale(mtx, scale); M23_Scale(mtx, scale);
@ -245,7 +245,7 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
// scale // scale
{ {
if (sizing == 0) if (sizing == screenSizing_Even)
{ {
float minX = refpoints[0][0], maxX = minX; float minX = refpoints[0][0], maxX = minX;
float minY = refpoints[0][1], maxY = minY; float minY = refpoints[0][1], maxY = minY;
@ -299,7 +299,7 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
? (scale * vSize * 4) / 3 ? (scale * vSize * 4) / 3
: (scale * hSize * 4) / 3; : (scale * hSize * 4) / 3;
if (rotation > 1) if (rotation > screenRot_90Deg)
hybWidth *= -1; hybWidth *= -1;
M23_Translate(TopScreenMtx, (layout==0)?hybWidth:0, (layout==1)?hybWidth:0); M23_Translate(TopScreenMtx, (layout==0)?hybWidth:0, (layout==1)?hybWidth:0);
@ -311,8 +311,8 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
botTrans[2+layout] += hybWidth; botTrans[2+layout] += hybWidth;
hybTrans[0] = scale * (rotation == 0 || rotation == 3 ? minX : maxX); hybTrans[0] = scale * (rotation == screenRot_0Deg || rotation == screenRot_270Deg ? minX : maxX);
hybTrans[1] = scale * (rotation == 0 || rotation == 1 ? minY : maxY); hybTrans[1] = scale * (rotation == screenRot_0Deg || rotation == screenRot_90Deg ? minY : maxY);
M23_Translate(HybScreenMtx, hybTrans[0], hybTrans[1]); M23_Translate(HybScreenMtx, hybTrans[0], hybTrans[1]);
M23_Transform(HybScreenMtx, refpoints[4][0], refpoints[4][1]); M23_Transform(HybScreenMtx, refpoints[4][0], refpoints[4][1]);
@ -321,10 +321,10 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
} }
else else
{ {
int primOffset = (sizing == 1) ? 0 : 2; int primOffset = (sizing == screenSizing_EmphTop) ? 0 : 2;
int secOffset = (sizing == 1) ? 2 : 0; int secOffset = (sizing == screenSizing_EmphTop) ? 2 : 0;
float* primMtx = (sizing == 1) ? TopScreenMtx : BotScreenMtx; float* primMtx = (sizing == screenSizing_EmphTop) ? TopScreenMtx : BotScreenMtx;
float* secMtx = (sizing == 1) ? BotScreenMtx : TopScreenMtx; float* secMtx = (sizing == screenSizing_EmphTop) ? BotScreenMtx : TopScreenMtx;
float primMinX = refpoints[primOffset][0], primMaxX = primMinX; float primMinX = refpoints[primOffset][0], primMaxX = primMinX;
float primMinY = refpoints[primOffset][1], primMaxY = primMinY; float primMinY = refpoints[primOffset][1], primMaxY = primMinY;
@ -386,7 +386,7 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
refpoints[secOffset+1][0] *= secScale; refpoints[secOffset+1][0] *= secScale;
refpoints[secOffset+1][1] *= secScale; refpoints[secOffset+1][1] *= secScale;
botScale = (sizing == 1) ? secScale : primScale; botScale = (sizing == screenSizing_EmphTop) ? secScale : primScale;
} }
} }
} }

View File

@ -42,17 +42,6 @@ enum
HK_MAX HK_MAX
}; };
enum
{
screenSizing_Even,
screenSizing_EmphTop,
screenSizing_EmphBot,
screenSizing_Auto,
screenSizing_TopOnly,
screenSizing_BotOnly,
screenSizing_MAX,
};
enum enum
{ {
micInputType_Silence, micInputType_Silence,

View File

@ -174,13 +174,14 @@ const struct { int id; float ratio; const char* label; } aspectRatios[] =
{ 2, (21.f / 9) / (4.f / 3), "21:9" }, { 2, (21.f / 9) / (4.f / 3), "21:9" },
{ 3, 0, "window" } { 3, 0, "window" }
}; };
constexpr int AspectRatiosNum = sizeof(aspectRatios) / sizeof(aspectRatios[0]);
EmuThread::EmuThread(QObject* parent) : QThread(parent) EmuThread::EmuThread(QObject* parent) : QThread(parent)
{ {
EmuStatus = 0; EmuStatus = emuStatus_Exit;
EmuRunning = 2; EmuRunning = emuStatus_Paused;
EmuPause = 0; EmuPauseStack = EmuPauseStackRunning;
RunningSomething = false; RunningSomething = false;
connect(this, SIGNAL(windowUpdate()), mainWindow->panelWidget, SLOT(repaint())); connect(this, SIGNAL(windowUpdate()), mainWindow->panelWidget, SLOT(repaint()));
@ -353,7 +354,7 @@ void EmuThread::run()
char melontitle[100]; char melontitle[100];
while (EmuRunning != 0) while (EmuRunning != emuStatus_Exit)
{ {
Input::Process(); Input::Process();
@ -425,10 +426,10 @@ void EmuThread::run()
DSi_BPTWL::ProcessVolumeSwitchInput(currentTime); DSi_BPTWL::ProcessVolumeSwitchInput(currentTime);
} }
if (EmuRunning == 1 || EmuRunning == 3) if (EmuRunning == emuStatus_Running || EmuRunning == emuStatus_FrameStep)
{ {
EmuStatus = 1; EmuStatus = emuStatus_Running;
if (EmuRunning == 3) EmuRunning = 2; if (EmuRunning == emuStatus_FrameStep) EmuRunning = emuStatus_Paused;
// update render settings if needed // update render settings if needed
// HACK: // HACK:
@ -473,7 +474,7 @@ void EmuThread::run()
AudioInOut::MicProcess(); AudioInOut::MicProcess();
// auto screen layout // auto screen layout
if (Config::ScreenSizing == screenSizing_Auto) if (Config::ScreenSizing == Frontend::screenSizing_Auto)
{ {
mainScreenPos[2] = mainScreenPos[1]; mainScreenPos[2] = mainScreenPos[1];
mainScreenPos[1] = mainScreenPos[0]; mainScreenPos[1] = mainScreenPos[0];
@ -485,14 +486,14 @@ void EmuThread::run()
{ {
// constant flickering, likely displaying 3D on both screens // constant flickering, likely displaying 3D on both screens
// TODO: when both screens are used for 2D only...??? // TODO: when both screens are used for 2D only...???
guess = screenSizing_Even; guess = Frontend::screenSizing_Even;
} }
else else
{ {
if (mainScreenPos[0] == 1) if (mainScreenPos[0] == 1)
guess = screenSizing_EmphTop; guess = Frontend::screenSizing_EmphTop;
else else
guess = screenSizing_EmphBot; guess = Frontend::screenSizing_EmphBot;
} }
if (guess != autoScreenSizing) if (guess != autoScreenSizing)
@ -528,7 +529,7 @@ void EmuThread::run()
MelonCap::Update(); MelonCap::Update();
#endif // MELONCAP #endif // MELONCAP
if (EmuRunning == 0) break; if (EmuRunning == emuStatus_Exit) break;
winUpdateCount++; winUpdateCount++;
if (winUpdateCount >= winUpdateFreq && !oglContext) if (winUpdateCount >= winUpdateFreq && !oglContext)
@ -632,21 +633,21 @@ void EmuThread::run()
if (oglContext) if (oglContext)
drawScreenGL(); drawScreenGL();
int contextRequest = ContextRequest; ContextRequestKind contextRequest = ContextRequest;
if (contextRequest == 1) if (contextRequest == contextRequest_InitGL)
{ {
initOpenGL(); initOpenGL();
ContextRequest = 0; ContextRequest = contextRequest_None;
} }
else if (contextRequest == 2) else if (contextRequest == contextRequest_DeInitGL)
{ {
deinitOpenGL(); deinitOpenGL();
ContextRequest = 0; ContextRequest = contextRequest_None;
} }
} }
} }
EmuStatus = 0; EmuStatus = emuStatus_Exit;
GPU::DeInitRenderer(); GPU::DeInitRenderer();
NDS::DeInit(); NDS::DeInit();
@ -660,8 +661,8 @@ void EmuThread::changeWindowTitle(char* title)
void EmuThread::emuRun() void EmuThread::emuRun()
{ {
EmuRunning = 1; EmuRunning = emuStatus_Running;
EmuPause = 0; EmuPauseStack = EmuPauseStackRunning;
RunningSomething = true; RunningSomething = true;
// checkme // checkme
@ -671,34 +672,34 @@ void EmuThread::emuRun()
void EmuThread::initContext() void EmuThread::initContext()
{ {
ContextRequest = 1; ContextRequest = contextRequest_InitGL;
while (ContextRequest != 0); while (ContextRequest != contextRequest_None);
} }
void EmuThread::deinitContext() void EmuThread::deinitContext()
{ {
ContextRequest = 2; ContextRequest = contextRequest_DeInitGL;
while (ContextRequest != 0); while (ContextRequest != contextRequest_None);
} }
void EmuThread::emuPause() void EmuThread::emuPause()
{ {
EmuPause++; EmuPauseStack++;
if (EmuPause > 1) return; if (EmuPauseStack > EmuPauseStackPauseThreshold) return;
PrevEmuStatus = EmuRunning; PrevEmuStatus = EmuRunning;
EmuRunning = 2; EmuRunning = emuStatus_Paused;
while (EmuStatus != 2); while (EmuStatus != emuStatus_Paused);
AudioInOut::Disable(); AudioInOut::Disable();
} }
void EmuThread::emuUnpause() void EmuThread::emuUnpause()
{ {
if (EmuPause < 1) return; if (EmuPauseStack < EmuPauseStackPauseThreshold) return;
EmuPause--; EmuPauseStack--;
if (EmuPause > 0) return; if (EmuPauseStack >= EmuPauseStackPauseThreshold) return;
EmuRunning = PrevEmuStatus; EmuRunning = PrevEmuStatus;
@ -707,21 +708,21 @@ void EmuThread::emuUnpause()
void EmuThread::emuStop() void EmuThread::emuStop()
{ {
EmuRunning = 0; EmuRunning = emuStatus_Exit;
EmuPause = 0; EmuPauseStack = EmuPauseStackRunning;
AudioInOut::Disable(); AudioInOut::Disable();
} }
void EmuThread::emuFrameStep() void EmuThread::emuFrameStep()
{ {
if (EmuPause < 1) emit windowEmuPause(); if (EmuPauseStack < EmuPauseStackPauseThreshold) emit windowEmuPause();
EmuRunning = 3; EmuRunning = emuStatus_FrameStep;
} }
bool EmuThread::emuIsRunning() bool EmuThread::emuIsRunning()
{ {
return (EmuRunning == 1); return EmuRunning == emuStatus_Running;
} }
bool EmuThread::emuIsActive() bool EmuThread::emuIsActive()
@ -830,9 +831,9 @@ void ScreenHandler::screenSetupLayout(int w, int h)
aspectBot = ((float) w / h) / (4.f / 3.f); aspectBot = ((float) w / h) / (4.f / 3.f);
Frontend::SetupScreenLayout(w, h, Frontend::SetupScreenLayout(w, h,
Config::ScreenLayout, static_cast<Frontend::ScreenLayout>(Config::ScreenLayout),
Config::ScreenRotation, static_cast<Frontend::ScreenRotation>(Config::ScreenRotation),
sizing, static_cast<Frontend::ScreenSizing>(sizing),
Config::ScreenGap, Config::ScreenGap,
Config::IntegerScaling != 0, Config::IntegerScaling != 0,
Config::ScreenSwap != 0, Config::ScreenSwap != 0,
@ -844,32 +845,34 @@ void ScreenHandler::screenSetupLayout(int w, int h)
QSize ScreenHandler::screenGetMinSize(int factor = 1) QSize ScreenHandler::screenGetMinSize(int factor = 1)
{ {
bool isHori = (Config::ScreenRotation == 1 || Config::ScreenRotation == 3); bool isHori = (Config::ScreenRotation == Frontend::screenRot_90Deg
|| Config::ScreenRotation == Frontend::screenRot_270Deg);
int gap = Config::ScreenGap * factor; int gap = Config::ScreenGap * factor;
int w = 256 * factor; int w = 256 * factor;
int h = 192 * factor; int h = 192 * factor;
if (Config::ScreenSizing == 4 || Config::ScreenSizing == 5) if (Config::ScreenSizing == Frontend::screenSizing_TopOnly
|| Config::ScreenSizing == Frontend::screenSizing_BotOnly)
{ {
return QSize(w, h); return QSize(w, h);
} }
if (Config::ScreenLayout == 0) // natural if (Config::ScreenLayout == Frontend::screenLayout_Natural)
{ {
if (isHori) if (isHori)
return QSize(h+gap+h, w); return QSize(h+gap+h, w);
else else
return QSize(w, h+gap+h); return QSize(w, h+gap+h);
} }
else if (Config::ScreenLayout == 1) // vertical else if (Config::ScreenLayout == Frontend::screenLayout_Vertical)
{ {
if (isHori) if (isHori)
return QSize(h, w+gap+w); return QSize(h, w+gap+w);
else else
return QSize(w, h+gap+h); return QSize(w, h+gap+h);
} }
else if (Config::ScreenLayout == 2) // horizontal else if (Config::ScreenLayout == Frontend::screenLayout_Horizontal)
{ {
if (isHori) if (isHori)
return QSize(h+gap+h, w); return QSize(h+gap+h, w);
@ -1610,7 +1613,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
QMenu* submenu = menu->addMenu("Screen rotation"); QMenu* submenu = menu->addMenu("Screen rotation");
grpScreenRotation = new QActionGroup(submenu); grpScreenRotation = new QActionGroup(submenu);
for (int i = 0; i < 4; i++) for (int i = 0; i < Frontend::screenRot_MAX; i++)
{ {
int data = i*90; int data = i*90;
actScreenRotation[i] = submenu->addAction(QString("%1°").arg(data)); actScreenRotation[i] = submenu->addAction(QString("%1°").arg(data));
@ -1644,7 +1647,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
const char* screenlayout[] = {"Natural", "Vertical", "Horizontal", "Hybrid"}; const char* screenlayout[] = {"Natural", "Vertical", "Horizontal", "Hybrid"};
for (int i = 0; i < 4; i++) for (int i = 0; i < Frontend::screenLayout_MAX; i++)
{ {
actScreenLayout[i] = submenu->addAction(QString(screenlayout[i])); actScreenLayout[i] = submenu->addAction(QString(screenlayout[i]));
actScreenLayout[i]->setActionGroup(grpScreenLayout); actScreenLayout[i]->setActionGroup(grpScreenLayout);
@ -1666,7 +1669,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
const char* screensizing[] = {"Even", "Emphasize top", "Emphasize bottom", "Auto", "Top only", "Bottom only"}; const char* screensizing[] = {"Even", "Emphasize top", "Emphasize bottom", "Auto", "Top only", "Bottom only"};
for (int i = 0; i < screenSizing_MAX; i++) for (int i = 0; i < Frontend::screenSizing_MAX; i++)
{ {
actScreenSizing[i] = submenu->addAction(QString(screensizing[i])); actScreenSizing[i] = submenu->addAction(QString(screensizing[i]));
actScreenSizing[i]->setActionGroup(grpScreenSizing); actScreenSizing[i]->setActionGroup(grpScreenSizing);
@ -1686,8 +1689,8 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
QMenu* submenu = menu->addMenu("Aspect ratio"); QMenu* submenu = menu->addMenu("Aspect ratio");
grpScreenAspectTop = new QActionGroup(submenu); grpScreenAspectTop = new QActionGroup(submenu);
grpScreenAspectBot = new QActionGroup(submenu); grpScreenAspectBot = new QActionGroup(submenu);
actScreenAspectTop = new QAction*[sizeof(aspectRatios) / sizeof(aspectRatios[0])]; actScreenAspectTop = new QAction*[AspectRatiosNum];
actScreenAspectBot = new QAction*[sizeof(aspectRatios) / sizeof(aspectRatios[0])]; actScreenAspectBot = new QAction*[AspectRatiosNum];
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
@ -1701,7 +1704,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
actions = actScreenAspectBot; actions = actScreenAspectBot;
} }
for (int j = 0; j < sizeof(aspectRatios) / sizeof(aspectRatios[0]); j++) for (int j = 0; j < AspectRatiosNum; j++)
{ {
auto ratio = aspectRatios[j]; auto ratio = aspectRatios[j];
QString label = QString("%1 %2").arg(i ? "Bottom" : "Top", ratio.label); QString label = QString("%1 %2").arg(i ? "Bottom" : "Top", ratio.label);
@ -1806,7 +1809,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
actScreenSwap->setChecked(Config::ScreenSwap); actScreenSwap->setChecked(Config::ScreenSwap);
for (int i = 0; i < sizeof(aspectRatios) / sizeof(aspectRatios[0]); i++) for (int i = 0; i < AspectRatiosNum; i++)
{ {
if (Config::ScreenAspectTop == aspectRatios[i].id) if (Config::ScreenAspectTop == aspectRatios[i].id)
actScreenAspectTop[i]->setChecked(true); actScreenAspectTop[i]->setChecked(true);
@ -3011,18 +3014,18 @@ void MainWindow::onChangeScreenSwap(bool checked)
Config::ScreenSwap = checked?1:0; Config::ScreenSwap = checked?1:0;
// Swap between top and bottom screen when displaying one screen. // Swap between top and bottom screen when displaying one screen.
if (Config::ScreenSizing == screenSizing_TopOnly) if (Config::ScreenSizing == Frontend::screenSizing_TopOnly)
{ {
// Bottom Screen. // Bottom Screen.
Config::ScreenSizing = screenSizing_BotOnly; Config::ScreenSizing = Frontend::screenSizing_BotOnly;
actScreenSizing[screenSizing_TopOnly]->setChecked(false); actScreenSizing[Frontend::screenSizing_TopOnly]->setChecked(false);
actScreenSizing[Config::ScreenSizing]->setChecked(true); actScreenSizing[Config::ScreenSizing]->setChecked(true);
} }
else if (Config::ScreenSizing == screenSizing_BotOnly) else if (Config::ScreenSizing == Frontend::screenSizing_BotOnly)
{ {
// Top Screen. // Top Screen.
Config::ScreenSizing = screenSizing_TopOnly; Config::ScreenSizing = Frontend::screenSizing_TopOnly;
actScreenSizing[screenSizing_BotOnly]->setChecked(false); actScreenSizing[Frontend::screenSizing_BotOnly]->setChecked(false);
actScreenSizing[Config::ScreenSizing]->setChecked(true); actScreenSizing[Config::ScreenSizing]->setChecked(true);
} }
@ -3111,13 +3114,13 @@ void MainWindow::onFullscreenToggled()
void MainWindow::onScreenEmphasisToggled() void MainWindow::onScreenEmphasisToggled()
{ {
int currentSizing = Config::ScreenSizing; int currentSizing = Config::ScreenSizing;
if (currentSizing == screenSizing_EmphTop) if (currentSizing == Frontend::screenSizing_EmphTop)
{ {
Config::ScreenSizing = screenSizing_EmphBot; Config::ScreenSizing = Frontend::screenSizing_EmphBot;
} }
else if (currentSizing == screenSizing_EmphBot) else if (currentSizing == Frontend::screenSizing_EmphBot)
{ {
Config::ScreenSizing = screenSizing_EmphTop; Config::ScreenSizing = Frontend::screenSizing_EmphTop;
} }
emit screenLayoutChange(); emit screenLayoutChange();
@ -3279,12 +3282,12 @@ int main(int argc, char** argv)
SANITIZE(Config::AudioInterp, 0, 3); SANITIZE(Config::AudioInterp, 0, 3);
SANITIZE(Config::AudioVolume, 0, 256); SANITIZE(Config::AudioVolume, 0, 256);
SANITIZE(Config::MicInputType, 0, (int)micInputType_MAX); SANITIZE(Config::MicInputType, 0, (int)micInputType_MAX);
SANITIZE(Config::ScreenRotation, 0, 3); SANITIZE(Config::ScreenRotation, 0, (int)Frontend::screenRot_MAX);
SANITIZE(Config::ScreenGap, 0, 500); SANITIZE(Config::ScreenGap, 0, 500);
SANITIZE(Config::ScreenLayout, 0, 3); SANITIZE(Config::ScreenLayout, 0, (int)Frontend::screenLayout_MAX);
SANITIZE(Config::ScreenSizing, 0, (int)screenSizing_MAX); SANITIZE(Config::ScreenSizing, 0, (int)Frontend::screenSizing_MAX);
SANITIZE(Config::ScreenAspectTop, 0, 4); SANITIZE(Config::ScreenAspectTop, 0, AspectRatiosNum);
SANITIZE(Config::ScreenAspectBot, 0, 4); SANITIZE(Config::ScreenAspectBot, 0, AspectRatiosNum);
#undef SANITIZE #undef SANITIZE
AudioInOut::Init(); AudioInOut::Init();

View File

@ -94,12 +94,29 @@ private:
void initOpenGL(); void initOpenGL();
void deinitOpenGL(); void deinitOpenGL();
std::atomic<int> EmuStatus; enum EmuStatusKind
int PrevEmuStatus; {
int EmuRunning; emuStatus_Exit,
int EmuPause; emuStatus_Running,
emuStatus_Paused,
emuStatus_FrameStep,
};
std::atomic<EmuStatusKind> EmuStatus;
std::atomic<int> ContextRequest = 0; EmuStatusKind PrevEmuStatus;
EmuStatusKind EmuRunning;
constexpr static int EmuPauseStackRunning = 0;
constexpr static int EmuPauseStackPauseThreshold = 1;
int EmuPauseStack;
enum ContextRequestKind
{
contextRequest_None = 0,
contextRequest_InitGL,
contextRequest_DeInitGL
};
std::atomic<ContextRequestKind> ContextRequest = contextRequest_None;
GL::Context* oglContext = nullptr; GL::Context* oglContext = nullptr;
GLuint screenVertexBuffer, screenVertexArray; GLuint screenVertexBuffer, screenVertexArray;
@ -404,14 +421,14 @@ public:
QAction* actSavestateSRAMReloc; QAction* actSavestateSRAMReloc;
QAction* actScreenSize[4]; QAction* actScreenSize[4];
QActionGroup* grpScreenRotation; QActionGroup* grpScreenRotation;
QAction* actScreenRotation[4]; QAction* actScreenRotation[Frontend::screenRot_MAX];
QActionGroup* grpScreenGap; QActionGroup* grpScreenGap;
QAction* actScreenGap[6]; QAction* actScreenGap[6];
QActionGroup* grpScreenLayout; QActionGroup* grpScreenLayout;
QAction* actScreenLayout[4]; QAction* actScreenLayout[Frontend::screenLayout_MAX];
QAction* actScreenSwap; QAction* actScreenSwap;
QActionGroup* grpScreenSizing; QActionGroup* grpScreenSizing;
QAction* actScreenSizing[6]; QAction* actScreenSizing[Frontend::screenSizing_MAX];
QAction* actIntegerScaling; QAction* actIntegerScaling;
QActionGroup* grpScreenAspectTop; QActionGroup* grpScreenAspectTop;
QAction** actScreenAspectTop; QAction** actScreenAspectTop;