/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ │ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │ ╞══════════════════════════════════════════════════════════════════════════════╡ │ Copyright 2023 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ │ above copyright notice and this permission notice appear in all copies. │ │ │ │ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ │ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ │ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ │ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ │ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ │ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/intrin/kprintf.h" #include "libc/macros.h" #include "libc/nt/enum/vk.h" // clang-format off static const struct VirtualKeyCodeName { uint32_t code; const char *name; } kVirtualKeyCodeNames[] = { {kNtVkLbutton, "kNtVkLbutton"}, {kNtVkRbutton, "kNtVkRbutton"}, {kNtVkCancel, "kNtVkCancel"}, {kNtVkMbutton, "kNtVkMbutton"}, {kNtVkXbutton1, "kNtVkXbutton1"}, {kNtVkXbutton2, "kNtVkXbutton2"}, {kNtVkBack, "kNtVkBack"}, {kNtVkTab, "kNtVkTab"}, {kNtVkClear, "kNtVkClear"}, {kNtVkReturn, "kNtVkReturn"}, {kNtVkShift, "kNtVkShift"}, {kNtVkControl, "kNtVkControl"}, {kNtVkMenu, "kNtVkMenu"}, {kNtVkPause, "kNtVkPause"}, {kNtVkCapital, "kNtVkCapital"}, {kNtVkKana, "kNtVkKana"}, {kNtVkHangul, "kNtVkHangul"}, {kNtVkJunja, "kNtVkJunja"}, {kNtVkFinal, "kNtVkFinal"}, {kNtVkHanja, "kNtVkHanja"}, {kNtVkKanji, "kNtVkKanji"}, {kNtVkEscape, "kNtVkEscape"}, {kNtVkConvert, "kNtVkConvert"}, {kNtVkNonconvert, "kNtVkNonconvert"}, {kNtVkAccept, "kNtVkAccept"}, {kNtVkModechange, "kNtVkModechange"}, {kNtVkSpace, "kNtVkSpace"}, {kNtVkPrior, "kNtVkPrior"}, {kNtVkNext, "kNtVkNext"}, {kNtVkEnd, "kNtVkEnd"}, {kNtVkHome, "kNtVkHome"}, {kNtVkLeft, "kNtVkLeft"}, {kNtVkUp, "kNtVkUp"}, {kNtVkRight, "kNtVkRight"}, {kNtVkDown, "kNtVkDown"}, {kNtVkSelect, "kNtVkSelect"}, {kNtVkPrint, "kNtVkPrint"}, {kNtVkExecute, "kNtVkExecute"}, {kNtVkSnapshot, "kNtVkSnapshot"}, {kNtVkInsert, "kNtVkInsert"}, {kNtVkDelete, "kNtVkDelete"}, {kNtVkHelp, "kNtVkHelp"}, {kNtVkLwin, "kNtVkLwin"}, {kNtVkRwin, "kNtVkRwin"}, {kNtVkApps, "kNtVkApps"}, {kNtVkSleep, "kNtVkSleep"}, {kNtVkNumpad0, "kNtVkNumpad0"}, {kNtVkNumpad1, "kNtVkNumpad1"}, {kNtVkNumpad2, "kNtVkNumpad2"}, {kNtVkNumpad3, "kNtVkNumpad3"}, {kNtVkNumpad4, "kNtVkNumpad4"}, {kNtVkNumpad5, "kNtVkNumpad5"}, {kNtVkNumpad6, "kNtVkNumpad6"}, {kNtVkNumpad7, "kNtVkNumpad7"}, {kNtVkNumpad8, "kNtVkNumpad8"}, {kNtVkNumpad9, "kNtVkNumpad9"}, {kNtVkMultiply, "kNtVkMultiply"}, {kNtVkAdd, "kNtVkAdd"}, {kNtVkSeparator, "kNtVkSeparator"}, {kNtVkSubtract, "kNtVkSubtract"}, {kNtVkDecimal, "kNtVkDecimal"}, {kNtVkDivide, "kNtVkDivide"}, {kNtVkF1, "kNtVkF1"}, {kNtVkF2, "kNtVkF2"}, {kNtVkF3, "kNtVkF3"}, {kNtVkF4, "kNtVkF4"}, {kNtVkF5, "kNtVkF5"}, {kNtVkF6, "kNtVkF6"}, {kNtVkF7, "kNtVkF7"}, {kNtVkF8, "kNtVkF8"}, {kNtVkF9, "kNtVkF9"}, {kNtVkF10, "kNtVkF10"}, {kNtVkF11, "kNtVkF11"}, {kNtVkF12, "kNtVkF12"}, {kNtVkF13, "kNtVkF13"}, {kNtVkF14, "kNtVkF14"}, {kNtVkF15, "kNtVkF15"}, {kNtVkF16, "kNtVkF16"}, {kNtVkF17, "kNtVkF17"}, {kNtVkF18, "kNtVkF18"}, {kNtVkF19, "kNtVkF19"}, {kNtVkF20, "kNtVkF20"}, {kNtVkF21, "kNtVkF21"}, {kNtVkF22, "kNtVkF22"}, {kNtVkF23, "kNtVkF23"}, {kNtVkF24, "kNtVkF24"}, {kNtVkNumlock, "kNtVkNumlock"}, {kNtVkScroll, "kNtVkScroll"}, {kNtVkLshift, "kNtVkLshift"}, {kNtVkRshift, "kNtVkRshift"}, {kNtVkLcontrol, "kNtVkLcontrol"}, {kNtVkRcontrol, "kNtVkRcontrol"}, {kNtVkLmenu, "kNtVkLmenu"}, {kNtVkRmenu, "kNtVkRmenu"}, {kNtVkBrowserBack, "kNtVkBrowserBack"}, {kNtVkBrowserForward, "kNtVkBrowserForward"}, {kNtVkBrowserRefresh, "kNtVkBrowserRefresh"}, {kNtVkBrowserStop, "kNtVkBrowserStop"}, {kNtVkBrowserSearch, "kNtVkBrowserSearch"}, {kNtVkBrowserFavorites, "kNtVkBrowserFavorites"}, {kNtVkBrowserHome, "kNtVkBrowserHome"}, {kNtVkVolumeMute, "kNtVkVolumeMute"}, {kNtVkVolumeDown, "kNtVkVolumeDown"}, {kNtVkVolumeUp, "kNtVkVolumeUp"}, {kNtVkMediaNextTrack, "kNtVkMediaNextTrack"}, {kNtVkMediaPrevTrack, "kNtVkMediaPrevTrack"}, {kNtVkMediaStop, "kNtVkMediaStop"}, {kNtVkMediaPlayPause, "kNtVkMediaPlayPause"}, {kNtVkLaunchMail, "kNtVkLaunchMail"}, {kNtVkLaunchMediaSelect, "kNtVkLaunchMediaSelect"}, {kNtVkLaunchApp1, "kNtVkLaunchApp1"}, {kNtVkLaunchApp2, "kNtVkLaunchApp2"}, {kNtVkOem_1, "kNtVkOem_1"}, {kNtVkOemPlus, "kNtVkOemPlus"}, {kNtVkOemComma, "kNtVkOemComma"}, {kNtVkOemMinus, "kNtVkOemMinus"}, {kNtVkOemPeriod, "kNtVkOemPeriod"}, {kNtVkOem_2, "kNtVkOem_2"}, {kNtVkOem_3, "kNtVkOem_3"}, {kNtVkGamepadA, "kNtVkGamepadA"}, {kNtVkGamepadB, "kNtVkGamepadB"}, {kNtVkGamepadX, "kNtVkGamepadX"}, {kNtVkGamepadY, "kNtVkGamepadY"}, {kNtVkGamepadRightShoulder, "kNtVkGamepadRightShoulder"}, {kNtVkGamepadLeftShoulder, "kNtVkGamepadLeftShoulder"}, {kNtVkGamepadLeftTrigger, "kNtVkGamepadLeftTrigger"}, {kNtVkGamepadRightTrigger, "kNtVkGamepadRightTrigger"}, {kNtVkGamepadDpadUp, "kNtVkGamepadDpadUp"}, {kNtVkGamepadDpadDown, "kNtVkGamepadDpadDown"}, {kNtVkGamepadDpadLeft, "kNtVkGamepadDpadLeft"}, {kNtVkGamepadDpadRight, "kNtVkGamepadDpadRight"}, {kNtVkGamepadMenu, "kNtVkGamepadMenu"}, {kNtVkGamepadView, "kNtVkGamepadView"}, {kNtVkGamepadLeftThumbstickButton, "kNtVkGamepadLeftThumbstickButton"}, {kNtVkGamepadRightThumbstickButton, "kNtVkGamepadRightThumbstickButton"}, {kNtVkGamepadLeftThumbstickUp, "kNtVkGamepadLeftThumbstickUp"}, {kNtVkGamepadLeftThumbstickDown, "kNtVkGamepadLeftThumbstickDown"}, {kNtVkGamepadLeftThumbstickRight, "kNtVkGamepadLeftThumbstickRight"}, {kNtVkGamepadLeftThumbstickLeft, "kNtVkGamepadLeftThumbstickLeft"}, {kNtVkGamepadRightThumbstickUp, "kNtVkGamepadRightThumbstickUp"}, {kNtVkGamepadRightThumbstickDown, "kNtVkGamepadRightThumbstickDown"}, {kNtVkGamepadRightThumbstickRight, "kNtVkGamepadRightThumbstickRight"}, {kNtVkGamepadRightThumbstickLeft, "kNtVkGamepadRightThumbstickLeft"}, {kNtVkOem_4, "kNtVkOem_4"}, {kNtVkOem_5, "kNtVkOem_5"}, {kNtVkOem_6, "kNtVkOem_6"}, {kNtVkOem_7, "kNtVkOem_7"}, {kNtVkOem_8, "kNtVkOem_8"}, {kNtVkOemAx, "kNtVkOemAx"}, {kNtVkOem_102, "kNtVkOem_102"}, {kNtVkIcoHelp, "kNtVkIcoHelp"}, {kNtVkIco_00, "kNtVkIco_00"}, {kNtVkProcesskey, "kNtVkProcesskey"}, {kNtVkIcoClear, "kNtVkIcoClear"}, {kNtVkPacket, "kNtVkPacket"}, {kNtVkOemReset, "kNtVkOemReset"}, {kNtVkOemJump, "kNtVkOemJump"}, {kNtVkOemPa1, "kNtVkOemPa1"}, {kNtVkOemPa2, "kNtVkOemPa2"}, {kNtVkOemPa3, "kNtVkOemPa3"}, {kNtVkOemWsctrl, "kNtVkOemWsctrl"}, {kNtVkOemCusel, "kNtVkOemCusel"}, {kNtVkOemAttn, "kNtVkOemAttn"}, {kNtVkOemFinish, "kNtVkOemFinish"}, {kNtVkOemCopy, "kNtVkOemCopy"}, {kNtVkOemAuto, "kNtVkOemAuto"}, {kNtVkOemEnlw, "kNtVkOemEnlw"}, {kNtVkOemBacktab, "kNtVkOemBacktab"}, {kNtVkAttn, "kNtVkAttn"}, {kNtVkCrsel, "kNtVkCrsel"}, {kNtVkExsel, "kNtVkExsel"}, {kNtVkEreof, "kNtVkEreof"}, {kNtVkPlay, "kNtVkPlay"}, {kNtVkZoom, "kNtVkZoom"}, {kNtVkNoname, "kNtVkNoname"}, {kNtVkPa1, "kNtVkPa1"}, {kNtVkOemClear, "kNtVkOemClear"}, }; // clang-format on const char *_DescribeVirtualKeyCode(char buf[32], uint32_t x) { for (int i = 0; i < ARRAYLEN(kVirtualKeyCodeNames); ++i) { if (x == kVirtualKeyCodeNames[i].code) { return kVirtualKeyCodeNames[i].name; } } ksnprintf(buf, 32, "%#x[%#lc]", x, x); return buf; }