diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp index 6c30d39234..2a538c9b6e 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.cpp +++ b/src/plugins/platforms/xcb/qxcbscreen.cpp @@ -679,10 +679,11 @@ void QXcbScreen::setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp m_sizeMillimeters = virtualDesktop()->physicalSize(); m_outputName = getName(monitorInfo); - if (connection()->primaryScreenNumber() == virtualDesktop()->number() && monitorInfo->primary) - m_primary = true; - else - m_primary = false; + m_primary = false; + if (connection()->primaryScreenNumber() == virtualDesktop()->number()) { + if (monitorInfo->primary || isPrimaryInXScreen()) + m_primary = true; + } updateColorSpaceAndEdid(); } @@ -699,6 +700,17 @@ QString QXcbScreen::defaultName() return name; } +bool QXcbScreen::isPrimaryInXScreen() +{ + auto primary = Q_XCB_REPLY(xcb_randr_get_output_primary, connection()->xcb_connection(), root()); + if (!primary) + qWarning("failed to get the primary output of the screen"); + + const bool isPrimary = primary ? (m_monitor ? m_outputs.contains(primary->output) : m_output == primary->output) : false; + + return isPrimary; +} + QXcbScreen::~QXcbScreen() { } diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h index 5a844f944a..49165d3ba4 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.h +++ b/src/plugins/platforms/xcb/qxcbscreen.h @@ -163,6 +163,7 @@ public: void setCrtc(xcb_randr_crtc_t crtc) { m_crtc = crtc; } void setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp_t timestamp = XCB_NONE); QString defaultName(); + bool isPrimaryInXScreen(); void windowShown(QXcbWindow *window); QString windowManagerName() const { return m_virtualDesktop->windowManagerName(); }