| Index: ash/mus/accelerators/accelerator_controller_registrar.cc
|
| diff --git a/ash/mus/accelerators/accelerator_controller_registrar.cc b/ash/mus/accelerators/accelerator_controller_registrar.cc
|
| index 264b914dc26a69c2588cda967a0fe3a490f8550c..8d7078d742ea4451c2c2bd985f969cdbda98e9da 100644
|
| --- a/ash/mus/accelerators/accelerator_controller_registrar.cc
|
| +++ b/ash/mus/accelerators/accelerator_controller_registrar.cc
|
| @@ -27,7 +27,21 @@ void OnAcceleratorAdded(const ui::Accelerator& accelerator, bool added) {
|
| << " modifiers=" << accelerator.modifiers();
|
| }
|
|
|
| +// Callback from registering the accelerators.
|
| +void OnAcceleratorVectorAdded(const std::vector<ui::Accelerator>& accelerators,
|
| + bool added) {
|
| + if (!added) {
|
| + std::stringstream error_message("duplicate accelerator in accelerators");
|
| +
|
| + for (auto iter = accelerators.begin(); iter != accelerators.end(); ++iter)
|
| + error_message << " key_code=" << iter->key_code()
|
| + << " type=" << iter->type()
|
| + << " modifiers=" << iter->modifiers();
|
| + DCHECK(added) << error_message.str();
|
| + }
|
| +
|
| } // namespace
|
| +}
|
|
|
| AcceleratorControllerRegistrar::AcceleratorControllerRegistrar(
|
| WindowManager* window_manager,
|
| @@ -100,39 +114,12 @@ ui::mojom::EventResult AcceleratorControllerRegistrar::OnAccelerator(
|
|
|
| void AcceleratorControllerRegistrar::OnAcceleratorRegistered(
|
| const ui::Accelerator& accelerator) {
|
| - Ids ids;
|
| - if (!GenerateIds(&ids)) {
|
| - DVLOG(1) << "max number of accelerators registered, dropping request";
|
| - return;
|
| - }
|
| - DCHECK_EQ(0u, accelerator_to_ids_.count(accelerator));
|
| - accelerator_to_ids_[accelerator] = ids;
|
| - DCHECK_EQ(accelerator_to_ids_.size() * 2, ids_.size());
|
| + std::vector<ui::mojom::AcceleratorPtr> accelerator_vector;
|
|
|
| - ui::mojom::EventMatcherPtr event_matcher = ui::CreateKeyMatcher(
|
| - static_cast<ui::mojom::KeyboardCode>(accelerator.key_code()),
|
| - accelerator.modifiers());
|
| - event_matcher->accelerator_phase = ui::mojom::AcceleratorPhase::PRE_TARGET;
|
| - DCHECK(accelerator.type() == ui::ET_KEY_PRESSED ||
|
| - accelerator.type() == ui::ET_KEY_RELEASED);
|
| - event_matcher->type_matcher->type = accelerator.type() == ui::ET_KEY_PRESSED
|
| - ? ui::mojom::EventType::KEY_PRESSED
|
| - : ui::mojom::EventType::KEY_RELEASED;
|
| -
|
| - ui::mojom::EventMatcherPtr post_event_matcher = event_matcher.Clone();
|
| - post_event_matcher->accelerator_phase =
|
| - ui::mojom::AcceleratorPhase::POST_TARGET;
|
| + AddAcceleratorToVector(accelerator, accelerator_vector);
|
|
|
| window_manager_->window_manager_client()->AddAccelerators(
|
| - ui::CreateAcceleratorVector(
|
| - ComputeAcceleratorId(id_namespace_, ids.pre_id),
|
| - std::move(event_matcher)),
|
| - base::Bind(OnAcceleratorAdded, accelerator));
|
| -
|
| - window_manager_->window_manager_client()->AddAccelerators(
|
| - ui::CreateAcceleratorVector(
|
| - ComputeAcceleratorId(id_namespace_, ids.post_id),
|
| - std::move(post_event_matcher)),
|
| + std::move(accelerator_vector),
|
| base::Bind(OnAcceleratorAdded, accelerator));
|
| }
|
|
|
| @@ -151,6 +138,55 @@ void AcceleratorControllerRegistrar::OnAcceleratorUnregistered(
|
| ComputeAcceleratorId(id_namespace_, ids.post_id));
|
| }
|
|
|
| +void AcceleratorControllerRegistrar::OnAcceleratorVectorRegistered(
|
| + const std::vector<ui::Accelerator>& accelerators) {
|
| + std::vector<ui::mojom::AcceleratorPtr> accelerator_vector;
|
| +
|
| + for (auto iter = accelerators.begin(); iter != accelerators.end(); ++iter)
|
| + AddAcceleratorToVector(*iter, accelerator_vector);
|
| +
|
| + window_manager_->window_manager_client()->AddAccelerators(
|
| + std::move(accelerator_vector),
|
| + base::Bind(OnAcceleratorVectorAdded, accelerators));
|
| +}
|
| +
|
| +void AcceleratorControllerRegistrar::AddAcceleratorToVector(
|
| + const ui::Accelerator& accelerator,
|
| + std::vector<ui::mojom::AcceleratorPtr>& accelerator_vector) {
|
| + Ids ids;
|
| + if (!GenerateIds(&ids)) {
|
| + DVLOG(1) << "max number of accelerators registered, dropping request";
|
| + return;
|
| + }
|
| + DCHECK_EQ(0u, accelerator_to_ids_.count(accelerator));
|
| + accelerator_to_ids_[accelerator] = ids;
|
| + DCHECK_EQ(accelerator_to_ids_.size() * 2, ids_.size());
|
| +
|
| + ui::mojom::EventMatcherPtr pre_event_matcher = ui::CreateKeyMatcher(
|
| + static_cast<ui::mojom::KeyboardCode>(accelerator.key_code()),
|
| + accelerator.modifiers());
|
| + pre_event_matcher->accelerator_phase =
|
| + ui::mojom::AcceleratorPhase::PRE_TARGET;
|
| + DCHECK(accelerator.type() == ui::ET_KEY_PRESSED ||
|
| + accelerator.type() == ui::ET_KEY_RELEASED);
|
| + pre_event_matcher->type_matcher->type =
|
| + accelerator.type() == ui::ET_KEY_PRESSED
|
| + ? ui::mojom::EventType::KEY_PRESSED
|
| + : ui::mojom::EventType::KEY_RELEASED;
|
| +
|
| + ui::mojom::EventMatcherPtr post_event_matcher = pre_event_matcher.Clone();
|
| + post_event_matcher->accelerator_phase =
|
| + ui::mojom::AcceleratorPhase::POST_TARGET;
|
| +
|
| + accelerator_vector.push_back(
|
| + ui::CreateAccelerator(ComputeAcceleratorId(id_namespace_, ids.pre_id),
|
| + std::move(pre_event_matcher)));
|
| +
|
| + accelerator_vector.push_back(
|
| + ui::CreateAccelerator(ComputeAcceleratorId(id_namespace_, ids.post_id),
|
| + std::move(post_event_matcher)));
|
| +}
|
| +
|
| bool AcceleratorControllerRegistrar::GenerateIds(Ids* ids) {
|
| if (ids_.size() + 2 >= std::numeric_limits<uint16_t>::max())
|
| return false;
|
|
|