Skip to content

Commit 15c59d2

Browse files
committed
support XK_ISO_Level3_Shift and XK_ISO_Level5_Shift
1 parent 2281839 commit 15c59d2

File tree

7 files changed

+4334
-722
lines changed

7 files changed

+4334
-722
lines changed

deps/chromium/keyboard_codes.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ enum KeyModifierMask {
1414
kControlKeyModifierMask = 1 << 1,
1515
kMetaKeyModifierMask = 1 << 2,
1616
kShiftKeyModifierMask = 1 << 3,
17-
kNumLockKeyModifierMask = 1 << 4
17+
kNumLockKeyModifierMask = 1 << 4,
18+
kLevel3KeyModifierMask = 1 << 5,
19+
kLevel5KeyModifierMask = 1 << 6
1820
};
1921

20-
#endif // UI_EVENTS_KEYCODES_KEYBOARD_CODES_H_
22+
#endif // UI_EVENTS_KEYCODES_KEYBOARD_CODES_H_
23+

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "native-keymap",
3-
"version": "2.1.2",
3+
"version": "2.2.0",
44
"description": "Get OS key mapping",
55
"main": "index.js",
66
"typings": "index.d.ts",

src/keyboard_x.cc

+34-4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class KeyModifierMaskToXModifierMask {
3131
meta_modifier = 0;
3232
num_lock_modifier = 0;
3333
mode_switch_modifier = 0;
34+
level3_modifier = 0; // AltGr is often mapped to the level3 modifier
35+
level5_modifier = 0; // AltGr is mapped to the level5 modifier in the Neo layout family
3436

3537
if (!display) {
3638
return;
@@ -50,8 +52,6 @@ class KeyModifierMaskToXModifierMask {
5052
continue;
5153
}
5254

53-
// TODO: Also check for XK_ISO_Level3_Shift 0xFE03
54-
5555
if (keysym == XK_Alt_L || keysym == XK_Alt_R) {
5656
alt_modifier = 1 << mod_index;
5757
}
@@ -64,6 +64,12 @@ class KeyModifierMaskToXModifierMask {
6464
if (keysym == XK_Num_Lock) {
6565
num_lock_modifier = 1 << mod_index;
6666
}
67+
if (keysym == XK_ISO_Level3_Shift) {
68+
level3_modifier = 1 << mod_index;
69+
}
70+
if (keysym == XK_ISO_Level5_Shift) {
71+
level5_modifier = 1 << mod_index;
72+
}
6773
}
6874
}
6975

@@ -94,6 +100,14 @@ class KeyModifierMaskToXModifierMask {
94100
x_modifier |= num_lock_modifier;
95101
}
96102

103+
if (keyMod & kLevel3KeyModifierMask) {
104+
x_modifier |= level3_modifier;
105+
}
106+
107+
if (keyMod & kLevel5KeyModifierMask) {
108+
x_modifier |= level5_modifier;
109+
}
110+
97111
return x_modifier;
98112
}
99113

@@ -106,6 +120,8 @@ class KeyModifierMaskToXModifierMask {
106120
int meta_modifier;
107121
int num_lock_modifier;
108122
int mode_switch_modifier;
123+
int level3_modifier;
124+
int level5_modifier;
109125

110126
DISALLOW_COPY_AND_ASSIGN(KeyModifierMaskToXModifierMask);
111127
};
@@ -181,17 +197,31 @@ napi_value _GetKeyMap(napi_env env, napi_callback_info info) {
181197
}
182198

183199
{
184-
key_event->state = mask_provider->XModFromKeyMod(kControlKeyModifierMask | kAltKeyModifierMask);
200+
key_event->state = mask_provider->XModFromKeyMod(kLevel3KeyModifierMask);
185201
std::string withAltGr = GetStrFromXEvent(&event);
186202
NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withAltGr", withAltGr.c_str()));
187203
}
188204

189205
{
190-
key_event->state = mask_provider->XModFromKeyMod(kShiftKeyModifierMask | kControlKeyModifierMask | kAltKeyModifierMask);
206+
key_event->state = mask_provider->XModFromKeyMod(kShiftKeyModifierMask | kLevel3KeyModifierMask);
191207
std::string withShiftAltGr = GetStrFromXEvent(&event);
192208
NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withShiftAltGr", withShiftAltGr.c_str()));
193209
}
194210

211+
{
212+
// level 5 is important for the Neo layout family
213+
key_event->state = mask_provider->XModFromKeyMod(kLevel5KeyModifierMask);
214+
std::string withLevel5 = GetStrFromXEvent(&event);
215+
NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withLevel5", withLevel5.c_str()));
216+
}
217+
218+
{
219+
// level3 + level5 is Level 6 in terms of the Neo layout family. (Shift + level5 has no special meaning.)
220+
key_event->state = mask_provider->XModFromKeyMod(kLevel3KeyModifierMask | kLevel5KeyModifierMask);
221+
std::string withLevel3Level5 = GetStrFromXEvent(&event);
222+
NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withLevel3Level5", withLevel3Level5.c_str()));
223+
}
224+
195225
NAPI_CALL(env, napi_set_named_property(env, result, code, entry));
196226
}
197227

0 commit comments

Comments
 (0)