summaryrefslogtreecommitdiffstats
path: root/webkit/plugins/ppapi/usb_key_code_conversion_linux.cc
blob: 53ebec90e5396047d800366a19479e79759447a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "webkit/plugins/ppapi/usb_key_code_conversion.h"

#include "base/basictypes.h"
#include "base/logging.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"

using WebKit::WebKeyboardEvent;

namespace webkit {
namespace ppapi {

namespace {

// Mapping from 8-bit xkb scancode to 32-bit USB Usage Page and Id.
//
// TODO(garykac): This table covers only USB HID Boot Protocol.  The keys
// marked with '???' should be extended (e.g. with "media keys"), or derived
// automatically from the USB-to-linux keycode mapping.
uint32_t linux_xkb_code_to_usb[] = {
  // 00-04: unused
  0x000000, 0x000000, 0x000000, 0x000000,
  // 04-07: unused
  0x000000, 0x000000, 0x000000, 0x000000,
  // 08-0b: unused  Escape  1!  2@
  0x000000, 0x070029, 0x07001e, 0x07001f,
  // 0c-0f: 3#  4$  5%  6^
  0x070020, 0x070021, 0x070022, 0x070023,
  // 10-13: 7&  8*  9(  0)
  0x070024, 0x070025, 0x070026, 0x070027,
  // 14-17: -_  =+  Backspace Tab
  0x07002d, 0x07002e, 0x07002a, 0x07002b,
  // 18-1b: qQ  wW  eE  rR
  0x070014, 0x07001a, 0x070008, 0x070015,
  // 1c-1f: tT  yY  uU  iI
  0x070017, 0x07001c, 0x070018, 0x07000c,
  // 20-23: oO  pP  [{  ]}
  0x070012, 0x070013, 0x07002f, 0x070030,
  // 24-27: Return  LeftControl  aA  sS
  0x070028, 0x0700e0, 0x070004, 0x070016,
  // 28-2b: dD  fF  gG  hH
  0x070007, 0x070009, 0x07000a, 0x07000b,
  // 2c-2f: jJ  kK  lL  ;:
  0x07000d, 0x07000e, 0x07000f, 0x070033,
  // 30-33: '"  `~  LeftShift   \|
  0x070034, 0x070035, 0x0700e1, 0x070031,
  // 34-37: zZ  xX  cC  vV
  0x07001d, 0x07001b, 0x070006, 0x070019,
  // 38-3b: bB  nN  mM  ,<
  0x070005, 0x070011, 0x070010, 0x070036,
  // 3c-3f: .>  /?  RightShift  Keypad_*
  0x070037, 0x070038,  0x0700e5, 0x070055,
  // 40-43: LeftAlt  Space  CapsLock  F1
  0x0700e2, 0x07002c, 0x070039, 0x07003a,
  // 44-47: F2  F3  F4  F5
  0x07003b, 0x07003c, 0x07003d, 0x07003e,
  // 48-4b: F6  F7  F8  F9
  0x07003f, 0x070040, 0x070041, 0x070042,
  // 4c-4f: F10  NumLock  ScrollLock  Keypad_7
  0x070043, 0x070053, 0x070047, 0x07005f,
  // 50-53: Keypad_8  Keypad_9  Keypad_-  Keypad_4
  0x070060, 0x070061, 0x070056, 0x07005c,
  // 54-57: Keypad_5  Keypad_6  Keypad_+  Keypad_1
  0x07005d, 0x07005e, 0x070057, 0x070059,
  // 58-5b: Keypad_2  Keypad_3  Keypad_0  Keypad_.
  0x07005a, 0x07005b, 0x070062, 0x070063,
  // 5c-5f: ISO_Level3_Shift  unused  <>||  F11
  // For 5e, consider USB#0064 : Non-US \ and |
  0x000000, 0x000000, 0x000000, 0x070044,
  // 60-63: F12  unused  Katakana  Hiragana
  0x070045, 0x000000, 0x070092, 0x070093,
  // 64-67: Henkan  Hiragana_Katakana  Muhenkan  unused
  0x070094, 0x070088, 0x07008b, 0x000000,
  // 68-6b: Keypad_Enter  RightControl  Keypad_/  Print/SysReq
  // For 6b, USB#0046 is PrintScreen, USB#009a is SysReq/Attention
  0x070058, 0x0700e4, 0x070054, 0x070046,
  // 6c-6f: RightAlt  Linefeed  Home  UpArrow
  0x0700e6, 0x000000, 0x07004a, 0x070052,
  // 70-73: PageUp/Prior  LeftArrow  RightArrow  End
  0x07004b, 0x070050, 0x07004f, 0x07004d,
  // 74-77: DownArrow  PageDown/Next  Insert  Delete/ForwardDelete
  0x070051, 0x07004e, 0x070049, 0x07004c,
  // 78-7b: unused  Mute  VolumeDown  VolumeUp
  0x000000, 0x07007f, 0x070081, 0x070080,
  // 7c-7f: PowerOff  Keypad_=  Keypad_+-  Pause/Break
  0x070066, 0x070067, 0x0700d7, 0x070048,
  // 80-83: LaunchA  Keypad_Decimal  HangulToggle  HanjaConversion
  // For 81, cf. 5b: Keypad_.
  0x000000, 0x0700dc, 0x070090, 0x070091,
  // 84-87: unused  LeftSuper/LeftWin  RightSuper/RightWin  Menu
  0x000000, 0x0700e3, 0x0700e7, 0x070065,
  // 88-8b: Cancel  Again/Redo  CrSel/Props  Undo
  0x07009b, 0x070079, 0x0700a3, 0x07007a,
  // 8c-8f: SunFront  Copy  SunOpen  Paste
  0x000000, 0x07007c, 0x000000, 0x07007d,
  // 90-93: Find  Cut  Help  MenuKB
  // For 93, cf. 87 (Menu) and c1 (MenuKB)
  0x07007e, 0x07007b, 0x070075, 0x000000,
  // 94-97: AL_Calculator  unused  Sleep  WakeUp
  0x0c0192, 0x000000, 0x000000, 0x000000,
  // 98-9b: Explorer  Send  unused  Xfer
  0x000000, 0x000000, 0x000000, 0x000000,
  // 9c-9f: Launch1  Launch2  WWW  DOS
  0x000000, 0x000000, 0x000000, 0x000000,
  // a0-a3: ScreenSaver  unused  RotateWindows  Mail
  0x000000, 0x000000, 0x000000, 0x000000,
  // a4-a7: Favorites  MyComputer  Back  Forward
  0x000000, 0x000000, 0x000000, 0x000000,
  // a8-ab: unused  Eject  Eject  AudioNext
  0x000000, 0x000000, 0x000000, 0x000000,
  // ac-af: AudioPlay AudioPrev AudioStop AudioRecord
  0x000000, 0x000000, 0x000000, 0x000000,
  // b0-b3: AudioRewind  Phone  unused  Tools
  0x000000, 0x000000, 0x000000, 0x000000,
  // b4-b7: HomePage  Reload  Close  unused
  0x000000, 0x000000, 0x000000, 0x000000,
  // b8-bb: unused  ScrollUp  ScrollDown  (
  // For bb, mapped to Keypad_(
  0x000000, 0x000000, 0x000000, 0x0700b6,
  // bc-bf: )  New  Redo  Tools
  // For bc, mapped to Keypad_)
  0x0700b7, 0x000000, 0x000000, 0x000000,
  // c0-c3: Launch5  MenuKB  unused  unused
  0x000000, 0x000000, 0x000000, 0x000000,
  // c4-c7: unused
  0x000000, 0x000000, 0x000000, 0x000000,
  // c8-cb: TouchpadToggle  unused  unused  ModeSwitch
  0x000000, 0x000000, 0x000000, 0x000000,
  // cc-cf: Generates no symbol without Shift.
  // With shift: LeftAlt LeftMeta LeftSuper LeftHyper.
  0x000000, 0x000000, 0x000000, 0x000000,
  // d0-d3: AudioPlay  AudioPause  Launch3  Launch4
  0x000000, 0x000000, 0x000000, 0x000000,
  // d4-d7: LaunchB  Suspend  Close  AudioPlay
  0x000000, 0x000000, 0x000000, 0x000000,
  // d8-db: AudioForward  unused  Print  unused
  0x000000, 0x000000, 0x000000, 0x000000,
  // dc-df: WebCam  unused  unused  Mail
  0x000000, 0x000000, 0x000000, 0x000000,
  // e0-e3: unused  Search  unused  AL_Finance
  0x000000, 0x000000, 0x000000, 0x0c0191,
  // e4-e7: unused  Shop  unused  Cancel
  0x000000, 0x000000, 0x000000, 0x000000,
  // e8-eb: MonBrightnessDown  MonBrightnessUp  AudioMedia  Display
  0x000000, 0x000000, 0x000000, 0x000000,
  // ec-ef: KbdLightOnOff  KbdBightnessDown  KdbBrightnessUp  Send
  0x000000, 0x000000, 0x000000, 0x000000,
  // f0-f3: Reply  MailForward  Save  Documents
  0x000000, 0x000000, 0x000000, 0x000000,
  // f4-f7: Battery  Bluetooth  WLAN  unused
  0x000000, 0x000000, 0x000000, 0x000000,
  // f8-fb: unused
  0x000000, 0x000000, 0x000000, 0x000000,
  // fc-ff: unused
  0x000000, 0x000000, 0x000000, 0x000000
};

COMPILE_ASSERT(arraysize(linux_xkb_code_to_usb) == 256,
               linux_xkb_code_to_usb_table_incorrect_size);

} // anonymous namespace

uint32_t UsbKeyCodeForKeyboardEvent(const WebKeyboardEvent& key_event) {
  // TODO(garykac): This code assumes that on Linux we're receiving events via
  // the XKB driver.  We should detect between "XKB", "kbd" and "evdev" at
  // run-time and re-map accordingly, but that's not possible here, inside the
  // sandbox.
  if (key_event.nativeKeyCode < 0 || key_event.nativeKeyCode > 255) {
    return 0;
  }
  return linux_xkb_code_to_usb[key_event.nativeKeyCode];
}

}  // namespace ppapi
}  // namespace webkit