Explicitly define the interface versions

Currently a global is bound with the version the interface has in the xml
file. This is a problem for apps that explicitly link to libwayland-client
because they may link to a newer libwayland, so the version of some interface
may be higher than the one that it is actually implemented.

Change-Id: Id0dbe6c0f1e05fe91954b9d8d9472d42d2053cdc
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
This commit is contained in:
Giulio Camuffo 2014-08-23 20:00:03 +03:00
parent f4e576fbe9
commit 611716293c
10 changed files with 20 additions and 20 deletions

View File

@ -45,7 +45,7 @@
QT_BEGIN_NAMESPACE
QWaylandHardwareIntegration::QWaylandHardwareIntegration(struct ::wl_registry *registry, int id)
: qt_hardware_integration(registry, id)
: qt_hardware_integration(registry, id, 1)
{
}

View File

@ -51,7 +51,7 @@
QT_BEGIN_NAMESPACE
QWaylandDataDeviceManager::QWaylandDataDeviceManager(QWaylandDisplay *display, uint32_t id)
: wl_data_device_manager(display->wl_registry(), id)
: wl_data_device_manager(display->wl_registry(), id, 1)
, m_display(display)
{
// Create transfer devices for all input devices.

View File

@ -219,33 +219,33 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
// We need to get the output events before creating surfaces
forceRoundTrip();
} else if (interface == QStringLiteral("wl_compositor")) {
mCompositor.init(registry, id);
mCompositor.init(registry, id, 3);
} else if (interface == QStringLiteral("wl_shm")) {
mShm = static_cast<struct wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface,1));
} else if (interface == QStringLiteral("xdg_shell")
&& qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) {
mShellXdg.reset(new QWaylandXdgShell(registry,id));
} else if (interface == QStringLiteral("wl_shell")){
mShell.reset(new QtWayland::wl_shell(registry, id));
mShell.reset(new QtWayland::wl_shell(registry, id, 1));
} else if (interface == QStringLiteral("wl_seat")) {
QWaylandInputDevice *inputDevice = new QWaylandInputDevice(this, id);
mInputDevices.append(inputDevice);
} else if (interface == QStringLiteral("wl_data_device_manager")) {
mDndSelectionHandler.reset(new QWaylandDataDeviceManager(this, id));
} else if (interface == QStringLiteral("qt_output_extension")) {
mOutputExtension.reset(new QtWayland::qt_output_extension(registry, id));
mOutputExtension.reset(new QtWayland::qt_output_extension(registry, id, 1));
foreach (QPlatformScreen *screen, screens())
static_cast<QWaylandScreen *>(screen)->createExtendedOutput();
} else if (interface == QStringLiteral("qt_surface_extension")) {
mWindowExtension.reset(new QtWayland::qt_surface_extension(registry, id));
mWindowExtension.reset(new QtWayland::qt_surface_extension(registry, id, 1));
} else if (interface == QStringLiteral("qt_sub_surface_extension")) {
mSubSurfaceExtension.reset(new QtWayland::qt_sub_surface_extension(registry, id));
mSubSurfaceExtension.reset(new QtWayland::qt_sub_surface_extension(registry, id, 1));
} else if (interface == QStringLiteral("qt_touch_extension")) {
mTouchExtension.reset(new QWaylandTouchExtension(this, id));
} else if (interface == QStringLiteral("qt_key_extension")) {
mQtKeyExtension.reset(new QWaylandQtKeyExtension(this, id));
} else if (interface == QStringLiteral("wl_text_input_manager")) {
mTextInputManager.reset(new QtWayland::wl_text_input_manager(registry, id));
mTextInputManager.reset(new QtWayland::wl_text_input_manager(registry, id, 1));
} else if (interface == QStringLiteral("qt_hardware_integration")) {
mHardwareIntegration.reset(new QWaylandHardwareIntegration(registry, id));
// make a roundtrip here since we need to receive the events sent by

View File

@ -228,7 +228,7 @@ public:
QWaylandInputDevice::QWaylandInputDevice(QWaylandDisplay *display, uint32_t id)
: QObject()
, QtWayland::wl_seat(display->wl_registry(), id)
, QtWayland::wl_seat(display->wl_registry(), id, 2)
, mQDisplay(display)
, mDisplay(display->wl_display())
, mCaps(0)

View File

@ -46,7 +46,7 @@
QT_BEGIN_NAMESPACE
QWaylandQtKeyExtension::QWaylandQtKeyExtension(QWaylandDisplay *display, uint32_t id)
: QtWayland::qt_key_extension(display->wl_registry(), id)
: QtWayland::qt_key_extension(display->wl_registry(), id, 2)
, m_display(display)
{
}

View File

@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE
QWaylandScreen::QWaylandScreen(QWaylandDisplay *waylandDisplay, uint32_t id)
: QPlatformScreen()
, QtWayland::wl_output(waylandDisplay->wl_registry(), id)
, QtWayland::wl_output(waylandDisplay->wl_registry(), id, 2)
, mWaylandDisplay(waylandDisplay)
, mExtendedOutput(0)
, mDepth(32)

View File

@ -46,7 +46,7 @@
QT_BEGIN_NAMESPACE
QWaylandTouchExtension::QWaylandTouchExtension(QWaylandDisplay *display, uint32_t id)
: QtWayland::qt_touch_extension(display->wl_registry(), id),
: QtWayland::qt_touch_extension(display->wl_registry(), id, 1),
mDisplay(display),
mTouchDevice(0),
mPointsLeft(0),

View File

@ -95,7 +95,7 @@ void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(void *data, wl_reg
{
Q_UNUSED(version);
if (interface == QStringLiteral("qt_windowmanager"))
static_cast<QWaylandWindowManagerIntegration *>(data)->init(registry, id);
static_cast<QWaylandWindowManagerIntegration *>(data)->init(registry, id, 1);
}
void QWaylandWindowManagerIntegration::windowmanager_hints(int32_t showIsFullScreen)

View File

@ -57,7 +57,7 @@ QWaylandXdgShell::QWaylandXdgShell(struct ::xdg_shell *shell)
}
QWaylandXdgShell::QWaylandXdgShell(struct ::wl_registry *registry, uint32_t id)
: QtWayland::xdg_shell(registry, id)
: QtWayland::xdg_shell(registry, id, 1)
{
use_unstable_version(QtWayland::xdg_shell::version_current);
}

View File

@ -822,13 +822,13 @@ void process(QXmlStreamReader &xml, const QByteArray &headerPath, const QByteArr
printf(" class %s %s\n {\n", clientExport.constData(), interfaceName);
printf(" public:\n");
printf(" %s(struct ::wl_registry *registry, int id);\n", interfaceName);
printf(" %s(struct ::wl_registry *registry, int id, int version);\n", interfaceName);
printf(" %s(struct ::%s *object);\n", interfaceName, interfaceName);
printf(" %s();\n", interfaceName);
printf("\n");
printf(" virtual ~%s();\n", interfaceName);
printf("\n");
printf(" void init(struct ::wl_registry *registry, int id);\n");
printf(" void init(struct ::wl_registry *registry, int id, int version);\n");
printf(" void init(struct ::%s *object);\n", interfaceName);
printf("\n");
printf(" struct ::%s *object() { return m_%s; }\n", interfaceName, interfaceName);
@ -908,9 +908,9 @@ void process(QXmlStreamReader &xml, const QByteArray &headerPath, const QByteArr
bool hasEvents = !interface.events.isEmpty();
printf(" %s::%s(struct ::wl_registry *registry, int id)\n", interfaceName, interfaceName);
printf(" %s::%s(struct ::wl_registry *registry, int id, int version)\n", interfaceName, interfaceName);
printf(" {\n");
printf(" init(registry, id);\n");
printf(" init(registry, id, version);\n");
printf(" }\n");
printf("\n");
@ -933,9 +933,9 @@ void process(QXmlStreamReader &xml, const QByteArray &headerPath, const QByteArr
printf(" }\n");
printf("\n");
printf(" void %s::init(struct ::wl_registry *registry, int id)\n", interfaceName);
printf(" void %s::init(struct ::wl_registry *registry, int id, int version)\n", interfaceName);
printf(" {\n");
printf(" m_%s = static_cast<struct ::%s *>(wl_registry_bind(registry, id, &%s_interface, %s_interface.version));\n", interfaceName, interfaceName, interfaceName, interfaceName);
printf(" m_%s = static_cast<struct ::%s *>(wl_registry_bind(registry, id, &%s_interface, version));\n", interfaceName, interfaceName, interfaceName);
if (hasEvents)
printf(" init_listener();\n");
printf(" }\n");