[vlc-devel] [PATCH] qt: fix setScreen might crash on wayland when entering fullscreen
Pierre Lamot
pierre at videolabs.io
Mon Dec 18 10:22:10 CET 2017
---
modules/gui/qt/components/controller.cpp | 9 +++++++++
modules/gui/qt/components/controller.hpp | 4 ++++
modules/gui/qt/main_interface.cpp | 17 ++++++++++++++++-
modules/gui/qt/main_interface.hpp | 4 +++-
4 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/modules/gui/qt/components/controller.cpp b/modules/gui/qt/components/controller.cpp
index 428aa216a1..1b91019729 100644
--- a/modules/gui/qt/components/controller.cpp
+++ b/modules/gui/qt/components/controller.cpp
@@ -800,6 +800,10 @@ FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i, QWi
b_fullscreen = false;
i_hide_timeout = 1;
i_screennumber = -1;
+#ifdef QT5_HAS_WAYLAND
+ b_hasWayland = QGuiApplication::platformName()
+ .startsWith(QLatin1String("wayland"), Qt::CaseInsensitive);
+#endif
vout.clear();
@@ -873,7 +877,12 @@ void FullscreenControllerWidget::restoreFSC()
return;
QRect currentRes = QApplication::desktop()->screenGeometry( targetScreen() );
+#ifdef QT5_HAS_WAYLAND
+ if ( !b_hasWayland )
+ windowHandle()->setScreen(QGuiApplication::screens()[targetScreen()]);
+#else
windowHandle()->setScreen(QGuiApplication::screens()[targetScreen()]);
+#endif
if( currentRes == screenRes &&
QApplication::desktop()->screen()->geometry().contains( previousPosition, true ) )
diff --git a/modules/gui/qt/components/controller.hpp b/modules/gui/qt/components/controller.hpp
index 8bfe8e259c..25d4f4b00c 100644
--- a/modules/gui/qt/components/controller.hpp
+++ b/modules/gui/qt/components/controller.hpp
@@ -318,6 +318,10 @@ private:
bool isWideFSC;
int i_sensitivity;
+
+#ifdef QT5_HAS_WAYLAND
+ bool b_hasWayland;
+#endif
};
#endif
diff --git a/modules/gui/qt/main_interface.cpp b/modules/gui/qt/main_interface.cpp
index 8763d21fc2..7afa300e14 100644
--- a/modules/gui/qt/main_interface.cpp
+++ b/modules/gui/qt/main_interface.cpp
@@ -152,6 +152,11 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
/* Should the UI stays on top of other windows */
b_interfaceOnTop = var_InheritBool( p_intf, "video-on-top" );
+#ifdef QT5_HAS_WAYLAND
+ b_hasWayland = QGuiApplication::platformName()
+ .startsWith(QLatin1String("wayland"), Qt::CaseInsensitive);
+#endif
+
/**************************
* UI and Widgets design
**************************/
@@ -872,7 +877,12 @@ void MainInterface::setVideoFullScreen( bool fs )
QRect screenres = QApplication::desktop()->screenGeometry( numscreen );
lastWinScreen = windowHandle()->screen();
+#ifdef QT5_HAS_WAYLAND
+ if( !b_hasWayland )
+ windowHandle()->setScreen(QGuiApplication::screens()[numscreen]);
+#else
windowHandle()->setScreen(QGuiApplication::screens()[numscreen]);
+#endif
/* To be sure window is on proper-screen in xinerama */
if( !screenres.contains( pos() ) )
@@ -898,8 +908,13 @@ void MainInterface::setVideoFullScreen( bool fs )
{
setMinimalView( b_minimalView );
setInterfaceFullScreen( b_interfaceFullScreen );
- if (lastWinScreen != NULL)
+#ifdef QT5_HAS_WAYLAND
+ if( lastWinScreen != NULL && !b_hasWayland )
windowHandle()->setScreen(lastWinScreen);
+#else
+ if( lastWinScreen != NULL )
+ windowHandle()->setScreen(lastWinScreen);
+#endif
if( lastWinPosition.isNull() == false )
{
move( lastWinPosition );
diff --git a/modules/gui/qt/main_interface.hpp b/modules/gui/qt/main_interface.hpp
index 79abd52894..d6ba7463e7 100644
--- a/modules/gui/qt/main_interface.hpp
+++ b/modules/gui/qt/main_interface.hpp
@@ -184,7 +184,9 @@ protected:
bool b_pauseOnMinimize;
bool b_maximizedView;
bool b_isWindowTiled;
-
+#ifdef QT5_HAS_WAYLAND
+ bool b_hasWayland;
+#endif
/* States */
bool playlistVisible; ///< Is the playlist visible ?
// bool videoIsActive; ///< Having a video now / THEMIM->hasV
--
2.14.1
More information about the vlc-devel
mailing list