diff --git a/src/viewer/lib.c b/src/viewer/lib.c index 13c53ce37..6982b8f32 100644 --- a/src/viewer/lib.c +++ b/src/viewer/lib.c @@ -91,6 +91,8 @@ mcview_toggle_magic_mode (mcview_t * view) void mcview_toggle_wrap_mode (mcview_t * view) { + if (view->text_wrap_mode) + view->dpy_start = mcview_bol (view, view->dpy_start); view->text_wrap_mode = !view->text_wrap_mode; view->dpy_bbar_dirty = TRUE; view->dirty++; diff --git a/src/viewer/move.c b/src/viewer/move.c index 28a1478d8..27b24075a 100644 --- a/src/viewer/move.c +++ b/src/viewer/move.c @@ -108,12 +108,21 @@ mcview_move_up (mcview_t * view, off_t lines) off_t i; for (i = 0; i < lines; i++) { - new_offset = mcview_bol (view, view->dpy_start); + off_t cur_bol; + cur_bol = new_offset = mcview_bol (view, view->dpy_start); if (new_offset > 0) new_offset--; new_offset = mcview_bol (view, new_offset); if (new_offset < 0) new_offset = 0; + if (view->text_wrap_mode) + { + size_t last_row_length = (view->dpy_start - new_offset) % view->data_area.width; + if (last_row_length != 0 && cur_bol == view->dpy_start) + new_offset = max (new_offset, view->dpy_start - last_row_length); + else + new_offset = max (new_offset, view->dpy_start - view->data_area.width); + } view->dpy_start = new_offset; } } @@ -149,6 +158,8 @@ mcview_move_down (mcview_t * view, off_t lines) { off_t new_offset; new_offset = mcview_eol (view, view->dpy_start); + if (view->text_wrap_mode) + new_offset = min (new_offset, view->dpy_start + view->data_area.width); view->dpy_start = new_offset; } }