- add sources.
[platform/framework/web/crosswalk.git] / src / ui / events / x / events_x_utils.cc
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