Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_input_manager_p.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Michael Abrahams <miabraha@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7
8#include <QList>
9#include <QPointer>
10#include <QEvent>
11#include <QTouchEvent>
12#include <QScopedPointer>
13#include <QQueue>
14
15#include "kis_input_manager.h"
18#include "kis_canvas2.h"
19#include "kis_tool_proxy.h"
24#include "kis_latency_tracker.h"
25
27
28
30{
31public:
32 static constexpr int TOUCH_HOLD_DELAY_MS = 400;
33
35 void addStrokeShortcut(KisAbstractInputAction* action, int index, const QList< Qt::Key >& modifiers, Qt::MouseButtons buttons);
36 void addKeyShortcut(KisAbstractInputAction* action, int index,const QList<Qt::Key> &keys);
40 bool processUnhandledEvent(QEvent *event);
41 void setupActions();
42 bool handleCompressedTabletEvent(QEvent *event);
44 void fixShortcutMatcherModifiersState(QVector<Qt::Key> newKeys, Qt::KeyboardModifiers modifiers);
45
47
50
53
55
57
59
60 QObject *eventsReceiver = 0;
62 QScopedPointer<QEvent> compressedMoveEvent;
65
66 typedef QPair<int, QPointer<QObject> > PriorityPair;
70
71 bool touchStrokeStarted = false;
72 bool popupWasActive = false;
74
75 QPointF startingPos;
76 QPointF previousPos;
77 QScopedPointer<QEvent> originatingTouchBeginEvent;
78
81
83
86
87 void blockMouseEvents();
88 void allowMouseEvents();
89 void eatOneMousePress();
91 void resetCompressor();
92 void startBlockingTouch();
93 void stopBlockingTouch();
96 bool isPendingTouchHold() const;
97 bool isWithinTouchHoldSlopRange(const QPointF &currentPos) const;
98 void bufferTouchEvent(QTouchEvent *event);
101
102 template <class Event, bool useBlocking>
103 void debugEvent(QEvent *event)
104 {
106
107 QString msg1 = useBlocking && ignoringQtCursorEvents() ? "[BLOCKED] " : "[ ]";
108 Event *specificEvent = static_cast<Event*>(event);
109 dbgTablet << KisTabletDebugger::instance()->eventToString(*specificEvent, msg1);
110 }
111
112 class ProximityNotifier : public QObject
113 {
114 public:
115 ProximityNotifier(Private *_d, QObject *p);
116 bool eventFilter(QObject* object, QEvent* event ) override;
117 private:
119 };
120
121 class CanvasSwitcher : public QObject
122 {
123 public:
124 CanvasSwitcher(Private *_d, QObject *p);
127 bool eventFilter(QObject* object, QEvent* event ) override;
128
129 private:
130 void setupFocusThreshold(QObject *object);
131
132 private:
134 QMap<QObject*, QPointer<KisCanvas2>> canvasResolver;
138 };
140
142 {
143 EventEater();
144
145 bool eventFilter(QObject* target, QEvent* event);
146
147 // This should be called after we're certain a tablet stroke has started.
148 void activate();
149 // This should be called after a tablet stroke has ended.
150 void deactivate();
151
152 // On Windows, we sometimes receive mouse events very late, so watch & wait.
153 void eatOneMousePress();
154
155 // This should be called after the tablet is pressed,
156 void startBlockingTouch();
157 // This should be called after the tablet is released.
158 void stopBlockingTouch();
159
160 bool hungry{false}; // Continue eating mouse strokes
161 bool peckish{false}; // Eat a single mouse press event
162 bool eatSyntheticEvents{false}; // Mask all synthetic events
163 bool activateSecondaryButtonsWorkaround{false}; // Use mouse events for right- and middle-clicks
164 bool eatTouchEvents{false}; // Eat touch interactions
165 };
167
168 bool containsPointer = false;
169
171
173 protected:
174 virtual qint64 currentTimestamp() const override;
175 virtual void print(const QString &message) override;
176 };
177
179#ifdef Q_OS_WIN
180 bool ignoreHighFunctionKeys = false;
181#endif
182};
float value(const T *src, size_t ch)
const Params2D p
KisMagneticGraph::vertex_descriptor target(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
static bool debugEnabled()
Linethickness.
Abstract base class for input actions.
QMap< QObject *, QPointer< KisCanvas2 > > canvasResolver
KisSignalAutoConnectionsStore thresholdConnections
bool eventFilter(QObject *object, QEvent *event) override
bool eventFilter(QObject *object, QEvent *event) override
virtual void print(const QString &message) override
void debugEvent(QEvent *event)
void setMaskSyntheticEvents(bool value)
bool addNativeGestureShortcut(KisAbstractInputAction *action, int index, KisShortcutConfiguration::GestureAction gesture)
bool handleCompressedTabletEvent(QEvent *event)
static constexpr int TOUCH_HOLD_DELAY_MS
void addKeyShortcut(KisAbstractInputAction *action, int index, const QList< Qt::Key > &keys)
void addWheelShortcut(KisAbstractInputAction *action, int index, const QList< Qt::Key > &modifiers, KisShortcutConfiguration::MouseWheelMovement wheelAction)
QPair< int, QPointer< QObject > > PriorityPair
KisToolInvocationAction * defaultInputAction
QVector< QTouchEvent * > bufferedTouchEvents
QScopedPointer< QEvent > originatingTouchBeginEvent
bool isWithinTouchHoldSlopRange(const QPointF &currentPos) const
QPointer< KisToolProxy > toolProxy
KisSignalCompressor moveEventCompressor
void addStrokeShortcut(KisAbstractInputAction *action, int index, const QList< Qt::Key > &modifiers, Qt::MouseButtons buttons)
QList< PriorityPair > PriorityList
QScopedPointer< QEvent > compressedMoveEvent
void bufferTouchEvent(QTouchEvent *event)
QPointer< KisCanvas2 > canvas
bool processUnhandledEvent(QEvent *event)
KisSharedPtr< TabletLatencyTracker > tabletLatencyTracker
void addTouchShortcut(KisAbstractInputAction *action, int index, KisShortcutConfiguration::GestureAction gesture)
KisPopupWidgetInterface * popupWidget
Central object to manage canvas input.
The PopupWidgetInterface abstract class defines the basic interface that will be used by all popup wi...
QString eventToString(const QMouseEvent &ev, const QString &prefix)
static KisTabletDebugger * instance()
Tool Invocation action of KisAbstractInputAction.
#define dbgTablet
Definition kis_debug.h:59
QString buttons(const T &ev)
bool eventFilter(QObject *target, QEvent *event)