Remove touch-extension protocol
This removes the special case touch-extension protocol for Qt. Touch input should work with all compositors, not just Qt-based, through the wl_touch interface, and the world has come a long way since this was added. Task-number: QTBUG-133223 Change-Id: I89d404ac87270d8b3c6a9015d3a72fac5919b0b9 Reviewed-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
This commit is contained in:
parent
8de2aae8c1
commit
d7731dd110
@ -1,38 +0,0 @@
|
|||||||
<protocol name="touch_extension">
|
|
||||||
|
|
||||||
<copyright>
|
|
||||||
Copyright (C) 2015 The Qt Company Ltd.
|
|
||||||
SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
||||||
</copyright>
|
|
||||||
|
|
||||||
<interface name="qt_touch_extension" version="1">
|
|
||||||
<event name="touch">
|
|
||||||
<arg name="time" type="uint" />
|
|
||||||
<arg name="id" type="uint" />
|
|
||||||
<arg name="state" type="uint" />
|
|
||||||
<arg name="x" type="int" />
|
|
||||||
<arg name="y" type="int" />
|
|
||||||
<arg name="normalized_x" type="int" />
|
|
||||||
<arg name="normalized_y" type="int" />
|
|
||||||
<arg name="width" type="int" />
|
|
||||||
<arg name="height" type="int" />
|
|
||||||
<arg name="pressure" type="uint" />
|
|
||||||
<arg name="velocity_x" type="int" />
|
|
||||||
<arg name="velocity_y" type="int" />
|
|
||||||
<arg name="flags" type="uint" />
|
|
||||||
<arg name="rawdata" type="array" />
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<enum name="flags">
|
|
||||||
<entry name="mouse_from_touch" value="0x1" />
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
<event name="configure">
|
|
||||||
<arg name="flags" type="uint" />
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<request name="dummy">
|
|
||||||
</request>
|
|
||||||
|
|
||||||
</interface>
|
|
||||||
</protocol>
|
|
@ -52,7 +52,6 @@ qt_internal_add_module(WaylandClient
|
|||||||
qwaylandshmwindow.cpp qwaylandshmwindow_p.h
|
qwaylandshmwindow.cpp qwaylandshmwindow_p.h
|
||||||
qwaylandsubsurface.cpp qwaylandsubsurface_p.h
|
qwaylandsubsurface.cpp qwaylandsubsurface_p.h
|
||||||
qwaylandsurface.cpp qwaylandsurface_p.h
|
qwaylandsurface.cpp qwaylandsurface_p.h
|
||||||
qwaylandtouch.cpp qwaylandtouch_p.h
|
|
||||||
qwaylandviewport.cpp qwaylandviewport_p.h
|
qwaylandviewport.cpp qwaylandviewport_p.h
|
||||||
qwaylandwindow.cpp qwaylandwindow_p.h
|
qwaylandwindow.cpp qwaylandwindow_p.h
|
||||||
qwaylandwindowmanagerintegration.cpp qwaylandwindowmanagerintegration_p.h
|
qwaylandwindowmanagerintegration.cpp qwaylandwindowmanagerintegration_p.h
|
||||||
@ -117,7 +116,6 @@ qt6_generate_wayland_protocol_client_sources(WaylandClient
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/protocol/xdg-toplevel-drag/xdg-toplevel-drag-v1.xml
|
${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/protocol/xdg-toplevel-drag/xdg-toplevel-drag-v1.xml
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../extensions/qt-text-input-method-unstable-v1.xml
|
${CMAKE_CURRENT_SOURCE_DIR}/../extensions/qt-text-input-method-unstable-v1.xml
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../extensions/qt-windowmanager.xml
|
${CMAKE_CURRENT_SOURCE_DIR}/../extensions/qt-windowmanager.xml
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../extensions/touch-extension.xml
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardwareintegration/../../extensions/hardware-integration.xml
|
${CMAKE_CURRENT_SOURCE_DIR}/hardwareintegration/../../extensions/hardware-integration.xml
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardwareintegration/../../extensions/server-buffer-extension.xml
|
${CMAKE_CURRENT_SOURCE_DIR}/hardwareintegration/../../extensions/server-buffer-extension.xml
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/protocol/color-management/xx-color-management-v4.xml
|
${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/protocol/color-management/xx-color-management-v4.xml
|
||||||
|
@ -39,7 +39,6 @@
|
|||||||
|
|
||||||
#include "qwaylandpointergestures_p.h"
|
#include "qwaylandpointergestures_p.h"
|
||||||
#include "qwaylandsubsurface_p.h"
|
#include "qwaylandsubsurface_p.h"
|
||||||
#include "qwaylandtouch_p.h"
|
|
||||||
#if QT_CONFIG(tabletevent)
|
#if QT_CONFIG(tabletevent)
|
||||||
#include "qwaylandtabletv2_p.h"
|
#include "qwaylandtabletv2_p.h"
|
||||||
#endif
|
#endif
|
||||||
@ -668,8 +667,6 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
|
|||||||
mGlobals.subCompositor.reset(
|
mGlobals.subCompositor.reset(
|
||||||
new WithDestructor<QtWayland::wl_subcompositor, wl_subcompositor_destroy>(registry,
|
new WithDestructor<QtWayland::wl_subcompositor, wl_subcompositor_destroy>(registry,
|
||||||
id, 1));
|
id, 1));
|
||||||
} else if (interface == QLatin1String(QWaylandTouchExtension::interface()->name)) {
|
|
||||||
mGlobals.touchExtension.reset(new QWaylandTouchExtension(this, id));
|
|
||||||
#if QT_CONFIG(tabletevent)
|
#if QT_CONFIG(tabletevent)
|
||||||
} else if (interface == QLatin1String(QWaylandTabletManagerV2::interface()->name)) {
|
} else if (interface == QLatin1String(QWaylandTabletManagerV2::interface()->name)) {
|
||||||
mGlobals.tabletManager.reset(new QWaylandTabletManagerV2(this, id, qMin(1, int(version))));
|
mGlobals.tabletManager.reset(new QWaylandTabletManagerV2(this, id, qMin(1, int(version))));
|
||||||
|
@ -82,7 +82,6 @@ class QWaylandPrimarySelectionDeviceManagerV1;
|
|||||||
class QWaylandTabletManagerV2;
|
class QWaylandTabletManagerV2;
|
||||||
#endif
|
#endif
|
||||||
class QWaylandPointerGestures;
|
class QWaylandPointerGestures;
|
||||||
class QWaylandTouchExtension;
|
|
||||||
class QWaylandWindow;
|
class QWaylandWindow;
|
||||||
class QWaylandIntegration;
|
class QWaylandIntegration;
|
||||||
class QWaylandHardwareIntegration;
|
class QWaylandHardwareIntegration;
|
||||||
@ -174,10 +173,6 @@ public:
|
|||||||
{
|
{
|
||||||
return mGlobals.pointerGestures.get();
|
return mGlobals.pointerGestures.get();
|
||||||
}
|
}
|
||||||
QWaylandTouchExtension *touchExtension() const
|
|
||||||
{
|
|
||||||
return mGlobals.touchExtension.get();
|
|
||||||
}
|
|
||||||
QtWayland::qt_text_input_method_manager_v1 *textInputMethodManager() const
|
QtWayland::qt_text_input_method_manager_v1 *textInputMethodManager() const
|
||||||
{
|
{
|
||||||
return mGlobals.textInputMethodManager.get();
|
return mGlobals.textInputMethodManager.get();
|
||||||
@ -342,7 +337,6 @@ private:
|
|||||||
std::unique_ptr<QWaylandDataDeviceManager> dndSelectionHandler;
|
std::unique_ptr<QWaylandDataDeviceManager> dndSelectionHandler;
|
||||||
#endif
|
#endif
|
||||||
std::unique_ptr<QtWayland::wl_subcompositor> subCompositor;
|
std::unique_ptr<QtWayland::wl_subcompositor> subCompositor;
|
||||||
std::unique_ptr<QWaylandTouchExtension> touchExtension;
|
|
||||||
#if QT_CONFIG(tabletevent)
|
#if QT_CONFIG(tabletevent)
|
||||||
std::unique_ptr<QWaylandTabletManagerV2> tabletManager;
|
std::unique_ptr<QWaylandTabletManagerV2> tabletManager;
|
||||||
#endif
|
#endif
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
#include "qwaylandtabletv2_p.h"
|
#include "qwaylandtabletv2_p.h"
|
||||||
#endif
|
#endif
|
||||||
#include "qwaylandpointergestures_p.h"
|
#include "qwaylandpointergestures_p.h"
|
||||||
#include "qwaylandtouch_p.h"
|
|
||||||
#include "qwaylandscreen_p.h"
|
#include "qwaylandscreen_p.h"
|
||||||
#include "qwaylandcursor_p.h"
|
#include "qwaylandcursor_p.h"
|
||||||
#include "qwaylanddisplay_p.h"
|
#include "qwaylanddisplay_p.h"
|
||||||
@ -1457,10 +1456,6 @@ void QWaylandInputDevice::Touch::touch_cancel()
|
|||||||
{
|
{
|
||||||
mPendingTouchPoints.clear();
|
mPendingTouchPoints.clear();
|
||||||
|
|
||||||
QWaylandTouchExtension *touchExt = mParent->mQDisplay->touchExtension();
|
|
||||||
if (touchExt)
|
|
||||||
touchExt->touchCanceled();
|
|
||||||
|
|
||||||
mFocus = nullptr;
|
mFocus = nullptr;
|
||||||
QWindowSystemInterface::handleTouchCancelEvent(nullptr, mParent->mTouchDevice);
|
QWindowSystemInterface::handleTouchCancelEvent(nullptr, mParent->mTouchDevice);
|
||||||
}
|
}
|
||||||
|
@ -1,189 +0,0 @@
|
|||||||
// Copyright (C) 2016 The Qt Company Ltd.
|
|
||||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
|
|
||||||
|
|
||||||
#include "qwaylandtouch_p.h"
|
|
||||||
#include "qwaylandinputdevice_p.h"
|
|
||||||
#include "qwaylanddisplay_p.h"
|
|
||||||
#include "qwaylandsurface_p.h"
|
|
||||||
|
|
||||||
#include <QtGui/QPointingDevice>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
namespace QtWaylandClient {
|
|
||||||
|
|
||||||
QWaylandTouchExtension::QWaylandTouchExtension(QWaylandDisplay *display, uint32_t id)
|
|
||||||
: QtWayland::qt_touch_extension(display->wl_registry(), id, 1),
|
|
||||||
mDisplay(display),
|
|
||||||
mTouchDevice(nullptr),
|
|
||||||
mPointsLeft(0),
|
|
||||||
mFlags(0),
|
|
||||||
mMouseSourceId(-1),
|
|
||||||
mInputDevice(nullptr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QWaylandTouchExtension::~QWaylandTouchExtension()
|
|
||||||
{
|
|
||||||
qt_touch_extension_destroy(object());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWaylandTouchExtension::registerDevice(int caps)
|
|
||||||
{
|
|
||||||
// TODO number of touchpoints, actual name and ID
|
|
||||||
mTouchDevice = new QPointingDevice(QLatin1String("some touchscreen"), 0,
|
|
||||||
QInputDevice::DeviceType::TouchScreen, QPointingDevice::PointerType::Finger,
|
|
||||||
QInputDevice::Capabilities(caps), 10, 0);
|
|
||||||
QWindowSystemInterface::registerInputDevice(mTouchDevice);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline qreal fromFixed(int f)
|
|
||||||
{
|
|
||||||
return f / qreal(10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWaylandTouchExtension::touch_extension_touch(uint32_t time,
|
|
||||||
uint32_t id, uint32_t state, int32_t x, int32_t y,
|
|
||||||
int32_t normalized_x, int32_t normalized_y,
|
|
||||||
int32_t width, int32_t height, uint32_t pressure,
|
|
||||||
int32_t velocity_x, int32_t velocity_y,
|
|
||||||
uint32_t flags, wl_array *rawdata)
|
|
||||||
{
|
|
||||||
if (!mInputDevice) {
|
|
||||||
QList<QWaylandInputDevice *> inputDevices = mDisplay->inputDevices();
|
|
||||||
if (inputDevices.isEmpty()) {
|
|
||||||
qWarning("qt_touch_extension: handle_touch: No input devices");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mInputDevice = inputDevices.first();
|
|
||||||
}
|
|
||||||
QWaylandWindow *win = mInputDevice->touchFocus();
|
|
||||||
if (!win)
|
|
||||||
win = mInputDevice->pointerFocus();
|
|
||||||
if (!win)
|
|
||||||
win = mInputDevice->keyboardFocus();
|
|
||||||
if (!win || !win->window()) {
|
|
||||||
qWarning("qt_touch_extension: handle_touch: No pointer focus");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mTargetWindow = win->window();
|
|
||||||
|
|
||||||
QWindowSystemInterface::TouchPoint tp;
|
|
||||||
tp.id = id;
|
|
||||||
tp.state = QEventPoint::State(int(state & 0xFFFF));
|
|
||||||
int sentPointCount = state >> 16;
|
|
||||||
if (!mPointsLeft) {
|
|
||||||
Q_ASSERT(sentPointCount > 0);
|
|
||||||
mPointsLeft = sentPointCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mTouchDevice)
|
|
||||||
registerDevice(flags >> 16);
|
|
||||||
|
|
||||||
tp.area = QRectF(0, 0, fromFixed(width), fromFixed(height));
|
|
||||||
// Got surface-relative coords but need a (virtual) screen position.
|
|
||||||
QPointF relPos = QPointF(fromFixed(x), fromFixed(y));
|
|
||||||
tp.area.moveCenter(mTargetWindow->mapToGlobal(relPos));
|
|
||||||
|
|
||||||
tp.normalPosition.setX(fromFixed(normalized_x));
|
|
||||||
tp.normalPosition.setY(fromFixed(normalized_y));
|
|
||||||
tp.pressure = pressure / 255.0;
|
|
||||||
tp.velocity.setX(fromFixed(velocity_x));
|
|
||||||
tp.velocity.setY(fromFixed(velocity_y));
|
|
||||||
|
|
||||||
if (rawdata) {
|
|
||||||
const int rawPosCount = rawdata->size / sizeof(float) / 2;
|
|
||||||
float *p = static_cast<float *>(rawdata->data);
|
|
||||||
for (int i = 0; i < rawPosCount; ++i) {
|
|
||||||
float x = *p++;
|
|
||||||
float y = *p++;
|
|
||||||
tp.rawPositions.append(QPointF(x, y));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mTouchPoints.append(tp);
|
|
||||||
mTimestamp = time;
|
|
||||||
|
|
||||||
if (!--mPointsLeft)
|
|
||||||
sendTouchEvent();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWaylandTouchExtension::sendTouchEvent()
|
|
||||||
{
|
|
||||||
// Copy all points, that are in the previous but not in the current list, as stationary.
|
|
||||||
for (int i = 0; i < mPrevTouchPoints.size(); ++i) {
|
|
||||||
const QWindowSystemInterface::TouchPoint &prevPoint(mPrevTouchPoints.at(i));
|
|
||||||
if (prevPoint.state == QEventPoint::Released)
|
|
||||||
continue;
|
|
||||||
bool found = false;
|
|
||||||
for (int j = 0; j < mTouchPoints.size(); ++j)
|
|
||||||
if (mTouchPoints.at(j).id == prevPoint.id) {
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
QWindowSystemInterface::TouchPoint p = prevPoint;
|
|
||||||
p.state = QEventPoint::Stationary;
|
|
||||||
mTouchPoints.append(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mTouchPoints.isEmpty()) {
|
|
||||||
mPrevTouchPoints.clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QWindowSystemInterface::handleTouchEvent(mTargetWindow, mTimestamp, mTouchDevice, mTouchPoints);
|
|
||||||
|
|
||||||
QEventPoint::States states = {};
|
|
||||||
for (int i = 0; i < mTouchPoints.size(); ++i)
|
|
||||||
states |= mTouchPoints.at(i).state;
|
|
||||||
|
|
||||||
if (mFlags & QT_TOUCH_EXTENSION_FLAGS_MOUSE_FROM_TOUCH) {
|
|
||||||
const bool firstPress = states == QEventPoint::Pressed;
|
|
||||||
if (firstPress)
|
|
||||||
mMouseSourceId = mTouchPoints.first().id;
|
|
||||||
for (int i = 0; i < mTouchPoints.size(); ++i) {
|
|
||||||
const QWindowSystemInterface::TouchPoint &tp(mTouchPoints.at(i));
|
|
||||||
if (tp.id == mMouseSourceId) {
|
|
||||||
const bool released = tp.state == QEventPoint::Released;
|
|
||||||
Qt::MouseButtons buttons = released ? Qt::NoButton : Qt::LeftButton;
|
|
||||||
QEvent::Type eventType = firstPress ? QEvent::MouseButtonPress
|
|
||||||
: released ? QEvent::MouseButtonRelease
|
|
||||||
: QEvent::MouseMove;
|
|
||||||
mLastMouseGlobal = tp.area.center();
|
|
||||||
QPoint globalPoint = mLastMouseGlobal.toPoint();
|
|
||||||
QPointF delta = mLastMouseGlobal - globalPoint;
|
|
||||||
mLastMouseLocal = mTargetWindow->mapFromGlobal(globalPoint) + delta;
|
|
||||||
QWindowSystemInterface::handleMouseEvent(mTargetWindow, mTimestamp, mLastMouseLocal, mLastMouseGlobal,
|
|
||||||
buttons, Qt::LeftButton, eventType);
|
|
||||||
if (buttons == Qt::NoButton)
|
|
||||||
mMouseSourceId = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mPrevTouchPoints = mTouchPoints;
|
|
||||||
mTouchPoints.clear();
|
|
||||||
|
|
||||||
if (states == QEventPoint::Released)
|
|
||||||
mPrevTouchPoints.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWaylandTouchExtension::touchCanceled()
|
|
||||||
{
|
|
||||||
mTouchPoints.clear();
|
|
||||||
mPrevTouchPoints.clear();
|
|
||||||
if (mMouseSourceId != -1)
|
|
||||||
QWindowSystemInterface::handleMouseEvent(mTargetWindow, mTimestamp, mLastMouseLocal, mLastMouseGlobal, Qt::NoButton, Qt::LeftButton, QEvent::MouseButtonRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWaylandTouchExtension::touch_extension_configure(uint32_t flags)
|
|
||||||
{
|
|
||||||
mFlags = flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
@ -1,79 +0,0 @@
|
|||||||
// Copyright (C) 2020 The Qt Company Ltd.
|
|
||||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
|
|
||||||
|
|
||||||
#ifndef QWAYLANDTOUCH_H
|
|
||||||
#define QWAYLANDTOUCH_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 <qpa/qwindowsysteminterface.h>
|
|
||||||
|
|
||||||
#include <QtWaylandClient/private/qwayland-touch-extension.h>
|
|
||||||
#include <QtWaylandClient/qtwaylandclientglobal.h>
|
|
||||||
#include <QtCore/private/qglobal_p.h>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
namespace QtWaylandClient {
|
|
||||||
|
|
||||||
class QWaylandDisplay;
|
|
||||||
class QWaylandInputDevice;
|
|
||||||
|
|
||||||
class Q_WAYLANDCLIENT_EXPORT QWaylandTouchExtension : public QtWayland::qt_touch_extension
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QWaylandTouchExtension(QWaylandDisplay *display, uint32_t id);
|
|
||||||
~QWaylandTouchExtension() override;
|
|
||||||
|
|
||||||
void touchCanceled();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void registerDevice(int caps);
|
|
||||||
|
|
||||||
QWaylandDisplay *mDisplay = nullptr;
|
|
||||||
|
|
||||||
void touch_extension_touch(uint32_t time,
|
|
||||||
uint32_t id,
|
|
||||||
uint32_t state,
|
|
||||||
int32_t x,
|
|
||||||
int32_t y,
|
|
||||||
int32_t normalized_x,
|
|
||||||
int32_t normalized_y,
|
|
||||||
int32_t width,
|
|
||||||
int32_t height,
|
|
||||||
uint32_t pressure,
|
|
||||||
int32_t velocity_x,
|
|
||||||
int32_t velocity_y,
|
|
||||||
uint32_t flags,
|
|
||||||
struct wl_array *rawdata) override;
|
|
||||||
void touch_extension_configure(uint32_t flags) override;
|
|
||||||
|
|
||||||
void sendTouchEvent();
|
|
||||||
|
|
||||||
QList<QWindowSystemInterface::TouchPoint> mTouchPoints;
|
|
||||||
QList<QWindowSystemInterface::TouchPoint> mPrevTouchPoints;
|
|
||||||
QPointingDevice *mTouchDevice = nullptr;
|
|
||||||
uint32_t mTimestamp;
|
|
||||||
int mPointsLeft;
|
|
||||||
uint32_t mFlags;
|
|
||||||
int mMouseSourceId;
|
|
||||||
QPointF mLastMouseLocal;
|
|
||||||
QPointF mLastMouseGlobal;
|
|
||||||
QWindow *mTargetWindow = nullptr;
|
|
||||||
QWaylandInputDevice *mInputDevice = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif // QWAYLANDTOUCH_H
|
|
Loading…
x
Reference in New Issue
Block a user