xcb: ensure the primary screen is added first

Currently, Qt windows without an explicit screen parameter always appear
on screen 0 despite the DISPLAY being set to :0.1. With this change,
the xcb backend adds the primary display at the beginning of the
screen list. QGuiApplication::primaryScreen() will then return that
display for all windows without an explicit screen.

Change-Id: I657c4ed92b9e0f0ed379e91c732dad9d69c4f5e0
Reviewed-by: Donald Carr <donald.carr@nokia.com>
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
This commit is contained in:
Girish Ramakrishnan 2012-06-12 12:53:31 -07:00 committed by Qt by Nokia
parent abe4b31713
commit 3c8eb40487

View File

@ -98,6 +98,7 @@ static int nullErrorHandler(Display *, XErrorEvent *)
QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, const char *displayName)
: m_connection(0)
, m_primaryScreen(0)
, m_displayName(displayName ? QByteArray(displayName) : qgetenv("DISPLAY"))
, m_nativeInterface(nativeInterface)
#ifdef XCB_USE_XINPUT2_MAEMO
@ -115,8 +116,6 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, const char
, has_randr_extension(false)
, has_input_shape(false)
{
m_primaryScreen = 0;
#ifdef XCB_USE_XLIB
Display *dpy = XOpenDisplay(m_displayName.constData());
if (dpy) {
@ -167,7 +166,14 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, const char
int screenNumber = 0;
while (it.rem) {
m_screens << new QXcbScreen(this, it.data, screenNumber++);
QXcbScreen *screen = new QXcbScreen(this, it.data, screenNumber);
// make sure the primary screen appears first since it is used by QGuiApplication::primaryScreen()
if (m_primaryScreen == screenNumber) {
m_screens.prepend(screen);
} else {
m_screens.append(screen);
}
++screenNumber;
xcb_screen_next(&it);
}