cscg24-guacamole

CSCG 2024 Challenge 'Guacamole Mashup'
git clone https://git.sinitax.com/sinitax/cscg24-guacamole
Log | Files | Refs | sfeed.txt

scancode.h (15689B)


      1/**
      2 * FreeRDP: A Remote Desktop Protocol Implementation
      3 * RDP protocol "scancodes"
      4 *
      5 * Copyright 2009-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
      6 *
      7 * Licensed under the Apache License, Version 2.0 (the "License");
      8 * you may not use this file except in compliance with the License.
      9 * You may obtain a copy of the License at
     10 *
     11 *     http://www.apache.org/licenses/LICENSE-2.0
     12 *
     13 * Unless required by applicable law or agreed to in writing, software
     14 * distributed under the License is distributed on an "AS IS" BASIS,
     15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16 * See the License for the specific language governing permissions and
     17 * limitations under the License.
     18 */
     19
     20#ifndef FREERDP_LOCALE_KEYBOARD_RDP_SCANCODE_H
     21#define FREERDP_LOCALE_KEYBOARD_RDP_SCANCODE_H
     22
     23#include <winpr/input.h>
     24
     25/* @msdn{cc240584} says:
     26 * "... (a scancode is an 8-bit value specifying a key location on the keyboard).
     27 * The server accepts a scancode value and translates it into the correct character depending on the
     28 * language locale and keyboard layout used in the session." The 8-bit value is later called
     29 * "keyCode" The extended flag is for all practical an important 9th bit with a strange encoding -
     30 * not just a modifier.
     31 */
     32
     33#define RDP_SCANCODE_CODE(_rdp_scancode) ((BYTE)(_rdp_scancode & 0xFF))
     34#define RDP_SCANCODE_EXTENDED(_rdp_scancode) (((_rdp_scancode)&KBDEXT) ? TRUE : FALSE)
     35#define MAKE_RDP_SCANCODE(_code, _extended) (((_code)&0xFF) | ((_extended) ? KBDEXT : 0))
     36
     37/* Defines for known RDP_SCANCODE protocol values.
     38 * Mostly the same as the PKBDLLHOOKSTRUCT scanCode, "A hardware scan code for the key",
     39 * @msdn{ms644967}. Based @msdn{ms894073} US, @msdn{ms894072} UK, @msdn{ms892472} */
     40
     41#define RDP_SCANCODE_UNKNOWN MAKE_RDP_SCANCODE(0x00, FALSE)
     42
     43#define RDP_SCANCODE_ESCAPE MAKE_RDP_SCANCODE(0x01, FALSE)    /* VK_ESCAPE */
     44#define RDP_SCANCODE_KEY_1 MAKE_RDP_SCANCODE(0x02, FALSE)     /* VK_KEY_1 */
     45#define RDP_SCANCODE_KEY_2 MAKE_RDP_SCANCODE(0x03, FALSE)     /* VK_KEY_2 */
     46#define RDP_SCANCODE_KEY_3 MAKE_RDP_SCANCODE(0x04, FALSE)     /* VK_KEY_3 */
     47#define RDP_SCANCODE_KEY_4 MAKE_RDP_SCANCODE(0x05, FALSE)     /* VK_KEY_4 */
     48#define RDP_SCANCODE_KEY_5 MAKE_RDP_SCANCODE(0x06, FALSE)     /* VK_KEY_5 */
     49#define RDP_SCANCODE_KEY_6 MAKE_RDP_SCANCODE(0x07, FALSE)     /* VK_KEY_6 */
     50#define RDP_SCANCODE_KEY_7 MAKE_RDP_SCANCODE(0x08, FALSE)     /* VK_KEY_7 */
     51#define RDP_SCANCODE_KEY_8 MAKE_RDP_SCANCODE(0x09, FALSE)     /* VK_KEY_8 */
     52#define RDP_SCANCODE_KEY_9 MAKE_RDP_SCANCODE(0x0A, FALSE)     /* VK_KEY_9 */
     53#define RDP_SCANCODE_KEY_0 MAKE_RDP_SCANCODE(0x0B, FALSE)     /* VK_KEY_0 */
     54#define RDP_SCANCODE_OEM_MINUS MAKE_RDP_SCANCODE(0x0C, FALSE) /* VK_OEM_MINUS */
     55#define RDP_SCANCODE_OEM_PLUS MAKE_RDP_SCANCODE(0x0D, FALSE)  /* VK_OEM_PLUS */
     56#define RDP_SCANCODE_BACKSPACE MAKE_RDP_SCANCODE(0x0E, FALSE) /* VK_BACK Backspace */
     57#define RDP_SCANCODE_TAB MAKE_RDP_SCANCODE(0x0F, FALSE)       /* VK_TAB */
     58#define RDP_SCANCODE_KEY_Q MAKE_RDP_SCANCODE(0x10, FALSE)     /* VK_KEY_Q */
     59#define RDP_SCANCODE_KEY_W MAKE_RDP_SCANCODE(0x11, FALSE)     /* VK_KEY_W */
     60#define RDP_SCANCODE_KEY_E MAKE_RDP_SCANCODE(0x12, FALSE)     /* VK_KEY_E */
     61#define RDP_SCANCODE_KEY_R MAKE_RDP_SCANCODE(0x13, FALSE)     /* VK_KEY_R */
     62#define RDP_SCANCODE_KEY_T MAKE_RDP_SCANCODE(0x14, FALSE)     /* VK_KEY_T */
     63#define RDP_SCANCODE_KEY_Y MAKE_RDP_SCANCODE(0x15, FALSE)     /* VK_KEY_Y */
     64#define RDP_SCANCODE_KEY_U MAKE_RDP_SCANCODE(0x16, FALSE)     /* VK_KEY_U */
     65#define RDP_SCANCODE_KEY_I MAKE_RDP_SCANCODE(0x17, FALSE)     /* VK_KEY_I */
     66#define RDP_SCANCODE_KEY_O MAKE_RDP_SCANCODE(0x18, FALSE)     /* VK_KEY_O */
     67#define RDP_SCANCODE_KEY_P MAKE_RDP_SCANCODE(0x19, FALSE)     /* VK_KEY_P */
     68#define RDP_SCANCODE_OEM_4 MAKE_RDP_SCANCODE(0x1A, FALSE)     /* VK_OEM_4 '[' on US */
     69#define RDP_SCANCODE_OEM_6 MAKE_RDP_SCANCODE(0x1B, FALSE)     /* VK_OEM_6 ']' on US */
     70#define RDP_SCANCODE_RETURN MAKE_RDP_SCANCODE(0x1C, FALSE)    /* VK_RETURN Normal Enter */
     71#define RDP_SCANCODE_LCONTROL MAKE_RDP_SCANCODE(0x1D, FALSE)  /* VK_LCONTROL */
     72#define RDP_SCANCODE_KEY_A MAKE_RDP_SCANCODE(0x1E, FALSE)     /* VK_KEY_A */
     73#define RDP_SCANCODE_KEY_S MAKE_RDP_SCANCODE(0x1F, FALSE)     /* VK_KEY_S */
     74#define RDP_SCANCODE_KEY_D MAKE_RDP_SCANCODE(0x20, FALSE)     /* VK_KEY_D */
     75#define RDP_SCANCODE_KEY_F MAKE_RDP_SCANCODE(0x21, FALSE)     /* VK_KEY_F */
     76#define RDP_SCANCODE_KEY_G MAKE_RDP_SCANCODE(0x22, FALSE)     /* VK_KEY_G */
     77#define RDP_SCANCODE_KEY_H MAKE_RDP_SCANCODE(0x23, FALSE)     /* VK_KEY_H */
     78#define RDP_SCANCODE_KEY_J MAKE_RDP_SCANCODE(0x24, FALSE)     /* VK_KEY_J */
     79#define RDP_SCANCODE_KEY_K MAKE_RDP_SCANCODE(0x25, FALSE)     /* VK_KEY_K */
     80#define RDP_SCANCODE_KEY_L MAKE_RDP_SCANCODE(0x26, FALSE)     /* VK_KEY_L */
     81#define RDP_SCANCODE_OEM_1 MAKE_RDP_SCANCODE(0x27, FALSE)     /* VK_OEM_1 ';' on US */
     82#define RDP_SCANCODE_OEM_7 MAKE_RDP_SCANCODE(0x28, FALSE)     /* VK_OEM_7 "'" on US */
     83#define RDP_SCANCODE_OEM_3 \
     84	MAKE_RDP_SCANCODE(0x29, FALSE) /* VK_OEM_3 Top left, '`' on US, JP DBE_SBCSCHAR */
     85#define RDP_SCANCODE_LSHIFT MAKE_RDP_SCANCODE(0x2A, FALSE) /* VK_LSHIFT */
     86#define RDP_SCANCODE_OEM_5 MAKE_RDP_SCANCODE(0x2B, FALSE)  /* VK_OEM_5 Next to Enter, '\' on US */
     87#define RDP_SCANCODE_KEY_Z MAKE_RDP_SCANCODE(0x2C, FALSE)  /* VK_KEY_Z */
     88#define RDP_SCANCODE_KEY_X MAKE_RDP_SCANCODE(0x2D, FALSE)  /* VK_KEY_X */
     89#define RDP_SCANCODE_KEY_C MAKE_RDP_SCANCODE(0x2E, FALSE)  /* VK_KEY_C */
     90#define RDP_SCANCODE_KEY_V MAKE_RDP_SCANCODE(0x2F, FALSE)  /* VK_KEY_V */
     91#define RDP_SCANCODE_KEY_B MAKE_RDP_SCANCODE(0x30, FALSE)  /* VK_KEY_B */
     92#define RDP_SCANCODE_KEY_N MAKE_RDP_SCANCODE(0x31, FALSE)  /* VK_KEY_N */
     93#define RDP_SCANCODE_KEY_M MAKE_RDP_SCANCODE(0x32, FALSE)  /* VK_KEY_M */
     94#define RDP_SCANCODE_OEM_COMMA MAKE_RDP_SCANCODE(0x33, FALSE)  /* VK_OEM_COMMA */
     95#define RDP_SCANCODE_OEM_PERIOD MAKE_RDP_SCANCODE(0x34, FALSE) /* VK_OEM_PERIOD */
     96#define RDP_SCANCODE_OEM_2 MAKE_RDP_SCANCODE(0x35, FALSE)      /* VK_OEM_2 '/' on US */
     97#define RDP_SCANCODE_RSHIFT MAKE_RDP_SCANCODE(0x36, FALSE)     /* VK_RSHIFT */
     98#define RDP_SCANCODE_MULTIPLY MAKE_RDP_SCANCODE(0x37, FALSE)   /* VK_MULTIPLY Numerical */
     99#define RDP_SCANCODE_LMENU MAKE_RDP_SCANCODE(0x38, FALSE)      /* VK_LMENU Left 'Alt' key */
    100#define RDP_SCANCODE_SPACE MAKE_RDP_SCANCODE(0x39, FALSE)      /* VK_SPACE */
    101#define RDP_SCANCODE_CAPSLOCK \
    102	MAKE_RDP_SCANCODE(0x3A, FALSE) /* VK_CAPITAL 'Caps Lock', JP DBE_ALPHANUMERIC */
    103#define RDP_SCANCODE_F1 MAKE_RDP_SCANCODE(0x3B, FALSE)  /* VK_F1 */
    104#define RDP_SCANCODE_F2 MAKE_RDP_SCANCODE(0x3C, FALSE)  /* VK_F2 */
    105#define RDP_SCANCODE_F3 MAKE_RDP_SCANCODE(0x3D, FALSE)  /* VK_F3 */
    106#define RDP_SCANCODE_F4 MAKE_RDP_SCANCODE(0x3E, FALSE)  /* VK_F4 */
    107#define RDP_SCANCODE_F5 MAKE_RDP_SCANCODE(0x3F, FALSE)  /* VK_F5 */
    108#define RDP_SCANCODE_F6 MAKE_RDP_SCANCODE(0x40, FALSE)  /* VK_F6 */
    109#define RDP_SCANCODE_F7 MAKE_RDP_SCANCODE(0x41, FALSE)  /* VK_F7 */
    110#define RDP_SCANCODE_F8 MAKE_RDP_SCANCODE(0x42, FALSE)  /* VK_F8 */
    111#define RDP_SCANCODE_F9 MAKE_RDP_SCANCODE(0x43, FALSE)  /* VK_F9 */
    112#define RDP_SCANCODE_F10 MAKE_RDP_SCANCODE(0x44, FALSE) /* VK_F10 */
    113#define RDP_SCANCODE_NUMLOCK                                                                     \
    114	MAKE_RDP_SCANCODE(0x45, FALSE)                                                               \
    115	/* VK_NUMLOCK */ /* Note: when this seems to appear in PKBDLLHOOKSTRUCT it means Pause which \
    116	                    must be sent as Ctrl + NumLock */
    117#define RDP_SCANCODE_SCROLLLOCK \
    118	MAKE_RDP_SCANCODE(0x46, FALSE) /* VK_SCROLL 'Scroll Lock', JP OEM_SCROLL */
    119#define RDP_SCANCODE_NUMPAD7 MAKE_RDP_SCANCODE(0x47, FALSE)  /* VK_NUMPAD7 */
    120#define RDP_SCANCODE_NUMPAD8 MAKE_RDP_SCANCODE(0x48, FALSE)  /* VK_NUMPAD8 */
    121#define RDP_SCANCODE_NUMPAD9 MAKE_RDP_SCANCODE(0x49, FALSE)  /* VK_NUMPAD9 */
    122#define RDP_SCANCODE_SUBTRACT MAKE_RDP_SCANCODE(0x4A, FALSE) /* VK_SUBTRACT */
    123#define RDP_SCANCODE_NUMPAD4 MAKE_RDP_SCANCODE(0x4B, FALSE)  /* VK_NUMPAD4 */
    124#define RDP_SCANCODE_NUMPAD5 MAKE_RDP_SCANCODE(0x4C, FALSE)  /* VK_NUMPAD5 */
    125#define RDP_SCANCODE_NUMPAD6 MAKE_RDP_SCANCODE(0x4D, FALSE)  /* VK_NUMPAD6 */
    126#define RDP_SCANCODE_ADD MAKE_RDP_SCANCODE(0x4E, FALSE)      /* VK_ADD */
    127#define RDP_SCANCODE_NUMPAD1 MAKE_RDP_SCANCODE(0x4F, FALSE)  /* VK_NUMPAD1 */
    128#define RDP_SCANCODE_NUMPAD2 MAKE_RDP_SCANCODE(0x50, FALSE)  /* VK_NUMPAD2 */
    129#define RDP_SCANCODE_NUMPAD3 MAKE_RDP_SCANCODE(0x51, FALSE)  /* VK_NUMPAD3 */
    130#define RDP_SCANCODE_NUMPAD0 MAKE_RDP_SCANCODE(0x52, FALSE)  /* VK_NUMPAD0 */
    131#define RDP_SCANCODE_DECIMAL MAKE_RDP_SCANCODE(0x53, FALSE)  /* VK_DECIMAL Numerical, '.' on US */
    132#define RDP_SCANCODE_SYSREQ MAKE_RDP_SCANCODE(0x54, FALSE)   /* Sys Req */
    133#define RDP_SCANCODE_OEM_102 MAKE_RDP_SCANCODE(0x56, FALSE)  /* VK_OEM_102 Lower left '\' on US */
    134#define RDP_SCANCODE_F11 MAKE_RDP_SCANCODE(0x57, FALSE)      /* VK_F11 */
    135#define RDP_SCANCODE_F12 MAKE_RDP_SCANCODE(0x58, FALSE)      /* VK_F12 */
    136#define RDP_SCANCODE_SLEEP                                                                       \
    137	MAKE_RDP_SCANCODE(0x5F, FALSE)                       /* VK_SLEEP OEM_8 on FR (undocumented?) \
    138	                                                      */
    139#define RDP_SCANCODE_ZOOM MAKE_RDP_SCANCODE(0x62, FALSE) /* VK_ZOOM (undocumented?) */
    140#define RDP_SCANCODE_HELP MAKE_RDP_SCANCODE(0x63, FALSE) /* VK_HELP (undocumented?) */
    141
    142#define RDP_SCANCODE_F13 \
    143	MAKE_RDP_SCANCODE(0x64, FALSE) /* VK_F13 */ /* JP agree, should 0x7d according to ms894073 */
    144#define RDP_SCANCODE_F14 MAKE_RDP_SCANCODE(0x65, FALSE)              /* VK_F14 */
    145#define RDP_SCANCODE_F15 MAKE_RDP_SCANCODE(0x66, FALSE)              /* VK_F15 */
    146#define RDP_SCANCODE_F16 MAKE_RDP_SCANCODE(0x67, FALSE)              /* VK_F16 */
    147#define RDP_SCANCODE_F17 MAKE_RDP_SCANCODE(0x68, FALSE)              /* VK_F17 */
    148#define RDP_SCANCODE_F18 MAKE_RDP_SCANCODE(0x69, FALSE)              /* VK_F18 */
    149#define RDP_SCANCODE_F19 MAKE_RDP_SCANCODE(0x6A, FALSE)              /* VK_F19 */
    150#define RDP_SCANCODE_F20 MAKE_RDP_SCANCODE(0x6B, FALSE)              /* VK_F20 */
    151#define RDP_SCANCODE_F21 MAKE_RDP_SCANCODE(0x6C, FALSE)              /* VK_F21 */
    152#define RDP_SCANCODE_F22 MAKE_RDP_SCANCODE(0x6D, FALSE)              /* VK_F22 */
    153#define RDP_SCANCODE_F23 MAKE_RDP_SCANCODE(0x6E, FALSE) /* VK_F23 */ /* JP agree */
    154#define RDP_SCANCODE_F24 \
    155	MAKE_RDP_SCANCODE(0x6F, FALSE) /* VK_F24 */ /* 0x87 according to ms894073 */
    156
    157#define RDP_SCANCODE_HIRAGANA MAKE_RDP_SCANCODE(0x70, FALSE) /* JP DBE_HIRAGANA */
    158#define RDP_SCANCODE_HANJA_KANJI \
    159	MAKE_RDP_SCANCODE(0x71, FALSE) /* VK_HANJA / VK_KANJI (undocumented?) */
    160#define RDP_SCANCODE_KANA_HANGUL \
    161	MAKE_RDP_SCANCODE(0x72, FALSE) /* VK_KANA / VK_HANGUL (undocumented?) */
    162#define RDP_SCANCODE_ABNT_C1 MAKE_RDP_SCANCODE(0x73, FALSE)       /* VK_ABNT_C1 JP OEM_102 */
    163#define RDP_SCANCODE_F24_JP MAKE_RDP_SCANCODE(0x76, FALSE)        /* JP F24 */
    164#define RDP_SCANCODE_CONVERT_JP MAKE_RDP_SCANCODE(0x79, FALSE)    /* JP VK_CONVERT */
    165#define RDP_SCANCODE_NONCONVERT_JP MAKE_RDP_SCANCODE(0x7B, FALSE) /* JP VK_NONCONVERT */
    166#define RDP_SCANCODE_TAB_JP MAKE_RDP_SCANCODE(0x7C, FALSE)        /* JP TAB */
    167#define RDP_SCANCODE_BACKSLASH_JP MAKE_RDP_SCANCODE(0x7D, FALSE)  /* JP OEM_5 ('\') */
    168#define RDP_SCANCODE_ABNT_C2 MAKE_RDP_SCANCODE(0x7E, FALSE)       /* VK_ABNT_C2, JP */
    169#define RDP_SCANCODE_HANJA MAKE_RDP_SCANCODE(0x71, FALSE)         /* KR VK_HANJA */
    170#define RDP_SCANCODE_HANGUL MAKE_RDP_SCANCODE(0x72, FALSE)        /* KR VK_HANGUL */
    171
    172#define RDP_SCANCODE_RETURN_KP \
    173	MAKE_RDP_SCANCODE(0x1C, TRUE) /* not RDP_SCANCODE_RETURN Numerical Enter */
    174#define RDP_SCANCODE_RCONTROL MAKE_RDP_SCANCODE(0x1D, TRUE) /* VK_RCONTROL */
    175#define RDP_SCANCODE_DIVIDE MAKE_RDP_SCANCODE(0x35, TRUE)   /* VK_DIVIDE Numerical */
    176#define RDP_SCANCODE_PRINTSCREEN \
    177	MAKE_RDP_SCANCODE(0x37, TRUE) /* VK_EXECUTE/VK_PRINT/VK_SNAPSHOT Print Screen */
    178#define RDP_SCANCODE_RMENU MAKE_RDP_SCANCODE(0x38, TRUE) /* VK_RMENU Right 'Alt' / 'Alt Gr' */
    179#define RDP_SCANCODE_PAUSE \
    180	MAKE_RDP_SCANCODE(0x46, TRUE) /* VK_PAUSE Pause / Break (Slightly special handling) */
    181#define RDP_SCANCODE_HOME MAKE_RDP_SCANCODE(0x47, TRUE)   /* VK_HOME */
    182#define RDP_SCANCODE_UP MAKE_RDP_SCANCODE(0x48, TRUE)     /* VK_UP */
    183#define RDP_SCANCODE_PRIOR MAKE_RDP_SCANCODE(0x49, TRUE)  /* VK_PRIOR 'Page Up' */
    184#define RDP_SCANCODE_LEFT MAKE_RDP_SCANCODE(0x4B, TRUE)   /* VK_LEFT */
    185#define RDP_SCANCODE_RIGHT MAKE_RDP_SCANCODE(0x4D, TRUE)  /* VK_RIGHT */
    186#define RDP_SCANCODE_END MAKE_RDP_SCANCODE(0x4F, TRUE)    /* VK_END */
    187#define RDP_SCANCODE_DOWN MAKE_RDP_SCANCODE(0x50, TRUE)   /* VK_DOWN */
    188#define RDP_SCANCODE_NEXT MAKE_RDP_SCANCODE(0x51, TRUE)   /* VK_NEXT 'Page Down' */
    189#define RDP_SCANCODE_INSERT MAKE_RDP_SCANCODE(0x52, TRUE) /* VK_INSERT */
    190#define RDP_SCANCODE_DELETE MAKE_RDP_SCANCODE(0x53, TRUE) /* VK_DELETE */
    191#define RDP_SCANCODE_NULL MAKE_RDP_SCANCODE(0x54, TRUE)   /* <00> */
    192#define RDP_SCANCODE_HELP2 \
    193	MAKE_RDP_SCANCODE(0x56, TRUE) /* Help - documented, different from VK_HELP */
    194#define RDP_SCANCODE_LWIN MAKE_RDP_SCANCODE(0x5B, TRUE)     /* VK_LWIN */
    195#define RDP_SCANCODE_RWIN MAKE_RDP_SCANCODE(0x5C, TRUE)     /* VK_RWIN */
    196#define RDP_SCANCODE_APPS MAKE_RDP_SCANCODE(0x5D, TRUE)     /* VK_APPS Application */
    197#define RDP_SCANCODE_POWER_JP MAKE_RDP_SCANCODE(0x5E, TRUE) /* JP POWER */
    198#define RDP_SCANCODE_SLEEP_JP MAKE_RDP_SCANCODE(0x5F, TRUE) /* JP SLEEP */
    199
    200/* _not_ valid scancode, but this is what a windows PKBDLLHOOKSTRUCT for NumLock contains */
    201#define RDP_SCANCODE_NUMLOCK_EXTENDED \
    202	MAKE_RDP_SCANCODE(0x45, TRUE) /* should be RDP_SCANCODE_NUMLOCK */
    203#define RDP_SCANCODE_RSHIFT_EXTENDED \
    204	MAKE_RDP_SCANCODE(0x36, TRUE) /* should be RDP_SCANCODE_RSHIFT */
    205
    206/* Audio */
    207#define RDP_SCANCODE_VOLUME_MUTE MAKE_RDP_SCANCODE(0x20, TRUE) /* VK_VOLUME_MUTE */
    208#define RDP_SCANCODE_VOLUME_DOWN MAKE_RDP_SCANCODE(0x2E, TRUE) /* VK_VOLUME_DOWN */
    209#define RDP_SCANCODE_VOLUME_UP MAKE_RDP_SCANCODE(0x30, TRUE)   /* VK_VOLUME_UP */
    210
    211/* Media */
    212#define RDP_SCANCODE_MEDIA_NEXT_TRACK MAKE_RDP_SCANCODE(0x19, TRUE) /* VK_MEDIA_NEXT_TRACK */
    213#define RDP_SCANCODE_MEDIA_PREV_TRACK MAKE_RDP_SCANCODE(0x10, TRUE) /* VK_MEDIA_PREV_TRACK */
    214#define RDP_SCANCODE_MEDIA_STOP MAKE_RDP_SCANCODE(0x24, TRUE)       /* VK_MEDIA_MEDIA_STOP */
    215#define RDP_SCANCODE_MEDIA_PLAY_PAUSE                          \
    216	MAKE_RDP_SCANCODE(0x22, TRUE) /* VK_MEDIA_MEDIA_PLAY_PAUSE \
    217	                               */
    218
    219/* Browser functions */
    220#define RDP_SCANCODE_BROWSER_BACK MAKE_RDP_SCANCODE(0x6A, TRUE)      /* VK_BROWSER_BACK */
    221#define RDP_SCANCODE_BROWSER_FORWARD MAKE_RDP_SCANCODE(0x69, TRUE)   /* VK_BROWSER_FORWARD */
    222#define RDP_SCANCODE_BROWSER_REFRESH MAKE_RDP_SCANCODE(0x67, TRUE)   /* VK_BROWSER_REFRESH */
    223#define RDP_SCANCODE_BROWSER_STOP MAKE_RDP_SCANCODE(0x68, TRUE)      /* VK_BROWSER_STOP */
    224#define RDP_SCANCODE_BROWSER_SEARCH MAKE_RDP_SCANCODE(0x65, TRUE)    /* VK_BROWSER_SEARCH */
    225#define RDP_SCANCODE_BROWSER_FAVORITES MAKE_RDP_SCANCODE(0x66, TRUE) /* VK_BROWSER_FAVORITES */
    226#define RDP_SCANCODE_BROWSER_HOME MAKE_RDP_SCANCODE(0x32, TRUE)      /* VK_BROWSER_HOME */
    227
    228/* Misc. */
    229#define RDP_SCANCODE_LAUNCH_MAIL MAKE_RDP_SCANCODE(0x6C, TRUE) /* VK_LAUNCH_MAIL */
    230
    231#define RDP_SCANCODE_LAUNCH_MEDIA_SELECT                                                 \
    232	MAKE_RDP_SCANCODE(0x6D, TRUE)                              /* VK_LAUNCH_MEDIA_SELECT \
    233	                                                            */
    234#define RDP_SCANCODE_LAUNCH_APP1 MAKE_RDP_SCANCODE(0x6E, TRUE) /* VK_LAUNCH_APP1 */
    235#define RDP_SCANCODE_LAUNCH_APP2 MAKE_RDP_SCANCODE(0x6F, TRUE) /* VK_LAUNCH_APP2 */
    236
    237#endif /* FREERDP_LOCALE_KEYBOARD_RDP_SCANCODE_H */