From 38a66aa53a26eca4aef1e82f5c059efb82f977a8 Mon Sep 17 00:00:00 2001 From: Zhang Hao Date: Mon, 10 Jan 2022 14:59:22 +0100 Subject: [PATCH] xcb: Correctly update primary screen status with RandR 1.5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This amends d8f37d94e537aaab4fa960b80aacabe79bcc14c4 . Fixes: QTBUG-99605 Pick-to: 6.3 Done-with: Liang Qi Change-Id: Ia4cf67d6ebeed36596c0342302aa0b4af01769bc Reviewed-by: Tor Arne Vestbø --- .../platforms/xcb/qxcbconnection_screens.cpp | 9 ++--- src/plugins/platforms/xcb/qxcbscreen.cpp | 4 +-- .../qscreen_xrandr/tst_qscreen_xrandr.cpp | 35 ++++++++++++++++++- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbconnection_screens.cpp b/src/plugins/platforms/xcb/qxcbconnection_screens.cpp index 22285b836d3..0a45b1b0c9e 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_screens.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_screens.cpp @@ -191,7 +191,7 @@ void QXcbConnection::updateScreens(const xcb_randr_notify_event_t *event) } } - qCDebug(lcQpaScreen) << "primary output is" << qAsConst(m_screens).first()->name(); + qCDebug(lcQpaScreen) << "updateScreens: primary output is" << qAsConst(m_screens).first()->name(); } } @@ -379,7 +379,7 @@ void QXcbConnection::initializeScreens(bool initialized) } if (!m_screens.isEmpty()) - qCDebug(lcQpaScreen) << "primary output is" << qAsConst(m_screens).first()->name(); + qCDebug(lcQpaScreen) << "initializeScreens: primary output is" << qAsConst(m_screens).first()->name(); } } @@ -534,11 +534,6 @@ void QXcbConnection::initializeScreensFromMonitor(xcb_screen_iterator_t *it, int siblings << screen; - if (primaryScreenNumber() == xcbScreenNumber) { - primaryScreen = screen; - primaryScreen->setPrimary(true); - } - xcb_randr_monitor_info_next(&monitor_iter); } diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp index 6524397cef0..a474e569e92 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.cpp +++ b/src/plugins/platforms/xcb/qxcbscreen.cpp @@ -705,9 +705,7 @@ void QXcbScreen::setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp QByteArray ba = connection()->atomName(monitorInfo->name); m_outputName = getName(monitorInfo); - - if (monitorInfo->primary) - m_primary = true; + m_primary = monitorInfo->primary; m_cursor = new QXcbCursor(connection(), this); } diff --git a/tests/manual/qscreen_xrandr/tst_qscreen_xrandr.cpp b/tests/manual/qscreen_xrandr/tst_qscreen_xrandr.cpp index 166b11e2f6b..293dec47b48 100644 --- a/tests/manual/qscreen_xrandr/tst_qscreen_xrandr.cpp +++ b/tests/manual/qscreen_xrandr/tst_qscreen_xrandr.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -42,6 +42,7 @@ private slots: void xrandr_15_merge_and_unmerge(); void xrandr_15_scale(); void xrandr_15_off_and_on(); + void xrandr_15_primary(); private: void xrandr_process(const QStringList &arguments = {}); @@ -199,6 +200,38 @@ void tst_QScreen_Xrandr::xrandr_15_off_and_on() } } +void tst_QScreen_Xrandr::xrandr_15_primary() +{ + QList screens = QGuiApplication::screens(); + int ss = screens.size(); + if (ss < 2) + QSKIP("This test requires at least two screens."); + + QStringList names; + for (QScreen *s : screens) + names << s->name(); + + qDebug() << "All screens: " << names; + QScreen *ps = qGuiApp->primaryScreen(); + qDebug() << "Current primary screen: " << ps; + + QStringList args; + for (QString name : names) { + qDebug() << "Trying to set primary screen:" << name; + args.clear(); + args << "--output" << name << "--primary"; + xrandr_process(args); + QTest::qWait(500); + + QScreen *ps = qGuiApp->primaryScreen(); + qDebug() << "Current primary screen: " << ps; + if (ps) { + qDebug() << "primary screen name: " << ps->name(); + QVERIFY(ps->name() == name); + } + } +} + void tst_QScreen_Xrandr::xrandr_process(const QStringList &args) { QString prog = "xrandr";