diff options
author | Katarina Behrens <Katarina.Behrens@cib.de> | 2019-05-29 19:01:28 +0200 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2019-05-31 23:28:43 +0200 |
commit | ae5b453eb63d08f8aba471d8263bff84be80c8aa (patch) | |
tree | 176771e343ca1e46ed901d4662bc95f5de0a2250 /vcl | |
parent | c9e0fb864850fa434c4aa5c58960fac1fb382108 (diff) |
tdf#124484: resize slideshow window so it spans all displays
Change-Id: I55b4ab8ec5059110525c5194e1133c65bbd07fec
Reviewed-on: https://gerrit.libreoffice.org/73183
Tested-by: Jenkins
Reviewed-by: Katarina Behrens <Katarina.Behrens@cib.de>
Reviewed-on: https://gerrit.libreoffice.org/73257
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/qt5/Qt5Frame.hxx | 2 | ||||
-rw-r--r-- | vcl/qt5/Qt5Frame.cxx | 75 |
2 files changed, 62 insertions, 15 deletions
diff --git a/vcl/inc/qt5/Qt5Frame.hxx b/vcl/inc/qt5/Qt5Frame.hxx index 0e94657d092b..07a53972ee9b 100644 --- a/vcl/inc/qt5/Qt5Frame.hxx +++ b/vcl/inc/qt5/Qt5Frame.hxx @@ -81,6 +81,8 @@ class VCLPLUG_QT5_PUBLIC Qt5Frame : public QObject, public SalFrame bool m_bDefaultSize; bool m_bDefaultPos; bool m_bFullScreen; + bool m_bFullScreenSpanAll; + sal_uInt32 m_nRestoreScreen; QRect m_aRestoreGeometry; void Center(); diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx index f9fded67de59..27d0828539f5 100644 --- a/vcl/qt5/Qt5Frame.cxx +++ b/vcl/qt5/Qt5Frame.cxx @@ -59,6 +59,28 @@ static void SvpDamageHandler(void* handle, sal_Int32 nExtentsX, sal_Int32 nExten pThis->Damage(nExtentsX, nExtentsY, nExtentsWidth, nExtentsHeight); } +namespace +{ +sal_Int32 screenNumber(const QScreen* pScreen) +{ + const QList<QScreen*> screens = QApplication::screens(); + + sal_Int32 nScreen = 0; + bool bFound = false; + for (const QScreen* pCurScreen : screens) + { + if (pScreen == pCurScreen) + { + bFound = true; + break; + } + nScreen++; + } + + return bFound ? nScreen : -1; +} +} + Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo) : m_pTopLevel(nullptr) , m_bUseCairo(bUseCairo) @@ -72,6 +94,7 @@ Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo) , m_bDefaultSize(true) , m_bDefaultPos(true) , m_bFullScreen(false) + , m_bFullScreenSpanAll(false) { Qt5Instance* pInst = static_cast<Qt5Instance*>(GetSalData()->m_pInstance); pInst->insertFrame(this); @@ -143,6 +166,7 @@ Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo) // fake an initial geometry, gets updated via configure event or SetPosSize if (m_bDefaultPos || m_bDefaultSize) { + maGeometry.nDisplayScreenNumber = 0; Size aDefSize = CalcDefaultSize(); maGeometry.nX = -1; maGeometry.nY = -1; @@ -420,16 +444,25 @@ void Qt5Frame::Center() Size Qt5Frame::CalcDefaultSize() { assert(isWindow()); - QSize qSize(0, 0); - QScreen* pScreen = screen(); - if (pScreen) - qSize = pScreen->size(); - else - qSize = QApplication::desktop()->screenGeometry(0).size(); - Size aSize = toSize(qSize); + Size aSize; if (!m_bFullScreen) - aSize = bestmaxFrameSizeForScreenSize(aSize); + { + const QScreen* pScreen = screen(); + aSize = bestmaxFrameSizeForScreenSize( + toSize(pScreen ? pScreen->size() : QApplication::desktop()->screenGeometry(0).size())); + } + else + { + if (!m_bFullScreenSpanAll) + aSize = toSize( + QApplication::desktop()->screenGeometry(maGeometry.nDisplayScreenNumber).size()); + else + { + int nLeftScreen = QApplication::desktop()->screenNumber(QPoint(0, 0)); + aSize = toSize(QApplication::screens()[nLeftScreen]->availableVirtualGeometry().size()); + } + } return aSize; } @@ -633,7 +666,11 @@ void Qt5Frame::ShowFullScreen(bool bFullScreen, sal_Int32 nScreen) // only top-level windows can go fullscreen assert(m_pTopLevel); + if (m_bFullScreen == bFullScreen) + return; + m_bFullScreen = bFullScreen; + m_bFullScreenSpanAll = m_bFullScreen && (nScreen < 0); // show it if it isn't shown yet if (!isWindow()) @@ -642,15 +679,18 @@ void Qt5Frame::ShowFullScreen(bool bFullScreen, sal_Int32 nScreen) if (m_bFullScreen) { m_aRestoreGeometry = m_pTopLevel->geometry(); - // do that before going fullscreen - SetScreenNumber(nScreen); - windowHandle()->showFullScreen(); + m_nRestoreScreen = maGeometry.nDisplayScreenNumber; + SetScreenNumber(m_bFullScreenSpanAll ? m_nRestoreScreen : nScreen); + if (!m_bFullScreenSpanAll) + windowHandle()->showFullScreen(); + else + windowHandle()->showNormal(); } else { + SetScreenNumber(m_nRestoreScreen); windowHandle()->showNormal(); m_pTopLevel->setGeometry(m_aRestoreGeometry); - m_aRestoreGeometry = QRect(); } } @@ -1081,23 +1121,25 @@ void Qt5Frame::SetScreenNumber(unsigned int nScreen) if (pWindow) { QList<QScreen*> screens = QApplication::screens(); - if (static_cast<int>(nScreen) < screens.size()) + if (static_cast<int>(nScreen) < screens.size() || m_bFullScreenSpanAll) { - bool bSpanAllScreens = (nScreen == static_cast<unsigned int>(-1)); QRect screenGeo; - if (!bSpanAllScreens) + if (!m_bFullScreenSpanAll) { screenGeo = QApplication::desktop()->screenGeometry(nScreen); pWindow->setScreen(QApplication::screens()[nScreen]); } else // special case: fullscreen over all available screens { + assert(m_bFullScreen); // left-most screen int nLeftScreen = QApplication::desktop()->screenNumber(QPoint(0, 0)); // entire virtual desktop screenGeo = QApplication::screens()[nLeftScreen]->availableVirtualGeometry(); pWindow->setScreen(QApplication::screens()[nLeftScreen]); + pWindow->setGeometry(screenGeo); + nScreen = nLeftScreen; } // setScreen by itself has no effect, explicitly move the widget to @@ -1110,7 +1152,10 @@ void Qt5Frame::SetScreenNumber(unsigned int nScreen) // index outta bounds, use primary screen QScreen* primaryScreen = QApplication::primaryScreen(); pWindow->setScreen(primaryScreen); + nScreen = static_cast<sal_uInt32>(screenNumber(primaryScreen)); } + + maGeometry.nDisplayScreenNumber = nScreen; } } } |