From f3431040f74a902c0a308aa9eb2bfdf37eb4855e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Fri, 24 Jul 2015 15:16:35 +0200 Subject: LGPL v3 license change for Qt Wayland Compositor Change-Id: I84ed248b471464214d935352768f300d4b90dec3 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 50 +++++++++++------------- 1 file changed, 23 insertions(+), 27 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index f8c8bdc1f..fd9720728 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -4,36 +4,32 @@ ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** -** This file is part of the Qt Compositor. +** This file is part of the QtWaylandCompositor module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. ** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. ** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. ** ** $QT_END_LICENSE$ ** -- cgit v1.2.3 From 964eb66e37dbbb9ff6736c3b40e8fcc76d1b8d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Wed, 29 Jul 2015 13:48:26 +0200 Subject: Move surface management to outputs Change-Id: I427e576a4e0834d6266af2670f7ff47e078153d4 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index fd9720728..3d0ebdbb7 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -246,14 +246,6 @@ Compositor::~Compositor() delete m_display; } -void Compositor::sendFrameCallbacks(QList visibleSurfaces) -{ - foreach (QWaylandSurface *surface, visibleSurfaces) { - surface->handle()->sendFrameCallback(); - } - wl_display_flush_clients(m_display->handle()); -} - uint Compositor::currentTimeMsecs() const { return m_timer.elapsed(); @@ -320,7 +312,7 @@ void Compositor::processWaylandEvents() void Compositor::destroySurface(Surface *surface) { - m_surfaces.removeOne(surface); + surface->removeFromOutput(); waylandCompositor()->surfaceAboutToBeDestroyed(surface->waylandSurface()); @@ -347,8 +339,9 @@ void Compositor::cleanupGraphicsResources() void Compositor::compositor_create_surface(Resource *resource, uint32_t id) { QWaylandSurface *surface = new QWaylandSurface(resource->client(), id, resource->version(), m_qt_compositor); - m_surfaces << surface->handle(); - surface->handle()->addToOutput(primaryOutput()->handle()); + + primaryOutput()->addSurface(surface); + //BUG: This may not be an on-screen window surface though m_qt_compositor->surfaceCreated(surface); } -- cgit v1.2.3 From 7c65f7e9618a104b1304ec1a7a1cf7ee31527c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Wed, 29 Jul 2015 13:50:15 +0200 Subject: Add createSurface factory function on QWaylandCompositor This simplifies subclassing the compositor getting Change-Id: I392b84febae62df042b23fa806360bc068bf984f --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 3d0ebdbb7..879d02e07 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -338,11 +338,9 @@ void Compositor::cleanupGraphicsResources() void Compositor::compositor_create_surface(Resource *resource, uint32_t id) { - QWaylandSurface *surface = new QWaylandSurface(resource->client(), id, resource->version(), m_qt_compositor); - + QWaylandClient *client = QWaylandClient::fromWlClient(resource->client()); + QWaylandSurface *surface = m_qt_compositor->createSurface(client, id, resource->version()); primaryOutput()->addSurface(surface); - - //BUG: This may not be an on-screen window surface though m_qt_compositor->surfaceCreated(surface); } -- cgit v1.2.3 From 42c1bf3208e75b131aac2923da397de054cbbe13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Wed, 29 Jul 2015 13:51:25 +0200 Subject: Make QWaylandCompositor inherit QObject And remove the constructor arguments, and just having parent as a constructor argument. This requires QWaylandCompositor to have a create semantic familiar from QWindow and QOpenGLContext. On create the native wayland socket is created and initialized. Also the virtual functions surfaceCreated and surfaceAboutToBeDestroyed have been converted to signals, removing the need to subclass QWaylandCompositor Examples have been changed to avoid having two super classes inheriting QObject. This is done by either making the QWindow subclass a member or making the QWaylandCompositor a member. Change-Id: I317d37e2adca15bfe4e1904e20ab0d83943b2d45 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 879d02e07..d59d7ff3d 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -155,8 +155,8 @@ Compositor *Compositor::instance() return compositor; } -Compositor::Compositor(QWaylandCompositor *qt_compositor, QWaylandCompositor::ExtensionFlags extensions) - : m_extensions(extensions) +Compositor::Compositor(QWaylandCompositor *qt_compositor) + : m_extensions(QWaylandCompositor::DefaultExtensions) , m_display(new Display) , m_current_frame(0) , m_last_queued_buf(-1) @@ -176,6 +176,7 @@ Compositor::Compositor(QWaylandCompositor *qt_compositor, QWaylandCompositor::Ex , m_inputPanel() , m_eventHandler(new WindowSystemEventHandler(this)) , m_retainSelection(false) + , m_initialized(false) { m_timer.start(); compositor = this; @@ -200,9 +201,11 @@ void Compositor::init() foreach (wl_shm_format format, formats) wl_display_add_shm_format(m_display->handle(), format); - if (wl_display_add_socket(m_display->handle(), m_qt_compositor->socketName())) { - fprintf(stderr, "Fatal: Failed to open server socket\n"); - exit(EXIT_FAILURE); + const char *socketName = 0; + if (m_socket_name.size()) + socketName = m_socket_name.constData(); + if (wl_display_add_socket(m_display->handle(), socketName)) { + qFatal("Fatal: Failed to open server socket\n"); } m_loop = wl_display_get_event_loop(m_display->handle()); @@ -224,6 +227,8 @@ void Compositor::init() initializeHardwareIntegration(); initializeExtensions(); initializeDefaultInputDevice(); + + m_initialized = true; } Compositor::~Compositor() @@ -341,7 +346,7 @@ void Compositor::compositor_create_surface(Resource *resource, uint32_t id) QWaylandClient *client = QWaylandClient::fromWlClient(resource->client()); QWaylandSurface *surface = m_qt_compositor->createSurface(client, id, resource->version()); primaryOutput()->addSurface(surface); - m_qt_compositor->surfaceCreated(surface); + emit m_qt_compositor->surfaceCreated(surface); } void Compositor::compositor_create_region(Resource *resource, uint32_t id) -- cgit v1.2.3 From 6ec46c91e128073794d527910090d735cfeba073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Fri, 2 Jan 2015 12:43:40 +0100 Subject: Make QWaylandCompositor::primaryOutput a Q_PROPERTY Change-Id: I2a5c9556549fa3dbc4ad8b399a32266acbcc712b --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index d59d7ff3d..6316aac24 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -305,6 +305,7 @@ void Compositor::setPrimaryOutput(QWaylandOutput *output) m_outputs.removeAt(i); m_outputs.prepend(output); + emit m_qt_compositor->primaryOutputChanged(); } void Compositor::processWaylandEvents() -- cgit v1.2.3 From b25b9856ad61e455fc3c51afc746692ab848ced4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Wed, 21 Jan 2015 12:04:34 +0100 Subject: Remove releaseSurfaces function from QWayland::Surface Change-Id: I3e5ed3233f74c98bffd7064d70d076ecaa129d7e --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 6316aac24..98f5aa1d4 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -322,7 +322,6 @@ void Compositor::destroySurface(Surface *surface) waylandCompositor()->surfaceAboutToBeDestroyed(surface->waylandSurface()); - surface->releaseSurfaces(); m_destroyed_surfaces << surface->waylandSurface(); } -- cgit v1.2.3 From ab6980d57609b1e4bdb164d3413faa2f7cb7e1e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Thu, 30 Jul 2015 12:05:12 +0200 Subject: Move the output from QWaylandSurface to the QWaylandSurfaceView and add a property called primaryOutput on the QWaylandSurface. Also add some bookkeeping in QtWayland::Output so it knows what surfaces and views it currently holds, sending the enter and leave events automatically. Change-Id: Ib6efbc6f8157657fb4451b751bba1cb5345b7906 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 98f5aa1d4..22573b1a2 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -318,8 +318,6 @@ void Compositor::processWaylandEvents() void Compositor::destroySurface(Surface *surface) { - surface->removeFromOutput(); - waylandCompositor()->surfaceAboutToBeDestroyed(surface->waylandSurface()); m_destroyed_surfaces << surface->waylandSurface(); @@ -335,6 +333,12 @@ void Compositor::resetInputDevice(Surface *surface) } } +void Compositor::unregisterSurface(QWaylandSurface *surface) +{ + if (!m_all_surfaces.removeOne(surface)) + qWarning("%s Unexpected state. Cant find registered surface\n", Q_FUNC_INFO); +} + void Compositor::cleanupGraphicsResources() { qDeleteAll(m_destroyed_surfaces); @@ -345,7 +349,9 @@ void Compositor::compositor_create_surface(Resource *resource, uint32_t id) { QWaylandClient *client = QWaylandClient::fromWlClient(resource->client()); QWaylandSurface *surface = m_qt_compositor->createSurface(client, id, resource->version()); - primaryOutput()->addSurface(surface); + m_all_surfaces.append(surface); + if (primaryOutput()) + surface->setPrimaryOutput(primaryOutput()); emit m_qt_compositor->surfaceCreated(surface); } -- cgit v1.2.3 From fcd376a4ffb4a2efc8352ce1777e9f869e4e5206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Thu, 30 Jul 2015 12:06:24 +0200 Subject: Introducing QWaylandOutputSpace Its purpose is to make it possible to have multiscreen environments, and also multiple multioutput environments It is also an abstraction to make it clear that outputs are arranged in a 2d space Change-Id: I418509996a03b2ca1a12aec9c9e25e143a15a10f --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 59 +++++++++++------------- 1 file changed, 27 insertions(+), 32 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 22573b1a2..e58c6e999 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -178,6 +178,7 @@ Compositor::Compositor(QWaylandCompositor *qt_compositor) , m_retainSelection(false) , m_initialized(false) { + m_outputSpaces.append(new QWaylandOutputSpace(qt_compositor)); m_timer.start(); compositor = this; @@ -237,7 +238,7 @@ Compositor::~Compositor() qWarning("QWaylandCompositor::cleanupGraphicsResources() must be called manually"); qDeleteAll(m_clients); - qDeleteAll(m_outputs); + qDeleteAll(m_outputSpaces); delete m_surfaceExtension; delete m_subSurfaceExtension; @@ -256,56 +257,50 @@ uint Compositor::currentTimeMsecs() const return m_timer.elapsed(); } -QList Compositor::outputs() const -{ - return m_outputs; -} - QWaylandOutput *Compositor::output(QWindow *window) const { - Q_FOREACH (QWaylandOutput *output, m_outputs) { - if (output->window() == window) + foreach (QWaylandOutputSpace *outputSpace, m_outputSpaces) { + QWaylandOutput *output = outputSpace->output(window); + if (output) return output; } return Q_NULLPTR; } -void Compositor::addOutput(QWaylandOutput *output) +QWaylandOutput *Compositor::primaryOutput() const { - Q_ASSERT(output->handle()); - - if (m_outputs.contains(output)) - return; - - m_outputs.append(output); + return primaryOutputSpace()->primaryOutput(); } -void Compositor::removeOutput(QWaylandOutput *output) +QWaylandOutputSpace *Compositor::primaryOutputSpace() const { - Q_ASSERT(output->handle()); - - m_outputs.removeOne(output); + Q_ASSERT(!m_outputSpaces.isEmpty()); + return m_outputSpaces.first(); } -QWaylandOutput *Compositor::primaryOutput() const +void Compositor::setPrimaryOutputSpace(QWaylandOutputSpace *outputSpace) { - if (m_outputs.size() == 0) - return Q_NULLPTR; - return m_outputs.at(0); + Q_ASSERT(!m_outputSpaces.isEmpty()); + if (m_outputSpaces.first() == outputSpace) + return; + if (m_outputSpaces.removeOne(outputSpace)) { + m_outputSpaces.prepend(outputSpace); + waylandCompositor()->primaryOutputSpaceChanged(); + } } -void Compositor::setPrimaryOutput(QWaylandOutput *output) +void Compositor::addOutputSpace(QWaylandOutputSpace *outputSpace) { - Q_ASSERT(output->handle()); - - int i = m_outputs.indexOf(output); - if (i <= 0) - return; + Q_ASSERT(!m_outputSpaces.contains(outputSpace)); + m_outputSpaces.append(outputSpace); + waylandCompositor()->outputSpacesChanged(); +} - m_outputs.removeAt(i); - m_outputs.prepend(output); - emit m_qt_compositor->primaryOutputChanged(); +void Compositor::removeOutputSpace(QWaylandOutputSpace *outputSpace) +{ + if (m_outputSpaces.removeOne(outputSpace)) + waylandCompositor()->outputSpacesChanged(); } void Compositor::processWaylandEvents() -- cgit v1.2.3 From ce58545b220a49354533a27ef79cdbc8d50186cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Thu, 30 Jul 2015 14:53:35 +0200 Subject: Rework how we manage extensions Change-Id: If2cbf096e7419bc1bda007d5167ce39d1a5d50ae --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 63 +++++++----------------- 1 file changed, 19 insertions(+), 44 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index e58c6e999..2de42fc2d 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -51,11 +51,10 @@ #include "qwlqttouch_p.h" #include "qwlqtkey_p.h" #include "qwlinputdevice_p.h" -#include "qwlinputpanel_p.h" #include "qwlregion_p.h" #include "qwlpointer_p.h" #include "qwltextinputmanager_p.h" -#include "qwaylandglobalinterface.h" +#include #include "qwaylandsurfaceview.h" #include "qwaylandshmformathelper.h" #include "qwaylandoutput.h" @@ -90,7 +89,7 @@ #include "hardware_integration/qwlclientbufferintegration_p.h" #include "hardware_integration/qwlserverbufferintegration_p.h" #endif -#include "windowmanagerprotocol/waylandwindowmanagerintegration_p.h" +#include "extensions/qwaylandwindowmanagerextension.h" #include "hardware_integration/qwlclientbufferintegrationfactory_p.h" #include "hardware_integration/qwlserverbufferintegrationfactory_p.h" @@ -167,13 +166,6 @@ Compositor::Compositor(QWaylandCompositor *qt_compositor) , m_client_buffer_integration(0) , m_server_buffer_integration(0) #endif - , m_windowManagerIntegration(0) - , m_surfaceExtension(0) - , m_subSurfaceExtension(0) - , m_touchExtension(0) - , m_qtkeyExtension(0) - , m_textInputManager() - , m_inputPanel() , m_eventHandler(new WindowSystemEventHandler(this)) , m_retainSelection(false) , m_initialized(false) @@ -240,11 +232,6 @@ Compositor::~Compositor() qDeleteAll(m_outputSpaces); - delete m_surfaceExtension; - delete m_subSurfaceExtension; - delete m_touchExtension; - delete m_qtkeyExtension; - removeInputDevice(m_default_wayland_input_device); delete m_default_wayland_input_device; delete m_data_device_manager; @@ -361,8 +348,9 @@ void Compositor::destroyClient(QWaylandClient *client) if (!client) return; - if (m_windowManagerIntegration) - m_windowManagerIntegration->sendQuitMessage(client->client()); + WindowManagerServerIntegration *wmExtension = static_cast(waylandCompositor()->extension(QtWaylandServer::qt_windowmanager::name())); + if (wmExtension) + wmExtension->sendQuitMessage(client->client()); wl_client_destroy(client->client()); } @@ -404,20 +392,23 @@ void Compositor::initializeHardwareIntegration() void Compositor::initializeExtensions() { if (m_extensions & QWaylandCompositor::SurfaceExtension) - m_surfaceExtension = new SurfaceExtensionGlobal(this); + new SurfaceExtensionGlobal(this); if (m_extensions & QWaylandCompositor::SubSurfaceExtension) - m_subSurfaceExtension = new SubSurfaceExtensionGlobal(this); + new SubSurfaceExtensionGlobal(waylandCompositor()); if (m_extensions & QWaylandCompositor::TouchExtension) - m_touchExtension = new TouchExtensionGlobal(this); + new TouchExtensionGlobal(this); if (m_extensions & QWaylandCompositor::QtKeyExtension) - m_qtkeyExtension = new QtKeyExtensionGlobal(this); + new QtKeyExtensionGlobal(this); if (m_extensions & QWaylandCompositor::TextInputExtension) { - m_textInputManager.reset(new TextInputManager(this)); - m_inputPanel.reset(new InputPanel(this)); + new TextInputManager(this); + new QWaylandInputPanel(waylandCompositor()); } if (m_extensions & QWaylandCompositor::WindowManagerExtension) { - m_windowManagerIntegration = new WindowManagerServerIntegration(m_qt_compositor, this); - m_windowManagerIntegration->initialize(m_display); + WindowManagerServerIntegration *wmint = new WindowManagerServerIntegration(m_qt_compositor, this); + wmint->initialize(m_display); + } + if (m_extensions & QWaylandCompositor::DefaultShellExtension) { + new Shell(waylandCompositor()); } } @@ -434,8 +425,9 @@ QList Compositor::clients() const void Compositor::setClientFullScreenHint(bool value) { - if (m_windowManagerIntegration) - m_windowManagerIntegration->setShowIsFullScreen(value); + WindowManagerServerIntegration *wmExtension = static_cast(waylandCompositor()->extension(QtWaylandServer::qt_windowmanager::name())); + if (wmExtension) + wmExtension->setShowIsFullScreen(value); } QWaylandCompositor::ExtensionFlags Compositor::extensions() const @@ -449,17 +441,6 @@ InputDevice* Compositor::defaultInputDevice() return m_inputDevices.last()->handle(); } -void Compositor::configureTouchExtension(int flags) -{ - if (m_touchExtension) - m_touchExtension->setFlags(flags); -} - -InputPanel *Compositor::inputPanel() const -{ - return m_inputPanel.data(); -} - DataDeviceManager *Compositor::dataDeviceManager() const { return m_data_device_manager; @@ -505,12 +486,6 @@ void Compositor::sendDragEndEvent() // Drag::instance()->dragEnd(); } -void Compositor::bindGlobal(wl_client *client, void *data, uint32_t version, uint32_t id) -{ - QWaylandGlobalInterface *iface = static_cast(data); - iface->bind(client, qMin(iface->version(), version), id); -}; - void Compositor::loadClientBufferIntegration() { #ifdef QT_COMPOSITOR_WAYLAND_GL -- cgit v1.2.3 From 8ea41bfe32de3b4dd4c15ec91c8925b1c6508c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Thu, 30 Jul 2015 15:16:48 +0200 Subject: Public input apis Change-Id: I60ec2fd9f4afe54198d9c476b28f9f15a661e9ca --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 32 +++++------------------- 1 file changed, 6 insertions(+), 26 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 2de42fc2d..0aef63671 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -305,16 +305,6 @@ void Compositor::destroySurface(Surface *surface) m_destroyed_surfaces << surface->waylandSurface(); } -void Compositor::resetInputDevice(Surface *surface) -{ - foreach (QWaylandInputDevice *dev, m_inputDevices) { - if (dev->keyboardFocus() == surface->waylandSurface()) - dev->setKeyboardFocus(0); - if (dev->mouseFocus() && dev->mouseFocus()->surface() == surface->waylandSurface()) - dev->setMouseFocus(0, QPointF(), QPointF()); - } -} - void Compositor::unregisterSurface(QWaylandSurface *surface) { if (!m_all_surfaces.removeOne(surface)) @@ -403,18 +393,15 @@ void Compositor::initializeExtensions() new TextInputManager(this); new QWaylandInputPanel(waylandCompositor()); } - if (m_extensions & QWaylandCompositor::WindowManagerExtension) { - WindowManagerServerIntegration *wmint = new WindowManagerServerIntegration(m_qt_compositor, this); - wmint->initialize(m_display); - } - if (m_extensions & QWaylandCompositor::DefaultShellExtension) { + if (m_extensions & QWaylandCompositor::WindowManagerExtension) + new QWaylandWindowManagerExtension(waylandCompositor()); + if (m_extensions & QWaylandCompositor::DefaultShellExtension) new Shell(waylandCompositor()); - } } void Compositor::initializeDefaultInputDevice() { - m_default_wayland_input_device = new QWaylandInputDevice(m_qt_compositor); + m_default_wayland_input_device = m_qt_compositor->createInputDevice(); registerInputDevice(m_default_wayland_input_device); } @@ -423,22 +410,15 @@ QList Compositor::clients() const return m_clients; } -void Compositor::setClientFullScreenHint(bool value) -{ - WindowManagerServerIntegration *wmExtension = static_cast(waylandCompositor()->extension(QtWaylandServer::qt_windowmanager::name())); - if (wmExtension) - wmExtension->setShowIsFullScreen(value); -} - QWaylandCompositor::ExtensionFlags Compositor::extensions() const { return m_extensions; } -InputDevice* Compositor::defaultInputDevice() +QWaylandInputDevice *Compositor::defaultInputDevice() { // The list gets prepended so that default is the last element - return m_inputDevices.last()->handle(); + return m_inputDevices.last(); } DataDeviceManager *Compositor::dataDeviceManager() const -- cgit v1.2.3 From fb84a2bfd5ac4d4574df63d0f29d7904e043f123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Thu, 30 Jul 2015 15:19:42 +0200 Subject: Remove the static instance of a compositor. All classes that needs to access the compositor instance needs to keep a reference to it Change-Id: Ia0d4b04b460200ad3c7907b94c032afe90c18771 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 0aef63671..7951ee065 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -149,11 +149,6 @@ public: Compositor *compositor; }; -Compositor *Compositor::instance() -{ - return compositor; -} - Compositor::Compositor(QWaylandCompositor *qt_compositor) : m_extensions(QWaylandCompositor::DefaultExtensions) , m_display(new Display) @@ -172,7 +167,6 @@ Compositor::Compositor(QWaylandCompositor *qt_compositor) { m_outputSpaces.append(new QWaylandOutputSpace(qt_compositor)); m_timer.start(); - compositor = this; QWindowSystemInterfacePrivate::installWindowSystemEventHandler(m_eventHandler.data()); } @@ -319,7 +313,7 @@ void Compositor::cleanupGraphicsResources() void Compositor::compositor_create_surface(Resource *resource, uint32_t id) { - QWaylandClient *client = QWaylandClient::fromWlClient(resource->client()); + QWaylandClient *client = QWaylandClient::fromWlClient(m_qt_compositor, resource->client()); QWaylandSurface *surface = m_qt_compositor->createSurface(client, id, resource->version()); m_all_surfaces.append(surface); if (primaryOutput()) @@ -329,7 +323,6 @@ void Compositor::compositor_create_surface(Resource *resource, uint32_t id) void Compositor::compositor_create_region(Resource *resource, uint32_t id) { - Q_UNUSED(compositor); new Region(resource->client(), id); } -- cgit v1.2.3 From 0f3c1a1669aa133efd8701f25b8b8093517b81a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Thu, 30 Jul 2015 15:21:17 +0200 Subject: Rename QWaylandSurfaceView to QWaylandView and rename QWaylandSurfaceItem to QWaylandQuickView Change-Id: I989b482eb79df06e9f265bc2b0ef6b3dce7509d6 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 7951ee065..d9b0e1207 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -55,7 +55,7 @@ #include "qwlpointer_p.h" #include "qwltextinputmanager_p.h" #include -#include "qwaylandsurfaceview.h" +#include "qwaylandview.h" #include "qwaylandshmformathelper.h" #include "qwaylandoutput.h" #include "qwlkeyboard_p.h" @@ -208,7 +208,7 @@ void Compositor::init() qRegisterMetaType("SurfaceBuffer*"); qRegisterMetaType("WaylandClient*"); qRegisterMetaType("WaylandSurface*"); - qRegisterMetaType("WaylandSurfaceView*"); + qRegisterMetaType("WaylandSurfaceView*"); //initialize distancefieldglyphcache here initializeHardwareIntegration(); -- cgit v1.2.3 From 2d9b934ba756b46fcdac5a0d8bed240c9d294fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Mon, 11 May 2015 10:57:12 +0200 Subject: rename QWaylandExtensionTemplate::get to findIn Change-Id: I7fcfd2e4974cf1b5b32592a6d5c03ed335a9f446 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index d9b0e1207..5ae77d882 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -331,7 +331,7 @@ void Compositor::destroyClient(QWaylandClient *client) if (!client) return; - WindowManagerServerIntegration *wmExtension = static_cast(waylandCompositor()->extension(QtWaylandServer::qt_windowmanager::name())); + QWaylandWindowManagerExtension *wmExtension = QWaylandWindowManagerExtension::findIn(waylandCompositor()); if (wmExtension) wmExtension->sendQuitMessage(client->client()); -- cgit v1.2.3 From 666c3fcc69b9b25caa9b68b988e0004489653171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Wed, 13 May 2015 14:44:05 +0200 Subject: Remove the default shell functionality This will be readded in a different way. Also, remove the WaylandSurfaceChrome since it is no longer needed, and just use WaylandView directly Change-Id: I8d4a7b2135d9fdaea7dd3fcd729e55cceebf48fb --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 5ae77d882..aea4154e0 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -388,8 +388,6 @@ void Compositor::initializeExtensions() } if (m_extensions & QWaylandCompositor::WindowManagerExtension) new QWaylandWindowManagerExtension(waylandCompositor()); - if (m_extensions & QWaylandCompositor::DefaultShellExtension) - new Shell(waylandCompositor()); } void Compositor::initializeDefaultInputDevice() -- cgit v1.2.3 From b4f037cff4fc8ece612d8dca034ba784d86b816f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Fri, 31 Jul 2015 10:25:12 +0200 Subject: Remove excess definition of QWaylandKeymap Also remove QWaylandUnmapLock Change-Id: I0b481224fd03032603084142f36be279351f6611 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index aea4154e0..722893bbf 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -110,7 +110,7 @@ public: { if (e->type == QWindowSystemInterfacePrivate::Key) { QWindowSystemInterfacePrivate::KeyEvent *ke = static_cast(e); - Keyboard *keyb = compositor->defaultInputDevice()->keyboardDevice(); + QWaylandKeyboardPrivate *keyb = QWaylandKeyboardPrivate::get(compositor->defaultInputDevice()->keyboard()); uint32_t code = ke->nativeScanCode; bool isDown = ke->keyType == QEvent::KeyPress; -- cgit v1.2.3 From fd9a8983832bbeb240097327ff9f8565f7356b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Thu, 6 Aug 2015 13:41:27 +0200 Subject: Fixups after rebasing Change-Id: Ie5d8899157d77f83f2cf65f236d534b972aa4770 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 722893bbf..3fef11521 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -100,8 +100,6 @@ QT_BEGIN_NAMESPACE namespace QtWayland { -static Compositor *compositor; - class WindowSystemEventHandler : public QWindowSystemEventHandler { public: -- cgit v1.2.3 From dfec7314fd3758375e96d4641d2d6b5bec595320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Fri, 7 Aug 2015 12:35:44 +0200 Subject: Remove output from QWaylandSurface It is the views that belong to outputs. This leads to a couple of interesting cases with enter and leave events, but the implementation says you will get enter events for the first view of a surface entering an output, and for the last view being removed from an output. Also to throttle a surface, there has to be 1 surface which takes care of this. This is because if multiple views throttle, then the client might render to quick. Change-Id: If4bba380fd4d7f506fd769606cbdea4ce58b908d --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 3fef11521..fee40c7ef 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -314,8 +314,6 @@ void Compositor::compositor_create_surface(Resource *resource, uint32_t id) QWaylandClient *client = QWaylandClient::fromWlClient(m_qt_compositor, resource->client()); QWaylandSurface *surface = m_qt_compositor->createSurface(client, id, resource->version()); m_all_surfaces.append(surface); - if (primaryOutput()) - surface->setPrimaryOutput(primaryOutput()); emit m_qt_compositor->surfaceCreated(surface); } -- cgit v1.2.3 From e01b81339a37830c48f2cec0583e5d0aba592601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Tue, 11 Aug 2015 16:07:23 +0200 Subject: Remove QtWayland::Surface Its enough to have QWaylandSurface and QWaylandSurfacePrivate. Also don't pass QWaylandSurfacePrivate around, but pass QWaylandSurface and then use the QWaylandSurfacePrivate::get function. Change-Id: I915cc9d7b4497ad1c6f1f2dee61d9d0db069ba6b --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index fee40c7ef..65b669a02 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -40,7 +40,7 @@ #include "qwaylandinput.h" #include "qwldisplay_p.h" #include "qwloutput_p.h" -#include "qwlsurface_p.h" +#include "qwaylandsurface_p.h" #include "qwaylandclient.h" #include "qwaylandcompositor.h" #include "qwldatadevicemanager_p.h" @@ -290,11 +290,11 @@ void Compositor::processWaylandEvents() wl_display_flush_clients(m_display->handle()); } -void Compositor::destroySurface(Surface *surface) +void Compositor::destroySurface(QWaylandSurface *surface) { - waylandCompositor()->surfaceAboutToBeDestroyed(surface->waylandSurface()); + waylandCompositor()->surfaceAboutToBeDestroyed(surface); - m_destroyed_surfaces << surface->waylandSurface(); + m_destroyed_surfaces << surface; } void Compositor::unregisterSurface(QWaylandSurface *surface) @@ -440,7 +440,7 @@ bool Compositor::isDragging() const } void Compositor::sendDragMoveEvent(const QPoint &global, const QPoint &local, - Surface *surface) + QWaylandSurface *surface) { Q_UNUSED(global); Q_UNUSED(local); -- cgit v1.2.3 From 674c6eef06ae23abadab7969125834617a7be562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Wed, 12 Aug 2015 15:39:39 +0200 Subject: Remove QtWayland::Compositor and add QWaylandCompositorPrivate Embrace PIMPL Change-Id: I8c8b5971e15c208317ff33231bda1513e7b8d489 --- src/compositor/wayland_wrapper/qwlcompositor.cpp | 529 ----------------------- 1 file changed, 529 deletions(-) delete mode 100644 src/compositor/wayland_wrapper/qwlcompositor.cpp (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp') diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp deleted file mode 100644 index 65b669a02..000000000 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ /dev/null @@ -1,529 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Pier Luigi Fiorini -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtWaylandCompositor module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwlcompositor_p.h" - -#include "qwaylandinput.h" -#include "qwldisplay_p.h" -#include "qwloutput_p.h" -#include "qwaylandsurface_p.h" -#include "qwaylandclient.h" -#include "qwaylandcompositor.h" -#include "qwldatadevicemanager_p.h" -#include "qwldatadevice_p.h" -#include "qwlextendedsurface_p.h" -#include "qwlsubsurface_p.h" -#include "qwlshellsurface_p.h" -#include "qwlqttouch_p.h" -#include "qwlqtkey_p.h" -#include "qwlinputdevice_p.h" -#include "qwlregion_p.h" -#include "qwlpointer_p.h" -#include "qwltextinputmanager_p.h" -#include -#include "qwaylandview.h" -#include "qwaylandshmformathelper.h" -#include "qwaylandoutput.h" -#include "qwlkeyboard_p.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#if defined (QT_COMPOSITOR_WAYLAND_GL) -#include "hardware_integration/qwlhwintegration_p.h" -#include "hardware_integration/qwlclientbufferintegration_p.h" -#include "hardware_integration/qwlserverbufferintegration_p.h" -#endif -#include "extensions/qwaylandwindowmanagerextension.h" - -#include "hardware_integration/qwlclientbufferintegrationfactory_p.h" -#include "hardware_integration/qwlserverbufferintegrationfactory_p.h" - -#include "../shared/qwaylandxkb.h" - -QT_BEGIN_NAMESPACE - -namespace QtWayland { - -class WindowSystemEventHandler : public QWindowSystemEventHandler -{ -public: - WindowSystemEventHandler(Compositor *c) : compositor(c) {} - bool sendEvent(QWindowSystemInterfacePrivate::WindowSystemEvent *e) Q_DECL_OVERRIDE - { - if (e->type == QWindowSystemInterfacePrivate::Key) { - QWindowSystemInterfacePrivate::KeyEvent *ke = static_cast(e); - QWaylandKeyboardPrivate *keyb = QWaylandKeyboardPrivate::get(compositor->defaultInputDevice()->keyboard()); - - uint32_t code = ke->nativeScanCode; - bool isDown = ke->keyType == QEvent::KeyPress; - -#ifndef QT_NO_WAYLAND_XKB - QString text; - Qt::KeyboardModifiers modifiers = QWaylandXkb::modifiers(keyb->xkbState()); - - const xkb_keysym_t sym = xkb_state_key_get_one_sym(keyb->xkbState(), code); - uint utf32 = xkb_keysym_to_utf32(sym); - if (utf32) - text = QString::fromUcs4(&utf32, 1); - int qtkey = QWaylandXkb::keysymToQtKey(sym, modifiers, text); - - ke->key = qtkey; - ke->modifiers = modifiers; - ke->nativeVirtualKey = sym; - ke->nativeModifiers = keyb->xkbModsMask(); - ke->unicode = text; -#endif - if (!ke->repeat) - keyb->keyEvent(code, isDown ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED); - - QWindowSystemEventHandler::sendEvent(e); - - if (!ke->repeat) { - keyb->updateKeymap(); - keyb->updateModifierState(code, isDown ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED); - } - } else { - QWindowSystemEventHandler::sendEvent(e); - } - return true; - } - - Compositor *compositor; -}; - -Compositor::Compositor(QWaylandCompositor *qt_compositor) - : m_extensions(QWaylandCompositor::DefaultExtensions) - , m_display(new Display) - , m_current_frame(0) - , m_last_queued_buf(-1) - , m_qt_compositor(qt_compositor) - , m_orientation(Qt::PrimaryOrientation) -#if defined (QT_COMPOSITOR_WAYLAND_GL) - , m_hw_integration(0) - , m_client_buffer_integration(0) - , m_server_buffer_integration(0) -#endif - , m_eventHandler(new WindowSystemEventHandler(this)) - , m_retainSelection(false) - , m_initialized(false) -{ - m_outputSpaces.append(new QWaylandOutputSpace(qt_compositor)); - m_timer.start(); - - QWindowSystemInterfacePrivate::installWindowSystemEventHandler(m_eventHandler.data()); -} - -void Compositor::init() -{ - QStringList arguments = QCoreApplication::instance()->arguments(); - - int socketArg = arguments.indexOf(QLatin1String("--wayland-socket-name")); - if (socketArg != -1 && socketArg + 1 < arguments.size()) - m_socket_name = arguments.at(socketArg + 1).toLocal8Bit(); - - wl_compositor::init(m_display->handle(), 3); - - m_data_device_manager = new DataDeviceManager(this); - - wl_display_init_shm(m_display->handle()); - QVector formats = QWaylandShmFormatHelper::supportedWaylandFormats(); - foreach (wl_shm_format format, formats) - wl_display_add_shm_format(m_display->handle(), format); - - const char *socketName = 0; - if (m_socket_name.size()) - socketName = m_socket_name.constData(); - if (wl_display_add_socket(m_display->handle(), socketName)) { - qFatal("Fatal: Failed to open server socket\n"); - } - - m_loop = wl_display_get_event_loop(m_display->handle()); - - int fd = wl_event_loop_get_fd(m_loop); - - QSocketNotifier *sockNot = new QSocketNotifier(fd, QSocketNotifier::Read, this); - connect(sockNot, SIGNAL(activated(int)), this, SLOT(processWaylandEvents())); - - QAbstractEventDispatcher *dispatcher = QGuiApplicationPrivate::eventDispatcher; - connect(dispatcher, SIGNAL(aboutToBlock()), this, SLOT(processWaylandEvents())); - - qRegisterMetaType("SurfaceBuffer*"); - qRegisterMetaType("WaylandClient*"); - qRegisterMetaType("WaylandSurface*"); - qRegisterMetaType("WaylandSurfaceView*"); - //initialize distancefieldglyphcache here - - initializeHardwareIntegration(); - initializeExtensions(); - initializeDefaultInputDevice(); - - m_initialized = true; -} - -Compositor::~Compositor() -{ - if (!m_destroyed_surfaces.isEmpty()) - qWarning("QWaylandCompositor::cleanupGraphicsResources() must be called manually"); - qDeleteAll(m_clients); - - qDeleteAll(m_outputSpaces); - - removeInputDevice(m_default_wayland_input_device); - delete m_default_wayland_input_device; - delete m_data_device_manager; - - delete m_display; -} - -uint Compositor::currentTimeMsecs() const -{ - return m_timer.elapsed(); -} - -QWaylandOutput *Compositor::output(QWindow *window) const -{ - foreach (QWaylandOutputSpace *outputSpace, m_outputSpaces) { - QWaylandOutput *output = outputSpace->output(window); - if (output) - return output; - } - - return Q_NULLPTR; -} - -QWaylandOutput *Compositor::primaryOutput() const -{ - return primaryOutputSpace()->primaryOutput(); -} - -QWaylandOutputSpace *Compositor::primaryOutputSpace() const -{ - Q_ASSERT(!m_outputSpaces.isEmpty()); - return m_outputSpaces.first(); -} - -void Compositor::setPrimaryOutputSpace(QWaylandOutputSpace *outputSpace) -{ - Q_ASSERT(!m_outputSpaces.isEmpty()); - if (m_outputSpaces.first() == outputSpace) - return; - if (m_outputSpaces.removeOne(outputSpace)) { - m_outputSpaces.prepend(outputSpace); - waylandCompositor()->primaryOutputSpaceChanged(); - } -} - -void Compositor::addOutputSpace(QWaylandOutputSpace *outputSpace) -{ - Q_ASSERT(!m_outputSpaces.contains(outputSpace)); - m_outputSpaces.append(outputSpace); - waylandCompositor()->outputSpacesChanged(); -} - -void Compositor::removeOutputSpace(QWaylandOutputSpace *outputSpace) -{ - if (m_outputSpaces.removeOne(outputSpace)) - waylandCompositor()->outputSpacesChanged(); -} - -void Compositor::processWaylandEvents() -{ - int ret = wl_event_loop_dispatch(m_loop, 0); - if (ret) - fprintf(stderr, "wl_event_loop_dispatch error: %d\n", ret); - wl_display_flush_clients(m_display->handle()); -} - -void Compositor::destroySurface(QWaylandSurface *surface) -{ - waylandCompositor()->surfaceAboutToBeDestroyed(surface); - - m_destroyed_surfaces << surface; -} - -void Compositor::unregisterSurface(QWaylandSurface *surface) -{ - if (!m_all_surfaces.removeOne(surface)) - qWarning("%s Unexpected state. Cant find registered surface\n", Q_FUNC_INFO); -} - -void Compositor::cleanupGraphicsResources() -{ - qDeleteAll(m_destroyed_surfaces); - m_destroyed_surfaces.clear(); -} - -void Compositor::compositor_create_surface(Resource *resource, uint32_t id) -{ - QWaylandClient *client = QWaylandClient::fromWlClient(m_qt_compositor, resource->client()); - QWaylandSurface *surface = m_qt_compositor->createSurface(client, id, resource->version()); - m_all_surfaces.append(surface); - emit m_qt_compositor->surfaceCreated(surface); -} - -void Compositor::compositor_create_region(Resource *resource, uint32_t id) -{ - new Region(resource->client(), id); -} - -void Compositor::destroyClient(QWaylandClient *client) -{ - if (!client) - return; - - QWaylandWindowManagerExtension *wmExtension = QWaylandWindowManagerExtension::findIn(waylandCompositor()); - if (wmExtension) - wmExtension->sendQuitMessage(client->client()); - - wl_client_destroy(client->client()); -} - -ClientBufferIntegration * Compositor::clientBufferIntegration() const -{ -#ifdef QT_COMPOSITOR_WAYLAND_GL - return m_client_buffer_integration.data(); -#else - return 0; -#endif -} - -ServerBufferIntegration * Compositor::serverBufferIntegration() const -{ -#ifdef QT_COMPOSITOR_WAYLAND_GL - return m_server_buffer_integration.data(); -#else - return 0; -#endif -} - -void Compositor::initializeHardwareIntegration() -{ -#ifdef QT_COMPOSITOR_WAYLAND_GL - if (m_extensions & QWaylandCompositor::HardwareIntegrationExtension) - m_hw_integration.reset(new HardwareIntegration(this)); - - loadClientBufferIntegration(); - loadServerBufferIntegration(); - - if (m_client_buffer_integration) - m_client_buffer_integration->initializeHardware(m_display); - if (m_server_buffer_integration) - m_server_buffer_integration->initializeHardware(m_qt_compositor); -#endif -} - -void Compositor::initializeExtensions() -{ - if (m_extensions & QWaylandCompositor::SurfaceExtension) - new SurfaceExtensionGlobal(this); - if (m_extensions & QWaylandCompositor::SubSurfaceExtension) - new SubSurfaceExtensionGlobal(waylandCompositor()); - if (m_extensions & QWaylandCompositor::TouchExtension) - new TouchExtensionGlobal(this); - if (m_extensions & QWaylandCompositor::QtKeyExtension) - new QtKeyExtensionGlobal(this); - if (m_extensions & QWaylandCompositor::TextInputExtension) { - new TextInputManager(this); - new QWaylandInputPanel(waylandCompositor()); - } - if (m_extensions & QWaylandCompositor::WindowManagerExtension) - new QWaylandWindowManagerExtension(waylandCompositor()); -} - -void Compositor::initializeDefaultInputDevice() -{ - m_default_wayland_input_device = m_qt_compositor->createInputDevice(); - registerInputDevice(m_default_wayland_input_device); -} - -QList Compositor::clients() const -{ - return m_clients; -} - -QWaylandCompositor::ExtensionFlags Compositor::extensions() const -{ - return m_extensions; -} - -QWaylandInputDevice *Compositor::defaultInputDevice() -{ - // The list gets prepended so that default is the last element - return m_inputDevices.last(); -} - -DataDeviceManager *Compositor::dataDeviceManager() const -{ - return m_data_device_manager; -} - -void Compositor::setRetainedSelectionEnabled(bool enabled) -{ - m_retainSelection = enabled; -} - -bool Compositor::retainedSelectionEnabled() const -{ - return m_retainSelection; -} - -void Compositor::feedRetainedSelectionData(QMimeData *data) -{ - if (m_retainSelection) - m_qt_compositor->retainedSelectionReceived(data); -} - -void Compositor::overrideSelection(const QMimeData *data) -{ - m_data_device_manager->overrideSelection(*data); -} - -bool Compositor::isDragging() const -{ - return false; -} - -void Compositor::sendDragMoveEvent(const QPoint &global, const QPoint &local, - QWaylandSurface *surface) -{ - Q_UNUSED(global); - Q_UNUSED(local); - Q_UNUSED(surface); -// Drag::instance()->dragMove(global, local, surface); -} - -void Compositor::sendDragEndEvent() -{ -// Drag::instance()->dragEnd(); -} - -void Compositor::loadClientBufferIntegration() -{ -#ifdef QT_COMPOSITOR_WAYLAND_GL - QStringList keys = ClientBufferIntegrationFactory::keys(); - QString targetKey; - QByteArray clientBufferIntegration = qgetenv("QT_WAYLAND_HARDWARE_INTEGRATION"); - if (clientBufferIntegration.isEmpty()) - clientBufferIntegration = qgetenv("QT_WAYLAND_CLIENT_BUFFER_INTEGRATION"); - if (keys.contains(QString::fromLocal8Bit(clientBufferIntegration.constData()))) { - targetKey = QString::fromLocal8Bit(clientBufferIntegration.constData()); - } else if (keys.contains(QString::fromLatin1("wayland-egl"))) { - targetKey = QString::fromLatin1("wayland-egl"); - } else if (!keys.isEmpty()) { - targetKey = keys.first(); - } - - if (!targetKey.isEmpty()) { - m_client_buffer_integration.reset(ClientBufferIntegrationFactory::create(targetKey, QStringList())); - if (m_client_buffer_integration) { - m_client_buffer_integration->setCompositor(m_qt_compositor); - if (m_hw_integration) - m_hw_integration->setClientBufferIntegration(targetKey); - } - } - //BUG: if there is no client buffer integration, bad things will happen when opengl is used -#endif -} - -void Compositor::loadServerBufferIntegration() -{ -#ifdef QT_COMPOSITOR_WAYLAND_GL - QStringList keys = ServerBufferIntegrationFactory::keys(); - QString targetKey; - QByteArray serverBufferIntegration = qgetenv("QT_WAYLAND_SERVER_BUFFER_INTEGRATION"); - if (keys.contains(QString::fromLocal8Bit(serverBufferIntegration.constData()))) { - targetKey = QString::fromLocal8Bit(serverBufferIntegration.constData()); - } - if (!targetKey.isEmpty()) { - m_server_buffer_integration.reset(ServerBufferIntegrationFactory::create(targetKey, QStringList())); - if (m_hw_integration) - m_hw_integration->setServerBufferIntegration(targetKey); - } -#endif -} - -void Compositor::registerInputDevice(QWaylandInputDevice *device) -{ - // The devices get prepended as the first input device that gets added - // is assumed to be the default and it will claim to accept all the input - // events if asked - m_inputDevices.prepend(device); -} - -void Compositor::removeInputDevice(QWaylandInputDevice *device) -{ - m_inputDevices.removeOne(device); -} - -QWaylandInputDevice *Compositor::inputDeviceFor(QInputEvent *inputEvent) -{ - QWaylandInputDevice *dev = NULL; - for (int i = 0; i < m_inputDevices.size(); i++) { - QWaylandInputDevice *candidate = m_inputDevices.at(i); - if (candidate->isOwner(inputEvent)) { - dev = candidate; - break; - } - } - return dev; -} - -} // namespace Wayland - -QT_END_NAMESPACE -- cgit v1.2.3