fix crash when resizing quickly with cursor at bottom

This commit is contained in:
Anthony Sottile
2019-12-15 15:21:23 -08:00
parent 2f1f64537d
commit 68ffc18e8c
2 changed files with 23 additions and 13 deletions

26
babi.py
View File

@@ -604,7 +604,7 @@ class File:
# movement
def _scroll_screen_if_needed(self, margin: Margin) -> None:
def scroll_screen_if_needed(self, margin: Margin) -> None:
# if the `cursor_y` is not on screen, make it so
if self.file_y <= self.cursor_y < self.file_y + margin.body_lines:
return
@@ -617,7 +617,7 @@ class File:
def _set_x_after_vertical_movement(self) -> None:
self.x = min(len(self.lines[self.cursor_y]), self.x_hint)
def maybe_scroll_down(self, margin: Margin) -> None:
def _maybe_scroll_down(self, margin: Margin) -> None:
if self.cursor_y >= self.file_y + margin.body_lines:
self.file_y += self._scroll_amount()
@@ -625,7 +625,7 @@ class File:
def down(self, margin: Margin) -> None:
if self.cursor_y < len(self.lines) - 1:
self.cursor_y += 1
self.maybe_scroll_down(margin)
self._maybe_scroll_down(margin)
self._set_x_after_vertical_movement()
def _maybe_scroll_up(self, margin: Margin) -> None:
@@ -646,7 +646,7 @@ class File:
if self.cursor_y < len(self.lines) - 1:
self.x = 0
self.cursor_y += 1
self.maybe_scroll_down(margin)
self._maybe_scroll_down(margin)
else:
self.x += 1
self.x_hint = self.x
@@ -679,7 +679,7 @@ class File:
def ctrl_end(self, margin: Margin) -> None:
self.x = self.x_hint = 0
self.cursor_y = len(self.lines) - 1
self._scroll_screen_if_needed(margin)
self.scroll_screen_if_needed(margin)
@action
def ctrl_up(self, margin: Margin) -> None:
@@ -709,7 +709,7 @@ class File:
):
if self.x == len(self.lines[self.cursor_y]):
self.cursor_y += 1
self.maybe_scroll_down(margin)
self._maybe_scroll_down(margin)
self.x = self.x_hint = 0
else:
self.x = self.x_hint = self.x + 1
@@ -756,7 +756,7 @@ class File:
self.cursor_y = max(0, lineno + len(self.lines))
else:
self.cursor_y = lineno - 1
self._scroll_screen_if_needed(margin)
self.scroll_screen_if_needed(margin)
@action
def search(
@@ -778,7 +778,7 @@ class File:
status.update('search wrapped')
self.cursor_y = line_y
self.x = self.x_hint = match.start()
self._scroll_screen_if_needed(margin)
self.scroll_screen_if_needed(margin)
def replace(
self,
@@ -803,7 +803,7 @@ class File:
for line_y, match in search:
self.cursor_y = line_y
self.x = self.x_hint = match.start()
self._scroll_screen_if_needed(screen.margin)
self.scroll_screen_if_needed(screen.margin)
if res != 'a': # make `a` replace the rest of them
screen.draw()
highlight()
@@ -897,7 +897,7 @@ class File:
self.lines[self.cursor_y] = s[:self.x]
self.lines.insert(self.cursor_y + 1, s[self.x:])
self.cursor_y += 1
self.maybe_scroll_down(margin)
self._maybe_scroll_down(margin)
self.x = self.x_hint = 0
self.modified = True
@@ -920,7 +920,7 @@ class File:
self.lines.insert(self.cursor_y + 1, after)
self.cursor_y += 1
self.x = self.x_hint = 0
self.maybe_scroll_down(margin)
self._maybe_scroll_down(margin)
DISPATCH = {
# movement
@@ -1018,7 +1018,7 @@ class File:
else:
action = from_stack.pop()
to_stack.append(action.apply(self))
self._scroll_screen_if_needed(margin)
self.scroll_screen_if_needed(margin)
status.update(f'{op}: {action.name}')
def undo(self, status: Status, margin: Margin) -> None:
@@ -1151,7 +1151,7 @@ class Screen:
def resize(self) -> None:
curses.update_lines_cols()
self.margin = Margin.from_screen(self.stdscr)
self.file.maybe_scroll_down(self.margin)
self.file.scroll_screen_if_needed(self.margin)
self.draw()

View File

@@ -159,3 +159,13 @@ def test_window_width_1(tmpdir):
h.press('Right')
h.await_text('hello')
h.await_cursor_position(x=3, y=1)
def test_resize_while_cursor_at_bottom(tmpdir):
f = tmpdir.join('f')
f.write('x\n' * 35)
with run(str(f), height=40) as h, and_exit(h):
h.press('^End')
h.await_cursor_position(x=0, y=36)
with h.resize(width=80, height=5):
h.await_cursor_position(x=0, y=2)