diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2016-10-10 14:27:47 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2016-11-09 13:57:58 +0000 |
commit | be17ca27f6df3ae55924595cbd387c99b49b398d (patch) | |
tree | 49bd752979942f8efc7407e7aae7b9d3d03c2cd1 /src/platformsupport/fbconvenience | |
parent | aa3d08ee868c281e38ad1a476f6f3becb4c9aa34 (diff) |
linuxfb: Make first window fullscreen like eglfs
...unless the legacy behavior is requested via
QT_QPA_FB_FORCE_FULLSCREEN=0 or the platform plugin overrides
QFbScreen::flags() to return QFbScreen::DontForceFirstWindowToFullScreen.
The long pending asymmetry between eglfs and linuxfb is going to end
because with the increased focus on the integrated Qt Quick Software
backend the expectation for launching apps with -platform linuxfb is
to behave in the normal, eglfs style, embedded manner. Forcing every
app to handle this manually in QML is silly.
Widget applications also benefit since the old non-fullscreen main
window approach is pretty much never what is wanted (considering there
is no desktop and the content in the background is either garbage or
whatever was on the terminal).
However, not every fbconvenience-based platform wants this. For
example, vnc should remain with the old way where window sizes are not
altered. vnc therefore opts out via QFbScreen::flags().
bsdfb follows the linuxfb behavior.
[ChangeLog][Important Behavior Changes] The linuxfb and bsdfb platform
plugins now follow the behavior of eglfs by making the first window
fullscreen. This provides consistency and avoids applications having
to make their windows match the screen size manually. The new behavior
can be disabled by setting the environment variable
QT_QPA_FB_FORCE_FULLSCREEN=0.
Task-number: QTBUG-48658
Task-number: QTBUG-56306
Change-Id: I63d917147ce37205e29cbd0c6f37f35c46d4509c
Reviewed-by: Louai Al-Khanji <louai.al-khanji@qt.io>
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
Diffstat (limited to 'src/platformsupport/fbconvenience')
-rw-r--r-- | src/platformsupport/fbconvenience/qfbscreen.cpp | 10 | ||||
-rw-r--r-- | src/platformsupport/fbconvenience/qfbscreen_p.h | 10 | ||||
-rw-r--r-- | src/platformsupport/fbconvenience/qfbwindow.cpp | 11 |
3 files changed, 28 insertions, 3 deletions
diff --git a/src/platformsupport/fbconvenience/qfbscreen.cpp b/src/platformsupport/fbconvenience/qfbscreen.cpp index 216f2722a4..70c79318b3 100644 --- a/src/platformsupport/fbconvenience/qfbscreen.cpp +++ b/src/platformsupport/fbconvenience/qfbscreen.cpp @@ -154,6 +154,11 @@ QWindow *QFbScreen::topLevelAt(const QPoint & p) const return 0; } +int QFbScreen::windowCount() const +{ + return mWindowStack.count(); +} + void QFbScreen::setDirty(const QRect &rect) { QRect intersection = rect.intersected(mGeometry); @@ -313,5 +318,10 @@ QFbWindow *QFbScreen::windowForId(WId wid) const return 0; } +QFbScreen::Flags QFbScreen::flags() const +{ + return 0; +} + QT_END_NAMESPACE diff --git a/src/platformsupport/fbconvenience/qfbscreen_p.h b/src/platformsupport/fbconvenience/qfbscreen_p.h index e9b570aa1c..ffa2a46943 100644 --- a/src/platformsupport/fbconvenience/qfbscreen_p.h +++ b/src/platformsupport/fbconvenience/qfbscreen_p.h @@ -66,7 +66,13 @@ class QFbBackingStore; class QFbScreen : public QObject, public QPlatformScreen { Q_OBJECT + public: + enum Flag { + DontForceFirstWindowToFullScreen = 0x01 + }; + Q_DECLARE_FLAGS(Flags, Flag) + QFbScreen(); ~QFbScreen(); @@ -85,6 +91,8 @@ public: virtual void raise(QFbWindow *window); virtual void lower(QFbWindow *window); virtual void topWindowChanged(QWindow *) {} + virtual int windowCount() const; + virtual Flags flags() const; void addPendingBackingStore(QFbBackingStore *bs) { mPendingBackingStores << bs; } @@ -126,6 +134,8 @@ private: bool mIsUpToDate; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(QFbScreen::Flags) + QT_END_NAMESPACE #endif // QFBSCREEN_P_H diff --git a/src/platformsupport/fbconvenience/qfbwindow.cpp b/src/platformsupport/fbconvenience/qfbwindow.cpp index 2d5570fe5d..a8bba1a472 100644 --- a/src/platformsupport/fbconvenience/qfbwindow.cpp +++ b/src/platformsupport/fbconvenience/qfbwindow.cpp @@ -74,8 +74,13 @@ void QFbWindow::setGeometry(const QRect &rect) void QFbWindow::setVisible(bool visible) { + QFbScreen *fbScreen = platformScreen(); if (visible) { - if (mWindowState & Qt::WindowFullScreen) + bool convOk = false; + static bool envDisableForceFullScreen = qEnvironmentVariableIntValue("QT_QPA_FB_FORCE_FULLSCREEN", &convOk) == 0 && convOk; + const bool platformDisableForceFullScreen = fbScreen->flags().testFlag(QFbScreen::DontForceFirstWindowToFullScreen); + const bool forceFullScreen = !envDisableForceFullScreen && !platformDisableForceFullScreen && fbScreen->windowCount() == 0; + if (forceFullScreen || (mWindowState & Qt::WindowFullScreen)) setGeometry(platformScreen()->geometry()); else if (mWindowState & Qt::WindowMaximized) setGeometry(platformScreen()->availableGeometry()); @@ -83,9 +88,9 @@ void QFbWindow::setVisible(bool visible) QPlatformWindow::setVisible(visible); if (visible) - platformScreen()->addWindow(this); + fbScreen->addWindow(this); else - platformScreen()->removeWindow(this); + fbScreen->removeWindow(this); } |