OLD | NEW |
(Empty) | |
| 1 |
| 2 from . import win32 |
| 3 |
| 4 |
| 5 # from wincon.h |
| 6 class WinColor(object): |
| 7 BLACK = 0 |
| 8 BLUE = 1 |
| 9 GREEN = 2 |
| 10 CYAN = 3 |
| 11 RED = 4 |
| 12 MAGENTA = 5 |
| 13 YELLOW = 6 |
| 14 GREY = 7 |
| 15 |
| 16 # from wincon.h |
| 17 class WinStyle(object): |
| 18 NORMAL = 0x00 # dim text, dim background |
| 19 BRIGHT = 0x08 # bright text, dim background |
| 20 |
| 21 |
| 22 class WinTerm(object): |
| 23 |
| 24 def __init__(self): |
| 25 self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttribut
es |
| 26 self.set_attrs(self._default) |
| 27 self._default_fore = self._fore |
| 28 self._default_back = self._back |
| 29 self._default_style = self._style |
| 30 |
| 31 def get_attrs(self): |
| 32 return self._fore + self._back * 16 + self._style |
| 33 |
| 34 def set_attrs(self, value): |
| 35 self._fore = value & 7 |
| 36 self._back = (value >> 4) & 7 |
| 37 self._style = value & WinStyle.BRIGHT |
| 38 |
| 39 def reset_all(self, on_stderr=None): |
| 40 self.set_attrs(self._default) |
| 41 self.set_console(attrs=self._default) |
| 42 |
| 43 def fore(self, fore=None, on_stderr=False): |
| 44 if fore is None: |
| 45 fore = self._default_fore |
| 46 self._fore = fore |
| 47 self.set_console(on_stderr=on_stderr) |
| 48 |
| 49 def back(self, back=None, on_stderr=False): |
| 50 if back is None: |
| 51 back = self._default_back |
| 52 self._back = back |
| 53 self.set_console(on_stderr=on_stderr) |
| 54 |
| 55 def style(self, style=None, on_stderr=False): |
| 56 if style is None: |
| 57 style = self._default_style |
| 58 self._style = style |
| 59 self.set_console(on_stderr=on_stderr) |
| 60 |
| 61 def set_console(self, attrs=None, on_stderr=False): |
| 62 if attrs is None: |
| 63 attrs = self.get_attrs() |
| 64 handle = win32.STDOUT |
| 65 if on_stderr: |
| 66 handle = win32.STDERR |
| 67 win32.SetConsoleTextAttribute(handle, attrs) |
| 68 |
| 69 def get_position(self, handle): |
| 70 position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition |
| 71 # Because Windows coordinates are 0-based, |
| 72 # and win32.SetConsoleCursorPosition expects 1-based. |
| 73 position.X += 1 |
| 74 position.Y += 1 |
| 75 return position |
| 76 |
| 77 def set_cursor_position(self, position=None, on_stderr=False): |
| 78 if position is None: |
| 79 #I'm not currently tracking the position, so there is no default. |
| 80 #position = self.get_position() |
| 81 return |
| 82 handle = win32.STDOUT |
| 83 if on_stderr: |
| 84 handle = win32.STDERR |
| 85 win32.SetConsoleCursorPosition(handle, position) |
| 86 |
| 87 def cursor_up(self, num_rows=0, on_stderr=False): |
| 88 if num_rows == 0: |
| 89 return |
| 90 handle = win32.STDOUT |
| 91 if on_stderr: |
| 92 handle = win32.STDERR |
| 93 position = self.get_position(handle) |
| 94 adjusted_position = (position.Y - num_rows, position.X) |
| 95 self.set_cursor_position(adjusted_position, on_stderr) |
| 96 |
| 97 def erase_data(self, mode=0, on_stderr=False): |
| 98 # 0 (or None) should clear from the cursor to the end of the screen. |
| 99 # 1 should clear from the cursor to the beginning of the screen. |
| 100 # 2 should clear the entire screen. (And maybe move cursor to (1,1)?) |
| 101 # |
| 102 # At the moment, I only support mode 2. From looking at the API, it |
| 103 # should be possible to calculate a different number of bytes to clea
r, |
| 104 # and to do so relative to the cursor position. |
| 105 if mode[0] not in (2,): |
| 106 return |
| 107 handle = win32.STDOUT |
| 108 if on_stderr: |
| 109 handle = win32.STDERR |
| 110 # here's where we'll home the cursor |
| 111 coord_screen = win32.COORD(0,0) |
| 112 csbi = win32.GetConsoleScreenBufferInfo(handle) |
| 113 # get the number of character cells in the current buffer |
| 114 dw_con_size = csbi.dwSize.X * csbi.dwSize.Y |
| 115 # fill the entire screen with blanks |
| 116 win32.FillConsoleOutputCharacter(handle, ord(' '), dw_con_size, coord_sc
reen) |
| 117 # now set the buffer's attributes accordingly |
| 118 win32.FillConsoleOutputAttribute(handle, self.get_attrs(), dw_con_size,
coord_screen ); |
| 119 # put the cursor at (0, 0) |
| 120 win32.SetConsoleCursorPosition(handle, (coord_screen.X, coord_screen.Y)) |
OLD | NEW |