11a2b54f7e313d33b2a744c034bb86337cb95752
[platform/framework/web/crosswalk.git] / src / ozone / wayland / input / text_input.cc
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.
4
5 #include "ozone/wayland/input/text_input.h"
6
7 #include <string>
8
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"
17
18 namespace ozonewayland {
19
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");
24 }
25
26 WaylandTextInput::~WaylandTextInput() {
27   if (text_input_)
28     wl_text_input_destroy(text_input_);
29 }
30
31 void WaylandTextInput::SetActiveWindow(WaylandWindow* window) {
32   active_window_ = window;
33   if (active_window_)
34     last_active_window_ = active_window_;
35 }
36
37 void WaylandTextInput::OnCommitString(void* data,
38                                       struct wl_text_input* text_input,
39                                       uint32_t serial,
40                                       const char* text) {
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));
46 }
47
48 void WaylandTextInput::OnPreeditString(void* data,
49                                        struct wl_text_input* text_input,
50                                        uint32_t serial,
51                                        const char* text,
52                                        const char* commit) {
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));
58 }
59
60 void WaylandTextInput::OnDeleteSurroundingText(void* data,
61                                        struct wl_text_input* text_input,
62                                        int32_t index,
63                                        uint32_t length) {
64 }
65
66 void WaylandTextInput::OnCursorPosition(void* data,
67                                        struct wl_text_input* text_input,
68                                        int32_t index,
69                                        int32_t anchor) {
70 }
71
72 void WaylandTextInput::OnPreeditStyling(void* data,
73                                        struct wl_text_input* text_input,
74                                        uint32_t index,
75                                        uint32_t length,
76                                        uint32_t style) {
77 }
78
79 void WaylandTextInput::OnPreeditCursor(void* data,
80                                        struct wl_text_input* text_input,
81                                        int32_t index) {
82 }
83
84 void WaylandTextInput::OnModifiersMap(void* data,
85                                       struct wl_text_input* text_input,
86                                       struct wl_array* map) {
87 }
88
89 void WaylandTextInput::OnKeysym(void* data,
90                                 struct wl_text_input* text_input,
91                                 uint32_t serial,
92                                 uint32_t time,
93                                 uint32_t key,
94                                 uint32_t state,
95                                 uint32_t modifiers) {
96   WaylandTextInput* textInuput = static_cast<WaylandTextInput*>(data);
97
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;
103
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))
107     return;
108
109   ui::EventConverterOzoneWayland* dispatcher =
110           ui::EventFactoryOzoneWayland::GetInstance()->EventConverter();
111
112   switch (key) {
113     case XKB_KEY_KP_Enter:
114     case XKB_KEY_Return:
115     case XKB_KEY_ISO_Enter:
116       dispatcher->KeyNotify(type, ui::OZONEACTIONKEY_RETURN, modifiers);
117       break;
118     case XKB_KEY_BackSpace:  // FIXME: Back space is not handled.
119       dispatcher->KeyNotify(type, ui::OZONEACTIONKEY_BACK, modifiers);
120       break;
121     case XKB_KEY_Left:
122     case XKB_KEY_KP_Left:
123       dispatcher->KeyNotify(type, ui::OZONEACTIONKEY_LEFT, modifiers);
124       break;
125     case XKB_KEY_Right:
126     case XKB_KEY_KP_Right:
127       dispatcher->KeyNotify(type, ui::OZONEACTIONKEY_RIGHT, modifiers);
128       break;
129     default:
130       break;
131   }
132 }
133
134 void WaylandTextInput::OnEnter(void* data,
135                                struct wl_text_input* text_input,
136                                struct wl_surface* surface) {
137 }
138
139 void WaylandTextInput::OnLeave(void* data,
140                                struct wl_text_input* text_input) {
141 }
142
143 void WaylandTextInput::OnInputPanelState(void* data,
144                                struct wl_text_input* text_input,
145                                uint32_t state) {
146 }
147
148 void WaylandTextInput::OnLanguage(void* data,
149                                struct wl_text_input* text_input,
150                                uint32_t serial,
151                                const char* language) {
152 }
153
154 void WaylandTextInput::OnTextDirection(void* data,
155                                struct wl_text_input* text_input,
156                                uint32_t serial,
157                                uint32_t direction) {
158 }
159
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
175   };
176
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);
181   }
182 }
183
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_,
188                            input_seat,
189                            active_window_->ShellSurface()->GetWLSurface());
190   }
191 }
192
193 void WaylandTextInput::HideInputPanel(wl_seat* input_seat) {
194   if (text_input_)
195     wl_text_input_deactivate(text_input_, input_seat);
196 }
197
198 }  // namespace ozonewayland