|
|
import sys |
|
|
from dataclasses import dataclass |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class WindowsConsoleFeatures: |
|
|
"""Windows features available.""" |
|
|
|
|
|
vt: bool = False |
|
|
"""The console supports VT codes.""" |
|
|
truecolor: bool = False |
|
|
"""The console supports truecolor.""" |
|
|
|
|
|
|
|
|
try: |
|
|
import ctypes |
|
|
from ctypes import LibraryLoader, wintypes |
|
|
|
|
|
if sys.platform == "win32": |
|
|
windll = LibraryLoader(ctypes.WinDLL) |
|
|
else: |
|
|
windll = None |
|
|
raise ImportError("Not windows") |
|
|
except (AttributeError, ImportError, ValueError): |
|
|
|
|
|
|
|
|
def get_windows_console_features() -> WindowsConsoleFeatures: |
|
|
features = WindowsConsoleFeatures() |
|
|
return features |
|
|
|
|
|
else: |
|
|
|
|
|
STDOUT = -11 |
|
|
ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 |
|
|
_GetConsoleMode = windll.kernel32.GetConsoleMode |
|
|
_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] |
|
|
_GetConsoleMode.restype = wintypes.BOOL |
|
|
|
|
|
_GetStdHandle = windll.kernel32.GetStdHandle |
|
|
_GetStdHandle.argtypes = [ |
|
|
wintypes.DWORD, |
|
|
] |
|
|
_GetStdHandle.restype = wintypes.HANDLE |
|
|
|
|
|
def get_windows_console_features() -> WindowsConsoleFeatures: |
|
|
"""Get windows console features. |
|
|
|
|
|
Returns: |
|
|
WindowsConsoleFeatures: An instance of WindowsConsoleFeatures. |
|
|
""" |
|
|
handle = _GetStdHandle(STDOUT) |
|
|
console_mode = wintypes.DWORD() |
|
|
result = _GetConsoleMode(handle, console_mode) |
|
|
vt = bool(result and console_mode.value & ENABLE_VIRTUAL_TERMINAL_PROCESSING) |
|
|
truecolor = False |
|
|
if vt: |
|
|
win_version = sys.getwindowsversion() |
|
|
truecolor = win_version.major > 10 or ( |
|
|
win_version.major == 10 and win_version.build >= 15063 |
|
|
) |
|
|
features = WindowsConsoleFeatures(vt=vt, truecolor=truecolor) |
|
|
return features |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
import platform |
|
|
|
|
|
features = get_windows_console_features() |
|
|
from pip._vendor.rich import print |
|
|
|
|
|
print(f'platform="{platform.system()}"') |
|
|
print(repr(features)) |
|
|
|