summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorevanm@google.com <evanm@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-07 01:03:48 +0000
committerevanm@google.com <evanm@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-07 01:03:48 +0000
commit70801a56ae3169b7aa28328a3a52dd6f7872c2f4 (patch)
tree5879671f91f1a1d9d5716f22f546114afe9d50f5
parentae78b256715d34337a126ea6912f9b61439060e3 (diff)
downloadchromium_src-70801a56ae3169b7aa28328a3a52dd6f7872c2f4.zip
chromium_src-70801a56ae3169b7aa28328a3a52dd6f7872c2f4.tar.gz
chromium_src-70801a56ae3169b7aa28328a3a52dd6f7872c2f4.tar.bz2
Some basic keyboard and focus support.
Review URL: http://codereview.chromium.org/9626 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@4944 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--webkit/glue/event_conversion.cc4
-rw-r--r--webkit/glue/webinputevent.h15
-rw-r--r--webkit/glue/webinputevent_linux.cc21
-rw-r--r--webkit/glue/webview_impl.cc4
-rw-r--r--webkit/tools/test_shell/gtk/webwidget_host.cc13
5 files changed, 51 insertions, 6 deletions
diff --git a/webkit/glue/event_conversion.cc b/webkit/glue/event_conversion.cc
index 981391a..f11b24a 100644
--- a/webkit/glue/event_conversion.cc
+++ b/webkit/glue/event_conversion.cc
@@ -270,8 +270,10 @@ MakePlatformKeyboardEvent::MakePlatformKeyboardEvent(const WebKeyboardEvent& e)
m_text = "\x9";
m_unmodifiedText = "\x9";
}
-#else
+#elif defined(OS_WIN)
m_text = m_unmodifiedText = ToSingleCharacterString(e.key_code);
+#elif defined(OS_LINUX)
+ m_text = m_unmodifiedText = ToSingleCharacterString(e.text);
#endif
}
#if defined(OS_WIN) || defined(OS_LINUX)
diff --git a/webkit/glue/webinputevent.h b/webkit/glue/webinputevent.h
index 31d2d43..dce4394 100644
--- a/webkit/glue/webinputevent.h
+++ b/webkit/glue/webinputevent.h
@@ -127,7 +127,16 @@ class WebMouseWheelEvent : public WebMouseEvent {
class WebKeyboardEvent : public WebInputEvent {
public:
+ // The key_code field is the Windows key code associated with this key event.
+ // This sometimes matches the ASCII value of the key (for e.g. a-z) but
+ // officially ignores case, and has its own set of codes for control keys as
+ // well as other visible letters like punctuation.
+ // webkit/port/platform/chromium/KeyboardCodes* is an attempt at defining all
+ // of these keys, but it's not all the way there yet. (E.g., the Windows
+ // implementation there just passes through the code from the windows message
+ // directly.)
int key_code;
+
#if defined(OS_MACOSX)
// text arrays extracted from the native event. On Mac, there may be
// multiple keys sent as a single event if the flags don't change.
@@ -137,6 +146,12 @@ class WebKeyboardEvent : public WebInputEvent {
#elif defined(OS_WIN)
bool system_key; // Set if we receive a SYSKEYDOWN/WM_SYSKEYUP message.
MSG actual_message; // Set to the current keyboard message.
+#elif defined(OS_LINUX)
+ // The ASCII character, if available, corresponding to this key event.
+ // TODO(evanm): temporary hack for test_shell. Ideally we'd either manage
+ // to stuff everything into key_code, or make this field shared by all
+ // implementations, but this will have to do for now.
+ char text;
#endif
WebKeyboardEvent()
diff --git a/webkit/glue/webinputevent_linux.cc b/webkit/glue/webinputevent_linux.cc
index b48cb01..11e53ce 100644
--- a/webkit/glue/webinputevent_linux.cc
+++ b/webkit/glue/webinputevent_linux.cc
@@ -6,11 +6,16 @@
#include "webkit/glue/webinputevent.h"
-#include "webkit/glue/event_conversion.h"
-
#include "KeyboardCodes.h"
#include "KeyCodeConversion.h"
+#include "webkit/glue/event_conversion.h"
+
+// This header is out of alphabetical order, but event_conversion.h pulls
+// in more webkit headers that redefine LOG so I need to undef afterwards.
+#undef LOG
+#include "base/logging.h"
+
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtkversion.h>
@@ -134,6 +139,11 @@ WebMouseWheelEvent::WebMouseWheelEvent(const GdkEventScroll* event) {
WebKeyboardEvent::WebKeyboardEvent(const GdkEventKey* event) {
modifiers = GdkStateToWebEventModifiers(event->state);
+ // GDK only exposes key press and release events. By contrast,
+ // WebKeyboardEvent matches Windows and wants key down/up events along with a
+ // separate CHAR event.
+ // We require the caller to simulate the CHAR event manually. See
+ // test_shell's webwidget_host for an example.
switch (event->type) {
case GDK_KEY_RELEASE:
type = KEY_UP;
@@ -142,9 +152,16 @@ WebKeyboardEvent::WebKeyboardEvent(const GdkEventKey* event) {
type = KEY_DOWN;
break;
default:
+ NOTREACHED();
break;
}
key_code = WebCore::windowsKeyCodeForKeyEvent(event->keyval);
+ // GDK keys within the ASCII range are just ASCII.
+ if (event->keyval >= 0x20 && event->keyval < 0x7F)
+ text = event->keyval;
+ else
+ text = 0;
+
// TODO(tc): Do we need to set IS_AUTO_REPEAT or IS_KEYPAD?
}
diff --git a/webkit/glue/webview_impl.cc b/webkit/glue/webview_impl.cc
index f34042d..6375fa3 100644
--- a/webkit/glue/webview_impl.cc
+++ b/webkit/glue/webview_impl.cc
@@ -312,7 +312,7 @@ bool WebViewImpl::KeyEvent(const WebKeyboardEvent& event) {
MakePlatformKeyboardEvent evt(event);
-#if defined(OS_WIN)
+#if !defined(OS_MACOSX)
if (WebInputEvent::KEY_DOWN == event.type) {
MakePlatformKeyboardEvent evt_rawkeydown = evt;
evt_rawkeydown.SetKeyType(WebCore::PlatformKeyboardEvent::RawKeyDown);
@@ -325,7 +325,7 @@ bool WebViewImpl::KeyEvent(const WebKeyboardEvent& event) {
return true;
}
}
-#elif defined(OS_MACOSX)
+#else
// Windows and Cocoa handle events in rather different ways. On Windows,
// you get two events: WM_KEYDOWN/WM_KEYUP and WM_CHAR. In
// PlatformKeyboardEvent, RawKeyDown represents the raw messages. When
diff --git a/webkit/tools/test_shell/gtk/webwidget_host.cc b/webkit/tools/test_shell/gtk/webwidget_host.cc
index f89f5f9..eb324d8 100644
--- a/webkit/tools/test_shell/gtk/webwidget_host.cc
+++ b/webkit/tools/test_shell/gtk/webwidget_host.cc
@@ -44,6 +44,17 @@ gboolean KeyPressReleaseEvent(GtkWidget* widget, GdkEventKey* event,
DLOG(INFO) << " -- Key press or release";
WebKeyboardEvent wke(event);
host->webwidget()->HandleInputEvent(&wke);
+
+ // The WebKeyboardEvent model, when holding down a key, is:
+ // KEY_DOWN, CHAR, (repeated CHAR as key repeats,) KEY_UP
+ // The GDK model for the same sequence is just:
+ // KEY_PRESS, (repeated KEY_PRESS as key repeats,) KEY_RELEASE
+ // So we must simulate a CHAR event for every key press.
+ if (event->type == GDK_KEY_PRESS) {
+ wke.type = WebKeyboardEvent::CHAR;
+ host->webwidget()->HandleInputEvent(&wke);
+ }
+
return FALSE;
}
@@ -96,7 +107,7 @@ gfx::WindowHandle WebWidgetHost::CreateWindow(gfx::WindowHandle box,
GDK_BUTTON_RELEASE_MASK |
GDK_KEY_PRESS_MASK |
GDK_KEY_RELEASE_MASK);
- // TODO(agl): set GTK_CAN_FOCUS flag
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS);
g_signal_connect(widget, "configure-event", G_CALLBACK(ConfigureEvent), host);
g_signal_connect(widget, "expose-event", G_CALLBACK(ExposeEvent), host);
g_signal_connect(widget, "destroy-event", G_CALLBACK(DestroyEvent), host);