| 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 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 | 146 |
| 147 // private: | 147 // private: |
| 148 | 148 |
| 149 void X11InputMethodContextImplGtk2::ResetXModifierKeycodesCache() { | 149 void X11InputMethodContextImplGtk2::ResetXModifierKeycodesCache() { |
| 150 modifier_keycodes_.clear(); | 150 modifier_keycodes_.clear(); |
| 151 meta_keycodes_.clear(); | 151 meta_keycodes_.clear(); |
| 152 super_keycodes_.clear(); | 152 super_keycodes_.clear(); |
| 153 hyper_keycodes_.clear(); | 153 hyper_keycodes_.clear(); |
| 154 | 154 |
| 155 Display* display = gfx::GetXDisplay(); | 155 Display* display = gfx::GetXDisplay(); |
| 156 const XModifierKeymap* modmap = XGetModifierMapping(display); | 156 gfx::XScopedPtr<XModifierKeymap, |
| 157 gfx::XObjectDeleter<XModifierKeymap, int, XFreeModifiermap>> |
| 158 modmap(XGetModifierMapping(display)); |
| 157 int min_keycode = 0; | 159 int min_keycode = 0; |
| 158 int max_keycode = 0; | 160 int max_keycode = 0; |
| 159 int keysyms_per_keycode = 1; | 161 int keysyms_per_keycode = 1; |
| 160 XDisplayKeycodes(display, &min_keycode, &max_keycode); | 162 XDisplayKeycodes(display, &min_keycode, &max_keycode); |
| 161 const KeySym* keysyms = XGetKeyboardMapping( | 163 gfx::XScopedPtr<KeySym[]> keysyms( |
| 162 display, min_keycode, max_keycode - min_keycode + 1, | 164 XGetKeyboardMapping(display, min_keycode, max_keycode - min_keycode + 1, |
| 163 &keysyms_per_keycode); | 165 &keysyms_per_keycode)); |
| 164 for (int i = 0; i < 8 * modmap->max_keypermod; ++i) { | 166 for (int i = 0; i < 8 * modmap->max_keypermod; ++i) { |
| 165 const int keycode = modmap->modifiermap[i]; | 167 const int keycode = modmap->modifiermap[i]; |
| 166 if (!keycode) | 168 if (!keycode) |
| 167 continue; | 169 continue; |
| 168 modifier_keycodes_.insert(keycode); | 170 modifier_keycodes_.insert(keycode); |
| 169 | 171 |
| 170 if (!keysyms) | 172 if (!keysyms) |
| 171 continue; | 173 continue; |
| 172 for (int j = 0; j < keysyms_per_keycode; ++j) { | 174 for (int j = 0; j < keysyms_per_keycode; ++j) { |
| 173 switch (keysyms[(keycode - min_keycode) * keysyms_per_keycode + j]) { | 175 switch (keysyms[(keycode - min_keycode) * keysyms_per_keycode + j]) { |
| 174 case XK_Meta_L: | 176 case XK_Meta_L: |
| 175 case XK_Meta_R: | 177 case XK_Meta_R: |
| 176 meta_keycodes_.push_back(keycode); | 178 meta_keycodes_.push_back(keycode); |
| 177 break; | 179 break; |
| 178 case XK_Super_L: | 180 case XK_Super_L: |
| 179 case XK_Super_R: | 181 case XK_Super_R: |
| 180 super_keycodes_.push_back(keycode); | 182 super_keycodes_.push_back(keycode); |
| 181 break; | 183 break; |
| 182 case XK_Hyper_L: | 184 case XK_Hyper_L: |
| 183 case XK_Hyper_R: | 185 case XK_Hyper_R: |
| 184 hyper_keycodes_.push_back(keycode); | 186 hyper_keycodes_.push_back(keycode); |
| 185 break; | 187 break; |
| 186 } | 188 } |
| 187 } | 189 } |
| 188 } | 190 } |
| 189 XFree(const_cast<KeySym*>(keysyms)); | |
| 190 XFreeModifiermap(const_cast<XModifierKeymap*>(modmap)); | |
| 191 } | 191 } |
| 192 | 192 |
| 193 GdkEvent* X11InputMethodContextImplGtk2::GdkEventFromNativeEvent( | 193 GdkEvent* X11InputMethodContextImplGtk2::GdkEventFromNativeEvent( |
| 194 const base::NativeEvent& native_event) { | 194 const base::NativeEvent& native_event) { |
| 195 XEvent xkeyevent; | 195 XEvent xkeyevent; |
| 196 if (native_event->type == GenericEvent) { | 196 if (native_event->type == GenericEvent) { |
| 197 // If this is an XI2 key event, build a matching core X event, to avoid | 197 // If this is an XI2 key event, build a matching core X event, to avoid |
| 198 // having two cases for every use. | 198 // having two cases for every use. |
| 199 ui::InitXKeyEventFromXIDeviceEvent(*native_event, &xkeyevent); | 199 ui::InitXKeyEventFromXIDeviceEvent(*native_event, &xkeyevent); |
| 200 } else { | 200 } else { |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 text.length() == 1 && | 381 text.length() == 1 && |
| 382 text[0] == gdk_keyval_to_unicode(gdk_event_key_keyval_)) { | 382 text[0] == gdk_keyval_to_unicode(gdk_event_key_keyval_)) { |
| 383 is_signal_caught_ = true; | 383 is_signal_caught_ = true; |
| 384 return true; | 384 return true; |
| 385 } else { | 385 } else { |
| 386 return false; | 386 return false; |
| 387 } | 387 } |
| 388 } | 388 } |
| 389 | 389 |
| 390 } // namespace libgtk2ui | 390 } // namespace libgtk2ui |
| OLD | NEW |