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.
5 #include "ozone/wayland/input/keyboard.h"
7 #include "ozone/ui/events/event_factory_ozone_wayland.h"
9 namespace ozonewayland {
11 WaylandKeyboard::WaylandKeyboard() : input_keyboard_(NULL),
15 WaylandKeyboard::~WaylandKeyboard() {
17 wl_keyboard_destroy(input_keyboard_);
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,
29 dispatcher_ = ui::EventFactoryOzoneWayland::GetInstance()->EventConverter();
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,
35 } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input_keyboard_) {
36 wl_keyboard_destroy(input_keyboard_);
37 input_keyboard_ = NULL;
41 void WaylandKeyboard::OnKeyNotify(void* data,
42 wl_keyboard* input_keyboard,
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;
53 device->dispatcher_->KeyNotify(type, key);
56 void WaylandKeyboard::OnKeyboardKeymap(void *data,
57 struct wl_keyboard *keyboard,
61 WaylandKeyboard* device = static_cast<WaylandKeyboard*>(data);
68 if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) {
73 base::SharedMemoryHandle section = base::FileDescriptor(fd, true);
74 device->dispatcher_->InitializeXKB(section, size);
77 void WaylandKeyboard::OnKeyboardEnter(void* data,
78 wl_keyboard* input_keyboard,
82 WaylandDisplay::GetInstance()->SetSerial(serial);
85 void WaylandKeyboard::OnKeyboardLeave(void* data,
86 wl_keyboard* input_keyboard,
88 wl_surface* surface) {
89 WaylandDisplay::GetInstance()->SetSerial(serial);
92 void WaylandKeyboard::OnKeyModifiers(void *data,
93 wl_keyboard *keyboard,
95 uint32_t mods_depressed,
96 uint32_t mods_latched,
99 WaylandKeyboard* device = static_cast<WaylandKeyboard*>(data);
100 device->dispatcher_->KeyModifiers(mods_depressed,
106 } // namespace ozonewayland