OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/libgtk2ui/x11_input_method_context_impl_gtk2.h" | 5 #include "chrome/browser/ui/libgtk2ui/x11_input_method_context_impl_gtk2.h" |
6 | 6 |
7 #include <gdk/gdk.h> | 7 #include <gdk/gdk.h> |
8 #include <gdk/gdkkeysyms.h> | 8 #include <gdk/gdkkeysyms.h> |
9 #include <gdk/gdkx.h> | 9 #include <gdk/gdkx.h> |
10 | 10 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 | 93 |
94 } // namespace | 94 } // namespace |
95 | 95 |
96 namespace libgtk2ui { | 96 namespace libgtk2ui { |
97 | 97 |
98 X11InputMethodContextImplGtk2::X11InputMethodContextImplGtk2( | 98 X11InputMethodContextImplGtk2::X11InputMethodContextImplGtk2( |
99 ui::LinuxInputMethodContextDelegate* delegate) | 99 ui::LinuxInputMethodContextDelegate* delegate) |
100 : delegate_(delegate), | 100 : delegate_(delegate), |
101 gtk_context_simple_(NULL), | 101 gtk_context_simple_(NULL), |
102 gtk_multicontext_(NULL), | 102 gtk_multicontext_(NULL), |
103 gtk_context_(NULL) { | 103 gtk_context_(NULL), |
| 104 gdk_last_set_client_window_(NULL) { |
104 CHECK(delegate_); | 105 CHECK(delegate_); |
105 | 106 |
106 { | 107 { |
107 XModifierKeymap* keymap = XGetModifierMapping(gfx::GetXDisplay()); | 108 XModifierKeymap* keymap = XGetModifierMapping(gfx::GetXDisplay()); |
108 for (int i = 0; i < 8 * keymap->max_keypermod; ++i) { | 109 for (int i = 0; i < 8 * keymap->max_keypermod; ++i) { |
109 if (keymap->modifiermap[i]) | 110 if (keymap->modifiermap[i]) |
110 modifier_keycodes_.insert(keymap->modifiermap[i]); | 111 modifier_keycodes_.insert(keymap->modifiermap[i]); |
111 } | 112 } |
112 XFreeModifiermap(keymap); | 113 XFreeModifiermap(keymap); |
113 } | 114 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 const base::NativeEvent& native_key_event = key_event.native_event(); | 159 const base::NativeEvent& native_key_event = key_event.native_event(); |
159 GdkEvent* event = GdkEventFromXKeyEvent( | 160 GdkEvent* event = GdkEventFromXKeyEvent( |
160 native_key_event->xkey, | 161 native_key_event->xkey, |
161 IsKeycodeModifierKey(native_key_event->xkey.keycode)); | 162 IsKeycodeModifierKey(native_key_event->xkey.keycode)); |
162 if (!event) { | 163 if (!event) { |
163 LOG(ERROR) << "Cannot translate a XKeyEvent to a GdkEvent."; | 164 LOG(ERROR) << "Cannot translate a XKeyEvent to a GdkEvent."; |
164 return false; | 165 return false; |
165 } | 166 } |
166 | 167 |
167 // Set the client window and cursor location. | 168 // Set the client window and cursor location. |
168 gtk_im_context_set_client_window(gtk_context_, event->key.window); | 169 if (event->key.window != gdk_last_set_client_window_) { |
| 170 gtk_im_context_set_client_window(gtk_context_, event->key.window); |
| 171 gdk_last_set_client_window_ = event->key.window; |
| 172 } |
169 // Convert the last known caret bounds relative to the screen coordinates | 173 // Convert the last known caret bounds relative to the screen coordinates |
170 // to a GdkRectangle relative to the client window. | 174 // to a GdkRectangle relative to the client window. |
171 gint x = 0; | 175 gint x = 0; |
172 gint y = 0; | 176 gint y = 0; |
173 gdk_window_get_origin(event->key.window, &x, &y); | 177 gdk_window_get_origin(event->key.window, &x, &y); |
174 GdkRectangle rect = {last_caret_bounds_.x() - x, | 178 GdkRectangle rect = {last_caret_bounds_.x() - x, |
175 last_caret_bounds_.y() - y, | 179 last_caret_bounds_.y() - y, |
176 last_caret_bounds_.width(), | 180 last_caret_bounds_.width(), |
177 last_caret_bounds_.height()}; | 181 last_caret_bounds_.height()}; |
178 gtk_im_context_set_cursor_location(gtk_context_, &rect); | 182 gtk_im_context_set_cursor_location(gtk_context_, &rect); |
179 | 183 |
180 // Let an IME handle the key event. | 184 // Let an IME handle the key event. |
181 commit_signal_trap_.StartTrap(event->key.keyval); | 185 commit_signal_trap_.StartTrap(event->key.keyval); |
182 const gboolean handled = gtk_im_context_filter_keypress(gtk_context_, | 186 const gboolean handled = gtk_im_context_filter_keypress(gtk_context_, |
183 &event->key); | 187 &event->key); |
184 commit_signal_trap_.StopTrap(); | 188 commit_signal_trap_.StopTrap(); |
185 gdk_event_free(event); | 189 gdk_event_free(event); |
186 | 190 |
187 return handled && !commit_signal_trap_.IsSignalCaught(); | 191 return handled && !commit_signal_trap_.IsSignalCaught(); |
188 } | 192 } |
189 | 193 |
190 void X11InputMethodContextImplGtk2::Reset() { | 194 void X11InputMethodContextImplGtk2::Reset() { |
191 // Reset all the states of the context, not only preedit, caret but also | 195 // Reset all the states of the context, not only preedit, caret but also |
192 // focus. | 196 // focus. |
193 gtk_context_ = NULL; | 197 gtk_context_ = NULL; |
194 gtk_im_context_reset(gtk_context_simple_); | 198 gtk_im_context_reset(gtk_context_simple_); |
195 gtk_im_context_reset(gtk_multicontext_); | 199 gtk_im_context_reset(gtk_multicontext_); |
196 gtk_im_context_focus_out(gtk_context_simple_); | 200 gtk_im_context_focus_out(gtk_context_simple_); |
197 gtk_im_context_focus_out(gtk_multicontext_); | 201 gtk_im_context_focus_out(gtk_multicontext_); |
| 202 gdk_last_set_client_window_ = NULL; |
198 } | 203 } |
199 | 204 |
200 void X11InputMethodContextImplGtk2::OnTextInputTypeChanged( | 205 void X11InputMethodContextImplGtk2::OnTextInputTypeChanged( |
201 ui::TextInputType text_input_type) { | 206 ui::TextInputType text_input_type) { |
202 switch (text_input_type) { | 207 switch (text_input_type) { |
203 case ui::TEXT_INPUT_TYPE_NONE: | 208 case ui::TEXT_INPUT_TYPE_NONE: |
204 case ui::TEXT_INPUT_TYPE_PASSWORD: | 209 case ui::TEXT_INPUT_TYPE_PASSWORD: |
205 gtk_context_ = gtk_context_simple_; | 210 gtk_context_ = gtk_context_simple_; |
206 break; | 211 break; |
207 default: | 212 default: |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 text.length() == 1 && | 307 text.length() == 1 && |
303 text[0] == gdk_keyval_to_unicode(gdk_event_key_keyval_)) { | 308 text[0] == gdk_keyval_to_unicode(gdk_event_key_keyval_)) { |
304 is_signal_caught_ = true; | 309 is_signal_caught_ = true; |
305 return true; | 310 return true; |
306 } else { | 311 } else { |
307 return false; | 312 return false; |
308 } | 313 } |
309 } | 314 } |
310 | 315 |
311 } // namespace libgtk2ui | 316 } // namespace libgtk2ui |
OLD | NEW |