Upstream version 11.39.252.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   } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input_keyboard_) {
36     wl_keyboard_destroy(input_keyboard_);
37     input_keyboard_ = NULL;
38   }
39 }
40
41 void WaylandKeyboard::OnKeyNotify(void* data,
42                                   wl_keyboard* input_keyboard,
43                                   uint32_t serial,
44                                   uint32_t time,
45                                   uint32_t key,
46                                   uint32_t state) {
47   WaylandKeyboard* device = static_cast<WaylandKeyboard*>(data);
48   ui::EventType type = ui::ET_KEY_PRESSED;
49   WaylandDisplay::GetInstance()->SetSerial(serial);
50   if (state == WL_KEYBOARD_KEY_STATE_RELEASED)
51     type = ui::ET_KEY_RELEASED;
52
53   device->dispatcher_->KeyNotify(type, key);
54 }
55
56 void WaylandKeyboard::OnKeyboardKeymap(void *data,
57                                        struct wl_keyboard *keyboard,
58                                        uint32_t format,
59                                        int fd,
60                                        uint32_t size) {
61   WaylandKeyboard* device = static_cast<WaylandKeyboard*>(data);
62
63   if (!data) {
64     close(fd);
65     return;
66   }
67
68   if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) {
69     close(fd);
70     return;
71   }
72
73   base::SharedMemoryHandle section =  base::FileDescriptor(fd, true);
74   device->dispatcher_->InitializeXKB(section, size);
75 }
76
77 void WaylandKeyboard::OnKeyboardEnter(void* data,
78                                       wl_keyboard* input_keyboard,
79                                       uint32_t serial,
80                                       wl_surface* surface,
81                                       wl_array* keys) {
82   WaylandDisplay::GetInstance()->SetSerial(serial);
83 }
84
85 void WaylandKeyboard::OnKeyboardLeave(void* data,
86                                       wl_keyboard* input_keyboard,
87                                       uint32_t serial,
88                                       wl_surface* surface) {
89   WaylandDisplay::GetInstance()->SetSerial(serial);
90 }
91
92 void WaylandKeyboard::OnKeyModifiers(void *data,
93                                      wl_keyboard *keyboard,
94                                      uint32_t serial,
95                                      uint32_t mods_depressed,
96                                      uint32_t mods_latched,
97                                      uint32_t mods_locked,
98                                      uint32_t group) {
99   WaylandKeyboard* device = static_cast<WaylandKeyboard*>(data);
100   device->dispatcher_->KeyModifiers(mods_depressed,
101                                    mods_latched,
102                                    mods_locked,
103                                    group);
104 }
105
106 }  // namespace ozonewayland