# Ash Debug Shortcuts
If [--ash-debug-shortcuts](https://source.chromium.org/chromium/chromium/src/+/main:ash/constants/ash_switches.cc;l=210;drc=a7add8469b4660dd621ca439edc01130b75aca84) flag is specified in Chrome option, we can use special keyboard shortcuts for debugging.
For example, CTRL+ALT+SHIFT+T enables/disables tablet mode.
CTRL+ALT+SHIFT+W prints the window hierarchy log.
## List of the keys
[kDebugAcceleratorData](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/accelerator_table.cc;l=70;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3) shows a list of the shortcut keys:
```cpp=
const AcceleratorData kDebugAcceleratorData[] = {
{true, ui::VKEY_N, kDebugModifier, AcceleratorAction::kToggleWifi},
{true, ui::VKEY_X, kDebugModifier,
AcceleratorAction::kDebugKeyboardBacklightToggle},
{true, ui::VKEY_M, kDebugModifier,
AcceleratorAction::kDebugMicrophoneMuteToggle},
{true, ui::VKEY_O, kDebugModifier, AcceleratorAction::kDebugShowToast},
{true, ui::VKEY_Z, kDebugModifier,
AcceleratorAction::kDebugSystemUiStyleViewer},
{true, ui::VKEY_P, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
AcceleratorAction::kDebugToggleTouchPad},
{true, ui::VKEY_T, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
AcceleratorAction::kDebugToggleTouchScreen},
{true, ui::VKEY_T, kDebugModifier,
AcceleratorAction::kDebugToggleTabletMode},
{true, ui::VKEY_A, kDebugModifier,
AcceleratorAction::kDebugToggleVideoConferenceCameraTrayIcon},
{true, ui::VKEY_B, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
AcceleratorAction::kDebugToggleWallpaperMode},
{true, ui::VKEY_L, kDebugModifier,
AcceleratorAction::kDebugPrintLayerHierarchy},
{true, ui::VKEY_V, kDebugModifier,
AcceleratorAction::kDebugPrintViewHierarchy},
{true, ui::VKEY_W, kDebugModifier,
AcceleratorAction::kDebugPrintWindowHierarchy},
{true, ui::VKEY_9, kDebugModifier,
AcceleratorAction::kDebugToggleGlanceables},
{true, ui::VKEY_B, kDebugModifier,
AcceleratorAction::kDebugToggleShowDebugBorders},
{true, ui::VKEY_F, kDebugModifier,
AcceleratorAction::kDebugToggleShowFpsCounter},
{true, ui::VKEY_P, kDebugModifier,
AcceleratorAction::kDebugToggleShowPaintRects},
{true, ui::VKEY_K, kDebugModifier, AcceleratorAction::kDebugTriggerCrash},
{true, ui::VKEY_G, kDebugModifier,
AcceleratorAction::kDebugToggleHudDisplay},
{true, ui::VKEY_Q, kDebugModifier,
AcceleratorAction::kDebugToggleVirtualTrackpad},
{true, ui::VKEY_D, kDebugModifier, AcceleratorAction::kDebugToggleDarkMode},
{true, ui::VKEY_Y, kDebugModifier,
AcceleratorAction::kDebugToggleDynamicColor},
{true, ui::VKEY_E, kDebugModifier,
AcceleratorAction::kDebugTogglePowerButtonMenu},
{true, ui::VKEY_C, kDebugModifier,
AcceleratorAction::kDebugClearUseKMeansPref},
};
```
This may be updated relatively frequently.
## How registered
AshAccelertorConfigurtion is [Initialize](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/ash_accelerator_configuration.cc;l=388;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3)d by the shortcut key sets by [GetDefautAccelerators](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/ash_accelerator_configuration.cc;l=122;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3).
Ash debug shortcuts is enabled if [DebugAccelertorsEnabled](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/debug_commands.cc;l=299;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3) is true. If it's true, [kDebugAcceleratorData](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/accelerator_table.cc;l=70;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3) will be appended.
All shortcuts requires [kDebugModifier](https://source.chromium.org/chromium/chromium/src/+/main:ash/public/cpp/accelerators.h;l=34;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3) defined as follows:
```cpp=
// A mask of all the modifiers used for debug accelerators.
ASH_PUBLIC_EXPORT constexpr int kDebugModifier =
ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN;
```
CTRL+ALT+SHIFT+hoge is a template.
Each action has "hoge" part key and its action name like: `{true, ui::VKEY_N, kDebugModifier, AcceleratorAction::kToggleWifi},`.
We can add a custom debug shorcut by specifying one key and action name.
[AcceleratorAction](https://source.chromium.org/chromium/chromium/src/+/main:ash/public/cpp/accelerator_actions.h;l=193;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3)
## How triggered
When accelerator is pressed ([AcceleratorPressed](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/accelerator_controller_impl.cc;l=568;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3)), it looks for the corresponding action.
AcceleratorAction is found by [AshAcceleratorConfiguration::FindAcceleratorAction](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/ash_accelerator_configuration.cc;l=248;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3).
Then the found action is dispatchd by [PerformAction](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/accelerator_controller_impl.cc;l=904;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3) and switches based ont the ccelerationAction type.
For ash debug command, [AcceleratorAction](https://source.chromium.org/chromium/chromium/src/+/main:ash/public/cpp/accelerator_actions.h;l=193;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3) will be received by [PerformDebugActionIfEnabled](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/debug_commands.cc;l=309;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3).
Each action has its own impl in ash/accelerators/debug_commands.cc. For example: [ToggleTablet](https://source.chromium.org/chromium/chromium/src/+/main:ash/accelerators/debug_commands.cc;l=222;drc=8c0874163bb6f015d7b326c154db9307d53ca8c3)
```cpp=
void HandleToggleTabletMode() {
TabletModeController* controller = Shell::Get()->tablet_mode_controller();
controller->SetEnabledForDev(!controller->InTabletMode());
}
```