diff options
author | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-14 14:15:18 +0200 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-28 13:10:33 +0200 |
commit | 463b9137b1b78def03fca6fc987df9bf249cb2f6 (patch) | |
tree | 3c958a367920e706f9bc118bcc98c6418c0d6c90 /src/compositor | |
parent | bd6a5c4669801d7c86ffe2f8664dcfe0b4b7a906 (diff) |
Remove QtWayland::InputDevice
and add QWaylandInputDevicePrivate. Also make sure noone holds a
reference to the private instance.
Change-Id: Ic2327595d58d6308e1e2699370f53aef47061b04
Diffstat (limited to 'src/compositor')
17 files changed, 226 insertions, 435 deletions
diff --git a/src/compositor/compositor_api/compositor_api.pri b/src/compositor/compositor_api/compositor_api.pri index 5d2a24f0f..7d6476513 100644 --- a/src/compositor/compositor_api/compositor_api.pri +++ b/src/compositor/compositor_api/compositor_api.pri @@ -7,6 +7,7 @@ HEADERS += \ compositor_api/qwaylandsurface.h \ compositor_api/qwaylandsurface_p.h \ compositor_api/qwaylandinput.h \ + compositor_api/qwaylandinput_p.h \ compositor_api/qwaylandkeyboard.h \ compositor_api/qwaylandpointer.h \ compositor_api/qwaylandtouch.h \ diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp index d9a372229..14aabac6f 100644 --- a/src/compositor/compositor_api/qwaylandcompositor.cpp +++ b/src/compositor/compositor_api/qwaylandcompositor.cpp @@ -51,7 +51,6 @@ #include "qwaylandsurface_p.h" #include "wayland_wrapper/qwldatadevice_p.h" -#include "wayland_wrapper/qwlinputdevice_p.h" #include "wayland_wrapper/qwldatadevicemanager_p.h" #include "extensions/qwlinputpanel_p.h" diff --git a/src/compositor/compositor_api/qwaylanddrag.cpp b/src/compositor/compositor_api/qwaylanddrag.cpp index 0b3663f4c..22357ec4c 100644 --- a/src/compositor/compositor_api/qwaylanddrag.cpp +++ b/src/compositor/compositor_api/qwaylanddrag.cpp @@ -38,9 +38,9 @@ #include <private/qobject_p.h> -#include "qwlinputdevice_p.h" #include "qwldatadevice_p.h" #include "qwaylandview.h" +#include <QtCompositor/private/qwaylandinput_p.h> QT_BEGIN_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandinput.cpp b/src/compositor/compositor_api/qwaylandinput.cpp index d95c111fe..3c81ed6cd 100644 --- a/src/compositor/compositor_api/qwaylandinput.cpp +++ b/src/compositor/compositor_api/qwaylandinput.cpp @@ -35,14 +35,105 @@ ****************************************************************************/ #include "qwaylandinput.h" +#include "qwaylandinput_p.h" -#include "qwlinputdevice_p.h" #include "qwlkeyboard_p.h" #include "qwaylandcompositor.h" #include "qwaylandview.h" +#include <QtCompositor/QWaylandDrag> +#include <QtCompositor/QWaylandTouch> +#include <QtCompositor/private/qwlinputmethod_p.h> +#include <QtCompositor/private/qwaylandinput_p.h> +#include <QtCompositor/private/qwaylandcompositor_p.h> +#include <QtCompositor/private/qwldatadevice_p.h> + +#include "extensions/qwlqtkey_p.h" QT_BEGIN_NAMESPACE +QWaylandInputDevicePrivate::QWaylandInputDevicePrivate(QWaylandInputDevice *inputdevice, QWaylandCompositor *compositor) + : QObjectPrivate() + , QtWaylandServer::wl_seat(compositor->display(), 3) + , compositor(compositor) + , outputSpace(compositor->primaryOutputSpace()) + , mouseFocus(Q_NULLPTR) + , capabilities() + , input_method(compositor->extensionFlags() & QWaylandCompositor::TextInputExtension ? new QtWayland::InputMethod(compositor, inputdevice) : 0) + , data_device() + , drag_handle(new QWaylandDrag(inputdevice)) +{ +} + +QWaylandInputDevicePrivate::~QWaylandInputDevicePrivate() +{ +} + +void QWaylandInputDevicePrivate::setCapabilities(QWaylandInputDevice::CapabilityFlags caps) +{ + Q_Q(QWaylandInputDevice); + if (capabilities != caps) { + QWaylandInputDevice::CapabilityFlags changed = caps ^ capabilities; + + if (changed & QWaylandInputDevice::Pointer) { + pointer.reset(pointer.isNull() ? QWaylandCompositorPrivate::get(compositor)->callCreatePointerDevice(q) : 0); + } + + if (changed & QWaylandInputDevice::Keyboard) { + keyboard.reset(keyboard.isNull() ? QWaylandCompositorPrivate::get(compositor)->callCreateKeyboardDevice(q) : 0); + } + + if (changed & QWaylandInputDevice::Touch) { + touch.reset(touch.isNull() ? QWaylandCompositorPrivate::get(compositor)->callCreateTouchDevice(q) : 0); + } + + capabilities = caps; + QList<Resource *> resources = resourceMap().values(); + for (int i = 0; i < resources.size(); i++) { + wl_seat::send_capabilities(resources.at(i)->handle, (uint32_t)capabilities); + } + } +} + +void QWaylandInputDevicePrivate::clientRequestedDataDevice(QtWayland::DataDeviceManager *, struct wl_client *client, uint32_t id) +{ + Q_Q(QWaylandInputDevice); + if (!data_device) + data_device.reset(new QtWayland::DataDevice(q)); + data_device->add(client, id, 1); +} + +void QWaylandInputDevicePrivate::seat_destroy_resource(wl_seat::Resource *) +{ +// cleanupDataDeviceForClient(resource->client(), true); +} + +void QWaylandInputDevicePrivate::seat_bind_resource(wl_seat::Resource *resource) +{ + // The order of capabilities matches the order defined in the wayland protocol + wl_seat::send_capabilities(resource->handle, (uint32_t)capabilities); +} + +void QWaylandInputDevicePrivate::seat_get_pointer(wl_seat::Resource *resource, uint32_t id) +{ + if (!pointer.isNull()) { + pointer->addClient(QWaylandClient::fromWlClient(compositor, resource->client()), id); + } +} + +void QWaylandInputDevicePrivate::seat_get_keyboard(wl_seat::Resource *resource, uint32_t id) +{ + if (!keyboard.isNull()) { + keyboard->addClient(QWaylandClient::fromWlClient(compositor, resource->client()), id); + } +} + +void QWaylandInputDevicePrivate::seat_get_touch(wl_seat::Resource *resource, uint32_t id) +{ + if (!touch.isNull()) { + touch->addClient(QWaylandClient::fromWlClient(compositor, resource->client()), id); + } +} + QWaylandKeymap::QWaylandKeymap(const QString &layout, const QString &variant, const QString &options, const QString &model, const QString &rules) : m_layout(layout) , m_variant(variant) @@ -67,93 +158,128 @@ QWaylandInputDevice::~QWaylandInputDevice() void QWaylandInputDevice::sendMousePressEvent(Qt::MouseButton button) { Q_D(QWaylandInputDevice); - d->sendMousePressEvent(button); + d->pointer->sendMousePressEvent(button); } void QWaylandInputDevice::sendMouseReleaseEvent(Qt::MouseButton button) { Q_D(QWaylandInputDevice); - d->sendMouseReleaseEvent(button); + d->pointer->sendMouseReleaseEvent(button); } /** Convenience function that will set the mouse focus to the surface, then send the mouse move event. * If the mouse focus is the same surface as the surface passed in, then only the move event is sent **/ -void QWaylandInputDevice::sendMouseMoveEvent(QWaylandView *surface, const QPointF &localPos, const QPointF &globalPos) +void QWaylandInputDevice::sendMouseMoveEvent(QWaylandView *view, const QPointF &localPos, const QPointF &globalPos) { Q_D(QWaylandInputDevice); - d->sendMouseMoveEvent(surface,localPos,globalPos); + d->pointer->sendMouseMoveEvent(view, localPos,globalPos); } void QWaylandInputDevice::sendMouseWheelEvent(Qt::Orientation orientation, int delta) { Q_D(QWaylandInputDevice); - d->sendMouseWheelEvent(orientation, delta); + d->pointer->sendMouseWheelEvent(orientation, delta); } void QWaylandInputDevice::sendKeyPressEvent(uint code) { - keyboard()->sendKeyPressEvent(code); + Q_D(QWaylandInputDevice); + d->keyboard->sendKeyPressEvent(code); } void QWaylandInputDevice::sendKeyReleaseEvent(uint code) { - keyboard()->sendKeyReleaseEvent(code); + Q_D(QWaylandInputDevice); + d->keyboard->sendKeyReleaseEvent(code); } void QWaylandInputDevice::sendTouchPointEvent(int id, const QPointF &point, Qt::TouchPointState state) { Q_D(QWaylandInputDevice); - d->sendTouchPointEvent(id, point, state); + if (d->touch.isNull()) { + return; + } + d->touch->sendTouchPointEvent(id, point,state); } void QWaylandInputDevice::sendTouchFrameEvent() { Q_D(QWaylandInputDevice); - d->sendTouchFrameEvent(); + if (!d->touch.isNull()) { + d->touch->sendFrameEvent(); + } } void QWaylandInputDevice::sendTouchCancelEvent() { Q_D(QWaylandInputDevice); - d->sendTouchCancelEvent(); + if (!d->touch.isNull()) { + d->touch->sendCancelEvent(); + } } void QWaylandInputDevice::sendFullTouchEvent(QTouchEvent *event) { Q_D(QWaylandInputDevice); - d->sendFullTouchEvent(event); -} + if (!mouseFocus()) { + qWarning("Cannot send touch event, no pointer focus, fix the compositor"); + return; + } -void QWaylandInputDevice::sendFullKeyEvent(QKeyEvent *event) -{ - Q_D(QWaylandInputDevice); - d->sendFullKeyEvent(event); + if (!d->touch) + return; + + d->touch->sendFullTouchEvent(event); } -void QWaylandInputDevice::sendFullKeyEvent(QWaylandSurface *surface, QKeyEvent *event) +void QWaylandInputDevice::sendFullKeyEvent(QKeyEvent *event) { Q_D(QWaylandInputDevice); - d->sendFullKeyEvent(surface, event); + if (!keyboardFocus()) { + qWarning("Cannot send key event, no keyboard focus, fix the compositor"); + return; + } + + QtWayland::QtKeyExtensionGlobal *ext = QtWayland::QtKeyExtensionGlobal::findIn(d->compositor); + if (ext && ext->postQtKeyEvent(event, keyboardFocus())) + return; + + if (!d->keyboard.isNull() && !event->isAutoRepeat()) { + if (event->type() == QEvent::KeyPress) + d->keyboard->sendKeyPressEvent(event->nativeScanCode()); + else if (event->type() == QEvent::KeyRelease) + d->keyboard->sendKeyReleaseEvent(event->nativeScanCode()); + } } QWaylandKeyboard *QWaylandInputDevice::keyboard() const { Q_D(const QWaylandInputDevice); - return d->keyboardDevice(); + return d->keyboard.data(); } QWaylandSurface *QWaylandInputDevice::keyboardFocus() const { Q_D(const QWaylandInputDevice); - QWaylandSurface *surface = d->keyboardFocus(); - return surface; + if (d->keyboard.isNull() || !d->keyboard->focus()) + return Q_NULLPTR; + + return d->keyboard->focus(); } bool QWaylandInputDevice::setKeyboardFocus(QWaylandSurface *surface) { Q_D(QWaylandInputDevice); - return d->setKeyboardFocus(surface); + if (surface && surface->isDestroyed()) + return false; + + if (!d->keyboard.isNull() && d->keyboard->setFocus(surface)) { + if (d->data_device) + d->data_device->setFocus(d->keyboard->focusClient()); + return true; + } + return false; } void QWaylandInputDevice::setKeymap(const QWaylandKeymap &keymap) @@ -162,46 +288,57 @@ void QWaylandInputDevice::setKeymap(const QWaylandKeymap &keymap) keyboard()->setKeymap(keymap); } +QWaylandPointer *QWaylandInputDevice::pointer() const +{ + Q_D(const QWaylandInputDevice); + return d->pointer.data(); +} + QWaylandView *QWaylandInputDevice::mouseFocus() const { Q_D(const QWaylandInputDevice); - return d->mouseFocus(); + return d->mouseFocus; } void QWaylandInputDevice::setMouseFocus(QWaylandView *view) { Q_D(QWaylandInputDevice); - d->setMouseFocus(view); + if (view == d->mouseFocus) + return; + + QWaylandView *oldFocus = d->mouseFocus; + d->mouseFocus = view; + emit mouseFocusChanged(d->mouseFocus, oldFocus); } QWaylandOutputSpace *QWaylandInputDevice::outputSpace() const { Q_D(const QWaylandInputDevice); - return d->outputSpace(); + return d->outputSpace; } void QWaylandInputDevice::setOutputSpace(QWaylandOutputSpace *outputSpace) { Q_D(QWaylandInputDevice); - d->setOutputSpace(outputSpace); + d->outputSpace = outputSpace; } QWaylandCompositor *QWaylandInputDevice::compositor() const { Q_D(const QWaylandInputDevice); - return d->compositor(); + return d->compositor; } QWaylandDrag *QWaylandInputDevice::drag() const { Q_D(const QWaylandInputDevice); - return d->dragHandle(); + return d->drag_handle.data(); } QWaylandInputDevice::CapabilityFlags QWaylandInputDevice::capabilities() const { Q_D(const QWaylandInputDevice); - return d->capabilities(); + return d->capabilities; } bool QWaylandInputDevice::isOwner(QInputEvent *inputEvent) const @@ -210,4 +347,9 @@ bool QWaylandInputDevice::isOwner(QInputEvent *inputEvent) const return true; } +QWaylandInputDevice *QWaylandInputDevice::fromSeatResource(struct ::wl_resource *resource) +{ + return static_cast<QWaylandInputDevicePrivate *>(QWaylandInputDevicePrivate::Resource::fromResource(resource)->seat_object)->q_func(); +} + QT_END_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandinput.h b/src/compositor/compositor_api/qwaylandinput.h index 5cb32062a..abeab0d9b 100644 --- a/src/compositor/compositor_api/qwaylandinput.h +++ b/src/compositor/compositor_api/qwaylandinput.h @@ -100,7 +100,6 @@ public: void sendFullTouchEvent(QTouchEvent *event); QWaylandPointer *pointer() const; - //Normally set by the mouse device, //But can be set manually for use with touch or can reset unset the current mouse focus; QWaylandView *mouseFocus() const; @@ -124,6 +123,7 @@ public: virtual bool isOwner(QInputEvent *inputEvent) const; + static QWaylandInputDevice *fromSeatResource(struct ::wl_resource *resource); Q_SIGNALS: void mouseFocusChanged(QWaylandView *newFocus, QWaylandView *oldFocus); }; diff --git a/src/compositor/wayland_wrapper/qwlinputdevice_p.h b/src/compositor/compositor_api/qwaylandinput_p.h index 1ed8593ac..2c3a8f4b8 100644 --- a/src/compositor/wayland_wrapper/qwlinputdevice_p.h +++ b/src/compositor/compositor_api/qwaylandinput_p.h @@ -34,8 +34,8 @@ ** ****************************************************************************/ -#ifndef WLINPUTDEVICE_H -#define WLINPUTDEVICE_H +#ifndef QWAYLANDINPUT_P_H +#define QWAYLANDINPUT_P_H #include <stdint.h> @@ -82,62 +82,15 @@ public: QWaylandInputDevicePrivate(QWaylandInputDevice *device, QWaylandCompositor *compositor); ~QWaylandInputDevicePrivate(); - void sendMousePressEvent(Qt::MouseButton button); - void sendMouseReleaseEvent(Qt::MouseButton button); - void sendMouseMoveEvent(QWaylandView *surface, const QPointF &localPos, const QPointF &spacePos = QPointF()); - void sendMouseWheelEvent(Qt::Orientation orientation, int delta); - - void sendTouchPointEvent(int id, const QPointF &point, Qt::TouchPointState state); - void sendTouchFrameEvent(); - void sendTouchCancelEvent(); - - void sendFullKeyEvent(QKeyEvent *event); - void sendFullKeyEvent(QWaylandSurface *surface, QKeyEvent *event); - - void sendFullTouchEvent(QTouchEvent *event); - - QWaylandSurface *keyboardFocus() const; - bool setKeyboardFocus(QWaylandSurface *surface); - - QWaylandView *mouseFocus() const; - void setMouseFocus(QWaylandView *focus); - void clientRequestedDataDevice(QtWayland::DataDeviceManager *dndSelection, struct wl_client *client, uint32_t id); - const QtWayland::DataDevice *dataDevice() const; - - QWaylandOutputSpace *outputSpace() const; - void setOutputSpace(QWaylandOutputSpace *outputSpace); - - QWaylandCompositor *compositor() const; - QWaylandDrag *dragHandle() const; - - QWaylandPointer *pointerDevice() const; - QWaylandKeyboard *keyboardDevice() const; - QWaylandTouch *touchDevice() const; - QtWayland::InputMethod *inputMethod(); - - static QWaylandInputDevicePrivate *fromSeatResource(struct ::wl_resource *resource) - { - return static_cast<QWaylandInputDevicePrivate *>(wl_seat::Resource::fromResource(resource)->seat_object); - } - - QWaylandInputDevice::CapabilityFlags capabilities() const { return m_capabilities; } void setCapabilities(QWaylandInputDevice::CapabilityFlags caps); - static QWaylandInputDevicePrivate *get(QWaylandInputDevice *device); -private: - QScopedPointer<QWaylandDrag> m_dragHandle; - QWaylandCompositor *m_compositor; - QWaylandOutputSpace *m_outputSpace; - QWaylandView *m_mouseFocus; - QWaylandInputDevice::CapabilityFlags m_capabilities; - - QScopedPointer<QWaylandPointer> m_pointer; - QScopedPointer<QWaylandKeyboard> m_keyboard; - QScopedPointer<QWaylandTouch> m_touch; - QScopedPointer<QtWayland::InputMethod> m_inputMethod; - QScopedPointer<QtWayland::DataDevice> m_data_device; + static QWaylandInputDevicePrivate *get(QWaylandInputDevice *device) { return device->d_func(); } + QtWayland::DataDevice *dataDevice() const { return data_device.data(); } + QtWayland::InputMethod *inputMethod() const { return input_method.data(); } + +protected: void seat_bind_resource(wl_seat::Resource *resource) Q_DECL_OVERRIDE; void seat_get_pointer(wl_seat::Resource *resource, @@ -148,8 +101,22 @@ private: uint32_t id) Q_DECL_OVERRIDE; void seat_destroy_resource(wl_seat::Resource *resource) Q_DECL_OVERRIDE; + +private: + QWaylandCompositor *compositor; + QWaylandOutputSpace *outputSpace; + QWaylandView *mouseFocus; + QWaylandInputDevice::CapabilityFlags capabilities; + + QScopedPointer<QWaylandPointer> pointer; + QScopedPointer<QWaylandKeyboard> keyboard; + QScopedPointer<QWaylandTouch> touch; + QScopedPointer<QtWayland::InputMethod> input_method; + QScopedPointer<QtWayland::DataDevice> data_device; + QScopedPointer<QWaylandDrag> drag_handle; + }; QT_END_NAMESPACE -#endif // WLINPUTDEVICE_H +#endif // QWAYLANDINPUT_P_H diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index 6bd4caef4..b27734127 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -38,9 +38,6 @@ #include "qwaylandsurface.h" #include "qwaylandsurface_p.h" -#include <private/qobject_p.h> - -#include "wayland_wrapper/qwlinputdevice_p.h" #include "wayland_wrapper/qwldatadevice_p.h" #include "wayland_wrapper/qwldatadevicemanager_p.h" #include "wayland_wrapper/qwlregion_p.h" @@ -55,6 +52,9 @@ #include <QtCompositor/private/qwaylandcompositor_p.h> #include <QtCompositor/private/qwaylandview_p.h> +#include <QtCompositor/private/qwaylandinput_p.h> + +#include <QtCore/private/qobject_p.h> #include <QtGui/QGuiApplication> #include <QtGui/QScreen> diff --git a/src/compositor/extensions/qwlinputpanel.cpp b/src/compositor/extensions/qwlinputpanel.cpp index 2aaffae3e..276c9aa26 100644 --- a/src/compositor/extensions/qwlinputpanel.cpp +++ b/src/compositor/extensions/qwlinputpanel.cpp @@ -39,7 +39,6 @@ #include <QtCompositor/qwaylandinputpanel.h> #include <QtCompositor/QWaylandCompositor> -#include "qwlinputdevice_p.h" #include "qwlinputmethod_p.h" #include "qwlinputpanelsurface_p.h" #include "qwltextinput_p.h" diff --git a/src/compositor/extensions/qwlshellsurface.cpp b/src/compositor/extensions/qwlshellsurface.cpp index d74d01b16..5ad57852b 100644 --- a/src/compositor/extensions/qwlshellsurface.cpp +++ b/src/compositor/extensions/qwlshellsurface.cpp @@ -40,7 +40,6 @@ #include <QtCompositor/QWaylandCompositor> #include <QtCompositor/QWaylandOutputSpace> -#include "qwlinputdevice_p.h" #include "qwlsubsurface_p.h" #include "qwlpointer_p.h" #include "qwlextendedsurface_p.h" @@ -220,8 +219,8 @@ void ShellSurface::shell_surface_move(Resource *resource, return; } - QWaylandInputDevicePrivate *input_device = QWaylandInputDevicePrivate::fromSeatResource(input_device_super); - QWaylandPointer *pointer = input_device->pointerDevice(); + QWaylandInputDevice *input_device = QWaylandInputDevice::fromSeatResource(input_device_super); + QWaylandPointer *pointer = input_device->pointer(); m_moveGrabber = new ShellSurfaceMoveGrabber(this, pointer->currentSpacePosition() - m_view->requestedPosition()); @@ -243,8 +242,8 @@ void ShellSurface::shell_surface_resize(Resource *resource, m_resizeGrabber = new ShellSurfaceResizeGrabber(this); - QWaylandInputDevicePrivate *input_device = QWaylandInputDevicePrivate::fromSeatResource(input_device_super); - QWaylandPointer *pointer = input_device->pointerDevice(); + QWaylandInputDevice *input_device = QWaylandInputDevice::fromSeatResource(input_device_super); + QWaylandPointer *pointer = input_device->pointer(); m_resizeGrabber->point = pointer->currentSpacePosition(); m_resizeGrabber->resize_edges = static_cast<wl_shell_surface_resize>(edges); @@ -321,8 +320,8 @@ void ShellSurface::shell_surface_set_popup(Resource *resource, wl_resource *inpu Q_UNUSED(input_device); Q_UNUSED(flags); - QWaylandInputDevicePrivate *input = QWaylandInputDevicePrivate::fromSeatResource(input_device); - m_popupGrabber = m_shell->getPopupGrabber(input->q_func()); + QWaylandInputDevice *input = QWaylandInputDevice::fromSeatResource(input_device); + m_popupGrabber = m_shell->getPopupGrabber(input); m_popupSerial = serial; setTransientParent(QWaylandSurface::fromResource(parent)); @@ -486,7 +485,7 @@ ShellSurfacePopupGrabber::ShellSurfacePopupGrabber(QWaylandInputDevice *inputDev uint32_t ShellSurfacePopupGrabber::grabSerial() const { - return QWaylandInputDevicePrivate::get(m_inputDevice)->pointerDevice()->grabSerial(); + return m_inputDevice->pointer()->grabSerial(); } struct ::wl_client *ShellSurfacePopupGrabber::client() const @@ -504,11 +503,11 @@ void ShellSurfacePopupGrabber::addPopup(ShellSurface *surface) if (m_surfaces.isEmpty()) { m_client = surface->resource()->client(); - if (QWaylandInputDevicePrivate::get(m_inputDevice)->pointerDevice()->isButtonPressed()) + if (m_inputDevice->pointer()->isButtonPressed()) m_initialUp = false; m_surfaces.append(surface); - QWaylandInputDevicePrivate::get(m_inputDevice)->pointerDevice()->startGrab(this); + m_inputDevice->pointer()->startGrab(this); } else { m_surfaces.append(surface); } @@ -521,7 +520,7 @@ void ShellSurfacePopupGrabber::removePopup(ShellSurface *surface) m_surfaces.removeOne(surface); if (m_surfaces.isEmpty()) - QWaylandInputDevicePrivate::get(m_inputDevice)->pointerDevice()->endGrab(); + m_inputDevice->pointer()->endGrab(); } void ShellSurfacePopupGrabber::button(uint32_t time, Qt::MouseButton button, uint32_t state) diff --git a/src/compositor/extensions/qwltextinput.cpp b/src/compositor/extensions/qwltextinput.cpp index d9e1774bb..1a29f23b4 100644 --- a/src/compositor/extensions/qwltextinput.cpp +++ b/src/compositor/extensions/qwltextinput.cpp @@ -36,12 +36,12 @@ #include "qwltextinput_p.h" -#include "qwlinputdevice_p.h" #include "qwlinputmethod_p.h" #include "qwlinputmethodcontext_p.h" #include "qwlinputpanel_p.h" #include <QtCompositor/QWaylandInputPanel> #include <QtCompositor/QWaylandCompositor> +#include <QtCompositor/private/qwaylandinput_p.h> #include <algorithm> @@ -102,7 +102,7 @@ void TextInput::text_input_activate(Resource *, wl_resource *seat, wl_resource * bool wasEmpty = m_activeInputMethods.isEmpty(); - InputMethod *inputMethod = QWaylandInputDevicePrivate::fromSeatResource(seat)->inputMethod(); + InputMethod *inputMethod = QWaylandInputDevicePrivate::get(QWaylandInputDevice::fromSeatResource(seat))->inputMethod(); if (!m_activeInputMethods.contains(inputMethod)) { m_activeInputMethods.append(inputMethod); @@ -115,7 +115,7 @@ void TextInput::text_input_activate(Resource *, wl_resource *seat, wl_resource * void TextInput::text_input_deactivate(Resource *, wl_resource *seat) { - InputMethod *inputMethod = QWaylandInputDevicePrivate::fromSeatResource(seat)->inputMethod(); + InputMethod *inputMethod = QWaylandInputDevicePrivate::get(QWaylandInputDevice::fromSeatResource(seat))->inputMethod(); deactivate(inputMethod); } diff --git a/src/compositor/wayland_wrapper/qwldatadevice.cpp b/src/compositor/wayland_wrapper/qwldatadevice.cpp index a7cb3bd9c..83d0b9dd3 100644 --- a/src/compositor/wayland_wrapper/qwldatadevice.cpp +++ b/src/compositor/wayland_wrapper/qwldatadevice.cpp @@ -38,7 +38,6 @@ #include "qwldatasource_p.h" #include "qwldataoffer_p.h" -#include "qwlinputdevice_p.h" #include "qwlkeyboard_p.h" #include "qwlpointer_p.h" #include "qwaylandsurface_p.h" @@ -49,6 +48,7 @@ #include "qwaylandview.h" #include <QtCompositor/QWaylandClient> #include <QtCompositor/private/qwaylandcompositor_p.h> +#include <QtCompositor/private/qwaylandinput_p.h> #include <QtCore/QPointF> #include <QDebug> @@ -146,7 +146,7 @@ void DataDevice::focus() void DataDevice::motion(uint32_t time) { - Q_EMIT QWaylandInputDevicePrivate::get(m_inputDevice)->dragHandle()->positionChanged(); + Q_EMIT m_inputDevice->drag()->positionChanged(); m_dragIconPosition = pointer->currentSpacePosition(); if (m_dragFocusResource && m_dragFocus) { @@ -171,8 +171,8 @@ void DataDevice::button(uint32_t time, Qt::MouseButton button, uint32_t state) if (m_dragIcon) { m_dragIcon = 0; m_dragIconPosition = QPointF(); - Q_EMIT QWaylandInputDevicePrivate::get(m_inputDevice)->dragHandle()->positionChanged(); - Q_EMIT QWaylandInputDevicePrivate::get(m_inputDevice)->dragHandle()->iconChanged(); + Q_EMIT m_inputDevice->drag()->positionChanged(); + Q_EMIT m_inputDevice->drag()->iconChanged(); } setDragFocus(0, QPointF()); @@ -182,8 +182,8 @@ void DataDevice::button(uint32_t time, Qt::MouseButton button, uint32_t state) void DataDevice::data_device_start_drag(Resource *resource, struct ::wl_resource *source, struct ::wl_resource *origin, struct ::wl_resource *icon, uint32_t serial) { - if (QWaylandInputDevicePrivate::get(m_inputDevice)->pointerDevice()->grabSerial() == serial) { - if (!QWaylandInputDevicePrivate::get(m_inputDevice)->pointerDevice()->isButtonPressed() || + if (m_inputDevice->pointer()->grabSerial() == serial) { + if (!m_inputDevice->pointer()->isButtonPressed() || m_inputDevice->mouseFocus()->surfaceResource() != origin) return; @@ -191,10 +191,10 @@ void DataDevice::data_device_start_drag(Resource *resource, struct ::wl_resource m_dragDataSource = source != 0 ? DataSource::fromResource(source) : 0; m_dragIcon = icon != 0 ? QWaylandSurface::fromResource(icon) : 0; m_dragIconPosition = QPointF(); - Q_EMIT QWaylandInputDevicePrivate::get(m_inputDevice)->dragHandle()->positionChanged(); - Q_EMIT QWaylandInputDevicePrivate::get(m_inputDevice)->dragHandle()->iconChanged(); + Q_EMIT m_inputDevice->drag()->positionChanged(); + Q_EMIT m_inputDevice->drag()->iconChanged(); - QWaylandInputDevicePrivate::get(m_inputDevice)->pointerDevice()->startGrab(this); + m_inputDevice->pointer()->startGrab(this); } } diff --git a/src/compositor/wayland_wrapper/qwldatadevice_p.h b/src/compositor/wayland_wrapper/qwldatadevice_p.h index 435e253e3..6d4f4f1b5 100644 --- a/src/compositor/wayland_wrapper/qwldatadevice_p.h +++ b/src/compositor/wayland_wrapper/qwldatadevice_p.h @@ -38,7 +38,6 @@ #define WLDATADEVICE_H #include <QtCompositor/private/qwayland-server-wayland.h> -#include <qwlinputdevice_p.h> #include <QtCompositor/QWaylandPointerGrabber> #include <qwlpointer_p.h> #include <QtCompositor/QWaylandOutputSpace> diff --git a/src/compositor/wayland_wrapper/qwldatadevicemanager.cpp b/src/compositor/wayland_wrapper/qwldatadevicemanager.cpp index 23e85813a..56c7f8026 100644 --- a/src/compositor/wayland_wrapper/qwldatadevicemanager.cpp +++ b/src/compositor/wayland_wrapper/qwldatadevicemanager.cpp @@ -39,9 +39,9 @@ #include <QtCompositor/QWaylandCompositor> #include <QtCompositor/private/qwaylandcompositor_p.h> +#include <QtCompositor/private/qwaylandinput_p.h> #include "qwldatadevice_p.h" #include "qwldatasource_p.h" -#include "qwlinputdevice_p.h" #include "qwldataoffer_p.h" #include "qwaylandmimehelper.h" @@ -200,7 +200,7 @@ void DataDeviceManager::overrideSelection(const QMimeData &mimeData) m_compositorOwnsSelection = true; QWaylandInputDevice *dev = m_compositor->defaultInputDevice(); - QWaylandSurface *focusSurface = QWaylandInputDevicePrivate::get(dev)->keyboardFocus(); + QWaylandSurface *focusSurface = dev->keyboardFocus(); if (focusSurface) offerFromCompositorToClient( QWaylandInputDevicePrivate::get(dev)->dataDevice()->resourceMap().value(focusSurface->waylandClient())->handle); @@ -243,8 +243,8 @@ void DataDeviceManager::data_device_manager_create_data_source(Resource *resourc void DataDeviceManager::data_device_manager_get_data_device(Resource *resource, uint32_t id, struct ::wl_resource *seat) { - QWaylandInputDevicePrivate *input_device = QWaylandInputDevicePrivate::fromSeatResource(seat); - input_device->clientRequestedDataDevice(this, resource->client(), id); + QWaylandInputDevice *input_device = QWaylandInputDevice::fromSeatResource(seat); + QWaylandInputDevicePrivate::get(input_device)->clientRequestedDataDevice(this, resource->client(), id); } void DataDeviceManager::comp_accept(wl_client *, wl_resource *, uint32_t, const char *) diff --git a/src/compositor/wayland_wrapper/qwlinputdevice.cpp b/src/compositor/wayland_wrapper/qwlinputdevice.cpp deleted file mode 100644 index 12c38bf83..000000000 --- a/src/compositor/wayland_wrapper/qwlinputdevice.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtWaylandCompositor module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwlinputdevice_p.h" - -#include <QtCompositor/QWaylandCompositor> -#include <QtCompositor/private/qwaylandcompositor_p.h> -#include "qwldatadevice_p.h" -#include "qwlinputmethod_p.h" -#include "qwlqttouch_p.h" -#include "qwlqtkey_p.h" -#include "qwaylanddrag.h" -#include "qwlpointer_p.h" -#include "qwlkeyboard_p.h" -#include "qwltouch_p.h" -#include "qwaylandview.h" -#include <QtCompositor/QWaylandClient> - -#include <QtGui/QTouchEvent> - -QT_BEGIN_NAMESPACE - -QWaylandInputDevicePrivate::QWaylandInputDevicePrivate(QWaylandInputDevice *inputdevice, QWaylandCompositor *compositor) - : QObjectPrivate() - , QtWaylandServer::wl_seat(compositor->display(), 3) - , m_dragHandle(new QWaylandDrag(inputdevice)) - , m_compositor(compositor) - , m_outputSpace(compositor->primaryOutputSpace()) - , m_mouseFocus(Q_NULLPTR) - , m_capabilities() - , m_inputMethod(m_compositor->extensionFlags() & QWaylandCompositor::TextInputExtension ? new QtWayland::InputMethod(m_compositor, inputdevice) : 0) - , m_data_device() -{ -} - -QWaylandInputDevicePrivate::~QWaylandInputDevicePrivate() -{ -} - -QWaylandPointer *QWaylandInputDevicePrivate::pointerDevice() const -{ - return m_pointer.data(); -} - -QWaylandKeyboard *QWaylandInputDevicePrivate::keyboardDevice() const -{ - return m_keyboard.data(); -} - -QWaylandTouch *QWaylandInputDevicePrivate::touchDevice() const -{ - return m_touch.data(); -} - -QtWayland::InputMethod *QWaylandInputDevicePrivate::inputMethod() -{ - return m_inputMethod.data(); -} - - -void QWaylandInputDevicePrivate::seat_destroy_resource(wl_seat::Resource *) -{ -// cleanupDataDeviceForClient(resource->client(), true); -} - -void QWaylandInputDevicePrivate::seat_bind_resource(wl_seat::Resource *resource) -{ - // The order of m_capabilities matches the order defined in the wayland protocol - wl_seat::send_capabilities(resource->handle, (uint32_t)m_capabilities); -} - -void QWaylandInputDevicePrivate::setCapabilities(QWaylandInputDevice::CapabilityFlags caps) -{ - Q_Q(QWaylandInputDevice); - if (m_capabilities != caps) { - QWaylandInputDevice::CapabilityFlags changed = caps ^ m_capabilities; - - if (changed & QWaylandInputDevice::Pointer) { - m_pointer.reset(m_pointer.isNull() ? QWaylandCompositorPrivate::get(compositor())->callCreatePointerDevice(q) : 0); - } - - if (changed & QWaylandInputDevice::Keyboard) { - m_keyboard.reset(m_keyboard.isNull() ? QWaylandCompositorPrivate::get(compositor())->callCreateKeyboardDevice(q) : 0); - } - - if (changed & QWaylandInputDevice::Touch) { - m_touch.reset(m_touch.isNull() ? QWaylandCompositorPrivate::get(compositor())->callCreateTouchDevice(q) : 0); - } - - m_capabilities = caps; - QList<Resource *> resources = resourceMap().values(); - for (int i = 0; i < resources.size(); i++) { - wl_seat::send_capabilities(resources.at(i)->handle, (uint32_t)m_capabilities); - } - } -} - -void QWaylandInputDevicePrivate::seat_get_pointer(wl_seat::Resource *resource, uint32_t id) -{ - if (!m_pointer.isNull()) { - m_pointer->addClient(QWaylandClient::fromWlClient(m_compositor, resource->client()), id); - } -} - -void QWaylandInputDevicePrivate::seat_get_keyboard(wl_seat::Resource *resource, uint32_t id) -{ - if (!m_keyboard.isNull()) { - m_keyboard->addClient(QWaylandClient::fromWlClient(m_compositor, resource->client()), id); - } -} - -void QWaylandInputDevicePrivate::seat_get_touch(wl_seat::Resource *resource, uint32_t id) -{ - if (!m_touch.isNull()) { - m_touch->addClient(QWaylandClient::fromWlClient(m_compositor, resource->client()), id); - } -} - -void QWaylandInputDevicePrivate::sendMousePressEvent(Qt::MouseButton button) -{ - pointerDevice()->sendMousePressEvent(button); -} - -void QWaylandInputDevicePrivate::sendMouseReleaseEvent(Qt::MouseButton button) -{ - pointerDevice()->sendMouseReleaseEvent(button); -} - -void QWaylandInputDevicePrivate::sendMouseMoveEvent(QWaylandView *view, const QPointF &localPos, const QPointF &globalPos) -{ - pointerDevice()->sendMouseMoveEvent(view, localPos,globalPos); -} - -void QWaylandInputDevicePrivate::sendMouseWheelEvent(Qt::Orientation orientation, int delta) -{ - pointerDevice()->sendMouseWheelEvent(orientation, delta); -} - -void QWaylandInputDevicePrivate::sendTouchPointEvent(int id, const QPointF &point, Qt::TouchPointState state) -{ - if (m_touch.isNull()) { - return; - } - m_touch->sendTouchPointEvent(id, point,state); -} - -void QWaylandInputDevicePrivate::sendTouchFrameEvent() -{ - if (!m_touch.isNull()) { - m_touch->sendFrameEvent(); - } -} - -void QWaylandInputDevicePrivate::sendTouchCancelEvent() -{ - if (!m_touch.isNull()) { - m_touch->sendCancelEvent(); - } -} - -void QWaylandInputDevicePrivate::sendFullKeyEvent(QKeyEvent *event) -{ - if (!keyboardFocus()) { - qWarning("Cannot send key event, no keyboard focus, fix the compositor"); - return; - } - - QtWayland::QtKeyExtensionGlobal *ext = QtWayland::QtKeyExtensionGlobal::findIn(m_compositor); - if (ext && ext->postQtKeyEvent(event, keyboardFocus())) - return; - - if (!m_keyboard.isNull() && !event->isAutoRepeat()) { - if (event->type() == QEvent::KeyPress) - m_keyboard->sendKeyPressEvent(event->nativeScanCode()); - else if (event->type() == QEvent::KeyRelease) - m_keyboard->sendKeyReleaseEvent(event->nativeScanCode()); - } -} - -void QWaylandInputDevicePrivate::sendFullKeyEvent(QWaylandSurface *surface, QKeyEvent *event) -{ - QtWayland::QtKeyExtensionGlobal *ext = QtWayland::QtKeyExtensionGlobal::findIn(m_compositor); - if (ext) - ext->postQtKeyEvent(event, surface); -} - -void QWaylandInputDevicePrivate::sendFullTouchEvent(QTouchEvent *event) -{ - if (!mouseFocus()) { - qWarning("Cannot send touch event, no pointer focus, fix the compositor"); - return; - } - - if (!m_touch) - return; - - m_touch->sendFullTouchEvent(event); -} - -QWaylandSurface *QWaylandInputDevicePrivate::keyboardFocus() const -{ - if (m_keyboard.isNull() || !m_keyboard->focus()) - return Q_NULLPTR; - - return m_keyboard->focus(); -} - -/*! - * \return True if the keyboard focus is changed successfully. False for inactive transient surfaces. - */ -bool QWaylandInputDevicePrivate::setKeyboardFocus(QWaylandSurface *surface) -{ - if (surface && surface->isDestroyed()) - return false; - - if (!m_keyboard.isNull() && m_keyboard->setFocus(surface)) { - if (m_data_device) - m_data_device->setFocus(m_keyboard->focusClient()); - return true; - } - return false; -} - -QWaylandView *QWaylandInputDevicePrivate::mouseFocus() const -{ - return m_mouseFocus; -} - -void QWaylandInputDevicePrivate::setMouseFocus(QWaylandView *focus) -{ - Q_Q(QWaylandInputDevice); - if (focus == m_mouseFocus) - return; - - QWaylandView *oldFocus = m_mouseFocus; - m_mouseFocus = focus; - q->mouseFocusChanged(m_mouseFocus, oldFocus); -} - -void QWaylandInputDevicePrivate::clientRequestedDataDevice(QtWayland::DataDeviceManager *, struct wl_client *client, uint32_t id) -{ - Q_Q(QWaylandInputDevice); - if (!m_data_device) - m_data_device.reset(new QtWayland::DataDevice(q)); - m_data_device->add(client, id, 1); -} - -QWaylandCompositor *QWaylandInputDevicePrivate::compositor() const -{ - return m_compositor; -} - -QWaylandDrag *QWaylandInputDevicePrivate::dragHandle() const -{ - return m_dragHandle.data(); -} - -const QtWayland::DataDevice *QWaylandInputDevicePrivate::dataDevice() const -{ - return m_data_device.data(); -} - -QWaylandOutputSpace *QWaylandInputDevicePrivate::outputSpace() const -{ - return m_outputSpace; -} - -void QWaylandInputDevicePrivate::setOutputSpace(QWaylandOutputSpace *outputSpace) -{ - m_outputSpace = outputSpace; -} - -QWaylandInputDevicePrivate *QWaylandInputDevicePrivate::get(QWaylandInputDevice *device) -{ - return device->d_func(); -} - -QT_END_NAMESPACE diff --git a/src/compositor/wayland_wrapper/qwlinputmethod.cpp b/src/compositor/wayland_wrapper/qwlinputmethod.cpp index 59b23cdd3..106cb40a7 100644 --- a/src/compositor/wayland_wrapper/qwlinputmethod.cpp +++ b/src/compositor/wayland_wrapper/qwlinputmethod.cpp @@ -37,7 +37,6 @@ #include "qwlinputmethod_p.h" #include <QtCompositor/QWaylandCompositor> -#include "qwlinputdevice_p.h" #include "qwlinputmethodcontext_p.h" #include "qwlinputpanel_p.h" #include "qwlkeyboard_p.h" diff --git a/src/compositor/wayland_wrapper/qwlpointer.cpp b/src/compositor/wayland_wrapper/qwlpointer.cpp index 28a72b76e..5f5068f5c 100644 --- a/src/compositor/wayland_wrapper/qwlpointer.cpp +++ b/src/compositor/wayland_wrapper/qwlpointer.cpp @@ -37,7 +37,6 @@ #include "qwlpointer_p.h" -#include "qwlinputdevice_p.h" #include "qwlkeyboard_p.h" #include "qwaylandcompositor.h" #include "qwaylandview.h" diff --git a/src/compositor/wayland_wrapper/wayland_wrapper.pri b/src/compositor/wayland_wrapper/wayland_wrapper.pri index 66de019cc..96d05116e 100644 --- a/src/compositor/wayland_wrapper/wayland_wrapper.pri +++ b/src/compositor/wayland_wrapper/wayland_wrapper.pri @@ -9,7 +9,6 @@ HEADERS += \ wayland_wrapper/qwldatadevicemanager_p.h \ wayland_wrapper/qwldataoffer_p.h \ wayland_wrapper/qwldatasource_p.h \ - wayland_wrapper/qwlinputdevice_p.h \ wayland_wrapper/qwlinputmethod_p.h \ wayland_wrapper/qwlinputmethodcontext_p.h \ wayland_wrapper/qwlkeyboard_p.h \ @@ -24,7 +23,6 @@ SOURCES += \ wayland_wrapper/qwldatadevicemanager.cpp \ wayland_wrapper/qwldataoffer.cpp \ wayland_wrapper/qwldatasource.cpp \ - wayland_wrapper/qwlinputdevice.cpp \ wayland_wrapper/qwlinputmethod.cpp \ wayland_wrapper/qwlinputmethodcontext.cpp \ wayland_wrapper/qwlkeyboard.cpp \ |