File indexing completed on 2025-04-27 11:32:59
0001 /* 0002 KWin - the KDE window manager 0003 This file is part of the KDE project. 0004 0005 SPDX-FileCopyrightText: 2013 Martin Gräßlin <mgraesslin@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 #pragma once 0010 #include "cursor.h" 0011 0012 #include <QTimer> 0013 #include <memory> 0014 0015 namespace KWin 0016 { 0017 class XFixesCursorEventFilter; 0018 0019 class KWIN_EXPORT X11Cursor : public Cursor 0020 { 0021 Q_OBJECT 0022 public: 0023 X11Cursor(QObject *parent, bool xInputSupport = false); 0024 ~X11Cursor() override; 0025 0026 void schedulePoll() 0027 { 0028 m_needsPoll = true; 0029 } 0030 0031 /** 0032 * @internal 0033 * 0034 * Called from X11 event handler. 0035 */ 0036 void notifyCursorChanged(); 0037 0038 protected: 0039 void doSetPos() override; 0040 void doGetPos() override; 0041 void doStartMousePolling() override; 0042 void doStopMousePolling() override; 0043 void doStartCursorTracking() override; 0044 void doStopCursorTracking() override; 0045 0046 private Q_SLOTS: 0047 /** 0048 * Because of QTimer's and the impossibility to get events for all mouse 0049 * movements (at least I haven't figured out how) the position needs 0050 * to be also refetched after each return to the event loop. 0051 */ 0052 void resetTimeStamp(); 0053 void mousePolled(); 0054 void aboutToBlock(); 0055 0056 private: 0057 xcb_timestamp_t m_timeStamp; 0058 uint16_t m_buttonMask; 0059 QTimer m_resetTimeStampTimer; 0060 QTimer m_mousePollingTimer; 0061 bool m_hasXInput; 0062 bool m_needsPoll; 0063 0064 std::unique_ptr<XFixesCursorEventFilter> m_xfixesFilter; 0065 0066 friend class Cursor; 0067 }; 0068 0069 }