Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_extended_modifiers_mapper_osx.mm
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2020 Ivan SantaMarĂ­a <ghevan@gmail.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
8
9#import <QDebug>
10#import <QFlag>
11#import <qmutex.h>
12#import <AppKit/AppKit.h>
13
15
17{
18public:
19 enum Modifier {
20 None = 0x0,
21 Space = 0x1,
22 Shift = 0x2,
23 Control = 0x4,
24 Option = 0x8,
25 Command = 0x10,
26 Key_R = 0x20,
27 Key_V = 0x40
28 };
29 Q_DECLARE_FLAGS(Modifiers, Modifier)
30};
31
32Q_DECLARE_OPERATORS_FOR_FLAGS(ExtendedModifiers::Modifiers)
33
34static id localMonitor = 0;
35
37static QMutex mutex;
38
39void processEvent(NSEvent *event)
40{
41 unsigned int eventType = [event type];
42
43 if (eventType == NSEventTypeKeyDown || eventType == NSEventTypeKeyUp) {
44 unsigned short keyCode = [event keyCode];
45
46 // virtual kbd codes
47 if(keyCode == 49) {
48 extendedMods.setFlag(ExtendedModifiers::Space, (eventType == NSEventTypeKeyDown));
49 } else if (keyCode == 15) {
50 extendedMods.setFlag(ExtendedModifiers::Key_R, (eventType == NSEventTypeKeyDown));
51 } else if (keyCode == 9) {
52 extendedMods.setFlag(ExtendedModifiers::Key_V, (eventType == NSEventTypeKeyDown));
53 }
54 }
55
56 if (eventType == NSEventTypeFlagsChanged) {
57 NSEventModifierFlags modifiers = [event modifierFlags];
58 extendedMods.setFlag(ExtendedModifiers::Shift, modifiers & NSEventModifierFlagShift);
59 extendedMods.setFlag(ExtendedModifiers::Command, modifiers & NSEventModifierFlagCommand);
60 extendedMods.setFlag(ExtendedModifiers::Control, modifiers & NSEventModifierFlagControl);
61 extendedMods.setFlag(ExtendedModifiers::Option, modifiers & NSEventModifierFlagOption);
62 }
63 if (eventType == NSEventTypeMouseExited) {
65 }
66}
67
68void activateLocalMonitor(bool activate)
69{
70 if (activate) {
71 if (localMonitor) {
72 return;
73 }
74 NSEventMask eventMask = (NSEventMaskFlagsChanged | NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskLeftMouseUp
75 | NSEventMaskLeftMouseDown | NSEventMaskMouseEntered | NSEventMaskMouseExited );
76 localMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^(NSEvent *event)
77 {
78 mutex.lock();
79 processEvent(event);
80 mutex.unlock();
81
82 return event;
83 }];
84
85 } else {
87 if (localMonitor) {
88 [NSEvent removeMonitor:localMonitor];
89 localMonitor = 0;
90 }
91 }
92}
93
95{
96 QVector<Qt::Key> result;
97
98 mutex.lock();
100 result << Qt::Key_Space;
101 }
103 result << Qt::Key_R;
104 }
106 result << Qt::Key_V;
107 }
108
109 Qt::KeyboardModifiers modifiers = QGuiApplication::queryKeyboardModifiers();
110 if (modifiers.testFlag(Qt::ShiftModifier) || extendedMods.testFlag(ExtendedModifiers::Shift)) {
111 result << Qt::Key_Shift;
112 }
113 if (modifiers.testFlag(Qt::ControlModifier) || extendedMods.testFlag(ExtendedModifiers::Command)) {
114 result << Qt::Key_Control;
115 }
116 if (modifiers.testFlag(Qt::MetaModifier) || extendedMods.testFlag(ExtendedModifiers::Control)) {
117 result << Qt::Key_Meta;
118 }
119 if (modifiers.testFlag(Qt::AltModifier) || extendedMods.testFlag(ExtendedModifiers::Option)) {
120 result << Qt::Key_Alt;
121 }
122 mutex.unlock();
123
125
126 return result;
127}
Q_DECLARE_FLAGS(KisUpdaterContextSnapshotEx, KisUpdaterContextSnapshotExTag)
Q_DECLARE_OPERATORS_FOR_FLAGS(KisBaseRectsWalker::SubtreeVisitFlags)
void processEvent(NSEvent *event)
void activateLocalMonitor(bool activate)
static ExtendedModifiers::Modifiers extendedMods
QVector< Qt::Key > queryPressedKeysMac()
static QMutex mutex
void makeContainerUnique(C &container)