summaryrefslogtreecommitdiffstats
path: root/webkit/glue/webinputevent_linux.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/glue/webinputevent_linux.cc')
-rw-r--r--webkit/glue/webinputevent_linux.cc150
1 files changed, 150 insertions, 0 deletions
diff --git a/webkit/glue/webinputevent_linux.cc b/webkit/glue/webinputevent_linux.cc
new file mode 100644
index 0000000..b48cb01
--- /dev/null
+++ b/webkit/glue/webinputevent_linux.cc
@@ -0,0 +1,150 @@
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+
+#include "webkit/glue/webinputevent.h"
+
+#include "webkit/glue/event_conversion.h"
+
+#include "KeyboardCodes.h"
+#include "KeyCodeConversion.h"
+
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtkversion.h>
+
+namespace {
+
+double GdkEventTimeToWebEventTime(guint32 time) {
+ // Convert from time in ms to time in sec.
+ return time / 1000.0;
+}
+
+int GdkStateToWebEventModifiers(guint state) {
+ int modifiers = 0;
+ if (state & GDK_SHIFT_MASK)
+ modifiers |= WebInputEvent::SHIFT_KEY;
+ if (state & GDK_CONTROL_MASK)
+ modifiers |= WebInputEvent::CTRL_KEY;
+ if (state & GDK_MOD1_MASK)
+ modifiers |= WebInputEvent::ALT_KEY;
+#if GTK_CHECK_VERSION(2,10,0)
+ if (state & GDK_META_MASK)
+ modifiers |= WebInputEvent::META_KEY;
+#endif
+ return modifiers;
+}
+
+} // namespace
+
+WebMouseEvent::WebMouseEvent(const GdkEventButton* event) {
+ timestamp_sec = GdkEventTimeToWebEventTime(event->time);
+ modifiers = GdkStateToWebEventModifiers(event->state);
+ x = static_cast<int>(event->x);
+ y = static_cast<int>(event->y);
+ global_x = static_cast<int>(event->x_root);
+ global_y = static_cast<int>(event->y_root);
+
+ switch (event->type) {
+ case GDK_BUTTON_PRESS:
+ case GDK_2BUTTON_PRESS:
+ case GDK_3BUTTON_PRESS:
+ type = MOUSE_DOWN;
+ break;
+ case GDK_BUTTON_RELEASE:
+ type = MOUSE_UP;
+ break;
+
+ default:
+ ASSERT_NOT_REACHED();
+ };
+
+ button = BUTTON_NONE;
+ if (event->button == 1) {
+ button = BUTTON_LEFT;
+ } else if (event->button == 2) {
+ button = BUTTON_MIDDLE;
+ } else if (event->button == 3) {
+ button = BUTTON_RIGHT;
+ }
+}
+
+WebMouseEvent::WebMouseEvent(const GdkEventMotion* event) {
+ timestamp_sec = GdkEventTimeToWebEventTime(event->time);
+ modifiers = GdkStateToWebEventModifiers(event->state);
+ x = static_cast<int>(event->x);
+ y = static_cast<int>(event->y);
+ global_x = static_cast<int>(event->x_root);
+ global_y = static_cast<int>(event->y_root);
+
+ switch (event->type) {
+ case GDK_MOTION_NOTIFY:
+ type = MOUSE_MOVE;
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
+
+ button = BUTTON_NONE;
+ if (event->state & GDK_BUTTON1_MASK) {
+ button = BUTTON_LEFT;
+ } else if (event->state & GDK_BUTTON2_MASK) {
+ button = BUTTON_MIDDLE;
+ } else if (event->state & GDK_BUTTON3_MASK) {
+ button = BUTTON_RIGHT;
+ }
+}
+
+WebMouseWheelEvent::WebMouseWheelEvent(const GdkEventScroll* event) {
+ timestamp_sec = GdkEventTimeToWebEventTime(event->time);
+ modifiers = GdkStateToWebEventModifiers(event->state);
+ x = static_cast<int>(event->x);
+ y = static_cast<int>(event->y);
+ global_x = static_cast<int>(event->x_root);
+ global_y = static_cast<int>(event->y_root);
+
+ type = MOUSE_WHEEL;
+
+ // TODO(tc): Figure out what the right value for this is.
+ static const int kWheelDelta = 1;
+
+ delta_x = 0;
+ delta_y = 0;
+
+ switch (event->direction) {
+ case GDK_SCROLL_UP:
+ delta_y = kWheelDelta;
+ break;
+ case GDK_SCROLL_DOWN:
+ delta_y = -kWheelDelta;
+ break;
+ case GDK_SCROLL_LEFT:
+ delta_x = -kWheelDelta;
+ break;
+ case GDK_SCROLL_RIGHT:
+ delta_x = kWheelDelta;
+ break;
+ default:
+ break;
+ }
+}
+
+WebKeyboardEvent::WebKeyboardEvent(const GdkEventKey* event) {
+ modifiers = GdkStateToWebEventModifiers(event->state);
+
+ switch (event->type) {
+ case GDK_KEY_RELEASE:
+ type = KEY_UP;
+ break;
+ case GDK_KEY_PRESS:
+ type = KEY_DOWN;
+ break;
+ default:
+ break;
+ }
+ key_code = WebCore::windowsKeyCodeForKeyEvent(event->keyval);
+
+ // TODO(tc): Do we need to set IS_AUTO_REPEAT or IS_KEYPAD?
+}