You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.0 KiB
72 lines
2.0 KiB
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 wintypes
|
|
from ctypes import LibraryLoader
|
|
|
|
windll = LibraryLoader(ctypes.WinDLL) # type: ignore
|
|
except (AttributeError, ImportError, ValueError):
|
|
|
|
# Fallback if we can't load the Windows DLL
|
|
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() # type: ignore
|
|
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 rich import print
|
|
|
|
print(f'platform="{platform.system()}"')
|
|
print(repr(features))
|