Index: ui/base/keycodes/keyboard_code_conversion_x.cc |
diff --git a/ui/base/keycodes/keyboard_code_conversion_x.cc b/ui/base/keycodes/keyboard_code_conversion_x.cc |
index eda35b46644308acb34d95671e72172e9d921230..eed41dbeba86b56ff4e100d526ecf1c23e8b5223 100644 |
--- a/ui/base/keycodes/keyboard_code_conversion_x.cc |
+++ b/ui/base/keycodes/keyboard_code_conversion_x.cc |
@@ -11,6 +11,43 @@ |
#include "base/basictypes.h" |
#include "base/logging.h" |
#include "base/utf_string_conversions.h" |
+#include "ui/base/x/x11_util.h" |
+ |
+namespace { |
+ |
+// Converts ui::EventType to XKeyEvent state. |
+unsigned int XKeyEventState(int flags) { |
+ return |
+ ((flags & ui::EF_SHIFT_DOWN) ? ShiftMask : 0) | |
+ ((flags & ui::EF_CONTROL_DOWN) ? ControlMask : 0) | |
+ ((flags & ui::EF_CAPS_LOCK_DOWN) ? LockMask : 0); |
+} |
+ |
+// Converts EventType to XKeyEvent type. |
+int XKeyEventType(ui::EventType type) { |
+ switch (type) { |
+ case ui::ET_KEY_PRESSED: |
+ return KeyPress; |
+ case ui::ET_KEY_RELEASED: |
+ return KeyRelease; |
+ default: |
+ return 0; |
+ } |
+} |
+ |
+// Converts KeyboardCode to XKeyEvent keycode. |
+unsigned int XKeyEventKeyCode(ui::KeyboardCode key_code, |
+ int flags, |
+ Display* display) { |
+ const int keysym = XKeysymForWindowsKeyCode(key_code, |
+ flags & ui::EF_SHIFT_DOWN); |
+ // Tests assume the keycode for XK_less is equal to the one of XK_comma, |
+ // but XKeysymToKeycode returns 94 for XK_less while it returns 59 for |
+ // XK_comma. Here we convert the value for XK_less to the value for XK_comma. |
+ return (keysym == XK_less) ? 59 : XKeysymToKeycode(display, keysym); |
+} |
+ |
+} // namespace |
namespace ui { |
@@ -620,4 +657,30 @@ int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) { |
} |
} |
+XEvent* CreateXEventForTesting(EventType type, |
Daniel Erat
2011/12/07 16:37:13
rename to CreateXKeyEventForTesting()?
mazda
2011/12/08 04:44:28
Renamed to InitXKeyEventForTesting.
|
+ KeyboardCode key_code, |
+ int flags) { |
+ Display* display = GetXDisplay(); |
+ XKeyEvent key_event; |
+ key_event.type = XKeyEventType(type); |
Daniel Erat
2011/12/07 16:37:13
add a CHECK() that type is non-zero?
mazda
2011/12/08 04:44:28
Done.
|
+ key_event.serial = 0; |
+ key_event.send_event = 0; |
+ key_event.display = display; |
+ key_event.time = 0; |
+ key_event.window = 0; |
+ key_event.root = 0; |
+ key_event.subwindow = 0; |
+ key_event.x = 0; |
+ key_event.y = 0; |
+ key_event.x_root = 0; |
+ key_event.y_root = 0; |
+ key_event.state = XKeyEventState(flags); |
+ key_event.keycode = XKeyEventKeyCode(key_code, flags, display); |
+ key_event.same_screen = 1; |
+ XEvent* event = new XEvent; |
Daniel Erat
2011/12/07 16:37:13
i'd prefer that you passed a pointer to an already
mazda
2011/12/08 04:44:28
Done.
|
+ event->type = key_event.type; |
+ event->xkey = key_event; |
+ return event; |
+} |
+ |
} // namespace ui |