diff options
Diffstat (limited to 'chrome/browser/views')
-rw-r--r-- | chrome/browser/views/frame/browser_view.cc | 55 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view.h | 11 | ||||
-rw-r--r-- | chrome/browser/views/unhandled_keyboard_event_handler.cc | 75 | ||||
-rw-r--r-- | chrome/browser/views/unhandled_keyboard_event_handler.h | 39 |
4 files changed, 119 insertions, 61 deletions
diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc index 197ac7c..b03129e 100644 --- a/chrome/browser/views/frame/browser_view.cc +++ b/chrome/browser/views/frame/browser_view.cc @@ -421,7 +421,6 @@ BrowserView::BrowserView(Browser* browser) #if defined(OS_WIN) hung_window_detector_(&hung_plugin_action_), ticker_(0), - ignore_next_char_event_(false), #endif extension_shelf_(NULL), last_focused_view_storage_id_( @@ -1234,58 +1233,8 @@ bool BrowserView::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, } void BrowserView::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { -#if defined(OS_WIN) - // Previous calls to TranslateMessage can generate Char events as well as - // RawKeyDown events, even if the latter triggered an accelerator. In these - // cases, we discard the Char events. - if (event.type == WebKit::WebInputEvent::Char && ignore_next_char_event_) { - ignore_next_char_event_ = false; - return; - } - // It's necessary to reset this flag, because a RawKeyDown event may not - // always generate a Char event. - ignore_next_char_event_ = false; -#endif - - if (event.type == WebKit::WebInputEvent::RawKeyDown) { - views::FocusManager* focus_manager = GetFocusManager(); - DCHECK(focus_manager); - - views::Accelerator accelerator( - static_cast<base::KeyboardCode>(event.windowsKeyCode), - (event.modifiers & NativeWebKeyboardEvent::ShiftKey) == - NativeWebKeyboardEvent::ShiftKey, - (event.modifiers & NativeWebKeyboardEvent::ControlKey) == - NativeWebKeyboardEvent::ControlKey, - (event.modifiers & NativeWebKeyboardEvent::AltKey) == - NativeWebKeyboardEvent::AltKey); - -#if defined(OS_WIN) - // This is tricky: we want to set ignore_next_char_event_ if - // ProcessAccelerator returns true. But ProcessAccelerator might delete - // |this| if the accelerator is a "close tab" one. So we speculatively - // set the flag and fix it if no event was handled. - ignore_next_char_event_ = true; -#endif - - if (focus_manager->ProcessAccelerator(accelerator)) { - // DANGER: |this| could be deleted now! - return; - } - -#if defined(OS_WIN) - // ProcessAccelerator didn't handle the accelerator, so we know both - // that |this| is still valid, and that we didn't want to set the flag. - ignore_next_char_event_ = false; -#endif - } - -#if defined(OS_WIN) - // Any unhandled keyboard/character messages should be defproced. - // This allows stuff like F10, etc to work correctly. - DefWindowProc(event.os_event.hwnd, event.os_event.message, - event.os_event.wParam, event.os_event.lParam); -#endif + unhandled_keyboard_event_handler_.HandleKeyboardEvent(event, + GetFocusManager()); } #if defined(TOOLKIT_VIEWS) diff --git a/chrome/browser/views/frame/browser_view.h b/chrome/browser/views/frame/browser_view.h index d06c388..651e9c7 100644 --- a/chrome/browser/views/frame/browser_view.h +++ b/chrome/browser/views/frame/browser_view.h @@ -19,6 +19,7 @@ #include "chrome/browser/tabs/tab_strip_model.h" #include "chrome/browser/views/frame/browser_frame.h" #include "chrome/browser/views/tabs/tab_strip.h" +#include "chrome/browser/views/unhandled_keyboard_event_handler.h" #include "views/window/client_view.h" #include "views/window/window_delegate.h" @@ -537,14 +538,6 @@ class BrowserView : public BrowserWindow, // The custom JumpList for Windows 7. scoped_ptr<JumpList> jumplist_; - - // Whether to ignore the next Char keyboard event. - // If a RawKeyDown event was handled as a shortcut key, then we're done - // handling it and should eat any Char event that the translate phase may - // have produced from it. (Handling this event may cause undesirable effects, - // such as a beep if DefWindowProc() has no default handling for the given - // Char.) - bool ignore_next_char_event_; #endif // The timer used to update frames for the Loading Animation. @@ -564,6 +557,8 @@ class BrowserView : public BrowserWindow, // Last focused view that issued a tab traversal. int last_focused_view_storage_id_; + UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; + DISALLOW_COPY_AND_ASSIGN(BrowserView); }; diff --git a/chrome/browser/views/unhandled_keyboard_event_handler.cc b/chrome/browser/views/unhandled_keyboard_event_handler.cc new file mode 100644 index 0000000..cc29354 --- /dev/null +++ b/chrome/browser/views/unhandled_keyboard_event_handler.cc @@ -0,0 +1,75 @@ +// Copyright (c) 2010 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 "chrome/browser/views/unhandled_keyboard_event_handler.h" + +#include "base/logging.h" +#include "views/focus/focus_manager.h" + +UnhandledKeyboardEventHandler::UnhandledKeyboardEventHandler() { +#if defined(OS_WIN) + ignore_next_char_event_ = false; +#endif +} + +UnhandledKeyboardEventHandler::~UnhandledKeyboardEventHandler() { +} + +void UnhandledKeyboardEventHandler::HandleKeyboardEvent( + const NativeWebKeyboardEvent& event, + views::FocusManager* focus_manager) { + if (!focus_manager) { + NOTREACHED(); + return; + } +#if defined(OS_WIN) + // Previous calls to TranslateMessage can generate Char events as well as + // RawKeyDown events, even if the latter triggered an accelerator. In these + // cases, we discard the Char events. + if (event.type == WebKit::WebInputEvent::Char && ignore_next_char_event_) { + ignore_next_char_event_ = false; + return; + } + // It's necessary to reset this flag, because a RawKeyDown event may not + // always generate a Char event. + ignore_next_char_event_ = false; +#endif + + if (event.type == WebKit::WebInputEvent::RawKeyDown) { + views::Accelerator accelerator( + static_cast<base::KeyboardCode>(event.windowsKeyCode), + (event.modifiers & NativeWebKeyboardEvent::ShiftKey) == + NativeWebKeyboardEvent::ShiftKey, + (event.modifiers & NativeWebKeyboardEvent::ControlKey) == + NativeWebKeyboardEvent::ControlKey, + (event.modifiers & NativeWebKeyboardEvent::AltKey) == + NativeWebKeyboardEvent::AltKey); + +#if defined(OS_WIN) + // This is tricky: we want to set ignore_next_char_event_ if + // ProcessAccelerator returns true. But ProcessAccelerator might delete + // |this| if the accelerator is a "close tab" one. So we speculatively + // set the flag and fix it if no event was handled. + ignore_next_char_event_ = true; +#endif + + if (focus_manager->ProcessAccelerator(accelerator)) { + return; + } + +#if defined(OS_WIN) + // ProcessAccelerator didn't handle the accelerator, so we know both + // that |this| is still valid, and that we didn't want to set the flag. + ignore_next_char_event_ = false; +#endif + } + +#if defined(OS_WIN) + // Any unhandled keyboard/character messages should be defproced. + // This allows stuff like F10, etc to work correctly. + DefWindowProc(event.os_event.hwnd, event.os_event.message, + event.os_event.wParam, event.os_event.lParam); +#endif +} + diff --git a/chrome/browser/views/unhandled_keyboard_event_handler.h b/chrome/browser/views/unhandled_keyboard_event_handler.h new file mode 100644 index 0000000..4873bcd --- /dev/null +++ b/chrome/browser/views/unhandled_keyboard_event_handler.h @@ -0,0 +1,39 @@ +// Copyright (c) 2006-2010 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. + +#ifndef CHROME_BROWSER_VIEWS_UNHANDLED_KEYBOARD_EVENT_HANDLER_H_ +#define CHROME_BROWSER_VIEWS_UNHANDLED_KEYBOARD_EVENT_HANDLER_H_ + +#include "views/view.h" +#include "chrome/common/native_web_keyboard_event.h" + +namespace views { +class FocusManager; +} // namespace views + +// This class handles unhandled keyboard messages coming back from the renderer +// process. +class UnhandledKeyboardEventHandler { + public: + UnhandledKeyboardEventHandler(); + ~UnhandledKeyboardEventHandler(); + + void HandleKeyboardEvent(const NativeWebKeyboardEvent& event, + views::FocusManager* focus_manager); + + private: +#if defined(OS_WIN) + // Whether to ignore the next Char keyboard event. + // If a RawKeyDown event was handled as a shortcut key, then we're done + // handling it and should eat any Char event that the translate phase may + // have produced from it. (Handling this event may cause undesirable effects, + // such as a beep if DefWindowProc() has no default handling for the given + // Char.) + bool ignore_next_char_event_; +#endif + + DISALLOW_COPY_AND_ASSIGN(UnhandledKeyboardEventHandler); +}; + +#endif // CHROME_BROWSER_VIEWS_UNHANDLED_KEYBOARD_EVENT_HANDLER_H_ |