This directory contains code for handling accelerators in Ash. The following documents the flow of accelerators.

  1. wm::AcceleratorFilter() sees events first as it's a pre-target handler on Shell.
  2. wm::AcceleratorFilter calls to PreTargetAcceleratorHandler.
  3. PreTargetAcceleratorHandler handles accelerators that need to be handled early on, such as system keys. This does not include accelerators such as control-n (for new window).
  4. If focus is on a Widget, then views handles the accelerator.
  5. Views does normally processing first (meaning sends to the focused view). If the focused view doesn't handle the event, then Views sends to the FocusManager.
  6. FocusManager::OnKeyEvent() calls PostTargerAcceleratorHandler::ProcessAccelerator().
  7. PostTargerAcceleratorHandler::ProcessAccelerator() calls to Ash's AcceleratorController.

Steps 1-3 give Ash the opportunity to have accelerators before the target (these are often referred to as pre-target accelerators). Step 4-5 allows the target to handle the accelerator. Step 6-7 allow for post-target accelerators (accelerators that only occur if the target does not handle the accelerator).

Steps 4-7 differ if focus is on a remote window (a window created at the request of a client connecting by way of the WindowService). If focus is on a remote window, then step 4-7 are replaced with:

  1. WindowService waits for response from remote client.
  2. If remote client does not handle the event, WindowService calls WindowServiceDelegate::OnUnhandledKeyEvent().
  3. Ash's WindowServiceDelegateImpl::OnUnhandledKeyEvent() calls to AcceleratorController::Process(), which handles the post-target processing phase.