File indexing completed on 2024-05-19 05:32:39

0001 /*
0002     SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
0003     SPDX-FileCopyrightText: 2020 Adrien Faveraux <ad1rie3@hotmail.fr>
0004     SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 #pragma once
0009 
0010 #include "pointer.h"
0011 
0012 #include <QList>
0013 #include <QPointF>
0014 #include <QPointer>
0015 
0016 #include "qwayland-server-wayland.h"
0017 
0018 namespace KWin
0019 {
0020 class ClientConnection;
0021 class PointerPinchGestureV1Interface;
0022 class PointerSwipeGestureV1Interface;
0023 class PointerHoldGestureV1Interface;
0024 class RelativePointerV1Interface;
0025 
0026 class PointerInterfacePrivate : public QtWaylandServer::wl_pointer
0027 {
0028     struct AxisAccumulator
0029     {
0030         struct Axis
0031         {
0032             bool shouldReset(int newDirection, std::chrono::milliseconds newTimestamp) const;
0033 
0034             void reset()
0035             {
0036                 axis120 = 0;
0037                 axis = 0;
0038             }
0039 
0040             qint32 axis120 = 0;
0041             qreal axis = 0;
0042             int direction = 0;
0043             std::chrono::milliseconds timestamp = std::chrono::milliseconds::zero();
0044         };
0045 
0046         Axis &axis(Qt::Orientation orientation)
0047         {
0048             const int index = orientation == Qt::Orientation::Horizontal ? 0 : 1;
0049             return m_axis[index];
0050         }
0051 
0052     private:
0053         Axis m_axis[2];
0054     };
0055 
0056 public:
0057     static PointerInterfacePrivate *get(PointerInterface *pointer);
0058 
0059     PointerInterfacePrivate(PointerInterface *q, SeatInterface *seat);
0060     ~PointerInterfacePrivate() override;
0061 
0062     QList<Resource *> pointersForClient(ClientConnection *client) const;
0063 
0064     PointerInterface *q;
0065     SeatInterface *seat;
0066     SurfaceInterface *focusedSurface = nullptr;
0067     quint32 focusedSerial = 0;
0068     QMetaObject::Connection destroyConnection;
0069     std::unique_ptr<PointerSurfaceCursor> cursor;
0070     std::unique_ptr<RelativePointerV1Interface> relativePointersV1;
0071     std::unique_ptr<PointerSwipeGestureV1Interface> swipeGesturesV1;
0072     std::unique_ptr<PointerPinchGestureV1Interface> pinchGesturesV1;
0073     std::unique_ptr<PointerHoldGestureV1Interface> holdGesturesV1;
0074     QPointF lastPosition;
0075     AxisAccumulator axisAccumulator;
0076 
0077     void sendLeave(quint32 serial);
0078     void sendEnter(const QPointF &parentSurfacePosition, quint32 serial);
0079     void sendFrame();
0080 
0081 protected:
0082     void pointer_set_cursor(Resource *resource, uint32_t serial, ::wl_resource *surface_resource, int32_t hotspot_x, int32_t hotspot_y) override;
0083     void pointer_release(Resource *resource) override;
0084     void pointer_bind_resource(Resource *resource) override;
0085 };
0086 
0087 }