# 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()); } ```