diff options
Diffstat (limited to 'webkit/glue/webinputevent_linux.cc')
-rw-r--r-- | webkit/glue/webinputevent_linux.cc | 150 |
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? +} |