diff options
Diffstat (limited to 'views/events/event_gtk.cc')
-rw-r--r-- | views/events/event_gtk.cc | 95 |
1 files changed, 92 insertions, 3 deletions
diff --git a/views/events/event_gtk.cc b/views/events/event_gtk.cc index 37e06d0..9e38cffa 100644 --- a/views/events/event_gtk.cc +++ b/views/events/event_gtk.cc @@ -14,11 +14,14 @@ namespace views { namespace { ui::EventType EventTypeFromNative(NativeEvent native_event) { + // Add new event types as necessary. switch (native_event->type) { case GDK_KEY_PRESS: return ui::ET_KEY_PRESSED; case GDK_KEY_RELEASE: return ui::ET_KEY_RELEASED; + case GDK_SCROLL: + return ui::ET_MOUSEWHEEL; default: NOTREACHED(); break; @@ -32,13 +35,63 @@ GdkEventKey* GetGdkEventKeyFromNative(NativeEvent native_event) { return &native_event->key; } +gfx::Point GetMouseEventLocation(NativeEvent native_event) { + double x = 0, y = 0; + if (gdk_event_get_coords(native_event, &x, &y)) + return gfx::Point(static_cast<int>(x), static_cast<int>(y)); + return gfx::Point(); +} + +int GetMouseWheelOffset(NativeEvent native_event) { + DCHECK(native_event->type == GDK_SCROLL); + int offset = (native_event->scroll.direction == GDK_SCROLL_UP || + native_event->scroll.direction == GDK_SCROLL_LEFT) ? 1 : -1; + + // Scale the offset magnitude by window size, to preserve legacy behavior. + // TODO(msw): Investigate the use of offset magnitude throughout the codebase. + int width = 0, height = 0; + gdk_window_get_geometry(native_event->scroll.window, NULL, NULL, &width, + &height, NULL); + if (native_event->scroll.direction == GDK_SCROLL_UP || + native_event->scroll.direction == GDK_SCROLL_DOWN) + offset = offset * height / 5; + else + offset = offset * width / 5; + + return offset; +} + +unsigned int GetGdkStateFromNative(NativeEvent native_event) { + switch (native_event->type) { + case GDK_KEY_PRESS: + case GDK_KEY_RELEASE: + return native_event->key.state; + case GDK_BUTTON_PRESS: + case GDK_2BUTTON_PRESS: + case GDK_3BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + return native_event->button.state; + case GDK_SCROLL: + return native_event->scroll.state; + case GDK_MOTION_NOTIFY: + return native_event->motion.state; + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: + return native_event->crossing.state; + default: + NOTREACHED(); + break; + } + return 0; +} + } // namespace //////////////////////////////////////////////////////////////////////////////// // Event, public: // static -int Event::GetFlagsFromGdkState(int state) { +int Event::GetFlagsFromGdkState(unsigned int state) { int flags = 0; if (state & GDK_LOCK_MASK) flags |= ui::EF_CAPS_LOCK_DOWN; @@ -82,12 +135,30 @@ void Event::InitWithNativeEvent2(NativeEvent2 native_event_2, #endif //////////////////////////////////////////////////////////////////////////////// +// LocatedEvent, protected: + +LocatedEvent::LocatedEvent(NativeEvent native_event) + : Event(native_event, EventTypeFromNative(native_event), + GetFlagsFromGdkState(GetGdkStateFromNative(native_event))), + location_(GetMouseEventLocation(native_event)) { +} + +#if !defined(TOUCH_UI) +LocatedEvent::LocatedEvent(NativeEvent2 native_event_2, + FromNativeEvent2 from_native) + : Event(native_event_2, ui::ET_UNKNOWN, 0, from_native) { + // No one should ever call this on Gtk-views. + // TODO(msw): remove once we rid views of Gtk/Gdk. + NOTREACHED(); +} +#endif + +//////////////////////////////////////////////////////////////////////////////// // KeyEvent, public: KeyEvent::KeyEvent(NativeEvent native_event) : Event(native_event, EventTypeFromNative(native_event), - GetFlagsFromGdkState( - GetGdkEventKeyFromNative(native_event)->state)), + GetFlagsFromGdkState(GetGdkStateFromNative(native_event))), key_code_(ui::WindowsKeyCodeForGdkKeyCode( GetGdkEventKeyFromNative(native_event)->keyval)) { } @@ -101,4 +172,22 @@ KeyEvent::KeyEvent(NativeEvent2 native_event_2, FromNativeEvent2 from_native) } #endif +//////////////////////////////////////////////////////////////////////////////// +// MouseWheelEvent, public: + +MouseWheelEvent::MouseWheelEvent(NativeEvent native_event) + : LocatedEvent(native_event), + offset_(GetMouseWheelOffset(native_event)) { +} + +#if !defined(TOUCH_UI) +MouseWheelEvent::MouseWheelEvent(NativeEvent2 native_event_2, + FromNativeEvent2 from_native) + : LocatedEvent(native_event_2, from_native) { + // No one should ever call this on Gtk-views. + // TODO(msw): remove once we rid views of Gtk/Gdk. + NOTREACHED(); +} +#endif + } // namespace views |