indiaai-hackathon
/
datalab
/web
/node_modules
/node-pty
/deps
/winpty
/misc
/ScreenBufferFreezeInactive.cc
// | |
// Verify that console selection blocks writes to an inactive console screen | |
// buffer. Writes TEST PASSED or TEST FAILED to the popup console window. | |
// | |
const int SC_CONSOLE_MARK = 0xFFF2; | |
const int SC_CONSOLE_SELECT_ALL = 0xFFF5; | |
bool g_useMark = false; | |
CALLBACK DWORD pausingThread(LPVOID dummy) | |
{ | |
HWND hwnd = GetConsoleWindow(); | |
trace("Sending selection to freeze"); | |
SendMessage(hwnd, WM_SYSCOMMAND, | |
g_useMark ? SC_CONSOLE_MARK : | |
SC_CONSOLE_SELECT_ALL, | |
0); | |
Sleep(1000); | |
trace("Sending escape WM_CHAR to unfreeze"); | |
SendMessage(hwnd, WM_CHAR, 27, 0x00010001); | |
Sleep(1000); | |
} | |
static HANDLE createBuffer() { | |
HANDLE buf = CreateConsoleScreenBuffer( | |
GENERIC_READ | GENERIC_WRITE, | |
FILE_SHARE_READ | FILE_SHARE_WRITE, | |
NULL, | |
CONSOLE_TEXTMODE_BUFFER, | |
NULL); | |
ASSERT(buf != INVALID_HANDLE_VALUE); | |
return buf; | |
} | |
static void runTest(bool useMark, bool createEarly) { | |
trace("======================================="); | |
trace("useMark=%d createEarly=%d", useMark, createEarly); | |
g_useMark = useMark; | |
HANDLE buf = INVALID_HANDLE_VALUE; | |
if (createEarly) { | |
buf = createBuffer(); | |
} | |
CreateThread(NULL, 0, | |
pausingThread, NULL, | |
0, NULL); | |
Sleep(500); | |
if (!createEarly) { | |
trace("Creating buffer"); | |
TimeMeasurement tm1; | |
buf = createBuffer(); | |
const double elapsed1 = tm1.elapsed(); | |
if (elapsed1 >= 0.250) { | |
printf("!!! TEST FAILED !!!\n"); | |
Sleep(2000); | |
return; | |
} | |
} | |
trace("Writing to aux buffer"); | |
TimeMeasurement tm2; | |
DWORD actual = 0; | |
BOOL ret = WriteConsoleW(buf, L"HI", 2, &actual, NULL); | |
const double elapsed2 = tm2.elapsed(); | |
trace("Writing to aux buffer: finished: ret=%d actual=%d (elapsed=%1.3f)", ret, actual, elapsed2); | |
if (elapsed2 < 0.250) { | |
printf("!!! TEST FAILED !!!\n"); | |
} else { | |
printf("TEST PASSED\n"); | |
} | |
Sleep(2000); | |
} | |
int main(int argc, char **argv) { | |
if (argc == 1) { | |
startChildProcess(L"child"); | |
return 0; | |
} | |
std::string arg = argv[1]; | |
if (arg == "child") { | |
for (int useMark = 0; useMark <= 1; useMark++) { | |
for (int createEarly = 0; createEarly <= 1; createEarly++) { | |
runTest(useMark, createEarly); | |
} | |
} | |
printf("done...\n"); | |
Sleep(1000); | |
} | |
return 0; | |
} | |