Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions Lib/_pyrepl/windows_console.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@
from .windows_eventqueue import EventQueue

try:
from ctypes import get_last_error, WinDLL, windll, WinError # type: ignore[attr-defined]
from ctypes import get_last_error, WinDLL, WinError # type: ignore[attr-defined]
except:
# Keep MyPy happy off Windows
from ctypes import CDLL as WinDLL, cdll as windll
from ctypes import CDLL as WinDLL

def get_last_error() -> int:
return 42
Expand All @@ -66,6 +66,12 @@ def __init__(self, err: int | None, descr: str | None = None) -> None:
self.err = err
self.descr = descr

_winapi: types.ModuleType | None
try:
import _winapi
except ImportError:
_winapi = None

# declare nt optional to allow None assignment on other platforms
nt: types.ModuleType | None
try:
Expand Down Expand Up @@ -696,7 +702,10 @@ def wait_for_event(self, timeout: float | None) -> bool:
timeout = INFINITE
else:
timeout = int(timeout)
ret = WaitForSingleObject(InHandle, timeout)
assert _winapi is not None # to make mypy happy
ret = _winapi.WaitForSingleObject( # type: ignore[attr-defined]
InHandle, timeout
)
if ret == WAIT_FAILED:
raise WinError(get_last_error())
elif ret == WAIT_TIMEOUT:
Expand Down Expand Up @@ -796,12 +805,9 @@ class INPUT_RECORD(Structure):
STD_OUTPUT_HANDLE = -11

if sys.platform == "win32":
assert _winapi is not None # to make mypy happy
_KERNEL32 = WinDLL("kernel32", use_last_error=True)

GetStdHandle = windll.kernel32.GetStdHandle
GetStdHandle.argtypes = [DWORD]
GetStdHandle.restype = HANDLE

GetConsoleScreenBufferInfo = _KERNEL32.GetConsoleScreenBufferInfo
GetConsoleScreenBufferInfo.argtypes = [
HANDLE,
Expand Down Expand Up @@ -836,24 +842,18 @@ class INPUT_RECORD(Structure):
FlushConsoleInputBuffer.argtypes = [HANDLE]
FlushConsoleInputBuffer.restype = BOOL

WaitForSingleObject = _KERNEL32.WaitForSingleObject
WaitForSingleObject.argtypes = [HANDLE, DWORD]
WaitForSingleObject.restype = DWORD

OutHandle = GetStdHandle(STD_OUTPUT_HANDLE)
InHandle = GetStdHandle(STD_INPUT_HANDLE)
OutHandle = _winapi.GetStdHandle(STD_OUTPUT_HANDLE)
InHandle = _winapi.GetStdHandle(STD_INPUT_HANDLE)
else:

def _win_only(*args, **kwargs):
raise NotImplementedError("Windows only")

GetStdHandle = _win_only
GetConsoleScreenBufferInfo = _win_only
ScrollConsoleScreenBuffer = _win_only
GetConsoleMode = _win_only
SetConsoleMode = _win_only
ReadConsoleInput = _win_only
FlushConsoleInputBuffer = _win_only
WaitForSingleObject = _win_only
OutHandle = 0
InHandle = 0
Loading