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 }