From 34608f3d298bc841faf42b1cbef3a8d514063c6e Mon Sep 17 00:00:00 2001 From: bagajjal Date: Thu, 5 Dec 2019 13:20:04 -0800 Subject: [PATCH] Read VTSequence from console (#412) Use console win32 API to read the VTSequence for keystrokes on client-side. --- contrib/win32/win32compat/console.c | 9 +- contrib/win32/win32compat/console.h | 4 + contrib/win32/win32compat/inc/string.h | 3 +- contrib/win32/win32compat/misc.c | 11 + contrib/win32/win32compat/tncon.c | 1348 ++++++++++++------------ contrib/win32/win32compat/tnnet.c | 20 +- 6 files changed, 744 insertions(+), 651 deletions(-) diff --git a/contrib/win32/win32compat/console.c b/contrib/win32/win32compat/console.c index 3a2aca3eb..ff2dd5883 100644 --- a/contrib/win32/win32compat/console.c +++ b/contrib/win32/win32compat/console.c @@ -55,6 +55,7 @@ int ScrollBottom; int LastCursorX; int LastCursorY; BOOL isAnsiParsingRequired = FALSE; +BOOL isConsoleVTSeqAvailable = FALSE; /* 1 - We track the viewport (visible window) and restore it back because console renders badly when user scroll up/down */ int track_view_port = 0; char *pSavedScreen = NULL; @@ -152,6 +153,12 @@ ConEnterRawMode() return; } + dwAttributes |= ENABLE_VIRTUAL_TERMINAL_INPUT; + if (SetConsoleMode(GetConsoleInputHandle(), dwAttributes)) { + debug("ENABLE_VIRTUAL_TERMINAL_INPUT is supported. Reading the VTSequence from console"); + isConsoleVTSeqAvailable = TRUE; + } + if (!GetConsoleMode(GetConsoleOutputHandle(), &stdout_dwSavedAttributes)) { dwRet = GetLastError(); error("GetConsoleMode on GetConsoleOutputHandle() failed with %d", dwRet); @@ -190,7 +197,7 @@ ConEnterRawMode() SavedViewRect = csbi.srWindow; debug("console doesn't support the ansi parsing"); } else { - debug("console supports the ansi parsing"); + debug("ENABLE_VIRTUAL_TERMINAL_PROCESSING is supported. Console supports the ansi parsing"); console_out_cp_saved = GetConsoleOutputCP(); console_in_cp_saved = GetConsoleCP(); if (SetConsoleOutputCP(CP_UTF8)) diff --git a/contrib/win32/win32compat/console.h b/contrib/win32/win32compat/console.h index e2d6ede68..f3ec8db01 100644 --- a/contrib/win32/win32compat/console.h +++ b/contrib/win32/win32compat/console.h @@ -83,6 +83,10 @@ #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x4 #endif +#ifndef ENABLE_VIRTUAL_TERMINAL_INPUT +#define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 +#endif + #ifndef DISABLE_NEWLINE_AUTO_RETURN #define DISABLE_NEWLINE_AUTO_RETURN 0x8 #endif diff --git a/contrib/win32/win32compat/inc/string.h b/contrib/win32/win32compat/inc/string.h index 4765a8e39..96e6783dc 100644 --- a/contrib/win32/win32compat/inc/string.h +++ b/contrib/win32/win32compat/inc/string.h @@ -12,4 +12,5 @@ char *w32_strerror(int); static char errorBuf[ERROR_MSG_MAXLEN]; -char *strndup(const char*, size_t); \ No newline at end of file +char *strndup(const char*, size_t); +char * strrstr(const char *, const char *); \ No newline at end of file diff --git a/contrib/win32/win32compat/misc.c b/contrib/win32/win32compat/misc.c index e54d29880..2e8a8f52f 100644 --- a/contrib/win32/win32compat/misc.c +++ b/contrib/win32/win32compat/misc.c @@ -1994,3 +1994,14 @@ cleanup: return ret; } + +char * +strrstr(const char *inStr, const char *pattern) +{ + char *tmp = NULL, *last = NULL; + tmp = (char *) inStr; + while(tmp = strstr(tmp, pattern)) + last = tmp++; + + return last; +} \ No newline at end of file diff --git a/contrib/win32/win32compat/tncon.c b/contrib/win32/win32compat/tncon.c index f447fde25..d47731311 100644 --- a/contrib/win32/win32compat/tncon.c +++ b/contrib/win32/win32compat/tncon.c @@ -43,6 +43,7 @@ extern bool gbVTAppMode; extern BOOL isAnsiParsingRequired; +extern BOOL isConsoleVTSeqAvailable; char *glob_out = NULL; int glob_outlen = 0; int glob_space = 0; @@ -75,13 +76,11 @@ TelParams Parameters = { TelParams* pParams = &Parameters; void queue_terminal_window_change_event(); +void GetVTSeqFromKeyStroke(INPUT_RECORD inputRecord); -/* -* For our case, in NetWriteString2(), we do not use socket, but write the out going data to -* a global buffer setup by ReadConsoleForTermEmul(). -*/ +/* Write to a global buffer setup by ReadConsoleForTermEmul() */ int -NetWriteString2(SOCKET sock, char* source, size_t len, int options) +WriteToBuffer(char* source, size_t len) { while (len > 0) { if (glob_outlen >= glob_space) @@ -131,12 +130,94 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen) HANDLE hHandle[] = { hInput, NULL }; DWORD nHandle = 1; DWORD dwInput = 0; - DWORD dwControlKeyState = 0; - DWORD dwAltGrFlags = LEFT_CTRL_PRESSED | RIGHT_ALT_PRESSED; DWORD rc = 0; - unsigned char octets[20]; + unsigned char octets[20]; char aChar = 0; - INPUT_RECORD InputRecord; + INPUT_RECORD inputRecordArray[16]; + int inputRecordArraySize = sizeof(inputRecordArray) / sizeof(INPUT_RECORD); + static WCHAR utf16_surrogatepair[2] = {0,}; + int n = 0; + + glob_out = destin; + glob_space = destinlen; + glob_outlen = 0; + while (DataAvailable(hInput)) { + if (glob_outlen >= destinlen) + return glob_outlen; + ReadConsoleInputW(hInput, inputRecordArray, inputRecordArraySize, &dwInput); + + for (DWORD i=0; i < dwInput; i++) { + INPUT_RECORD inputRecord = inputRecordArray[i]; + + switch (inputRecord.EventType) { + case WINDOW_BUFFER_SIZE_EVENT: + queue_terminal_window_change_event(); + break; + + case FOCUS_EVENT: + /* FALLTHROUGH */ + case MENU_EVENT: + break; + + case KEY_EVENT: + if ((inputRecord.Event.KeyEvent.bKeyDown) || + (!inputRecord.Event.KeyEvent.bKeyDown && inputRecord.Event.KeyEvent.wVirtualKeyCode == VK_MENU)) { + if (IS_HIGH_SURROGATE(inputRecord.Event.KeyEvent.uChar.UnicodeChar)) { + utf16_surrogatepair[0] = inputRecord.Event.KeyEvent.uChar.UnicodeChar; + break; // break to read low surrogate. + } + else if (IS_LOW_SURROGATE(inputRecord.Event.KeyEvent.uChar.UnicodeChar)) { + utf16_surrogatepair[1] = inputRecord.Event.KeyEvent.uChar.UnicodeChar; + } + + if (utf16_surrogatepair[0] && utf16_surrogatepair[1]) { + n = WideCharToMultiByte( + CP_UTF8, + 0, + utf16_surrogatepair, + 2, + (LPSTR)octets, + 20, + NULL, + NULL); + + WriteToBuffer((char *)octets, n); + utf16_surrogatepair[0] = utf16_surrogatepair[1] = L'\0'; + + break; + } + + if (isConsoleVTSeqAvailable) { + if (inputRecord.Event.KeyEvent.uChar.UnicodeChar != L'\0') { + n = WideCharToMultiByte( + CP_UTF8, + 0, + &(inputRecord.Event.KeyEvent.uChar.UnicodeChar), + 1, + (LPSTR)octets, + 20, + NULL, + NULL); + + WriteToBuffer((char *)octets, n); + } + } else { + GetVTSeqFromKeyStroke(inputRecord); + } + } + break; + } + } + break; + } + + return glob_outlen; +} + +void +GetVTSeqFromKeyStroke(INPUT_RECORD inputRecord) +{ + unsigned char octets[20]; BOOL bCapsOn = FALSE; BOOL bShift = FALSE; int modKey = 0; @@ -148,642 +229,619 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen) char *SHIFT_CTRL_FN_KEY = NULL; char *ALT_CTRL_FN_KEY = NULL; char *SHIFT_ALT_CTRL_FN_KEY = NULL; - - glob_out = destin; - glob_space = destinlen; - glob_outlen = 0; - while (DataAvailable(hInput)) { - if (glob_outlen >= destinlen) - return glob_outlen; - ReadConsoleInputW(hInput, &InputRecord, 1, &dwInput); - switch (InputRecord.EventType) { - case WINDOW_BUFFER_SIZE_EVENT: - queue_terminal_window_change_event(); - break; - - case FOCUS_EVENT: - /* FALLTHROUGH */ - case MENU_EVENT: - break; - - case KEY_EVENT: - bCapsOn = (InputRecord.Event.KeyEvent.dwControlKeyState & CAPSLOCK_ON); - bShift = (InputRecord.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED); - dwControlKeyState = InputRecord.Event.KeyEvent.dwControlKeyState & - ~(CAPSLOCK_ON | ENHANCED_KEY | NUMLOCK_ON | SCROLLLOCK_ON); - - /* ignore the AltGr flags*/ - if ((dwControlKeyState & dwAltGrFlags) == dwAltGrFlags) - dwControlKeyState = dwControlKeyState & ~dwAltGrFlags; - - modKey = GetModifierKey(dwControlKeyState); - if (InputRecord.Event.KeyEvent.bKeyDown) { - int n = WideCharToMultiByte( - CP_UTF8, - 0, - &(InputRecord.Event.KeyEvent.uChar.UnicodeChar), - 1, - (LPSTR)octets, - 20, - NULL, - NULL); - - if (pParams->fLocalEcho) - ConWriteString((char *)octets, n); - - switch (InputRecord.Event.KeyEvent.uChar.UnicodeChar) { - case 0xd: - if (pParams->nReceiveCRLF == ENUM_LF) - NetWriteString2(pParams->Socket, "\r", 1, 0); - else - NetWriteString2(pParams->Socket, "\r\n", 2, 0); - break; - - case VK_ESCAPE: - NetWriteString2(pParams->Socket, (char *)ESCAPE_KEY, 1, 0); - break; - - default: - switch (InputRecord.Event.KeyEvent.wVirtualKeyCode) { - case VK_UP: - if(!modKey) - NetWriteString2(pParams->Socket, (char *)(gbVTAppMode ? APP_UP_ARROW : UP_ARROW), 3, 0); - else { - /* ^[[1;mA */ - char *p = "\033[1;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = 'A'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_DOWN: - if(!modKey) - NetWriteString2(pParams->Socket, (char *)(gbVTAppMode ? APP_DOWN_ARROW : DOWN_ARROW), 3, 0); - else { - /* ^[[1;mB */ - char *p = "\033[1;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = 'B'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_RIGHT: - if(!modKey) - NetWriteString2(pParams->Socket, (char *)(gbVTAppMode ? APP_RIGHT_ARROW : RIGHT_ARROW), 3, 0); - else { - /* ^[[1;mC */ - char *p = "\033[1;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = 'C'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_LEFT: - if(!modKey) - NetWriteString2(pParams->Socket, (char *)(gbVTAppMode ? APP_LEFT_ARROW : LEFT_ARROW), 3, 0); - else { - /* ^[[1;mD */ - char *p = "\033[1;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = 'D'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_END: - if(!modKey) - NetWriteString2(pParams->Socket, (char *)SELECT_KEY, 4, 0); - else { - /* ^[[1;mF */ - char *p = "\033[1;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = 'F'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_HOME: - if(!modKey) - NetWriteString2(pParams->Socket, (char *)FIND_KEY, 4, 0); - else { - /* ^[[1;mH */ - char *p = "\033[1;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = 'H'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_INSERT: - if(!modKey) - NetWriteString2(pParams->Socket, (char *)INSERT_KEY, 4, 0); - else { - /* ^[[2;m~ */ - char *p = "\033[2;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = '~'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_DELETE: - if(!modKey) - NetWriteString2(pParams->Socket, (char *)REMOVE_KEY, 4, 0); - else { - /* ^[[3;m~ */ - char *p = "\033[3;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = '~'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_PRIOR: /* page up */ - if (!modKey) - NetWriteString2(pParams->Socket, (char *)PREV_KEY, 4, 0); - else { - /* ^[[5;m~ */ - char *p = "\033[5;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = '~'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_NEXT: /* page down */ - if(!modKey) - NetWriteString2(pParams->Socket, (char *)NEXT_KEY, 4, 0); - else { - /* ^[[6;m~ */ - char *p = "\033[6;"; - strcpy_s(tmp_buf, sizeof(tmp_buf), p); - size_t index = strlen(p); - tmp_buf[index++] = modKey + '0'; - tmp_buf[index] = '~'; - - NetWriteString2(pParams->Socket, tmp_buf, index+1, 0); - } - break; - case VK_BACK: - NetWriteString2(pParams->Socket, (char *)BACKSPACE_KEY, 1, 0); - break; - case VK_TAB: - if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_TAB_KEY, 3, 0); - else - NetWriteString2(pParams->Socket, (char *)octets, n, 0); - break; - case VK_ESCAPE: - NetWriteString2(pParams->Socket, (char *)ESCAPE_KEY, 1, 0); - break; - case VK_SHIFT: - case VK_CONTROL: - case VK_CAPITAL: - break; /* NOP on these */ - case VK_F1: - /* If isAnsiParsingRequired is false then we use XTERM VT sequence */ - FN_KEY = isAnsiParsingRequired ? PF1_KEY : XTERM_PF1_KEY; - SHIFT_FN_KEY = isAnsiParsingRequired ? SHIFT_PF1_KEY : XTERM_SHIFT_PF1_KEY; - ALT_FN_KEY = isAnsiParsingRequired ? ALT_PF1_KEY : XTERM_ALT_PF1_KEY; - CTRL_FN_KEY = isAnsiParsingRequired ? CTRL_PF1_KEY : XTERM_CTRL_PF1_KEY; - SHIFT_ALT_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_PF1_KEY : XTERM_SHIFT_ALT_PF1_KEY; - SHIFT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_CTRL_PF1_KEY : XTERM_SHIFT_CTRL_PF1_KEY; - ALT_CTRL_FN_KEY = isAnsiParsingRequired ? ALT_CTRL_PF1_KEY : XTERM_ALT_CTRL_PF1_KEY; - SHIFT_ALT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_CTRL_PF1_KEY : XTERM_SHIFT_ALT_CTRL_PF1_KEY; - - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)FN_KEY, strlen(FN_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_FN_KEY, strlen(ALT_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY), 0); - - break; - case VK_F2: - /* If isAnsiParsingRequired is false then we use XTERM VT sequence */ - FN_KEY = isAnsiParsingRequired ? PF2_KEY : XTERM_PF2_KEY; - SHIFT_FN_KEY = isAnsiParsingRequired ? SHIFT_PF2_KEY : XTERM_SHIFT_PF2_KEY; - ALT_FN_KEY = isAnsiParsingRequired ? ALT_PF2_KEY : XTERM_ALT_PF2_KEY; - CTRL_FN_KEY = isAnsiParsingRequired ? CTRL_PF2_KEY : XTERM_CTRL_PF2_KEY; - SHIFT_ALT_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_PF2_KEY : XTERM_SHIFT_ALT_PF2_KEY; - SHIFT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_CTRL_PF2_KEY : XTERM_SHIFT_CTRL_PF2_KEY; - ALT_CTRL_FN_KEY = isAnsiParsingRequired ? ALT_CTRL_PF2_KEY : XTERM_ALT_CTRL_PF2_KEY; - SHIFT_ALT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_CTRL_PF2_KEY : XTERM_SHIFT_ALT_CTRL_PF2_KEY; - - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)FN_KEY, strlen(FN_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_FN_KEY, strlen(ALT_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY), 0); - - break; - case VK_F3: - /* If isAnsiParsingRequired is false then we use XTERM VT sequence */ - FN_KEY = isAnsiParsingRequired ? PF3_KEY : XTERM_PF3_KEY; - SHIFT_FN_KEY = isAnsiParsingRequired ? SHIFT_PF3_KEY : XTERM_SHIFT_PF3_KEY; - ALT_FN_KEY = isAnsiParsingRequired ? ALT_PF3_KEY : XTERM_ALT_PF3_KEY; - CTRL_FN_KEY = isAnsiParsingRequired ? CTRL_PF3_KEY : XTERM_CTRL_PF3_KEY; - SHIFT_ALT_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_PF3_KEY : XTERM_SHIFT_ALT_PF3_KEY; - SHIFT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_CTRL_PF3_KEY : XTERM_SHIFT_CTRL_PF3_KEY; - ALT_CTRL_FN_KEY = isAnsiParsingRequired ? ALT_CTRL_PF3_KEY : XTERM_ALT_CTRL_PF3_KEY; - SHIFT_ALT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_CTRL_PF3_KEY : XTERM_SHIFT_ALT_CTRL_PF3_KEY; - - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)FN_KEY, strlen(FN_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_FN_KEY, strlen(ALT_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY), 0); - - break; - case VK_F4: - /* If isAnsiParsingRequired is false then we use XTERM VT sequence */ - FN_KEY = isAnsiParsingRequired ? PF4_KEY : XTERM_PF4_KEY; - SHIFT_FN_KEY = isAnsiParsingRequired ? SHIFT_PF4_KEY : XTERM_SHIFT_PF4_KEY; - ALT_FN_KEY = isAnsiParsingRequired ? ALT_PF4_KEY : XTERM_ALT_PF4_KEY; - CTRL_FN_KEY = isAnsiParsingRequired ? CTRL_PF4_KEY : XTERM_CTRL_PF4_KEY; - SHIFT_ALT_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_PF4_KEY : XTERM_SHIFT_ALT_PF4_KEY; - SHIFT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_CTRL_PF4_KEY : XTERM_SHIFT_CTRL_PF4_KEY; - ALT_CTRL_FN_KEY = isAnsiParsingRequired ? ALT_CTRL_PF4_KEY : XTERM_ALT_CTRL_PF4_KEY; - SHIFT_ALT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_CTRL_PF4_KEY : XTERM_SHIFT_ALT_CTRL_PF4_KEY; - - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)FN_KEY, strlen(FN_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_FN_KEY, strlen(ALT_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY), 0); - - break; - case VK_F5: - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)PF5_KEY, strlen(PF5_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_PF5_KEY, strlen(SHIFT_PF5_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_PF5_KEY, strlen(CTRL_PF5_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_PF5_KEY, strlen(ALT_PF5_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF5_KEY, strlen(SHIFT_ALT_CTRL_PF5_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF5_KEY, strlen(ALT_CTRL_PF5_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF5_KEY, strlen(SHIFT_ALT_PF5_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF5_KEY, strlen(SHIFT_CTRL_PF5_KEY), 0); - break; - case VK_F6: - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)PF6_KEY, strlen(PF6_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_PF6_KEY, strlen(SHIFT_PF6_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_PF6_KEY, strlen(CTRL_PF6_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_PF6_KEY, strlen(ALT_PF6_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF6_KEY, strlen(SHIFT_ALT_CTRL_PF6_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF6_KEY, strlen(ALT_CTRL_PF6_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF6_KEY, strlen(SHIFT_ALT_PF6_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF6_KEY, strlen(SHIFT_CTRL_PF6_KEY), 0); - break; - case VK_F7: - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)PF7_KEY, strlen(PF7_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_PF7_KEY, strlen(SHIFT_PF7_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_PF7_KEY, strlen(CTRL_PF7_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_PF7_KEY, strlen(ALT_PF7_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF7_KEY, strlen(SHIFT_ALT_CTRL_PF7_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF7_KEY, strlen(ALT_CTRL_PF7_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF7_KEY, strlen(SHIFT_ALT_PF7_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF7_KEY, strlen(SHIFT_CTRL_PF7_KEY), 0); - break; - case VK_F8: - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)PF8_KEY, strlen(PF8_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_PF8_KEY, strlen(SHIFT_PF8_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_PF8_KEY, strlen(CTRL_PF8_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_PF8_KEY, strlen(ALT_PF8_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF8_KEY, strlen(SHIFT_ALT_CTRL_PF8_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF8_KEY, strlen(ALT_CTRL_PF8_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF8_KEY, strlen(SHIFT_ALT_PF8_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF8_KEY, strlen(SHIFT_CTRL_PF8_KEY), 0); - break; - case VK_F9: - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)PF9_KEY, strlen(PF9_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_PF9_KEY, strlen(SHIFT_PF9_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_PF9_KEY, strlen(CTRL_PF9_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_PF9_KEY, strlen(ALT_PF9_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF9_KEY, strlen(SHIFT_ALT_CTRL_PF9_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF9_KEY, strlen(ALT_CTRL_PF9_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF9_KEY, strlen(SHIFT_ALT_PF9_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF9_KEY, strlen(SHIFT_CTRL_PF9_KEY), 0); - break; - case VK_F10: - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)PF10_KEY, strlen(PF10_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_PF10_KEY, strlen(SHIFT_PF10_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_PF10_KEY, strlen(CTRL_PF10_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_PF10_KEY, strlen(ALT_PF10_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF10_KEY, strlen(SHIFT_ALT_CTRL_PF10_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF10_KEY, strlen(ALT_CTRL_PF10_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF10_KEY, strlen(SHIFT_ALT_PF10_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF10_KEY, strlen(SHIFT_CTRL_PF10_KEY), 0); - break; - case VK_F11: - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)PF11_KEY, strlen(PF11_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_PF11_KEY, strlen(SHIFT_PF11_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_PF11_KEY, strlen(CTRL_PF11_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_PF11_KEY, strlen(ALT_PF11_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF11_KEY, strlen(SHIFT_ALT_CTRL_PF11_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF11_KEY, strlen(ALT_CTRL_PF11_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF11_KEY, strlen(SHIFT_ALT_PF11_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF11_KEY, strlen(SHIFT_CTRL_PF11_KEY), 0); - break; - case VK_F12: - if (dwControlKeyState == 0) - NetWriteString2(pParams->Socket, (char *)PF12_KEY, strlen(PF12_KEY), 0); - - else if (dwControlKeyState == SHIFT_PRESSED) - NetWriteString2(pParams->Socket, (char *)SHIFT_PF12_KEY, strlen(SHIFT_PF12_KEY), 0); - - else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) - NetWriteString2(pParams->Socket, (char *)CTRL_PF12_KEY, strlen(CTRL_PF12_KEY), 0); - - else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) - NetWriteString2(pParams->Socket, (char *)ALT_PF12_KEY, strlen(ALT_PF12_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF12_KEY, strlen(SHIFT_ALT_CTRL_PF12_KEY), 0); - - else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && - ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF12_KEY, strlen(ALT_CTRL_PF12_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || - (dwControlKeyState & LEFT_ALT_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF12_KEY, strlen(SHIFT_ALT_PF12_KEY), 0); - - else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || - (dwControlKeyState & RIGHT_CTRL_PRESSED))) - NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF12_KEY, strlen(SHIFT_CTRL_PF12_KEY), 0); - break; - default: - if (strcmp((char *) octets, "")) { - if ((dwControlKeyState & LEFT_ALT_PRESSED) || (dwControlKeyState & RIGHT_ALT_PRESSED)) { - memset(tmp_buf, 0, sizeof(tmp_buf)); - tmp_buf[0] = '\x1b'; - memcpy(tmp_buf + 1, (char *)octets, n); - NetWriteString2(pParams->Socket, tmp_buf, n + 1, 0); - } - else - NetWriteString2(pParams->Socket, (char *)octets, n, 0); - } - break; - } - } + DWORD dwControlKeyState = 0; + DWORD dwAltGrFlags = LEFT_CTRL_PRESSED | RIGHT_ALT_PRESSED; + + int n = WideCharToMultiByte( + CP_UTF8, + 0, + &(inputRecord.Event.KeyEvent.uChar.UnicodeChar), + 1, + (LPSTR)octets, + 20, + NULL, + NULL); + + bCapsOn = (inputRecord.Event.KeyEvent.dwControlKeyState & CAPSLOCK_ON); + bShift = (inputRecord.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED); + dwControlKeyState = inputRecord.Event.KeyEvent.dwControlKeyState & + ~(CAPSLOCK_ON | ENHANCED_KEY | NUMLOCK_ON | SCROLLLOCK_ON); + + /* ignore the AltGr flags*/ + if ((dwControlKeyState & dwAltGrFlags) == dwAltGrFlags) + dwControlKeyState = dwControlKeyState & ~dwAltGrFlags; + + modKey = GetModifierKey(dwControlKeyState); + + if (pParams->fLocalEcho) + ConWriteString((char *)octets, n); + + switch (inputRecord.Event.KeyEvent.uChar.UnicodeChar) { + case 0xd: + if (pParams->nReceiveCRLF == ENUM_LF) + WriteToBuffer("\r", 1); + else + WriteToBuffer("\r\n", 2); + break; + + case VK_ESCAPE: + WriteToBuffer((char *)ESCAPE_KEY, 1); + break; + + default: + switch (inputRecord.Event.KeyEvent.wVirtualKeyCode) { + case VK_UP: + if (!modKey) + WriteToBuffer((char *)(gbVTAppMode ? APP_UP_ARROW : UP_ARROW), 3); + else { + /* ^[[1;mA */ + char *p = "\033[1;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = 'A'; + + WriteToBuffer(tmp_buf, index + 1); } break; - } - break; - } + case VK_DOWN: + if (!modKey) + WriteToBuffer((char *)(gbVTAppMode ? APP_DOWN_ARROW : DOWN_ARROW), 3); + else { + /* ^[[1;mB */ + char *p = "\033[1;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = 'B'; - return glob_outlen; -} + WriteToBuffer(tmp_buf, index + 1); + } + break; + case VK_RIGHT: + if (!modKey) + WriteToBuffer((char *)(gbVTAppMode ? APP_RIGHT_ARROW : RIGHT_ARROW), 3); + else { + /* ^[[1;mC */ + char *p = "\033[1;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = 'C'; + + WriteToBuffer(tmp_buf, index + 1); + } + break; + case VK_LEFT: + if (!modKey) + WriteToBuffer((char *)(gbVTAppMode ? APP_LEFT_ARROW : LEFT_ARROW), 3); + else { + /* ^[[1;mD */ + char *p = "\033[1;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = 'D'; + + WriteToBuffer(tmp_buf, index + 1); + } + break; + case VK_END: + if (!modKey) + WriteToBuffer((char *)SELECT_KEY, 4); + else { + /* ^[[1;mF */ + char *p = "\033[1;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = 'F'; + + WriteToBuffer(tmp_buf, index + 1); + } + break; + case VK_HOME: + if (!modKey) + WriteToBuffer((char *)FIND_KEY, 4); + else { + /* ^[[1;mH */ + char *p = "\033[1;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = 'H'; + + WriteToBuffer(tmp_buf, index + 1); + } + break; + case VK_INSERT: + if (!modKey) + WriteToBuffer((char *)INSERT_KEY, 4); + else { + /* ^[[2;m~ */ + char *p = "\033[2;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = '~'; + + WriteToBuffer(tmp_buf, index + 1); + } + break; + case VK_DELETE: + if (!modKey) + WriteToBuffer((char *)REMOVE_KEY, 4); + else { + /* ^[[3;m~ */ + char *p = "\033[3;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = '~'; + + WriteToBuffer(tmp_buf, index + 1); + } + break; + case VK_PRIOR: /* page up */ + if (!modKey) + WriteToBuffer((char *)PREV_KEY, 4); + else { + /* ^[[5;m~ */ + char *p = "\033[5;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = '~'; + + WriteToBuffer(tmp_buf, index + 1); + } + break; + case VK_NEXT: /* page down */ + if (!modKey) + WriteToBuffer((char *)NEXT_KEY, 4); + else { + /* ^[[6;m~ */ + char *p = "\033[6;"; + strcpy_s(tmp_buf, sizeof(tmp_buf), p); + size_t index = strlen(p); + tmp_buf[index++] = modKey + '0'; + tmp_buf[index] = '~'; + + WriteToBuffer(tmp_buf, index + 1); + } + break; + case VK_BACK: + WriteToBuffer((char *)BACKSPACE_KEY, 1); + break; + case VK_TAB: + if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_TAB_KEY, 3); + else + WriteToBuffer((char *)octets, n); + break; + case VK_ESCAPE: + WriteToBuffer((char *)ESCAPE_KEY, 1); + break; + case VK_SHIFT: + case VK_CONTROL: + case VK_CAPITAL: + break; /* NOP on these */ + case VK_F1: + /* If isAnsiParsingRequired is false then we use XTERM VT sequence */ + FN_KEY = isAnsiParsingRequired ? PF1_KEY : XTERM_PF1_KEY; + SHIFT_FN_KEY = isAnsiParsingRequired ? SHIFT_PF1_KEY : XTERM_SHIFT_PF1_KEY; + ALT_FN_KEY = isAnsiParsingRequired ? ALT_PF1_KEY : XTERM_ALT_PF1_KEY; + CTRL_FN_KEY = isAnsiParsingRequired ? CTRL_PF1_KEY : XTERM_CTRL_PF1_KEY; + SHIFT_ALT_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_PF1_KEY : XTERM_SHIFT_ALT_PF1_KEY; + SHIFT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_CTRL_PF1_KEY : XTERM_SHIFT_CTRL_PF1_KEY; + ALT_CTRL_FN_KEY = isAnsiParsingRequired ? ALT_CTRL_PF1_KEY : XTERM_ALT_CTRL_PF1_KEY; + SHIFT_ALT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_CTRL_PF1_KEY : XTERM_SHIFT_ALT_CTRL_PF1_KEY; + + if (dwControlKeyState == 0) + WriteToBuffer((char *)FN_KEY, strlen(FN_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_FN_KEY, strlen(ALT_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY)); + + break; + case VK_F2: + /* If isAnsiParsingRequired is false then we use XTERM VT sequence */ + FN_KEY = isAnsiParsingRequired ? PF2_KEY : XTERM_PF2_KEY; + SHIFT_FN_KEY = isAnsiParsingRequired ? SHIFT_PF2_KEY : XTERM_SHIFT_PF2_KEY; + ALT_FN_KEY = isAnsiParsingRequired ? ALT_PF2_KEY : XTERM_ALT_PF2_KEY; + CTRL_FN_KEY = isAnsiParsingRequired ? CTRL_PF2_KEY : XTERM_CTRL_PF2_KEY; + SHIFT_ALT_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_PF2_KEY : XTERM_SHIFT_ALT_PF2_KEY; + SHIFT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_CTRL_PF2_KEY : XTERM_SHIFT_CTRL_PF2_KEY; + ALT_CTRL_FN_KEY = isAnsiParsingRequired ? ALT_CTRL_PF2_KEY : XTERM_ALT_CTRL_PF2_KEY; + SHIFT_ALT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_CTRL_PF2_KEY : XTERM_SHIFT_ALT_CTRL_PF2_KEY; + + if (dwControlKeyState == 0) + WriteToBuffer((char *)FN_KEY, strlen(FN_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_FN_KEY, strlen(ALT_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY)); + + break; + case VK_F3: + /* If isAnsiParsingRequired is false then we use XTERM VT sequence */ + FN_KEY = isAnsiParsingRequired ? PF3_KEY : XTERM_PF3_KEY; + SHIFT_FN_KEY = isAnsiParsingRequired ? SHIFT_PF3_KEY : XTERM_SHIFT_PF3_KEY; + ALT_FN_KEY = isAnsiParsingRequired ? ALT_PF3_KEY : XTERM_ALT_PF3_KEY; + CTRL_FN_KEY = isAnsiParsingRequired ? CTRL_PF3_KEY : XTERM_CTRL_PF3_KEY; + SHIFT_ALT_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_PF3_KEY : XTERM_SHIFT_ALT_PF3_KEY; + SHIFT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_CTRL_PF3_KEY : XTERM_SHIFT_CTRL_PF3_KEY; + ALT_CTRL_FN_KEY = isAnsiParsingRequired ? ALT_CTRL_PF3_KEY : XTERM_ALT_CTRL_PF3_KEY; + SHIFT_ALT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_CTRL_PF3_KEY : XTERM_SHIFT_ALT_CTRL_PF3_KEY; + + if (dwControlKeyState == 0) + WriteToBuffer((char *)FN_KEY, strlen(FN_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_FN_KEY, strlen(ALT_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY)); + + break; + case VK_F4: + /* If isAnsiParsingRequired is false then we use XTERM VT sequence */ + FN_KEY = isAnsiParsingRequired ? PF4_KEY : XTERM_PF4_KEY; + SHIFT_FN_KEY = isAnsiParsingRequired ? SHIFT_PF4_KEY : XTERM_SHIFT_PF4_KEY; + ALT_FN_KEY = isAnsiParsingRequired ? ALT_PF4_KEY : XTERM_ALT_PF4_KEY; + CTRL_FN_KEY = isAnsiParsingRequired ? CTRL_PF4_KEY : XTERM_CTRL_PF4_KEY; + SHIFT_ALT_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_PF4_KEY : XTERM_SHIFT_ALT_PF4_KEY; + SHIFT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_CTRL_PF4_KEY : XTERM_SHIFT_CTRL_PF4_KEY; + ALT_CTRL_FN_KEY = isAnsiParsingRequired ? ALT_CTRL_PF4_KEY : XTERM_ALT_CTRL_PF4_KEY; + SHIFT_ALT_CTRL_FN_KEY = isAnsiParsingRequired ? SHIFT_ALT_CTRL_PF4_KEY : XTERM_SHIFT_ALT_CTRL_PF4_KEY; + + if (dwControlKeyState == 0) + WriteToBuffer((char *)FN_KEY, strlen(FN_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_FN_KEY, strlen(ALT_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY)); + + break; + case VK_F5: + if (dwControlKeyState == 0) + WriteToBuffer((char *)PF5_KEY, strlen(PF5_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_PF5_KEY, strlen(SHIFT_PF5_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_PF5_KEY, strlen(CTRL_PF5_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_PF5_KEY, strlen(ALT_PF5_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_PF5_KEY, strlen(SHIFT_ALT_CTRL_PF5_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_PF5_KEY, strlen(ALT_CTRL_PF5_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_PF5_KEY, strlen(SHIFT_ALT_PF5_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_PF5_KEY, strlen(SHIFT_CTRL_PF5_KEY)); + break; + case VK_F6: + if (dwControlKeyState == 0) + WriteToBuffer((char *)PF6_KEY, strlen(PF6_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_PF6_KEY, strlen(SHIFT_PF6_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_PF6_KEY, strlen(CTRL_PF6_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_PF6_KEY, strlen(ALT_PF6_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_PF6_KEY, strlen(SHIFT_ALT_CTRL_PF6_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_PF6_KEY, strlen(ALT_CTRL_PF6_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_PF6_KEY, strlen(SHIFT_ALT_PF6_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_PF6_KEY, strlen(SHIFT_CTRL_PF6_KEY)); + break; + case VK_F7: + if (dwControlKeyState == 0) + WriteToBuffer((char *)PF7_KEY, strlen(PF7_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_PF7_KEY, strlen(SHIFT_PF7_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_PF7_KEY, strlen(CTRL_PF7_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_PF7_KEY, strlen(ALT_PF7_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_PF7_KEY, strlen(SHIFT_ALT_CTRL_PF7_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_PF7_KEY, strlen(ALT_CTRL_PF7_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_PF7_KEY, strlen(SHIFT_ALT_PF7_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_PF7_KEY, strlen(SHIFT_CTRL_PF7_KEY)); + break; + case VK_F8: + if (dwControlKeyState == 0) + WriteToBuffer((char *)PF8_KEY, strlen(PF8_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_PF8_KEY, strlen(SHIFT_PF8_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_PF8_KEY, strlen(CTRL_PF8_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_PF8_KEY, strlen(ALT_PF8_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_PF8_KEY, strlen(SHIFT_ALT_CTRL_PF8_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_PF8_KEY, strlen(ALT_CTRL_PF8_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_PF8_KEY, strlen(SHIFT_ALT_PF8_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_PF8_KEY, strlen(SHIFT_CTRL_PF8_KEY)); + break; + case VK_F9: + if (dwControlKeyState == 0) + WriteToBuffer((char *)PF9_KEY, strlen(PF9_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_PF9_KEY, strlen(SHIFT_PF9_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_PF9_KEY, strlen(CTRL_PF9_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_PF9_KEY, strlen(ALT_PF9_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_PF9_KEY, strlen(SHIFT_ALT_CTRL_PF9_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_PF9_KEY, strlen(ALT_CTRL_PF9_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_PF9_KEY, strlen(SHIFT_ALT_PF9_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_PF9_KEY, strlen(SHIFT_CTRL_PF9_KEY)); + break; + case VK_F10: + if (dwControlKeyState == 0) + WriteToBuffer((char *)PF10_KEY, strlen(PF10_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_PF10_KEY, strlen(SHIFT_PF10_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_PF10_KEY, strlen(CTRL_PF10_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_PF10_KEY, strlen(ALT_PF10_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_PF10_KEY, strlen(SHIFT_ALT_CTRL_PF10_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_PF10_KEY, strlen(ALT_CTRL_PF10_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_PF10_KEY, strlen(SHIFT_ALT_PF10_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_PF10_KEY, strlen(SHIFT_CTRL_PF10_KEY)); + break; + case VK_F11: + if (dwControlKeyState == 0) + WriteToBuffer((char *)PF11_KEY, strlen(PF11_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_PF11_KEY, strlen(SHIFT_PF11_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_PF11_KEY, strlen(CTRL_PF11_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_PF11_KEY, strlen(ALT_PF11_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_PF11_KEY, strlen(SHIFT_ALT_CTRL_PF11_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_PF11_KEY, strlen(ALT_CTRL_PF11_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_PF11_KEY, strlen(SHIFT_ALT_PF11_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_PF11_KEY, strlen(SHIFT_CTRL_PF11_KEY)); + break; + case VK_F12: + if (dwControlKeyState == 0) + WriteToBuffer((char *)PF12_KEY, strlen(PF12_KEY)); + + else if (dwControlKeyState == SHIFT_PRESSED) + WriteToBuffer((char *)SHIFT_PF12_KEY, strlen(SHIFT_PF12_KEY)); + + else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED) + WriteToBuffer((char *)CTRL_PF12_KEY, strlen(CTRL_PF12_KEY)); + + else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED) + WriteToBuffer((char *)ALT_PF12_KEY, strlen(ALT_PF12_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED)) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_CTRL_PF12_KEY, strlen(SHIFT_ALT_CTRL_PF12_KEY)); + + else if ((dwControlKeyState & RIGHT_ALT_PRESSED) || (dwControlKeyState & LEFT_ALT_PRESSED) && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)ALT_CTRL_PF12_KEY, strlen(ALT_CTRL_PF12_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED))) + WriteToBuffer((char *)SHIFT_ALT_PF12_KEY, strlen(SHIFT_ALT_PF12_KEY)); + + else if ((dwControlKeyState & SHIFT_PRESSED) && ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + WriteToBuffer((char *)SHIFT_CTRL_PF12_KEY, strlen(SHIFT_CTRL_PF12_KEY)); + break; + default: + if (inputRecord.Event.KeyEvent.uChar.UnicodeChar != L'\0') { + if ((dwControlKeyState & LEFT_ALT_PRESSED) || (dwControlKeyState & RIGHT_ALT_PRESSED)) { + memset(tmp_buf, 0, sizeof(tmp_buf)); + tmp_buf[0] = '\x1b'; + memcpy(tmp_buf + 1, (char *)octets, n); + WriteToBuffer(tmp_buf, n + 1); + } + else + WriteToBuffer((char *)octets, n); + break; + } + } + } +} \ No newline at end of file diff --git a/contrib/win32/win32compat/tnnet.c b/contrib/win32/win32compat/tnnet.c index d92e65e9a..eee77c7e1 100644 --- a/contrib/win32/win32compat/tnnet.c +++ b/contrib/win32/win32compat/tnnet.c @@ -36,12 +36,14 @@ #include #include "ansiprsr.h" #include "inc\utf.h" +#include "inc\string.h" #include "console.h" #include "misc_internal.h" #define dwBuffer 4096 extern BOOL isAnsiParsingRequired; +extern BOOL isConsoleVTSeqAvailable; extern int track_view_port; extern bool gbVTAppMode; BOOL isFirstPacket = TRUE; @@ -63,6 +65,8 @@ processBuffer(HANDLE handle, char *buf, DWORD len, unsigned char **respbuf, size const char *normalModeSeq = "\x1b[?1l"; const DWORD normalModeSeqLen = (DWORD)strlen(normalModeSeq); const char *clsSeq = "\x1b[2J"; + const char *appModePtr = NULL; + const char *normalModePtr = NULL; if (len == 0) return; @@ -79,10 +83,18 @@ processBuffer(HANDLE handle, char *buf, DWORD len, unsigned char **respbuf, size ConMoveCursorTopOfVisibleWindow(); } - if(len >= applicationModeSeqLen && strstr(buf, applicationModeSeq)) - gbVTAppMode = true; - else if(len >= normalModeSeqLen && strstr(buf, normalModeSeq)) - gbVTAppMode = false; + if (!isConsoleVTSeqAvailable) { + if (len >= applicationModeSeqLen && (appModePtr = strrstr(buf, applicationModeSeq))) + gbVTAppMode = true; + + if (len >= normalModeSeqLen && (normalModePtr = strrstr(buf, normalModeSeq))) + { + if (appModePtr && (appModePtr > normalModePtr)) + gbVTAppMode = true; + else + gbVTAppMode = false; + } + } /* WriteFile() gets messy when user does scroll up/down so we need to restore the visible window. * It's a conhost bug but we need to live with it as they are not going to back port the fix.