From 1e1785c8d2b077c34a8ca1d4f93e5a75b269eac8 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Thu, 16 Mar 2017 13:59:20 +0100 Subject: Clean up draganddrop and clipboard features Don't assume that no-draganddrop implies no-clipboard. Introduce a new private feature wayland-datadevice which contains the common functionality. This feature cannot be controlled independently, but is automatically disabled when both clipboard and draganddrop are disabled. Change-Id: I6aac09c7ee524e3b11f0a1caa4a6c62fc3f1d10f Reviewed-by: Oswald Buddenhagen Reviewed-by: Johan Helsing --- src/client/client.pro | 26 ++++++++++------- src/client/configure.json | 4 +++ src/client/qwaylandclipboard.cpp | 4 --- src/client/qwaylandclipboard_p.h | 5 ++-- src/client/qwaylanddatadevice.cpp | 10 ++++--- src/client/qwaylanddatadevice_p.h | 16 ++++++++--- src/client/qwaylanddatadevicemanager.cpp | 4 --- src/client/qwaylanddatadevicemanager_p.h | 6 ++-- src/client/qwaylanddataoffer.cpp | 4 --- src/client/qwaylanddataoffer_p.h | 6 ++-- src/client/qwaylanddatasource.cpp | 4 --- src/client/qwaylanddatasource_p.h | 6 ++-- src/client/qwaylanddisplay.cpp | 8 ++++-- src/client/qwaylanddisplay_p.h | 6 ++-- src/client/qwaylandinputdevice.cpp | 8 +++++- src/client/qwaylandinputdevice_p.h | 4 +++ src/client/qwaylandwindow.cpp | 8 ++++-- .../compositor_api/qwaylandcompositor.cpp | 8 ++++++ .../compositor_api/qwaylandcompositor_p.h | 6 +++- src/compositor/compositor_api/qwaylanddrag.cpp | 6 +++- src/compositor/compositor_api/qwaylanddrag.h | 2 ++ .../compositor_api/qwaylandquickitem.cpp | 18 ++++++++++-- src/compositor/compositor_api/qwaylandquickitem.h | 2 ++ src/compositor/compositor_api/qwaylandseat.cpp | 14 +++++++++ src/compositor/compositor_api/qwaylandseat.h | 4 +++ src/compositor/compositor_api/qwaylandseat_p.h | 8 +++++- src/compositor/compositor_api/qwaylandsurface.cpp | 9 ++++-- src/compositor/compositor_api/qwaylandsurface.h | 2 ++ src/compositor/configure.json | 4 +++ src/compositor/wayland_wrapper/qwldatadevice.cpp | 33 +++++++++++++--------- src/compositor/wayland_wrapper/qwldatadevice_p.h | 14 +++++++-- .../wayland_wrapper/qwldatadevicemanager_p.h | 3 ++ src/compositor/wayland_wrapper/qwldataoffer_p.h | 3 ++ src/compositor/wayland_wrapper/qwldatasource_p.h | 3 ++ src/compositor/wayland_wrapper/wayland_wrapper.pri | 22 +++++++++------ .../compositor/qwaylandquickcompositorplugin.cpp | 4 +++ 36 files changed, 207 insertions(+), 87 deletions(-) diff --git a/src/client/client.pro b/src/client/client.pro index 824c715b0..015bfcd4b 100644 --- a/src/client/client.pro +++ b/src/client/client.pro @@ -40,9 +40,6 @@ SOURCES += qwaylandintegration.cpp \ qwaylandwindow.cpp \ qwaylandscreen.cpp \ qwaylandshmwindow.cpp \ - qwaylanddataoffer.cpp \ - qwaylanddatadevicemanager.cpp \ - qwaylanddatasource.cpp \ qwaylandshellsurface.cpp \ qwaylandwlshellsurface.cpp \ qwaylandwlshellintegration.cpp \ @@ -76,9 +73,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 \ @@ -123,13 +117,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 -#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/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 #include -#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(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 +#include #include #include #include #include -#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 -#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 +#include #include -#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 -#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 -#include +#include #include -#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 #include -#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 #include -#include +#include -#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 83a69483f..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 diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h index 9268d9f1e..35d861760 100644 --- a/src/client/qwaylanddisplay_p.h +++ b/src/client/qwaylanddisplay_p.h @@ -61,7 +61,7 @@ #include #include -#include +#include #include #include @@ -137,7 +137,7 @@ public: QList 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 mInputDevices; QList mRegistryListeners; QWaylandIntegration *mWaylandIntegration; -#if QT_CONFIG(draganddrop) +#if QT_CONFIG(wayland_datadevice) QScopedPointer mDndSelectionHandler; #endif QScopedPointer 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/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp index dec4d1157..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 #include #include @@ -825,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/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 #include +#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 +#include #include #include #include @@ -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 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 -#include "qwldatadevice_p.h" #include "qwaylandview.h" #include +#include + +#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 #include +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 #include #include +#if QT_CONFIG(draganddrop) #include +#endif #include #include @@ -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(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/qwaylandseat.cpp b/src/compositor/compositor_api/qwaylandseat.cpp index 2ce690cd9..29a456e22 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 +#endif #include #include #include #include #include +#if QT_CONFIG(wayland_datadevice) #include +#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 *) { @@ -378,8 +388,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; } @@ -443,11 +455,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 pointer; QScopedPointer keyboard; QScopedPointer touch; +#if QT_CONFIG(wayland_datadevice) QScopedPointer data_device; +# if QT_CONFIG(draganddrop) QScopedPointer drag_handle; +# endif +#endif QScopedPointer 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 +#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/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 #include @@ -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 +#include #include +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 #include +#include + +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 #include +#include + +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 +#include #include #include +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..8698e597b 100644 --- a/src/compositor/wayland_wrapper/wayland_wrapper.pri +++ b/src/compositor/wayland_wrapper/wayland_wrapper.pri @@ -5,23 +5,29 @@ WAYLANDSERVERSOURCES += \ 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/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 #include #include +#if QT_CONFIG(draganddrop) #include +#endif #include #include #include @@ -127,7 +129,9 @@ public: qmlRegisterUncreatableType(uri, 1, 0, "WaylandClient", QObject::tr("Cannot create instance of WaylandClient")); qmlRegisterUncreatableType(uri, 1, 0, "WaylandOutputBase", QObject::tr("Cannot create instance of WaylandOutputBase, use WaylandOutput instead")); qmlRegisterUncreatableType(uri, 1, 0, "WaylandSeat", QObject::tr("Cannot create instance of WaylandSeat")); +#if QT_CONFIG(draganddrop) qmlRegisterUncreatableType(uri, 1, 0, "WaylandDrag", QObject::tr("Cannot create instance of WaylandDrag")); +#endif qmlRegisterUncreatableType(uri, 1, 0, "WaylandCompositorBase", QObject::tr("Cannot create instance of WaylandCompositorBase, use WaylandCompositor instead")); qmlRegisterUncreatableType(uri, 1, 0, "WaylandSurfaceBase", QObject::tr("Cannot create instance of WaylandSurfaceBase, use WaylandSurface instead")); qmlRegisterUncreatableType(uri, 1, 0, "Shell", QObject::tr("Cannot create instance of Shell")); -- cgit v1.2.3