Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support XK_ISO_Level3_Shift and XK_ISO_Level5_Shift #19

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ jobs:
- template: build-template.yml
parameters:
name: Windows
vmImage: 'vs2017-win2016'
vmImage: 'vs2017-win2016'
7 changes: 5 additions & 2 deletions deps/chromium/keyboard_codes.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ enum KeyModifierMask {
kControlKeyModifierMask = 1 << 1,
kMetaKeyModifierMask = 1 << 2,
kShiftKeyModifierMask = 1 << 3,
kNumLockKeyModifierMask = 1 << 4
kNumLockKeyModifierMask = 1 << 4,
kLevel3KeyModifierMask = 1 << 5,
kLevel5KeyModifierMask = 1 << 6
};

#endif // UI_EVENTS_KEYCODES_KEYBOARD_CODES_H_
#endif // UI_EVENTS_KEYCODES_KEYBOARD_CODES_H_

38 changes: 34 additions & 4 deletions src/keyboard_x.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class KeyModifierMaskToXModifierMask {
meta_modifier = 0;
num_lock_modifier = 0;
mode_switch_modifier = 0;
level3_modifier = 0; // AltGr is often mapped to the level3 modifier
level5_modifier = 0; // AltGr is mapped to the level5 modifier in the Neo layout family

if (!display) {
return;
Expand All @@ -50,8 +52,6 @@ class KeyModifierMaskToXModifierMask {
continue;
}

// TODO: Also check for XK_ISO_Level3_Shift 0xFE03

if (keysym == XK_Alt_L || keysym == XK_Alt_R) {
alt_modifier = 1 << mod_index;
}
Expand All @@ -64,6 +64,12 @@ class KeyModifierMaskToXModifierMask {
if (keysym == XK_Num_Lock) {
num_lock_modifier = 1 << mod_index;
}
if (keysym == XK_ISO_Level3_Shift) {
level3_modifier = 1 << mod_index;
}
if (keysym == XK_ISO_Level5_Shift) {
level5_modifier = 1 << mod_index;
}
}
}

Expand Down Expand Up @@ -94,6 +100,14 @@ class KeyModifierMaskToXModifierMask {
x_modifier |= num_lock_modifier;
}

if (keyMod & kLevel3KeyModifierMask) {
x_modifier |= level3_modifier;
}

if (keyMod & kLevel5KeyModifierMask) {
x_modifier |= level5_modifier;
}

return x_modifier;
}

Expand All @@ -106,6 +120,8 @@ class KeyModifierMaskToXModifierMask {
int meta_modifier;
int num_lock_modifier;
int mode_switch_modifier;
int level3_modifier;
int level5_modifier;

DISALLOW_COPY_AND_ASSIGN(KeyModifierMaskToXModifierMask);
};
Expand Down Expand Up @@ -181,17 +197,31 @@ napi_value _GetKeyMap(napi_env env, napi_callback_info info) {
}

{
key_event->state = mask_provider->XModFromKeyMod(kControlKeyModifierMask | kAltKeyModifierMask);
key_event->state = mask_provider->XModFromKeyMod(kLevel3KeyModifierMask);
std::string withAltGr = GetStrFromXEvent(&event);
NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withAltGr", withAltGr.c_str()));
}

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

{
// level 5 is important for the Neo layout family
key_event->state = mask_provider->XModFromKeyMod(kLevel5KeyModifierMask);
std::string withLevel5 = GetStrFromXEvent(&event);
NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withLevel5", withLevel5.c_str()));
}

{
// level3 + level5 is Level 6 in terms of the Neo layout family. (Shift + level5 has no special meaning.)
key_event->state = mask_provider->XModFromKeyMod(kLevel3KeyModifierMask | kLevel5KeyModifierMask);
std::string withLevel3Level5 = GetStrFromXEvent(&event);
NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withLevel3Level5", withLevel3Level5.c_str()));
}

NAPI_CALL(env, napi_set_named_property(env, result, code, entry));
}

Expand Down