diff options
author | Marcus Brinkmann <marcus@gnu.org> | 2002-08-28 17:28:36 +0000 |
---|---|---|
committer | Marcus Brinkmann <marcus@gnu.org> | 2002-08-28 17:28:36 +0000 |
commit | 513afcf4f8cd67275bad59251d1ee2a845d0ddca (patch) | |
tree | 50ba58bd26fca25385be71fb144daadc287063b9 /libcons | |
parent | d14e2936fd203532ed19471c504b5b43adecf74b (diff) |
hurd/
2002-08-28 Marcus Brinkmann <marcus@gnu.org>
* console.h (struct cons_display): Fix comment on CUR_LINE.
console/
2002-08-28 Marcus Brinkmann <marcus@gnu.org>
* display.c (screen_fill): Take CUR_LINES modulo LINES.
(screen_shift_left): Likewise.
(screen_shift_right): Likewise.
(linefeed): Don't take CUR_LINES modulo LINES here.
libcons/
2002-08-28 Marcus Brinkmann <marcus@gnu.org>
* file-changed.c (cons_S_file_changed): Take NEW_CUR_LINE modulo
VCONS->state.screen.lines where appropriate. Adapt calculation of
SCROLLING, and limit it to the screen size.
Only scroll at all if there is something to scroll.
Fix calculation of scrolled-in area.
* vcons-refresh.c (cons_vcons_refresh): Take
VCONS->state.screen.cur_line modulo VCONS->state.screen.lines.
Diffstat (limited to 'libcons')
-rw-r--r-- | libcons/ChangeLog | 10 | ||||
-rw-r--r-- | libcons/file-changed.c | 75 | ||||
-rw-r--r-- | libcons/vcons-refresh.c | 16 |
3 files changed, 62 insertions, 39 deletions
diff --git a/libcons/ChangeLog b/libcons/ChangeLog index 2913619d..c9b7a5bf 100644 --- a/libcons/ChangeLog +++ b/libcons/ChangeLog @@ -1,3 +1,13 @@ +2002-08-28 Marcus Brinkmann <marcus@gnu.org> + + * file-changed.c (cons_S_file_changed): Take NEW_CUR_LINE modulo + VCONS->state.screen.lines where appropriate. Adapt calculation of + SCROLLING, and limit it to the screen size. + Only scroll at all if there is something to scroll. + Fix calculation of scrolled-in area. + * vcons-refresh.c (cons_vcons_refresh): Take + VCONS->state.screen.cur_line modulo VCONS->state.screen.lines. + 2002-08-22 Marcus Brinkmann <marcus@gnu.org> * demuxer.c, init-init.c, init-loop.c, opts-version.c, diff --git a/libcons/file-changed.c b/libcons/file-changed.c index ff51fa29..a681d626 100644 --- a/libcons/file-changed.c +++ b/libcons/file-changed.c @@ -87,41 +87,50 @@ cons_S_file_changed (cons_notify_t notify, natural_t tickno, } if (change.what.screen_cur_line) { - off_t size = vcons->state.screen.width - * vcons->state.screen.lines; - off_t vis_start; uint32_t new_cur_line; - int scrolling; - off_t start; - off_t end; new_cur_line = vcons->display->screen.cur_line; - scrolling = new_cur_line - vcons->state.screen.cur_line; - if (scrolling < 0) - scrolling += vcons->state.screen.lines; - cons_vcons_scroll (vcons, scrolling); - vis_start = vcons->state.screen.width * new_cur_line; - start = ((new_cur_line + vcons->state.screen.height - - scrolling) * vcons->state.screen.width) % size; - end = start + scrolling * vcons->state.screen.width - 1; - cons_vcons_write (vcons, vcons->state.screen.matrix + start, - end < size - ? end - start + 1 - : size - start, - (start - vis_start) - % vcons->state.screen.width, - (start - vis_start) - / vcons->state.screen.width); - if (end >= size) - cons_vcons_write (vcons, - vcons->state.screen.matrix, - end - size + 1, - (size - vis_start) - % vcons->state.screen.width, - (size - vis_start) - / vcons->state.screen.width); - cons_vcons_update (vcons); - vcons->state.screen.cur_line = new_cur_line; + if (new_cur_line != vcons->state.screen.cur_line) + { + off_t size = vcons->state.screen.width + * vcons->state.screen.lines; + off_t vis_start; + uint32_t scrolling; + off_t start; + off_t end; + + if (new_cur_line > vcons->state.screen.cur_line) + scrolling = new_cur_line + - vcons->state.screen.cur_line; + else + scrolling = UINT32_MAX - vcons->state.screen.cur_line + + 1 + new_cur_line; + if (scrolling > vcons->state.screen.height) + scrolling = vcons->state.screen.height; + if (scrolling < vcons->state.screen.height) + cons_vcons_scroll (vcons, scrolling); + vis_start = vcons->state.screen.width + * (new_cur_line % vcons->state.screen.lines); + start = (((new_cur_line % vcons->state.screen.lines) + + vcons->state.screen.height - scrolling) + * vcons->state.screen.width) % size; + end = start + scrolling * vcons->state.screen.width - 1; + cons_vcons_write (vcons, + vcons->state.screen.matrix + start, + end < size + ? end - start + 1 + : size - start, + 0, vcons->state.screen.height + - scrolling); + if (end >= size) + cons_vcons_write (vcons, + vcons->state.screen.matrix, + end - size + 1, + 0, (size - vis_start) + / vcons->state.screen.width); + cons_vcons_update (vcons); + vcons->state.screen.cur_line = new_cur_line; + } } if (change.what.screen_scr_lines) { @@ -152,7 +161,7 @@ cons_S_file_changed (cons_notify_t notify, natural_t tickno, /* For clipping. */ off_t size = vcons->state.screen.width*vcons->state.screen.lines; off_t rotate = vcons->state.screen.width - * vcons->state.screen.cur_line; + * (vcons->state.screen.cur_line % vcons->state.screen.lines); off_t vis_end = vcons->state.screen.height * vcons->state.screen.width - 1; off_t end2 = -1; diff --git a/libcons/vcons-refresh.c b/libcons/vcons-refresh.c index 34f0de88..35e74224 100644 --- a/libcons/vcons-refresh.c +++ b/libcons/vcons-refresh.c @@ -37,21 +37,25 @@ cons_vcons_refresh (vcons_t vcons) vcons->state.changes.written = vcons->display->changes.written; cons_vcons_write (vcons, vcons->state.screen.matrix - + vcons->state.screen.cur_line * vcons->state.screen.width, - ((vcons->state.screen.lines - vcons->state.screen.cur_line + + (vcons->state.screen.cur_line % vcons->state.screen.lines) + * vcons->state.screen.width, + ((vcons->state.screen.lines + - (vcons->state.screen.cur_line % vcons->state.screen.lines) < vcons->state.screen.height) - ? vcons->state.screen.lines - vcons->state.screen.cur_line + ? vcons->state.screen.lines + - (vcons->state.screen.cur_line % vcons->state.screen.lines) : vcons->state.screen.height) * vcons->state.screen.width, 0, 0); - if (vcons->state.screen.lines - vcons->state.screen.cur_line + if (vcons->state.screen.lines + - (vcons->state.screen.cur_line % vcons->state.screen.lines) < vcons->state.screen.height) cons_vcons_write (vcons, vcons->state.screen.matrix, vcons->state.screen.height * vcons->state.screen.width - (vcons->state.screen.lines - - vcons->state.screen.cur_line) + - (vcons->state.screen.cur_line % vcons->state.screen.lines)) * vcons->state.screen.width, 0, vcons->state.screen.lines - - vcons->state.screen.cur_line); + - (vcons->state.screen.cur_line % vcons->state.screen.lines)); cons_vcons_set_cursor_pos (vcons, vcons->state.cursor.col, vcons->state.cursor.row); |