7#include <QtCore/private/qmakearray_p.h>
8#include <QtCore/qglobal.h>
9#include <QtCore/qobject.h>
43template<
unsigned int Qt,
char... WebChar>
46 static constexpr const char storage[
sizeof...(WebChar) + 1] = { WebChar...,
'\0' };
51template<
unsigned int Qt,
char... WebChar>
55 QSortedData<Web2Qt<Qt::Key_Alt,
'A',
'l',
't',
'L',
'e',
'f',
't'>,
56 Web2Qt<Qt::Key_Alt,
'A',
'l',
't'>,
57 Web2Qt<Qt::Key_AltGr,
'A',
'l',
't',
'R',
'i',
'g',
'h',
't'>,
58 Web2Qt<Qt::Key_Apostrophe,
'Q',
'u',
'o',
't',
'e'>,
59 Web2Qt<Qt::Key_Backspace,
'B',
'a',
'c',
'k',
's',
'p',
'a',
'c',
'e'>,
60 Web2Qt<Qt::Key_CapsLock,
'C',
'a',
'p',
's',
'L',
'o',
'c',
'k'>,
61 Web2Qt<Qt::Key_Control,
'C',
'o',
'n',
't',
'r',
'o',
'l'>,
62 Web2Qt<Qt::Key_Delete,
'D',
'e',
'l',
'e',
't',
'e'>,
63 Web2Qt<Qt::Key_Down,
'A',
'r',
'r',
'o',
'w',
'D',
'o',
'w',
'n'>,
64 Web2Qt<Qt::Key_Escape,
'E',
's',
'c',
'a',
'p',
'e'>,
65 Web2Qt<Qt::Key_F1,
'F',
'1'>, Web2Qt<Qt::Key_F2,
'F',
'2'>,
66 Web2Qt<Qt::Key_F11,
'F',
'1',
'1'>, Web2Qt<Qt::Key_F12,
'F',
'1',
'2'>,
67 Web2Qt<Qt::Key_F13,
'F',
'1',
'3'>, Web2Qt<Qt::Key_F14,
'F',
'1',
'4'>,
68 Web2Qt<Qt::Key_F15,
'F',
'1',
'5'>, Web2Qt<Qt::Key_F16,
'F',
'1',
'6'>,
69 Web2Qt<Qt::Key_F17,
'F',
'1',
'7'>, Web2Qt<Qt::Key_F18,
'F',
'1',
'8'>,
70 Web2Qt<Qt::Key_F19,
'F',
'1',
'9'>, Web2Qt<Qt::Key_F20,
'F',
'2',
'0'>,
71 Web2Qt<Qt::Key_F21,
'F',
'2',
'1'>, Web2Qt<Qt::Key_F22,
'F',
'2',
'2'>,
72 Web2Qt<Qt::Key_F23,
'F',
'2',
'3'>,
73 Web2Qt<Qt::Key_F3,
'F',
'3'>, Web2Qt<Qt::Key_F4,
'F',
'4'>,
74 Web2Qt<Qt::Key_F5,
'F',
'5'>, Web2Qt<Qt::Key_F6,
'F',
'6'>,
75 Web2Qt<Qt::Key_F7,
'F',
'7'>, Web2Qt<Qt::Key_F8,
'F',
'8'>,
76 Web2Qt<Qt::Key_F9,
'F',
'9'>, Web2Qt<Qt::Key_F10,
'F',
'1',
'0'>,
77 Web2Qt<Qt::Key_Help,
'H',
'e',
'l',
'p'>,
78 Web2Qt<Qt::Key_Home,
'H',
'o',
'm',
'e'>, Web2Qt<Qt::Key_End,
'E',
'n',
'd'>,
79 Web2Qt<Qt::Key_Insert,
'I',
'n',
's',
'e',
'r',
't'>,
80 Web2Qt<Qt::Key_Left,
'A',
'r',
'r',
'o',
'w',
'L',
'e',
'f',
't'>,
81 Web2Qt<Qt::Key_Meta,
'M',
'e',
't',
'a'>, Web2Qt<Qt::Key_Meta,
'O',
'S'>,
82 Web2Qt<Qt::Key_Menu,
'C',
'o',
'n',
't',
'e',
'x',
't',
'M',
'e',
'n',
'u'>,
83 Web2Qt<Qt::Key_NumLock,
'N',
'u',
'm',
'L',
'o',
'c',
'k'>,
84 Web2Qt<Qt::Key_PageDown,
'P',
'a',
'g',
'e',
'D',
'o',
'w',
'n'>,
85 Web2Qt<Qt::Key_PageUp,
'P',
'a',
'g',
'e',
'U',
'p'>,
86 Web2Qt<Qt::Key_Paste,
'P',
'a',
's',
't',
'e'>,
87 Web2Qt<Qt::Key_Pause,
'C',
'l',
'e',
'a',
'r'>,
88 Web2Qt<Qt::Key_Pause,
'P',
'a',
'u',
's',
'e'>,
89 Web2Qt<Qt::Key_QuoteLeft,
'B',
'a',
'c',
'k',
'q',
'u',
'o',
't',
'e'>,
90 Web2Qt<Qt::Key_QuoteLeft,
'I',
'n',
't',
'l',
'B',
'a',
'c',
'k',
's',
'l',
'a',
's',
'h'>,
91 Web2Qt<Qt::Key_Return,
'E',
'n',
't',
'e',
'r'>,
92 Web2Qt<Qt::Key_Right,
'A',
'r',
'r',
'o',
'w',
'R',
'i',
'g',
'h',
't'>,
93 Web2Qt<Qt::Key_ScrollLock,
'S',
'c',
'r',
'o',
'l',
'l',
'L',
'o',
'c',
'k'>,
94 Web2Qt<Qt::Key_Shift,
'S',
'h',
'i',
'f',
't'>,
95 Web2Qt<Qt::Key_Tab,
'T',
'a',
'b'>,
96 Web2Qt<Qt::Key_Up,
'A',
'r',
'r',
'o',
'w',
'U',
'p'>,
97 Web2Qt<Qt::Key_yen,
'I',
'n',
't',
'l',
'Y',
'e',
'n'>>::Data{});
101 Web2Qt<Qt::Key_Aacute,
'\xc3',
'\xa1'>,
102 Web2Qt<Qt::Key_Acircumflex,
'\xc3',
'\xa2'>,
103 Web2Qt<Qt::Key_Adiaeresis,
'\xc3',
'\xa4'>,
104 Web2Qt<Qt::Key_AE,
'\xc3',
'\xa6'>,
105 Web2Qt<Qt::Key_Agrave,
'\xc3',
'\xa0'>,
106 Web2Qt<Qt::Key_Aring,
'\xc3',
'\xa5'>,
107 Web2Qt<Qt::Key_Atilde,
'\xc3',
'\xa3'>,
108 Web2Qt<Qt::Key_Ccedilla,
'\xc3',
'\xa7'>,
109 Web2Qt<Qt::Key_Eacute,
'\xc3',
'\xa9'>,
110 Web2Qt<Qt::Key_Ecircumflex,
'\xc3',
'\xaa'>,
111 Web2Qt<Qt::Key_Ediaeresis,
'\xc3',
'\xab'>,
112 Web2Qt<Qt::Key_Egrave,
'\xc3',
'\xa8'>,
113 Web2Qt<Qt::Key_Iacute,
'\xc3',
'\xad'>,
114 Web2Qt<Qt::Key_Icircumflex,
'\xc3',
'\xae'>,
115 Web2Qt<Qt::Key_Idiaeresis,
'\xc3',
'\xaf'>,
116 Web2Qt<Qt::Key_Igrave,
'\xc3',
'\xac'>,
117 Web2Qt<Qt::Key_Ntilde,
'\xc3',
'\xb1'>,
118 Web2Qt<Qt::Key_Oacute,
'\xc3',
'\xb3'>,
119 Web2Qt<Qt::Key_Ocircumflex,
'\xc3',
'\xb4'>,
120 Web2Qt<Qt::Key_Odiaeresis,
'\xc3',
'\xb6'>,
121 Web2Qt<Qt::Key_Ograve,
'\xc3',
'\xb2'>,
122 Web2Qt<Qt::Key_Ooblique,
'\xc3',
'\xb8'>,
123 Web2Qt<Qt::Key_Otilde,
'\xc3',
'\xb5'>,
124 Web2Qt<Qt::Key_Uacute,
'\xc3',
'\xba'>,
125 Web2Qt<Qt::Key_Ucircumflex,
'\xc3',
'\xbb'>,
126 Web2Qt<Qt::Key_Udiaeresis,
'\xc3',
'\xbc'>,
127 Web2Qt<Qt::Key_Ugrave,
'\xc3',
'\xb9'>,
128 Web2Qt<Qt::Key_Yacute,
'\xc3',
'\xbd'>,
129 Web2Qt<Qt::Key_ydiaeresis,
'\xc3',
'\xbf'>>::Data{});
133 Web2Qt<Qt::Key_Aacute,
'\xc3',
'\x81'>,
134 Web2Qt<Qt::Key_Acircumflex,
'\xc3',
'\x82'>,
135 Web2Qt<Qt::Key_Adiaeresis,
'\xc3',
'\x84'>,
136 Web2Qt<Qt::Key_AE,
'\xc3',
'\x86'>,
137 Web2Qt<Qt::Key_Agrave,
'\xc3',
'\x80'>,
138 Web2Qt<Qt::Key_Aring,
'\xc3',
'\x85'>,
139 Web2Qt<Qt::Key_Atilde,
'\xc3',
'\x83'>,
140 Web2Qt<Qt::Key_Ccedilla,
'\xc3',
'\x87'>,
141 Web2Qt<Qt::Key_Eacute,
'\xc3',
'\x89'>,
142 Web2Qt<Qt::Key_Ecircumflex,
'\xc3',
'\x8a'>,
143 Web2Qt<Qt::Key_Ediaeresis,
'\xc3',
'\x8b'>,
144 Web2Qt<Qt::Key_Egrave,
'\xc3',
'\x88'>,
145 Web2Qt<Qt::Key_Iacute,
'\xc3',
'\x8d'>,
146 Web2Qt<Qt::Key_Icircumflex,
'\xc3',
'\x8e'>,
147 Web2Qt<Qt::Key_Idiaeresis,
'\xc3',
'\x8f'>,
148 Web2Qt<Qt::Key_Igrave,
'\xc3',
'\x8c'>,
149 Web2Qt<Qt::Key_Ntilde,
'\xc3',
'\x91'>,
150 Web2Qt<Qt::Key_Oacute,
'\xc3',
'\x93'>,
151 Web2Qt<Qt::Key_Ocircumflex,
'\xc3',
'\x94'>,
152 Web2Qt<Qt::Key_Odiaeresis,
'\xc3',
'\x96'>,
153 Web2Qt<Qt::Key_Ograve,
'\xc3',
'\x92'>,
154 Web2Qt<Qt::Key_Ooblique,
'\xc3',
'\x98'>,
155 Web2Qt<Qt::Key_Otilde,
'\xc3',
'\x95'>,
156 Web2Qt<Qt::Key_Uacute,
'\xc3',
'\x9a'>,
157 Web2Qt<Qt::Key_Ucircumflex,
'\xc3',
'\x9b'>,
158 Web2Qt<Qt::Key_Udiaeresis,
'\xc3',
'\x9c'>,
159 Web2Qt<Qt::Key_Ugrave,
'\xc3',
'\x99'>,
160 Web2Qt<Qt::Key_Yacute,
'\xc3',
'\x9d'>,
161 Web2Qt<Qt::Key_ydiaeresis,
'\xc5',
'\xb8'>>::Data{});
163static_assert(DiacriticalCharsKeyToTextLowercase.size()
164 == DiacriticalCharsKeyToTextUppercase.size(),
165 "Add the new key to both arrays");
174 { Qt::Key_A, Qt::Key_Atilde },
175 { Qt::Key_N, Qt::Key_Ntilde },
176 { Qt::Key_O, Qt::Key_Otilde },
180 { Qt::Key_A, Qt::Key_Agrave }, { Qt::Key_E, Qt::Key_Egrave }, { Qt::Key_I, Qt::Key_Igrave },
181 { Qt::Key_O, Qt::Key_Ograve }, { Qt::Key_U, Qt::Key_Ugrave },
185 { Qt::Key_A, Qt::Key_Aacute }, { Qt::Key_E, Qt::Key_Eacute }, { Qt::Key_I, Qt::Key_Iacute },
186 { Qt::Key_O, Qt::Key_Oacute }, { Qt::Key_U, Qt::Key_Uacute }, { Qt::Key_Y, Qt::Key_Yacute },
190 { Qt::Key_A, Qt::Key_Adiaeresis }, { Qt::Key_E, Qt::Key_Ediaeresis },
191 { Qt::Key_I, Qt::Key_Idiaeresis }, { Qt::Key_O, Qt::Key_Odiaeresis },
192 { Qt::Key_U, Qt::Key_Udiaeresis }, { Qt::Key_Y, Qt::Key_ydiaeresis },
196 { Qt::Key_A, Qt::Key_Acircumflex }, { Qt::Key_E, Qt::Key_Ecircumflex },
197 { Qt::Key_I, Qt::Key_Icircumflex }, { Qt::Key_O, Qt::Key_Ocircumflex },
198 { Qt::Key_U, Qt::Key_Ucircumflex },
203 while (first != last) {
204 if (first->from == key)
208 return Qt::Key_unknown;
214 return find_impl(map, map + N, key);
220 case Qt::Key_Dead_Grave:
222 case Qt::Key_Dead_Acute:
224 case Qt::Key_Dead_Tilde:
226 case Qt::Key_Dead_Diaeresis:
228 case Qt::Key_Dead_Circumflex:
231 return Qt::Key_unknown;
238 const auto it =
std::find_if(mappingArray.cbegin(), mappingArray.cend(),
240 return it != mappingArray.cend() ? it->web : std::optional<QString>();
247 const auto it =
std::lower_bound(WebToQtKeyCodeMappings.cbegin(), WebToQtKeyCodeMappings.cend(),
249 return it != WebToQtKeyCodeMappings.cend() && searchKey == *it ?
static_cast<Qt::Key>(it->qt)
250 : std::optional<Qt::Key>();
260 m_activeDeadKey = event->key;
261 }
else if (m_activeDeadKey != Qt::Key_unknown
262 && (((m_keyModifiedByDeadKeyOnPress == Qt::Key_unknown
263 && event->type == EventType::KeyDown))
264 || (m_keyModifiedByDeadKeyOnPress == event->key
265 && event->type == EventType::KeyUp))) {
266 const Qt::Key baseKey = event->key;
267 const Qt::Key translatedKey = translateBaseKeyUsingDeadKey(baseKey, m_activeDeadKey);
268 if (translatedKey != Qt::Key_unknown) {
269 event->key = translatedKey;
271 auto foundText = event->modifiers.testFlag(Qt::ShiftModifier)
272 ? findKeyTextByKeyId(DiacriticalCharsKeyToTextUppercase, event->key)
273 : findKeyTextByKeyId(DiacriticalCharsKeyToTextLowercase, event->key);
274 Q_ASSERT(foundText.has_value());
275 event->text = foundText->size() == 1 ? *foundText : QString();
278 if (!event->text.isEmpty()) {
283 if (!event->text.isEmpty())
284 m_keyModifiedByDeadKeyOnPress = baseKey;
287 Q_ASSERT(m_keyModifiedByDeadKeyOnPress == baseKey);
288 m_keyModifiedByDeadKeyOnPress = Qt::Key_unknown;
289 m_activeDeadKey = Qt::Key_unknown;
void applyDeadKeyTranslations(KeyEvent *event)
std::optional< QString > findKeyTextByKeyId(const T &mappingArray, Qt::Key qtKey)
static constexpr const auto DiacriticalCharsKeyToTextLowercase
static Qt::Key find(const KeyMapping(&map)[N], Qt::Key key) noexcept
constexpr KeyMapping diaeresisKeyTable[]
static constexpr const auto DiacriticalCharsKeyToTextUppercase
constexpr KeyMapping tildeKeyTable[]
constexpr KeyMapping graveKeyTable[]
static Qt::Key find_impl(const KeyMapping *first, const KeyMapping *last, Qt::Key key) noexcept
static constexpr const auto WebToQtKeyCodeMappings
Qt::Key translateBaseKeyUsingDeadKey(Qt::Key accentBaseKey, Qt::Key deadKey)
constexpr KeyMapping acuteKeyTable[]
constexpr KeyMapping circumflexKeyTable[]
std::optional< Qt::Key > mapWebKeyTextToQtKey(const char *toFind)
static constexpr const char storage[sizeof...(WebChar)+1]
static constexpr Type data() noexcept
bool operator<(const WebKb2QtData &that) const noexcept
constexpr int strcmp(const WebKb2QtData &that, const int i=0) const
constexpr bool operator==(const WebKb2QtData &that) const noexcept
static constexpr char StringTerminator
constexpr bool operator<=(const WebKb2QtData &that) const noexcept