57 lines
2.9 KiB
Diff
57 lines
2.9 KiB
Diff
From ae51e360f986698eaf41fdb38f8a878a50f69be1 Mon Sep 17 00:00:00 2001
|
|
From: Alexander Volkov <a.volkov@rusbitech.ru>
|
|
Date: Fri, 19 Jun 2015 13:34:11 +0300
|
|
Subject: [PATCH 197/412] xcb: Ignore disabling of outputs in the middle of the
|
|
mode switch
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
X server may send RROutputChangeNotify event with null crtc and mode,
|
|
when it switches an output mode. Request RROutputInfo to distinguish
|
|
this case from the case when the output is explicitly disabled.
|
|
|
|
Change-Id: I4c2356ec71dbcc8013009ea8a6f46dd11f19d6bb
|
|
Task-number: QTBUG-44158
|
|
Task-number: QTBUG-46786
|
|
Task-number: QTBUG-46822
|
|
Reviewed-by: Daniel Vrátil <dvratil@redhat.com>
|
|
Reviewed-by: Gatis Paeglis <gatis.paeglis@digia.com>
|
|
Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
|
|
---
|
|
src/plugins/platforms/xcb/qxcbconnection.cpp | 18 +++++++++++++-----
|
|
1 file changed, 13 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
|
|
index 0867615..29e1fd1 100644
|
|
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
|
|
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
|
|
@@ -265,11 +265,19 @@ void QXcbConnection::updateScreens(const xcb_randr_notify_event_t *event)
|
|
} else if (screen) {
|
|
// Screen has been disabled -> remove
|
|
if (output.crtc == XCB_NONE && output.mode == XCB_NONE) {
|
|
- qCDebug(lcQpaScreen) << "output" << screen->name() << "has been disabled";
|
|
- m_screens.removeOne(screen);
|
|
- foreach (QXcbScreen *otherScreen, m_screens)
|
|
- otherScreen->removeVirtualSibling((QPlatformScreen *) screen);
|
|
- QXcbIntegration::instance()->destroyScreen(screen);
|
|
+ xcb_randr_get_output_info_cookie_t outputInfoCookie =
|
|
+ xcb_randr_get_output_info(xcb_connection(), output.output, output.config_timestamp);
|
|
+ QScopedPointer<xcb_randr_get_output_info_reply_t, QScopedPointerPodDeleter> outputInfo(
|
|
+ xcb_randr_get_output_info_reply(xcb_connection(), outputInfoCookie, NULL));
|
|
+ if (outputInfo->crtc == XCB_NONE) {
|
|
+ qCDebug(lcQpaScreen) << "output" << screen->name() << "has been disabled";
|
|
+ m_screens.removeOne(screen);
|
|
+ foreach (QXcbScreen *otherScreen, m_screens)
|
|
+ otherScreen->removeVirtualSibling((QPlatformScreen *) screen);
|
|
+ QXcbIntegration::instance()->destroyScreen(screen);
|
|
+ } else {
|
|
+ qCDebug(lcQpaScreen) << "output" << screen->name() << "has been temporarily disabled for the mode switch";
|
|
+ }
|
|
} else {
|
|
// Just update existing screen
|
|
screen->updateGeometry(output.config_timestamp);
|
|
--
|
|
2.5.0
|
|
|