winpty/misc/ClearConsole.cc
Ryan Prichard 5a65fdc11c Use more sensible executable flags for source files
My motivation at the moment is that I'm trying to share a
git checkout between multiple VMs using VirtualBox's Shared
Folders feature.  git in the guest VM isn't able to see the
executable bits from the host due to the VirtualBox/SMB/CIFS
layer.  Instead, it thinks text files are non-executable,
unless they have a shebang line.  That's a sensible way to
set the flags anyway, so set them like that.

With this commit, there's still one file that isn't handled:
src/shared/GetCommitHash.cmd.  It's still marked executable,
but it lacks a shebang line, so the guest thinks it's
non-executable.  I'm not sure it should be changed.
2016-04-20 21:44:44 -07:00

74 lines
2.5 KiB
C++

/*
* Demonstrates that console clearing sets each cell's character to SP, not
* NUL, and it sets the attribute of each cell to the current text attribute.
*
* This confirms the MSDN instruction in the "Clearing the Screen" article.
* https://msdn.microsoft.com/en-us/library/windows/desktop/ms682022(v=vs.85).aspx
* It advises using GetConsoleScreenBufferInfo to get the current text
* attribute, then FillConsoleOutputCharacter and FillConsoleOutputAttribute to
* write to the console buffer.
*/
#include <windows.h>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include "../src/shared/DebugClient.cc"
#include "TestUtil.cc"
int main(int argc, char *argv[]) {
if (argc == 1) {
startChildProcess(L"CHILD");
return 0;
}
const HANDLE conout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(conout, 0x24);
system("cls");
setWindowPos(0, 0, 1, 1);
setBufferSize(80, 25);
setWindowPos(0, 0, 80, 25);
CHAR_INFO buf;
COORD bufSize = { 1, 1 };
COORD bufCoord = { 0, 0 };
SMALL_RECT rect = { 5, 5, 5, 5 };
BOOL ret;
DWORD actual;
COORD writeCoord = { 5, 5 };
// After cls, each cell's character is a space, and its attributes are the
// default text attributes.
ret = ReadConsoleOutputW(conout, &buf, bufSize, bufCoord, &rect);
assert(ret && buf.Char.UnicodeChar == L' ' && buf.Attributes == 0x24);
// Nevertheless, it is possible to change a cell to NUL.
ret = FillConsoleOutputCharacterW(conout, L'\0', 1, writeCoord, &actual);
assert(ret && actual == 1);
ret = ReadConsoleOutputW(conout, &buf, bufSize, bufCoord, &rect);
assert(ret && buf.Char.UnicodeChar == L'\0' && buf.Attributes == 0x24);
// As well as a 0 attribute. (As one would expect, the cell is
// black-on-black.)
ret = FillConsoleOutputAttribute(conout, 0, 1, writeCoord, &actual);
assert(ret && actual == 1);
ret = ReadConsoleOutputW(conout, &buf, bufSize, bufCoord, &rect);
assert(ret && buf.Char.UnicodeChar == L'\0' && buf.Attributes == 0);
ret = FillConsoleOutputCharacterW(conout, L'X', 1, writeCoord, &actual);
assert(ret && actual == 1);
ret = ReadConsoleOutputW(conout, &buf, bufSize, bufCoord, &rect);
assert(ret && buf.Char.UnicodeChar == L'X' && buf.Attributes == 0);
// The 'X' is invisible.
countDown(3);
ret = FillConsoleOutputAttribute(conout, 0x42, 1, writeCoord, &actual);
assert(ret && actual == 1);
countDown(5);
}