summaryrefslogtreecommitdiffstats
path: root/src/compositor
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-10-27 18:03:44 +0100
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-10-27 18:31:47 +0100
commit8cac11fd8398b91300af6b40d16fcfebafade622 (patch)
tree556717d1c8624fd691d52c441ff11bdda7cea731 /src/compositor
parent699c44e3dc2d7099fdd87060c39309e318c55616 (diff)
parentf242587cbf3ee8ade683414aaa95158a1149db4c (diff)
Merge branch '5.6' into wip-compositor-api
qwindow-compositor changes from 5.6 will be adapted separately. The traditional wayland-egl path is tested and is functional like before. The EGLStream support will be verified separately once the qwindow-compositor changes are ready. Conflicts: examples/wayland/qwindow-compositor/qwindowcompositor.cpp examples/wayland/qwindow-compositor/textureblitter.cpp examples/wayland/qwindow-compositor/textureblitter.h examples/wayland/server-buffer/client/client.pro examples/wayland/server-buffer/compositor/compositor.pro src/compositor/compositor_api/qwaylandbufferref.cpp src/compositor/compositor_api/qwaylandbufferref.h src/compositor/hardware_integration/qwlclientbufferintegration_p.h src/compositor/wayland_wrapper/qwlkeyboard.cpp src/compositor/wayland_wrapper/qwlkeyboard_p.h src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h src/plugins/hardwareintegration/compositor/wayland-egl/wayland-egl.pro Change-Id: Ic2e3a6e8f74606c35b1e27cd4016fa133527d7ba
Diffstat (limited to 'src/compositor')
-rw-r--r--src/compositor/compositor_api/qwaylandbufferref.cpp16
-rw-r--r--src/compositor/compositor_api/qwaylandbufferref.h2
-rw-r--r--src/compositor/compositor_api/qwaylandkeyboard.cpp55
-rw-r--r--src/compositor/compositor_api/qwaylandkeyboard_p.h3
-rw-r--r--src/compositor/hardware_integration/qwlclientbufferintegration_p.h10
-rw-r--r--src/compositor/wayland_wrapper/qwldatadevice.cpp1
-rw-r--r--src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp21
-rw-r--r--src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h2
8 files changed, 86 insertions, 24 deletions
diff --git a/src/compositor/compositor_api/qwaylandbufferref.cpp b/src/compositor/compositor_api/qwaylandbufferref.cpp
index cff9bc35d..d0fe7ca40 100644
--- a/src/compositor/compositor_api/qwaylandbufferref.cpp
+++ b/src/compositor/compositor_api/qwaylandbufferref.cpp
@@ -235,4 +235,20 @@ void QWaylandBufferRef::bindToTexture() const
}
+int QWaylandBufferRef::textureTarget() const
+{
+ if (d->nullOrDestroyed())
+ return 0x0DE1; // GL_TEXTURE_2D
+
+ return d->buffer->textureTarget();
+}
+
+void QWaylandBufferRef::updateTexture() const
+{
+ if (d->nullOrDestroyed() || d->buffer->isShm())
+ return;
+
+ d->buffer->updateTexture();
+}
+
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandbufferref.h b/src/compositor/compositor_api/qwaylandbufferref.h
index d67d8178c..5683a0b31 100644
--- a/src/compositor/compositor_api/qwaylandbufferref.h
+++ b/src/compositor/compositor_api/qwaylandbufferref.h
@@ -79,6 +79,8 @@ public:
QImage image() const;
void bindToTexture() const;
+ int textureTarget() const;
+ void updateTexture() const;
private:
class QWaylandBufferRefPrivate *const d;
diff --git a/src/compositor/compositor_api/qwaylandkeyboard.cpp b/src/compositor/compositor_api/qwaylandkeyboard.cpp
index d7aa76e60..238a059a5 100644
--- a/src/compositor/compositor_api/qwaylandkeyboard.cpp
+++ b/src/compositor/compositor_api/qwaylandkeyboard.cpp
@@ -94,24 +94,47 @@ QWaylandKeyboardPrivate *QWaylandKeyboardPrivate::get(QWaylandKeyboard *keyboard
return keyboard->d_func();
}
+void QWaylandKeyboardPrivate::checkFocusResource(Resource *keyboardResource)
+{
+ if (!keyboardResource || !focus)
+ return;
+
+ // this is already the current resource, do no send enter twice
+ if (focusResource == keyboardResource)
+ return;
+
+ // check if new wl_keyboard resource is from the client owning the focus surface
+ if (focus->resource()->client == keyboardResource->client()) {
+ sendEnter(focus, keyboardResource);
+ focusResource = keyboardResource;
+ }
+}
+
+void QWaylandKeyboardPrivate::sendEnter(QWaylandSurface *surface, Resource *keyboardResource)
+{
+ uint32_t serial = compositor()->nextSerial();
+ send_modifiers(keyboardResource->handle, serial, modsDepressed, modsLatched, modsLocked, group);
+ send_enter(keyboardResource->handle, serial, surface->resource(), QByteArray::fromRawData((char *)keys.data(), keys.size() * sizeof(uint32_t)));
+}
+
void QWaylandKeyboardPrivate::focused(QWaylandSurface *surface)
{
if (surface && surface->isCursorSurface())
surface = Q_NULLPTR;
- if (focusResource && focus != surface) {
- uint32_t serial = compositor()->nextSerial();
- send_leave(focusResource->handle, serial, focus->resource());
+ if (focus != surface) {
+ if (focusResource) {
+ uint32_t serial = compositor()->nextSerial();
+ send_leave(focusResource->handle, serial, focus->resource());
+ }
focusDestroyListener.reset();
+ if (surface)
+ focusDestroyListener.listenForDestruction(surface->resource());
}
Resource *resource = surface ? resourceMap().value(surface->waylandClient()) : 0;
- if (resource && (focus != surface || focusResource != resource)) {
- uint32_t serial = compositor()->nextSerial();
- send_modifiers(resource->handle, serial, modsDepressed, modsLatched, modsLocked, group);
- send_enter(resource->handle, serial, surface->resource(), QByteArray::fromRawData((char *)keys.data(), keys.size() * sizeof(uint32_t)));
- focusDestroyListener.listenForDestruction(surface->resource());
- }
+ if (resource && (focus != surface || focusResource != resource))
+ sendEnter(surface, resource);
focusResource = resource;
focus = surface;
@@ -125,13 +148,15 @@ void QWaylandKeyboardPrivate::keyboard_bind_resource(wl_keyboard::Resource *reso
if (xkb_context) {
send_keymap(resource->handle, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
keymap_fd, keymap_size);
- return;
- }
+ } else
#endif
- int null_fd = open("/dev/null", O_RDONLY);
- send_keymap(resource->handle, 0 /* WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP */,
- null_fd, 0);
- close(null_fd);
+ {
+ int null_fd = open("/dev/null", O_RDONLY);
+ send_keymap(resource->handle, 0 /* WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP */,
+ null_fd, 0);
+ close(null_fd);
+ }
+ checkFocusResource(resource);
}
void QWaylandKeyboardPrivate::keyboard_destroy_resource(wl_keyboard::Resource *resource)
diff --git a/src/compositor/compositor_api/qwaylandkeyboard_p.h b/src/compositor/compositor_api/qwaylandkeyboard_p.h
index 9e5b7ee46..3ee6966b9 100644
--- a/src/compositor/compositor_api/qwaylandkeyboard_p.h
+++ b/src/compositor/compositor_api/qwaylandkeyboard_p.h
@@ -93,6 +93,9 @@ public:
void updateModifierState(uint code, uint32_t state);
void updateKeymap();
+ void checkFocusResource(Resource *resource);
+ void sendEnter(QWaylandSurface *surface, Resource *resource);
+
protected:
void keyboard_bind_resource(Resource *resource);
void keyboard_destroy_resource(Resource *resource);
diff --git a/src/compositor/hardware_integration/qwlclientbufferintegration_p.h b/src/compositor/hardware_integration/qwlclientbufferintegration_p.h
index 20aa2075b..e5c6c108f 100644
--- a/src/compositor/hardware_integration/qwlclientbufferintegration_p.h
+++ b/src/compositor/hardware_integration/qwlclientbufferintegration_p.h
@@ -51,8 +51,6 @@
#include <QtWaylandCompositor/qwaylandexport.h>
#include <QtWaylandCompositor/qwaylandsurface.h>
#include <QtCore/QSize>
-#include <QtGui/qopengl.h>
-#include <QtGui/QOpenGLContext>
#include <wayland-server.h>
QT_BEGIN_NAMESPACE
@@ -72,13 +70,11 @@ public:
virtual void initializeHardware(struct ::wl_display *display) = 0;
- // Used when the hardware integration wants to provide its own texture for a given buffer.
- // In most cases the compositor creates and manages the texture so this is not needed.
- virtual GLuint textureForBuffer(struct ::wl_resource *buffer) { Q_UNUSED(buffer); return 0; }
- virtual void destroyTextureForBuffer(struct ::wl_resource *buffer) { Q_UNUSED(buffer); }
+ virtual void initializeBuffer(struct ::wl_resource *buffer) { Q_UNUSED(buffer); }
+ virtual int textureTargetForBuffer(struct ::wl_resource *buffer) const { Q_UNUSED(buffer); return 0x0DE1; }
- // Called with the texture bound.
virtual void bindTextureToBuffer(struct ::wl_resource *buffer) = 0;
+ virtual void updateTextureForBuffer(struct ::wl_resource *buffer) { Q_UNUSED(buffer); }
virtual QWaylandSurface::Origin origin(struct ::wl_resource *) const { return QWaylandSurface::OriginBottomLeft; }
diff --git a/src/compositor/wayland_wrapper/qwldatadevice.cpp b/src/compositor/wayland_wrapper/qwldatadevice.cpp
index 56f24db95..e8e96a7d6 100644
--- a/src/compositor/wayland_wrapper/qwldatadevice.cpp
+++ b/src/compositor/wayland_wrapper/qwldatadevice.cpp
@@ -159,6 +159,7 @@ void DataDevice::data_device_start_drag(Resource *resource, struct ::wl_resource
Q_EMIT m_inputDevice->drag()->dragStarted();
Q_UNUSED(serial);
+ Q_UNUSED(origin);
//### need to verify that we have an implicit grab with this serial
}
diff --git a/src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp b/src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp
index ae0451592..f48dd3400 100644
--- a/src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp
+++ b/src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp
@@ -82,8 +82,11 @@ void SurfaceBuffer::initialize(struct ::wl_resource *buffer)
m_destroyed = false;
m_destroy_listener.surfaceBuffer = this;
m_destroy_listener.listener.notify = destroy_listener_callback;
- if (buffer)
+ if (buffer) {
+ if (ClientBufferIntegration *integration = QWaylandCompositorPrivate::get(m_compositor)->clientBufferIntegration())
+ integration->initializeBuffer(buffer);
wl_signal_add(&buffer->destroy_signal, &m_destroy_listener.listener);
+ }
}
void SurfaceBuffer::destructBufferState()
@@ -120,7 +123,7 @@ void SurfaceBuffer::destroy_listener_callback(wl_listener *listener, void *data)
{
Q_UNUSED(data);
struct surface_buffer_destroy_listener *destroy_listener =
- reinterpret_cast<struct surface_buffer_destroy_listener *>(listener);
+ reinterpret_cast<struct surface_buffer_destroy_listener *>(listener);
SurfaceBuffer *d = destroy_listener->surfaceBuffer;
// Mark the buffer as destroyed and clear m_buffer right away to avoid
@@ -218,6 +221,20 @@ void SurfaceBuffer::bindToTexture() const
}
}
+int SurfaceBuffer::textureTarget() const
+{
+ if (QtWayland::ClientBufferIntegration *clientInt = QWaylandCompositorPrivate::get(m_compositor)->clientBufferIntegration())
+ return clientInt->textureTargetForBuffer(m_buffer);
+
+ return 0;
+}
+
+void SurfaceBuffer::updateTexture() const
+{
+ if (QtWayland::ClientBufferIntegration *clientInt = QWaylandCompositorPrivate::get(m_compositor)->clientBufferIntegration())
+ clientInt->updateTextureForBuffer(m_buffer);
+}
+
}
QT_END_NAMESPACE
diff --git a/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h b/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h
index 24624cf8d..4f97ca1b2 100644
--- a/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h
+++ b/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h
@@ -103,7 +103,9 @@ public:
bool isShm() const { return wl_shm_buffer_get(m_buffer); }
QImage image() const;
+ int textureTarget() const;
void bindToTexture() const;
+ void updateTexture() const;
static bool hasContent(SurfaceBuffer *buffer) { return buffer && buffer->waylandBufferHandle(); }
private: