Skip to content

Commit

Permalink
Port the Wayland QPA plugin to wayland 1.0.0.
Browse files Browse the repository at this point in the history
Change-Id: I5b2092ed9dac8201c7a681acea0a3d703423c743
Reviewed-by: Andy Nichols <andy.nichols@digia.com>
  • Loading branch information
giucam authored and Andy Nichols committed Nov 4, 2012
1 parent 7334963 commit 0f6ffad
Show file tree
Hide file tree
Showing 21 changed files with 101 additions and 60 deletions.
Expand Up @@ -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<QWaylandBrcmEglIntegration *>(data);
integration->m_waylandBrcm = static_cast<struct wl_brcm *>(wl_display_bind(display, id, &wl_brcm_interface));
integration->m_waylandBrcm = static_cast<struct wl_brcm *>(wl_registry_bind(registry, id, &wl_brcm_interface, 1));
}
}

Expand Down Expand Up @@ -124,6 +124,6 @@ EGLDisplay QWaylandBrcmEglIntegration::eglDisplay() const

QWaylandGLIntegration *QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
{
return new QWaylandBrcmEglIntegration(waylandDisplay->wl_display());
return new QWaylandBrcmEglIntegration(waylandDisplay);
}

Expand Up @@ -58,7 +58,7 @@ struct wl_brcm;
class QWaylandBrcmEglIntegration : public QWaylandGLIntegration
{
public:
QWaylandBrcmEglIntegration(struct wl_display *waylandDisplay);
QWaylandBrcmEglIntegration(QWaylandDisplay *waylandDisplay);
~QWaylandBrcmEglIntegration();

void initialize();
Expand All @@ -77,7 +77,7 @@ class QWaylandBrcmEglIntegration : public QWaylandGLIntegration
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;
Expand Down
Expand Up @@ -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()
Expand Down Expand Up @@ -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<QWaylandXCompositeEGLIntegration *>(data);
integration->mWaylandComposite = static_cast<struct wl_xcomposite *>(wl_display_bind(display,id,&wl_xcomposite_interface));
integration->mWaylandComposite = static_cast<struct wl_xcomposite *>(wl_registry_bind(registry,id,&wl_xcomposite_interface,1));
wl_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration);
}

Expand Down
Expand Up @@ -88,8 +88,8 @@ class QWaylandXCompositeEGLIntegration : public QWaylandGLIntegration
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,
Expand Down
Expand Up @@ -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()
Expand Down Expand Up @@ -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<QWaylandXCompositeGLXIntegration *>(data);
integration->mWaylandComposite = static_cast<struct wl_xcomposite *>(wl_display_bind(display, id, &wl_xcomposite_interface));
integration->mWaylandComposite = static_cast<struct wl_xcomposite *>(wl_registry_bind(registry, id, &wl_xcomposite_interface, 1));
wl_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration);
}

Expand Down
Expand Up @@ -81,8 +81,8 @@ class QWaylandXCompositeGLXIntegration : public QWaylandGLIntegration
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,
Expand Down
Expand Up @@ -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<struct wl_data_device_manager *>(wl_display_bind(display->wl_display(),id,&wl_data_device_manager_interface));
m_data_device_manager = static_cast<struct wl_data_device_manager *>(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.
Expand Down
48 changes: 33 additions & 15 deletions src/plugins/platforms/wayland/qwaylanddisplay.cpp
Expand Up @@ -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)
Expand All @@ -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, &registryListener, this);

#ifdef WAYLAND_CLIENT_THREAD_AFFINITY
mWritableNotificationFd = wl_display_get_write_notification_fd(mDisplay);
Expand Down Expand Up @@ -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);
}

Expand All @@ -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
Expand All @@ -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,
Expand All @@ -232,7 +238,7 @@ void QWaylandDisplay::outputHandleGeometry(void *data,
Q_UNUSED(transform);
QWaylandDisplay *waylandDisplay = static_cast<QWaylandDisplay *>(data);
QRect outputRect = QRect(x, y, physicalWidth, physicalHeight);
waylandDisplay->createNewScreen(output,outputRect);
waylandDisplay->screenForOutput(output)->setGeometry(outputRect);
}

void QWaylandDisplay::mode(void *data,
Expand All @@ -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
Expand All @@ -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<QWaylandDisplay *>(data);
that->displayHandleGlobal(id, QByteArray(interface), version);
}
Expand All @@ -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<struct wl_output *>(wl_display_bind(mDisplay,id,&wl_output_interface));
struct wl_output *output = static_cast<struct wl_output *>(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<struct wl_compositor *>(wl_display_bind(mDisplay, id,&wl_compositor_interface));
mCompositor = static_cast<struct wl_compositor *>(wl_registry_bind(mRegistry, id,&wl_compositor_interface,1));
} else if (interface == "wl_shm") {
mShm = static_cast<struct wl_shm *>(wl_display_bind(mDisplay, id, &wl_shm_interface));
mShm = static_cast<struct wl_shm *>(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") {
Expand All @@ -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()
Expand Down
28 changes: 25 additions & 3 deletions src/plugins/platforms/wayland/qwaylanddisplay.h
Expand Up @@ -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

Expand All @@ -89,6 +95,7 @@ class QWaylandDisplay : public QObject {
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; }
Expand All @@ -105,13 +112,18 @@ class QWaylandDisplay : public QObject {
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();
Expand All @@ -122,12 +134,19 @@ public slots:
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<QPlatformScreen *> mScreens;
QList<QWaylandInputDevice *> mInputDevices;
QList<Listener> mRegistryListeners;
QWaylandInputDevice *mLastKeyboardFocusInputDevice;
QWaylandDataDeviceManager *mDndSelectionHandler;
QWaylandSurfaceExtension *mWindowExtension;
Expand All @@ -141,11 +160,14 @@ public slots:
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,
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/platforms/wayland/qwaylandextendedoutput.cpp
Expand Up @@ -52,7 +52,7 @@
QWaylandOutputExtension::QWaylandOutputExtension(QWaylandDisplay *display, uint32_t id)
{
m_output_extension = static_cast<struct wl_output_extension *>(
wl_display_bind(display->wl_display(),id, &wl_output_extension_interface));
wl_registry_bind(display->wl_registry(), id, &wl_output_extension_interface, 1));

QList<QPlatformScreen *> platformScreens = display->screens();
for (int i = 0; i < platformScreens.size(); i++) {
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/platforms/wayland/qwaylandextendedsurface.cpp
Expand Up @@ -57,7 +57,7 @@
QWaylandSurfaceExtension::QWaylandSurfaceExtension(QWaylandDisplay *display, uint32_t id)
{
m_surface_extension = static_cast<struct wl_surface_extension *>(
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)
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/platforms/wayland/qwaylandinputdevice.cpp
Expand Up @@ -77,7 +77,7 @@ QWaylandInputDevice::QWaylandInputDevice(QWaylandDisplay *display, uint32_t id)
, mXkbState(0)
#endif
{
mSeat = static_cast<struct wl_seat *>(wl_display_bind(mDisplay, id, &wl_seat_interface));
mSeat = static_cast<struct wl_seat *>(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);

Expand Down
2 changes: 1 addition & 1 deletion src/plugins/platforms/wayland/qwaylandqtkey.cpp
Expand Up @@ -47,7 +47,7 @@
QWaylandQtKeyExtension::QWaylandQtKeyExtension(QWaylandDisplay *display, uint32_t id)
: m_display(display)
{
m_qtkey = static_cast<struct wl_qtkey_extension *>(wl_display_bind(display->wl_display(), id, &wl_qtkey_extension_interface));
m_qtkey = static_cast<struct wl_qtkey_extension *>(wl_registry_bind(display->wl_registry(), id, &wl_qtkey_extension_interface, 1));
wl_qtkey_extension_add_listener(m_qtkey, &qtkey_listener, this);
}

Expand Down

0 comments on commit 0f6ffad

Please sign in to comment.