| Index: third_party/colorama/winterm.py
|
| diff --git a/third_party/colorama/winterm.py b/third_party/colorama/winterm.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ae22c4658af4d167ed1ad184faf468e89244b620
|
| --- /dev/null
|
| +++ b/third_party/colorama/winterm.py
|
| @@ -0,0 +1,120 @@
|
| +
|
| +from . import win32
|
| +
|
| +
|
| +# from wincon.h
|
| +class WinColor(object):
|
| + BLACK = 0
|
| + BLUE = 1
|
| + GREEN = 2
|
| + CYAN = 3
|
| + RED = 4
|
| + MAGENTA = 5
|
| + YELLOW = 6
|
| + GREY = 7
|
| +
|
| +# from wincon.h
|
| +class WinStyle(object):
|
| + NORMAL = 0x00 # dim text, dim background
|
| + BRIGHT = 0x08 # bright text, dim background
|
| +
|
| +
|
| +class WinTerm(object):
|
| +
|
| + def __init__(self):
|
| + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes
|
| + self.set_attrs(self._default)
|
| + self._default_fore = self._fore
|
| + self._default_back = self._back
|
| + self._default_style = self._style
|
| +
|
| + def get_attrs(self):
|
| + return self._fore + self._back * 16 + self._style
|
| +
|
| + def set_attrs(self, value):
|
| + self._fore = value & 7
|
| + self._back = (value >> 4) & 7
|
| + self._style = value & WinStyle.BRIGHT
|
| +
|
| + def reset_all(self, on_stderr=None):
|
| + self.set_attrs(self._default)
|
| + self.set_console(attrs=self._default)
|
| +
|
| + def fore(self, fore=None, on_stderr=False):
|
| + if fore is None:
|
| + fore = self._default_fore
|
| + self._fore = fore
|
| + self.set_console(on_stderr=on_stderr)
|
| +
|
| + def back(self, back=None, on_stderr=False):
|
| + if back is None:
|
| + back = self._default_back
|
| + self._back = back
|
| + self.set_console(on_stderr=on_stderr)
|
| +
|
| + def style(self, style=None, on_stderr=False):
|
| + if style is None:
|
| + style = self._default_style
|
| + self._style = style
|
| + self.set_console(on_stderr=on_stderr)
|
| +
|
| + def set_console(self, attrs=None, on_stderr=False):
|
| + if attrs is None:
|
| + attrs = self.get_attrs()
|
| + handle = win32.STDOUT
|
| + if on_stderr:
|
| + handle = win32.STDERR
|
| + win32.SetConsoleTextAttribute(handle, attrs)
|
| +
|
| + def get_position(self, handle):
|
| + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition
|
| + # Because Windows coordinates are 0-based,
|
| + # and win32.SetConsoleCursorPosition expects 1-based.
|
| + position.X += 1
|
| + position.Y += 1
|
| + return position
|
| +
|
| + def set_cursor_position(self, position=None, on_stderr=False):
|
| + if position is None:
|
| + #I'm not currently tracking the position, so there is no default.
|
| + #position = self.get_position()
|
| + return
|
| + handle = win32.STDOUT
|
| + if on_stderr:
|
| + handle = win32.STDERR
|
| + win32.SetConsoleCursorPosition(handle, position)
|
| +
|
| + def cursor_up(self, num_rows=0, on_stderr=False):
|
| + if num_rows == 0:
|
| + return
|
| + handle = win32.STDOUT
|
| + if on_stderr:
|
| + handle = win32.STDERR
|
| + position = self.get_position(handle)
|
| + adjusted_position = (position.Y - num_rows, position.X)
|
| + self.set_cursor_position(adjusted_position, on_stderr)
|
| +
|
| + def erase_data(self, mode=0, on_stderr=False):
|
| + # 0 (or None) should clear from the cursor to the end of the screen.
|
| + # 1 should clear from the cursor to the beginning of the screen.
|
| + # 2 should clear the entire screen. (And maybe move cursor to (1,1)?)
|
| + #
|
| + # At the moment, I only support mode 2. From looking at the API, it
|
| + # should be possible to calculate a different number of bytes to clear,
|
| + # and to do so relative to the cursor position.
|
| + if mode[0] not in (2,):
|
| + return
|
| + handle = win32.STDOUT
|
| + if on_stderr:
|
| + handle = win32.STDERR
|
| + # here's where we'll home the cursor
|
| + coord_screen = win32.COORD(0,0)
|
| + csbi = win32.GetConsoleScreenBufferInfo(handle)
|
| + # get the number of character cells in the current buffer
|
| + dw_con_size = csbi.dwSize.X * csbi.dwSize.Y
|
| + # fill the entire screen with blanks
|
| + win32.FillConsoleOutputCharacter(handle, ord(' '), dw_con_size, coord_screen)
|
| + # now set the buffer's attributes accordingly
|
| + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), dw_con_size, coord_screen );
|
| + # put the cursor at (0, 0)
|
| + win32.SetConsoleCursorPosition(handle, (coord_screen.X, coord_screen.Y))
|
|
|