|
|
|
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
|
|
|
|
|
|
|
|
if sys.platform == "win32":
|
|
|
|
windll = LibraryLoader(ctypes.WinDLL)
|
|
|
|
else:
|
|
|
|
windll = None
|
|
|
|
raise ImportError("Not windows")
|
|
|
|
|
|
|
|
from rich._win32_console import (
|
|
|
|
ENABLE_VIRTUAL_TERMINAL_PROCESSING,
|
|
|
|
GetConsoleMode,
|
|
|
|
GetStdHandle,
|
|
|
|
LegacyWindowsError,
|
|
|
|
)
|
|
|
|
|
|
|
|
except (AttributeError, ImportError, ValueError):
|
|
|
|
# Fallback if we can't load the Windows DLL
|
|
|
|
def get_windows_console_features() -> WindowsConsoleFeatures:
|
|
|
|
features = WindowsConsoleFeatures()
|
|
|
|
return features
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
def get_windows_console_features() -> WindowsConsoleFeatures:
|
|
|
|
"""Get windows console features.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
WindowsConsoleFeatures: An instance of WindowsConsoleFeatures.
|
|
|
|
"""
|
|
|
|
handle = GetStdHandle()
|
|
|
|
try:
|
|
|
|
console_mode = GetConsoleMode(handle)
|
|
|
|
success = True
|
|
|
|
except LegacyWindowsError:
|
|
|
|
console_mode = 0
|
|
|
|
success = False
|
|
|
|
vt = bool(success and console_mode & 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 rich import print
|
|
|
|
|
|
|
|
print(f'platform="{platform.system()}"')
|
|
|
|
print(repr(features))
|