mirror of
https://github.com/PowerShell/openssh-portable.git
synced 2025-07-28 08:14:24 +02:00
Read VTSequence from console (#412)
Use console win32 API to read the VTSequence for keystrokes on client-side.
This commit is contained in:
parent
9e42eb0c76
commit
34608f3d29
@ -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))
|
||||
|
@ -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
|
||||
|
@ -13,3 +13,4 @@ char *w32_strerror(int);
|
||||
static char errorBuf[ERROR_MSG_MAXLEN];
|
||||
|
||||
char *strndup(const char*, size_t);
|
||||
char * strrstr(const char *, const char *);
|
@ -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;
|
||||
}
|
@ -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];
|
||||
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,28 +229,22 @@ 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;
|
||||
DWORD dwControlKeyState = 0;
|
||||
DWORD dwAltGrFlags = LEFT_CTRL_PRESSED | RIGHT_ALT_PRESSED;
|
||||
|
||||
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;
|
||||
int n = WideCharToMultiByte(
|
||||
CP_UTF8,
|
||||
0,
|
||||
&(inputRecord.Event.KeyEvent.uChar.UnicodeChar),
|
||||
1,
|
||||
(LPSTR)octets,
|
||||
20,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
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 &
|
||||
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*/
|
||||
@ -177,37 +252,27 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
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) {
|
||||
switch (inputRecord.Event.KeyEvent.uChar.UnicodeChar) {
|
||||
case 0xd:
|
||||
if (pParams->nReceiveCRLF == ENUM_LF)
|
||||
NetWriteString2(pParams->Socket, "\r", 1, 0);
|
||||
WriteToBuffer("\r", 1);
|
||||
else
|
||||
NetWriteString2(pParams->Socket, "\r\n", 2, 0);
|
||||
WriteToBuffer("\r\n", 2);
|
||||
break;
|
||||
|
||||
case VK_ESCAPE:
|
||||
NetWriteString2(pParams->Socket, (char *)ESCAPE_KEY, 1, 0);
|
||||
WriteToBuffer((char *)ESCAPE_KEY, 1);
|
||||
break;
|
||||
|
||||
default:
|
||||
switch (InputRecord.Event.KeyEvent.wVirtualKeyCode) {
|
||||
switch (inputRecord.Event.KeyEvent.wVirtualKeyCode) {
|
||||
case VK_UP:
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)(gbVTAppMode ? APP_UP_ARROW : UP_ARROW), 3, 0);
|
||||
WriteToBuffer((char *)(gbVTAppMode ? APP_UP_ARROW : UP_ARROW), 3);
|
||||
else {
|
||||
/* ^[[1;mA */
|
||||
char *p = "\033[1;";
|
||||
@ -216,12 +281,12 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = 'A';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_DOWN:
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)(gbVTAppMode ? APP_DOWN_ARROW : DOWN_ARROW), 3, 0);
|
||||
WriteToBuffer((char *)(gbVTAppMode ? APP_DOWN_ARROW : DOWN_ARROW), 3);
|
||||
else {
|
||||
/* ^[[1;mB */
|
||||
char *p = "\033[1;";
|
||||
@ -230,12 +295,12 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = 'B';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_RIGHT:
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)(gbVTAppMode ? APP_RIGHT_ARROW : RIGHT_ARROW), 3, 0);
|
||||
WriteToBuffer((char *)(gbVTAppMode ? APP_RIGHT_ARROW : RIGHT_ARROW), 3);
|
||||
else {
|
||||
/* ^[[1;mC */
|
||||
char *p = "\033[1;";
|
||||
@ -244,12 +309,12 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = 'C';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_LEFT:
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)(gbVTAppMode ? APP_LEFT_ARROW : LEFT_ARROW), 3, 0);
|
||||
WriteToBuffer((char *)(gbVTAppMode ? APP_LEFT_ARROW : LEFT_ARROW), 3);
|
||||
else {
|
||||
/* ^[[1;mD */
|
||||
char *p = "\033[1;";
|
||||
@ -258,12 +323,12 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = 'D';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_END:
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)SELECT_KEY, 4, 0);
|
||||
WriteToBuffer((char *)SELECT_KEY, 4);
|
||||
else {
|
||||
/* ^[[1;mF */
|
||||
char *p = "\033[1;";
|
||||
@ -272,12 +337,12 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = 'F';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_HOME:
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)FIND_KEY, 4, 0);
|
||||
WriteToBuffer((char *)FIND_KEY, 4);
|
||||
else {
|
||||
/* ^[[1;mH */
|
||||
char *p = "\033[1;";
|
||||
@ -286,12 +351,12 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = 'H';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_INSERT:
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)INSERT_KEY, 4, 0);
|
||||
WriteToBuffer((char *)INSERT_KEY, 4);
|
||||
else {
|
||||
/* ^[[2;m~ */
|
||||
char *p = "\033[2;";
|
||||
@ -300,12 +365,12 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = '~';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_DELETE:
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)REMOVE_KEY, 4, 0);
|
||||
WriteToBuffer((char *)REMOVE_KEY, 4);
|
||||
else {
|
||||
/* ^[[3;m~ */
|
||||
char *p = "\033[3;";
|
||||
@ -314,12 +379,12 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = '~';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_PRIOR: /* page up */
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)PREV_KEY, 4, 0);
|
||||
WriteToBuffer((char *)PREV_KEY, 4);
|
||||
else {
|
||||
/* ^[[5;m~ */
|
||||
char *p = "\033[5;";
|
||||
@ -328,12 +393,12 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = '~';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_NEXT: /* page down */
|
||||
if (!modKey)
|
||||
NetWriteString2(pParams->Socket, (char *)NEXT_KEY, 4, 0);
|
||||
WriteToBuffer((char *)NEXT_KEY, 4);
|
||||
else {
|
||||
/* ^[[6;m~ */
|
||||
char *p = "\033[6;";
|
||||
@ -342,20 +407,20 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
tmp_buf[index++] = modKey + '0';
|
||||
tmp_buf[index] = '~';
|
||||
|
||||
NetWriteString2(pParams->Socket, tmp_buf, index+1, 0);
|
||||
WriteToBuffer(tmp_buf, index + 1);
|
||||
}
|
||||
break;
|
||||
case VK_BACK:
|
||||
NetWriteString2(pParams->Socket, (char *)BACKSPACE_KEY, 1, 0);
|
||||
WriteToBuffer((char *)BACKSPACE_KEY, 1);
|
||||
break;
|
||||
case VK_TAB:
|
||||
if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_TAB_KEY, 3, 0);
|
||||
WriteToBuffer((char *)SHIFT_TAB_KEY, 3);
|
||||
else
|
||||
NetWriteString2(pParams->Socket, (char *)octets, n, 0);
|
||||
WriteToBuffer((char *)octets, n);
|
||||
break;
|
||||
case VK_ESCAPE:
|
||||
NetWriteString2(pParams->Socket, (char *)ESCAPE_KEY, 1, 0);
|
||||
WriteToBuffer((char *)ESCAPE_KEY, 1);
|
||||
break;
|
||||
case VK_SHIFT:
|
||||
case VK_CONTROL:
|
||||
@ -373,33 +438,33 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
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);
|
||||
WriteToBuffer((char *)FN_KEY, strlen(FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_FN_KEY, strlen(ALT_FN_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY));
|
||||
|
||||
break;
|
||||
case VK_F2:
|
||||
@ -414,33 +479,33 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
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);
|
||||
WriteToBuffer((char *)FN_KEY, strlen(FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_FN_KEY, strlen(ALT_FN_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY));
|
||||
|
||||
break;
|
||||
case VK_F3:
|
||||
@ -455,33 +520,33 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
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);
|
||||
WriteToBuffer((char *)FN_KEY, strlen(FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_FN_KEY, strlen(ALT_FN_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY));
|
||||
|
||||
break;
|
||||
case VK_F4:
|
||||
@ -496,294 +561,287 @@ ReadConsoleForTermEmul(HANDLE hInput, char *destin, int destinlen)
|
||||
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);
|
||||
WriteToBuffer((char *)FN_KEY, strlen(FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_FN_KEY, strlen(SHIFT_FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_FN_KEY, strlen(CTRL_FN_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_FN_KEY, strlen(ALT_FN_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_FN_KEY, strlen(SHIFT_ALT_CTRL_FN_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_FN_KEY, strlen(ALT_CTRL_FN_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_FN_KEY, strlen(SHIFT_ALT_FN_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_FN_KEY, strlen(SHIFT_CTRL_FN_KEY));
|
||||
|
||||
break;
|
||||
case VK_F5:
|
||||
if (dwControlKeyState == 0)
|
||||
NetWriteString2(pParams->Socket, (char *)PF5_KEY, strlen(PF5_KEY), 0);
|
||||
WriteToBuffer((char *)PF5_KEY, strlen(PF5_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_PF5_KEY, strlen(SHIFT_PF5_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_PF5_KEY, strlen(SHIFT_PF5_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_PF5_KEY, strlen(CTRL_PF5_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_PF5_KEY, strlen(CTRL_PF5_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_PF5_KEY, strlen(ALT_PF5_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF5_KEY, strlen(SHIFT_ALT_CTRL_PF5_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF5_KEY, strlen(ALT_CTRL_PF5_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_PF5_KEY, strlen(ALT_CTRL_PF5_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_PF5_KEY, strlen(SHIFT_ALT_PF5_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_PF5_KEY, strlen(SHIFT_CTRL_PF5_KEY));
|
||||
break;
|
||||
case VK_F6:
|
||||
if (dwControlKeyState == 0)
|
||||
NetWriteString2(pParams->Socket, (char *)PF6_KEY, strlen(PF6_KEY), 0);
|
||||
WriteToBuffer((char *)PF6_KEY, strlen(PF6_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_PF6_KEY, strlen(SHIFT_PF6_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_PF6_KEY, strlen(SHIFT_PF6_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_PF6_KEY, strlen(CTRL_PF6_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_PF6_KEY, strlen(CTRL_PF6_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_PF6_KEY, strlen(ALT_PF6_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF6_KEY, strlen(SHIFT_ALT_CTRL_PF6_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF6_KEY, strlen(ALT_CTRL_PF6_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_PF6_KEY, strlen(ALT_CTRL_PF6_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_PF6_KEY, strlen(SHIFT_ALT_PF6_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_PF6_KEY, strlen(SHIFT_CTRL_PF6_KEY));
|
||||
break;
|
||||
case VK_F7:
|
||||
if (dwControlKeyState == 0)
|
||||
NetWriteString2(pParams->Socket, (char *)PF7_KEY, strlen(PF7_KEY), 0);
|
||||
WriteToBuffer((char *)PF7_KEY, strlen(PF7_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_PF7_KEY, strlen(SHIFT_PF7_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_PF7_KEY, strlen(SHIFT_PF7_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_PF7_KEY, strlen(CTRL_PF7_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_PF7_KEY, strlen(CTRL_PF7_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_PF7_KEY, strlen(ALT_PF7_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF7_KEY, strlen(SHIFT_ALT_CTRL_PF7_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF7_KEY, strlen(ALT_CTRL_PF7_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_PF7_KEY, strlen(ALT_CTRL_PF7_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_PF7_KEY, strlen(SHIFT_ALT_PF7_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_PF7_KEY, strlen(SHIFT_CTRL_PF7_KEY));
|
||||
break;
|
||||
case VK_F8:
|
||||
if (dwControlKeyState == 0)
|
||||
NetWriteString2(pParams->Socket, (char *)PF8_KEY, strlen(PF8_KEY), 0);
|
||||
WriteToBuffer((char *)PF8_KEY, strlen(PF8_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_PF8_KEY, strlen(SHIFT_PF8_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_PF8_KEY, strlen(SHIFT_PF8_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_PF8_KEY, strlen(CTRL_PF8_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_PF8_KEY, strlen(CTRL_PF8_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_PF8_KEY, strlen(ALT_PF8_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF8_KEY, strlen(SHIFT_ALT_CTRL_PF8_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF8_KEY, strlen(ALT_CTRL_PF8_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_PF8_KEY, strlen(ALT_CTRL_PF8_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_PF8_KEY, strlen(SHIFT_ALT_PF8_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_PF8_KEY, strlen(SHIFT_CTRL_PF8_KEY));
|
||||
break;
|
||||
case VK_F9:
|
||||
if (dwControlKeyState == 0)
|
||||
NetWriteString2(pParams->Socket, (char *)PF9_KEY, strlen(PF9_KEY), 0);
|
||||
WriteToBuffer((char *)PF9_KEY, strlen(PF9_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_PF9_KEY, strlen(SHIFT_PF9_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_PF9_KEY, strlen(SHIFT_PF9_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_PF9_KEY, strlen(CTRL_PF9_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_PF9_KEY, strlen(CTRL_PF9_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_PF9_KEY, strlen(ALT_PF9_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF9_KEY, strlen(SHIFT_ALT_CTRL_PF9_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF9_KEY, strlen(ALT_CTRL_PF9_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_PF9_KEY, strlen(ALT_CTRL_PF9_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_PF9_KEY, strlen(SHIFT_ALT_PF9_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_PF9_KEY, strlen(SHIFT_CTRL_PF9_KEY));
|
||||
break;
|
||||
case VK_F10:
|
||||
if (dwControlKeyState == 0)
|
||||
NetWriteString2(pParams->Socket, (char *)PF10_KEY, strlen(PF10_KEY), 0);
|
||||
WriteToBuffer((char *)PF10_KEY, strlen(PF10_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_PF10_KEY, strlen(SHIFT_PF10_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_PF10_KEY, strlen(SHIFT_PF10_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_PF10_KEY, strlen(CTRL_PF10_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_PF10_KEY, strlen(CTRL_PF10_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_PF10_KEY, strlen(ALT_PF10_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF10_KEY, strlen(SHIFT_ALT_CTRL_PF10_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF10_KEY, strlen(ALT_CTRL_PF10_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_PF10_KEY, strlen(ALT_CTRL_PF10_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_PF10_KEY, strlen(SHIFT_ALT_PF10_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_PF10_KEY, strlen(SHIFT_CTRL_PF10_KEY));
|
||||
break;
|
||||
case VK_F11:
|
||||
if (dwControlKeyState == 0)
|
||||
NetWriteString2(pParams->Socket, (char *)PF11_KEY, strlen(PF11_KEY), 0);
|
||||
WriteToBuffer((char *)PF11_KEY, strlen(PF11_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_PF11_KEY, strlen(SHIFT_PF11_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_PF11_KEY, strlen(SHIFT_PF11_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_PF11_KEY, strlen(CTRL_PF11_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_PF11_KEY, strlen(CTRL_PF11_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_PF11_KEY, strlen(ALT_PF11_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF11_KEY, strlen(SHIFT_ALT_CTRL_PF11_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF11_KEY, strlen(ALT_CTRL_PF11_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_PF11_KEY, strlen(ALT_CTRL_PF11_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_PF11_KEY, strlen(SHIFT_ALT_PF11_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_PF11_KEY, strlen(SHIFT_CTRL_PF11_KEY));
|
||||
break;
|
||||
case VK_F12:
|
||||
if (dwControlKeyState == 0)
|
||||
NetWriteString2(pParams->Socket, (char *)PF12_KEY, strlen(PF12_KEY), 0);
|
||||
WriteToBuffer((char *)PF12_KEY, strlen(PF12_KEY));
|
||||
|
||||
else if (dwControlKeyState == SHIFT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_PF12_KEY, strlen(SHIFT_PF12_KEY), 0);
|
||||
WriteToBuffer((char *)SHIFT_PF12_KEY, strlen(SHIFT_PF12_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_CTRL_PRESSED || dwControlKeyState == RIGHT_CTRL_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)CTRL_PF12_KEY, strlen(CTRL_PF12_KEY), 0);
|
||||
WriteToBuffer((char *)CTRL_PF12_KEY, strlen(CTRL_PF12_KEY));
|
||||
|
||||
else if (dwControlKeyState == LEFT_ALT_PRESSED || dwControlKeyState == RIGHT_ALT_PRESSED)
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_PF12_KEY, strlen(ALT_PF12_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF12_KEY, strlen(SHIFT_ALT_CTRL_PF12_KEY), 0);
|
||||
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)))
|
||||
NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF12_KEY, strlen(ALT_CTRL_PF12_KEY), 0);
|
||||
WriteToBuffer((char *)ALT_CTRL_PF12_KEY, strlen(ALT_CTRL_PF12_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_ALT_PF12_KEY, strlen(SHIFT_ALT_PF12_KEY));
|
||||
|
||||
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);
|
||||
WriteToBuffer((char *)SHIFT_CTRL_PF12_KEY, strlen(SHIFT_CTRL_PF12_KEY));
|
||||
break;
|
||||
default:
|
||||
if (strcmp((char *) octets, "")) {
|
||||
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);
|
||||
NetWriteString2(pParams->Socket, tmp_buf, n + 1, 0);
|
||||
WriteToBuffer(tmp_buf, n + 1);
|
||||
}
|
||||
else
|
||||
NetWriteString2(pParams->Socket, (char *)octets, n, 0);
|
||||
}
|
||||
WriteToBuffer((char *)octets, n);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return glob_outlen;
|
||||
}
|
@ -36,12 +36,14 @@
|
||||
#include <windows.h>
|
||||
#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))
|
||||
if (!isConsoleVTSeqAvailable) {
|
||||
if (len >= applicationModeSeqLen && (appModePtr = strrstr(buf, applicationModeSeq)))
|
||||
gbVTAppMode = true;
|
||||
else if(len >= normalModeSeqLen && strstr(buf, normalModeSeq))
|
||||
|
||||
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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user