Chromium Code Reviews| Index: ui/events/ozone/evdev/keyboard_evdev.cc |
| diff --git a/ui/events/ozone/evdev/keyboard_evdev.cc b/ui/events/ozone/evdev/keyboard_evdev.cc |
| index 1def4c66a8bef5977b6066af3636e5516bfbb436..96eeeb0ed71c559746c1383ffec830d75d528456 100644 |
| --- a/ui/events/ozone/evdev/keyboard_evdev.cc |
| +++ b/ui/events/ozone/evdev/keyboard_evdev.cc |
| @@ -18,6 +18,15 @@ |
| namespace ui { |
| +// We can't include ui/events/keycodes/dom/dom_code.h here because of |
| +// conflicts with preprocessor macros in <linux/input.h>, so we use the |
| +// same underlying data with an additional prefix. |
|
Wez
2015/06/08 21:23:23
nit: Is there some easy way to fix that issue in d
kpschoedel
2015/06/08 22:30:02
I believe we could rename the DomCode constants fo
Wez
2015/06/10 23:24:49
Acknowledged.
|
| +#define USB_KEYMAP(usb, xkb, win, mac, code, id) DOM_CODE_ ## id = usb |
| +#define USB_KEYMAP_DECLARATION enum class DomCode |
| +#include "ui/events/keycodes/dom/keycode_converter_data.inc" |
| +#undef USB_KEYMAP |
| +#undef USB_KEYMAP_DECLARATION |
| + |
| namespace { |
| const int kRepeatDelayMs = 500; |
| @@ -35,6 +44,8 @@ int EventFlagToEvdevModifier(int flag) { |
| return EVDEV_MODIFIER_ALT; |
| case EF_ALTGR_DOWN: |
| return EVDEV_MODIFIER_ALTGR; |
| + case EF_MOD3_DOWN: |
| + return EVDEV_MODIFIER_MOD3; |
| case EF_LEFT_MOUSE_BUTTON: |
| return EVDEV_MODIFIER_LEFT_MOUSE_BUTTON; |
| case EF_MIDDLE_MOUSE_BUTTON: |
| @@ -201,9 +212,7 @@ void KeyboardEvdev::DispatchKey(unsigned int key, |
| int device_id) { |
| DomCode dom_code = |
| KeycodeConverter::NativeKeycodeToDomCode(EvdevCodeToNativeCode(key)); |
| - // DomCode constants are not included here because of conflicts with |
| - // evdev preprocessor macros. |
| - if (!static_cast<int>(dom_code)) |
| + if (dom_code == DomCode::DOM_CODE_NONE) |
| return; |
| int flags = modifiers_->GetModifierFlags(); |
| DomKey dom_key; |
| @@ -214,8 +223,15 @@ void KeyboardEvdev::DispatchKey(unsigned int key, |
| &key_code, &platform_keycode)) { |
| return; |
| } |
| - if (!repeat) |
| - UpdateModifier(ModifierDomKeyToEventFlag(dom_key), down); |
| + if (!repeat) { |
| + int flag = ModifierDomKeyToEventFlag(dom_key); |
| + UpdateModifier(flag, down); |
| + // X11 XKB, using the configuration as modified for ChromeOS, always sets |
| + // EF_MOD3_DOWN for the physical CapsLock key, so we imitate this to make |
| + // certain layouts work. crbug.com/495277 |
|
Wez
2015/06/08 21:23:23
nit: Consider explicitly saying "even if it is re-
kpschoedel
2015/06/08 22:30:02
Done.
The pure-X11 behaviour is fine, but the Chr
Wez
2015/06/10 23:24:49
Acknowledged.
|
| + if (dom_code == DomCode::DOM_CODE_CAPS_LOCK) |
| + UpdateModifier(EF_MOD3_DOWN, down); |
| + } |
| KeyEvent event(down ? ET_KEY_PRESSED : ET_KEY_RELEASED, key_code, dom_code, |
| modifiers_->GetModifierFlags(), dom_key, character, timestamp); |
| @@ -224,5 +240,4 @@ void KeyboardEvdev::DispatchKey(unsigned int key, |
| event.set_platform_keycode(platform_keycode); |
| callback_.Run(&event); |
| } |
| - |
| } // namespace ui |