Merge remote-tracking branch 'origin/stable' into dev

Conflicts:
	src/client/hardwareintegration/qwaylandclientbufferintegrationplugin_p.h
	src/client/hardwareintegration/qwaylandserverbufferintegrationplugin_p.h
	src/compositor/hardware_integration/qwaylandclientbufferintegrationplugin.h
	src/compositor/hardware_integration/qwaylandserverbufferintegrationplugin.h
	src/plugins/hardwareintegration/client/brcm-egl/main.cpp
	src/plugins/hardwareintegration/client/drm-egl-server/main.cpp
	src/plugins/hardwareintegration/client/wayland-egl/main.cpp
	src/plugins/hardwareintegration/client/xcomposite-egl/main.cpp
	src/plugins/hardwareintegration/client/xcomposite-glx/main.cpp
	src/plugins/hardwareintegration/compositor/brcm-egl/main.cpp
	src/plugins/hardwareintegration/compositor/drm-egl-server/main.cpp
	src/plugins/hardwareintegration/compositor/wayland-egl/main.cpp
	src/plugins/hardwareintegration/compositor/xcomposite-egl/main.cpp
	src/plugins/hardwareintegration/compositor/xcomposite-glx/main.cpp

Change-Id: I9a9b418075970dd334babc3590b9b0315c2afb0d
This commit is contained in:
Andy Nichols 2014-02-04 15:04:56 +01:00
commit ebe84dd5cc
8 changed files with 108 additions and 63 deletions

View File

@ -39,8 +39,8 @@
** **
****************************************************************************/ ****************************************************************************/
#include <QtWaylandClient/qwaylandclientbufferintegrationplugin.h> #include <QtWaylandClient/private/qwaylandclientbufferintegrationplugin_p.h>
#include "qwaylandbrcmeglclientbufferintegration.h" #include "qwaylandbrcmeglintegration.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -56,15 +56,15 @@ public:
QStringList QWaylandBrcmEglClientBufferPlugin::keys() const QStringList QWaylandBrcmEglClientBufferPlugin::keys() const
{ {
QStringList list; QStringList list;
list << "brcm"; list << "wayland-brcm";
return list; return list;
} }
QWaylandEglClientBufferIntegration *QWaylandBrcmEglClientBufferPlugin::create(const QString& system, const QStringList& paramList) QWaylandClientBufferIntegration *QWaylandBrcmEglClientBufferPlugin::create(const QString& system, const QStringList& paramList)
{ {
Q_UNUSED(paramList); Q_UNUSED(paramList);
if (system.toLower() == "brcm") if (system.toLower() == "wayland-brcm")
return new QWaylandBrcmEglClientBufferIntegration(); return new QWaylandBrcmEglIntegration();
return 0; return 0;
} }

View File

@ -39,8 +39,8 @@
** **
****************************************************************************/ ****************************************************************************/
#include <QtWaylandClient/qwaylandclientbufferintegrationplugin.h> #include <QtWaylandClient/private/qwaylandclientbufferintegrationplugin_p.h>
#include "qwaylandxcompositeglxclientbufferintegration.h" #include "qwaylandxcompositeglxintegration.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -64,7 +64,7 @@ QWaylandClientBufferIntegration *QWaylandXCompositeGlxClientBufferIntegrationPlu
{ {
Q_UNUSED(paramList); Q_UNUSED(paramList);
if (system.toLower() == "xcomposite-glx") if (system.toLower() == "xcomposite-glx")
return new QWaylandXCompositeGLXClientBufferIntegration(); return new QWaylandXCompositeGLXIntegration();
return 0; return 0;
} }

View File

@ -175,12 +175,6 @@ QWaylandScreen *QWaylandDisplay::screenForOutput(struct wl_output *output) const
return 0; return 0;
} }
void QWaylandDisplay::addRegistryListener(RegistryListener listener, void *data)
{
Listener l = { listener, data };
mRegistryListeners.append(l);
}
void QWaylandDisplay::waitForScreens() void QWaylandDisplay::waitForScreens()
{ {
flushRequests(); flushRequests();
@ -237,10 +231,30 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
mHardwareIntegration.reset(new QWaylandHardwareIntegration(registry, id)); mHardwareIntegration.reset(new QWaylandHardwareIntegration(registry, id));
} }
mGlobals.append(RegistryGlobal(id, interface, version, registry));
foreach (Listener l, mRegistryListeners) foreach (Listener l, mRegistryListeners)
(*l.listener)(l.data, registry, id, interface, version); (*l.listener)(l.data, registry, id, interface, version);
} }
void QWaylandDisplay::registry_global_remove(uint32_t id)
{
for (int i = 0, ie = mGlobals.count(); i != ie; ++i) {
if (mGlobals[i].id == id) {
mGlobals.removeAt(i);
break;
}
}
}
void QWaylandDisplay::addRegistryListener(RegistryListener listener, void *data)
{
Listener l = { listener, data };
mRegistryListeners.append(l);
for (int i = 0, ie = mGlobals.count(); i != ie; ++i)
(*l.listener)(l.data, mGlobals[i].registry, mGlobals[i].id, mGlobals[i].interface, mGlobals[i].version);
}
uint32_t QWaylandDisplay::currentTimeMillisec() uint32_t QWaylandDisplay::currentTimeMillisec()
{ {
//### we throw away the time information //### we throw away the time information

View File

@ -130,6 +130,15 @@ public:
QtWayland::wl_text_input_manager *textInputManager() const { return mTextInputManager.data(); } QtWayland::wl_text_input_manager *textInputManager() const { return mTextInputManager.data(); }
QWaylandHardwareIntegration *hardwareIntegration() const { return mHardwareIntegration.data(); } QWaylandHardwareIntegration *hardwareIntegration() const { return mHardwareIntegration.data(); }
struct RegistryGlobal {
uint32_t id;
QString interface;
uint32_t version;
struct ::wl_registry *registry;
RegistryGlobal(uint32_t id_, const QString &interface_, uint32_t version_, struct ::wl_registry *registry_)
: id(id_), interface(interface_), version(version_), registry(registry_) { }
};
/* wl_registry_add_listener does not add but rather sets a listener, so this function is used /* wl_registry_add_listener does not add but rather sets a listener, so this function is used
* to enable many listeners at once. */ * to enable many listeners at once. */
void addRegistryListener(RegistryListener listener, void *data); void addRegistryListener(RegistryListener listener, void *data);
@ -173,13 +182,14 @@ private:
QScopedPointer<QWaylandWindowManagerIntegration> mWindowManagerIntegration; QScopedPointer<QWaylandWindowManagerIntegration> mWindowManagerIntegration;
QScopedPointer<QtWayland::wl_text_input_manager> mTextInputManager; QScopedPointer<QtWayland::wl_text_input_manager> mTextInputManager;
QScopedPointer<QWaylandHardwareIntegration> mHardwareIntegration; QScopedPointer<QWaylandHardwareIntegration> mHardwareIntegration;
QSocketNotifier *mReadNotifier; QSocketNotifier *mReadNotifier;
int mFd; int mFd;
int mWritableNotificationFd; int mWritableNotificationFd;
bool mScreensInitialized; bool mScreensInitialized;
QList<RegistryGlobal> mGlobals;
void registry_global(uint32_t id, const QString &interface, uint32_t version) Q_DECL_OVERRIDE; void registry_global(uint32_t id, const QString &interface, uint32_t version) Q_DECL_OVERRIDE;
void registry_global_remove(uint32_t id) Q_DECL_OVERRIDE;
static void shellHandleConfigure(void *data, struct wl_shell *shell, static void shellHandleConfigure(void *data, struct wl_shell *shell,
uint32_t time, uint32_t edges, uint32_t time, uint32_t edges,

View File

@ -112,6 +112,7 @@ public:
if (mXkbContext) if (mXkbContext)
xkb_context_unref(mXkbContext); xkb_context_unref(mXkbContext);
#endif #endif
wl_keyboard_destroy(object());
} }
void keyboard_keymap(uint32_t format, void keyboard_keymap(uint32_t format,
@ -161,6 +162,7 @@ public:
} }
~Pointer() ~Pointer()
{ {
wl_pointer_destroy(object());
} }
void pointer_enter(uint32_t serial, struct wl_surface *surface, void pointer_enter(uint32_t serial, struct wl_surface *surface,
@ -193,6 +195,7 @@ public:
} }
~Touch() ~Touch()
{ {
wl_touch_destroy(object());
} }
void touch_down(uint32_t serial, void touch_down(uint32_t serial,
@ -229,6 +232,7 @@ QWaylandInputDevice::QWaylandInputDevice(QWaylandDisplay *display, uint32_t id)
, mTouch(0) , mTouch(0)
, mTime(0) , mTime(0)
, mSerial(0) , mSerial(0)
, mTouchDevice(0)
{ {
if (mQDisplay->dndSelectionHandler()) { if (mQDisplay->dndSelectionHandler()) {
mDataDevice = mQDisplay->dndSelectionHandler()->getDataDevice(this); mDataDevice = mQDisplay->dndSelectionHandler()->getDataDevice(this);
@ -733,17 +737,20 @@ void QWaylandInputDevice::Keyboard::keyboard_key(uint32_t serial, uint32_t time,
{ {
Q_UNUSED(serial); Q_UNUSED(serial);
QWaylandWindow *window = mFocus; QWaylandWindow *window = mFocus;
uint32_t code = key + 8;
bool isDown = state != 0;
QEvent::Type type = isDown ? QEvent::KeyPress : QEvent::KeyRelease;
QString text;
int qtkey = key + 8; // qt-compositor substracts 8 for some reason
#ifndef QT_NO_WAYLAND_XKB #ifndef QT_NO_WAYLAND_XKB
if (!mXkbMap) if (!mXkbMap)
return; return;
uint32_t code = key + 8;
bool isDown = state != 0;
const xkb_keysym_t *syms; const xkb_keysym_t *syms;
uint32_t numSyms = xkb_key_get_syms(mXkbState, code, &syms); uint32_t numSyms = xkb_key_get_syms(mXkbState, code, &syms);
xkb_state_update_key(mXkbState, code, xkb_state_update_key(mXkbState, code,
isDown ? XKB_KEY_DOWN : XKB_KEY_UP); isDown ? XKB_KEY_DOWN : XKB_KEY_UP);
QEvent::Type type = isDown ? QEvent::KeyPress : QEvent::KeyRelease;
if (!window) { if (!window) {
// We destroyed the keyboard focus surface, but the server // We destroyed the keyboard focus surface, but the server
@ -751,9 +758,6 @@ void QWaylandInputDevice::Keyboard::keyboard_key(uint32_t serial, uint32_t time,
return; return;
} }
int qtkey = key + 8; // qt-compositor substracts 8 for some reason
QString text;
if (numSyms == 1) { if (numSyms == 1) {
xkb_keysym_t sym = syms[0]; xkb_keysym_t sym = syms[0];
Qt::KeyboardModifiers modifiers = mParent->modifiers(); Qt::KeyboardModifiers modifiers = mParent->modifiers();

View File

@ -285,7 +285,7 @@ void QWaylandIntegration::initializeClientBufferIntegration()
if (mClientBufferIntegration) if (mClientBufferIntegration)
mClientBufferIntegration->initialize(mDisplay); mClientBufferIntegration->initialize(mDisplay);
else else
qWarning("Failed to load client buffer intgration: %s\n", qPrintable(targetKey)); qWarning("Failed to load client buffer integration: %s\n", qPrintable(targetKey));
} }
void QWaylandIntegration::initializeServerBufferIntegration() void QWaylandIntegration::initializeServerBufferIntegration()
@ -304,7 +304,7 @@ void QWaylandIntegration::initializeServerBufferIntegration()
} }
if (targetKey.isEmpty()) { if (targetKey.isEmpty()) {
qWarning("Failed to determin what server buffer integration to use"); qWarning("Failed to determine what server buffer integration to use");
return; return;
} }

View File

@ -80,6 +80,8 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
, mFrameCallback(0) , mFrameCallback(0)
, mRequestResizeSent(false) , mRequestResizeSent(false)
, mCanResize(true) , mCanResize(true)
, mResizeDirty(false)
, mResizeAfterSwap(!qEnvironmentVariableIsSet("QT_WAYLAND_RESIZE_AFTER_SWAP"))
, mSentInitialResize(false) , mSentInitialResize(false)
, mMouseDevice(0) , mMouseDevice(0)
, mMouseSerial(0) , mMouseSerial(0)
@ -119,7 +121,7 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
setWindowFlags(window->flags()); setWindowFlags(window->flags());
setGeometry(window->geometry()); setGeometry(window->geometry());
setWindowState(window->windowState()); setWindowStateInternal(window->windowState());
} }
QWaylandWindow::~QWaylandWindow() QWaylandWindow::~QWaylandWindow()
@ -195,18 +197,16 @@ void QWaylandWindow::setGeometry(const QRect &rect)
if (mWindowDecoration && window()->isVisible()) if (mWindowDecoration && window()->isVisible())
mWindowDecoration->update(); mWindowDecoration->update();
if (mConfigure.isEmpty()) { if (mResizeAfterSwap)
mResizeDirty = true;
else
QWindowSystemInterface::handleGeometryChange(window(), geometry()); QWindowSystemInterface::handleGeometryChange(window(), geometry());
QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry())); QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
} }
}
void QWaylandWindow::setVisible(bool visible) void QWaylandWindow::setVisible(bool visible)
{ {
if (visible) { if (visible) {
if (mBuffer)
attach(mBuffer->buffer(), 0, 0);
if (window()->type() == Qt::Popup && transientParent()) { if (window()->type() == Qt::Popup && transientParent()) {
QWaylandWindow *parent = transientParent(); QWaylandWindow *parent = transientParent();
mMouseDevice = parent->mMouseDevice; mMouseDevice = parent->mMouseDevice;
@ -227,11 +227,11 @@ void QWaylandWindow::setVisible(bool visible)
// QWaylandShmBackingStore::beginPaint(). // QWaylandShmBackingStore::beginPaint().
} else { } else {
QWindowSystemInterface::handleExposeEvent(window(), QRegion()); QWindowSystemInterface::handleExposeEvent(window(), QRegion());
QWindowSystemInterface::flushWindowSystemEvents();
attach(static_cast<QWaylandBuffer *>(0), 0, 0); attach(static_cast<QWaylandBuffer *>(0), 0, 0);
}
damage(QRect(QPoint(0,0),geometry().size()));
commit(); commit();
} }
}
void QWaylandWindow::raise() void QWaylandWindow::raise()
@ -287,7 +287,6 @@ void QWaylandWindow::doResize()
setGeometry(geometry); setGeometry(geometry);
mConfigure.clear(); mConfigure.clear();
QWindowSystemInterface::handleGeometryChange(window(), geometry);
} }
void QWaylandWindow::setCanResize(bool canResize) void QWaylandWindow::setCanResize(bool canResize)
@ -295,9 +294,17 @@ void QWaylandWindow::setCanResize(bool canResize)
QMutexLocker lock(&mResizeLock); QMutexLocker lock(&mResizeLock);
mCanResize = canResize; mCanResize = canResize;
if (canResize && !mConfigure.isEmpty()) { if (canResize) {
if (mResizeDirty) {
QWindowSystemInterface::handleGeometryChange(window(), geometry());
}
if (!mConfigure.isEmpty()) {
doResize(); doResize();
QWindowSystemInterface::handleExposeEvent(window(), geometry()); QWindowSystemInterface::handleExposeEvent(window(), geometry());
} else if (mResizeDirty) {
QWindowSystemInterface::handleExposeEvent(window(), geometry());
mResizeDirty = false;
}
} }
} }
@ -409,30 +416,7 @@ void QWaylandWindow::handleContentOrientationChange(Qt::ScreenOrientation orient
void QWaylandWindow::setWindowState(Qt::WindowState state) void QWaylandWindow::setWindowState(Qt::WindowState state)
{ {
if (mState == state) { if (setWindowStateInternal(state))
return;
}
// As of february 2013 QWindow::setWindowState sets the new state value after
// QPlatformWindow::setWindowState returns, so we cannot rely on QWindow::windowState
// here. We use then this mState variable.
mState = state;
createDecoration();
switch (state) {
case Qt::WindowFullScreen:
mShellSurface->setFullscreen();
break;
case Qt::WindowMaximized:
mShellSurface->setMaximized();
break;
case Qt::WindowMinimized:
mShellSurface->setMinimized();
break;
default:
mShellSurface->setNormal();
}
QWindowSystemInterface::handleWindowStateChanged(window(), mState);
QWindowSystemInterface::flushWindowSystemEvents(); // Required for oldState to work on WindowStateChanged QWindowSystemInterface::flushWindowSystemEvents(); // Required for oldState to work on WindowStateChanged
} }
@ -605,4 +589,33 @@ bool QWaylandWindow::setMouseGrabEnabled(bool grab)
return true; return true;
} }
bool QWaylandWindow::setWindowStateInternal(Qt::WindowState state)
{
if (mState == state) {
return false;
}
// As of february 2013 QWindow::setWindowState sets the new state value after
// QPlatformWindow::setWindowState returns, so we cannot rely on QWindow::windowState
// here. We use then this mState variable.
mState = state;
createDecoration();
switch (state) {
case Qt::WindowFullScreen:
mShellSurface->setFullscreen();
break;
case Qt::WindowMaximized:
mShellSurface->setMaximized();
break;
case Qt::WindowMinimized:
mShellSurface->setMinimized();
break;
default:
mShellSurface->setNormal();
}
QWindowSystemInterface::handleWindowStateChanged(window(), mState);
return true;
}
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -193,6 +193,8 @@ protected:
QWaylandWindowConfigure mConfigure; QWaylandWindowConfigure mConfigure;
bool mRequestResizeSent; bool mRequestResizeSent;
bool mCanResize; bool mCanResize;
bool mResizeDirty;
bool mResizeAfterSwap;
bool mSentInitialResize; bool mSentInitialResize;
QPoint mOffset; QPoint mOffset;
@ -204,6 +206,8 @@ protected:
Qt::WindowState mState; Qt::WindowState mState;
private: private:
bool setWindowStateInternal(Qt::WindowState flags);
void handleMouseEventWithDecoration(QWaylandInputDevice *inputDevice, void handleMouseEventWithDecoration(QWaylandInputDevice *inputDevice,
ulong timestamp, ulong timestamp,
const QPointF & local, const QPointF & local,