summaryrefslogtreecommitdiffstats
path: root/webkit/glue
diff options
context:
space:
mode:
authortc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-23 19:38:01 +0000
committertc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-23 19:38:01 +0000
commit524b38893b0dc11de8707292c5348b9823f78787 (patch)
tree030c3c2538c4926932ef89df8177652eadb5a0b2 /webkit/glue
parent731c1c7dd796644ec894c8727a59adf96dc18d43 (diff)
downloadchromium_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/SConscript8
-rw-r--r--webkit/glue/event_conversion.cc13
-rw-r--r--webkit/glue/webinputevent.h14
-rw-r--r--webkit/glue/webinputevent_linux.cc150
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?
+}