Home | History | Annotate | Download | only in focus
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/views/focus/accelerator_handler.h"
      6 
      7 #include "ui/events/event.h"
      8 #include "ui/events/keycodes/keyboard_code_conversion_win.h"
      9 #include "ui/events/keycodes/keyboard_codes.h"
     10 #include "ui/views/focus/focus_manager.h"
     11 #include "ui/views/widget/widget.h"
     12 
     13 namespace views {
     14 
     15 AcceleratorHandler::AcceleratorHandler() {
     16 }
     17 
     18 bool AcceleratorHandler::Dispatch(const base::NativeEvent& msg) {
     19   if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST) {
     20     Widget* widget = Widget::GetTopLevelWidgetForNativeView(msg.hwnd);
     21     FocusManager* focus_manager = widget ? widget->GetFocusManager() : NULL;
     22     if (focus_manager) {
     23       switch (msg.message) {
     24         case WM_KEYDOWN:
     25         case WM_SYSKEYDOWN: {
     26           ui::KeyEvent event(msg, false);
     27           if (!focus_manager->OnKeyEvent(event)) {
     28             // Record that this key is pressed so we can remember not to
     29             // translate and dispatch the associated WM_KEYUP.
     30             pressed_keys_.insert(msg.wParam);
     31             return true;
     32           }
     33           break;
     34         }
     35         case WM_KEYUP:
     36         case WM_SYSKEYUP: {
     37           std::set<WPARAM>::iterator iter = pressed_keys_.find(msg.wParam);
     38           if (iter != pressed_keys_.end()) {
     39             // Don't translate/dispatch the KEYUP since we have eaten the
     40             // associated KEYDOWN.
     41             pressed_keys_.erase(iter);
     42             return true;
     43           }
     44           break;
     45         }
     46       }
     47     }
     48   }
     49 
     50   TranslateMessage(&msg);
     51   DispatchMessage(&msg);
     52   return true;
     53 }
     54 
     55 }  // namespace views
     56