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')