codekingpro/portable-devtools
115k
1"""2This module provides a method to detect if a given file object supports virtual terminal escape codes.3"""4 5import os6import sys7from typing import IO8 9if os.name == "nt":10 from ctypes import byref # type: ignore11 from ctypes import windll # type: ignore12 from ctypes.wintypes import BOOL13 from ctypes.wintypes import DWORD14 from ctypes.wintypes import HANDLE15 from ctypes.wintypes import LPDWORD16 17 ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x000418 STD_OUTPUT_HANDLE = -1119 STD_ERROR_HANDLE = -1220 21 # https://docs.microsoft.com/de-de/windows/console/getstdhandle22 GetStdHandle = windll.kernel32.GetStdHandle23 GetStdHandle.argtypes = [DWORD]24 GetStdHandle.restype = HANDLE25 26 # https://docs.microsoft.com/de-de/windows/console/getconsolemode27 GetConsoleMode = windll.kernel32.GetConsoleMode28 GetConsoleMode.argtypes = [HANDLE, LPDWORD]29 GetConsoleMode.restype = BOOL30 31 # https://docs.microsoft.com/de-de/windows/console/setconsolemode32 SetConsoleMode = windll.kernel32.SetConsoleMode33 SetConsoleMode.argtypes = [HANDLE, DWORD]34 SetConsoleMode.restype = BOOL35 36 def ensure_supported(f: IO[str]) -> bool:37 if not f.isatty():38 return False39 if f == sys.stdout:40 h = STD_OUTPUT_HANDLE41 elif f == sys.stderr:42 h = STD_ERROR_HANDLE43 else:44 return False45 46 handle = GetStdHandle(h)47 console_mode = DWORD()48 ok = GetConsoleMode(handle, byref(console_mode))49 if not ok:50 return False51 52 ok = SetConsoleMode(53 handle, console_mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING54 )55 return ok56 57else:58 59 def ensure_supported(f: IO[str]) -> bool:60 return f.isatty()61 