KWin
Loading...
Searching...
No Matches
x11_standalone_cursor.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2013 Martin Gräßlin <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
10#include "input.h"
11#include "keyboard_input.h"
12#include "utils/common.h"
13#include "utils/xcbutils.h"
15
16#include <QAbstractEventDispatcher>
17#include <QTimer>
18
19namespace KWin
20{
21
22X11Cursor::X11Cursor(bool xInputSupport)
23 : Cursor()
24 , m_timeStamp(XCB_TIME_CURRENT_TIME)
25 , m_buttonMask(0)
26 , m_hasXInput(xInputSupport)
27 , m_needsPoll(false)
28{
29 Cursors::self()->setMouse(this);
30 m_resetTimeStampTimer.setSingleShot(true);
31 connect(&m_resetTimeStampTimer, &QTimer::timeout, this, &X11Cursor::resetTimeStamp);
32 // TODO: How often do we really need to poll?
33 m_mousePollingTimer.setInterval(50);
34 connect(&m_mousePollingTimer, &QTimer::timeout, this, &X11Cursor::mousePolled);
35
36 if (m_hasXInput) {
37 connect(qApp->eventDispatcher(), &QAbstractEventDispatcher::aboutToBlock, this, &X11Cursor::aboutToBlock);
38 }
39
40#ifndef KCMRULES
41 connect(kwinApp(), &Application::workspaceCreated, this, [this]() {
42 if (Xcb::Extensions::self()->isFixesAvailable()) {
43 m_xfixesFilter = std::make_unique<XFixesCursorEventFilter>(this);
44 }
45 });
46#endif
47}
48
52
54{
55 const QPointF &pos = currentPos();
56 xcb_warp_pointer(connection(), XCB_WINDOW_NONE, rootWindow(), 0, 0, 0, 0, pos.x(), pos.y());
57 // call default implementation to emit signal
59}
60
62{
63 if (m_timeStamp != XCB_TIME_CURRENT_TIME && m_timeStamp == xTime()) {
64 // time stamps did not change, no need to query again
65 return;
66 }
67 m_timeStamp = xTime();
68 Xcb::Pointer pointer(rootWindow());
69 if (pointer.isNull()) {
70 return;
71 }
72 m_buttonMask = pointer->mask;
73 updatePos(QPointF(pointer->root_x, pointer->root_y));
74 m_resetTimeStampTimer.start(0);
75}
76
77void X11Cursor::resetTimeStamp()
78{
79 m_timeStamp = XCB_TIME_CURRENT_TIME;
80}
81
82void X11Cursor::aboutToBlock()
83{
84 if (m_needsPoll) {
85 mousePolled();
86 m_needsPoll = false;
87 }
88}
89
91{
92 if (!m_hasXInput) {
93 m_mousePollingTimer.start();
94 }
95}
96
98{
99 if (!m_hasXInput) {
100 m_mousePollingTimer.stop();
101 }
102}
103
105{
106 xcb_xfixes_select_cursor_input(connection(), rootWindow(), XCB_XFIXES_CURSOR_NOTIFY_MASK_DISPLAY_CURSOR);
107}
108
110{
111 xcb_xfixes_select_cursor_input(connection(), rootWindow(), 0);
112}
113
114void X11Cursor::mousePolled()
115{
116 static QPointF lastPos = currentPos();
117 static uint16_t lastMask = m_buttonMask;
118 doGetPos(); // Update if needed
119 if (lastPos != currentPos() || lastMask != m_buttonMask) {
120 Q_EMIT mouseChanged(currentPos(), lastPos,
121 x11ToQtMouseButtons(m_buttonMask), x11ToQtMouseButtons(lastMask),
122 x11ToQtKeyboardModifiers(m_buttonMask), x11ToQtKeyboardModifiers(lastMask));
123 lastPos = currentPos();
124 lastMask = m_buttonMask;
125 }
126}
127
129{
130 if (!isCursorTracking()) {
131 // cursor change tracking is currently disabled, so don't emit signal
132 return;
133 }
134 Q_EMIT cursorChanged();
135}
136
137}
138
139#include "moc_x11_standalone_cursor.cpp"
Replacement for QCursor.
Definition cursor.h:102
QPointF pos()
Definition cursor.cpp:204
void mouseChanged(const QPointF &pos, const QPointF &oldpos, Qt::MouseButtons buttons, Qt::MouseButtons oldbuttons, Qt::KeyboardModifiers modifiers, Qt::KeyboardModifiers oldmodifiers)
bool isCursorTracking() const
Definition cursor.h:327
void updatePos(const QPointF &pos)
Definition cursor.cpp:274
const QPointF & currentPos() const
Definition cursor.h:312
void cursorChanged()
Signal emitted when the cursor image changes.
virtual void doSetPos()
Definition cursor.cpp:265
static Cursors * self()
Definition cursor.cpp:35
void setMouse(Cursor *mouse)
Definition cursor.h:271
void doStopMousePolling() override
void doStartMousePolling() override
void doStartCursorTracking() override
void doStopCursorTracking() override
X11Cursor(bool xInputSupport=false)
static Extensions * self()
Definition xcbutils.cpp:346
KWIN_EXPORT xcb_window_t rootWindow()
Definition xcb.h:24
Qt::MouseButtons x11ToQtMouseButtons(int state)
Definition common.cpp:155
KWIN_EXPORT xcb_timestamp_t xTime()
Definition xcb.h:29
KWIN_EXPORT xcb_connection_t * connection()
Definition xcb.h:19
Qt::KeyboardModifiers x11ToQtKeyboardModifiers(int state)
Definition common.cpp:176