xcb: create fake screen when XRandR 1.2 and later unavailable

Keep the old behavior from 6.0 to 6.2.

Fixes: QTBUG-102637
Pick-to: 6.3
Change-Id: I2e596c7d5161a3dc7a8493358e272a481aee5308
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Liang Qi 2022-04-19 12:11:07 +02:00
parent 731b38e768
commit 5d0935d45f
2 changed files with 25 additions and 0 deletions

View File

@ -226,6 +226,7 @@ private:
xcb_randr_get_output_info_reply_t *outputInfo);
void destroyScreen(QXcbScreen *screen);
void initializeScreens(bool initialized);
void initializeScreensWithoutXRandR(xcb_screen_iterator_t *it, int screenNumber, QXcbScreen **primaryScreen);
void initializeScreensFromOutput(xcb_screen_iterator_t *it, int screenNumber, QXcbScreen **primaryScreen);
void updateScreen_monitor(QXcbScreen *screen, xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp_t timestamp = XCB_NONE);

View File

@ -317,6 +317,10 @@ void QXcbConnection::initializeScreens(bool initialized)
initializeScreensFromMonitor(&it, xcbScreenNumber, &primaryScreen, initialized);
else if (isAtLeastXRandR12())
initializeScreensFromOutput(&it, xcbScreenNumber, &primaryScreen);
else {
qWarning("There is no XRandR 1.2 and later version available. There will be only fake screen(s) to use.");
initializeScreensWithoutXRandR(&it, xcbScreenNumber, &primaryScreen);
}
xcb_screen_next(&it);
++xcbScreenNumber;
@ -349,6 +353,26 @@ void QXcbConnection::initializeScreens(bool initialized)
}
}
void QXcbConnection::initializeScreensWithoutXRandR(xcb_screen_iterator_t *it, int xcbScreenNumber, QXcbScreen **primaryScreen)
{
// XRandR extension is missing, then create a fake/legacy screen.
xcb_screen_t *xcbScreen = it->data;
QXcbVirtualDesktop *virtualDesktop = new QXcbVirtualDesktop(this, xcbScreen, xcbScreenNumber);
m_virtualDesktops.append(virtualDesktop);
QList<QPlatformScreen *> siblings;
QXcbScreen *screen = new QXcbScreen(this, virtualDesktop, XCB_NONE, nullptr);
qCDebug(lcQpaScreen) << "created fake screen" << screen;
m_screens << screen;
if (primaryScreenNumber() == xcbScreenNumber) {
*primaryScreen = screen;
(*primaryScreen)->setPrimary(true);
}
siblings << screen;
virtualDesktop->setScreens(std::move(siblings));
}
void QXcbConnection::initializeScreensFromOutput(xcb_screen_iterator_t *it, int xcbScreenNumber, QXcbScreen **primaryScreen)
{
// Each "screen" in xcb terminology is a virtual desktop,