Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ozone / wayland / input / keyboard.cc
1 // Copyright 2013 Intel Corporation. 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 "ozone/wayland/input/keyboard.h"
6
7 #include "ozone/ui/events/event_factory_ozone_wayland.h"
8
9 namespace ozonewayland {
10
11 WaylandKeyboard::WaylandKeyboard() : input_keyboard_(NULL),
12     dispatcher_(NULL) {
13 }
14
15 WaylandKeyboard::~WaylandKeyboard() {
16   if (input_keyboard_)
17     wl_keyboard_destroy(input_keyboard_);
18 }
19
20 void WaylandKeyboard::OnSeatCapabilities(wl_seat *seat, uint32_t caps) {
21   static const struct wl_keyboard_listener kInputKeyboardListener = {
22     WaylandKeyboard::OnKeyboardKeymap,
23     WaylandKeyboard::OnKeyboardEnter,
24     WaylandKeyboard::OnKeyboardLeave,
25     WaylandKeyboard::OnKeyNotify,
26     WaylandKeyboard::OnKeyModifiers,
27   };
28
29   dispatcher_ = ui::EventFactoryOzoneWayland::GetInstance()->EventConverter();
30
31   if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !input_keyboard_) {
32     input_keyboard_ = wl_seat_get_keyboard(seat);
33     wl_keyboard_add_listener(input_keyboard_, &kInputKeyboardListener,
34         this);
35   }
36 }
37
38 void WaylandKeyboard::OnKeyNotify(void* data,
39                                   wl_keyboard* input_keyboard,
40                                   uint32_t serial,
41                                   uint32_t time,
42                                   uint32_t key,
43                                   uint32_t state) {
44   WaylandKeyboard* device = static_cast<WaylandKeyboard*>(data);
45   ui::EventType type = ui::ET_KEY_PRESSED;
46   WaylandDisplay::GetInstance()->SetSerial(serial);
47   if (state == WL_KEYBOARD_KEY_STATE_RELEASED)
48     type = ui::ET_KEY_RELEASED;
49
50   device->dispatcher_->KeyNotify(type, key);
51 }
52
53 void WaylandKeyboard::OnKeyboardKeymap(void *data,
54                                        struct wl_keyboard *keyboard,
55                                        uint32_t format,
56                                        int fd,
57                                        uint32_t size) {
58   WaylandKeyboard* device = static_cast<WaylandKeyboard*>(data);
59
60   if (!data) {
61     close(fd);
62     return;
63   }
64
65   if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) {
66     close(fd);
67     return;
68   }
69
70   base::SharedMemoryHandle section =  base::FileDescriptor(fd, true);
71   device->dispatcher_->InitializeXKB(section, size);
72 }
73
74 void WaylandKeyboard::OnKeyboardEnter(void* data,
75                                       wl_keyboard* input_keyboard,
76                                       uint32_t serial,
77                                       wl_surface* surface,
78                                       wl_array* keys) {
79   WaylandDisplay::GetInstance()->SetSerial(serial);
80 }
81
82 void WaylandKeyboard::OnKeyboardLeave(void* data,
83                                       wl_keyboard* input_keyboard,
84                                       uint32_t serial,
85                                       wl_surface* surface) {
86   WaylandDisplay::GetInstance()->SetSerial(serial);
87 }
88
89 void WaylandKeyboard::OnKeyModifiers(void *data,
90                                      wl_keyboard *keyboard,
91                                      uint32_t serial,
92                                      uint32_t mods_depressed,
93                                      uint32_t mods_latched,
94                                      uint32_t mods_locked,
95                                      uint32_t group) {
96   WaylandKeyboard* device = static_cast<WaylandKeyboard*>(data);
97   device->dispatcher_->KeyModifiers(mods_depressed,
98                                    mods_latched,
99                                    mods_locked,
100                                    group);
101 }
102
103 }  // namespace ozonewayland