20#include <winpr/config.h>
24#include <winpr/input.h>
34static DWORD KEYCODE_TO_VKCODE_APPLE[256] = {
140 VK_SNAPSHOT | KBDEXT,
299static DWORD KEYCODE_TO_VKCODE_EVDEV[256] = {
397 VK_RCONTROL | KBDEXT,
399 VK_SNAPSHOT | KBDEXT,
413 VK_VOLUME_MUTE | KBDEXT,
414 VK_VOLUME_DOWN | KBDEXT,
415 VK_VOLUME_UP | KBDEXT,
457 VK_LAUNCH_MAIL | KBDEXT,
458 VK_BROWSER_FAVORITES | KBDEXT,
460 VK_BROWSER_BACK | KBDEXT,
461 VK_BROWSER_FORWARD | KBDEXT,
465 VK_MEDIA_NEXT_TRACK | KBDEXT,
466 VK_MEDIA_PLAY_PAUSE | KBDEXT,
467 VK_MEDIA_PREV_TRACK | KBDEXT,
468 VK_MEDIA_STOP | KBDEXT,
474 VK_BROWSER_HOME | KBDEXT,
475 VK_BROWSER_REFRESH | KBDEXT,
520 VK_BROWSER_SEARCH | KBDEXT,
576static DWORD KEYCODE_TO_VKCODE_XKB[256] = {
696 VK_RCONTROL | KBDEXT,
698 VK_SNAPSHOT | KBDEXT,
713 VK_VOLUME_MUTE | KBDEXT,
714 VK_VOLUME_DOWN | KBDEXT,
715 VK_VOLUME_UP | KBDEXT,
756 VK_LAUNCH_MAIL | KBDEXT,
757 VK_BROWSER_FAVORITES | KBDEXT,
759 VK_BROWSER_BACK | KBDEXT,
760 VK_BROWSER_FORWARD | KBDEXT,
764 VK_MEDIA_NEXT_TRACK | KBDEXT,
765 VK_MEDIA_PLAY_PAUSE | KBDEXT,
766 VK_MEDIA_PREV_TRACK | KBDEXT,
767 VK_MEDIA_STOP | KBDEXT,
773 VK_BROWSER_HOME | KBDEXT,
774 VK_BROWSER_REFRESH | KBDEXT,
818 VK_BROWSER_SEARCH | KBDEXT,
851DWORD GetVirtualKeyCodeFromKeycode(DWORD keycode, WINPR_KEYCODE_TYPE type)
853 DWORD vkcode = VK_NONE;
857 case WINPR_KEYCODE_TYPE_APPLE:
859 vkcode = KEYCODE_TO_VKCODE_APPLE[keycode & 0xFF];
861 case WINPR_KEYCODE_TYPE_EVDEV:
863 vkcode = KEYCODE_TO_VKCODE_EVDEV[keycode & 0xFF];
865 case WINPR_KEYCODE_TYPE_XKB:
867 vkcode = KEYCODE_TO_VKCODE_XKB[keycode & 0xFF];
873 WINPR_ASSERT(vkcode != 0);
878static DWORD GetKeycodeFromVirtualKeyCodeWithOffset(DWORD offset, DWORD keycode,
879 WINPR_KEYCODE_TYPE type)
881 DWORD* targetArray =
nullptr;
882 size_t targetSize = 0;
884 if (keycode == VK_NONE)
889 case WINPR_KEYCODE_TYPE_APPLE:
890 targetArray = KEYCODE_TO_VKCODE_APPLE;
891 targetSize = ARRAYSIZE(KEYCODE_TO_VKCODE_APPLE);
893 case WINPR_KEYCODE_TYPE_EVDEV:
894 targetArray = KEYCODE_TO_VKCODE_EVDEV;
895 targetSize = ARRAYSIZE(KEYCODE_TO_VKCODE_EVDEV);
897 case WINPR_KEYCODE_TYPE_XKB:
898 targetArray = KEYCODE_TO_VKCODE_XKB;
899 targetSize = ARRAYSIZE(KEYCODE_TO_VKCODE_XKB);
905 for (DWORD index = offset; index < targetSize; index++)
907 if (keycode == targetArray[index])
914DWORD GetKeycodeFromVirtualKeyCode(DWORD keycode, WINPR_KEYCODE_TYPE type)
916 return GetKeycodeFromVirtualKeyCodeWithOffset(0, keycode, type);
920WINPR_API DWORD GetKeycodesFromVirtualKeyCode(DWORD keycode, WINPR_KEYCODE_TYPE type,
921 DWORD* pdwKeyCodeBuffer,
size_t KeyCodeBufferSize)
927 WINPR_ASSERT(pdwKeyCodeBuffer || (KeyCodeBufferSize == 0));
929 const BOOL nobuffer = (KeyCodeBufferSize == 0);
932 kc = GetKeycodeFromVirtualKeyCodeWithOffset(offset, keycode, type);
937 if (count < KeyCodeBufferSize)
938 pdwKeyCodeBuffer[count++] = kc;
945 }
while ((kc != 0) && ((count < KeyCodeBufferSize) || nobuffer));