Index: chrome/browser/ui/ash/event_rewriter.h |
diff --git a/chrome/browser/ui/ash/event_rewriter.h b/chrome/browser/ui/ash/event_rewriter.h |
index f35276df188009a5ecdf3480343aa082ec014695..2cb279c70ca5dd1ceeaa816c741d356cc4a73502 100644 |
--- a/chrome/browser/ui/ash/event_rewriter.h |
+++ b/chrome/browser/ui/ash/event_rewriter.h |
@@ -11,6 +11,7 @@ |
#include "ash/event_rewriter_delegate.h" |
#include "base/basictypes.h" |
#include "base/compiler_specific.h" |
+#include "base/hash_tables.h" |
#include "ui/aura/root_window_observer.h" |
#include "ui/base/keycodes/keyboard_codes.h" |
@@ -42,6 +43,9 @@ class EventRewriter : public ash::EventRewriterDelegate, |
enum DeviceType { |
kDeviceUnknown = 0, |
kDeviceAppleKeyboard, |
+#if defined(OS_CHROMEOS) |
+ kDeviceChromeOSKeyboard, |
+#endif |
}; |
EventRewriter(); |
@@ -66,6 +70,9 @@ class EventRewriter : public ash::EventRewriterDelegate, |
void set_xkeyboard_for_testing(chromeos::input_method::XKeyboard* xkeyboard) { |
xkeyboard_ = xkeyboard; |
} |
+ void set_force_chromeos_keyboard_for_testing(bool chromeos_keyboard) { |
+ force_chromeos_keyboard_for_testing_ = chromeos_keyboard; |
+ } |
#endif |
// Gets DeviceType from the |device_name|. |
@@ -88,10 +95,55 @@ class EventRewriter : public ash::EventRewriterDelegate, |
virtual void DeviceRemoved(int device_id) OVERRIDE; |
virtual void DeviceKeyPressedOrReleased(int device_id) OVERRIDE; |
+ bool EventSourceIsChromeOSKeyboard() 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; |
+ |
// 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(unsigned long keysym); |
+ unsigned char NativeKeySymToNativeKeycode(KeySym keysym); |
+ |
+ struct KeyboardRemapping { |
+ KeySym input_keysym; |
+ unsigned int input_mods; |
+ unsigned int input_native_mods; |
+ KeySym output_keysym; |
+ ui::KeyboardCode output_keycode; |
+ }; |
+ |
+ // 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, |
+ unsigned int mods, |
+ KeySym* remapped_native_keysym, |
+ unsigned int* remapped_native_mods, |
+ ui::KeyboardCode* remapped_keycode, |
+ unsigned int* remapped_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, |
+ unsigned int mods, |
+ KeySym* remapped_native_keysym, |
+ unsigned int* remapped_native_mods, |
+ ui::KeyboardCode* remapped_keycode, |
+ unsigned int* remapped_mods); |
#endif |
// Rewrites the |event| by applying all RewriteXXX functions as needed. |
@@ -125,6 +177,11 @@ class EventRewriter : public ash::EventRewriterDelegate, |
// Returns true when the |event| is rewritten. |
bool RewriteBackspaceAndArrowKeys(ui::KeyEvent* 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(ui::KeyEvent* event); |
+ |
// Rewrites the located |event|. |
void RewriteLocatedEvent(ui::LocatedEvent* event); |
@@ -153,32 +210,10 @@ class EventRewriter : public ash::EventRewriterDelegate, |
int last_device_id_; |
#if defined(OS_CHROMEOS) |
- // X keycodes corresponding to various keysyms. |
- unsigned int control_l_xkeycode_; |
- unsigned int control_r_xkeycode_; |
- unsigned int alt_l_xkeycode_; |
- unsigned int alt_r_xkeycode_; |
- unsigned int meta_l_xkeycode_; |
- unsigned int meta_r_xkeycode_; |
- unsigned int windows_l_xkeycode_; |
- unsigned int caps_lock_xkeycode_; |
- unsigned int void_symbol_xkeycode_; |
- unsigned int delete_xkeycode_; |
- unsigned int home_xkeycode_; |
- unsigned int end_xkeycode_; |
- unsigned int prior_xkeycode_; |
- unsigned int next_xkeycode_; |
- unsigned int kp_0_xkeycode_; |
- unsigned int kp_1_xkeycode_; |
- unsigned int kp_2_xkeycode_; |
- unsigned int kp_3_xkeycode_; |
- unsigned int kp_4_xkeycode_; |
- unsigned int kp_5_xkeycode_; |
- unsigned int kp_6_xkeycode_; |
- unsigned int kp_7_xkeycode_; |
- unsigned int kp_8_xkeycode_; |
- unsigned int kp_9_xkeycode_; |
- unsigned int kp_decimal_xkeycode_; |
+ bool force_chromeos_keyboard_for_testing_; |
+ |
+ // A mapping from X11 KeySym keys to KeyCode values. |
+ base::hash_map<unsigned long, unsigned long> keysym_to_keycode_map_; |
chromeos::input_method::XKeyboard* xkeyboard_; // for testing. |
#endif |