From bcdfa2a834df227cf14467447b18277869f8a219 Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Sun, 20 Jun 2021 22:12:53 -0400 Subject: [PATCH 1/2] Added logic to watch for screen change events coming from main window and notify OpenGL widget to recalculate screen pixel ratio and texture sizes. --- src/drivers/Qt/ConsoleViewerGL.cpp | 24 ++++++++++++++++++++++-- src/drivers/Qt/ConsoleViewerGL.h | 3 +++ src/drivers/Qt/ConsoleWindow.cpp | 10 ++++++++++ src/drivers/Qt/ConsoleWindow.h | 1 + 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/drivers/Qt/ConsoleViewerGL.cpp b/src/drivers/Qt/ConsoleViewerGL.cpp index cebf9fe2..9cefd306 100644 --- a/src/drivers/Qt/ConsoleViewerGL.cpp +++ b/src/drivers/Qt/ConsoleViewerGL.cpp @@ -72,12 +72,12 @@ ConsoleViewGL_t::ConsoleViewGL_t(QWidget *parent) setMinimumHeight( 224 ); setFocusPolicy(Qt::StrongFocus); - QScreen *screen = QGuiApplication::primaryScreen(); + QScreen *screen = window()->screen(); if ( screen != NULL ) { devPixRatio = screen->devicePixelRatio(); - //printf("Ratio: %f \n", screen->devicePixelRatio() ); + //printf("GL Ratio: %f \n", screen->devicePixelRatio() ); } localBufSize = (4 * GL_NES_WIDTH) * (4 * GL_NES_HEIGHT) * sizeof(uint32_t); @@ -116,6 +116,26 @@ ConsoleViewGL_t::~ConsoleViewGL_t(void) } } +void ConsoleViewGL_t::screenChanged( QScreen *screen ) +{ + int w,h; + + devPixRatio = screen->devicePixelRatio(); + + w = (int)(devPixRatio * width() ); + h = (int)(devPixRatio * height() ); + + view_width = w; + view_height = h; + + gui_draw_area_width = w; + gui_draw_area_height = h; + + buildTextures(); + + //printf("GL Ratio: %f %ix%i\n", screen->devicePixelRatio(), w, h ); +} + int ConsoleViewGL_t::init( void ) { return 0; diff --git a/src/drivers/Qt/ConsoleViewerGL.h b/src/drivers/Qt/ConsoleViewerGL.h index 42268d3a..002fd4cc 100644 --- a/src/drivers/Qt/ConsoleViewerGL.h +++ b/src/drivers/Qt/ConsoleViewerGL.h @@ -5,6 +5,7 @@ #include +#include #include #include @@ -36,6 +37,8 @@ class ConsoleViewGL_t : public QOpenGLWidget, protected QOpenGLFunctions void getAspectXY( double &x, double &y ); double getAspectRatio(void); + void screenChanged(QScreen *scr); + protected: void initializeGL(void); void resizeGL(int w, int h); diff --git a/src/drivers/Qt/ConsoleWindow.cpp b/src/drivers/Qt/ConsoleWindow.cpp index 38175613..eb2cd7ca 100644 --- a/src/drivers/Qt/ConsoleWindow.cpp +++ b/src/drivers/Qt/ConsoleWindow.cpp @@ -221,6 +221,7 @@ consoleWin_t::consoleWin_t(QWidget *parent) // Create AVI Recording Disk Thread aviDiskThread = new AviRecordDiskThread_t(this); + connect( this->window()->windowHandle(), SIGNAL(screenChanged(QScreen*)), this, SLOT(winScreenChanged(QScreen*)) ); } consoleWin_t::~consoleWin_t(void) @@ -334,6 +335,15 @@ void consoleWin_t::videoReset(void) return; } +void consoleWin_t::winScreenChanged(QScreen *scr) +{ + //printf("Screen Changed: %p\n", scr ); + if ( viewport_GL != NULL ) + { + viewport_GL->screenChanged( scr ); + } +} + QSize consoleWin_t::calcRequiredSize(void) { QSize out( GL_NES_WIDTH, GL_NES_HEIGHT ); diff --git a/src/drivers/Qt/ConsoleWindow.h b/src/drivers/Qt/ConsoleWindow.h index 391d3ec9..a52e4080 100644 --- a/src/drivers/Qt/ConsoleWindow.h +++ b/src/drivers/Qt/ConsoleWindow.h @@ -405,6 +405,7 @@ class consoleWin_t : public QMainWindow void wavRecordStart(void); void wavRecordAsStart(void); void wavRecordStop(void); + void winScreenChanged( QScreen *scr ); }; From 637559c7b7690a80d4c90e34def555c7c88aacff Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Mon, 21 Jun 2021 20:06:13 -0400 Subject: [PATCH 2/2] Added logic to only hook up screen changed signal handler once the window has fully been constructed. --- src/drivers/Qt/ConsoleViewerGL.cpp | 23 ++++++++++++------ src/drivers/Qt/ConsoleWindow.cpp | 39 +++++++++++++++++++++++++++++- src/drivers/Qt/ConsoleWindow.h | 3 +++ 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/drivers/Qt/ConsoleViewerGL.cpp b/src/drivers/Qt/ConsoleViewerGL.cpp index 9cefd306..3cf9b3fa 100644 --- a/src/drivers/Qt/ConsoleViewerGL.cpp +++ b/src/drivers/Qt/ConsoleViewerGL.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2) @@ -72,13 +73,6 @@ ConsoleViewGL_t::ConsoleViewGL_t(QWidget *parent) setMinimumHeight( 224 ); setFocusPolicy(Qt::StrongFocus); - QScreen *screen = window()->screen(); - - if ( screen != NULL ) - { - devPixRatio = screen->devicePixelRatio(); - //printf("GL Ratio: %f \n", screen->devicePixelRatio() ); - } localBufSize = (4 * GL_NES_WIDTH) * (4 * GL_NES_HEIGHT) * sizeof(uint32_t); localBuf = (uint32_t*)malloc( localBufSize ); @@ -138,6 +132,21 @@ void ConsoleViewGL_t::screenChanged( QScreen *screen ) int ConsoleViewGL_t::init( void ) { + QScreen *screen = NULL; + + if ( window() != NULL ) + { + if ( window()->windowHandle() != NULL ) + { + screen = window()->windowHandle()->screen(); + } + } + + if ( screen != NULL ) + { + devPixRatio = screen->devicePixelRatio(); + printf("GL Ratio: %f \n", screen->devicePixelRatio() ); + } return 0; } diff --git a/src/drivers/Qt/ConsoleWindow.cpp b/src/drivers/Qt/ConsoleWindow.cpp index eb2cd7ca..8df52a64 100644 --- a/src/drivers/Qt/ConsoleWindow.cpp +++ b/src/drivers/Qt/ConsoleWindow.cpp @@ -221,7 +221,7 @@ consoleWin_t::consoleWin_t(QWidget *parent) // Create AVI Recording Disk Thread aviDiskThread = new AviRecordDiskThread_t(this); - connect( this->window()->windowHandle(), SIGNAL(screenChanged(QScreen*)), this, SLOT(winScreenChanged(QScreen*)) ); + scrHandlerConnected = false; } consoleWin_t::~consoleWin_t(void) @@ -335,8 +335,39 @@ void consoleWin_t::videoReset(void) return; } +void consoleWin_t::initScreenHandler(void) +{ + if ( !scrHandlerConnected ) + { + QWidget *w; + + w = this->window(); + + // This needs to be scheduled after window creation. + if ( w != NULL) + { + QWindow *hdl = w->windowHandle(); + + if (hdl != NULL) + { + //printf("Connecting to screenChanged Signal\n"); + connect( hdl, SIGNAL(screenChanged(QScreen*)), this, SLOT(winScreenChanged(QScreen*)) ); + scrHandlerConnected = true; + + winScreenChanged( hdl->screen() ); + } + } + } + +} + void consoleWin_t::winScreenChanged(QScreen *scr) { + if ( scr == NULL ) + { + return; + } + //printf("Screen Changed: %p\n", scr ); if ( viewport_GL != NULL ) { @@ -654,6 +685,12 @@ void consoleWin_t::dropEvent(QDropEvent *event) } } +void consoleWin_t::showEvent(QShowEvent *event) +{ + //printf("Main Window Show Event\n"); + initScreenHandler(); +} + //--------------------------------------------------------------------------- void consoleWin_t::initHotKeys(void) { diff --git a/src/drivers/Qt/ConsoleWindow.h b/src/drivers/Qt/ConsoleWindow.h index a52e4080..beec99a4 100644 --- a/src/drivers/Qt/ConsoleWindow.h +++ b/src/drivers/Qt/ConsoleWindow.h @@ -248,6 +248,7 @@ class consoleWin_t : public QMainWindow bool mainMenuEmuPauseSet; bool mainMenuEmuWasPaused; bool mainMenuPauseWhenActv; + bool scrHandlerConnected; std::list romList; std::vector afActList; @@ -261,11 +262,13 @@ class consoleWin_t : public QMainWindow void keyReleaseEvent(QKeyEvent *event); void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); + void showEvent(QShowEvent *event); void syncActionConfig( QAction *act, const char *property ); void showErrorMsgWindow(void); private: void initHotKeys(void); + void initScreenHandler(void); void createMainMenu(void); void buildRecentRomMenu(void); void saveRecentRomMenu(void);