mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-12-14 14:46:50 +01:00
[utils] windows_enable_vt_mode: Proper implementation
Authored by: Grub4K
This commit is contained in:
parent
71df9b7fd5
commit
c53a18f016
@ -5579,17 +5579,39 @@ def supports_terminal_sequences(stream):
|
||||
return False
|
||||
|
||||
|
||||
def windows_enable_vt_mode(): # TODO: Do this the proper way https://bugs.python.org/issue30075
|
||||
def windows_enable_vt_mode():
|
||||
"""Ref: https://bugs.python.org/issue30075 """
|
||||
if get_windows_version() < (10, 0, 10586):
|
||||
return
|
||||
global WINDOWS_VT_MODE
|
||||
try:
|
||||
Popen.run('', shell=True)
|
||||
except Exception:
|
||||
return
|
||||
|
||||
WINDOWS_VT_MODE = True
|
||||
supports_terminal_sequences.cache_clear()
|
||||
import ctypes
|
||||
import ctypes.wintypes
|
||||
import msvcrt
|
||||
|
||||
ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
|
||||
|
||||
dll = ctypes.WinDLL('kernel32', use_last_error=False)
|
||||
handle = os.open('CONOUT$', os.O_RDWR)
|
||||
|
||||
try:
|
||||
h_out = ctypes.wintypes.HANDLE(msvcrt.get_osfhandle(handle))
|
||||
dw_original_mode = ctypes.wintypes.DWORD()
|
||||
success = dll.GetConsoleMode(h_out, ctypes.byref(dw_original_mode))
|
||||
if not success:
|
||||
raise Exception('GetConsoleMode failed')
|
||||
|
||||
success = dll.SetConsoleMode(h_out, ctypes.wintypes.DWORD(
|
||||
dw_original_mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING))
|
||||
if not success:
|
||||
raise Exception('SetConsoleMode failed')
|
||||
except Exception as e:
|
||||
write_string(f'WARNING: Cannot enable VT mode - {e}')
|
||||
else:
|
||||
global WINDOWS_VT_MODE
|
||||
WINDOWS_VT_MODE = True
|
||||
supports_terminal_sequences.cache_clear()
|
||||
finally:
|
||||
os.close(handle)
|
||||
|
||||
|
||||
_terminal_sequences_re = re.compile('\033\\[[^m]+m')
|
||||
|
Loading…
Reference in New Issue
Block a user