OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "views/events/event.h" | 5 #include "views/events/event.h" |
6 | 6 |
| 7 #include <gdk/gdk.h> |
7 #include <gdk/gdkx.h> | 8 #include <gdk/gdkx.h> |
8 #if defined(HAVE_XINPUT2) | 9 #if defined(HAVE_XINPUT2) |
9 #include <X11/extensions/XInput2.h> | 10 #include <X11/extensions/XInput2.h> |
10 #endif | 11 #endif |
| 12 #include <X11/Xlib.h> |
11 | 13 |
| 14 #include "base/utf_string_conversions.h" |
12 #include "ui/base/keycodes/keyboard_code_conversion_x.h" | 15 #include "ui/base/keycodes/keyboard_code_conversion_x.h" |
13 #include "views/widget/root_view.h" | 16 #include "views/widget/root_view.h" |
14 #include "views/widget/widget_gtk.h" | 17 #include "views/widget/widget_gtk.h" |
15 | 18 |
16 namespace views { | 19 namespace views { |
17 | 20 |
18 namespace { | 21 namespace { |
19 | 22 |
20 // Scroll amount for each wheelscroll event. 53 is also the value used for GTK+. | 23 // Scroll amount for each wheelscroll event. 53 is also the value used for GTK+. |
21 static int kWheelScrollAmount = 53; | 24 static int kWheelScrollAmount = 53; |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 return GetButtonMaskForX2Event(xievent) | | 209 return GetButtonMaskForX2Event(xievent) | |
207 GetEventFlagsFromXState(xievent->mods.effective); | 210 GetEventFlagsFromXState(xievent->mods.effective); |
208 } | 211 } |
209 } | 212 } |
210 #endif | 213 #endif |
211 } | 214 } |
212 | 215 |
213 return 0; | 216 return 0; |
214 } | 217 } |
215 | 218 |
| 219 uint16 GetCharacterFromXKeyEvent(XKeyEvent* key) { |
| 220 char buf[6]; |
| 221 int bytes_written = XLookupString(key, buf, 6, NULL, NULL); |
| 222 DCHECK_LE(bytes_written, 6); |
| 223 |
| 224 string16 result; |
| 225 return (bytes_written > 0 && UTF8ToUTF16(buf, bytes_written, &result) && |
| 226 result.length() == 1) ? result[0] : 0; |
| 227 } |
| 228 |
216 } // namespace | 229 } // namespace |
217 | 230 |
218 //////////////////////////////////////////////////////////////////////////////// | 231 //////////////////////////////////////////////////////////////////////////////// |
219 // Event, private: | 232 // Event, private: |
220 | 233 |
221 void Event::InitWithNativeEvent2(NativeEvent2 native_event_2, | 234 void Event::InitWithNativeEvent2(NativeEvent2 native_event_2, |
222 FromNativeEvent2) { | 235 FromNativeEvent2) { |
223 native_event_ = NULL; | 236 native_event_ = NULL; |
224 // TODO(beng): remove once we rid views of Gtk/Gdk. | 237 // TODO(beng): remove once we rid views of Gtk/Gdk. |
225 native_event_2_ = native_event_2; | 238 native_event_2_ = native_event_2; |
(...skipping 15 matching lines...) Expand all Loading... |
241 // KeyEvent, public: | 254 // KeyEvent, public: |
242 | 255 |
243 KeyEvent::KeyEvent(NativeEvent2 native_event_2, FromNativeEvent2 from_native) | 256 KeyEvent::KeyEvent(NativeEvent2 native_event_2, FromNativeEvent2 from_native) |
244 : Event(native_event_2, | 257 : Event(native_event_2, |
245 EventTypeFromNative(native_event_2), | 258 EventTypeFromNative(native_event_2), |
246 GetEventFlagsFromXState(native_event_2->xkey.state), | 259 GetEventFlagsFromXState(native_event_2->xkey.state), |
247 from_native), | 260 from_native), |
248 key_code_(ui::KeyboardCodeFromXKeyEvent(native_event_2)) { | 261 key_code_(ui::KeyboardCodeFromXKeyEvent(native_event_2)) { |
249 } | 262 } |
250 | 263 |
| 264 uint16 KeyEvent::GetCharacter() const { |
| 265 if (!native_event_2()) |
| 266 return GetCharacterFromKeyCode(key_code_, flags()); |
| 267 |
| 268 DCHECK(native_event_2()->type == KeyPress || |
| 269 native_event_2()->type == KeyRelease); |
| 270 |
| 271 uint16 ch = GetCharacterFromXKeyEvent(&native_event_2()->xkey); |
| 272 return ch ? ch : GetCharacterFromKeyCode(key_code_, flags()); |
| 273 } |
| 274 |
| 275 uint16 KeyEvent::GetUnmodifiedCharacter() const { |
| 276 if (!native_event_2()) |
| 277 return GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); |
| 278 |
| 279 DCHECK(native_event_2()->type == KeyPress || |
| 280 native_event_2()->type == KeyRelease); |
| 281 |
| 282 XKeyEvent key = native_event_2()->xkey; |
| 283 |
| 284 static const unsigned int kIgnoredModifiers = ControlMask | LockMask | |
| 285 Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask; |
| 286 |
| 287 // We can't use things like (key.state & ShiftMask), as it may mask out bits |
| 288 // used by X11 internally. |
| 289 key.state &= ~kIgnoredModifiers; |
| 290 uint16 ch = GetCharacterFromXKeyEvent(&key); |
| 291 return ch ? ch : |
| 292 GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); |
| 293 } |
| 294 |
251 //////////////////////////////////////////////////////////////////////////////// | 295 //////////////////////////////////////////////////////////////////////////////// |
252 // MouseEvent, public: | 296 // MouseEvent, public: |
253 | 297 |
254 MouseEvent::MouseEvent(NativeEvent2 native_event_2, | 298 MouseEvent::MouseEvent(NativeEvent2 native_event_2, |
255 FromNativeEvent2 from_native) | 299 FromNativeEvent2 from_native) |
256 : LocatedEvent(native_event_2, from_native) { | 300 : LocatedEvent(native_event_2, from_native) { |
257 } | 301 } |
258 | 302 |
259 //////////////////////////////////////////////////////////////////////////////// | 303 //////////////////////////////////////////////////////////////////////////////// |
260 // MouseWheelEvent, public: | 304 // MouseWheelEvent, public: |
(...skipping 11 matching lines...) Expand all Loading... |
272 TouchEvent::TouchEvent(NativeEvent2 native_event_2, | 316 TouchEvent::TouchEvent(NativeEvent2 native_event_2, |
273 FromNativeEvent2 from_native) | 317 FromNativeEvent2 from_native) |
274 : LocatedEvent(GetTouchEventType(native_event_2), | 318 : LocatedEvent(GetTouchEventType(native_event_2), |
275 GetEventLocation(native_event_2), | 319 GetEventLocation(native_event_2), |
276 GetLocatedEventFlags(native_event_2, true)), | 320 GetLocatedEventFlags(native_event_2, true)), |
277 touch_id_(GetTouchIDFromXEvent(native_event_2)) { | 321 touch_id_(GetTouchIDFromXEvent(native_event_2)) { |
278 } | 322 } |
279 #endif | 323 #endif |
280 | 324 |
281 } // namespace views | 325 } // namespace views |
OLD | NEW |