1 // Copyright 2014 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/text_input.h"
9 #include "ozone/ui/events/event_factory_ozone_wayland.h"
10 #include "ozone/ui/events/keyboard_codes_ozone.h"
11 #include "ozone/wayland/display.h"
12 #include "ozone/wayland/input/keyboard.h"
13 #include "ozone/wayland/input/keyboard_engine_xkb.h"
14 #include "ozone/wayland/input_device.h"
15 #include "ozone/wayland/shell/shell_surface.h"
16 #include "ozone/wayland/window.h"
18 namespace ozonewayland {
20 WaylandTextInput::WaylandTextInput(WaylandInputDevice* inputDevice):
21 text_input_(NULL), active_window_(NULL), last_active_window_(NULL),
22 input_device_(inputDevice) {
23 enable_vkb_support_ = getenv("USE_OZONE_WAYLAND_VKB");
26 WaylandTextInput::~WaylandTextInput() {
28 wl_text_input_destroy(text_input_);
31 void WaylandTextInput::SetActiveWindow(WaylandWindow* window) {
32 active_window_ = window;
34 last_active_window_ = active_window_;
37 void WaylandTextInput::OnCommitString(void* data,
38 struct wl_text_input* text_input,
41 ui::EventConverterOzoneWayland* dispatcher =
42 ui::EventFactoryOzoneWayland::GetInstance()->EventConverter();
43 DCHECK(static_cast<WaylandTextInput*>(data)->last_active_window_);
44 dispatcher->Commit(static_cast<WaylandTextInput*>(data)->
45 last_active_window_->Handle(), std::string(text));
48 void WaylandTextInput::OnPreeditString(void* data,
49 struct wl_text_input* text_input,
53 ui::EventConverterOzoneWayland* dispatcher =
54 ui::EventFactoryOzoneWayland::GetInstance()->EventConverter();
55 DCHECK(static_cast<WaylandTextInput*>(data)->last_active_window_);
56 dispatcher->PreeditChanged(static_cast<WaylandTextInput*>(data)->
57 last_active_window_->Handle(), std::string(text), std::string(commit));
60 void WaylandTextInput::OnDeleteSurroundingText(void* data,
61 struct wl_text_input* text_input,
66 void WaylandTextInput::OnCursorPosition(void* data,
67 struct wl_text_input* text_input,
72 void WaylandTextInput::OnPreeditStyling(void* data,
73 struct wl_text_input* text_input,
79 void WaylandTextInput::OnPreeditCursor(void* data,
80 struct wl_text_input* text_input,
84 void WaylandTextInput::OnModifiersMap(void* data,
85 struct wl_text_input* text_input,
86 struct wl_array* map) {
89 void WaylandTextInput::OnKeysym(void* data,
90 struct wl_text_input* text_input,
96 WaylandTextInput* textInuput = static_cast<WaylandTextInput*>(data);
98 // Copid from WaylandKeyboard::OnKeyNotify()
99 ui::EventType type = ui::ET_KEY_PRESSED;
100 WaylandDisplay::GetInstance()->SetSerial(serial);
101 if (state == WL_KEYBOARD_KEY_STATE_RELEASED)
102 type = ui::ET_KEY_RELEASED;
104 // Check if we can ignore the KeyEvent notification, saves an IPC call.
105 if (textInuput->getInputDevice()->GetKeyBoard()->GetBackend()->
106 IgnoreKeyNotify(key, type == ui::ET_KEY_PRESSED))
109 ui::EventConverterOzoneWayland* dispatcher =
110 ui::EventFactoryOzoneWayland::GetInstance()->EventConverter();
113 case XKB_KEY_KP_Enter:
115 case XKB_KEY_ISO_Enter:
116 dispatcher->KeyNotify(type, ui::OZONEACTIONKEY_RETURN, modifiers);
118 case XKB_KEY_BackSpace: // FIXME: Back space is not handled.
119 dispatcher->KeyNotify(type, ui::OZONEACTIONKEY_BACK, modifiers);
122 case XKB_KEY_KP_Left:
123 dispatcher->KeyNotify(type, ui::OZONEACTIONKEY_LEFT, modifiers);
126 case XKB_KEY_KP_Right:
127 dispatcher->KeyNotify(type, ui::OZONEACTIONKEY_RIGHT, modifiers);
134 void WaylandTextInput::OnEnter(void* data,
135 struct wl_text_input* text_input,
136 struct wl_surface* surface) {
139 void WaylandTextInput::OnLeave(void* data,
140 struct wl_text_input* text_input) {
143 void WaylandTextInput::OnInputPanelState(void* data,
144 struct wl_text_input* text_input,
148 void WaylandTextInput::OnLanguage(void* data,
149 struct wl_text_input* text_input,
151 const char* language) {
154 void WaylandTextInput::OnTextDirection(void* data,
155 struct wl_text_input* text_input,
157 uint32_t direction) {
160 void WaylandTextInput::ResetIme() {
161 static const struct wl_text_input_listener text_input_listener = {
162 WaylandTextInput::OnEnter,
163 WaylandTextInput::OnLeave,
164 WaylandTextInput::OnModifiersMap,
165 WaylandTextInput::OnInputPanelState,
166 WaylandTextInput::OnPreeditString,
167 WaylandTextInput::OnPreeditStyling,
168 WaylandTextInput::OnPreeditCursor,
169 WaylandTextInput::OnCommitString,
170 WaylandTextInput::OnCursorPosition,
171 WaylandTextInput::OnDeleteSurroundingText,
172 WaylandTextInput::OnKeysym,
173 WaylandTextInput::OnLanguage,
174 WaylandTextInput::OnTextDirection
177 if (!text_input_ && enable_vkb_support_) {
178 text_input_ = wl_text_input_manager_create_text_input(
179 WaylandDisplay::GetInstance()->GetTextInputManager());
180 wl_text_input_add_listener(text_input_, &text_input_listener, this);
184 void WaylandTextInput::ShowInputPanel(wl_seat* input_seat) {
185 if (text_input_ && active_window_) {
186 wl_text_input_show_input_panel(text_input_);
187 wl_text_input_activate(text_input_,
189 active_window_->ShellSurface()->GetWLSurface());
193 void WaylandTextInput::HideInputPanel(wl_seat* input_seat) {
195 wl_text_input_deactivate(text_input_, input_seat);
198 } // namespace ozonewayland