File indexing completed on 2024-11-03 05:01:02
0001 /* 0002 SPDX-FileCopyrightText: 2018 Roman Gilg <subdiff@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 #ifndef POINTERCONSTRAINTSTEST_H 0007 #define POINTERCONSTRAINTSTEST_H 0008 0009 #include <QObject> 0010 #include <QQuickView> 0011 0012 #include <xcb/xcb.h> 0013 0014 namespace KWayland 0015 { 0016 namespace Client 0017 { 0018 0019 class ConnectionThread; 0020 class Registry; 0021 class Compositor; 0022 class Seat; 0023 class Pointer; 0024 class PointerConstraints; 0025 class LockedPointer; 0026 class ConfinedPointer; 0027 0028 } 0029 } 0030 0031 class MainWindow; 0032 0033 class Backend : public QObject 0034 { 0035 Q_OBJECT 0036 public: 0037 Backend(QObject *parent = nullptr) 0038 : QObject(parent) 0039 { 0040 } 0041 0042 Q_PROPERTY(int mode READ mode CONSTANT) 0043 Q_PROPERTY(bool lockHint MEMBER m_lockHint NOTIFY lockHintChanged) 0044 Q_PROPERTY(bool errorsAllowed READ errorsAllowed WRITE setErrorsAllowed NOTIFY errorsAllowedChanged) 0045 0046 virtual void init(QQuickView *view) 0047 { 0048 m_view = view; 0049 } 0050 int mode() const 0051 { 0052 return (int)m_mode; 0053 } 0054 0055 bool lockHint() const 0056 { 0057 return m_lockHint; 0058 } 0059 bool errorsAllowed() const 0060 { 0061 return m_errorsAllowed; 0062 } 0063 void setErrorsAllowed(bool set) 0064 { 0065 if (m_errorsAllowed == set) { 0066 return; 0067 } 0068 m_errorsAllowed = set; 0069 Q_EMIT errorsAllowedChanged(); 0070 } 0071 0072 Q_INVOKABLE virtual void lockRequest(bool persistent = true, QRect region = QRect()) 0073 { 0074 } 0075 Q_INVOKABLE virtual void unlockRequest() 0076 { 0077 } 0078 0079 Q_INVOKABLE virtual void confineRequest(bool persistent = true, QRect region = QRect()) 0080 { 0081 } 0082 Q_INVOKABLE virtual void unconfineRequest() 0083 { 0084 } 0085 Q_INVOKABLE virtual void hideAndConfineRequest(bool confineBeforeHide = false) 0086 { 0087 } 0088 Q_INVOKABLE virtual void undoHideRequest() 0089 { 0090 } 0091 0092 Q_SIGNALS: 0093 void confineChanged(bool confined); 0094 void lockChanged(bool locked); 0095 void lockHintChanged(); 0096 void errorsAllowedChanged(); 0097 void forceSurfaceCommit(); 0098 0099 protected: 0100 enum class Mode { 0101 Wayland = 0, 0102 X = 1 0103 }; 0104 0105 QQuickView *view() const 0106 { 0107 return m_view; 0108 } 0109 void setMode(Mode set) 0110 { 0111 m_mode = set; 0112 } 0113 0114 private: 0115 QQuickView *m_view; 0116 Mode m_mode; 0117 0118 bool m_lockHint = true; 0119 bool m_errorsAllowed = false; 0120 }; 0121 0122 class WaylandBackend : public Backend 0123 { 0124 Q_OBJECT 0125 public: 0126 WaylandBackend(QObject *parent = nullptr); 0127 0128 void init(QQuickView *view) override; 0129 0130 void lockRequest(bool persistent, QRect region) override; 0131 void unlockRequest() override; 0132 0133 void confineRequest(bool persistent, QRect region) override; 0134 void unconfineRequest() override; 0135 0136 private: 0137 void setupRegistry(KWayland::Client::Registry *registry); 0138 0139 bool isLocked(); 0140 bool isConfined(); 0141 0142 void cleanupLock(); 0143 void cleanupConfine(); 0144 0145 KWayland::Client::ConnectionThread *m_connectionThreadObject; 0146 KWayland::Client::Compositor *m_compositor = nullptr; 0147 KWayland::Client::Seat *m_seat = nullptr; 0148 KWayland::Client::Pointer *m_pointer = nullptr; 0149 KWayland::Client::PointerConstraints *m_pointerConstraints = nullptr; 0150 0151 KWayland::Client::LockedPointer *m_lockedPointer = nullptr; 0152 bool m_lockedPointerPersistent = false; 0153 KWayland::Client::ConfinedPointer *m_confinedPointer = nullptr; 0154 bool m_confinedPointerPersistent = false; 0155 }; 0156 0157 class XBackend : public Backend 0158 { 0159 Q_OBJECT 0160 public: 0161 XBackend(QObject *parent = nullptr); 0162 0163 void init(QQuickView *view) override; 0164 0165 void lockRequest(bool persistent, QRect region) override; 0166 void unlockRequest() override; 0167 0168 void confineRequest(bool persistent, QRect region) override; 0169 void unconfineRequest() override; 0170 0171 void hideAndConfineRequest(bool confineBeforeHide) override; 0172 void undoHideRequest() override; 0173 0174 private: 0175 bool tryConfine(int &error); 0176 xcb_connection_t *m_xcbConn = nullptr; 0177 }; 0178 0179 #endif