OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "ui/events/x/events_x_utils.h" |
| 6 |
| 7 #include <X11/keysym.h> |
| 8 #include <X11/X.h> |
| 9 #include <X11/Xlib.h> |
| 10 |
| 11 #include "base/logging.h" |
| 12 #include "ui/events/keycodes/keyboard_code_conversion_x.h" |
| 13 |
| 14 namespace { |
| 15 |
| 16 // Converts ui::EventType to XKeyEvent state. |
| 17 unsigned int XKeyEventState(int flags) { |
| 18 return |
| 19 ((flags & ui::EF_SHIFT_DOWN) ? ShiftMask : 0) | |
| 20 ((flags & ui::EF_CONTROL_DOWN) ? ControlMask : 0) | |
| 21 ((flags & ui::EF_ALT_DOWN) ? Mod1Mask : 0) | |
| 22 ((flags & ui::EF_CAPS_LOCK_DOWN) ? LockMask : 0); |
| 23 } |
| 24 |
| 25 // Converts EventType to XKeyEvent type. |
| 26 int XKeyEventType(ui::EventType type) { |
| 27 switch (type) { |
| 28 case ui::ET_KEY_PRESSED: |
| 29 return KeyPress; |
| 30 case ui::ET_KEY_RELEASED: |
| 31 return KeyRelease; |
| 32 default: |
| 33 return 0; |
| 34 } |
| 35 } |
| 36 |
| 37 // Converts KeyboardCode to XKeyEvent keycode. |
| 38 unsigned int XKeyEventKeyCode(ui::KeyboardCode key_code, |
| 39 int flags, |
| 40 XDisplay* display) { |
| 41 const int keysym = XKeysymForWindowsKeyCode(key_code, |
| 42 flags & ui::EF_SHIFT_DOWN); |
| 43 // Tests assume the keycode for XK_less is equal to the one of XK_comma, |
| 44 // but XKeysymToKeycode returns 94 for XK_less while it returns 59 for |
| 45 // XK_comma. Here we convert the value for XK_less to the value for XK_comma. |
| 46 return (keysym == XK_less) ? 59 : XKeysymToKeycode(display, keysym); |
| 47 } |
| 48 |
| 49 } // namespace ui |
| 50 |
| 51 namespace ui { |
| 52 |
| 53 void InitXKeyEventForTesting(EventType type, |
| 54 KeyboardCode key_code, |
| 55 int flags, |
| 56 XEvent* event) { |
| 57 CHECK(event); |
| 58 XDisplay* display = gfx::GetXDisplay(); |
| 59 XKeyEvent key_event; |
| 60 key_event.type = XKeyEventType(type); |
| 61 CHECK_NE(0, key_event.type); |
| 62 key_event.serial = 0; |
| 63 key_event.send_event = 0; |
| 64 key_event.display = display; |
| 65 key_event.time = 0; |
| 66 key_event.window = 0; |
| 67 key_event.root = 0; |
| 68 key_event.subwindow = 0; |
| 69 key_event.x = 0; |
| 70 key_event.y = 0; |
| 71 key_event.x_root = 0; |
| 72 key_event.y_root = 0; |
| 73 key_event.state = XKeyEventState(flags); |
| 74 key_event.keycode = XKeyEventKeyCode(key_code, flags, display); |
| 75 key_event.same_screen = 1; |
| 76 event->type = key_event.type; |
| 77 event->xkey = key_event; |
| 78 } |
| 79 |
| 80 } // namespace ui |
OLD | NEW |