diff options
author | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-23 19:38:01 +0000 |
---|---|---|
committer | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-23 19:38:01 +0000 |
commit | 524b38893b0dc11de8707292c5348b9823f78787 (patch) | |
tree | 030c3c2538c4926932ef89df8177652eadb5a0b2 /webkit/glue | |
parent | 731c1c7dd796644ec894c8727a59adf96dc18d43 (diff) | |
download | chromium_src-524b38893b0dc11de8707292c5348b9823f78787.zip chromium_src-524b38893b0dc11de8707292c5348b9823f78787.tar.gz chromium_src-524b38893b0dc11de8707292c5348b9823f78787.tar.bz2 |
First stab at webinputevent_linux.cc. Coverts GDK events to
our webkit glue classes.
Review URL: http://codereview.chromium.org/7633
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@3840 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/glue')
-rw-r--r-- | webkit/glue/SConscript | 8 | ||||
-rw-r--r-- | webkit/glue/event_conversion.cc | 13 | ||||
-rw-r--r-- | webkit/glue/webinputevent.h | 14 | ||||
-rw-r--r-- | webkit/glue/webinputevent_linux.cc | 150 |
4 files changed, 173 insertions, 12 deletions
diff --git a/webkit/glue/SConscript b/webkit/glue/SConscript index e4f7317..9006cd0 100644 --- a/webkit/glue/SConscript +++ b/webkit/glue/SConscript @@ -72,7 +72,7 @@ input_files = [ if env['PLATFORM'] == 'win32': # TODO(port): These extra files aren't win32-specific, they've just not been # tested on other platforms yet. - input_files.append([ + input_files.extend([ '$PENDING_DIR/AccessibleBase.cpp', '$PENDING_DIR/AccessibleDocument.cpp', 'glue_accessibility.cc', @@ -82,7 +82,11 @@ if env['PLATFORM'] == 'win32': 'plugins/plugin_stream.cc', 'plugins/webplugin_delegate_impl.cc', 'webdropdata.cc', - 'webinputevent_win.cc', ]) +if env['PLATFORM'] == 'win32': + input_files.append('webinputevent_win.cc') +elif env['PLATFORM'] == 'posix': + input_files.append('webinputevent_linux.cc') + env.ChromeStaticLibrary('glue', input_files) diff --git a/webkit/glue/event_conversion.cc b/webkit/glue/event_conversion.cc index d37b2ff..84db42f 100644 --- a/webkit/glue/event_conversion.cc +++ b/webkit/glue/event_conversion.cc @@ -8,6 +8,9 @@ #if defined(OS_WIN) #include <windows.h> +#else +// This file defines all the windows VK_ key codes in the WebCore namespace. +#include "KeyboardCodes.h" #endif #include "StringImpl.h" // This is so that the KJS build works @@ -34,8 +37,7 @@ int MakePlatformMouseEvent::last_click_count_ = 0; uint32 MakePlatformMouseEvent::last_click_time_ = 0; MakePlatformMouseEvent::MakePlatformMouseEvent(Widget* widget, - const WebMouseEvent& e) - { + const WebMouseEvent& e) { #if defined(OS_WIN) || defined(OS_LINUX) // TODO(mpcomplete): widget is always toplevel, unless it's a popup. We // may be able to get rid of this once we abstract popups into a WebKit API. @@ -153,7 +155,6 @@ static inline String ToSingleCharacterString(UChar c) { return String(&c, 1); } -#if defined(OS_WIN) static String GetKeyIdentifierForWindowsKeyCode(unsigned short keyCode) { switch (keyCode) { case VK_MENU: @@ -256,11 +257,6 @@ static String GetKeyIdentifierForWindowsKeyCode(unsigned short keyCode) { return String::format("U+%04X", toupper(keyCode)); } } -#else -static String GetKeyIdentifierForWindowsKeyCode(unsigned short keyCode) { - return String::format("U+%04X", toupper(keyCode)); -} -#endif MakePlatformKeyboardEvent::MakePlatformKeyboardEvent(const WebKeyboardEvent& e) { @@ -321,4 +317,3 @@ bool MakePlatformKeyboardEvent::IsCharacterKey() const { } return true; } - diff --git a/webkit/glue/webinputevent.h b/webkit/glue/webinputevent.h index e6f119c..308e75e 100644 --- a/webkit/glue/webinputevent.h +++ b/webkit/glue/webinputevent.h @@ -16,7 +16,12 @@ #else class NSEvent; #endif // __OBJC__ -#endif // OS_MACOSX +#elif defined(OS_LINUX) +typedef struct _GdkEventButton GdkEventButton; +typedef struct _GdkEventMotion GdkEventMotion; +typedef struct _GdkEventScroll GdkEventScroll; +typedef struct _GdkEventKey GdkEventKey; +#endif // The classes defined in this file are intended to be used with WebView's // HandleInputEvent method. These event types are cross-platform; however, @@ -92,6 +97,9 @@ class WebMouseEvent : public WebInputEvent { WebMouseEvent(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); #elif defined(OS_MACOSX) WebMouseEvent(NSEvent *event); +#elif defined(OS_LINUX) + explicit WebMouseEvent(const GdkEventButton* event); + explicit WebMouseEvent(const GdkEventMotion* event); #endif }; @@ -107,6 +115,8 @@ class WebMouseWheelEvent : public WebMouseEvent { WebMouseWheelEvent(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); #elif defined(OS_MACOSX) WebMouseWheelEvent(NSEvent *event); +#elif defined(OS_LINUX) + explicit WebMouseWheelEvent(const GdkEventScroll* event); #endif }; @@ -134,6 +144,8 @@ class WebKeyboardEvent : public WebInputEvent { WebKeyboardEvent(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); #elif defined(OS_MACOSX) WebKeyboardEvent(NSEvent *event); +#elif defined(OS_LINUX) + explicit WebKeyboardEvent(const GdkEventKey* event); #endif }; 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? +} |