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 }