summaryrefslogtreecommitdiffstats
path: root/views/events/event_gtk.cc
diff options
context:
space:
mode:
Diffstat (limited to 'views/events/event_gtk.cc')
-rw-r--r--views/events/event_gtk.cc95
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