summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-17 21:40:15 +0000
committerevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-17 21:40:15 +0000
commit401efff5d553c57124790696503f0f06fff31344 (patch)
treefbd75f42936e0ef9e3c1fba4fdb64d8c9b5e8639 /chrome
parente6499926fcd6b66d4ae819c27fdc614e4c0edf05 (diff)
downloadchromium_src-401efff5d553c57124790696503f0f06fff31344.zip
chromium_src-401efff5d553c57124790696503f0f06fff31344.tar.gz
chromium_src-401efff5d553c57124790696503f0f06fff31344.tar.bz2
Keyboard focus mostly works on Linux.
I added more TODOs than I removed, but they're now for more subtle cases: - the web page didn't handle a keystroke and our accelerators should; - you tab off the end of the list of tabbable things on the page. Review URL: http://codereview.chromium.org/21428 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@9903 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/renderer_host/render_widget_host.cc11
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.cc20
-rw-r--r--chrome/browser/tab_contents/web_contents_view_gtk.cc4
3 files changed, 28 insertions, 7 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host.cc b/chrome/browser/renderer_host/render_widget_host.cc
index 7a1f599..a3c3018 100644
--- a/chrome/browser/renderer_host/render_widget_host.cc
+++ b/chrome/browser/renderer_host/render_widget_host.cc
@@ -6,6 +6,7 @@
#include "base/gfx/native_widget_types.h"
#include "base/message_loop.h"
+#include "base/keyboard_codes.h"
#include "chrome/browser/renderer_host/backing_store.h"
#include "chrome/browser/renderer_host/render_process_host.h"
#include "chrome/browser/renderer_host/render_widget_helper.h"
@@ -283,15 +284,11 @@ void RenderWidgetHost::ForwardWheelEvent(
}
void RenderWidgetHost::ForwardKeyboardEvent(const WebKeyboardEvent& key_event) {
-#if defined(OS_WIN)
if (key_event.type == WebKeyboardEvent::CHAR &&
- (key_event.key_code == VK_RETURN || key_event.key_code == VK_SPACE))
+ (key_event.key_code == base::VKEY_RETURN ||
+ key_event.key_code == base::VKEY_SPACE)) {
OnEnterOrSpace();
-#else
- // TODO(port): we don't have portable keyboard codes yet
- // Maybe use keyboard_codes.h if we stick with it
- NOTIMPLEMENTED();
-#endif
+ }
ForwardInputEvent(key_event, sizeof(WebKeyboardEvent));
}
diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc
index b24014c..634ac06 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc
+++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc
@@ -41,6 +41,8 @@ class RenderWidgetHostViewGtkWidget {
G_CALLBACK(KeyPressReleaseEvent), host_view);
g_signal_connect(widget, "key-release-event",
G_CALLBACK(KeyPressReleaseEvent), host_view);
+ g_signal_connect(widget, "focus",
+ G_CALLBACK(Focus), host_view);
g_signal_connect(widget, "focus-in-event",
G_CALLBACK(FocusIn), host_view);
g_signal_connect(widget, "focus-out-event",
@@ -85,6 +87,16 @@ class RenderWidgetHostViewGtkWidget {
return FALSE;
}
+ static gboolean Focus(GtkWidget* widget, GtkDirectionType focus,
+ RenderWidgetHostViewGtk* host_view) {
+ // We override this so that pressing tab navigates within the web contents
+ // rather than tabbing out of it. However, we do want to be able to tab
+ // out of it at the appropriate points. TODO(port): study how this works
+ // on Windows and implement it.
+ NOTIMPLEMENTED();
+ return TRUE;
+ }
+
static gboolean FocusIn(GtkWidget* widget, GdkEventFocus* focus,
RenderWidgetHostViewGtk* host_view) {
host_view->GetRenderWidgetHost()->Focus();
@@ -102,6 +114,12 @@ class RenderWidgetHostViewGtkWidget {
RenderWidgetHostViewGtk* host_view) {
WebMouseEvent wme(event);
host_view->GetRenderWidgetHost()->ForwardMouseEvent(wme);
+
+ // TODO(evanm): why is this necessary here but not in test shell?
+ // This logic is the same as GtkButton.
+ if (event->type == GDK_BUTTON_PRESS && !GTK_WIDGET_HAS_FOCUS(widget))
+ gtk_widget_grab_focus(widget);
+
return FALSE;
}
@@ -118,6 +136,8 @@ class RenderWidgetHostViewGtkWidget {
host_view->GetRenderWidgetHost()->ForwardWheelEvent(wmwe);
return FALSE;
}
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(RenderWidgetHostViewGtkWidget);
};
} // namespace
diff --git a/chrome/browser/tab_contents/web_contents_view_gtk.cc b/chrome/browser/tab_contents/web_contents_view_gtk.cc
index cd0d09a..4add84a 100644
--- a/chrome/browser/tab_contents/web_contents_view_gtk.cc
+++ b/chrome/browser/tab_contents/web_contents_view_gtk.cc
@@ -102,6 +102,10 @@ void WebContentsViewGtk::TakeFocus(bool reverse) {
}
void WebContentsViewGtk::HandleKeyboardEvent(const WebKeyboardEvent& event) {
+ // The renderer returned a keyboard event it did not process. This may be
+ // a keyboard shortcut that we have to process.
+ // The windows code forwards this event onwards to accelerator handling,
+ // and then to DefWindowProc. TODO(port): should do something similar.
NOTIMPLEMENTED();
}