From d529b650c06a4dd43904dfead49011be1ba9db9a Mon Sep 17 00:00:00 2001 From: RSDuck Date: Sun, 17 Jan 2021 22:16:32 +0100 Subject: [PATCH] implement swapping the position of both screens closes #855 --- src/frontend/FrontendUtil.h | 3 ++- src/frontend/Util_Video.cpp | 4 ++-- src/frontend/qt_sdl/PlatformConfig.cpp | 2 ++ src/frontend/qt_sdl/PlatformConfig.h | 1 + src/frontend/qt_sdl/main.cpp | 18 +++++++++++++++++- src/frontend/qt_sdl/main.h | 2 ++ 6 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/frontend/FrontendUtil.h b/src/frontend/FrontendUtil.h index caac9f08..584250b0 100644 --- a/src/frontend/FrontendUtil.h +++ b/src/frontend/FrontendUtil.h @@ -120,7 +120,8 @@ void EnableCheats(bool enable); // 2 = emphasize bottom screen // * screenGap: size of the gap between the two screens // * integerScale: force screens to be scaled up at integer scaling factors -void SetupScreenLayout(int screenWidth, int screenHeight, int screenLayout, int rotation, int sizing, int screenGap, bool integerScale); +// * screenSwap: whether to swap the position of both screens +void SetupScreenLayout(int screenWidth, int screenHeight, int screenLayout, int rotation, int sizing, int screenGap, bool integerScale, int swapScreens); // get a 2x3 transform matrix for each screen // note: the transform assumes an origin point at the top left of the display, diff --git a/src/frontend/Util_Video.cpp b/src/frontend/Util_Video.cpp index 87cb9b50..f0963117 100644 --- a/src/frontend/Util_Video.cpp +++ b/src/frontend/Util_Video.cpp @@ -109,7 +109,7 @@ void M23_Transform(float* m, float& x, float& y) } -void SetupScreenLayout(int screenWidth, int screenHeight, int screenLayout, int rotation, int sizing, int screenGap, bool integerScale) +void SetupScreenLayout(int screenWidth, int screenHeight, int screenLayout, int rotation, int sizing, int screenGap, bool integerScale, int swapScreens) { float refpoints[4][2] = { @@ -152,7 +152,7 @@ void SetupScreenLayout(int screenWidth, int screenHeight, int screenLayout, int (((layout == 0 && (rotation % 2 == 0)) || (layout == 1 && (rotation % 2 == 1)) ? 192.f : 256.f) + screenGap) / 2.f; - if (rotation == 1 || rotation == 2) + if ((rotation == 1 || rotation == 2) ^ swapScreens) offset *= -1.f; M23_Translate(TopScreenMtx, (idx==0)?-offset:0, (idx==1)?-offset:0); diff --git a/src/frontend/qt_sdl/PlatformConfig.cpp b/src/frontend/qt_sdl/PlatformConfig.cpp index 46f8717f..30d9172b 100644 --- a/src/frontend/qt_sdl/PlatformConfig.cpp +++ b/src/frontend/qt_sdl/PlatformConfig.cpp @@ -39,6 +39,7 @@ int WindowMaximized; int ScreenRotation; int ScreenGap; int ScreenLayout; +int ScreenSwap; int ScreenSizing; int IntegerScaling; int ScreenFilter; @@ -135,6 +136,7 @@ ConfigEntry PlatformConfigFile[] = {"ScreenRotation", 0, &ScreenRotation, 0, NULL, 0}, {"ScreenGap", 0, &ScreenGap, 0, NULL, 0}, {"ScreenLayout", 0, &ScreenLayout, 0, NULL, 0}, + {"ScreenSwap", 0, &ScreenSwap, 0, NULL, 0}, {"ScreenSizing", 0, &ScreenSizing, 0, NULL, 0}, {"IntegerScaling", 0, &IntegerScaling, 0, NULL, 0}, {"ScreenFilter", 0, &ScreenFilter, 1, NULL, 0}, diff --git a/src/frontend/qt_sdl/PlatformConfig.h b/src/frontend/qt_sdl/PlatformConfig.h index 2d73dea0..0bfbb20d 100644 --- a/src/frontend/qt_sdl/PlatformConfig.h +++ b/src/frontend/qt_sdl/PlatformConfig.h @@ -53,6 +53,7 @@ extern int WindowMaximized; extern int ScreenRotation; extern int ScreenGap; extern int ScreenLayout; +extern int ScreenSwap; extern int ScreenSizing; extern int IntegerScaling; extern int ScreenFilter; diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index f0185cc9..cbaee03f 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -647,7 +647,8 @@ void ScreenHandler::screenSetupLayout(int w, int h) Config::ScreenRotation, sizing, Config::ScreenGap, - Config::IntegerScaling != 0); + Config::IntegerScaling != 0, + Config::ScreenSwap != 0); Frontend::GetScreenTransforms(screenMatrix[0], screenMatrix[1]); } @@ -1232,6 +1233,12 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) } connect(grpScreenLayout, &QActionGroup::triggered, this, &MainWindow::onChangeScreenLayout); + + submenu->addSeparator(); + + actScreenSwap = submenu->addAction("Swap screens"); + actScreenSwap->setCheckable(true); + connect(actScreenSwap, &QAction::triggered, this, &MainWindow::onChangeScreenSwap); } { QMenu* submenu = menu->addMenu("Screen sizing"); @@ -1315,6 +1322,8 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) actScreenSizing[Config::ScreenSizing]->setChecked(true); actIntegerScaling->setChecked(Config::IntegerScaling != 0); + actScreenSwap->setChecked(Config::ScreenSwap != 0); + actScreenFiltering->setChecked(Config::ScreenFilter != 0); actShowOSD->setChecked(Config::ShowOSD != 0); @@ -2049,6 +2058,13 @@ void MainWindow::onChangeScreenLayout(QAction* act) emit screenLayoutChange(); } +void MainWindow::onChangeScreenSwap(bool checked) +{ + Config::ScreenSwap = checked?1:0; + + emit screenLayoutChange(); +} + void MainWindow::onChangeScreenSizing(QAction* act) { int sizing = act->data().toInt(); diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h index 97f514bb..6dfbd8c2 100644 --- a/src/frontend/qt_sdl/main.h +++ b/src/frontend/qt_sdl/main.h @@ -222,6 +222,7 @@ private slots: void onChangeScreenRotation(QAction* act); void onChangeScreenGap(QAction* act); void onChangeScreenLayout(QAction* act); + void onChangeScreenSwap(bool checked); void onChangeScreenSizing(QAction* act); void onChangeIntegerScaling(bool checked); void onChangeScreenFiltering(bool checked); @@ -279,6 +280,7 @@ public: QAction* actScreenGap[6]; QActionGroup* grpScreenLayout; QAction* actScreenLayout[3]; + QAction* actScreenSwap; QActionGroup* grpScreenSizing; QAction* actScreenSizing[4]; QAction* actIntegerScaling;