Index: ui/base/accelerators/accelerator_manager.cc |
=================================================================== |
--- ui/base/accelerators/accelerator_manager.cc (revision 123221) |
+++ ui/base/accelerators/accelerator_manager.cc (working copy) |
@@ -17,11 +17,29 @@ |
} |
void AcceleratorManager::Register(const Accelerator& accelerator, |
+ HandlerPriority priority, |
AcceleratorTarget* target) { |
- AcceleratorTargetList& targets = accelerators_[accelerator]; |
+ AcceleratorTargetList& targets = accelerators_[accelerator].second; |
DCHECK(std::find(targets.begin(), targets.end(), target) == targets.end()) |
<< "Registering the same target multiple times"; |
- targets.push_front(target); |
+ |
+ // All priority accelerators go to the front of the line. |
+ if (priority) { |
+ DCHECK(!accelerators_[accelerator].first) |
+ << "Only one _priority_ handler can be registered"; |
+ targets.push_front(target); |
+ // Mark that we have a priority accelerator at the front. |
+ accelerators_[accelerator].first = true; |
+ return; |
+ } |
+ |
+ // We are registering a normal priority handler. If no priority accelerator |
+ // handler has been registered before us, just add the new handler to the |
+ // front. Otherwise, register it after the first (only) priority handler. |
+ if (!accelerators_[accelerator].first) |
+ targets.push_front(target); |
+ else |
+ targets.insert(++targets.begin(), target); |
} |
void AcceleratorManager::Unregister(const Accelerator& accelerator, |
@@ -32,7 +50,7 @@ |
return; |
} |
- AcceleratorTargetList* targets = &map_iter->second; |
+ AcceleratorTargetList* targets = &map_iter->second.second; |
AcceleratorTargetList::iterator target_iter = |
std::find(targets->begin(), targets->end(), target); |
if (target_iter == targets->end()) { |
@@ -40,13 +58,19 @@ |
return; |
} |
+ // Check to see if we have a priority handler and whether we are removing it. |
+ if (accelerators_[accelerator].first && target_iter == targets->begin()) { |
+ // We've are taking the priority accelerator away, flip the priority flag. |
+ accelerators_[accelerator].first = false; |
+ } |
+ |
targets->erase(target_iter); |
} |
void AcceleratorManager::UnregisterAll(AcceleratorTarget* target) { |
for (AcceleratorMap::iterator map_iter = accelerators_.begin(); |
map_iter != accelerators_.end(); ++map_iter) { |
- AcceleratorTargetList* targets = &map_iter->second; |
+ AcceleratorTargetList* targets = &map_iter->second.second; |
targets->remove(target); |
} |
} |
@@ -57,7 +81,7 @@ |
if (map_iter != accelerators_.end() && ShouldHandle(accelerator)) { |
// We have to copy the target list here, because an AcceleratorPressed |
// event handler may modify the list. |
- AcceleratorTargetList targets(map_iter->second); |
+ AcceleratorTargetList targets(map_iter->second.second); |
for (AcceleratorTargetList::iterator iter = targets.begin(); |
iter != targets.end(); ++iter) { |
if ((*iter)->CanHandleAccelerators() && |
@@ -74,11 +98,26 @@ |
AcceleratorTarget* AcceleratorManager::GetCurrentTarget( |
const Accelerator& accelerator) const { |
AcceleratorMap::const_iterator map_iter = accelerators_.find(accelerator); |
- if (map_iter == accelerators_.end() || map_iter->second.empty()) |
+ if (map_iter == accelerators_.end() || map_iter->second.second.empty()) |
return NULL; |
- return map_iter->second.front(); |
+ return map_iter->second.second.front(); |
} |
+bool AcceleratorManager::HasPriorityHandler( |
+ const Accelerator& accelerator) const { |
+ AcceleratorMap::const_iterator map_iter = accelerators_.find(accelerator); |
+ if (map_iter == accelerators_.end() || map_iter->second.second.empty()) |
+ return false; |
+ |
+ // Check if we have a priority handler. If not, there's no more work needed. |
+ if (!map_iter->second.first) |
+ return false; |
+ |
+ // If the priority handler says it cannot handle the accelerator, we must not |
+ // count it as one. |
+ return map_iter->second.second.front()->CanHandleAccelerators(); |
+} |
+ |
bool AcceleratorManager::ShouldHandle(const Accelerator& accelerator) const { |
if (accelerator.type() != ET_KEY_RELEASED && |
accelerator.type() != ET_TRANSLATED_KEY_RELEASE) { |