Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(937)

Side by Side Diff: chrome/views/focus/focus_manager.cc

Issue 99161: Handle all accelerators in focus manager when focused view doesn't want to ta... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/views/focus/focus_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm> 5 #include <algorithm>
6 6
7 #include "base/histogram.h" 7 #include "base/histogram.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/win_util.h" 9 #include "base/win_util.h"
10 #include "chrome/browser/renderer_host/render_widget_host_view_win.h" 10 #include "chrome/browser/renderer_host/render_widget_host_view_win.h"
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 repeat_count, flags))) { 300 repeat_count, flags))) {
301 // This should not be processed as an accelerator. 301 // This should not be processed as an accelerator.
302 return true; 302 return true;
303 } 303 }
304 304
305 // Process keyboard accelerators. 305 // Process keyboard accelerators.
306 // We process accelerators here as we have no way of knowing if a HWND has 306 // We process accelerators here as we have no way of knowing if a HWND has
307 // really processed a key event. If the key combination matches an 307 // really processed a key event. If the key combination matches an
308 // accelerator, the accelerator is triggered, otherwise we forward the 308 // accelerator, the accelerator is triggered, otherwise we forward the
309 // event to the HWND. 309 // event to the HWND.
310 int modifiers = 0;
311 if (win_util::IsShiftPressed())
312 modifiers |= Event::EF_SHIFT_DOWN;
313 if (win_util::IsCtrlPressed())
314 modifiers |= Event::EF_CONTROL_DOWN;
315 if (win_util::IsAltPressed())
316 modifiers |= Event::EF_ALT_DOWN;
317 Accelerator accelerator(Accelerator(static_cast<int>(virtual_key_code), 310 Accelerator accelerator(Accelerator(static_cast<int>(virtual_key_code),
318 win_util::IsShiftPressed(), 311 win_util::IsShiftPressed(),
319 win_util::IsCtrlPressed(), 312 win_util::IsCtrlPressed(),
320 win_util::IsAltPressed())); 313 win_util::IsAltPressed()));
321 if (ProcessAccelerator(accelerator, true)) { 314 if (ProcessAccelerator(accelerator)) {
322 // If a shortcut was activated for this keydown message, do not 315 // If a shortcut was activated for this keydown message, do not
323 // propagate the message further. 316 // propagate the message further.
324 return false; 317 return false;
325 } 318 }
326 return true; 319 return true;
327 } 320 }
328 321
329 bool FocusManager::OnPostActivate(HWND window, 322 bool FocusManager::OnPostActivate(HWND window,
330 int activation_state, 323 int activation_state,
331 int minimized_state) { 324 int minimized_state) {
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 void FocusManager::UnregisterAccelerators(AcceleratorTarget* target) { 635 void FocusManager::UnregisterAccelerators(AcceleratorTarget* target) {
643 for (AcceleratorMap::iterator iter = accelerators_.begin(); 636 for (AcceleratorMap::iterator iter = accelerators_.begin();
644 iter != accelerators_.end();) { 637 iter != accelerators_.end();) {
645 if (iter->second == target) 638 if (iter->second == target)
646 accelerators_.erase(iter++); 639 accelerators_.erase(iter++);
647 else 640 else
648 ++iter; 641 ++iter;
649 } 642 }
650 } 643 }
651 644
652 bool FocusManager::ProcessAccelerator(const Accelerator& accelerator, 645 bool FocusManager::ProcessAccelerator(const Accelerator& accelerator) {
653 bool prioritary_accelerators_only) { 646 FocusManager* focus_manager = this;
654 if (!prioritary_accelerators_only || 647 do {
655 accelerator.IsCtrlDown() || accelerator.IsAltDown() || 648 AcceleratorTarget* target =
656 accelerator.GetKeyCode() == VK_ESCAPE || 649 focus_manager->GetTargetForAccelerator(accelerator);
657 accelerator.GetKeyCode() == VK_RETURN || 650 if (target) {
658 (accelerator.GetKeyCode() >= VK_F1 && 651 // If there is focused view, we give it a chance to process that
659 accelerator.GetKeyCode() <= VK_F24) || 652 // accelerator.
660 (accelerator.GetKeyCode() >= VK_BROWSER_BACK && 653 if (!focused_view_ ||
661 accelerator.GetKeyCode() <= VK_BROWSER_HOME)) { 654 !focused_view_->OverrideAccelerator(accelerator)) {
662 FocusManager* focus_manager = this; 655 if (target->AcceleratorPressed(accelerator))
663 do { 656 return true;
664 AcceleratorTarget* target =
665 focus_manager->GetTargetForAccelerator(accelerator);
666 if (target) {
667 // If there is focused view, we give it a chance to process that
668 // accelerator.
669 if (!focused_view_ ||
670 !focused_view_->OverrideAccelerator(accelerator)) {
671 if (target->AcceleratorPressed(accelerator))
672 return true;
673 }
674 } 657 }
658 }
675 659
676 // When dealing with child windows that have their own FocusManager (such 660 // When dealing with child windows that have their own FocusManager (such
677 // as ConstrainedWindow), we still want the parent FocusManager to process 661 // as ConstrainedWindow), we still want the parent FocusManager to process
678 // the accelerator if the child window did not process it. 662 // the accelerator if the child window did not process it.
679 focus_manager = focus_manager->GetParentFocusManager(); 663 focus_manager = focus_manager->GetParentFocusManager();
680 } while (focus_manager); 664 } while (focus_manager);
681 }
682 return false; 665 return false;
683 } 666 }
684 667
685 AcceleratorTarget* FocusManager::GetTargetForAccelerator( 668 AcceleratorTarget* FocusManager::GetTargetForAccelerator(
686 const Accelerator& accelerator) const { 669 const Accelerator& accelerator) const {
687 AcceleratorMap::const_iterator iter = accelerators_.find(accelerator); 670 AcceleratorMap::const_iterator iter = accelerators_.find(accelerator);
688 if (iter != accelerators_.end()) 671 if (iter != accelerators_.end())
689 return iter->second; 672 return iter->second;
690 return NULL; 673 return NULL;
691 } 674 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 std::find(focus_change_listeners_.begin(), focus_change_listeners_.end(), 711 std::find(focus_change_listeners_.begin(), focus_change_listeners_.end(),
729 listener); 712 listener);
730 if (place == focus_change_listeners_.end()) { 713 if (place == focus_change_listeners_.end()) {
731 NOTREACHED() << "Removing a listener that isn't registered."; 714 NOTREACHED() << "Removing a listener that isn't registered.";
732 return; 715 return;
733 } 716 }
734 focus_change_listeners_.erase(place); 717 focus_change_listeners_.erase(place);
735 } 718 }
736 719
737 } // namespace views 720 } // namespace views
OLDNEW
« no previous file with comments | « chrome/views/focus/focus_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698