From 0f6ffad18665c7a6d648da0f2d19be7237510eeb Mon Sep 17 00:00:00 2001 From: Giulio Camuffo Date: Fri, 2 Nov 2012 15:52:36 +0100 Subject: [PATCH] Port the Wayland QPA plugin to wayland 1.0.0. Change-Id: I5b2092ed9dac8201c7a681acea0a3d703423c743 Reviewed-by: Andy Nichols --- .../brcm_egl/qwaylandbrcmeglintegration.cpp | 12 +++--- .../brcm_egl/qwaylandbrcmeglintegration.h | 4 +- .../qwaylandxcompositeeglintegration.cpp | 11 +++-- .../qwaylandxcompositeeglintegration.h | 4 +- .../qwaylandxcompositeglxintegration.cpp | 7 ++-- .../qwaylandxcompositeglxintegration.h | 4 +- .../wayland/qwaylanddatadevicemanager.cpp | 2 +- src/plugins/platforms/wayland/qwaylanddisplay.cpp | 48 +++++++++++++++------- src/plugins/platforms/wayland/qwaylanddisplay.h | 28 +++++++++++-- .../platforms/wayland/qwaylandextendedoutput.cpp | 2 +- .../platforms/wayland/qwaylandextendedsurface.cpp | 2 +- .../platforms/wayland/qwaylandinputdevice.cpp | 2 +- src/plugins/platforms/wayland/qwaylandqtkey.cpp | 2 +- src/plugins/platforms/wayland/qwaylandscreen.cpp | 8 +++- src/plugins/platforms/wayland/qwaylandscreen.h | 4 +- src/plugins/platforms/wayland/qwaylandshell.cpp | 2 +- .../platforms/wayland/qwaylandsubsurface.cpp | 2 +- src/plugins/platforms/wayland/qwaylandtouch.cpp | 2 +- src/plugins/platforms/wayland/qwaylandwindow.cpp | 1 + .../qwaylandwindowmanagerintegration.cpp | 9 ++-- .../qwaylandwindowmanagerintegration.h | 5 +-- 21 files changed, 101 insertions(+), 60 deletions(-) diff --git a/src/plugins/platforms/wayland/gl_integration/brcm_egl/qwaylandbrcmeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/brcm_egl/qwaylandbrcmeglintegration.cpp index dd0a813..d107d5a 100644 --- a/src/plugins/platforms/wayland/gl_integration/brcm_egl/qwaylandbrcmeglintegration.cpp +++ b/src/plugins/platforms/wayland/gl_integration/brcm_egl/qwaylandbrcmeglintegration.cpp @@ -50,19 +50,19 @@ #include "wayland-brcm-client-protocol.h" -QWaylandBrcmEglIntegration::QWaylandBrcmEglIntegration(struct wl_display *waylandDisplay) - : m_waylandDisplay(waylandDisplay) +QWaylandBrcmEglIntegration::QWaylandBrcmEglIntegration(QWaylandDisplay *waylandDisplay) + : m_waylandDisplay(waylandDisplay->wl_display()) { - wl_display_add_global_listener(waylandDisplay, wlDisplayHandleGlobal, this); qDebug() << "Using Brcm-EGL"; + waylandDisplay->addRegistryListener(wlDisplayHandleGlobal, this); } -void QWaylandBrcmEglIntegration::wlDisplayHandleGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data) +void QWaylandBrcmEglIntegration::wlDisplayHandleGlobal(void *data, struct wl_registry *registry, uint32_t id, const char *interface, uint32_t version) { Q_UNUSED(version); if (strcmp(interface, "wl_brcm") == 0) { QWaylandBrcmEglIntegration *integration = static_cast(data); - integration->m_waylandBrcm = static_cast(wl_display_bind(display, id, &wl_brcm_interface)); + integration->m_waylandBrcm = static_cast(wl_registry_bind(registry, id, &wl_brcm_interface, 1)); } } @@ -124,6 +124,6 @@ EGLDisplay QWaylandBrcmEglIntegration::eglDisplay() const QWaylandGLIntegration *QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay) { - return new QWaylandBrcmEglIntegration(waylandDisplay->wl_display()); + return new QWaylandBrcmEglIntegration(waylandDisplay); } diff --git a/src/plugins/platforms/wayland/gl_integration/brcm_egl/qwaylandbrcmeglintegration.h b/src/plugins/platforms/wayland/gl_integration/brcm_egl/qwaylandbrcmeglintegration.h index c85a8e3..c387425 100644 --- a/src/plugins/platforms/wayland/gl_integration/brcm_egl/qwaylandbrcmeglintegration.h +++ b/src/plugins/platforms/wayland/gl_integration/brcm_egl/qwaylandbrcmeglintegration.h @@ -58,7 +58,7 @@ struct wl_brcm; class QWaylandBrcmEglIntegration : public QWaylandGLIntegration { public: - QWaylandBrcmEglIntegration(struct wl_display *waylandDisplay); + QWaylandBrcmEglIntegration(QWaylandDisplay *waylandDisplay); ~QWaylandBrcmEglIntegration(); void initialize(); @@ -77,7 +77,7 @@ public: PFNEGLDESTROYGLOBALIMAGEBRCMPROC eglDestroyGlobalImageBRCM; private: - static void wlDisplayHandleGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data); + static void wlDisplayHandleGlobal(void *data, struct wl_registry *registry, uint32_t id, const char *interface, uint32_t version); struct wl_display *m_waylandDisplay; struct wl_brcm *m_waylandBrcm; diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp index 08a6c06..c4d98a8 100644 --- a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp +++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp @@ -52,13 +52,12 @@ QWaylandGLIntegration * QWaylandGLIntegration::createGLIntegration(QWaylandDispl return new QWaylandXCompositeEGLIntegration(waylandDisplay); } -QWaylandXCompositeEGLIntegration::QWaylandXCompositeEGLIntegration(QWaylandDisplay * waylandDispaly) +QWaylandXCompositeEGLIntegration::QWaylandXCompositeEGLIntegration(QWaylandDisplay * waylandDisplay) : QWaylandGLIntegration() - , mWaylandDisplay(waylandDispaly) + , mWaylandDisplay(waylandDisplay) { qDebug() << "Using XComposite-EGL"; - wl_display_add_global_listener(mWaylandDisplay->wl_display(), QWaylandXCompositeEGLIntegration::wlDisplayHandleGlobal, - this); + waylandDisplay->addRegistryListener(&wlDisplayHandleGlobal, this); } QWaylandXCompositeEGLIntegration::~QWaylandXCompositeEGLIntegration() @@ -113,12 +112,12 @@ const struct wl_xcomposite_listener QWaylandXCompositeEGLIntegration::xcomposite QWaylandXCompositeEGLIntegration::rootInformation }; -void QWaylandXCompositeEGLIntegration::wlDisplayHandleGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data) +void QWaylandXCompositeEGLIntegration::wlDisplayHandleGlobal(void *data, wl_registry *registry, uint32_t id, const char *interface, uint32_t version) { Q_UNUSED(version); if (strcmp(interface, "wl_xcomposite") == 0) { QWaylandXCompositeEGLIntegration *integration = static_cast(data); - integration->mWaylandComposite = static_cast(wl_display_bind(display,id,&wl_xcomposite_interface)); + integration->mWaylandComposite = static_cast(wl_registry_bind(registry,id,&wl_xcomposite_interface,1)); wl_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration); } diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h index 1dfbe93..78c8a2b 100644 --- a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h +++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h @@ -88,8 +88,8 @@ private: int mScreen; Window mRootWindow; - static void wlDisplayHandleGlobal(struct wl_display *display, uint32_t id, - const char *interface, uint32_t version, void *data); + static void wlDisplayHandleGlobal(void *data, struct wl_registry *registry, uint32_t id, + const char *interface, uint32_t version); static const struct wl_xcomposite_listener xcomposite_listener; static void rootInformation(void *data, diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp index 23e7aa0..d82c645 100644 --- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp +++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp @@ -60,8 +60,7 @@ QWaylandXCompositeGLXIntegration::QWaylandXCompositeGLXIntegration(QWaylandDispl , mRootWindow(0) { qDebug() << "Using XComposite-GLX"; - wl_display_add_global_listener(waylandDisplay->wl_display(), QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal, - this); + waylandDisplay->addRegistryListener(QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal, this); } QWaylandXCompositeGLXIntegration::~QWaylandXCompositeGLXIntegration() @@ -111,13 +110,13 @@ const struct wl_xcomposite_listener QWaylandXCompositeGLXIntegration::xcomposite QWaylandXCompositeGLXIntegration::rootInformation }; -void QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data) +void QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal(void *data, wl_registry *registry, uint32_t id, const char *interface, uint32_t version) { Q_UNUSED(version); if (strcmp(interface, "wl_xcomposite") == 0) { qDebug("XComposite-GLX: got wl_xcomposite global"); QWaylandXCompositeGLXIntegration *integration = static_cast(data); - integration->mWaylandComposite = static_cast(wl_display_bind(display, id, &wl_xcomposite_interface)); + integration->mWaylandComposite = static_cast(wl_registry_bind(registry, id, &wl_xcomposite_interface, 1)); wl_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration); } diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h index 761bf2b..5c16763 100644 --- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h +++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h @@ -81,8 +81,8 @@ private: int mScreen; Window mRootWindow; - static void wlDisplayHandleGlobal(struct wl_display *display, uint32_t id, - const char *interface, uint32_t version, void *data); + static void wlDisplayHandleGlobal(void *data, struct wl_registry *registry, uint32_t id, + const char *interface, uint32_t version); static const struct wl_xcomposite_listener xcomposite_listener; static void rootInformation(void *data, diff --git a/src/plugins/platforms/wayland/qwaylanddatadevicemanager.cpp b/src/plugins/platforms/wayland/qwaylanddatadevicemanager.cpp index 57eae5a..0b22fb2 100644 --- a/src/plugins/platforms/wayland/qwaylanddatadevicemanager.cpp +++ b/src/plugins/platforms/wayland/qwaylanddatadevicemanager.cpp @@ -200,7 +200,7 @@ QWaylandDataDeviceManager::QWaylandDataDeviceManager(QWaylandDisplay *display, u , m_drag_icon_buffer(0) , m_drag_can_drop(false) { - m_data_device_manager = static_cast(wl_display_bind(display->wl_display(),id,&wl_data_device_manager_interface)); + m_data_device_manager = static_cast(wl_registry_bind(display->wl_registry(),id,&wl_data_device_manager_interface,1)); // Create transfer devices for all input devices. // ### This only works if we get the global before all devices and is surely wrong when hotplugging. diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index e50a5f2..4b01f3e 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -106,6 +106,10 @@ void QWaylandDisplay::setLastKeyboardFocusInputDevice(QWaylandInputDevice *devic static QWaylandDisplay *display = 0; +const struct wl_registry_listener QWaylandDisplay::registryListener = { + QWaylandDisplay::displayHandleGlobal +}; + QWaylandDisplay::QWaylandDisplay(void) : mLastKeyboardFocusInputDevice(0) , mDndSelectionHandler(0) @@ -124,9 +128,10 @@ QWaylandDisplay::QWaylandDisplay(void) qFatal("No wayland connection available."); } - wl_display_add_global_listener(mDisplay, QWaylandDisplay::displayHandleGlobal, this); + mFd = wl_display_get_fd(mDisplay); - mFd = wl_display_get_fd(mDisplay, 0, 0); + mRegistry = wl_display_get_registry(mDisplay); + wl_registry_add_listener(mRegistry, ®istryListener, this); #ifdef WAYLAND_CLIENT_THREAD_AFFINITY mWritableNotificationFd = wl_display_get_write_notification_fd(mDisplay); @@ -166,14 +171,15 @@ QWaylandDisplay::~QWaylandDisplay(void) wl_display_disconnect(mDisplay); } -void QWaylandDisplay::createNewScreen(struct wl_output *output, QRect geometry) +void QWaylandDisplay::createNewScreen(struct wl_output *output) { - QWaylandScreen *waylandScreen = new QWaylandScreen(this,output,geometry); + QWaylandScreen *waylandScreen = new QWaylandScreen(this,output); mScreens.append(waylandScreen); } void QWaylandDisplay::flushRequests() { + wl_display_dispatch_pending(mDisplay); wl_display_flush(mDisplay); } @@ -199,12 +205,12 @@ void QWaylandDisplay::readEvents() return; } - wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); + wl_display_dispatch(mDisplay); } void QWaylandDisplay::blockingReadEvents() { - wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); + wl_display_dispatch(mDisplay); } QWaylandScreen *QWaylandDisplay::screenForOutput(struct wl_output *output) const @@ -218,7 +224,7 @@ QWaylandScreen *QWaylandDisplay::screenForOutput(struct wl_output *output) const } void QWaylandDisplay::outputHandleGeometry(void *data, - wl_output *output, + struct wl_output *output, int32_t x, int32_t y, int32_t physicalWidth, int32_t physicalHeight, @@ -232,7 +238,7 @@ void QWaylandDisplay::outputHandleGeometry(void *data, Q_UNUSED(transform); QWaylandDisplay *waylandDisplay = static_cast(data); QRect outputRect = QRect(x, y, physicalWidth, physicalHeight); - waylandDisplay->createNewScreen(output,outputRect); + waylandDisplay->screenForOutput(output)->setGeometry(outputRect); } void QWaylandDisplay::mode(void *data, @@ -251,6 +257,12 @@ void QWaylandDisplay::mode(void *data, } } +void QWaylandDisplay::addRegistryListener(RegistryListener listener, void *data) +{ + Listener l = { listener, data }; + mRegistryListeners.append(l); +} + const struct wl_output_listener QWaylandDisplay::outputListener = { QWaylandDisplay::outputHandleGeometry, QWaylandDisplay::mode @@ -263,13 +275,13 @@ void QWaylandDisplay::waitForScreens() blockingReadEvents(); } -void QWaylandDisplay::displayHandleGlobal(struct wl_display *display, +void QWaylandDisplay::displayHandleGlobal(void *data, + struct wl_registry *registry, uint32_t id, const char *interface, - uint32_t version, - void *data) + uint32_t version) { - Q_UNUSED(display); + Q_UNUSED(registry); QWaylandDisplay *that = static_cast(data); that->displayHandleGlobal(id, QByteArray(interface), version); } @@ -279,13 +291,15 @@ void QWaylandDisplay::displayHandleGlobal(uint32_t id, uint32_t version) { Q_UNUSED(version); + if (interface == "wl_output") { - struct wl_output *output = static_cast(wl_display_bind(mDisplay,id,&wl_output_interface)); + struct wl_output *output = static_cast(wl_registry_bind(mRegistry,id,&wl_output_interface,1)); + createNewScreen(output); wl_output_add_listener(output, &outputListener, this); } else if (interface == "wl_compositor") { - mCompositor = static_cast(wl_display_bind(mDisplay, id,&wl_compositor_interface)); + mCompositor = static_cast(wl_registry_bind(mRegistry, id,&wl_compositor_interface,1)); } else if (interface == "wl_shm") { - mShm = static_cast(wl_display_bind(mDisplay, id, &wl_shm_interface)); + mShm = static_cast(wl_registry_bind(mRegistry, id, &wl_shm_interface,1)); } else if (interface == "wl_shell"){ mShell = new QWaylandShell(this,id,version); } else if (interface == "wl_seat") { @@ -304,6 +318,10 @@ void QWaylandDisplay::displayHandleGlobal(uint32_t id, } else if (interface == "wl_qtkey_extension") { mQtKeyExtension = new QWaylandQtKeyExtension(this, id); } + + foreach (Listener l, mRegistryListeners) { + (*l.listener)(l.data, mRegistry, id, interface, version); + } } uint32_t QWaylandDisplay::currentTimeMillisec() diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h index fa4f376..5d2374a 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.h +++ b/src/plugins/platforms/wayland/qwaylanddisplay.h @@ -65,6 +65,12 @@ class QWaylandOutputExtension; class QWaylandTouchExtension; class QWaylandQtKeyExtension; +typedef void (*RegistryListener)(void *data, + struct wl_registry *registry, + uint32_t id, + const char *interface, + uint32_t version); + class QWaylandDisplay : public QObject { Q_OBJECT @@ -89,6 +95,7 @@ public: void setCursor(wl_surface *surface, int32_t x, int32_t y); struct wl_display *wl_display() const { return mDisplay; } + struct wl_registry *wl_registry() const { return mRegistry; } struct wl_compositor *wl_compositor() const { return mCompositor; } QWaylandShell *shell() const { return mShell; } @@ -105,13 +112,18 @@ public: QWaylandOutputExtension *outputExtension() const { return mOutputExtension; } QWaylandTouchExtension *touchExtension() const { return mTouchExtension; } + /* wl_registry_add_listener does not add but rather sets a listener, so this function is used + * to enable many listeners at once. */ + void addRegistryListener(RegistryListener listener, void *data); + struct wl_shm *shm() const { return mShm; } static uint32_t currentTimeMillisec(); void forceRoundTrip(); + public slots: - void createNewScreen(struct wl_output *output, QRect geometry); + void createNewScreen(struct wl_output *output); void readEvents(); void blockingReadEvents(); void flushRequests(); @@ -122,12 +134,19 @@ private: const QByteArray &interface, uint32_t version); + struct Listener { + RegistryListener listener; + void *data; + }; + struct wl_display *mDisplay; + struct wl_registry *mRegistry; struct wl_compositor *mCompositor; struct wl_shm *mShm; QWaylandShell *mShell; QList mScreens; QList mInputDevices; + QList mRegistryListeners; QWaylandInputDevice *mLastKeyboardFocusInputDevice; QWaylandDataDeviceManager *mDndSelectionHandler; QWaylandSurfaceExtension *mWindowExtension; @@ -141,11 +160,14 @@ private: int mWritableNotificationFd; bool mScreensInitialized; + static const struct wl_registry_listener registryListener; static const struct wl_output_listener outputListener; - static void displayHandleGlobal(struct wl_display *display, + + static void displayHandleGlobal(void *data, + struct wl_registry *registry, uint32_t id, const char *interface, - uint32_t version, void *data); + uint32_t version); static void outputHandleGeometry(void *data, struct wl_output *output, int32_t x, int32_t y, diff --git a/src/plugins/platforms/wayland/qwaylandextendedoutput.cpp b/src/plugins/platforms/wayland/qwaylandextendedoutput.cpp index 3171e7e..5f97a92 100644 --- a/src/plugins/platforms/wayland/qwaylandextendedoutput.cpp +++ b/src/plugins/platforms/wayland/qwaylandextendedoutput.cpp @@ -52,7 +52,7 @@ QWaylandOutputExtension::QWaylandOutputExtension(QWaylandDisplay *display, uint32_t id) { m_output_extension = static_cast( - wl_display_bind(display->wl_display(),id, &wl_output_extension_interface)); + wl_registry_bind(display->wl_registry(), id, &wl_output_extension_interface, 1)); QList platformScreens = display->screens(); for (int i = 0; i < platformScreens.size(); i++) { diff --git a/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp b/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp index be95ec9..3a6d6ef 100644 --- a/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp @@ -57,7 +57,7 @@ QWaylandSurfaceExtension::QWaylandSurfaceExtension(QWaylandDisplay *display, uint32_t id) { m_surface_extension = static_cast( - wl_display_bind(display->wl_display(),id, &wl_surface_extension_interface)); + wl_registry_bind(display->wl_registry(), id, &wl_surface_extension_interface, 1)); } QWaylandExtendedSurface *QWaylandSurfaceExtension::getExtendedWindow(QWaylandWindow *window) diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp index fc3cd1d..1dcf656 100644 --- a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp @@ -77,7 +77,7 @@ QWaylandInputDevice::QWaylandInputDevice(QWaylandDisplay *display, uint32_t id) , mXkbState(0) #endif { - mSeat = static_cast(wl_display_bind(mDisplay, id, &wl_seat_interface)); + mSeat = static_cast(wl_registry_bind(display->wl_registry(), id, &wl_seat_interface, 1)); wl_seat_add_listener(mSeat, &seatListener, this); wl_seat_set_user_data(mSeat, this); diff --git a/src/plugins/platforms/wayland/qwaylandqtkey.cpp b/src/plugins/platforms/wayland/qwaylandqtkey.cpp index 942ba1a..a6fe2f5 100644 --- a/src/plugins/platforms/wayland/qwaylandqtkey.cpp +++ b/src/plugins/platforms/wayland/qwaylandqtkey.cpp @@ -47,7 +47,7 @@ QWaylandQtKeyExtension::QWaylandQtKeyExtension(QWaylandDisplay *display, uint32_t id) : m_display(display) { - m_qtkey = static_cast(wl_display_bind(display->wl_display(), id, &wl_qtkey_extension_interface)); + m_qtkey = static_cast(wl_registry_bind(display->wl_registry(), id, &wl_qtkey_extension_interface, 1)); wl_qtkey_extension_add_listener(m_qtkey, &qtkey_listener, this); } diff --git a/src/plugins/platforms/wayland/qwaylandscreen.cpp b/src/plugins/platforms/wayland/qwaylandscreen.cpp index a20af35..8689c71 100644 --- a/src/plugins/platforms/wayland/qwaylandscreen.cpp +++ b/src/plugins/platforms/wayland/qwaylandscreen.cpp @@ -47,12 +47,11 @@ #include -QWaylandScreen::QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output *output, QRect geometry) +QWaylandScreen::QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output *output) : QPlatformScreen() , mWaylandDisplay(waylandDisplay) , mOutput(output) , mExtendedOutput(0) - , mGeometry(geometry) , mDepth(32) , mRefreshRate(60) , mFormat(QImage::Format_ARGB32_Premultiplied) @@ -74,6 +73,11 @@ QWaylandDisplay * QWaylandScreen::display() const return mWaylandDisplay; } +void QWaylandScreen::setGeometry(const QRect &geom) +{ + mGeometry = geom; +} + QRect QWaylandScreen::geometry() const { return mGeometry; diff --git a/src/plugins/platforms/wayland/qwaylandscreen.h b/src/plugins/platforms/wayland/qwaylandscreen.h index 59a94e4..28be6e8 100644 --- a/src/plugins/platforms/wayland/qwaylandscreen.h +++ b/src/plugins/platforms/wayland/qwaylandscreen.h @@ -51,7 +51,7 @@ class QWaylandExtendedOutput; class QWaylandScreen : public QPlatformScreen { public: - QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output *output, QRect geometry); + QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output *output); ~QWaylandScreen(); QWaylandDisplay *display() const; @@ -76,6 +76,8 @@ public: void handleMode(const QSize &size, int refreshRate); + void setGeometry(const QRect &geom); + private: QWaylandDisplay *mWaylandDisplay; struct wl_output *mOutput; diff --git a/src/plugins/platforms/wayland/qwaylandshell.cpp b/src/plugins/platforms/wayland/qwaylandshell.cpp index 48997f3..c82bf9b 100644 --- a/src/plugins/platforms/wayland/qwaylandshell.cpp +++ b/src/plugins/platforms/wayland/qwaylandshell.cpp @@ -48,7 +48,7 @@ QWaylandShell::QWaylandShell(QWaylandDisplay *display, uint32_t id, uint32_t ver : m_display(display) { Q_UNUSED(version) - m_shell = static_cast(wl_display_bind(m_display->wl_display(), id, &wl_shell_interface)); + m_shell = static_cast(wl_registry_bind(m_display->wl_registry(), id, &wl_shell_interface, 1)); } QWaylandShellSurface *QWaylandShell::getShellSurface(QWaylandWindow *window) diff --git a/src/plugins/platforms/wayland/qwaylandsubsurface.cpp b/src/plugins/platforms/wayland/qwaylandsubsurface.cpp index 7f0353f..b92bddc 100644 --- a/src/plugins/platforms/wayland/qwaylandsubsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandsubsurface.cpp @@ -50,7 +50,7 @@ QWaylandSubSurfaceExtension::QWaylandSubSurfaceExtension(QWaylandDisplay *display, uint32_t id) { m_sub_surface_extension = static_cast( - wl_display_bind(display->wl_display(),id, &wl_sub_surface_extension_interface)); + wl_registry_bind(display->wl_registry(), id, &wl_sub_surface_extension_interface, 1)); } QWaylandSubSurface *QWaylandSubSurfaceExtension::getSubSurfaceAwareWindow(QWaylandWindow *window) diff --git a/src/plugins/platforms/wayland/qwaylandtouch.cpp b/src/plugins/platforms/wayland/qwaylandtouch.cpp index 52cc82c..0c15873 100644 --- a/src/plugins/platforms/wayland/qwaylandtouch.cpp +++ b/src/plugins/platforms/wayland/qwaylandtouch.cpp @@ -52,7 +52,7 @@ QWaylandTouchExtension::QWaylandTouchExtension(QWaylandDisplay *display, uint32_ mMouseSourceId(-1), mInputDevice(0) { - mTouch = static_cast(wl_display_bind(display->wl_display(), id, &wl_touch_extension_interface)); + mTouch = static_cast(wl_registry_bind(display->wl_registry(), id, &wl_touch_extension_interface, 1)); wl_touch_extension_add_listener(mTouch, &touch_listener, this); } diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index 48e3b1b..c07ae03 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -225,6 +225,7 @@ void QWaylandWindow::damage(const QRect &rect) wl_surface_damage(mSurface, rect.x(), rect.y(), rect.width(), rect.height()); + wl_surface_commit(mSurface); } const wl_callback_listener QWaylandWindow::callbackListener = { diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp index c0b1f4c..ba26b79 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp +++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp @@ -85,10 +85,7 @@ QWaylandWindowManagerIntegration::QWaylandWindowManagerIntegration(QWaylandDispl : d_ptr(new QWaylandWindowManagerIntegrationPrivate(waylandDisplay)) { m_instance = this; - - wl_display_add_global_listener(d_ptr->m_waylandDisplay->wl_display(), - QWaylandWindowManagerIntegration::wlHandleListenerGlobal, - this); + waylandDisplay->addRegistryListener(&wlHandleListenerGlobal, this); } QWaylandWindowManagerIntegration::~QWaylandWindowManagerIntegration() @@ -113,13 +110,13 @@ bool QWaylandWindowManagerIntegration::showIsFullScreen() const return d->m_showIsFullScreen; } -void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data) +void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(void *data, wl_registry *registry, uint32_t id, const char *interface, uint32_t version) { Q_UNUSED(version); if (strcmp(interface, "wl_windowmanager") == 0) { QWaylandWindowManagerIntegration *integration = static_cast(data); integration->d_ptr->m_waylandWindowManager = - static_cast(wl_display_bind(display, id, &wl_windowmanager_interface)); + static_cast(wl_registry_bind(registry, id, &wl_windowmanager_interface, 1)); wl_windowmanager_add_listener(integration->d_ptr->m_waylandWindowManager, &windowmanager_listener, integration); } } diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h index ecb2c7d..2e1661c 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h +++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h @@ -74,10 +74,9 @@ public: bool showIsFullScreen() const; private: - static void wlHandleListenerGlobal(wl_display *display, uint32_t id, - const char *interface, uint32_t version, void *data); + static void wlHandleListenerGlobal(void *data, wl_registry *registry, uint32_t id, + const char *interface, uint32_t version); -private: QScopedPointer d_ptr; static QWaylandWindowManagerIntegration *m_instance; -- 2.7.4