Export x11 screen of the QXcbConnection to the native interface

With XCB a client cannot retrieve the information on which X screen it
is running. This information is only available when opening the xcb
connection. As this is done by Qt no application is able to retrieve
this information. By exporting the x11 screen we can provide this
information again in QtX11Extras.

Change-Id: I50f1d3e803dc7e3afac0e5c7f1648ccda4502e7c
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
This commit is contained in:
Martin Gräßlin 2013-09-02 20:41:54 +02:00 committed by The Qt Project
parent 75ffb131ed
commit 9c3b79200b
2 changed files with 16 additions and 2 deletions

View File

@ -80,7 +80,7 @@ static int resourceType(const QByteArray &key)
QByteArrayLiteral("glxcontext"), QByteArrayLiteral("apptime"),
QByteArrayLiteral("appusertime"), QByteArrayLiteral("hintstyle"),
QByteArrayLiteral("startupid"), QByteArrayLiteral("traywindow"),
QByteArrayLiteral("gettimestamp")
QByteArrayLiteral("gettimestamp"), QByteArrayLiteral("x11screen")
};
const QByteArray *end = names + sizeof(names) / sizeof(names[0]);
const QByteArray *result = std::find(names, end, key);
@ -139,6 +139,9 @@ void *QXcbNativeInterface::nativeResourceForIntegration(const QByteArray &resour
case StartupId:
result = startupId();
break;
case X11Screen:
result = x11Screen();
break;
default:
break;
}
@ -252,6 +255,15 @@ void *QXcbNativeInterface::startupId()
return 0;
}
void *QXcbNativeInterface::x11Screen()
{
QXcbIntegration *integration = static_cast<QXcbIntegration *>(QGuiApplicationPrivate::platformIntegration());
QXcbConnection *defaultConnection = integration->defaultConnection();
if (defaultConnection)
return reinterpret_cast<void *>(defaultConnection->primaryScreen());
return 0;
}
void QXcbNativeInterface::setAppTime(QScreen* screen, xcb_timestamp_t time)
{
static_cast<QXcbScreen *>(screen->handle())->connection()->setTime(time);

View File

@ -70,7 +70,8 @@ public:
ScreenHintStyle,
StartupId,
TrayWindow,
GetTimestamp
GetTimestamp,
X11Screen
};
QXcbNativeInterface();
@ -94,6 +95,7 @@ public:
void *appUserTime(const QXcbScreen *screen);
void *getTimestamp(const QXcbScreen *screen);
void *startupId();
void *x11Screen();
static void setAppTime(QScreen *screen, xcb_timestamp_t time);
static void setAppUserTime(QScreen *screen, xcb_timestamp_t time);
static void *eglContextForContext(QOpenGLContext *context);