Index: third_party/colorama/win32.py |
diff --git a/third_party/colorama/win32.py b/third_party/colorama/win32.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..591176131f56c4d29c179d830b9b017f099d3c06 |
--- /dev/null |
+++ b/third_party/colorama/win32.py |
@@ -0,0 +1,109 @@ |
+ |
+# from winbase.h |
+STDOUT = -11 |
+STDERR = -12 |
+ |
+try: |
+ from ctypes import windll |
+except ImportError: |
+ windll = None |
+ SetConsoleTextAttribute = lambda *_: None |
+else: |
+ from ctypes import ( |
+ byref, Structure, c_char, c_short, c_uint32, c_ushort |
+ ) |
+ |
+ handles = { |
+ STDOUT: windll.kernel32.GetStdHandle(STDOUT), |
+ STDERR: windll.kernel32.GetStdHandle(STDERR), |
+ } |
+ |
+ SHORT = c_short |
+ WORD = c_ushort |
+ DWORD = c_uint32 |
+ TCHAR = c_char |
+ |
+ class COORD(Structure): |
+ """struct in wincon.h""" |
+ _fields_ = [ |
+ ('X', SHORT), |
+ ('Y', SHORT), |
+ ] |
+ |
+ class SMALL_RECT(Structure): |
+ """struct in wincon.h.""" |
+ _fields_ = [ |
+ ("Left", SHORT), |
+ ("Top", SHORT), |
+ ("Right", SHORT), |
+ ("Bottom", SHORT), |
+ ] |
+ |
+ class CONSOLE_SCREEN_BUFFER_INFO(Structure): |
+ """struct in wincon.h.""" |
+ _fields_ = [ |
+ ("dwSize", COORD), |
+ ("dwCursorPosition", COORD), |
+ ("wAttributes", WORD), |
+ ("srWindow", SMALL_RECT), |
+ ("dwMaximumWindowSize", COORD), |
+ ] |
+ def __str__(self): |
+ return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( |
+ self.dwSize.Y, self.dwSize.X |
+ , self.dwCursorPosition.Y, self.dwCursorPosition.X |
+ , self.wAttributes |
+ , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right |
+ , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X |
+ ) |
+ |
+ def GetConsoleScreenBufferInfo(stream_id=STDOUT): |
+ handle = handles[stream_id] |
+ csbi = CONSOLE_SCREEN_BUFFER_INFO() |
+ success = windll.kernel32.GetConsoleScreenBufferInfo( |
+ handle, byref(csbi)) |
+ return csbi |
+ |
+ |
+ def SetConsoleTextAttribute(stream_id, attrs): |
+ handle = handles[stream_id] |
+ return windll.kernel32.SetConsoleTextAttribute(handle, attrs) |
+ |
+ |
+ def SetConsoleCursorPosition(stream_id, position): |
+ position = COORD(*position) |
+ # If the position is out of range, do nothing. |
+ if position.Y <= 0 or position.X <= 0: |
+ return |
+ # Adjust for Windows' SetConsoleCursorPosition: |
+ # 1. being 0-based, while ANSI is 1-based. |
+ # 2. expecting (x,y), while ANSI uses (y,x). |
+ adjusted_position = COORD(position.Y - 1, position.X - 1) |
+ # Adjust for viewport's scroll position |
+ sr = GetConsoleScreenBufferInfo(STDOUT).srWindow |
+ adjusted_position.Y += sr.Top |
+ adjusted_position.X += sr.Left |
+ # Resume normal processing |
+ handle = handles[stream_id] |
+ return windll.kernel32.SetConsoleCursorPosition(handle, adjusted_position) |
+ |
+ def FillConsoleOutputCharacter(stream_id, char, length, start): |
+ handle = handles[stream_id] |
+ char = TCHAR(char) |
+ length = DWORD(length) |
+ num_written = DWORD(0) |
+ # Note that this is hard-coded for ANSI (vs wide) bytes. |
+ success = windll.kernel32.FillConsoleOutputCharacterA( |
+ handle, char, length, start, byref(num_written)) |
+ return num_written.value |
+ |
+ def FillConsoleOutputAttribute(stream_id, attr, length, start): |
+ ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' |
+ handle = handles[stream_id] |
+ attribute = WORD(attr) |
+ length = DWORD(length) |
+ num_written = DWORD(0) |
+ # Note that this is hard-coded for ANSI (vs wide) bytes. |
+ return windll.kernel32.FillConsoleOutputAttribute( |
+ handle, attribute, length, start, byref(num_written)) |
+ |