Krita Source Code Documentation
Loading...
Searching...
No Matches
KisInputEventsEater.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Michael Abrahams <miabraha@gmail.com>
3 * SPDX-FileCopyrightText: 2026 Dmitry Kazakov <dimula73@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#include <kritaui_export.h>
9
10#include <kis_debug.h>
12
14
15#ifdef Q_OS_LINUX
16#define KRITA_ENABLE_MISSING_PROXIMITY_ENTER_WORKAROUND
17#endif
18
19#ifdef KRITA_ENABLE_MISSING_PROXIMITY_ENTER_WORKAROUND
20#include <optional>
21#endif /* KRITA_ENABLE_MISSING_PROXIMITY_ENTER_WORKAROUND */
22
23
24class KRITAUI_EXPORT KisInputEventsEater
25{
26public:
28 NotBlocked = 0x0,
29 BlockedByTabletProximity = 0x01,
30 BlockedByTabletHover = 0x02,
31 BlockedByTabletPress = 0x04,
32 BlockedByTouchPress = 0x08,
33 BlockedByNextPressSuppression = 0x10,
34 BlockedByButtonsWorkaround = 0x20,
35 BlockedBySynthetic = 0x40
36 };
37 Q_DECLARE_FLAGS(EventBlockingReasons, EventBlockingReason)
38public:
40
41 bool eventFilter(QObject *target, QEvent *event);
42
43 void notifyTabletEnterProximity();
44 void notifyTabletLeaveProximity();
45
46 // On Windows, we sometimes receive mouse events very late, so watch & wait.
47 void eatOneMousePress();
48
49 template<class Event>
50 static void debugEvent(QEvent *event, EventBlockingReasons reasons = NotBlocked)
51 {
53 return;
54
55 QString reasonsString;
56
57 if (reasons.testFlag(BlockedByTabletProximity)) {
58 reasonsString += "Prx";
59 }
60
61 if (reasons.testFlag(BlockedByTabletHover)) {
62 reasonsString += "Hov";
63 }
64
65 if (reasons.testFlag(BlockedByTabletPress)) {
66 reasonsString += "Prs";
67 }
68
69 if (reasons.testFlag(BlockedByNextPressSuppression)) {
70 reasonsString += "Nxt";
71 }
72
73 if (reasons.testFlag(BlockedByTouchPress)) {
74 reasonsString += "Tch";
75 }
76
77 if (reasons.testFlag(BlockedBySynthetic)) {
78 reasonsString += "Syn";
79 }
80
81 QString msg1 = QString("[%1] ").arg(reasonsString, 15);
82 Event *specificEvent = static_cast<Event *>(event);
83 dbgTablet << KisTabletDebugger::instance()->eventToString(*specificEvent, msg1);
84 }
85
86private:
87
88 bool eatOneMousePressEvent{false}; // Eat a single mouse press event
89 bool activateSecondaryButtonsWorkaround{false}; // Use mouse events for right- and middle-clicks
90
91 bool tabletIsInProximity{false};
92 bool tabletIsHovering{false};
93 bool tabletIsPressed{false};
94 bool touchIsActive{false};
95
96#ifdef KRITA_ENABLE_MISSING_PROXIMITY_ENTER_WORKAROUND
117 struct MissingTabletProximityEnterWorkaround {
118 int numSequentialMouseEvents = 0;
119
120 void notifyTabletEventArrived() {
121 numSequentialMouseEvents = 0;
122 }
123
124 void notifyMouseEventArrived() {
125 numSequentialMouseEvents++;
126 }
127
128 bool shouldForgetAboutTabletInProximity() const {
129 return numSequentialMouseEvents > 10;
130 }
131 };
132 std::optional<MissingTabletProximityEnterWorkaround> missingTabletProximityEventsWorkaround;
133#endif /* KRITA_ENABLE_MISSING_PROXIMITY_ENTER_WORKAROUND */
134
135private:
136 void debugEaterStateTransition(const QLatin1String &stateName,
137 bool newValue,
138 QEvent::Type eventType,
139 const QLatin1String &comment = QLatin1String());
140};
141
142Q_DECLARE_OPERATORS_FOR_FLAGS(KisInputEventsEater::EventBlockingReasons)
KisMagneticGraph::vertex_descriptor target(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
Q_DECLARE_FLAGS(KisUpdaterContextSnapshotEx, KisUpdaterContextSnapshotExTag)
static bool debugEnabled()
Linethickness.
static void debugEvent(QEvent *event, EventBlockingReasons reasons=NotBlocked)
QString eventToString(const QMouseEvent &ev, const QString &prefix)
static KisTabletDebugger * instance()
Tool Invocation action of KisAbstractInputAction.
Q_DECLARE_OPERATORS_FOR_FLAGS(KisBaseRectsWalker::SubtreeVisitFlags)
#define dbgTablet
Definition kis_debug.h:62