diff options
author | evanm@google.com <evanm@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-07 01:03:48 +0000 |
---|---|---|
committer | evanm@google.com <evanm@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-07 01:03:48 +0000 |
commit | 70801a56ae3169b7aa28328a3a52dd6f7872c2f4 (patch) | |
tree | 5879671f91f1a1d9d5716f22f546114afe9d50f5 | |
parent | ae78b256715d34337a126ea6912f9b61439060e3 (diff) | |
download | chromium_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.cc | 4 | ||||
-rw-r--r-- | webkit/glue/webinputevent.h | 15 | ||||
-rw-r--r-- | webkit/glue/webinputevent_linux.cc | 21 | ||||
-rw-r--r-- | webkit/glue/webview_impl.cc | 4 | ||||
-rw-r--r-- | webkit/tools/test_shell/gtk/webwidget_host.cc | 13 |
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); |