[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#787680: Qt5: Applications disappear or crash when screen is switched



Hi,

With the gcc5 transition in testing, due to this bug in Qt, I now have
the choice between not updating my system at all, or having my entire DE
crash every time I (un)plug my external screen. Both of these options
are fairly suboptimal ;-)

I saw that Qt5.5 is in experimental. It seems to be mostly installable
(I couldn't test, due to some multiarch-packages preventing me from even
staging an upgrade to the new gcc). I backported the patch from Qt
upstream that fixes this issue; you can find the patch against the Qt
debian package attached. Compilation is still on-going, but the patch
seems to apply cleanly, and it works upstream. If you could apply this
patch, that would be great - with the next Qt upload to experimental, I
could finally use Qt5 applications without them crashing all the time :D

Kind regards,
Ralf
commit 139103ae1850c8f82a497d8823a028f45f565678
Author: Ralf Jung <post@ralfj.de>
Date:   Mon Sep 7 18:14:54 2015 +0200

    Backport: When a screen comes back online, the windows need to be told about it

diff --git a/debian/changelog b/debian/changelog
index 61a235c..19ac4d4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+qtbase-opensource-src (5.5.0+dfsg-6) UNRELEASED; urgency=medium
+
+  * When a screen comes back online, the windows need to be told
+    about it (screen_crash.diff) (Closes: #787680)
+
+ -- Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>  Mon, 07 Sep 2015 18:13:16 +0200
+
 qtbase-opensource-src (5.5.0+dfsg-5) experimental; urgency=medium
 
   * Update debian/copyright for 5.5.0.
diff --git a/debian/patches/screen_crash.patch b/debian/patches/screen_crash.patch
new file mode 100644
index 0000000..59b526c
--- /dev/null
+++ b/debian/patches/screen_crash.patch
@@ -0,0 +1,30 @@
+Description: When a screen comes back online, the windows need to be told
+ about it
+Author: Ralf Jung <post@ralfj.de>
+Forwarded: b0b08cc0e4e38504d6b833702f7477aee4e2a192
+Last-Update: 2015-09-07
+
+---
+ src/plugins/platforms/xcb/qxcbconnection.cpp | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
++++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
+@@ -252,6 +252,14 @@ void QXcbConnection::updateScreens(const xcb_randr_notify_event_t *event)
+                         otherScreen->addVirtualSibling(screen);
+                 m_screens << screen;
+                 QXcbIntegration::instance()->screenAdded(screen, screen->isPrimary());
++
++                // Windows which had null screens have already had expose events by now.
++                // They need to be told the screen is back, it's OK to render.
++                foreach (QWindow *window, QGuiApplication::topLevelWindows()) {
++                    QXcbWindow *xcbWin = static_cast<QXcbWindow*>(window->handle());
++                    if (xcbWin)
++                        xcbWin->maybeSetScreen(screen);
++                }
+             }
+             // else ignore disabled screens
+         } else if (screen) {
+-- 
+2.4.6
+
diff --git a/debian/patches/series b/debian/patches/series
index 148b172..3d777a4 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,5 +1,6 @@
 # Backported stuff
 Fix-compile-error-on-big-endian.patch
+screen_crash.patch
 
 # Debian specific.
 gnukfreebsd.diff

Reply to: