Index: chrome/browser/ui/panels/panel_view.cc |
diff --git a/chrome/browser/ui/panels/panel_view.cc b/chrome/browser/ui/panels/panel_view.cc |
index e0dd484c6f500e2bb9f8c737e21c163ae2580ed2..27fc80d5c28dab8235edd66fb46db3000adf6f16 100644 |
--- a/chrome/browser/ui/panels/panel_view.cc |
+++ b/chrome/browser/ui/panels/panel_view.cc |
@@ -4,7 +4,9 @@ |
#include "chrome/browser/ui/panels/panel_view.h" |
+#include <map> |
#include "base/logging.h" |
+#include "chrome/app/chrome_command_ids.h" |
#include "chrome/browser/ui/panels/panel.h" |
#include "chrome/browser/ui/panels/panel_bounds_animation.h" |
#include "chrome/browser/ui/panels/panel_frame_view.h" |
@@ -24,6 +26,46 @@ |
namespace { |
+// Supported accelerators. |
+// Note: We can't use the acclerator table defined in chrome/browser/ui/views |
+// due to checkdeps violation. |
+struct AcceleratorMapping { |
+ ui::KeyboardCode keycode; |
+ int modifiers; |
+ int command_id; |
+}; |
+const AcceleratorMapping kPanelAcceleratorMap[] = { |
+ { ui::VKEY_W, ui::EF_CONTROL_DOWN, IDC_CLOSE_WINDOW }, |
+ { ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, IDC_CLOSE_WINDOW }, |
+ { ui::VKEY_F4, ui::EF_ALT_DOWN, IDC_CLOSE_WINDOW }, |
+ { ui::VKEY_R, ui::EF_CONTROL_DOWN, IDC_RELOAD }, |
+ { ui::VKEY_F5, ui::EF_NONE, IDC_RELOAD }, |
+ { ui::VKEY_R, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, |
+ IDC_RELOAD_IGNORING_CACHE }, |
+ { ui::VKEY_F5, ui::EF_CONTROL_DOWN, IDC_RELOAD_IGNORING_CACHE }, |
+ { ui::VKEY_F5, ui::EF_SHIFT_DOWN, IDC_RELOAD_IGNORING_CACHE }, |
+ { ui::VKEY_ESCAPE, ui::EF_NONE, IDC_STOP }, |
+ { ui::VKEY_OEM_MINUS, ui::EF_CONTROL_DOWN, IDC_ZOOM_MINUS }, |
+ { ui::VKEY_SUBTRACT, ui::EF_CONTROL_DOWN, IDC_ZOOM_MINUS }, |
+ { ui::VKEY_0, ui::EF_CONTROL_DOWN, IDC_ZOOM_NORMAL }, |
+ { ui::VKEY_NUMPAD0, ui::EF_CONTROL_DOWN, IDC_ZOOM_NORMAL }, |
+ { ui::VKEY_OEM_PLUS, ui::EF_CONTROL_DOWN, IDC_ZOOM_PLUS }, |
+ { ui::VKEY_ADD, ui::EF_CONTROL_DOWN, IDC_ZOOM_PLUS }, |
+}; |
+ |
+const std::map<ui::Accelerator, int>& GetAcceleratorTable() { |
+ static std::map<ui::Accelerator, int>* accelerators = NULL; |
+ if (!accelerators) { |
+ accelerators = new std::map<ui::Accelerator, int>(); |
+ for (size_t i = 0; i < arraysize(kPanelAcceleratorMap); ++i) { |
+ ui::Accelerator accelerator(kPanelAcceleratorMap[i].keycode, |
+ kPanelAcceleratorMap[i].modifiers); |
+ (*accelerators)[accelerator] = kPanelAcceleratorMap[i].command_id; |
+ } |
+ } |
+ return *accelerators; |
+} |
+ |
// NativePanelTesting implementation. |
class NativePanelTestingWin : public NativePanelTesting { |
public: |
@@ -142,10 +184,16 @@ PanelView::PanelView(Panel* panel, const gfx::Rect& bounds) |
OnViewWasResized(); |
+ // Register accelarators supported by panels. |
views::FocusManager* focus_manager = GetFocusManager(); |
- ui::Accelerator accelerator(ui::VKEY_ESCAPE, ui::EF_NONE); |
- focus_manager->RegisterAccelerator( |
- accelerator, ui::AcceleratorManager::kNormalPriority, this); |
+ const std::map<ui::Accelerator, int>& accelerator_table = |
+ GetAcceleratorTable(); |
+ for (std::map<ui::Accelerator, int>::const_iterator iter = |
+ accelerator_table.begin(); |
+ iter != accelerator_table.end(); ++iter) { |
+ focus_manager->RegisterAccelerator( |
+ iter->first, ui::AcceleratorManager::kNormalPriority, this); |
+ } |
} |
PanelView::~PanelView() { |
@@ -306,6 +354,16 @@ bool PanelView::PreHandlePanelKeyboardEvent( |
void PanelView::HandlePanelKeyboardEvent( |
const content::NativeWebKeyboardEvent& event) { |
+ views::FocusManager* focus_manager = GetFocusManager(); |
+ if (focus_manager->shortcut_handling_suspended()) |
+ return; |
+ |
+ ui::Accelerator accelerator( |
+ static_cast<ui::KeyboardCode>(event.windowsKeyCode), |
+ content::GetModifiersFromNativeWebKeyboardEvent(event)); |
+ if (event.type == WebKit::WebInputEvent::KeyUp) |
+ accelerator.set_type(ui::ET_KEY_RELEASED); |
+ focus_manager->ProcessAccelerator(accelerator); |
} |
void PanelView::FullScreenModeChanged(bool is_full_screen) { |
@@ -519,7 +577,12 @@ bool PanelView::AcceleratorPressed(const ui::Accelerator& accelerator) { |
if (mouse_dragging_state_ == DRAGGING_STARTED) |
return true; |
- return views::View::AcceleratorPressed(accelerator); |
+ const std::map<ui::Accelerator, int>& accelerator_table = |
+ GetAcceleratorTable(); |
+ std::map<ui::Accelerator, int>::const_iterator iter = |
+ accelerator_table.find(accelerator); |
+ DCHECK(iter != accelerator_table.end()); |
+ return panel_->ExecuteCommandIfEnabled(iter->second); |
} |
void PanelView::OnWidgetActivationChanged(views::Widget* widget, bool active) { |