[Libreoffice-commits] core.git: Branch 'libreoffice-6-2' - 2 commits - vcl/inc vcl/qt5

Katarina Behrens (via logerrit) logerrit at kemper.freedesktop.org
Fri May 31 21:29:13 UTC 2019


 vcl/inc/qt5/Qt5Frame.hxx |    2 +
 vcl/qt5/Qt5Frame.cxx     |   91 ++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 77 insertions(+), 16 deletions(-)

New commits:
commit ae5b453eb63d08f8aba471d8263bff84be80c8aa
Author:     Katarina Behrens <Katarina.Behrens at cib.de>
AuthorDate: Wed May 29 19:01:28 2019 +0200
Commit:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Fri May 31 23:28:43 2019 +0200

    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 at cib.de>
    Reviewed-on: https://gerrit.libreoffice.org/73257
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

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;
         }
     }
 }
commit c9e0fb864850fa434c4aa5c58960fac1fb382108
Author:     Katarina Behrens <Katarina.Behrens at cib.de>
AuthorDate: Wed May 8 14:02:37 2019 +0200
Commit:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Fri May 31 23:28:31 2019 +0200

    tdf#124484: avoid crash in fullscreen slideshow spanning all displays
    
    This just stops the bleeding (crash) in a special case when screen
    number argument of SalFrame::ShowFullScreen is -1 (meaning
    'fullscreen spanning all available displays')
    
    It doesn't yet extend the fullscreen window over all screens, this
    will be done in a follow-up fix
    
    Change-Id: I2cf48096a1fe1ec33c943f10acb41c59585b325f
    Reviewed-on: https://gerrit.libreoffice.org/71965
    Tested-by: Jenkins
    Reviewed-by: Katarina Behrens <Katarina.Behrens at cib.de>
    (cherry picked from commit 758c44f69f0a0ed4a501695de4f065824325e750)
    Reviewed-on: https://gerrit.libreoffice.org/73256
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx
index 069fa535901c..f9fded67de59 100644
--- a/vcl/qt5/Qt5Frame.cxx
+++ b/vcl/qt5/Qt5Frame.cxx
@@ -1083,12 +1083,26 @@ void Qt5Frame::SetScreenNumber(unsigned int nScreen)
             QList<QScreen*> screens = QApplication::screens();
             if (static_cast<int>(nScreen) < screens.size())
             {
-                QWidget* const pWidget = m_pTopLevel ? m_pTopLevel : m_pQWidget;
-                pWindow->setScreen(QApplication::screens()[nScreen]);
+                bool bSpanAllScreens = (nScreen == static_cast<unsigned int>(-1));
+                QRect screenGeo;
+
+                if (!bSpanAllScreens)
+                {
+                    screenGeo = QApplication::desktop()->screenGeometry(nScreen);
+                    pWindow->setScreen(QApplication::screens()[nScreen]);
+                }
+                else // special case: fullscreen over all available screens
+                {
+                    // left-most screen
+                    int nLeftScreen = QApplication::desktop()->screenNumber(QPoint(0, 0));
+                    // entire virtual desktop
+                    screenGeo = QApplication::screens()[nLeftScreen]->availableVirtualGeometry();
+                    pWindow->setScreen(QApplication::screens()[nLeftScreen]);
+                }
 
                 // setScreen by itself has no effect, explicitly move the widget to
                 // the new screen
-                QRect screenGeo = QApplication::desktop()->screenGeometry(nScreen);
+                QWidget* const pWidget = m_pTopLevel ? m_pTopLevel : m_pQWidget;
                 pWidget->move(screenGeo.topLeft());
             }
             else


More information about the Libreoffice-commits mailing list