Chromium Code Reviews| Index: chrome/browser/chromeos/events/event_rewriter.h |
| diff --git a/chrome/browser/chromeos/events/event_rewriter.h b/chrome/browser/chromeos/events/event_rewriter.h |
| index c25d7b9ae884b1647e2efdeb44658f59367e7394..722185882cf9391cb1e5ecbc3c136b821772a118 100644 |
| --- a/chrome/browser/chromeos/events/event_rewriter.h |
| +++ b/chrome/browser/chromeos/events/event_rewriter.h |
| @@ -9,25 +9,28 @@ |
| #include <set> |
| #include <string> |
| -#include "base/basictypes.h" |
| -#include "base/compiler_specific.h" |
| -#include "base/containers/hash_tables.h" |
| -#include "base/memory/scoped_ptr.h" |
| -#include "chrome/browser/chromeos/device_hierarchy_observer.h" |
| -#include "chromeos/ime/ime_keyboard.h" |
| -#include "ui/events/keycodes/keyboard_codes.h" |
| -#include "ui/events/platform/platform_event_observer.h" |
| +#include "ui/events/event.h" |
| +#include "ui/events/event_rewriter.h" |
| class PrefService; |
| -typedef union _XEvent XEvent; |
| namespace chromeos { |
| + |
| namespace input_method { |
| class ImeKeyboard; |
| } |
| -class EventRewriter : public DeviceHierarchyObserver, |
| - public ui::PlatformEventObserver { |
| +// EventRewriter makes various changes to keyboard-related events, |
| +// including KeyEvents and some other events with keyboard modifier flags: |
| +// - maps modifiers keys (Control, Alt, Search, Caps, Diamond) according |
| +// to user preferences; |
| +// - maps Command to Control on Apple keyboards; |
| +// - converts numeric pad editing keys to their numeric forms; |
| +// - converts top-row function keys to special keys where necessary; |
| +// - handles various key combinations like Search+Backspace -> Delete |
| +// and Search+number to Fnumber; |
| +// - handles key/pointer combinations like Alt+Button1 -> Button3. |
| +class EventRewriter : public ui::EventRewriter { |
| public: |
| enum DeviceType { |
| kDeviceUnknown = 0, |
| @@ -40,158 +43,91 @@ class EventRewriter : public DeviceHierarchyObserver, |
| // Calls DeviceAddedInternal. |
| DeviceType DeviceAddedForTesting(int device_id, |
| const std::string& device_name); |
| - // Calls Rewrite. |
| - void RewriteForTesting(XEvent* event); |
| - const std::map<int, DeviceType>& device_id_to_type_for_testing() const { |
| - return device_id_to_type_; |
| - } |
| + // Calls RewriteLocatedEvent(). |
| + void RewriteLocatedEventForTesting(const ui::Event& event, int* flags); |
| + |
| void set_last_device_id_for_testing(int device_id) { |
| last_device_id_ = device_id; |
| } |
| void set_pref_service_for_testing(const PrefService* pref_service) { |
| pref_service_for_testing_ = pref_service; |
| } |
| - void set_keyboard_for_testing(input_method::ImeKeyboard* keyboard) { |
| - keyboard_for_testing_ = keyboard; |
| + void set_ime_keyboard_for_testing( |
| + chromeos::input_method::ImeKeyboard* ime_keyboard) { |
| + ime_keyboard_for_testing_ = ime_keyboard; |
| } |
| - // Gets DeviceType from the |device_name|. |
| - static DeviceType GetDeviceType(const std::string& device_name); |
| + // EventRewriter overrides: |
| + virtual ui::EventRewriteStatus RewriteEvent( |
| + const ui::Event& event, |
| + scoped_ptr<ui::Event>* rewritten_event) OVERRIDE; |
| + virtual ui::EventRewriteStatus NextDispatchEvent( |
| + const ui::Event& last_event, |
| + scoped_ptr<ui::Event>* new_event) OVERRIDE; |
| private: |
| - friend class EventRewriterAshTest; |
| - friend class EventRewriterTest; |
| - |
| - void DeviceKeyPressedOrReleased(int device_id); |
| + // Things that internal rewriter phases can change about an Event. |
| + struct MutableKeyState { |
| + int flags; |
| + ui::KeyboardCode key_code; |
| + }; |
| - // ui::PlatformEventObserver: |
| - virtual void WillProcessEvent(const ui::PlatformEvent& event) OVERRIDE; |
| - virtual void DidProcessEvent(const ui::PlatformEvent& event) OVERRIDE; |
| + // Tables of direct remappings for |RewriteWithKeyboardRemappingsByKeyCode()|. |
| + struct KeyboardRemapping { |
| + ui::KeyboardCode input_key_code; |
| + int input_flags; |
| + ui::KeyboardCode output_key_code; |
| + int output_flags; |
| + }; |
| - // DeviceHierarchyObserver: |
| - virtual void DeviceHierarchyChanged() OVERRIDE; |
| - virtual void DeviceAdded(int device_id) OVERRIDE; |
| - virtual void DeviceRemoved(int device_id) OVERRIDE; |
| + // Returns the PrefService that should be used. |
| + const PrefService* GetPrefService() const; |
| - // We don't want to include Xlib.h here since it has polluting macros, so |
| - // define these locally. |
| - typedef unsigned long KeySym; |
| - typedef unsigned char KeyCode; |
| + // Checks the type of the |device_name|, and inserts a new entry to |
| + // |device_id_to_type_|. |
| + DeviceType DeviceAddedInternal(int device_id, const std::string& device_name); |
| - // Updates |*_xkeycode_| in response to a keyboard map change. |
| - void RefreshKeycodes(); |
| - // Converts an X key symbol like XK_Control_L to a key code. |
| - unsigned char NativeKeySymToNativeKeycode(KeySym keysym); |
| + // Returns true if |last_device_id_| is Apple's. |
| + bool IsAppleKeyboard(const ui::Event& event) const; |
| - struct KeyboardRemapping { |
| - KeySym input_keysym; |
| - unsigned int input_native_mods; |
| - KeySym output_keysym; |
| - unsigned int output_native_mods; |
| - }; |
| + // Returns true if the event comes from an Chrome keyboard with a Diamond key. |
| + bool HasDiamondKey(const ui::Event& event) const; |
| // Returns true if the target for |event| would prefer to receive raw function |
| // keys instead of having them rewritten into back, forward, brightness, |
| // volume, etc. or if the user has specified that they desire top-row keys to |
| // be treated as function keys globally. |
| - bool TopRowKeysAreFunctionKeys(XEvent* event) const; |
| + bool TopRowKeysAreFunctionKeys(const ui::Event& event) const; |
| + |
| + int GetRemappedModifierMasks(const PrefService& pref_service, |
|
Daniel Erat
2014/04/22 23:58:36
nit: add a comment describing this method
kpschoedel
2014/04/23 15:46:22
Done.
|
| + const ui::Event& event, |
| + int original_flags) const; |
| // Given a set of KeyboardRemapping structs, it finds a matching struct |
| // if possible, and updates the remapped event values. Returns true if a |
| // remapping was found and remapped values were updated. |
| - bool RewriteWithKeyboardRemappingsByKeySym( |
| - const KeyboardRemapping* remappings, |
| - size_t num_remappings, |
| - KeySym keysym, |
| - unsigned int native_mods, |
| - KeySym* remapped_native_keysym, |
| - unsigned int* remapped_native_mods); |
| - |
| - // Given a set of KeyboardRemapping structs, it finds a matching struct |
| - // if possible, and updates the remapped event values. This function converts |
| - // the KeySym in the KeyboardRemapping struct into the KeyCode before matching |
| - // to allow any KeyCode on the same physical key as the given KeySym to match. |
| - // Returns true if a remapping was found and remapped values were updated. |
| bool RewriteWithKeyboardRemappingsByKeyCode( |
| const KeyboardRemapping* remappings, |
| size_t num_remappings, |
| - KeyCode keycode, |
| - unsigned int native_mods, |
| - KeySym* remapped_native_keysym, |
| - unsigned int* remapped_native_mods); |
| - |
| - // Returns the PrefService that should be used. |
| - const PrefService* GetPrefService() const; |
| - |
| - // Rewrites the |event| by applying all RewriteXXX functions as needed. |
| - void Rewrite(XEvent* event); |
| - |
| - // Rewrites a modifier key press/release following the current user |
| - // preferences. |
| - bool RewriteModifiers(XEvent* event); |
| - |
| - // Rewrites Fn key press/release to Control. In some cases, Fn key is not |
| - // intercepted by the EC, but generates a key event like "XK_F15 + Mod3Mask" |
| - // as shown in crosbug.com/p/14339. |
| - bool RewriteFnKey(XEvent* event); |
| - |
| - // Rewrites a NumPad key press/release without Num Lock to a corresponding key |
| - // press/release with the lock. Returns true when |event| is rewritten. |
| - bool RewriteNumPadKeys(XEvent* event); |
| - |
| - // Rewrites Backspace and Arrow keys following the Chrome OS keyboard spec. |
| - // * Alt+Backspace -> Delete |
| - // * Alt+Up -> Prior (aka PageUp) |
| - // * Alt+Down -> Next (aka PageDown) |
| - // * Ctrl+Alt+Up -> Home |
| - // * Ctrl+Alt+Down -> End |
| - // When the Search key acts as a function key, it instead maps: |
| - // * Search+Backspace -> Delete |
| - // * Search+Up -> Prior (aka PageUp) |
| - // * Search+Down -> Next (aka PageDown) |
| - // * Search+Left -> Home |
| - // * Search+Right -> End |
| - // * Search+. -> Insert |
| - // Returns true when the |event| is rewritten. |
| - bool RewriteExtendedKeys(XEvent* event); |
| - |
| - // When the Search key acts as a function key, it remaps Search+1 |
| - // through Search+= to F1 through F12. Returns true when the |event| is |
| - // rewritten. |
| - bool RewriteFunctionKeys(XEvent* event); |
| - |
| - // Rewrites the located |event|. |
| - void RewriteLocatedEvent(XEvent* event); |
| - |
| - // Overwrites |event| with the keycodes and flags. |
| - void OverwriteEvent(XEvent* event, |
| - unsigned int new_native_keycode, |
| - unsigned int new_native_state); |
| - |
| - // Checks the type of the |device_name|, and inserts a new entry to |
| - // |device_id_to_type_|. |
| - DeviceType DeviceAddedInternal(int device_id, const std::string& device_name); |
| - |
| - // Returns true if |last_device_id_| is Apple's. |
| - bool IsAppleKeyboard() const; |
| + const MutableKeyState& input, |
| + MutableKeyState* remapped); |
|
Daniel Erat
2014/04/22 23:58:36
nit: maybe rename this to |remapped_state| so it's
kpschoedel
2014/04/23 15:46:22
Done.
|
| - // Remaps |original_native_modifiers| to |remapped_native_modifiers| following |
| - // the current user prefs. |
| - void GetRemappedModifierMasks(unsigned int original_native_modifiers, |
| - unsigned int* remapped_native_modifiers) const; |
| - |
| - std::map<int, DeviceType> device_id_to_type_; |
| - int last_device_id_; |
| - |
| - // A mapping from X11 KeySym keys to KeyCode values. |
| - base::hash_map<unsigned long, unsigned long> keysym_to_keycode_map_; |
| + // Rewriter phases. These can inspect the original |event|, but operate using |
| + // the current |state|, which may have been modified by previous phases. |
| + void RewriteModifierKeys(const ui::KeyEvent& event, MutableKeyState* state); |
| + void RewriteNumPadKeys(const ui::KeyEvent& event, MutableKeyState* state); |
| + void RewriteExtendedKeys(const ui::KeyEvent& event, MutableKeyState* state); |
| + void RewriteFunctionKeys(const ui::KeyEvent& event, MutableKeyState* state); |
| + void RewriteLocatedEvent(const ui::Event& event, MutableKeyState* state); |
| // A set of device IDs whose press event has been rewritten. |
| std::set<int> pressed_device_ids_; |
| - input_method::ImeKeyboard* keyboard_for_testing_; |
| + std::map<int, DeviceType> device_id_to_type_; |
| + int last_device_id_; |
| + chromeos::input_method::ImeKeyboard* ime_keyboard_for_testing_; |
| const PrefService* pref_service_for_testing_; |
| DISALLOW_COPY_AND_ASSIGN(EventRewriter); |