Skip to content

Commit

Permalink
[win32] Use initial cursor size when hiding or showing it
Browse files Browse the repository at this point in the history
By doing this the users get their original cursor style back when Rich gives control back to the terminal, rather than a "full size" one
  • Loading branch information
olivierphi committed Jun 14, 2022
1 parent d28e636 commit 386e4fe
Showing 1 changed file with 32 additions and 2 deletions.
34 changes: 32 additions & 2 deletions rich/_win32_console.py
Expand Up @@ -263,6 +263,30 @@ def SetConsoleCursorPosition(
return bool(_SetConsoleCursorPosition(std_handle, coords))


_GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo
_GetConsoleCursorInfo.argtypes = [
wintypes.HANDLE,
ctypes.POINTER(CONSOLE_CURSOR_INFO),
]
_GetConsoleCursorInfo.restype = wintypes.BOOL


def GetConsoleCursorInfo(
std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO
) -> bool:
"""Get the cursor info - used to get cursor visibility and width
Args:
std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer.
cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct that receives information
about the console's cursor.
Returns:
bool: True if the function succeeds, otherwise False.
"""
return bool(_GetConsoleCursorInfo(std_handle, cursor_info))


_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo
_SetConsoleCursorInfo.argtypes = [
wintypes.HANDLE,
Expand Down Expand Up @@ -339,6 +363,12 @@ def __init__(self, file: "IO[str]") -> None:
self._handle = handle
default_text = GetConsoleScreenBufferInfo(handle).wAttributes
self._default_text = default_text

# Store the current cursor size
# @link https://docs.microsoft.com/en-us/windows/console/console-cursor-info-str
initial_cursor_info = CONSOLE_CURSOR_INFO()
GetConsoleCursorInfo(self._handle, cursor_info=initial_cursor_info)
self._initial_cursor_size = initial_cursor_info.dwSize

self._default_fore = default_text & 7
self._default_back = (default_text >> 4) & 7
Expand Down Expand Up @@ -523,12 +553,12 @@ def move_cursor_backward(self) -> None:

def hide_cursor(self) -> None:
"""Hide the cursor"""
invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=100, bVisible=0)
invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=self._initial_cursor_size, bVisible=0)
SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor)

def show_cursor(self) -> None:
"""Show the cursor"""
visible_cursor = CONSOLE_CURSOR_INFO(dwSize=100, bVisible=1)
visible_cursor = CONSOLE_CURSOR_INFO(dwSize=self._initial_cursor_size, bVisible=1)
SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor)

def set_title(self, title: str) -> None:
Expand Down

0 comments on commit 386e4fe

Please sign in to comment.