1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef UI_EVENTS_KEYCODES_DOM4_KEYCODE_CONVERTER_H_ 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define UI_EVENTS_KEYCODES_DOM4_KEYCODE_CONVERTER_H_ 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <stdint.h> 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/basictypes.h" 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// For reference, the W3C UI Event spec is located at: 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// http://www.w3.org/TR/uievents/ 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace ui { 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// This structure is used to define the keycode mapping table. 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// It is defined here because the unittests need access to it. 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)typedef struct { 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // USB keycode: 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Upper 16-bits: USB Usage Page. 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Lower 16-bits: USB Usage Id: Assigned ID within this usage page. 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) uint32_t usb_keycode; 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Contains one of the following: 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // On Linux: XKB scancode 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // On Windows: Windows OEM scancode 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // On Mac: Mac keycode 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) uint16_t native_keycode; 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The UIEvents (aka: DOM4Events) |code| value as defined in: 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // https://dvcs.w3.org/hg/d4e/raw-file/tip/source_respec.htm 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* code; 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} KeycodeMapEntry; 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// A class to convert between the current platform's native keycode (scancode) 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// and platform-neutral |code| values (as defined in the W3C UI Events 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// spec (http://www.w3.org/TR/uievents/). 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class KeycodeConverter { 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Return the value that identifies an invalid native keycode. 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static uint16_t InvalidNativeKeycode(); 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Return the string that indentifies an invalid UI Event |code|. 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The returned pointer references a static global string. 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const char* InvalidKeyboardEventCode(); 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Convert a native (Mac/Win/Linux) keycode into the |code| string. 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The returned pointer references a static global string. 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const char* NativeKeycodeToCode(uint16_t native_keycode); 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Convert a UI Events |code| string value into a native keycode. 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static uint16_t CodeToNativeKeycode(const char* code); 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The following methods relate to USB keycodes. 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Note that USB keycodes are not part of any web standard. 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Please don't use USB keycodes in new code. 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Return the value that identifies an invalid USB keycode. 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static uint16_t InvalidUsbKeycode(); 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Convert a USB keycode into an equivalent platform native keycode. 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static uint16_t UsbKeycodeToNativeKeycode(uint32_t usb_keycode); 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Convert a platform native keycode into an equivalent USB keycode. 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static uint32_t NativeKeycodeToUsbKeycode(uint16_t native_keycode); 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Convert a USB keycode into the string with the DOM3 |code| value. 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The returned pointer references a static global string. 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const char* UsbKeycodeToCode(uint32_t usb_keycode); 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Convert a DOM3 Event |code| string into a USB keycode value. 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static uint32_t CodeToUsbKeycode(const char* code); 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Static methods to support testing. 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static size_t NumKeycodeMapEntriesForTest(); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const KeycodeMapEntry* GetKeycodeMapForTest(); 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(KeycodeConverter); 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace ui 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // UI_EVENTS_KEYCODES_DOM4_KEYCODE_CONVERTER_H_ 85