xcb: set primary screen more correctly
For example, when having virtual monitor which includes two real monitors, the primary information in xcb_randr_monitor_info_t is normally false, because user can only set it for output. Kudos to Jiang Wu for his first patch and details of the issue. Done-with: Jiang Wu <wujiang@kylinos.cn> Pick-to: 6.4 6.3 Change-Id: I6af443ff69d347a6d86efc9c8ea7a5d18f4c3e24 Reviewed-by: JiDe Zhang <zhangjide@uniontech.com> Reviewed-by: Jiang Wu <wujiang@kylinos.cn> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
fd9aeb1b38
commit
a79e2aafd6
@ -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()
|
||||
{
|
||||
}
|
||||
|
@ -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(); }
|
||||
|
Loading…
Reference in New Issue
Block a user