◐ Shell
reader mode source ↗
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
File filter
Conversations
Jump to
Diff view
Apply and reload
Show whitespace
Diff view
Apply and reload
8 changes: 7 additions & 1 deletion Lib/_pyrepl/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,13 @@ def do(self) -> None:
r = self.reader
text = self.event * r.get_arg()
r.insert(text)


class insert_nl(EditCommand):
Expand Down Expand Up @@ -484,7 +491,6 @@ def do(self) -> None:
data = ""
start = time.time()
while done not in data:
self.reader.console.wait(100)
ev = self.reader.console.getpending()
data += ev.data
trace(
Expand Down
26 changes: 15 additions & 11 deletions Lib/_pyrepl/windows_console.py
Original file line number Diff line number Diff line change
Expand Up @@ -419,10 +419,7 @@ def _getscrollbacksize(self) -> int:

return info.srWindow.Bottom # type: ignore[no-any-return]

def _read_input(self, block: bool = True) -> INPUT_RECORD | None:
if not block and not self.wait(timeout=0):
return None

rec = INPUT_RECORD()
read = DWORD()
if not ReadConsoleInput(InHandle, rec, 1, read):
Expand All @@ -431,14 +428,10 @@ def _read_input(self, block: bool = True) -> INPUT_RECORD | None:
return rec

def _read_input_bulk(
self, block: bool, n: int
) -> tuple[ctypes.Array[INPUT_RECORD], int]:
rec = (n * INPUT_RECORD)()
read = DWORD()

if not block and not self.wait(timeout=0):
return rec, 0

if not ReadConsoleInput(InHandle, rec, n, read):
raise WinError(GetLastError())

Expand All @@ -449,8 +442,11 @@ def get_event(self, block: bool = True) -> Event | None:
and there is no event pending, otherwise waits for the
completion of an event."""

while self.event_queue.empty():
rec = self._read_input(block)
if rec is None:
return None

Expand Down Expand Up @@ -551,12 +547,20 @@ def getpending(self) -> Event:
if e2:
e.data += e2.data

recs, rec_count = self._read_input_bulk(False, 1024)
for i in range(rec_count):
rec = recs[i]
if rec and rec.EventType == KEY_EVENT:
key_event = rec.Event.KeyEvent
ch = key_event.uChar.UnicodeChar
if ch == "\r":
ch += "\n"
e.data += ch
Expand Down
1 change: 1 addition & 0 deletions Lib/test/test_pyrepl/test_unix_console.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
def unix_console(events, **kwargs):
console = UnixConsole()
console.get_event = MagicMock(side_effect=events)

height = kwargs.get("height", 25)
width = kwargs.get("width", 80)
Expand Down
1 change: 1 addition & 0 deletions Lib/test/test_pyrepl/test_windows_console.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class WindowsConsoleTests(TestCase):
def console(self, events, **kwargs) -> Console:
console = WindowsConsole()
console.get_event = MagicMock(side_effect=events)
console.wait = MagicMock()
console._scroll = MagicMock()
console._hide_cursor = MagicMock()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Loading
Toggle all file notes Toggle all file annotations