summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--README12
-rw-r--r--examples/wayland/custom-extension/client-common/client.json3
-rw-r--r--examples/wayland/custom-extension/client-common/client.pro19
-rw-r--r--examples/wayland/custom-extension/client-common/main.cpp81
-rw-r--r--examples/wayland/ivi-compositor/main.qml2
-rw-r--r--examples/wayland/minimal-qml/main.qml2
-rw-r--r--examples/wayland/multi-screen/qml/Screen.qml13
-rw-r--r--examples/wayland/multi-screen/qml/main.qml56
-rw-r--r--examples/wayland/spanning-screens/main.qml12
-rw-r--r--qtwayland.pro1
-rw-r--r--src/3rdparty/protocol/xdg-shell-unstable-v6.xml1041
-rw-r--r--src/client/client.pro37
-rw-r--r--src/client/configure.json4
-rw-r--r--src/client/qwaylandclipboard.cpp4
-rw-r--r--src/client/qwaylandclipboard_p.h5
-rw-r--r--src/client/qwaylandcursor.cpp25
-rw-r--r--src/client/qwaylanddatadevice.cpp10
-rw-r--r--src/client/qwaylanddatadevice_p.h16
-rw-r--r--src/client/qwaylanddatadevicemanager.cpp4
-rw-r--r--src/client/qwaylanddatadevicemanager_p.h6
-rw-r--r--src/client/qwaylanddataoffer.cpp4
-rw-r--r--src/client/qwaylanddataoffer_p.h6
-rw-r--r--src/client/qwaylanddatasource.cpp4
-rw-r--r--src/client/qwaylanddatasource_p.h6
-rw-r--r--src/client/qwaylanddisplay.cpp35
-rw-r--r--src/client/qwaylanddisplay_p.h10
-rw-r--r--src/client/qwaylandinputdevice.cpp8
-rw-r--r--src/client/qwaylandinputdevice_p.h4
-rw-r--r--src/client/qwaylandintegration.cpp49
-rw-r--r--src/client/qwaylandshellsurface_p.h1
-rw-r--r--src/client/qwaylandshmbackingstore_p.h2
-rw-r--r--src/client/qwaylandwindow.cpp31
-rw-r--r--src/client/qwaylandwindow_p.h1
-rw-r--r--src/client/qwaylandwlshellintegration.cpp7
-rw-r--r--src/client/qwaylandwlshellintegration_p.h4
-rw-r--r--src/client/qwaylandxdgshellintegration.cpp7
-rw-r--r--src/client/qwaylandxdgshellintegration_p.h4
-rw-r--r--src/client/qwaylandxdgshellv6.cpp247
-rw-r--r--src/client/qwaylandxdgshellv6_p.h145
-rw-r--r--src/client/qwaylandxdgshellv6integration.cpp78
-rw-r--r--src/client/qwaylandxdgshellv6integration_p.h75
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor.cpp8
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor_p.h6
-rw-r--r--src/compositor/compositor_api/qwaylanddrag.cpp6
-rw-r--r--src/compositor/compositor_api/qwaylanddrag.h2
-rw-r--r--src/compositor/compositor_api/qwaylandquickitem.cpp18
-rw-r--r--src/compositor/compositor_api/qwaylandquickitem.h2
-rw-r--r--src/compositor/compositor_api/qwaylandquickoutput.cpp16
-rw-r--r--src/compositor/compositor_api/qwaylandquickoutput.h5
-rw-r--r--src/compositor/compositor_api/qwaylandseat.cpp17
-rw-r--r--src/compositor/compositor_api/qwaylandseat.h4
-rw-r--r--src/compositor/compositor_api/qwaylandseat_p.h8
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.cpp9
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.h2
-rw-r--r--src/compositor/configure.json4
-rw-r--r--src/compositor/extensions/qwaylandivisurface.h2
-rw-r--r--src/compositor/extensions/qwaylandxdgshellv5.cpp6
-rw-r--r--src/compositor/wayland_wrapper/qwlclientbuffer_p.h2
-rw-r--r--src/compositor/wayland_wrapper/qwldatadevice.cpp33
-rw-r--r--src/compositor/wayland_wrapper/qwldatadevice_p.h14
-rw-r--r--src/compositor/wayland_wrapper/qwldatadevicemanager_p.h3
-rw-r--r--src/compositor/wayland_wrapper/qwldataoffer_p.h3
-rw-r--r--src/compositor/wayland_wrapper/qwldatasource_p.h3
-rw-r--r--src/compositor/wayland_wrapper/wayland_wrapper.pri24
-rw-r--r--src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.cpp2
-rw-r--r--src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.h2
-rw-r--r--src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.h2
-rw-r--r--src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp26
-rw-r--r--src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h2
-rw-r--r--src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h4
-rw-r--r--src/imports/compositor/qwaylandquickcompositorplugin.cpp4
-rw-r--r--src/imports/imports.pro2
-rw-r--r--src/plugins/decorations/bradient/main.cpp1
-rw-r--r--src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp2
-rw-r--r--src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h2
-rw-r--r--src/plugins/shellintegration/ivi-shell/qwaylandivisurface.cpp5
-rw-r--r--src/plugins/shellintegration/ivi-shell/qwaylandivisurface_p.h1
-rw-r--r--tests/auto/client/client/tst_client.cpp1
-rw-r--r--tests/auto/compositor/compositor/tst_compositor.cpp12
80 files changed, 2022 insertions, 326 deletions
diff --git a/.qmake.conf b/.qmake.conf
index fec66b73e..b1c22d3b7 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -1,3 +1,3 @@
load(qt_build_config)
-MODULE_VERSION = 5.8.1
+MODULE_VERSION = 5.9.0
diff --git a/README b/README
index d0c5e03cf..8215b30b9 100644
--- a/README
+++ b/README
@@ -67,12 +67,11 @@ Shell Integration:
Some platforms, especially non-desktop ones, use a custom Wayland shell
extension. These are tailored to the specific embedded form factor better than
the generic wl_shell or xdg_shell extensions that target desktop systems.
+Custom shell protocols are added through shell integration plugins.
-Instead of adding multiple protocol implementations into the QPA plugin,
-a plugin architecture is used for selecting the shell integration;
-when creating a shell surface, the protocol to use is taken from
-the QT_WAYLAND_SHELL_INTEGRATION environment variable. If one is not provided or
-not pointing to a valid plugin, wl_shell or xdg_shell will be used as fallbacks.
+Which shell integration to use is determined by the QT_WAYLAND_SHELL_INTEGRATION
+environment variable. If no shell is specified, the default is to first try
+xdg-shell-v6 and then wl-shell.
Example Usage:
@@ -84,6 +83,9 @@ with ivi-shell integration:
Available Shell Integrations:
* ivi-shell
+ * wl-shell
+ * xdg-shell-v5
+ * xdg-shell-v6
We hang out at #qt-labs and #qt-lighthouse on freenode if you have any questions
diff --git a/examples/wayland/custom-extension/client-common/client.json b/examples/wayland/custom-extension/client-common/client.json
deleted file mode 100644
index 7aab544e5..000000000
--- a/examples/wayland/custom-extension/client-common/client.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "custom-wayland" ]
-}
diff --git a/examples/wayland/custom-extension/client-common/client.pro b/examples/wayland/custom-extension/client-common/client.pro
deleted file mode 100644
index 95b99578a..000000000
--- a/examples/wayland/custom-extension/client-common/client.pro
+++ /dev/null
@@ -1,19 +0,0 @@
-CONFIG += wayland-scanner
-TARGET = custom-wayland
-
-QT += waylandclient-private
-
-WAYLANDCLIENTSOURCES += ../protocol/custom.xml
-
-OTHER_FILES += client.json
-
-SOURCES += main.cpp \
- customextension.cpp
-
-HEADERS += customextension.h
-
-PLUGIN_TYPE = platforms
-load(qt_plugin)
-
-# Installation into a "proper" Qt location is most unexpected for from an example.
-CONFIG += install_ok
diff --git a/examples/wayland/custom-extension/client-common/main.cpp b/examples/wayland/custom-extension/client-common/main.cpp
deleted file mode 100644
index ad7c027ff..000000000
--- a/examples/wayland/custom-extension/client-common/main.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Wayland module
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "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.
-**
-**
-** 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qpa/qplatformintegrationplugin.h>
-#include <QtWaylandClient/private/qwaylandintegration_p.h>
-#include "customextension.h"
-
-#include <QGuiApplication>
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-
-static CustomExtension * extension_global;
-
-class CustomIntegrationPlugin : public QPlatformIntegrationPlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "client.json")
-public:
- QPlatformIntegration *create(const QString&, const QStringList&) override;
-};
-
- QPlatformIntegration *CustomIntegrationPlugin::create(const QString& system, const QStringList& paramList)
-{
- Q_UNUSED(paramList);
- Q_UNUSED(system);
-
- qDebug() << "************* The Qt Custom Extension Example Plugin is active ************";
-
- extension_global = new CustomExtension();
-
- // We need a way for client apps to get hold of the extension. The proper API for this is
- // QPlatformNativeInterface, but that's a low-level API using void*. There will be a nice
- // client API at some point, but in the meantime, it is easier to use QObject::findChild().
-
- extension_global->setParent(qApp);
- extension_global->setObjectName("qt_example_custom_extension");
-
- return extension_global->integration();
-}
-
-QT_END_NAMESPACE
-
-#include "main.moc"
diff --git a/examples/wayland/ivi-compositor/main.qml b/examples/wayland/ivi-compositor/main.qml
index 6535296b6..1f2420bf9 100644
--- a/examples/wayland/ivi-compositor/main.qml
+++ b/examples/wayland/ivi-compositor/main.qml
@@ -43,9 +43,7 @@ import QtWayland.Compositor 1.0
import QtQuick.Window 2.2
WaylandCompositor {
- id: wlcompositor
WaylandOutput {
- compositor: wlcompositor
sizeFollowsWindow: true
window: Window {
width: 1024
diff --git a/examples/wayland/minimal-qml/main.qml b/examples/wayland/minimal-qml/main.qml
index d44d0c6a1..732e2ccad 100644
--- a/examples/wayland/minimal-qml/main.qml
+++ b/examples/wayland/minimal-qml/main.qml
@@ -43,10 +43,8 @@ import QtQuick.Window 2.2
import QtWayland.Compositor 1.0
WaylandCompositor {
- id: wlcompositor
// The output defines the screen.
WaylandOutput {
- compositor: wlcompositor
sizeFollowsWindow: true
window: Window {
width: 1024
diff --git a/examples/wayland/multi-screen/qml/Screen.qml b/examples/wayland/multi-screen/qml/Screen.qml
index 7e2eb01dc..1759bec59 100644
--- a/examples/wayland/multi-screen/qml/Screen.qml
+++ b/examples/wayland/multi-screen/qml/Screen.qml
@@ -40,18 +40,25 @@
import QtQuick 2.0
import QtWayland.Compositor 1.0
-import QtQuick.Window 2.2
+import QtQuick.Window 2.3
WaylandOutput {
id: screen
property variant viewsBySurface: ({})
property alias surfaceArea: background
property alias text: t.text
+ property alias screen: win.screen
sizeFollowsWindow: true
+ property bool windowed: false
+
window: Window {
- width: 1024
- height: 760
+ id: win
+ x: Screen.virtualX
+ y: Screen.virtualY
+ width: 800
+ height: 800
+ visibility: windowed ? Window.Windowed : Window.FullScreen
visible: true
WaylandMouseTracker {
diff --git a/examples/wayland/multi-screen/qml/main.qml b/examples/wayland/multi-screen/qml/main.qml
index 37350289e..9eaf6ffbb 100644
--- a/examples/wayland/multi-screen/qml/main.qml
+++ b/examples/wayland/multi-screen/qml/main.qml
@@ -39,38 +39,37 @@
**
****************************************************************************/
+import QtQml 2.2
import QtQuick 2.0
+import QtQuick.Window 2.3 as Window
import QtWayland.Compositor 1.0
+import QtQml.Models 2.1
WaylandCompositor {
id: comp
- defaultOutput: middleScreen
- Screen {
- id: leftScreen
- position.x: -leftScreen.surfaceArea.width
- position.y: 0
- surfaceArea.color: "#f00"
- text: "Left"
- compositor: comp
+ ListModel {
+ id: emulatedScreens
+ ListElement { name: "left"; virtualX: 0; virtualY: 0; width: 800; height: 600 }
+ ListElement { name: "middle"; virtualX: 800; virtualY: 0; width: 800; height: 600 }
+ ListElement { name: "right"; virtualX: 1600; virtualY: 0; width: 800; height: 600 }
}
- Screen {
- id: middleScreen
- position.x: leftScreen.position.x + leftScreen.surfaceArea.width
- position.y: 0
- text: "Middle"
- surfaceArea.color: "#0f0"
- compositor: comp
- }
+ property bool emulated: Qt.application.screens.length < 2
+
+ Instantiator {
+ id: screens
+ model: emulated ? emulatedScreens : Qt.application.screens
- Screen {
- id: rightScreen
- position.x: middleScreen.position.x + middleScreen.surfaceArea.width
- position.y: 0
- surfaceArea.color: "#00f"
- text: "Right"
- compositor: comp
+ delegate: Screen {
+ surfaceArea.color: "lightsteelblue"
+ text: name
+ compositor: comp
+ screen: modelData
+ Component.onCompleted: if (!comp.defaultOutput) comp.defaultOutput = this
+ position: Qt.point(virtualX, virtualY)
+ windowed: emulated
+ }
}
Component {
@@ -85,10 +84,6 @@ WaylandCompositor {
Item {
id: rootItem
- x: leftScreen.position.x
- y: leftScreen.position.y
- width: leftScreen.surfaceArea.width + middleScreen.surfaceArea.width + rightScreen.surfaceArea.width
- height: Math.max(leftScreen.surfaceArea.height, middleScreen.surfaceArea.height, rightScreen.surfaceArea.height)
}
WlShell {
@@ -117,11 +112,12 @@ WaylandCompositor {
function handleShellSurfaceCreated(shellSurface) {
var moveItem = moveItemComponent.createObject(rootItem, {
+ "x": screens.objectAt(0).position.x,
+ "y": screens.objectAt(0).position.y,
"width": Qt.binding(function() { return shellSurface.surface.width; }),
"height": Qt.binding(function() { return shellSurface.surface.height; })
});
- createShellSurfaceItem(shellSurface, moveItem, middleScreen);
- createShellSurfaceItem(shellSurface, moveItem, leftScreen);
- createShellSurfaceItem(shellSurface, moveItem, rightScreen);
+ for (var i = 0; i < screens.count; ++i)
+ createShellSurfaceItem(shellSurface, moveItem, screens.objectAt(i));
}
}
diff --git a/examples/wayland/spanning-screens/main.qml b/examples/wayland/spanning-screens/main.qml
index 32dc11f33..ef3e70ac9 100644
--- a/examples/wayland/spanning-screens/main.qml
+++ b/examples/wayland/spanning-screens/main.qml
@@ -39,7 +39,7 @@
****************************************************************************/
import QtQuick 2.6
-import QtQuick.Window 2.2
+import QtQuick.Window 2.3
import QtWayland.Compositor 1.0
WaylandCompositor {
@@ -55,6 +55,11 @@ WaylandCompositor {
visible: true
color: "#1337af"
Text { text: "Top screen" }
+
+ // Enable the following to make the output target an actual screen,
+ // for example when running on eglfs in a multi-display embedded system.
+
+ // screen: Qt.application.screens[0]
}
}
@@ -68,6 +73,11 @@ WaylandCompositor {
visible: true
color: "#1abacc"
Text { text: "Bottom screen" }
+
+ // Enable the following to make the output target an actual screen,
+ // for example when running on eglfs in a multi-display embedded system.
+
+ // screen: Qt.application.screens[1]
}
}
diff --git a/qtwayland.pro b/qtwayland.pro
index 0401ab02f..04eca333b 100644
--- a/qtwayland.pro
+++ b/qtwayland.pro
@@ -1,2 +1,3 @@
requires(linux:!android)
+requires(qtHaveModule(gui))
load(qt_parts)
diff --git a/src/3rdparty/protocol/xdg-shell-unstable-v6.xml b/src/3rdparty/protocol/xdg-shell-unstable-v6.xml
new file mode 100644
index 000000000..e49d74fcc
--- /dev/null
+++ b/src/3rdparty/protocol/xdg-shell-unstable-v6.xml
@@ -0,0 +1,1041 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<protocol name="xdg_shell_unstable_v6">
+
+ <copyright>
+ Copyright © 2008-2013 Kristian Høgsberg
+ Copyright © 2013 Rafael Antognolli
+ Copyright © 2013 Jasper St. Pierre
+ Copyright © 2010-2013 Intel Corporation
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice (including the next
+ paragraph) shall be included in all copies or substantial portions of the
+ Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+ </copyright>
+
+ <interface name="zxdg_shell_v6" version="1">
+ <description summary="create desktop-style surfaces">
+ xdg_shell allows clients to turn a wl_surface into a "real window"
+ which can be dragged, resized, stacked, and moved around by the
+ user. Everything about this interface is suited towards traditional
+ desktop environments.
+ </description>
+
+ <enum name="error">
+ <entry name="role" value="0" summary="given wl_surface has another role"/>
+ <entry name="defunct_surfaces" value="1"
+ summary="xdg_shell was destroyed before children"/>
+ <entry name="not_the_topmost_popup" value="2"
+ summary="the client tried to map or destroy a non-topmost popup"/>
+ <entry name="invalid_popup_parent" value="3"
+ summary="the client specified an invalid popup parent surface"/>
+ <entry name="invalid_surface_state" value="4"
+ summary="the client provided an invalid surface state"/>
+ <entry name="invalid_positioner" value="5"
+ summary="the client provided an invalid positioner"/>
+ </enum>
+
+ <request name="destroy" type="destructor">
+ <description summary="destroy xdg_shell">
+ Destroy this xdg_shell object.
+
+ Destroying a bound xdg_shell object while there are surfaces
+ still alive created by this xdg_shell object instance is illegal
+ and will result in a protocol error.
+ </description>
+ </request>
+
+ <request name="create_positioner">
+ <description summary="create a positioner object">
+ Create a positioner object. A positioner object is used to position
+ surfaces relative to some parent surface. See the interface description
+ and xdg_surface.get_popup for details.
+ </description>
+ <arg name="id" type="new_id" interface="zxdg_positioner_v6"/>
+ </request>
+
+ <request name="get_xdg_surface">
+ <description summary="create a shell surface from a surface">
+ This creates an xdg_surface for the given surface. While xdg_surface
+ itself is not a role, the corresponding surface may only be assigned
+ a role extending xdg_surface, such as xdg_toplevel or xdg_popup.
+
+ This creates an xdg_surface for the given surface. An xdg_surface is
+ used as basis to define a role to a given surface, such as xdg_toplevel
+ or xdg_popup. It also manages functionality shared between xdg_surface
+ based surface roles.
+
+ See the documentation of xdg_surface for more details about what an
+ xdg_surface is and how it is used.
+ </description>
+ <arg name="id" type="new_id" interface="zxdg_surface_v6"/>
+ <arg name="surface" type="object" interface="wl_surface"/>
+ </request>
+
+ <request name="pong">
+ <description summary="respond to a ping event">
+ A client must respond to a ping event with a pong request or
+ the client may be deemed unresponsive. See xdg_shell.ping.
+ </description>
+ <arg name="serial" type="uint" summary="serial of the ping event"/>
+ </request>
+
+ <event name="ping">
+ <description summary="check if the client is alive">
+ The ping event asks the client if it's still alive. Pass the
+ serial specified in the event back to the compositor by sending
+ a "pong" request back with the specified serial. See xdg_shell.ping.
+
+ Compositors can use this to determine if the client is still
+ alive. It's unspecified what will happen if the client doesn't
+ respond to the ping request, or in what timeframe. Clients should
+ try to respond in a reasonable amount of time.
+
+ A compositor is free to ping in any way it wants, but a client must
+ always respond to any xdg_shell object it created.
+ </description>
+ <arg name="serial" type="uint" summary="pass this to the pong request"/>
+ </event>
+ </interface>
+
+ <interface name="zxdg_positioner_v6" version="1">
+ <description summary="child surface positioner">
+ The xdg_positioner provides a collection of rules for the placement of a
+ child surface relative to a parent surface. Rules can be defined to ensure
+ the child surface remains within the visible area's borders, and to
+ specify how the child surface changes its position, such as sliding along
+ an axis, or flipping around a rectangle.
+
+ See the various requests for details about possible rules.
+
+ At the time of the request, the compositor makes a copy of the rules
+ specified by the xdg_positioner. Thus, after the request is complete the
+ xdg_positioner object can be destroyed or reused; further changes to the
+ object will have no effect on previous usages.
+
+ For an xdg_positioner object to be considered complete, it must have a
+ non-zero size set by set_size, and a non-zero anchor rectangle set by
+ set_anchor_rect. Passing an incomplete xdg_positioner object when
+ positioning a surface raises an error.
+ </description>
+
+ <enum name="error">
+ <entry name="invalid_input" value="0" summary="invalid input provided"/>
+ </enum>
+
+ <request name="destroy" type="destructor">
+ <description summary="destroy the xdg_positioner object">
+ Notify the compositor that the xdg_positioner will no longer be used.
+ </description>
+ </request>
+
+ <request name="set_size">
+ <description summary="set the size of the to-be positioned rectangle">
+ Set the size of the surface that is to be positioned with the positioner
+ object. The size is in surface-local coordinates and corresponds to the
+ window geometry. See xdg_surface.set_window_geometry.
+
+ If a zero or negative size is set the invalid_input error is raised.
+ </description>
+ <arg name="width" type="int" summary="width of positioned rectangle"/>
+ <arg name="height" type="int" summary="height of positioned rectangle"/>
+ </request>
+
+ <request name="set_anchor_rect">
+ <description summary="set the anchor rectangle within the parent surface">
+ Specify the anchor rectangle within the parent surface that the child
+ surface will be placed relative to. The rectangle is relative to the
+ window geometry as defined by xdg_surface.set_window_geometry of the
+ parent surface. The rectangle must be at least 1x1 large.
+
+ When the xdg_positioner object is used to position a child surface, the
+ anchor rectangle may not extend outside the window geometry of the
+ positioned child's parent surface.
+
+ If a zero or negative size is set the invalid_input error is raised.
+ </description>
+ <arg name="x" type="int" summary="x position of anchor rectangle"/>
+ <arg name="y" type="int" summary="y position of anchor rectangle"/>
+ <arg name="width" type="int" summary="width of anchor rectangle"/>
+ <arg name="height" type="int" summary="height of anchor rectangle"/>
+ </request>
+
+ <enum name="anchor" bitfield="true">
+ <entry name="none" value="0"
+ summary="the center of the anchor rectangle"/>
+ <entry name="top" value="1"
+ summary="the top edge of the anchor rectangle"/>
+ <entry name="bottom" value="2"
+ summary="the bottom edge of the anchor rectangle"/>
+ <entry name="left" value="4"
+ summary="the left edge of the anchor rectangle"/>
+ <entry name="right" value="8"
+ summary="the right edge of the anchor rectangle"/>
+ </enum>
+
+ <request name="set_anchor">
+ <description summary="set anchor rectangle anchor edges">
+ Defines a set of edges for the anchor rectangle. These are used to
+ derive an anchor point that the child surface will be positioned
+ relative to. If two orthogonal edges are specified (e.g. 'top' and
+ 'left'), then the anchor point will be the intersection of the edges
+ (e.g. the top left position of the rectangle); otherwise, the derived
+ anchor point will be centered on the specified edge, or in the center of
+ the anchor rectangle if no edge is specified.
+
+ If two parallel anchor edges are specified (e.g. 'left' and 'right'),
+ the invalid_input error is raised.
+ </description>
+ <arg name="anchor" type="uint" enum="anchor"
+ summary="bit mask of anchor edges"/>
+ </request>
+
+ <enum name="gravity" bitfield="true">
+ <entry name="none" value="0"
+ summary="center over the anchor edge"/>
+ <entry name="top" value="1"
+ summary="position above the anchor edge"/>
+ <entry name="bottom" value="2"
+ summary="position below the anchor edge"/>
+ <entry name="left" value="4"
+ summary="position to the left of the anchor edge"/>
+ <entry name="right" value="8"
+ summary="position to the right of the anchor edge"/>
+ </enum>
+
+ <request name="set_gravity">
+ <description summary="set child surface gravity">
+ Defines in what direction a surface should be positioned, relative to
+ the anchor point of the parent surface. If two orthogonal gravities are
+ specified (e.g. 'bottom' and 'right'), then the child surface will be
+ placed in the specified direction; otherwise, the child surface will be
+ centered over the anchor point on any axis that had no gravity
+ specified.
+
+ If two parallel gravities are specified (e.g. 'left' and 'right'), the
+ invalid_input error is raised.
+ </description>
+ <arg name="gravity" type="uint" enum="gravity"
+ summary="bit mask of gravity directions"/>
+ </request>
+
+ <enum name="constraint_adjustment" bitfield="true">
+ <description summary="constraint adjustments">
+ The constraint adjustment value define ways the compositor will adjust
+ the position of the surface, if the unadjusted position would result
+ in the surface being partly constrained.
+
+ Whether a surface is considered 'constrained' is left to the compositor
+ to determine. For example, the surface may be partly outside the
+ compositor's defined 'work area', thus necessitating the child surface's
+ position be adjusted until it is entirely inside the work area.
+
+ The adjustments can be combined, according to a defined precedence: 1)
+ Flip, 2) Slide, 3) Resize.
+ </description>
+ <entry name="none" value="0">
+ <description summary="don't move the child surface when constrained">
+ Don't alter the surface position even if it is constrained on some
+ axis, for example partially outside the edge of a monitor.
+ </description>
+ </entry>
+ <entry name="slide_x" value="1">
+ <description summary="move along the x axis until unconstrained">
+ Slide the surface along the x axis until it is no longer constrained.
+
+ First try to slide towards the direction of the gravity on the x axis
+ until either the edge in the opposite direction of the gravity is
+ unconstrained or the edge in the direction of the gravity is
+ constrained.
+
+ Then try to slide towards the opposite direction of the gravity on the
+ x axis until either the edge in the direction of the gravity is
+ unconstrained or the edge in the opposite direction of the gravity is
+ constrained.
+ </description>
+ </entry>
+ <entry name="slide_y" value="2">
+ <description summary="move along the y axis until unconstrained">
+ Slide the surface along the y axis until it is no longer constrained.
+
+ First try to slide towards the direction of the gravity on the y axis
+ until either the edge in the opposite direction of the gravity is
+ unconstrained or the edge in the direction of the gravity is
+ constrained.
+
+ Then try to slide towards the opposite direction of the gravity on the
+ y axis until either the edge in the direction of the gravity is
+ unconstrained or the edge in the opposite direction of the gravity is
+ constrained.
+ </description>
+ </entry>
+ <entry name="flip_x" value="4">
+ <description summary="invert the anchor and gravity on the x axis">
+ Invert the anchor and gravity on the x axis if the surface is
+ constrained on the x axis. For example, if the left edge of the
+ surface is constrained, the gravity is 'left' and the anchor is
+ 'left', change the gravity to 'right' and the anchor to 'right'.
+
+ If the adjusted position also ends up being constrained, the resulting
+ position of the flip_x adjustment will be the one before the
+ adjustment.
+ </description>
+ </entry>
+ <entry name="flip_y" value="8">
+ <description summary="invert the anchor and gravity on the y axis">
+ Invert the anchor and gravity on the y axis if the surface is
+ constrained on the y axis. For example, if the bottom edge of the
+ surface is constrained, the gravity is 'bottom' and the anchor is
+ 'bottom', change the gravity to 'top' and the anchor to 'top'.
+
+ If the adjusted position also ends up being constrained, the resulting
+ position of the flip_y adjustment will be the one before the
+ adjustment.
+ </description>
+ </entry>
+ <entry name="resize_x" value="16">
+ <description summary="horizontally resize the surface">
+ Resize the surface horizontally so that it is completely
+ unconstrained.
+ </description>
+ </entry>
+ <entry name="resize_y" value="32">
+ <description summary="vertically resize the surface">
+ Resize the surface vertically so that it is completely unconstrained.
+ </description>
+ </entry>
+ </enum>
+
+ <request name="set_constraint_adjustment">
+ <description summary="set the adjustment to be done when constrained">
+ Specify how the window should be positioned if the originally intended
+ position caused the surface to be constrained, meaning at least
+ partially outside positioning boundaries set by the compositor. The
+ adjustment is set by constructing a bitmask describing the adjustment to
+ be made when the surface is constrained on that axis.
+
+ If no bit for one axis is set, the compositor will assume that the child
+ surface should not change its position on that axis when constrained.
+
+ If more than one bit for one axis is set, the order of how adjustments
+ are applied is specified in the corresponding adjustment descriptions.
+
+ The default adjustment is none.
+ </description>
+ <arg name="constraint_adjustment" type="uint"
+ summary="bit mask of constraint adjustments"/>
+ </request>
+
+ <request name="set_offset">
+ <description summary="set surface position offset">
+ Specify the surface position offset relative to the position of the
+ anchor on the anchor rectangle and the anchor on the surface. For
+ example if the anchor of the anchor rectangle is at (x, y), the surface
+ has the gravity bottom|right, and the offset is (ox, oy), the calculated
+ surface position will be (x + ox, y + oy). The offset position of the
+ surface is the one used for constraint testing. See
+ set_constraint_adjustment.
+
+ An example use case is placing a popup menu on top of a user interface
+ element, while aligning the user interface element of the parent surface
+ with some user interface element placed somewhere in the popup surface.
+ </description>
+ <arg name="x" type="int" summary="surface position x offset"/>
+ <arg name="y" type="int" summary="surface position y offset"/>
+ </request>
+ </interface>
+
+ <interface name="zxdg_surface_v6" version="1">
+ <description summary="desktop user interface surface base interface">
+ An interface that may be implemented by a wl_surface, for
+ implementations that provide a desktop-style user interface.
+
+ It provides a base set of functionality required to construct user
+ interface elements requiring management by the compositor, such as
+ toplevel windows, menus, etc. The types of functionality are split into
+ xdg_surface roles.
+
+ Creating an xdg_surface does not set the role for a wl_surface. In order
+ to map an xdg_surface, the client must create a role-specific object
+ using, e.g., get_toplevel, get_popup. The wl_surface for any given
+ xdg_surface can have at most one role, and may not be assigned any role
+ not based on xdg_surface.
+
+ A role must be assigned before any other requests are made to the
+ xdg_surface object.
+
+ The client must call wl_surface.commit on the corresponding wl_surface
+ for the xdg_surface state to take effect.
+
+ Creating an xdg_surface from a wl_surface which has a buffer attached or
+ committed is a client error, and any attempts by a client to attach or
+ manipulate a buffer prior to the first xdg_surface.configure call must
+ also be treated as errors.
+
+ For a surface to be mapped by the compositor, the following conditions
+ must be met: (1) the client has assigned a xdg_surface based role to the
+ surface, (2) the client has set and committed the xdg_surface state and
+ the role dependent state to the surface and (3) the client has committed a
+ buffer to the surface.
+ </description>
+
+ <enum name="error">
+ <entry name="not_constructed" value="1"/>
+ <entry name="already_constructed" value="2"/>
+ <entry name="unconfigured_buffer" value="3"/>
+ </enum>
+
+ <request name="destroy" type="destructor">
+ <description summary="destroy the xdg_surface">
+ Destroy the xdg_surface object. An xdg_surface must only be destroyed
+ after its role object has been destroyed.
+ </description>
+ </request>
+
+ <request name="get_toplevel">
+ <description summary="assign the xdg_toplevel surface role">
+ This creates an xdg_toplevel object for the given xdg_surface and gives
+ the associated wl_surface the xdg_toplevel role.
+
+ See the documentation of xdg_toplevel for more details about what an
+ xdg_toplevel is and how it is used.
+ </description>
+ <arg name="id" type="new_id" interface="zxdg_toplevel_v6"/>
+ </request>
+
+ <request name="get_popup">
+ <description summary="assign the xdg_popup surface role">
+ This creates an xdg_popup object for the given xdg_surface and gives the
+ associated wl_surface the xdg_popup role.
+
+ See the documentation of xdg_popup for more details about what an
+ xdg_popup is and how it is used.
+ </description>
+ <arg name="id" type="new_id" interface="zxdg_popup_v6"/>
+ <arg name="parent" type="object" interface="zxdg_surface_v6"/>
+ <arg name="positioner" type="object" interface="zxdg_positioner_v6"/>
+ </request>
+
+ <request name="set_window_geometry">
+ <description summary="set the new window geometry">
+ The window geometry of a surface is its "visible bounds" from the
+ user's perspective. Client-side decorations often have invisible
+ portions like drop-shadows which should be ignored for the
+ purposes of aligning, placing and constraining windows.
+
+ The window geometry is double buffered, and will be applied at the
+ time wl_surface.commit of the corresponding wl_surface is called.
+
+ Once the window geometry of the surface is set, it is not possible to
+ unset it, and it will remain the same until set_window_geometry is
+ called again, even if a new subsurface or buffer is attached.
+
+ If never set, the value is the full bounds of the surface,
+ including any subsurfaces. This updates dynamically on every
+ commit. This unset is meant for extremely simple clients.
+
+ The arguments are given in the surface-local coordinate space of
+ the wl_surface associated with this xdg_surface.
+
+ The width and height must be greater than zero. Setting an invalid size
+ will raise an error. When applied, the effective window geometry will be
+ the set window geometry clamped to the bounding rectangle of the
+ combined geometry of the surface of the xdg_surface and the associated
+ subsurfaces.
+ </description>
+ <arg name="x" type="int"/>
+ <arg name="y" type="int"/>
+ <arg name="width" type="int"/>
+ <arg name="height" type="int"/>
+ </request>
+
+ <request name="ack_configure">
+ <description summary="ack a configure event">
+ When a configure event is received, if a client commits the
+ surface in response to the configure event, then the client
+ must make an ack_configure request sometime before the commit
+ request, passing along the serial of the configure event.
+
+ For instance, for toplevel surfaces the compositor might use this
+ information to move a surface to the top left only when the client has
+ drawn itself for the maximized or fullscreen state.
+
+ If the client receives multiple configure events before it
+ can respond to one, it only has to ack the last configure event.
+
+ A client is not required to commit immediately after sending
+ an ack_configure request - it may even ack_configure several times
+ before its next surface commit.
+
+ A client may send multiple ack_configure requests before committing, but
+ only the last request sent before a commit indicates which configure
+ event the client really is responding to.
+ </description>
+ <arg name="serial" type="uint" summary="the serial from the configure event"/>
+ </request>
+
+ <event name="configure">
+ <description summary="suggest a surface change">
+ The configure event marks the end of a configure sequence. A configure
+ sequence is a set of one or more events configuring the state of the
+ xdg_surface, including the final xdg_surface.configure event.
+
+ Where applicable, xdg_surface surface roles will during a configure
+ sequence extend this event as a latched state sent as events before the
+ xdg_surface.configure event. Such events should be considered to make up
+ a set of atomically applied configuration states, where the
+ xdg_surface.configure commits the accumulated state.
+
+ Clients should arrange their surface for the new states, and then send
+ an ack_configure request with the serial sent in this configure event at
+ some point before committing the new surface.
+
+ If the client receives multiple configure events before it can respond
+ to one, it is free to discard all but the last event it received.
+ </description>
+ <arg name="serial" type="uint" summary="serial of the configure event"/>
+ </event>
+ </interface>
+
+ <interface name="zxdg_toplevel_v6" version="1">
+ <description summary="toplevel surface">
+ This interface defines an xdg_surface role which allows a surface to,
+ among other things, set window-like properties such as maximize,
+ fullscreen, and minimize, set application-specific metadata like title and
+ id, and well as trigger user interactive operations such as interactive
+ resize and move.
+ </description>
+
+ <request name="destroy" type="destructor">
+ <description summary="destroy the xdg_toplevel">
+ Unmap and destroy the window. The window will be effectively
+ hidden from the user's point of view, and all state like
+ maximization, fullscreen, and so on, will be lost.
+ </description>
+ </request>
+
+ <request name="set_parent">
+ <description summary="set the parent of this surface">
+ Set the "parent" of this surface. This window should be stacked
+ above a parent. The parent surface must be mapped as long as this
+ surface is mapped.
+
+ Parent windows should be set on dialogs, toolboxes, or other
+ "auxiliary" surfaces, so that the parent is raised when the dialog
+ is raised.
+ </description>
+ <arg name="parent" type="object" interface="zxdg_toplevel_v6" allow-null="true"/>
+ </request>
+
+ <request name="set_title">
+ <description summary="set surface title">
+ Set a short title for the surface.
+
+ This string may be used to identify the surface in a task bar,
+ window list, or other user interface elements provided by the
+ compositor.
+
+ The string must be encoded in UTF-8.
+ </description>
+ <arg name="title" type="string"/>
+ </request>
+
+ <request name="set_app_id">
+ <description summary="set application ID">
+ Set an application identifier for the surface.
+
+ The app ID identifies the general class of applications to which
+ the surface belongs. The compositor can use this to group multiple
+ surfaces together, or to determine how to launch a new application.
+
+ For D-Bus activatable applications, the app ID is used as the D-Bus
+ service name.
+
+ The compositor shell will try to group application surfaces together
+ by their app ID. As a best practice, it is suggested to select app
+ ID's that match the basename of the application's .desktop file.
+ For example, "org.freedesktop.FooViewer" where the .desktop file is
+ "org.freedesktop.FooViewer.desktop".
+
+ See the desktop-entry specification [0] for more details on
+ application identifiers and how they relate to well-known D-Bus
+ names and .desktop files.
+
+ [0] http://standards.freedesktop.org/desktop-entry-spec/
+ </description>
+ <arg name="app_id" type="string"/>
+ </request>
+
+ <request name="show_window_menu">
+ <description summary="show the window menu">
+ Clients implementing client-side decorations might want to show
+ a context menu when right-clicking on the decorations, giving the
+ user a menu that they can use to maximize or minimize the window.
+
+ This request asks the compositor to pop up such a window menu at
+ the given position, relative to the local surface coordinates of
+ the parent surface. There are no guarantees as to what menu items
+ the window menu contains.
+
+ This request must be used in response to some sort of user action
+ like a button press, key press, or touch down event.
+ </description>
+ <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
+ <arg name="serial" type="uint" summary="the serial of the user event"/>
+ <arg name="x" type="int" summary="the x position to pop up the window menu at"/>
+ <arg name="y" type="int" summary="the y position to pop up the window menu at"/>
+ </request>
+
+ <request name="move">
+ <description summary="start an interactive move">
+ Start an interactive, user-driven move of the surface.
+
+ This request must be used in response to some sort of user action
+ like a button press, key press, or touch down event. The passed
+ serial is used to determine the type of interactive move (touch,
+ pointer, etc).
+
+ The server may ignore move requests depending on the state of
+ the surface (e.g. fullscreen or maximized), or if the passed serial
+ is no longer valid.
+
+ If triggered, the surface will lose the focus of the device
+ (wl_pointer, wl_touch, etc) used for the move. It is up to the
+ compositor to visually indicate that the move is taking place, such as
+ updating a pointer cursor, during the move. There is no guarantee
+ that the device focus will return when the move is completed.
+ </description>
+ <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
+ <arg name="serial" type="uint" summary="the serial of the user event"/>
+ </request>
+
+ <enum name="resize_edge">
+ <description summary="edge values for resizing">
+ These values are used to indicate which edge of a surface
+ is being dragged in a resize operation.
+ </description>
+ <entry name="none" value="0"/>
+ <entry name="top" value="1"/>
+ <entry name="bottom" value="2"/>
+ <entry name="left" value="4"/>
+ <entry name="top_left" value="5"/>
+ <entry name="bottom_left" value="6"/>
+ <entry name="right" value="8"/>
+ <entry name="top_right" value="9"/>
+ <entry name="bottom_right" value="10"/>
+ </enum>
+
+ <request name="resize">
+ <description summary="start an interactive resize">
+ Start a user-driven, interactive resize of the surface.
+
+ This request must be used in response to some sort of user action
+ like a button press, key press, or touch down event. The passed
+ serial is used to determine the type of interactive resize (touch,
+ pointer, etc).
+
+ The server may ignore resize requests depending on the state of
+ the surface (e.g. fullscreen or maximized).
+
+ If triggered, the client will receive configure events with the
+ "resize" state enum value and the expected sizes. See the "resize"
+ enum value for more details about what is required. The client
+ must also acknowledge configure events using "ack_configure". After
+ the resize is completed, the client will receive another "configure"
+ event without the resize state.
+
+ If triggered, the surface also will lose the focus of the device
+ (wl_pointer, wl_touch, etc) used for the resize. It is up to the
+ compositor to visually indicate that the resize is taking place,
+ such as updating a pointer cursor, during the resize. There is no
+ guarantee that the device focus will return when the resize is
+ completed.
+
+ The edges parameter specifies how the surface should be resized,
+ and is one of the values of the resize_edge enum. The compositor
+ may use this information to update the surface position for
+ example when dragging the top left corner. The compositor may also
+ use this information to adapt its behavior, e.g. choose an
+ appropriate cursor image.
+ </description>
+ <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
+ <arg name="serial" type="uint" summary="the serial of the user event"/>
+ <arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
+ </request>
+
+ <enum name="state">
+ <description summary="types of state on the surface">
+ The different state values used on the surface. This is designed for
+ state values like maximized, fullscreen. It is paired with the
+ configure event to ensure that both the client and the compositor
+ setting the state can be synchronized.
+
+ States set in this way are double-buffered. They will get applied on
+ the next commit.
+ </description>
+ <entry name="maximized" value="1" summary="the surface is maximized">
+ <description summary="the surface is maximized">
+ The surface is maximized. The window geometry specified in the configure
+ event must be obeyed by the client.
+ </description>
+ </entry>
+ <entry name="fullscreen" value="2" summary="the surface is fullscreen">
+ <description summary="the surface is fullscreen">
+ The surface is fullscreen. The window geometry specified in the configure
+ event must be obeyed by the client.
+ </description>
+ </entry>
+ <entry name="resizing" value="3" summary="the surface is being resized">
+ <description summary="the surface is being resized">
+ The surface is being resized. The window geometry specified in the
+ configure event is a maximum; the client cannot resize beyond it.
+ Clients that have aspect ratio or cell sizing configuration can use
+ a smaller size, however.
+ </description>
+ </entry>
+ <entry name="activated" value="4" summary="the surface is now activated">
+ <description summary="the surface is now activated">
+ Client window decorations should be painted as if the window is
+ active. Do not assume this means that the window actually has
+ keyboard or pointer focus.
+ </description>
+ </entry>
+ </enum>
+
+ <request name="set_max_size">
+ <description summary="set the maximum size">
+ Set a maximum size for the window.
+
+ The client can specify a maximum size so that the compositor does
+ not try to configure the window beyond this size.
+
+ The width and height arguments are in window geometry coordinates.
+ See xdg_surface.set_window_geometry.
+
+ Values set in this way are double-buffered. They will get applied
+ on the next commit.
+
+ The compositor can use this information to allow or disallow
+ different states like maximize or fullscreen and draw accurate
+ animations.
+
+ Similarly, a tiling window manager may use this information to
+ place and resize client windows in a more effective way.
+
+ The client should not rely on the compositor to obey the maximum
+ size. The compositor may decide to ignore the values set by the
+ client and request a larger size.
+
+ If never set, or a value of zero in the request, means that the
+ client has no expected maximum size in the given dimension.
+ As a result, a client wishing to reset the maximum size
+ to an unspecified state can use zero for width and height in the
+ request.
+
+ Requesting a maximum size to be smaller than the minimum size of
+ a surface is illegal and will result in a protocol error.
+
+ The width and height must be greater than or equal to zero. Using
+ strictly negative values for width and height will result in a
+ protocol error.
+ </description>
+ <arg name="width" type="int"/>
+ <arg name="height" type="int"/>
+ </request>
+
+ <request name="set_min_size">
+ <description summary="set the minimum size">
+ Set a minimum size for the window.
+
+ The client can specify a minimum size so that the compositor does
+ not try to configure the window below this size.
+
+ The width and height arguments are in window geometry coordinates.
+ See xdg_surface.set_window_geometry.
+
+ Values set in this way are double-buffered. They will get applied
+ on the next commit.
+
+ The compositor can use this information to allow or disallow
+ different states like maximize or fullscreen and draw accurate
+ animations.
+
+ Similarly, a tiling window manager may use this information to
+ place and resize client windows in a more effective way.
+
+ The client should not rely on the compositor to obey the minimum
+ size. The compositor may decide to ignore the values set by the
+ client and request a smaller size.
+
+ If never set, or a value of zero in the request, means that the
+ client has no expected minimum size in the given dimension.
+ As a result, a client wishing to reset the minimum size
+ to an unspecified state can use zero for width and height in the
+ request.
+
+ Requesting a minimum size to be larger than the maximum size of
+ a surface is illegal and will result in a protocol error.
+
+ The width and height must be greater than or equal to zero. Using
+ strictly negative values for width and height will result in a
+ protocol error.
+ </description>
+ <arg name="width" type="int"/>
+ <arg name="height" type="int"/>
+ </request>
+
+ <request name="set_maximized">
+ <description summary="maximize the window">
+ Maximize the surface.
+
+ After requesting that the surface should be maximized, the compositor
+ will respond by emitting a configure event with the "maximized" state
+ and the required window geometry. The client should then update its
+ content, drawing it in a maximized state, i.e. without shadow or other
+ decoration outside of the window geometry. The client must also
+ acknowledge the configure when committing the new content (see
+ ack_configure).
+
+ It is up to the compositor to decide how and where to maximize the
+ surface, for example which output and what region of the screen should
+ be used.
+
+ If the surface was already maximized, the compositor will still emit
+ a configure event with the "maximized" state.
+ </description>
+ </request>
+
+ <request name="unset_maximized">
+ <description summary="unmaximize the window">
+ Unmaximize the surface.
+
+ After requesting that the surface should be unmaximized, the compositor
+ will respond by emitting a configure event without the "maximized"
+ state. If available, the compositor will include the window geometry
+ dimensions the window had prior to being maximized in the configure
+ request. The client must then update its content, drawing it in a
+ regular state, i.e. potentially with shadow, etc. The client must also
+ acknowledge the configure when committing the new content (see
+ ack_configure).
+
+ It is up to the compositor to position the surface after it was
+ unmaximized; usually the position the surface had before maximizing, if
+ applicable.
+
+ If the surface was already not maximized, the compositor will still
+ emit a configure event without the "maximized" state.
+ </description>
+ </request>
+
+ <request name="set_fullscreen">
+ <description summary="set the window as fullscreen on a monitor">
+ Make the surface fullscreen.
+
+ You can specify an output that you would prefer to be fullscreen.
+ If this value is NULL, it's up to the compositor to choose which
+ display will be used to map this surface.
+
+ If the surface doesn't cover the whole output, the compositor will
+ position the surface in the center of the output and compensate with
+ black borders filling the rest of the output.
+ </description>
+ <arg name="output" type="object" interface="wl_output" allow-null="true"/>
+ </request>
+ <request name="unset_fullscreen" />
+
+ <request name="set_minimized">
+ <description summary="set the window as minimized">
+ Request that the compositor minimize your surface. There is no
+ way to know if the surface is currently minimized, nor is there
+ any way to unset minimization on this surface.
+
+ If you are looking to throttle redrawing when minimized, please
+ instead use the wl_surface.frame event for this, as this will
+ also work with live previews on windows in Alt-Tab, Expose or
+ similar compositor features.
+ </description>
+ </request>
+
+ <event name="configure">
+ <description summary="suggest a surface change">
+ This configure event asks the client to resize its toplevel surface or
+ to change its state. The configured state should not be applied
+ immediately. See xdg_surface.configure for details.
+
+ The width and height arguments specify a hint to the window
+ about how its surface should be resized in window geometry
+ coordinates. See set_window_geometry.
+
+ If the width or height arguments are zero, it means the client
+ should decide its own window dimension. This may happen when the
+ compositor needs to configure the state of the surface but doesn't
+ have any information about any previous or expected dimension.
+
+ The states listed in the event specify how the width/height
+ arguments should be interpreted, and possibly how it should be
+ drawn.
+
+ Clients must send an ack_configure in response to this event. See
+ xdg_surface.configure and xdg_surface.ack_configure for details.
+ </description>
+ <arg name="width" type="int"/>
+ <arg name="height" type="int"/>
+ <arg name="states" type="array"/>
+ </event>
+
+ <event name="close">
+ <description summary="surface wants to be closed">
+ The close event is sent by the compositor when the user
+ wants the surface to be closed. This should be equivalent to
+ the user clicking the close button in client-side decorations,
+ if your application has any.
+
+ This is only a request that the user intends to close the
+ window. The client may choose to ignore this request, or show
+ a dialog to ask the user to save their data, etc.
+ </description>
+ </event>
+ </interface>
+
+ <interface name="zxdg_popup_v6" version="1">
+ <description summary="short-lived, popup surfaces for menus">
+ A popup surface is a short-lived, temporary surface. It can be used to
+ implement for example menus, popovers, tooltips and other similar user
+ interface concepts.
+
+ A popup can be made to take an explicit grab. See xdg_popup.grab for
+ details.
+
+ When the popup is dismissed, a popup_done event will be sent out, and at
+ the same time the surface will be unmapped. See the xdg_popup.popup_done
+ event for details.
+
+ Explicitly destroying the xdg_popup object will also dismiss the popup and
+ unmap the surface. Clients that want to dismiss the popup when another
+ surface of their own is clicked should dismiss the popup using the destroy
+ request.
+
+ The parent surface must have either the xdg_toplevel or xdg_popup surface
+ role.
+
+ A newly created xdg_popup will be stacked on top of all previously created
+ xdg_popup surfaces associated with the same xdg_toplevel.
+
+ The parent of an xdg_popup must be mapped (see the xdg_surface
+ description) before the xdg_popup itself.
+
+ The x and y arguments passed when creating the popup object specify
+ where the top left of the popup should be placed, relative to the
+ local surface coordinates of the parent surface. See
+ xdg_surface.get_popup.
+
+ The client must call wl_surface.commit on the corresponding wl_surface
+ for the xdg_popup state to take effect.
+ </description>
+
+ <enum name="error">
+ <entry name="invalid_grab" value="0"
+ summary="tried to grab after being mapped"/>
+ </enum>
+
+ <request name="destroy" type="destructor">
+ <description summary="remove xdg_popup interface">
+ This destroys the popup. Explicitly destroying the xdg_popup
+ object will also dismiss the popup, and unmap the surface.
+
+ If this xdg_popup is not the "topmost" popup, a protocol error
+ will be sent.
+ </description>
+ </request>
+
+ <request name="grab">
+ <description summary="make the popup take an explicit grab">
+ This request makes the created popup take an explicit grab. An explicit
+ grab will be dismissed when the user dismisses the popup, or when the
+ client destroys the xdg_popup. This can be done by the user clicking
+ outside the surface, using the keyboard, or even locking the screen
+ through closing the lid or a timeout.
+
+ If the compositor denies the grab, the popup will be immediately
+ dismissed.
+
+ This request must be used in response to some sort of user action like a
+ button press, key press, or touch down event. The serial number of the
+ event should be passed as 'serial'.
+
+ The parent of a grabbing popup must either be an xdg_toplevel surface or
+ another xdg_popup with an explicit grab. If the parent is another
+ xdg_popup it means that the popups are nested, with this popup now being
+ the topmost popup.
+
+ Nested popups must be destroyed in the reverse order they were created
+ in, e.g. the only popup you are allowed to destroy at all times is the
+ topmost one.
+
+ When compositors choose to dismiss a popup, they may dismiss every
+ nested grabbing popup as well. When a compositor dismisses popups, it
+ will follow the same dismissing order as required from the client.
+
+ The parent of a grabbing popup must either be another xdg_popup with an
+ active explicit grab, or an xdg_popup or xdg_toplevel, if there are no
+ explicit grabs already taken.
+
+ If the topmost grabbing popup is destroyed, the grab will be returned to
+ the parent of the popup, if that parent previously had an explicit grab.
+
+ If the parent is a grabbing popup which has already been dismissed, this
+ popup will be immediately dismissed. If the parent is a popup that did
+ not take an explicit grab, an error will be raised.
+
+ During a popup grab, the client owning the grab will receive pointer
+ and touch events for all their surfaces as normal (similar to an
+ "owner-events" grab in X11 parlance), while the top most grabbing popup
+ will always have keyboard focus.
+ </description>
+ <arg name="seat" type="object" interface="wl_seat"
+ summary="the wl_seat of the user event"/>
+ <arg name="serial" type="uint" summary="the serial of the user event"/>
+ </request>
+
+ <event name="configure">
+ <description summary="configure the popup surface">
+ This event asks the popup surface to configure itself given the
+ configuration. The configured state should not be applied immediately.
+ See xdg_surface.configure for details.
+
+ The x and y arguments represent the position the popup was placed at
+ given the xdg_positioner rule, relative to the upper left corner of the
+ window geometry of the parent surface.
+ </description>
+ <arg name="x" type="int"
+ summary="x position relative to parent surface window geometry"/>
+ <arg name="y" type="int"
+ summary="y position relative to parent surface window geometry"/>
+ <arg name="width" type="int" summary="window geometry width"/>
+ <arg name="height" type="int" summary="window geometry height"/>
+ </event>
+
+ <event name="popup_done">
+ <description summary="popup interaction is done">
+ The popup_done event is sent out when a popup is dismissed by the
+ compositor. The client should destroy the xdg_popup object at this
+ point.
+ </description>
+ </event>
+
+ </interface>
+</protocol>
diff --git a/src/client/client.pro b/src/client/client.pro
index 92d4309ff..eae7ad52e 100644
--- a/src/client/client.pro
+++ b/src/client/client.pro
@@ -23,13 +23,16 @@ QMAKE_USE += wayland-client
INCLUDEPATH += $$PWD/../shared
WAYLANDCLIENTSOURCES += \
- ../3rdparty/protocol/wayland.xml \
../extensions/surface-extension.xml \
../extensions/touch-extension.xml \
../extensions/qtkey-extension.xml \
../extensions/qt-windowmanager.xml \
../3rdparty/protocol/text-input-unstable-v2.xml \
../3rdparty/protocol/xdg-shell.xml \
+ ../3rdparty/protocol/xdg-shell-unstable-v6.xml \
+
+WAYLANDCLIENTSOURCES_SYSTEM += \
+ ../3rdparty/protocol/wayland.xml \
SOURCES += qwaylandintegration.cpp \
qwaylandnativeinterface.cpp \
@@ -39,9 +42,6 @@ SOURCES += qwaylandintegration.cpp \
qwaylandwindow.cpp \
qwaylandscreen.cpp \
qwaylandshmwindow.cpp \
- qwaylanddataoffer.cpp \
- qwaylanddatadevicemanager.cpp \
- qwaylanddatasource.cpp \
qwaylandshellsurface.cpp \
qwaylandwlshellsurface.cpp \
qwaylandwlshellintegration.cpp \
@@ -49,6 +49,8 @@ SOURCES += qwaylandintegration.cpp \
qwaylandxdgsurface.cpp \
qwaylandxdgpopup.cpp \
qwaylandxdgshellintegration.cpp \
+ qwaylandxdgshellv6.cpp \
+ qwaylandxdgshellv6integration.cpp \
qwaylandextendedsurface.cpp \
qwaylandsubsurface.cpp \
qwaylandtouch.cpp \
@@ -73,9 +75,6 @@ HEADERS += qwaylandintegration_p.h \
qwaylandinputdevice_p.h \
qwaylandbuffer_p.h \
qwaylandshmwindow_p.h \
- qwaylanddataoffer_p.h \
- qwaylanddatadevicemanager_p.h \
- qwaylanddatasource_p.h \
qwaylandshellsurface_p.h \
qwaylandwlshellsurface_p.h \
qwaylandwlshellintegration_p.h \
@@ -83,6 +82,8 @@ HEADERS += qwaylandintegration_p.h \
qwaylandxdgsurface_p.h \
qwaylandxdgpopup_p.h \
qwaylandxdgshellintegration_p.h \
+ qwaylandxdgshellv6_p.h \
+ qwaylandxdgshellv6integration_p.h \
qwaylandextendedsurface_p.h \
qwaylandsubsurface_p.h \
qwaylandtouch_p.h \
@@ -98,7 +99,7 @@ HEADERS += qwaylandintegration_p.h \
../shared/qwaylandinputmethodeventbuilder_p.h \
../shared/qwaylandmimehelper_p.h \
../shared/qwaylandxkb_p.h \
- ../shared/qwaylandsharedmemoryformathelper_p.h
+ ../shared/qwaylandsharedmemoryformathelper_p.h \
qtConfig(clipboard) {
HEADERS += qwaylandclipboard_p.h
@@ -118,13 +119,25 @@ qtConfig(cursor) {
SOURCES += \
qwaylandcursor.cpp
}
+
+qtConfig(wayland-datadevice) {
+ HEADERS += \
+ qwaylanddatadevice_p.h \
+ qwaylanddatadevicemanager_p.h \
+ qwaylanddataoffer_p.h \
+ qwaylanddatasource_p.h
+ SOURCES += \
+ qwaylanddatadevice.cpp \
+ qwaylanddatadevicemanager.cpp \
+ qwaylanddataoffer.cpp \
+ qwaylanddatasource.cpp
+}
+
qtConfig(draganddrop) {
HEADERS += \
- qwaylanddnd_p.h \
- qwaylanddatadevice_p.h
+ qwaylanddnd_p.h
SOURCES += \
- qwaylanddnd.cpp \
- qwaylanddatadevice.cpp
+ qwaylanddnd.cpp
}
CONFIG += generated_privates
diff --git a/src/client/configure.json b/src/client/configure.json
index ea0bbe22c..c29a8b609 100644
--- a/src/client/configure.json
+++ b/src/client/configure.json
@@ -76,6 +76,10 @@
"condition": "!config.win32 && libs.wayland-client && libs.wayland-cursor && tests.wayland-scanner",
"output": [ "privateFeature" ]
},
+ "wayland-datadevice": {
+ "condition": "features.draganddrop || features.clipboard",
+ "output": [ "privateFeature" ]
+ },
"wayland-egl": {
"label": "EGL",
"condition": "features.wayland-client && features.opengl && features.egl && libs.wayland-egl",
diff --git a/src/client/qwaylandclipboard.cpp b/src/client/qwaylandclipboard.cpp
index 68fb737cc..5da120268 100644
--- a/src/client/qwaylandclipboard.cpp
+++ b/src/client/qwaylandclipboard.cpp
@@ -44,8 +44,6 @@
#include "qwaylanddatasource_p.h"
#include "qwaylanddatadevice_p.h"
-#if QT_CONFIG(draganddrop)
-
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@@ -117,5 +115,3 @@ bool QWaylandClipboard::ownsMode(QClipboard::Mode mode) const
}
QT_END_NAMESPACE
-
-#endif // draganddrop
diff --git a/src/client/qwaylandclipboard_p.h b/src/client/qwaylandclipboard_p.h
index 211a96942..283362022 100644
--- a/src/client/qwaylandclipboard_p.h
+++ b/src/client/qwaylandclipboard_p.h
@@ -57,7 +57,8 @@
#include <QtWaylandClient/qtwaylandclientglobal.h>
-#if QT_CONFIG(draganddrop)
+QT_REQUIRE_CONFIG(clipboard);
+
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@@ -85,6 +86,4 @@ private:
QT_END_NAMESPACE
-#endif // draganddrop
-
#endif // QWAYLANDCLIPBOARD_H
diff --git a/src/client/qwaylandcursor.cpp b/src/client/qwaylandcursor.cpp
index e3e3469be..7caa247e5 100644
--- a/src/client/qwaylandcursor.cpp
+++ b/src/client/qwaylandcursor.cpp
@@ -143,31 +143,6 @@ void QWaylandCursor::changeCursor(QCursor *cursor, QWindow *window)
mDisplay->setCursor(buffer, image);
}
-void QWaylandDisplay::setCursor(struct wl_buffer *buffer, struct wl_cursor_image *image)
-{
- /* Qt doesn't tell us which input device we should set the cursor
- * for, so set it for all devices. */
- for (int i = 0; i < mInputDevices.count(); i++) {
- QWaylandInputDevice *inputDevice = mInputDevices.at(i);
- inputDevice->setCursor(buffer, image);
- }
-}
-
-void QWaylandDisplay::setCursor(const QSharedPointer<QWaylandBuffer> &buffer, const QPoint &hotSpot)
-{
- /* Qt doesn't tell us which input device we should set the cursor
- * for, so set it for all devices. */
- for (int i = 0; i < mInputDevices.count(); i++) {
- QWaylandInputDevice *inputDevice = mInputDevices.at(i);
- inputDevice->setCursor(buffer, hotSpot);
- }
-}
-
-QWaylandInputDevice *QWaylandDisplay::defaultInputDevice() const
-{
- return mInputDevices.isEmpty() ? 0 : mInputDevices.first();
-}
-
void QWaylandCursor::pointerEvent(const QMouseEvent &event)
{
mLastPos = event.globalPos();
diff --git a/src/client/qwaylanddatadevice.cpp b/src/client/qwaylanddatadevice.cpp
index ebd3ce1bf..33068c5e9 100644
--- a/src/client/qwaylanddatadevice.cpp
+++ b/src/client/qwaylanddatadevice.cpp
@@ -58,8 +58,6 @@
#include <qpa/qplatformdrag.h>
#include <qpa/qwindowsysteminterface.h>
-#if QT_CONFIG(draganddrop)
-
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@@ -103,6 +101,7 @@ void QWaylandDataDevice::setSelectionSource(QWaylandDataSource *source)
m_selectionSource.reset(source);
}
+#if QT_CONFIG(draganddrop)
QWaylandDataOffer *QWaylandDataDevice::dragOffer() const
{
return m_dragOffer.data();
@@ -124,12 +123,14 @@ void QWaylandDataDevice::cancelDrag()
{
m_dragSource.reset();
}
+#endif
void QWaylandDataDevice::data_device_data_offer(struct ::wl_data_offer *id)
{
new QWaylandDataOffer(m_display, id);
}
+#if QT_CONFIG(draganddrop)
void QWaylandDataDevice::data_device_drop()
{
QDrag *drag = static_cast<QWaylandDrag *>(QGuiApplicationPrivate::platformIntegration()->drag())->currentDrag();
@@ -229,6 +230,7 @@ void QWaylandDataDevice::data_device_motion(uint32_t time, wl_fixed_t x, wl_fixe
wl_data_offer_accept(m_dragOffer->object(), m_enterSerial, 0);
}
}
+#endif // QT_CONFIG(draganddrop)
void QWaylandDataDevice::data_device_selection(wl_data_offer *id)
{
@@ -250,6 +252,7 @@ void QWaylandDataDevice::selectionSourceCancelled()
#endif
}
+#if QT_CONFIG(draganddrop)
void QWaylandDataDevice::dragSourceCancelled()
{
m_dragSource.reset();
@@ -272,9 +275,8 @@ QPoint QWaylandDataDevice::calculateDragPosition(int x, int y, QWindow *wnd) con
}
return pnt;
}
+#endif // QT_CONFIG(draganddrop)
}
QT_END_NAMESPACE
-
-#endif // draganddrop
diff --git a/src/client/qwaylanddatadevice_p.h b/src/client/qwaylanddatadevice_p.h
index 1ec8761b9..7fb0003b4 100644
--- a/src/client/qwaylanddatadevice_p.h
+++ b/src/client/qwaylanddatadevice_p.h
@@ -52,14 +52,14 @@
// We mean it.
//
-#include <qtwaylandclientglobal.h>
+#include <qtwaylandclientglobal_p.h>
#include <QObject>
#include <QPointer>
#include <QPoint>
#include <QtWaylandClient/private/qwayland-wayland.h>
-#if QT_CONFIG(draganddrop)
+QT_REQUIRE_CONFIG(wayland_datadevice);
QT_BEGIN_NAMESPACE
@@ -87,25 +87,35 @@ public:
QWaylandDataSource *selectionSource() const;
void setSelectionSource(QWaylandDataSource *source);
+#if QT_CONFIG(draganddrop)
QWaylandDataOffer *dragOffer() const;
void startDrag(QMimeData *mimeData, QWaylandWindow *icon);
void cancelDrag();
+#endif
protected:
void data_device_data_offer(struct ::wl_data_offer *id) override;
+
+#if QT_CONFIG(draganddrop)
void data_device_drop() override;
void data_device_enter(uint32_t serial, struct ::wl_surface *surface, wl_fixed_t x, wl_fixed_t y, struct ::wl_data_offer *id) override;
void data_device_leave() override;
void data_device_motion(uint32_t time, wl_fixed_t x, wl_fixed_t y) override;
+#endif
void data_device_selection(struct ::wl_data_offer *id) override;
private Q_SLOTS:
void selectionSourceCancelled();
+
+#if QT_CONFIG(draganddrop)
void dragSourceCancelled();
void dragSourceTargetChanged(const QString &mimeType);
+#endif
private:
+#if QT_CONFIG(draganddrop)
QPoint calculateDragPosition(int x, int y, QWindow *wnd) const;
+#endif
QWaylandDisplay *m_display;
QWaylandInputDevice *m_inputDevice;
@@ -123,6 +133,4 @@ private:
QT_END_NAMESPACE
-#endif // draganddrop
-
#endif // QWAYLANDDATADEVICE_H
diff --git a/src/client/qwaylanddatadevicemanager.cpp b/src/client/qwaylanddatadevicemanager.cpp
index c398b86fd..35d67307f 100644
--- a/src/client/qwaylanddatadevicemanager.cpp
+++ b/src/client/qwaylanddatadevicemanager.cpp
@@ -46,8 +46,6 @@
#include <QtCore/QDebug>
-#if QT_CONFIG(draganddrop)
-
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@@ -82,5 +80,3 @@ QWaylandDisplay *QWaylandDataDeviceManager::display() const
}
QT_END_NAMESPACE
-
-#endif // draganddrop
diff --git a/src/client/qwaylanddatadevicemanager_p.h b/src/client/qwaylanddatadevicemanager_p.h
index e7fc2113a..3daf780aa 100644
--- a/src/client/qwaylanddatadevicemanager_p.h
+++ b/src/client/qwaylanddatadevicemanager_p.h
@@ -51,10 +51,10 @@
// We mean it.
//
-#include <QtWaylandClient/qtwaylandclientglobal.h>
+#include <QtWaylandClient/private/qtwaylandclientglobal_p.h>
#include <QtWaylandClient/private/qwayland-wayland.h>
-#if QT_CONFIG(draganddrop)
+QT_REQUIRE_CONFIG(wayland_datadevice);
QT_BEGIN_NAMESPACE
@@ -83,6 +83,4 @@ private:
QT_END_NAMESPACE
-#endif // draganddrop
-
#endif // QWAYLANDDATADEVICEMANAGER_H
diff --git a/src/client/qwaylanddataoffer.cpp b/src/client/qwaylanddataoffer.cpp
index 56a18f007..2491c658b 100644
--- a/src/client/qwaylanddataoffer.cpp
+++ b/src/client/qwaylanddataoffer.cpp
@@ -47,8 +47,6 @@
#include <QtCore/QDebug>
-#if QT_CONFIG(draganddrop)
-
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@@ -183,5 +181,3 @@ int QWaylandMimeData::readData(int fd, QByteArray &data) const
}
QT_END_NAMESPACE
-
-#endif // draganddrop
diff --git a/src/client/qwaylanddataoffer_p.h b/src/client/qwaylanddataoffer_p.h
index c7520f3e5..c9b9c21f1 100644
--- a/src/client/qwaylanddataoffer_p.h
+++ b/src/client/qwaylanddataoffer_p.h
@@ -53,10 +53,11 @@
#include <QtGui/private/qdnd_p.h>
-#include <QtWaylandClient/qtwaylandclientglobal.h>
+#include <QtWaylandClient/private/qtwaylandclientglobal_p.h>
#include <QtWaylandClient/private/qwayland-wayland.h>
-#if QT_CONFIG(draganddrop)
+QT_REQUIRE_CONFIG(wayland_datadevice);
+
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@@ -106,5 +107,4 @@ private:
}
QT_END_NAMESPACE
-#endif // draganddrop
#endif
diff --git a/src/client/qwaylanddatasource.cpp b/src/client/qwaylanddatasource.cpp
index c61de181b..0c6ad50e4 100644
--- a/src/client/qwaylanddatasource.cpp
+++ b/src/client/qwaylanddatasource.cpp
@@ -50,8 +50,6 @@
#include <unistd.h>
#include <signal.h>
-#if QT_CONFIG(draganddrop)
-
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@@ -108,5 +106,3 @@ void QWaylandDataSource::data_source_target(const QString &mime_type)
}
QT_END_NAMESPACE
-
-#endif // draganddrop
diff --git a/src/client/qwaylanddatasource_p.h b/src/client/qwaylanddatasource_p.h
index 0221304c8..bba003f56 100644
--- a/src/client/qwaylanddatasource_p.h
+++ b/src/client/qwaylanddatasource_p.h
@@ -54,9 +54,9 @@
#include <QObject>
#include <QtWaylandClient/private/qwayland-wayland.h>
-#include <QtWaylandClient/qtwaylandclientglobal.h>
+#include <QtWaylandClient/private/qtwaylandclientglobal_p.h>
-#if QT_CONFIG(draganddrop)
+QT_REQUIRE_CONFIG(wayland_datadevice);
QT_BEGIN_NAMESPACE
@@ -94,6 +94,4 @@ private:
QT_END_NAMESPACE
-#endif // draganddrop
-
#endif // QWAYLANDDATASOURCE_H
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
index 8e4c8d67c..86cfe1a0d 100644
--- a/src/client/qwaylanddisplay.cpp
+++ b/src/client/qwaylanddisplay.cpp
@@ -47,7 +47,9 @@
#if QT_CONFIG(clipboard)
#include "qwaylandclipboard_p.h"
#endif
+#if QT_CONFIG(wayland_datadevice)
#include "qwaylanddatadevicemanager_p.h"
+#endif
#include "qwaylandhardwareintegration_p.h"
#include "qwaylandxdgshell_p.h"
#include "qwaylandxdgsurface_p.h"
@@ -122,7 +124,7 @@ QWaylandWindowManagerIntegration *QWaylandDisplay::windowManagerIntegration() co
QWaylandDisplay::QWaylandDisplay(QWaylandIntegration *waylandIntegration)
: mWaylandIntegration(waylandIntegration)
-#if QT_CONFIG(draganddrop)
+#if QT_CONFIG(wayland_datadevice)
, mDndSelectionHandler(0)
#endif
, mWindowExtension(0)
@@ -162,7 +164,7 @@ QWaylandDisplay::~QWaylandDisplay(void)
mWaylandIntegration->destroyScreen(screen);
}
mScreens.clear();
-#if QT_CONFIG(draganddrop)
+#if QT_CONFIG(wayland_datadevice)
delete mDndSelectionHandler.take();
#endif
wl_display_disconnect(mDisplay);
@@ -257,7 +259,7 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
} else if (interface == QStringLiteral("wl_seat")) {
QWaylandInputDevice *inputDevice = mWaylandIntegration->createInputDevice(this, version, id);
mInputDevices.append(inputDevice);
-#if QT_CONFIG(draganddrop)
+#if QT_CONFIG(wayland_datadevice)
} else if (interface == QStringLiteral("wl_data_device_manager")) {
mDndSelectionHandler.reset(new QWaylandDataDeviceManager(this, id));
#endif
@@ -468,6 +470,33 @@ void QWaylandDisplay::requestWaylandSync()
wl_callback_add_listener(mSyncCallback, &syncCallbackListener, this);
}
+QWaylandInputDevice *QWaylandDisplay::defaultInputDevice() const
+{
+ return mInputDevices.isEmpty() ? 0 : mInputDevices.first();
+}
+
+#if QT_CONFIG(cursor)
+void QWaylandDisplay::setCursor(struct wl_buffer *buffer, struct wl_cursor_image *image)
+{
+ /* Qt doesn't tell us which input device we should set the cursor
+ * for, so set it for all devices. */
+ for (int i = 0; i < mInputDevices.count(); i++) {
+ QWaylandInputDevice *inputDevice = mInputDevices.at(i);
+ inputDevice->setCursor(buffer, image);
+ }
+}
+
+void QWaylandDisplay::setCursor(const QSharedPointer<QWaylandBuffer> &buffer, const QPoint &hotSpot)
+{
+ /* Qt doesn't tell us which input device we should set the cursor
+ * for, so set it for all devices. */
+ for (int i = 0; i < mInputDevices.count(); i++) {
+ QWaylandInputDevice *inputDevice = mInputDevices.at(i);
+ inputDevice->setCursor(buffer, hotSpot);
+ }
+}
+#endif // QT_CONFIG(cursor)
+
}
QT_END_NAMESPACE
diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
index e96a89176..35d861760 100644
--- a/src/client/qwaylanddisplay_p.h
+++ b/src/client/qwaylanddisplay_p.h
@@ -61,7 +61,7 @@
#include <wayland-client.h>
#include <QtWaylandClient/private/qwayland-wayland.h>
-#include <QtWaylandClient/qtwaylandclientglobal.h>
+#include <QtWaylandClient/private/qtwaylandclientglobal_p.h>
#include <QtWaylandClient/private/qwayland-xdg-shell.h>
#include <QtWaylandClient/private/qwaylandshm_p.h>
@@ -123,10 +123,10 @@ public:
QWaylandClientBufferIntegration *clientBufferIntegration() const;
QWaylandWindowManagerIntegration *windowManagerIntegration() const;
-
+#if QT_CONFIG(cursor)
void setCursor(struct wl_buffer *buffer, struct wl_cursor_image *image);
void setCursor(const QSharedPointer<QWaylandBuffer> &buffer, const QPoint &hotSpot);
-
+#endif
struct wl_display *wl_display() const { return mDisplay; }
struct ::wl_registry *wl_registry() { return object(); }
@@ -137,7 +137,7 @@ public:
QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
QWaylandInputDevice *defaultInputDevice() const;
QWaylandInputDevice *currentInputDevice() const { return defaultInputDevice(); }
-#if QT_CONFIG(draganddrop)
+#if QT_CONFIG(wayland_datadevice)
QWaylandDataDeviceManager *dndSelectionHandler() const { return mDndSelectionHandler.data(); }
#endif
QtWayland::qt_surface_extension *windowExtension() const { return mWindowExtension.data(); }
@@ -202,7 +202,7 @@ private:
QList<QWaylandInputDevice *> mInputDevices;
QList<Listener> mRegistryListeners;
QWaylandIntegration *mWaylandIntegration;
-#if QT_CONFIG(draganddrop)
+#if QT_CONFIG(wayland_datadevice)
QScopedPointer<QWaylandDataDeviceManager> mDndSelectionHandler;
#endif
QScopedPointer<QtWayland::qt_surface_extension> mWindowExtension;
diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp
index fb22c95e6..b0c6394e2 100644
--- a/src/client/qwaylandinputdevice.cpp
+++ b/src/client/qwaylandinputdevice.cpp
@@ -42,8 +42,10 @@
#include "qwaylandintegration_p.h"
#include "qwaylandwindow_p.h"
#include "qwaylandbuffer_p.h"
+#if QT_CONFIG(wayland_datadevice)
#include "qwaylanddatadevice_p.h"
#include "qwaylanddatadevicemanager_p.h"
+#endif
#include "qwaylandtouch_p.h"
#include "qwaylandscreen_p.h"
#include "qwaylandcursor_p.h"
@@ -187,7 +189,9 @@ QWaylandInputDevice::QWaylandInputDevice(QWaylandDisplay *display, int version,
, mDisplay(display->wl_display())
, mVersion(qMin(version, 4))
, mCaps(0)
+#if QT_CONFIG(wayland_datadevice)
, mDataDevice(0)
+#endif
, mKeyboard(0)
, mPointer(0)
, mTouch(0)
@@ -196,7 +200,7 @@ QWaylandInputDevice::QWaylandInputDevice(QWaylandDisplay *display, int version,
, mSerial(0)
, mTouchDevice(0)
{
-#if QT_CONFIG(draganddrop)
+#if QT_CONFIG(wayland_datadevice)
if (mQDisplay->dndSelectionHandler()) {
mDataDevice = mQDisplay->dndSelectionHandler()->getDataDevice(this);
}
@@ -286,6 +290,7 @@ void QWaylandInputDevice::handleEndDrag()
mPointer->releaseButtons();
}
+#if QT_CONFIG(wayland_datadevice)
void QWaylandInputDevice::setDataDevice(QWaylandDataDevice *device)
{
mDataDevice = device;
@@ -296,6 +301,7 @@ QWaylandDataDevice *QWaylandInputDevice::dataDevice() const
Q_ASSERT(mDataDevice);
return mDataDevice;
}
+#endif
void QWaylandInputDevice::setTextInput(QWaylandTextInput *textInput)
{
diff --git a/src/client/qwaylandinputdevice_p.h b/src/client/qwaylandinputdevice_p.h
index d8bd0062f..4d0a47597 100644
--- a/src/client/qwaylandinputdevice_p.h
+++ b/src/client/qwaylandinputdevice_p.h
@@ -111,8 +111,10 @@ public:
void handleWindowDestroyed(QWaylandWindow *window);
void handleEndDrag();
+#if QT_CONFIG(wayland_datadevice)
void setDataDevice(QWaylandDataDevice *device);
QWaylandDataDevice *dataDevice() const;
+#endif
void setTextInput(QWaylandTextInput *textInput);
QWaylandTextInput *textInput() const;
@@ -143,7 +145,9 @@ private:
struct wl_surface *pointerSurface;
+#if QT_CONFIG(wayland_datadevice)
QWaylandDataDevice *mDataDevice;
+#endif
Keyboard *mKeyboard;
Pointer *mPointer;
diff --git a/src/client/qwaylandintegration.cpp b/src/client/qwaylandintegration.cpp
index 78a1182c6..400f3517c 100644
--- a/src/client/qwaylandintegration.cpp
+++ b/src/client/qwaylandintegration.cpp
@@ -79,6 +79,7 @@
#include "qwaylandshellintegrationfactory_p.h"
#include "qwaylandxdgshellintegration_p.h"
#include "qwaylandwlshellintegration_p.h"
+#include "qwaylandxdgshellv6integration_p.h"
#include "qwaylandinputdeviceintegration_p.h"
#include "qwaylandinputdeviceintegrationfactory_p.h"
@@ -385,23 +386,25 @@ void QWaylandIntegration::initializeShellIntegration()
QByteArray integrationName = qgetenv("QT_WAYLAND_SHELL_INTEGRATION");
QString targetKey = QString::fromLocal8Bit(integrationName);
+ QStringList preferredShells;
if (!targetKey.isEmpty()) {
- QStringList keys = QWaylandShellIntegrationFactory::keys();
- if (keys.contains(targetKey)) {
- qDebug("Using the '%s' shell integration", qPrintable(targetKey));
- mShellIntegration.reset(QWaylandShellIntegrationFactory::create(targetKey, QStringList()));
- }
+ preferredShells << targetKey;
} else {
- QStringList preferredShells;
- if (qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL"))
- preferredShells << QLatin1String("xdg_shell");
- preferredShells << QLatin1String("wl_shell");
-
- Q_FOREACH (QString preferredShell, preferredShells) {
- if (mDisplay->hasRegistryGlobal(preferredShell)) {
- mShellIntegration.reset(createShellIntegration(preferredShell));
- break;
- }
+ preferredShells << QLatin1String("xdg-shell-v6");
+ QString useXdgShell = QString::fromLocal8Bit(qgetenv("QT_WAYLAND_USE_XDG_SHELL"));
+ if (!useXdgShell.isEmpty() && useXdgShell != QLatin1String("0")) {
+ qWarning() << "QT_WAYLAND_USE_XDG_SHELL is deprecated, "
+ "please specify the shell using QT_WAYLAND_SHELL_INTEGRATION instead";
+ preferredShells << QLatin1String("xdg-shell-v5");
+ }
+ preferredShells << QLatin1String("wl-shell");
+ }
+
+ Q_FOREACH (QString preferredShell, preferredShells) {
+ mShellIntegration.reset(createShellIntegration(preferredShell));
+ if (mShellIntegration) {
+ qDebug("Using the '%s' shell integration", qPrintable(preferredShell));
+ break;
}
}
@@ -437,14 +440,18 @@ void QWaylandIntegration::initializeInputDeviceIntegration()
}
}
-QWaylandShellIntegration *QWaylandIntegration::createShellIntegration(const QString &interfaceName)
+QWaylandShellIntegration *QWaylandIntegration::createShellIntegration(const QString &integrationName)
{
- if (interfaceName == QLatin1Literal("wl_shell")) {
- return new QWaylandWlShellIntegration(mDisplay.data());
- } else if (interfaceName == QLatin1Literal("xdg_shell")) {
- return new QWaylandXdgShellIntegration(mDisplay.data());
+ if (integrationName == QLatin1Literal("wl-shell")) {
+ return QWaylandWlShellIntegration::create(mDisplay.data());
+ } else if (integrationName == QLatin1Literal("xdg-shell-v5")) {
+ return QWaylandXdgShellIntegration::create(mDisplay.data());
+ } else if (integrationName == QLatin1Literal("xdg-shell-v6")) {
+ return QWaylandXdgShellV6Integration::create(mDisplay.data());
+ } else if (QWaylandShellIntegrationFactory::keys().contains(integrationName)) {
+ return QWaylandShellIntegrationFactory::create(integrationName, QStringList());
} else {
- return Q_NULLPTR;
+ return nullptr;
}
}
diff --git a/src/client/qwaylandshellsurface_p.h b/src/client/qwaylandshellsurface_p.h
index e700d5a18..06d92ba08 100644
--- a/src/client/qwaylandshellsurface_p.h
+++ b/src/client/qwaylandshellsurface_p.h
@@ -85,6 +85,7 @@ public:
virtual void setWindowFlags(Qt::WindowFlags flags);
virtual bool isExposed() const { return true; }
+ virtual bool handleExpose(const QRegion &) { return false; }
virtual void raise() {}
virtual void lower() {}
diff --git a/src/client/qwaylandshmbackingstore_p.h b/src/client/qwaylandshmbackingstore_p.h
index 71f98e30c..8564cc9d2 100644
--- a/src/client/qwaylandshmbackingstore_p.h
+++ b/src/client/qwaylandshmbackingstore_p.h
@@ -90,7 +90,7 @@ public:
QWaylandShmBackingStore(QWindow *window);
~QWaylandShmBackingStore();
- QPaintDevice *paintDevice();
+ QPaintDevice *paintDevice() override;
void flush(QWindow *window, const QRegion &region, const QPoint &offset) override;
void resize(const QSize &size, const QRegion &staticContents) override;
void resize(const QSize &size);
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 83e5f7c7a..00fbb00de 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -40,7 +40,6 @@
#include "qwaylandwindow_p.h"
#include "qwaylandbuffer_p.h"
-#include "qwaylanddatadevice_p.h"
#include "qwaylanddisplay_p.h"
#include "qwaylandinputdevice_p.h"
#include "qwaylandscreen_p.h"
@@ -54,6 +53,11 @@
#include "qwaylanddecorationfactory_p.h"
#include "qwaylandshmbackingstore_p.h"
+#if QT_CONFIG(wayland_datadevice)
+#include "qwaylanddatadevice_p.h"
+#endif
+
+
#include <QtCore/QFileInfo>
#include <QtCore/QPointer>
#include <QtCore/QRegularExpression>
@@ -160,7 +164,9 @@ void QWaylandWindow::initWindow()
// when available.
if (!QGuiApplication::desktopFileName().isEmpty()) {
QString name = QGuiApplication::desktopFileName();
- mShellSurface->setAppId(name.replace(QRegularExpression(QLatin1String("\\.desktop$")), QString()));
+ if (name.endsWith(QLatin1String(".desktop")))
+ name.chop(8);
+ mShellSurface->setAppId(name);
} else {
QFileInfo fi = QCoreApplication::instance()->applicationFilePath();
QStringList domainName =
@@ -314,8 +320,15 @@ void QWaylandWindow::setGeometry(const QRect &rect)
mSentInitialResize = true;
}
+ sendExposeEvent(QRect(QPoint(), geometry().size()));
+}
+
- QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(), geometry().size()));
+
+void QWaylandWindow::sendExposeEvent(const QRect &rect)
+{
+ if (mShellSurface && !mShellSurface->handleExpose(rect))
+ QWindowSystemInterface::handleExposeEvent(window(), rect);
}
void QWaylandWindow::setVisible(bool visible)
@@ -329,7 +342,7 @@ void QWaylandWindow::setVisible(bool visible)
// there was no frame before it will be stuck at the waitForFrameSync() in
// QWaylandShmBackingStore::beginPaint().
} else {
- QWindowSystemInterface::handleExposeEvent(window(), QRegion());
+ sendExposeEvent(QRect());
// when flushing the event queue, it could contain a close event, in which
// case 'this' will be deleted. When that happens, we must abort right away.
QPointer<QWaylandWindow> deleteGuard(this);
@@ -427,10 +440,10 @@ void QWaylandWindow::setCanResize(bool canResize)
}
if (!mConfigure.isEmpty()) {
doResize();
- QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(), geometry().size()));
+ sendExposeEvent(QRect(QPoint(), geometry().size()));
} else if (mResizeDirty) {
mResizeDirty = false;
- QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(), geometry().size()));
+ sendExposeEvent(QRect(QPoint(), geometry().size()));
}
}
}
@@ -445,7 +458,7 @@ void QWaylandWindow::requestResize()
mRequestResizeSent = false;
lock.unlock();
- QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(), geometry().size()));
+ sendExposeEvent(QRect(QPoint(), geometry().size()));
QWindowSystemInterface::flushWindowSystemEvents();
}
@@ -671,7 +684,7 @@ bool QWaylandWindow::createDecoration()
QMargins m = frameMargins();
subsurf->set_position(pos.x() + m.left(), pos.y() + m.top());
}
- QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(), geometry().size()));
+ sendExposeEvent(QRect(QPoint(), geometry().size()));
}
return mWindowDecoration;
@@ -816,7 +829,7 @@ void QWaylandWindow::requestActivateWindow()
void QWaylandWindow::unfocus()
{
-#if QT_CONFIG(draganddrop)
+#if QT_CONFIG(clipboard)
QWaylandInputDevice *inputDevice = mDisplay->currentInputDevice();
if (inputDevice && inputDevice->dataDevice()) {
inputDevice->dataDevice()->invalidateSelectionOffer();
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index ce1a07604..8e72b1076 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -252,6 +252,7 @@ private:
bool shouldCreateShellSurface() const;
bool shouldCreateSubSurface() const;
void reset();
+ void sendExposeEvent(const QRect &rect);
void handleMouseEventWithDecoration(QWaylandInputDevice *inputDevice, const QWaylandPointerEvent &e);
diff --git a/src/client/qwaylandwlshellintegration.cpp b/src/client/qwaylandwlshellintegration.cpp
index ce7c78346..8d61201bd 100644
--- a/src/client/qwaylandwlshellintegration.cpp
+++ b/src/client/qwaylandwlshellintegration.cpp
@@ -41,6 +41,13 @@ QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
+QWaylandWlShellIntegration *QWaylandWlShellIntegration::create(QWaylandDisplay *display)
+{
+ if (display->hasRegistryGlobal(QLatin1String("wl_shell")))
+ return new QWaylandWlShellIntegration(display);
+ return nullptr;
+}
+
QWaylandWlShellIntegration::QWaylandWlShellIntegration(QWaylandDisplay *display)
: m_wlShell(Q_NULLPTR)
{
diff --git a/src/client/qwaylandwlshellintegration_p.h b/src/client/qwaylandwlshellintegration_p.h
index 55b8f89ca..8a33a177c 100644
--- a/src/client/qwaylandwlshellintegration_p.h
+++ b/src/client/qwaylandwlshellintegration_p.h
@@ -57,11 +57,13 @@ namespace QtWaylandClient {
class Q_WAYLAND_CLIENT_EXPORT QWaylandWlShellIntegration : public QWaylandShellIntegration
{
public:
- QWaylandWlShellIntegration(QWaylandDisplay* display);
+ static QWaylandWlShellIntegration *create(QWaylandDisplay* display);
bool initialize(QWaylandDisplay *) override;
QWaylandShellSurface *createShellSurface(QWaylandWindow *window) override;
private:
+ QWaylandWlShellIntegration(QWaylandDisplay* display);
+
QtWayland::wl_shell *m_wlShell;
};
diff --git a/src/client/qwaylandxdgshellintegration.cpp b/src/client/qwaylandxdgshellintegration.cpp
index a48157dfa..439dd4b15 100644
--- a/src/client/qwaylandxdgshellintegration.cpp
+++ b/src/client/qwaylandxdgshellintegration.cpp
@@ -43,6 +43,13 @@ QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
+QWaylandXdgShellIntegration *QWaylandXdgShellIntegration::create(QWaylandDisplay *display)
+{
+ if (display->hasRegistryGlobal(QLatin1String("xdg_shell")))
+ return new QWaylandXdgShellIntegration(display);
+ return nullptr;
+}
+
QWaylandXdgShellIntegration::QWaylandXdgShellIntegration(QWaylandDisplay *display)
: m_xdgShell(Q_NULLPTR)
{
diff --git a/src/client/qwaylandxdgshellintegration_p.h b/src/client/qwaylandxdgshellintegration_p.h
index e14bf5bd2..adf2bca28 100644
--- a/src/client/qwaylandxdgshellintegration_p.h
+++ b/src/client/qwaylandxdgshellintegration_p.h
@@ -58,12 +58,14 @@ class QWaylandXdgShell;
class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShellIntegration : public QWaylandShellIntegration
{
public:
- QWaylandXdgShellIntegration(QWaylandDisplay *display);
+ static QWaylandXdgShellIntegration *create(QWaylandDisplay* display);
bool initialize(QWaylandDisplay *display) override;
QWaylandShellSurface *createShellSurface(QWaylandWindow *window) override;
void handleKeyboardFocusChanged(QWaylandWindow *newFocus, QWaylandWindow *oldFocus) override;
private:
+ QWaylandXdgShellIntegration(QWaylandDisplay *display);
+
QWaylandXdgShell *m_xdgShell;
};
diff --git a/src/client/qwaylandxdgshellv6.cpp b/src/client/qwaylandxdgshellv6.cpp
new file mode 100644
index 000000000..687973240
--- /dev/null
+++ b/src/client/qwaylandxdgshellv6.cpp
@@ -0,0 +1,247 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2014 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** 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 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandxdgshellv6_p.h"
+
+#include "qwaylanddisplay_p.h"
+#include "qwaylandwindow_p.h"
+#include "qwaylandinputdevice_p.h"
+#include "qwaylandscreen_p.h"
+#include "qwaylandabstractdecoration_p.h"
+
+#include <QtCore/QDebug>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtWaylandClient {
+
+QWaylandXdgSurfaceV6::Toplevel::Toplevel(QWaylandXdgSurfaceV6 *xdgSurface)
+ : QtWayland::zxdg_toplevel_v6(xdgSurface->get_toplevel())
+ , m_xdgSurface(xdgSurface)
+{
+}
+
+QWaylandXdgSurfaceV6::Toplevel::~Toplevel()
+{
+ if (isInitialized())
+ destroy();
+}
+
+void QWaylandXdgSurfaceV6::Toplevel::applyConfigure()
+{
+ //TODO: resize, activate etc
+ m_xdgSurface->m_window->configure(0, m_configureState.width, m_configureState.height);
+}
+
+void QWaylandXdgSurfaceV6::Toplevel::zxdg_toplevel_v6_configure(int32_t width, int32_t height, wl_array *states)
+{
+ m_configureState.width = width;
+ m_configureState.height = height;
+
+ uint32_t *state = reinterpret_cast<uint32_t *>(states->data);
+ size_t numStates = states->size / sizeof(uint32_t);
+ m_configureState.states.reserve(numStates);
+ m_configureState.states.clear();
+
+ for (size_t i = 0; i < numStates; i++)
+ m_configureState.states << state[i];
+}
+
+void QWaylandXdgSurfaceV6::Toplevel::zxdg_toplevel_v6_close()
+{
+ m_xdgSurface->m_window->window()->close();
+}
+
+QWaylandXdgSurfaceV6::Popup::Popup(QWaylandXdgSurfaceV6 *xdgSurface, QWaylandXdgSurfaceV6 *parent,
+ QtWayland::zxdg_positioner_v6 *positioner)
+ : zxdg_popup_v6(xdgSurface->get_popup(parent->object(), positioner->object()))
+ , m_xdgSurface(xdgSurface)
+{
+}
+
+QWaylandXdgSurfaceV6::Popup::~Popup()
+{
+ if (isInitialized())
+ destroy();
+}
+
+void QWaylandXdgSurfaceV6::Popup::applyConfigure()
+{
+
+}
+
+void QWaylandXdgSurfaceV6::Popup::zxdg_popup_v6_popup_done()
+{
+ m_xdgSurface->m_window->window()->close();
+}
+
+QWaylandXdgSurfaceV6::QWaylandXdgSurfaceV6(QWaylandXdgShellV6 *shell, ::zxdg_surface_v6 *surface, QWaylandWindow *window)
+ : QWaylandShellSurface(window)
+ , zxdg_surface_v6(surface)
+ , m_shell(shell)
+ , m_window(window)
+ , m_toplevel(nullptr)
+ , m_popup(nullptr)
+ , m_configured(false)
+{
+}
+
+QWaylandXdgSurfaceV6::~QWaylandXdgSurfaceV6()
+{
+ if (m_popup)
+ zxdg_popup_v6_destroy(m_popup->object());
+ destroy();
+}
+
+void QWaylandXdgSurfaceV6::resize(QWaylandInputDevice *inputDevice, zxdg_toplevel_v6_resize_edge edges)
+{
+ Q_ASSERT(m_toplevel && m_toplevel->isInitialized());
+ m_toplevel->resize(inputDevice->wl_seat(), inputDevice->serial(), edges);
+}
+
+void QWaylandXdgSurfaceV6::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges)
+{
+ auto xdgEdges = reinterpret_cast<enum zxdg_toplevel_v6_resize_edge const * const>(&edges);
+ resize(inputDevice, *xdgEdges);
+}
+
+
+void QWaylandXdgSurfaceV6::move(QWaylandInputDevice *inputDevice)
+{
+ Q_ASSERT(m_toplevel && m_toplevel->isInitialized());
+ m_toplevel->move(inputDevice->wl_seat(), inputDevice->serial());
+}
+
+void QWaylandXdgSurfaceV6::setTitle(const QString &title)
+{
+ if (m_toplevel)
+ m_toplevel->set_title(title);
+}
+
+void QWaylandXdgSurfaceV6::setAppId(const QString &appId)
+{
+ if (m_toplevel)
+ m_toplevel->set_app_id(appId);
+}
+
+void QWaylandXdgSurfaceV6::setType(Qt::WindowType type, QWaylandWindow *transientParent)
+{
+ if (type == Qt::Popup && transientParent) {
+ setPopup(transientParent, m_window->display()->lastInputDevice(), m_window->display()->lastInputSerial());
+ } else {
+ setToplevel();
+ if (transientParent) {
+ auto parentXdgSurface = static_cast<QWaylandXdgSurfaceV6 *>(transientParent->shellSurface());
+ m_toplevel->set_parent(parentXdgSurface->m_toplevel->object());
+ }
+ }
+}
+
+bool QWaylandXdgSurfaceV6::handleExpose(const QRegion &region)
+{
+ if (!m_configured && !region.isEmpty()) {
+ m_exposeRegion = region;
+ return true;
+ }
+ return false;
+}
+
+void QWaylandXdgSurfaceV6::setToplevel()
+{
+ Q_ASSERT(!m_toplevel && !m_popup);
+ m_toplevel = new Toplevel(this);
+}
+
+void QWaylandXdgSurfaceV6::setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial)
+{
+ Q_ASSERT(!m_toplevel && !m_popup);
+
+ auto parentXdgSurface = static_cast<QWaylandXdgSurfaceV6 *>(parent->shellSurface());
+ auto positioner = new QtWayland::zxdg_positioner_v6(m_shell->create_positioner());
+ // set_popup expects a position relative to the parent
+ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
+ transientPos -= parent->geometry().topLeft();
+ if (parent->decoration()) {
+ transientPos.setX(transientPos.x() + parent->decoration()->margins().left());
+ transientPos.setY(transientPos.y() + parent->decoration()->margins().top());
+ }
+ positioner->set_anchor_rect(transientPos.x(), transientPos.y(), 1, 1);
+ positioner->set_anchor(QtWayland::zxdg_positioner_v6::anchor_top | QtWayland::zxdg_positioner_v6::anchor_left);
+ positioner->set_gravity(QtWayland::zxdg_positioner_v6::gravity_bottom | QtWayland::zxdg_positioner_v6::gravity_right);
+ m_popup = new Popup(this, parentXdgSurface, positioner);
+ positioner->destroy();
+ delete positioner;
+ m_popup->grab(device->wl_seat(), serial);
+}
+
+void QWaylandXdgSurfaceV6::zxdg_surface_v6_configure(uint32_t serial)
+{
+ m_configured = true;
+ if (m_toplevel)
+ m_toplevel->applyConfigure();
+ else if (m_popup)
+ m_popup->applyConfigure();
+
+ if (!m_exposeRegion.isEmpty()) {
+ QWindowSystemInterface::handleExposeEvent(m_window->window(), m_exposeRegion);
+ m_exposeRegion = QRegion();
+ }
+ ack_configure(serial);
+}
+
+
+
+QWaylandXdgShellV6::QWaylandXdgShellV6(struct ::wl_registry *registry, uint32_t id, uint32_t availableVersion)
+ : QtWayland::zxdg_shell_v6(registry, id, qMin(availableVersion, 1u))
+{
+}
+
+QWaylandXdgShellV6::~QWaylandXdgShellV6()
+{
+ destroy();
+}
+
+QWaylandXdgSurfaceV6 *QWaylandXdgShellV6::getXdgSurface(QWaylandWindow *window)
+{
+ return new QWaylandXdgSurfaceV6(this, get_xdg_surface(window->object()), window);
+}
+
+void QWaylandXdgShellV6::zxdg_shell_v6_ping(uint32_t serial)
+{
+ pong(serial);
+}
+
+}
+
+QT_END_NAMESPACE
diff --git a/src/client/qwaylandxdgshellv6_p.h b/src/client/qwaylandxdgshellv6_p.h
new file mode 100644
index 000000000..81be89de2
--- /dev/null
+++ b/src/client/qwaylandxdgshellv6_p.h
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2014 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** 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 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDXDGSHELLV6_H
+#define QWAYLANDXDGSHELLV6_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/QSize>
+#include <QtGui/QRegion>
+
+#include <wayland-client.h>
+
+#include <QtWaylandClient/private/qwayland-xdg-shell-unstable-v6.h>
+#include <QtWaylandClient/qtwaylandclientglobal.h>
+#include "qwaylandshellsurface_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QWindow;
+
+namespace QtWaylandClient {
+
+class QWaylandWindow;
+class QWaylandInputDevice;
+class QWaylandXdgShellV6;
+
+class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgSurfaceV6 : public QWaylandShellSurface, public QtWayland::zxdg_surface_v6
+{
+public:
+ QWaylandXdgSurfaceV6(QWaylandXdgShellV6 *shell, ::zxdg_surface_v6 *surface, QWaylandWindow *window);
+ ~QWaylandXdgSurfaceV6();
+
+ void resize(QWaylandInputDevice *inputDevice, enum zxdg_toplevel_v6_resize_edge edges);
+ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) override;
+ void move(QWaylandInputDevice *inputDevice) override;
+ void setTitle(const QString &title) override;
+ void setAppId(const QString &appId) override;
+
+ void setType(Qt::WindowType type, QWaylandWindow *transientParent) override;
+ bool handleExpose(const QRegion &) override;
+
+protected:
+ void zxdg_surface_v6_configure(uint32_t serial) override;
+
+private:
+ class Toplevel: public QtWayland::zxdg_toplevel_v6
+ {
+ public:
+ Toplevel(QWaylandXdgSurfaceV6 *xdgSurface);
+ ~Toplevel();
+
+ void applyConfigure();
+
+ void zxdg_toplevel_v6_configure(int32_t width, int32_t height, wl_array *states) override;
+ void zxdg_toplevel_v6_close() override;
+
+ struct {
+ int32_t width, height;
+ QVarLengthArray<uint32_t> states;
+ } m_configureState;
+
+ QWaylandXdgSurfaceV6 *m_xdgSurface;
+ };
+
+ class Popup : public QtWayland::zxdg_popup_v6 {
+ public:
+ Popup(QWaylandXdgSurfaceV6 *xdgSurface, QWaylandXdgSurfaceV6 *parent, QtWayland::zxdg_positioner_v6 *positioner);
+ ~Popup();
+
+ void applyConfigure();
+ void zxdg_popup_v6_popup_done() override;
+
+ QWaylandXdgSurfaceV6 *m_xdgSurface;
+ };
+
+ void setToplevel();
+ void setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial);
+
+ QWaylandXdgShellV6 *m_shell;
+ QWaylandWindow *m_window;
+ Toplevel *m_toplevel;
+ Popup *m_popup;
+ bool m_configured;
+ QRegion m_exposeRegion;
+};
+
+class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShellV6 : public QtWayland::zxdg_shell_v6
+{
+public:
+ QWaylandXdgShellV6(struct ::wl_registry *registry, uint32_t id, uint32_t availableVersion);
+
+ QWaylandXdgSurfaceV6 *getXdgSurface(QWaylandWindow *window);
+
+ virtual ~QWaylandXdgShellV6();
+
+private:
+ void zxdg_shell_v6_ping(uint32_t serial) override;
+};
+
+QT_END_NAMESPACE
+
+}
+
+#endif // QWAYLANDXDGSHELLV6_H
diff --git a/src/client/qwaylandxdgshellv6integration.cpp b/src/client/qwaylandxdgshellv6integration.cpp
new file mode 100644
index 000000000..26f50c376
--- /dev/null
+++ b/src/client/qwaylandxdgshellv6integration.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** 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 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandxdgshellv6integration_p.h"
+
+#include <QtWaylandClient/private/qwaylandwindow_p.h>
+#include <QtWaylandClient/private/qwaylanddisplay_p.h>
+#include <QtWaylandClient/private/qwaylandxdgsurface_p.h>
+#include <QtWaylandClient/private/qwaylandxdgpopup_p.h>
+#include <QtWaylandClient/private/qwaylandxdgshell_p.h>
+#include <QtWaylandClient/private/qwaylandxdgshellv6_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtWaylandClient {
+
+QWaylandXdgShellV6Integration::QWaylandXdgShellV6Integration(QWaylandDisplay *display)
+ : m_xdgShell(nullptr)
+{
+ for (QWaylandDisplay::RegistryGlobal global : display->globals()) {
+ if (global.interface == QLatin1String("zxdg_shell_v6")) {
+ m_xdgShell = new QWaylandXdgShellV6(display->wl_registry(), global.id, global.version);
+ break;
+ }
+ }
+}
+
+QWaylandXdgShellV6Integration *QWaylandXdgShellV6Integration::create(QWaylandDisplay *display)
+{
+ if (display->hasRegistryGlobal(QLatin1String("zxdg_shell_v6")))
+ return new QWaylandXdgShellV6Integration(display);
+ return nullptr;
+}
+
+bool QWaylandXdgShellV6Integration::initialize(QWaylandDisplay *display)
+{
+ QWaylandShellIntegration::initialize(display);
+ return m_xdgShell != nullptr;
+}
+
+QWaylandShellSurface *QWaylandXdgShellV6Integration::createShellSurface(QWaylandWindow *window)
+{
+ return m_xdgShell->getXdgSurface(window);
+}
+
+}
+
+QT_END_NAMESPACE
diff --git a/src/client/qwaylandxdgshellv6integration_p.h b/src/client/qwaylandxdgshellv6integration_p.h
new file mode 100644
index 000000000..21868c411
--- /dev/null
+++ b/src/client/qwaylandxdgshellv6integration_p.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** 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 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDXDGSHELLV6INTEGRATION_P_H
+#define QWAYLANDXDGSHELLV6INTEGRATION_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <wayland-client.h>
+
+#include <QtWaylandClient/private/qwaylandshellintegration_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtWaylandClient {
+
+class QWaylandXdgShellV6;
+
+class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShellV6Integration : public QWaylandShellIntegration
+{
+public:
+ static QWaylandXdgShellV6Integration *create(QWaylandDisplay* display);
+ bool initialize(QWaylandDisplay *display) override;
+ QWaylandShellSurface *createShellSurface(QWaylandWindow *window) override;
+
+private:
+ QWaylandXdgShellV6Integration(QWaylandDisplay *display);
+
+ QWaylandXdgShellV6 *m_xdgShell;
+};
+
+}
+
+QT_END_NAMESPACE
+
+#endif // QWAYLANDXDGSHELLV6INTEGRATION_P_H
diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp
index 499d81b3f..277fa0abe 100644
--- a/src/compositor/compositor_api/qwaylandcompositor.cpp
+++ b/src/compositor/compositor_api/qwaylandcompositor.cpp
@@ -52,8 +52,10 @@
#include <QtWaylandCompositor/private/qwaylandkeyboard_p.h>
#include <QtWaylandCompositor/private/qwaylandsurface_p.h>
+#if QT_CONFIG(wayland_datadevice)
#include "wayland_wrapper/qwldatadevice_p.h"
#include "wayland_wrapper/qwldatadevicemanager_p.h"
+#endif
#include "wayland_wrapper/qwlbuffermanager_p.h"
#include "hardware_integration/qwlclientbufferintegration_p.h"
@@ -176,7 +178,9 @@ void QWaylandCompositorPrivate::init()
wl_compositor::init(display, 3);
wl_subcompositor::init(display, 1);
+#if QT_CONFIG(wayland_datadevice)
data_device_manager = new QtWayland::DataDeviceManager(q);
+#endif
buffer_manager = new QtWayland::BufferManager(q);
wl_display_init_shm(display);
@@ -225,7 +229,9 @@ QWaylandCompositorPrivate::~QWaylandCompositorPrivate()
qDeleteAll(outputs);
+#if QT_CONFIG(wayland_datadevice)
delete data_device_manager;
+#endif
wl_display_destroy(display);
}
@@ -790,7 +796,9 @@ void QWaylandCompositor::retainedSelectionReceived(QMimeData *)
void QWaylandCompositor::overrideSelection(const QMimeData *data)
{
Q_D(QWaylandCompositor);
+#if QT_CONFIG(wayland_datadevice)
d->data_device_manager->overrideSelection(*data);
+#endif
}
/*!
diff --git a/src/compositor/compositor_api/qwaylandcompositor_p.h b/src/compositor/compositor_api/qwaylandcompositor_p.h
index f85fd8cc5..c43962f92 100644
--- a/src/compositor/compositor_api/qwaylandcompositor_p.h
+++ b/src/compositor/compositor_api/qwaylandcompositor_p.h
@@ -49,7 +49,7 @@
// We mean it.
//
-#include <QtWaylandCompositor/qtwaylandcompositorglobal.h>
+#include <QtWaylandCompositor/private/qtwaylandcompositorglobal_p.h>
#include <QtWaylandCompositor/QWaylandCompositor>
#include <QtCore/private/qobject_p.h>
#include <QtCore/QSet>
@@ -89,7 +89,9 @@ public:
inline QtWayland::ClientBufferIntegration *clientBufferIntegration() const;
inline QtWayland::ServerBufferIntegration *serverBufferIntegration() const;
+#if QT_CONFIG(wayland_datadevice)
QtWayland::DataDeviceManager *dataDeviceManager() const { return data_device_manager; }
+#endif
QtWayland::BufferManager *bufferManager() const { return buffer_manager; }
void feedRetainedSelectionData(QMimeData *data);
@@ -130,7 +132,9 @@ protected:
QList<QWaylandSurface *> all_surfaces;
+#if QT_CONFIG(wayland_datadevice)
QtWayland::DataDeviceManager *data_device_manager;
+#endif
QtWayland::BufferManager *buffer_manager;
QElapsedTimer timer;
diff --git a/src/compositor/compositor_api/qwaylanddrag.cpp b/src/compositor/compositor_api/qwaylanddrag.cpp
index 3c3d9ce52..cd7cef843 100644
--- a/src/compositor/compositor_api/qwaylanddrag.cpp
+++ b/src/compositor/compositor_api/qwaylanddrag.cpp
@@ -38,9 +38,13 @@
#include <private/qobject_p.h>
-#include "qwldatadevice_p.h"
#include "qwaylandview.h"
#include <QtWaylandCompositor/private/qwaylandseat_p.h>
+#include <QtWaylandCompositor/private/qtwaylandcompositorglobal_p.h>
+
+#if QT_CONFIG(wayland_datadevice)
+#include "qwldatadevice_p.h"
+#endif
QT_BEGIN_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylanddrag.h b/src/compositor/compositor_api/qwaylanddrag.h
index df1924740..e4fd2c932 100644
--- a/src/compositor/compositor_api/qwaylanddrag.h
+++ b/src/compositor/compositor_api/qwaylanddrag.h
@@ -42,6 +42,8 @@
#include <QtCore/QObject>
#include <QtCore/QPointF>
+QT_REQUIRE_CONFIG(draganddrop);
+
QT_BEGIN_NAMESPACE
class QWaylandDragPrivate;
diff --git a/src/compositor/compositor_api/qwaylandquickitem.cpp b/src/compositor/compositor_api/qwaylandquickitem.cpp
index a39eff9e8..d3c096a85 100644
--- a/src/compositor/compositor_api/qwaylandquickitem.cpp
+++ b/src/compositor/compositor_api/qwaylandquickitem.cpp
@@ -43,7 +43,9 @@
#include <QtWaylandCompositor/qwaylandcompositor.h>
#include <QtWaylandCompositor/qwaylandseat.h>
#include <QtWaylandCompositor/qwaylandbufferref.h>
+#if QT_CONFIG(draganddrop)
#include <QtWaylandCompositor/QWaylandDrag>
+#endif
#include <QtWaylandCompositor/private/qwlclientbufferintegration_p.h>
#include <QtGui/QKeyEvent>
@@ -492,6 +494,7 @@ void QWaylandQuickItem::mouseMoveEvent(QMouseEvent *event)
Q_D(QWaylandQuickItem);
if (d->shouldSendInputEvents()) {
QWaylandSeat *seat = compositor()->seatFor(event);
+#if QT_CONFIG(draganddrop)
if (d->isDragging) {
QWaylandQuickOutput *currentOutput = qobject_cast<QWaylandQuickOutput *>(view()->output());
//TODO: also check if dragging onto other outputs
@@ -502,7 +505,9 @@ void QWaylandQuickItem::mouseMoveEvent(QMouseEvent *event)
QPointF surfacePosition = targetItem->mapToSurface(position);
seat->drag()->dragMove(targetSurface, surfacePosition);
}
- } else {
+ } else
+#endif // QT_CONFIG(draganddrop)
+ {
seat->sendMouseMoveEvent(d->view.data(), mapToSurface(event->localPos()), event->windowPos());
d->hoverPos = event->pos();
}
@@ -520,10 +525,13 @@ void QWaylandQuickItem::mouseReleaseEvent(QMouseEvent *event)
Q_D(QWaylandQuickItem);
if (d->shouldSendInputEvents()) {
QWaylandSeat *seat = compositor()->seatFor(event);
+#if QT_CONFIG(draganddrop)
if (d->isDragging) {
d->isDragging = false;
seat->drag()->drop();
- } else {
+ } else
+#endif
+ {
seat->sendMouseReleaseEvent(event->button());
}
} else {
@@ -854,7 +862,9 @@ void QWaylandQuickItem::handleSurfaceChanged()
disconnect(d->oldSurface, &QWaylandSurface::configure, this, &QWaylandQuickItem::updateBuffer);
disconnect(d->oldSurface, &QWaylandSurface::redraw, this, &QQuickItem::update);
disconnect(d->oldSurface, &QWaylandSurface::childAdded, this, &QWaylandQuickItem::handleSubsurfaceAdded);
+#if QT_CONFIG(draganddrop)
disconnect(d->oldSurface, &QWaylandSurface::dragStarted, this, &QWaylandQuickItem::handleDragStarted);
+#endif
#if QT_CONFIG(im)
disconnect(d->oldSurface->inputMethodControl(), &QWaylandInputMethodControl::updateInputMethod, this, &QWaylandQuickItem::updateInputMethod);
#endif
@@ -867,7 +877,9 @@ void QWaylandQuickItem::handleSurfaceChanged()
connect(newSurface, &QWaylandSurface::configure, this, &QWaylandQuickItem::updateBuffer);
connect(newSurface, &QWaylandSurface::redraw, this, &QQuickItem::update);
connect(newSurface, &QWaylandSurface::childAdded, this, &QWaylandQuickItem::handleSubsurfaceAdded);
+#if QT_CONFIG(draganddrop)
connect(newSurface, &QWaylandSurface::dragStarted, this, &QWaylandQuickItem::handleDragStarted);
+#endif
#if QT_CONFIG(im)
connect(newSurface->inputMethodControl(), &QWaylandInputMethodControl::updateInputMethod, this, &QWaylandQuickItem::updateInputMethod);
#endif
@@ -1277,6 +1289,7 @@ void QWaylandQuickItem::handleSubsurfacePosition(const QPoint &pos)
QQuickItem::setPosition(pos * d->scaleFactor());
}
+#if QT_CONFIG(draganddrop)
void QWaylandQuickItem::handleDragStarted(QWaylandDrag *drag)
{
Q_D(QWaylandQuickItem);
@@ -1284,6 +1297,7 @@ void QWaylandQuickItem::handleDragStarted(QWaylandDrag *drag)
drag->seat()->setMouseFocus(nullptr);
d->isDragging = true;
}
+#endif
qreal QWaylandQuickItemPrivate::scaleFactor() const
{
diff --git a/src/compositor/compositor_api/qwaylandquickitem.h b/src/compositor/compositor_api/qwaylandquickitem.h
index eb014a20c..ed8842052 100644
--- a/src/compositor/compositor_api/qwaylandquickitem.h
+++ b/src/compositor/compositor_api/qwaylandquickitem.h
@@ -159,7 +159,9 @@ private Q_SLOTS:
void beforeSync();
void handleSubsurfaceAdded(QWaylandSurface *childSurface);
void handleSubsurfacePosition(const QPoint &pos);
+#if QT_CONFIG(draganddrop)
void handleDragStarted(QWaylandDrag *drag);
+#endif
#if QT_CONFIG(im)
void updateInputMethod(Qt::InputMethodQueries queries);
#endif
diff --git a/src/compositor/compositor_api/qwaylandquickoutput.cpp b/src/compositor/compositor_api/qwaylandquickoutput.cpp
index 0e25362fc..af21bd0cc 100644
--- a/src/compositor/compositor_api/qwaylandquickoutput.cpp
+++ b/src/compositor/compositor_api/qwaylandquickoutput.cpp
@@ -72,6 +72,22 @@ void QWaylandQuickOutput::initialize()
this, &QWaylandQuickOutput::doFrameCallbacks);
}
+void QWaylandQuickOutput::classBegin()
+{
+}
+
+void QWaylandQuickOutput::componentComplete()
+{
+ if (!compositor()) {
+ for (QObject *p = parent(); p != nullptr; p = p->parent()) {
+ if (auto c = qobject_cast<QWaylandCompositor *>(p)) {
+ setCompositor(c);
+ break;
+ }
+ }
+ }
+}
+
void QWaylandQuickOutput::update()
{
if (!m_updateScheduled) {
diff --git a/src/compositor/compositor_api/qwaylandquickoutput.h b/src/compositor/compositor_api/qwaylandquickoutput.h
index 1e6ca479f..446215af1 100644
--- a/src/compositor/compositor_api/qwaylandquickoutput.h
+++ b/src/compositor/compositor_api/qwaylandquickoutput.h
@@ -46,8 +46,9 @@ QT_BEGIN_NAMESPACE
class QWaylandQuickCompositor;
class QQuickWindow;
-class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandQuickOutput : public QWaylandOutput
+class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandQuickOutput : public QWaylandOutput, public QQmlParserStatus
{
+ Q_INTERFACES(QQmlParserStatus)
Q_OBJECT
Q_PROPERTY(bool automaticFrameCallback READ automaticFrameCallback WRITE setAutomaticFrameCallback NOTIFY automaticFrameCallbackChanged)
public:
@@ -69,6 +70,8 @@ Q_SIGNALS:
protected:
void initialize() override;
+ void classBegin() override;
+ void componentComplete() override;
private:
void doFrameCallbacks();
diff --git a/src/compositor/compositor_api/qwaylandseat.cpp b/src/compositor/compositor_api/qwaylandseat.cpp
index 7e4c83192..10d29d6c3 100644
--- a/src/compositor/compositor_api/qwaylandseat.cpp
+++ b/src/compositor/compositor_api/qwaylandseat.cpp
@@ -40,13 +40,17 @@
#include "qwaylandcompositor.h"
#include "qwaylandinputmethodcontrol.h"
#include "qwaylandview.h"
+#if QT_CONFIG(draganddrop)
#include <QtWaylandCompositor/QWaylandDrag>
+#endif
#include <QtWaylandCompositor/QWaylandTouch>
#include <QtWaylandCompositor/QWaylandPointer>
#include <QtWaylandCompositor/QWaylandKeymap>
#include <QtWaylandCompositor/private/qwaylandseat_p.h>
#include <QtWaylandCompositor/private/qwaylandcompositor_p.h>
+#if QT_CONFIG(wayland_datadevice)
#include <QtWaylandCompositor/private/qwldatadevice_p.h>
+#endif
#include "extensions/qwlqtkey_p.h"
#include "extensions/qwaylandtextinput.h"
@@ -61,8 +65,12 @@ QWaylandSeatPrivate::QWaylandSeatPrivate(QWaylandSeat *seat)
, mouseFocus(Q_NULLPTR)
, keyboardFocus(nullptr)
, capabilities()
+#if QT_CONFIG(wayland_datadevice)
, data_device()
+#endif
+#if QT_CONFIG(draganddrop)
, drag_handle(new QWaylandDrag(seat))
+#endif
, keymap(new QWaylandKeymap())
{
}
@@ -100,6 +108,7 @@ void QWaylandSeatPrivate::setCapabilities(QWaylandSeat::CapabilityFlags caps)
}
}
+#if QT_CONFIG(wayland_datadevice)
void QWaylandSeatPrivate::clientRequestedDataDevice(QtWayland::DataDeviceManager *, struct wl_client *client, uint32_t id)
{
Q_Q(QWaylandSeat);
@@ -107,6 +116,7 @@ void QWaylandSeatPrivate::clientRequestedDataDevice(QtWayland::DataDeviceManager
data_device.reset(new QtWayland::DataDevice(q));
data_device->add(client, id, 1);
}
+#endif
void QWaylandSeatPrivate::seat_destroy_resource(wl_seat::Resource *)
{
@@ -158,6 +168,7 @@ void QWaylandSeatPrivate::seat_get_touch(wl_seat::Resource *resource, uint32_t i
* \value Pointer The QWaylandSeat supports pointer input.
* \value Keyboard The QWaylandSeat supports keyboard input.
* \value Touch The QWaylandSeat supports touch input.
+ * \value DefaultCapabilities The QWaylandSeat has the default capabilities.
*/
/*!
@@ -363,6 +374,8 @@ QWaylandSurface *QWaylandSeat::keyboardFocus() const
/*!
* Sets the current keyboard focus to \a surface.
+ * Returns a boolean indicating if the operation
+ * was successful.
*/
bool QWaylandSeat::setKeyboardFocus(QWaylandSurface *surface)
{
@@ -377,8 +390,10 @@ bool QWaylandSeat::setKeyboardFocus(QWaylandSurface *surface)
d->keyboardFocus = surface;
if (!d->keyboard.isNull())
d->keyboard->setFocus(surface);
+#if QT_CONFIG(wayland_datadevice)
if (d->data_device)
d->data_device->setFocus(surface->client());
+#endif
emit keyboardFocusChanged(surface, oldSurface);
return true;
}
@@ -442,11 +457,13 @@ QWaylandCompositor *QWaylandSeat::compositor() const
/*!
* Returns the drag object for this QWaylandSeat.
*/
+#if QT_CONFIG(draganddrop)
QWaylandDrag *QWaylandSeat::drag() const
{
Q_D(const QWaylandSeat);
return d->drag_handle.data();
}
+#endif
/*!
* Returns the capability flags for this QWaylandSeat.
diff --git a/src/compositor/compositor_api/qwaylandseat.h b/src/compositor/compositor_api/qwaylandseat.h
index 49c63260e..63386f275 100644
--- a/src/compositor/compositor_api/qwaylandseat.h
+++ b/src/compositor/compositor_api/qwaylandseat.h
@@ -64,7 +64,9 @@ class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandSeat : public QWaylandObject
Q_OBJECT
Q_DECLARE_PRIVATE(QWaylandSeat)
+#if QT_CONFIG(draganddrop)
Q_PROPERTY(QWaylandDrag *drag READ drag CONSTANT)
+#endif
Q_PROPERTY(QWaylandKeymap *keymap READ keymap CONSTANT)
public:
enum CapabilityFlag {
@@ -115,7 +117,9 @@ public:
QWaylandCompositor *compositor() const;
+#if QT_CONFIG(draganddrop)
QWaylandDrag *drag() const;
+#endif
QWaylandSeat::CapabilityFlags capabilities() const;
diff --git a/src/compositor/compositor_api/qwaylandseat_p.h b/src/compositor/compositor_api/qwaylandseat_p.h
index 4e0b61ba5..689c1b160 100644
--- a/src/compositor/compositor_api/qwaylandseat_p.h
+++ b/src/compositor/compositor_api/qwaylandseat_p.h
@@ -89,12 +89,14 @@ public:
QWaylandSeatPrivate(QWaylandSeat *seat);
~QWaylandSeatPrivate();
- void clientRequestedDataDevice(QtWayland::DataDeviceManager *dndSelection, struct wl_client *client, uint32_t id);
void setCapabilities(QWaylandSeat::CapabilityFlags caps);
static QWaylandSeatPrivate *get(QWaylandSeat *device) { return device->d_func(); }
+#if QT_CONFIG(wayland_datadevice)
+ void clientRequestedDataDevice(QtWayland::DataDeviceManager *dndSelection, struct wl_client *client, uint32_t id);
QtWayland::DataDevice *dataDevice() const { return data_device.data(); }
+#endif
protected:
void seat_bind_resource(wl_seat::Resource *resource) override;
@@ -118,8 +120,12 @@ private:
QScopedPointer<QWaylandPointer> pointer;
QScopedPointer<QWaylandKeyboard> keyboard;
QScopedPointer<QWaylandTouch> touch;
+#if QT_CONFIG(wayland_datadevice)
QScopedPointer<QtWayland::DataDevice> data_device;
+# if QT_CONFIG(draganddrop)
QScopedPointer<QWaylandDrag> drag_handle;
+# endif
+#endif
QScopedPointer<QWaylandKeymap> keymap;
};
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp
index a576e0d6c..d6115e363 100644
--- a/src/compositor/compositor_api/qwaylandsurface.cpp
+++ b/src/compositor/compositor_api/qwaylandsurface.cpp
@@ -38,10 +38,13 @@
#include "qwaylandsurface.h"
#include "qwaylandsurface_p.h"
-#include "wayland_wrapper/qwldatadevice_p.h"
-#include "wayland_wrapper/qwldatadevicemanager_p.h"
#include "wayland_wrapper/qwlbuffermanager_p.h"
#include "wayland_wrapper/qwlregion_p.h"
+#include <QtWaylandCompositor/private/qtwaylandcompositorglobal_p.h>
+#if QT_CONFIG(wayland_datadevice)
+#include "wayland_wrapper/qwldatadevice_p.h"
+#include "wayland_wrapper/qwldatadevicemanager_p.h"
+#endif
#include "extensions/qwlextendedsurface_p.h"
#include "qwaylandinputmethodcontrol_p.h"
@@ -682,6 +685,7 @@ QWaylandInputMethodControl *QWaylandSurface::inputMethodControl() const
* this is done automatically when the surface receives keyboard focus, this
* function is useful for updating clients which do not have keyboard focus.
*/
+#if QT_CONFIG(clipboard)
void QWaylandSurface::updateSelection()
{
Q_D(QWaylandSurface);
@@ -694,6 +698,7 @@ void QWaylandSurface::updateSelection()
}
}
}
+#endif
/*!
* Returns this QWaylandSurface's primary view.
diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h
index e6a16ffe1..961d200b9 100644
--- a/src/compositor/compositor_api/qwaylandsurface.h
+++ b/src/compositor/compositor_api/qwaylandsurface.h
@@ -140,7 +140,9 @@ public:
#endif
public Q_SLOTS:
+#if QT_CONFIG(clipboard)
void updateSelection();
+#endif
protected:
QWaylandSurface(QWaylandSurfacePrivate &dptr);
diff --git a/src/compositor/configure.json b/src/compositor/configure.json
index 52365fe37..733ccfc03 100644
--- a/src/compositor/configure.json
+++ b/src/compositor/configure.json
@@ -61,6 +61,10 @@
"condition": "!config.win32 && libs.wayland-server && tests.wayland-scanner",
"output": [ "privateFeature" ]
},
+ "wayland-datadevice": {
+ "condition": "features.draganddrop || features.clipboard",
+ "output": [ "privateFeature" ]
+ },
"wayland-egl": {
"label": "EGL",
"condition": "features.wayland-server && features.opengl && features.egl && libs.wayland-egl",
diff --git a/src/compositor/extensions/qwaylandivisurface.h b/src/compositor/extensions/qwaylandivisurface.h
index e362eecb9..3fd0ede93 100644
--- a/src/compositor/extensions/qwaylandivisurface.h
+++ b/src/compositor/extensions/qwaylandivisurface.h
@@ -39,7 +39,7 @@
#include <QtWaylandCompositor/QWaylandShellSurface>
-class wl_resource;
+struct wl_resource;
QT_BEGIN_NAMESPACE
diff --git a/src/compositor/extensions/qwaylandxdgshellv5.cpp b/src/compositor/extensions/qwaylandxdgshellv5.cpp
index 82171c40b..6a09a6c77 100644
--- a/src/compositor/extensions/qwaylandxdgshellv5.cpp
+++ b/src/compositor/extensions/qwaylandxdgshellv5.cpp
@@ -1070,7 +1070,7 @@ QWaylandXdgPopupV5::QWaylandXdgPopupV5()
/*!
* Constructs a QWaylandXdgPopupV5, associating it with \a xdgShell at the specified \a position
- * for \a surface and initializes it with the given \a parentSurface and \a resource.
+ * for \a surface, and initializes it with the given \a parentSurface and \a resource.
*/
QWaylandXdgPopupV5::QWaylandXdgPopupV5(QWaylandXdgShellV5 *xdgShell, QWaylandSurface *surface,
QWaylandSurface *parentSurface, const QPoint &position, const QWaylandResource &resource)
@@ -1087,8 +1087,8 @@ QWaylandXdgPopupV5::QWaylandXdgPopupV5(QWaylandXdgShellV5 *xdgShell, QWaylandSur
*/
/*!
- * Initializes the QWaylandXdgPopupV5, associating it with the given \a shell \a surface,
- * \a parentSurface and \a resource.
+ * Initializes the QWaylandXdgPopupV5, associating it with the given \a shell, \a surface,
+ * \a parentSurface, \a position, and \a resource.
*/
void QWaylandXdgPopupV5::initialize(QWaylandXdgShellV5 *shell, QWaylandSurface *surface, QWaylandSurface *parentSurface,
const QPoint& position, const QWaylandResource &resource)
diff --git a/src/compositor/wayland_wrapper/qwlclientbuffer_p.h b/src/compositor/wayland_wrapper/qwlclientbuffer_p.h
index efb2eb18b..dbc8a0b7c 100644
--- a/src/compositor/wayland_wrapper/qwlclientbuffer_p.h
+++ b/src/compositor/wayland_wrapper/qwlclientbuffer_p.h
@@ -130,7 +130,7 @@ public:
QSize size() const override;
QWaylandSurface::Origin origin() const override;
- QImage image() const;
+ QImage image() const override;
#if QT_CONFIG(opengl)
QOpenGLTexture *toOpenGlTexture(int plane = 0) override;
diff --git a/src/compositor/wayland_wrapper/qwldatadevice.cpp b/src/compositor/wayland_wrapper/qwldatadevice.cpp
index 0d196b82e..3787edf58 100644
--- a/src/compositor/wayland_wrapper/qwldatadevice.cpp
+++ b/src/compositor/wayland_wrapper/qwldatadevice.cpp
@@ -41,7 +41,9 @@
#include "qwaylandsurface_p.h"
#include "qwldatadevicemanager_p.h"
+#if QT_CONFIG(draganddrop)
#include "qwaylanddrag.h"
+#endif
#include "qwaylandview.h"
#include <QtWaylandCompositor/QWaylandClient>
#include <QtWaylandCompositor/private/qwaylandcompositor_p.h>
@@ -60,12 +62,14 @@ DataDevice::DataDevice(QWaylandSeat *seat)
, m_compositor(seat->compositor())
, m_seat(seat)
, m_selectionSource(0)
+#if QT_CONFIG(draganddrop)
, m_dragClient(0)
, m_dragDataSource(0)
, m_dragFocus(0)
, m_dragFocusResource(0)
, m_dragIcon(0)
, m_dragOrigin(nullptr)
+#endif
{
}
@@ -85,6 +89,13 @@ void DataDevice::setFocus(QWaylandClient *focusClient)
}
}
+void DataDevice::sourceDestroyed(DataSource *source)
+{
+ if (m_selectionSource == source)
+ m_selectionSource = 0;
+}
+
+#if QT_CONFIG(draganddrop)
void DataDevice::setDragFocus(QWaylandSurface *focus, const QPointF &localPosition)
{
if (m_dragFocusResource) {
@@ -129,12 +140,6 @@ QWaylandSurface *DataDevice::dragOrigin() const
return m_dragOrigin;
}
-void DataDevice::sourceDestroyed(DataSource *source)
-{
- if (m_selectionSource == source)
- m_selectionSource = 0;
-}
-
void DataDevice::dragMove(QWaylandSurface *target, const QPointF &pos)
{
if (target != m_dragFocus)
@@ -177,6 +182,15 @@ void DataDevice::data_device_start_drag(Resource *resource, struct ::wl_resource
//### need to verify that we have an implicit grab with this serial
}
+void DataDevice::setDragIcon(QWaylandSurface *icon)
+{
+ if (icon == m_dragIcon)
+ return;
+ m_dragIcon = icon;
+ Q_EMIT m_seat->drag()->iconChanged();
+}
+#endif // QT_CONFIG(draganddrop)
+
void DataDevice::data_device_set_selection(Resource *, struct ::wl_resource *source, uint32_t serial)
{
Q_UNUSED(serial);
@@ -202,13 +216,6 @@ void DataDevice::data_device_set_selection(Resource *, struct ::wl_resource *sou
}
}
-void DataDevice::setDragIcon(QWaylandSurface *icon)
-{
- if (icon == m_dragIcon)
- return;
- m_dragIcon = icon;
- Q_EMIT m_seat->drag()->iconChanged();
-}
}
diff --git a/src/compositor/wayland_wrapper/qwldatadevice_p.h b/src/compositor/wayland_wrapper/qwldatadevice_p.h
index 57a9c0a80..5c37058df 100644
--- a/src/compositor/wayland_wrapper/qwldatadevice_p.h
+++ b/src/compositor/wayland_wrapper/qwldatadevice_p.h
@@ -49,8 +49,11 @@
//
#include <QtWaylandCompositor/private/qwayland-server-wayland.h>
+#include <QtWaylandCompositor/private/qtwaylandcompositorglobal_p.h>
#include <QtWaylandCompositor/QWaylandSeat>
+QT_REQUIRE_CONFIG(wayland_datadevice);
+
QT_BEGIN_NAMESPACE
namespace QtWayland {
@@ -66,30 +69,36 @@ public:
DataDevice(QWaylandSeat *seat);
void setFocus(QWaylandClient *client);
+ void sourceDestroyed(DataSource *source);
+#if QT_CONFIG(draganddrop)
void setDragFocus(QWaylandSurface *focus, const QPointF &localPosition);
QWaylandSurface *dragIcon() const;
QWaylandSurface *dragOrigin() const;
- void sourceDestroyed(DataSource *source);
-
void dragMove(QWaylandSurface *target, const QPointF &pos);
void drop();
void cancelDrag();
+#endif
protected:
+#if QT_CONFIG(draganddrop)
void data_device_start_drag(Resource *resource, struct ::wl_resource *source, struct ::wl_resource *origin, struct ::wl_resource *icon, uint32_t serial) override;
+#endif
void data_device_set_selection(Resource *resource, struct ::wl_resource *source, uint32_t serial) override;
private:
+#if QT_CONFIG(draganddrop)
void setDragIcon(QWaylandSurface *icon);
+#endif
QWaylandCompositor *m_compositor;
QWaylandSeat *m_seat;
DataSource *m_selectionSource;
+#if QT_CONFIG(draganddrop)
struct ::wl_client *m_dragClient;
DataSource *m_dragDataSource;
@@ -98,6 +107,7 @@ private:
QWaylandSurface *m_dragIcon;
QWaylandSurface *m_dragOrigin;
+#endif
};
}
diff --git a/src/compositor/wayland_wrapper/qwldatadevicemanager_p.h b/src/compositor/wayland_wrapper/qwldatadevicemanager_p.h
index 483731dfd..39037b7a5 100644
--- a/src/compositor/wayland_wrapper/qwldatadevicemanager_p.h
+++ b/src/compositor/wayland_wrapper/qwldatadevicemanager_p.h
@@ -56,6 +56,9 @@
#include <QtWaylandCompositor/QWaylandCompositor>
#include <QtWaylandCompositor/private/qwayland-server-wayland.h>
+#include <QtWaylandCompositor/private/qtwaylandcompositorglobal_p.h>
+
+QT_REQUIRE_CONFIG(wayland_datadevice);
QT_BEGIN_NAMESPACE
diff --git a/src/compositor/wayland_wrapper/qwldataoffer_p.h b/src/compositor/wayland_wrapper/qwldataoffer_p.h
index dc1c84fe0..bb0990824 100644
--- a/src/compositor/wayland_wrapper/qwldataoffer_p.h
+++ b/src/compositor/wayland_wrapper/qwldataoffer_p.h
@@ -50,6 +50,9 @@
#include <QPointer>
#include <QtWaylandCompositor/private/qwayland-server-wayland.h>
+#include <QtWaylandCompositor/private/qtwaylandcompositorglobal_p.h>
+
+QT_REQUIRE_CONFIG(wayland_datadevice);
QT_BEGIN_NAMESPACE
diff --git a/src/compositor/wayland_wrapper/qwldatasource_p.h b/src/compositor/wayland_wrapper/qwldatasource_p.h
index b548a2411..d59e01e08 100644
--- a/src/compositor/wayland_wrapper/qwldatasource_p.h
+++ b/src/compositor/wayland_wrapper/qwldatasource_p.h
@@ -49,9 +49,12 @@
//
#include <QtWaylandCompositor/private/qwayland-server-wayland.h>
+#include <QtWaylandCompositor/private/qtwaylandcompositorglobal_p.h>
#include <QObject>
#include <QtCore/QList>
+QT_REQUIRE_CONFIG(wayland_datadevice);
+
QT_BEGIN_NAMESPACE
namespace QtWayland {
diff --git a/src/compositor/wayland_wrapper/wayland_wrapper.pri b/src/compositor/wayland_wrapper/wayland_wrapper.pri
index 48e55e513..e19ea253a 100644
--- a/src/compositor/wayland_wrapper/wayland_wrapper.pri
+++ b/src/compositor/wayland_wrapper/wayland_wrapper.pri
@@ -1,27 +1,33 @@
CONFIG += wayland-scanner
-WAYLANDSERVERSOURCES += \
+WAYLANDSERVERSOURCES_SYSTEM += \
../3rdparty/protocol/wayland.xml \
HEADERS += \
wayland_wrapper/qwlbuffermanager_p.h \
wayland_wrapper/qwlclientbuffer_p.h \
- wayland_wrapper/qwldatadevice_p.h \
- wayland_wrapper/qwldatadevicemanager_p.h \
- wayland_wrapper/qwldataoffer_p.h \
- wayland_wrapper/qwldatasource_p.h \
wayland_wrapper/qwlregion_p.h \
../shared/qwaylandxkb_p.h \
SOURCES += \
wayland_wrapper/qwlbuffermanager.cpp \
wayland_wrapper/qwlclientbuffer.cpp \
- wayland_wrapper/qwldatadevice.cpp \
- wayland_wrapper/qwldatadevicemanager.cpp \
- wayland_wrapper/qwldataoffer.cpp \
- wayland_wrapper/qwldatasource.cpp \
wayland_wrapper/qwlregion.cpp \
../shared/qwaylandxkb.cpp \
+qtConfig(wayland-datadevice) {
+ HEADERS += \
+ wayland_wrapper/qwldatadevice_p.h \
+ wayland_wrapper/qwldatadevicemanager_p.h \
+ wayland_wrapper/qwldataoffer_p.h \
+ wayland_wrapper/qwldatasource_p.h
+
+ SOURCES += \
+ wayland_wrapper/qwldatadevice.cpp \
+ wayland_wrapper/qwldatadevicemanager.cpp \
+ wayland_wrapper/qwldataoffer.cpp \
+ wayland_wrapper/qwldatasource.cpp
+}
+
INCLUDEPATH += wayland_wrapper
qtConfig(xkbcommon-evdev): \
diff --git a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.cpp b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.cpp
index cfc0cda10..431cb14c1 100644
--- a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.cpp
+++ b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.cpp
@@ -57,12 +57,10 @@ namespace QtWaylandClient {
QWaylandXCompositeEGLWindow::QWaylandXCompositeEGLWindow(QWindow *window, QWaylandXCompositeEGLClientBufferIntegration *glxIntegration)
: QWaylandWindow(window)
, m_glxIntegration(glxIntegration)
- , m_context(0)
, m_buffer(0)
, m_xWindow(0)
, m_config(q_configFromGLFormat(glxIntegration->eglDisplay(), window->format(), true, EGL_WINDOW_BIT | EGL_PIXMAP_BIT))
, m_surface(0)
- , mBuffer(0)
{
}
diff --git a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.h b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.h
index 5b7d492c5..90b4cc73e 100644
--- a/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.h
+++ b/src/hardwareintegration/client/xcomposite-egl/qwaylandxcompositeeglwindow.h
@@ -66,13 +66,11 @@ private:
void createEglSurface();
QWaylandXCompositeEGLClientBufferIntegration *m_glxIntegration;
- QWaylandXCompositeEGLContext *m_context;
QWaylandBuffer *m_buffer;
Window m_xWindow;
EGLConfig m_config;
EGLSurface m_surface;
- QWaylandBuffer *mBuffer;
};
}
diff --git a/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.h b/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.h
index d9072b069..6286f0f20 100644
--- a/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.h
+++ b/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.h
@@ -96,7 +96,7 @@ public:
DrmEglServerBufferIntegration();
~DrmEglServerBufferIntegration();
- void initializeHardware(QWaylandCompositor *);
+ void initializeHardware(QWaylandCompositor *) override;
bool supportsFormat(QtWayland::ServerBuffer::Format format) const override;
QtWayland::ServerBuffer *createServerBuffer(const QSize &size, QtWayland::ServerBuffer::Format format) override;
diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
index 1e6723a04..2b68ccec9 100644
--- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
+++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
@@ -59,6 +59,10 @@
#define EGL_WAYLAND_BUFFER_WL 0x31D5
#endif
+#ifndef EGL_WAYLAND_EGLSTREAM_WL
+#define EGL_WAYLAND_EGLSTREAM_WL 0x334B
+#endif
+
#ifndef EGL_WAYLAND_PLANE_WL
#define EGL_WAYLAND_PLANE_WL 0x31D6
#endif
@@ -168,7 +172,7 @@ public:
void initBuffer(WaylandEglClientBuffer *buffer);
void init_egl_texture(WaylandEglClientBuffer *buffer, EGLint format);
- void init_egl_fd_texture(WaylandEglClientBuffer *buffer, EGLNativeFileDescriptorKHR streamFd);
+ void init_egl_fd_texture(WaylandEglClientBuffer *buffer, wl_resource *bufferHandle);
void register_buffer(struct ::wl_resource *buffer, BufferState state);
EGLDisplay egl_display;
@@ -281,16 +285,26 @@ void WaylandEglClientBufferIntegrationPrivate::init_egl_texture(WaylandEglClient
}
}
-void WaylandEglClientBufferIntegrationPrivate::init_egl_fd_texture(WaylandEglClientBuffer *buffer, EGLNativeFileDescriptorKHR streamFd)
+void WaylandEglClientBufferIntegrationPrivate::init_egl_fd_texture(WaylandEglClientBuffer *buffer, struct ::wl_resource *bufferHandle)
{
//EglStreams case
BufferState &state = *buffer->d;
state.egl_format = EGL_TEXTURE_EXTERNAL_WL;
state.isYInverted = false;
- state.egl_stream = funcs->create_stream_from_file_descriptor(egl_display, streamFd);
- close(streamFd);
+ EGLNativeFileDescriptorKHR streamFd = EGL_NO_FILE_DESCRIPTOR_KHR;
+
+ if (egl_query_wayland_buffer(egl_display, bufferHandle, EGL_WAYLAND_BUFFER_WL, &streamFd)) {
+ state.egl_stream = funcs->create_stream_from_file_descriptor(egl_display, streamFd);
+ close(streamFd);
+ } else {
+ EGLAttrib stream_attribs[] = {
+ EGL_WAYLAND_EGLSTREAM_WL, (EGLAttrib)bufferHandle,
+ EGL_NONE
+ };
+ state.egl_stream = funcs->create_stream_attrib_nv(egl_display, stream_attribs);
+ }
if (state.egl_stream == EGL_NO_STREAM_KHR) {
qWarning("%s:%d: eglCreateStreamFromFileDescriptorKHR failed: 0x%x", Q_FUNC_INFO, __LINE__, eglGetError());
@@ -486,10 +500,8 @@ void WaylandEglClientBuffer::setCommitted(QRegion &damage)
{
ClientBuffer::setCommitted(damage);
if (d->eglMode == BufferState::ModeNone) {
- EGLNativeFileDescriptorKHR streamFd = EGL_NO_FILE_DESCRIPTOR_KHR;
auto *p = WaylandEglClientBufferIntegrationPrivate::get(m_integration);
- if (p->egl_query_wayland_buffer(p->egl_display, waylandBufferHandle(), EGL_WAYLAND_BUFFER_WL, &streamFd))
- p->init_egl_fd_texture(this, streamFd);
+ p->init_egl_fd_texture(this, waylandBufferHandle());
}
}
diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h
index e0235d84c..846cbc3a4 100644
--- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h
+++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h
@@ -53,7 +53,7 @@ public:
void initializeHardware(struct ::wl_display *display) override;
- QtWayland::ClientBuffer *createBufferFor(wl_resource *buffer);
+ QtWayland::ClientBuffer *createBufferFor(wl_resource *buffer) override;
private:
Q_DISABLE_COPY(WaylandEglClientBufferIntegration)
diff --git a/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h b/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h
index fb869b2e7..55e02abe7 100644
--- a/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h
+++ b/src/hardwareintegration/compositor/xcomposite-egl/xcompositeeglintegration.h
@@ -67,8 +67,8 @@ class XCompositeEglClientBuffer : public QtWayland::ClientBuffer
public:
XCompositeEglClientBuffer(XCompositeEglClientBufferIntegration *integration, wl_resource *bufferResource);
- QSize size() const;
- QWaylandSurface::Origin origin() const;
+ QSize size() const override;
+ QWaylandSurface::Origin origin() const override;
QOpenGLTexture *toOpenGlTexture(int plane) override;
QWaylandBufferRef::BufferFormatEgl bufferFormatEgl() const override {
return QWaylandBufferRef::BufferFormatEgl_RGBA;
diff --git a/src/imports/compositor/qwaylandquickcompositorplugin.cpp b/src/imports/compositor/qwaylandquickcompositorplugin.cpp
index f181decf7..9c2066a75 100644
--- a/src/imports/compositor/qwaylandquickcompositorplugin.cpp
+++ b/src/imports/compositor/qwaylandquickcompositorplugin.cpp
@@ -47,7 +47,9 @@
#include <QtWaylandCompositor/QWaylandCompositorExtension>
#include <QtWaylandCompositor/QWaylandQuickExtension>
#include <QtWaylandCompositor/QWaylandSeat>
+#if QT_CONFIG(draganddrop)
#include <QtWaylandCompositor/QWaylandDrag>
+#endif
#include <QtWaylandCompositor/QWaylandKeymap>
#include <QtWaylandCompositor/QWaylandQuickShellSurfaceItem>
#include <QtWaylandCompositor/QWaylandResource>
@@ -127,7 +129,9 @@ public:
qmlRegisterUncreatableType<QWaylandClient>(uri, 1, 0, "WaylandClient", QObject::tr("Cannot create instance of WaylandClient"));
qmlRegisterUncreatableType<QWaylandOutput>(uri, 1, 0, "WaylandOutputBase", QObject::tr("Cannot create instance of WaylandOutputBase, use WaylandOutput instead"));
qmlRegisterUncreatableType<QWaylandSeat>(uri, 1, 0, "WaylandSeat", QObject::tr("Cannot create instance of WaylandSeat"));
+#if QT_CONFIG(draganddrop)
qmlRegisterUncreatableType<QWaylandDrag>(uri, 1, 0, "WaylandDrag", QObject::tr("Cannot create instance of WaylandDrag"));
+#endif
qmlRegisterUncreatableType<QWaylandCompositor>(uri, 1, 0, "WaylandCompositorBase", QObject::tr("Cannot create instance of WaylandCompositorBase, use WaylandCompositor instead"));
qmlRegisterUncreatableType<QWaylandSurface>(uri, 1, 0, "WaylandSurfaceBase", QObject::tr("Cannot create instance of WaylandSurfaceBase, use WaylandSurface instead"));
qmlRegisterUncreatableType<QWaylandShell>(uri, 1, 0, "Shell", QObject::tr("Cannot create instance of Shell"));
diff --git a/src/imports/imports.pro b/src/imports/imports.pro
index 42228475c..c57c95d20 100644
--- a/src/imports/imports.pro
+++ b/src/imports/imports.pro
@@ -1,3 +1,3 @@
TEMPLATE = subdirs
-SUBDIRS += compositor
+qtHaveModule(quick): SUBDIRS += compositor
diff --git a/src/plugins/decorations/bradient/main.cpp b/src/plugins/decorations/bradient/main.cpp
index 074c74522..ceb07c803 100644
--- a/src/plugins/decorations/bradient/main.cpp
+++ b/src/plugins/decorations/bradient/main.cpp
@@ -211,7 +211,6 @@ void QWaylandBradientDecoration::paint(QPaintDevice *device)
p.setRenderHint(QPainter::Antialiasing);
// Title bar
- QPoint gradCenter(top.center()+ QPoint(30, 60));
QLinearGradient grad(top.topLeft(), top.bottomLeft());
QColor base(m_backgroundColor);
grad.setColorAt(0, base.lighter(100));
diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp
index 6103e6bea..612924d5b 100644
--- a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp
+++ b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.cpp
@@ -91,7 +91,7 @@ bool QWaylandIviShellIntegration::initialize(QWaylandDisplay *display)
uint32_t QWaylandIviShellIntegration::getNextUniqueSurfaceId()
{
const uint32_t PID_MAX_EXPONENTIATION = 22; // 22 bit shift operation
- const uint32_t ID_LIMIT = 2 ^ (32 - PID_MAX_EXPONENTIATION); // 10 bit is uniqeu id
+ const uint32_t ID_LIMIT = 1 << (32 - PID_MAX_EXPONENTIATION); // 10 bit is unique id
QMutexLocker locker(&m_mutex);
if (m_lastSurfaceId == 0) {
diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h
index 5a0bfbdc0..cb3b1bec2 100644
--- a/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h
+++ b/src/plugins/shellintegration/ivi-shell/qwaylandivishellintegration.h
@@ -53,7 +53,7 @@ class Q_WAYLAND_CLIENT_EXPORT QWaylandIviShellIntegration : public QWaylandShell
public:
QWaylandIviShellIntegration();
~QWaylandIviShellIntegration();
- bool initialize(QWaylandDisplay *display);
+ bool initialize(QWaylandDisplay *display) override;
virtual QWaylandShellSurface *createShellSurface(QWaylandWindow *window) override;
private:
diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivisurface.cpp b/src/plugins/shellintegration/ivi-shell/qwaylandivisurface.cpp
index ecc47e0b2..a2c778825 100644
--- a/src/plugins/shellintegration/ivi-shell/qwaylandivisurface.cpp
+++ b/src/plugins/shellintegration/ivi-shell/qwaylandivisurface.cpp
@@ -89,6 +89,11 @@ void QWaylandIviSurface::ivi_surface_configure(int32_t width, int32_t height)
this->m_window->configure(0, width, height);
}
+void QWaylandIviSurface::ivi_controller_surface_visibility(int32_t visibility)
+{
+ this->m_window->window()->setVisible(visibility != 0);
+}
+
}
QT_END_NAMESPACE
diff --git a/src/plugins/shellintegration/ivi-shell/qwaylandivisurface_p.h b/src/plugins/shellintegration/ivi-shell/qwaylandivisurface_p.h
index f96eb3c10..d7aa2a694 100644
--- a/src/plugins/shellintegration/ivi-shell/qwaylandivisurface_p.h
+++ b/src/plugins/shellintegration/ivi-shell/qwaylandivisurface_p.h
@@ -61,6 +61,7 @@ public:
private:
void createExtendedSurface(QWaylandWindow *window);
virtual void ivi_surface_configure(int32_t width, int32_t height) override;
+ void ivi_controller_surface_visibility(int32_t visibility) override;
QWaylandWindow *m_window;
QWaylandExtendedSurface *m_extendedWindow;
diff --git a/tests/auto/client/client/tst_client.cpp b/tests/auto/client/client/tst_client.cpp
index 5e0db1a14..0c9c007a2 100644
--- a/tests/auto/client/client/tst_client.cpp
+++ b/tests/auto/client/client/tst_client.cpp
@@ -300,6 +300,7 @@ void tst_WaylandClient::touchDrag()
const int id = 0;
compositor->sendTouchDown(surface, QPoint(10, 10), id);
+ compositor->sendTouchFrame(surface);
compositor->sendTouchMotion(surface, QPoint(20, 20), id);
compositor->sendTouchFrame(surface);
compositor->waitForStartDrag();
diff --git a/tests/auto/compositor/compositor/tst_compositor.cpp b/tests/auto/compositor/compositor/tst_compositor.cpp
index b3ceb9e5c..3d7d2dab9 100644
--- a/tests/auto/compositor/compositor/tst_compositor.cpp
+++ b/tests/auto/compositor/compositor/tst_compositor.cpp
@@ -451,7 +451,7 @@ void tst_WaylandCompositor::advertisesXdgShellSupport()
compositor.create();
MockClient client;
- QTRY_VERIFY(&client.xdgShell);
+ QTRY_VERIFY(client.xdgShell);
}
void tst_WaylandCompositor::createsXdgSurfaces()
@@ -460,7 +460,7 @@ void tst_WaylandCompositor::createsXdgSurfaces()
compositor.create();
MockClient client;
- QTRY_VERIFY(&client.xdgShell);
+ QTRY_VERIFY(client.xdgShell);
QSignalSpy xdgSurfaceCreatedSpy(&compositor.xdgShell, &QWaylandXdgShellV5::xdgSurfaceCreated);
QWaylandXdgSurfaceV5 *xdgSurface = nullptr;
@@ -648,7 +648,7 @@ void tst_WaylandCompositor::advertisesIviApplicationSupport()
compositor.create();
MockClient client;
- QTRY_VERIFY(&client.iviApplication);
+ QTRY_VERIFY(client.iviApplication);
}
void tst_WaylandCompositor::createsIviSurfaces()
@@ -657,7 +657,7 @@ void tst_WaylandCompositor::createsIviSurfaces()
compositor.create();
MockClient client;
- QTRY_VERIFY(&client.iviApplication);
+ QTRY_VERIFY(client.iviApplication);
QSignalSpy iviSurfaceCreatedSpy(&compositor.iviApplication, &QWaylandIviApplication::iviSurfaceRequested);
QWaylandIviSurface *iviSurface = nullptr;
@@ -740,7 +740,7 @@ void tst_WaylandCompositor::sendsIviConfigure()
compositor.create();
MockClient client;
- QTRY_VERIFY(&client.iviApplication);
+ QTRY_VERIFY(client.iviApplication);
QWaylandIviSurface *iviSurface = nullptr;
QObject::connect(&compositor.iviApplication, &QWaylandIviApplication::iviSurfaceCreated, [&](QWaylandIviSurface *s) {
@@ -764,7 +764,7 @@ void tst_WaylandCompositor::destroysIviSurfaces()
compositor.create();
MockClient client;
- QTRY_VERIFY(&client.iviApplication);
+ QTRY_VERIFY(client.iviApplication);
QWaylandIviSurface *iviSurface = nullptr;
QObject::connect(&compositor.iviApplication, &QWaylandIviApplication::iviSurfaceCreated, [&](QWaylandIviSurface *s) {