xkeyboard.h revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROMEOS_IME_XKEYBOARD_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROMEOS_IME_XKEYBOARD_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_export.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace input_method { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AutoRepeatRate { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoRepeatRate() : initial_delay_in_ms(0), repeat_interval_in_ms(0) {} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int initial_delay_in_ms; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int repeat_interval_in_ms; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ModifierLockStatus { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDisableLock = 0, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kEnableLock, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDontChange, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ModifierKey { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSearchKey = 0, // Customizable. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kControlKey, // Customizable. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAltKey, // Customizable. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kVoidKey, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCapsLockKey, 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) kEscapeKey, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IMPORTANT: You should update kCustomizableKeys[] in .cc file, if you 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // add a customizable key. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNumModifierKeys, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InputMethodUtil; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CHROMEOS_EXPORT XKeyboard { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~XKeyboard() {} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the current keyboard layout to |layout_name|. This function does not 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change the current mapping of the modifier keys. Returns true on success. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetCurrentKeyboardLayoutByName( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& layout_name) = 0; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the current keyboard layout again. We have to call the function every 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time when "XI_HierarchyChanged" XInput2 event is sent to Chrome. See 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // xinput_hierarchy_changed_event_listener.h for details. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ReapplyCurrentKeyboardLayout() = 0; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates keyboard LEDs on all keyboards. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // XKB asymmetrically propagates keyboard modifier indicator state changes to 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // slave keyboards. If the state change is initiated from a client to the 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "core/master keyboard", XKB changes global state and pushes an indication 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change down to all keyboards. If the state change is initiated by one slave 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (physical) keyboard, it changes global state but only pushes an indicator 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state change down to that one keyboard. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function changes LEDs on all keyboards by explicitly updating the 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // core/master keyboard. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReapplyCurrentModifierLockStatus() = 0; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the Caps Lock and Num Lock status. Do not call the function from 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-UI threads. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetLockedModifiers(ModifierLockStatus new_caps_lock_status, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModifierLockStatus new_num_lock_status) = 0; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the num lock status to |enable_num_lock|. Do not call the function 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from non-UI threads. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetNumLockEnabled(bool enable_num_lock) = 0; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the caps lock status to |enable_caps_lock|. Do not call the function 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from non-UI threads. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetCapsLockEnabled(bool enable_caps_lock) = 0; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if num lock is enabled. Do not call the function from non-UI 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // threads. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool NumLockIsEnabled() = 0; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if caps lock is enabled. Do not call the function from non-UI 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // threads. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CapsLockIsEnabled() = 0; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a mask (e.g. 1U<<4) for Num Lock. On error, returns 0. Do not call 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the function from non-UI threads. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yusukes): Move this and webdriver::GetXModifierMask() functions in 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome/test/webdriver/keycode_text_conversion_x.cc to ui/base/x/x11_util. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The two functions are almost the same. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual unsigned int GetNumLockMask() = 0; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set true on |out_caps_lock_enabled| if Caps Lock is enabled. Set true on 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |out_num_lock_enabled| if Num Lock is enabled. Both out parameters can be 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL. Do not call the function from non-UI threads. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetLockedModifiers(bool* out_caps_lock_enabled, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* out_num_lock_enabled) = 0; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turns on and off the auto-repeat of the keyboard. Returns true on success. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not call the function from non-UI threads. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yusukes): Make this function non-static so we can mock it. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static CHROMEOS_EXPORT bool SetAutoRepeatEnabled(bool enabled); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the auto-repeat rate of the keyboard, initial delay in ms, and repeat 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interval in ms. Returns true on success. Do not call the function from 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-UI threads. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yusukes): Make this function non-static so we can mock it. 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static CHROMEOS_EXPORT bool SetAutoRepeatRate(const AutoRepeatRate& rate); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if auto repeat is enabled. This function is protected: for 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // testability. 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static CHROMEOS_EXPORT bool GetAutoRepeatEnabledForTesting(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On success, set current auto repeat rate on |out_rate| and returns true. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns false otherwise. This function is protected: for testability. 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static CHROMEOS_EXPORT bool GetAutoRepeatRateForTesting( 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutoRepeatRate* out_rate); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns false if |layout_name| contains a bad character. 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static CHROMEOS_EXPORT bool CheckLayoutNameForTesting( 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& layout_name); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: At this moment, classes other than InputMethodManager should not 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instantiate the XKeyboard class. 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static XKeyboard* Create(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace input_method 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // CHROMEOS_IME_XKEYBOARD_H_ 135