:: commit 50fd990ece2b9884c536ad96d156688960feb38b

mintsuki <mintsuki@protonmail.com> — 2021-07-10 23:51

parents: ed3c866187

term: Improve logic of disabling scrolling

diff --git a/stage23/drivers/vga_textmode.s2.c b/stage23/drivers/vga_textmode.s2.c
index fd29912d..eff6f093 100644
--- a/stage23/drivers/vga_textmode.s2.c
+++ b/stage23/drivers/vga_textmode.s2.c
@@ -50,9 +50,6 @@ void text_scroll_enable(void) {
 }
 
 static void scroll(void) {
-    if (scroll_enabled == false)
-        return;
-
     // move the text up by one row
     for (size_t i = 0; i <= VIDEO_BOTTOM - VD_COLS; i++) {
         current_buffer[i] = current_buffer[i + VD_COLS];
@@ -207,9 +204,11 @@ void text_putchar(uint8_t c) {
             break;
         case '\n':
             if (text_get_cursor_pos_y() == (VD_ROWS - 1)) {
-                clear_cursor();
-                scroll();
-                text_set_cursor_pos(0, (VD_ROWS - 1));
+                if (scroll_enabled) {
+                    clear_cursor();
+                    scroll();
+                    text_set_cursor_pos(0, (VD_ROWS - 1));
+                }
             } else {
                 text_set_cursor_pos(0, (text_get_cursor_pos_y() + 1));
             }
@@ -223,8 +222,10 @@ void text_putchar(uint8_t c) {
                 video_mem[cursor_offset+1] = text_palette;
             }
             if (cursor_offset >= (VIDEO_BOTTOM - 1)) {
-                scroll();
-                cursor_offset = VIDEO_BOTTOM - (VD_COLS - 1);
+                if (scroll_enabled) {
+                    scroll();
+                    cursor_offset = VIDEO_BOTTOM - (VD_COLS - 1);
+                }
             } else {
                 cursor_offset += 2;
             }
diff --git a/stage23/lib/gterm.c b/stage23/lib/gterm.c
index 6db8bd5e..3feb3472 100644
--- a/stage23/lib/gterm.c
+++ b/stage23/lib/gterm.c
@@ -220,7 +220,7 @@ void gterm_plot_char(struct gterm_char *c, int x, int y) {
     uint8_t *glyph = &vga_font[(size_t)c->c * VGA_FONT_HEIGHT];
 
     for (int i = 0; i < VGA_FONT_HEIGHT; i++) {
-        uint32_t *line = gterm_framebuffer + x + (y + i) * (gterm_pitch / 4), *canvas_line = bg_canvas + x + (y + i) * gterm_width; 
+        uint32_t *line = gterm_framebuffer + x + (y + i) * (gterm_pitch / 4), *canvas_line = bg_canvas + x + (y + i) * gterm_width;
         for (int j = 0; j < VGA_FONT_WIDTH; j++) {
             if ((glyph[i] & (0x80 >> j))) {
                 line[j] = ansi_colours[c->fg];
@@ -276,9 +276,6 @@ void gterm_scroll_enable(void) {
 }
 
 static void scroll(void) {
-    if (scroll_enabled == false)
-        return;
-
     clear_cursor();
 
     for (int i = cols; i < rows * cols; i++) {
@@ -402,8 +399,10 @@ void gterm_putchar(uint8_t c) {
             break;
         case '\n':
             if (cursor_y == (rows - 1)) {
-                gterm_set_cursor_pos(0, rows - 1);
-                scroll();
+                if (scroll_enabled) {
+                    gterm_set_cursor_pos(0, rows - 1);
+                    scroll();
+                }
             } else {
                 gterm_set_cursor_pos(0, cursor_y + 1);
             }
@@ -415,7 +414,7 @@ void gterm_putchar(uint8_t c) {
             ch.fg = text_fg;
             ch.bg = text_bg;
             plot_char_grid(&ch, cursor_x++, cursor_y);
-            if (cursor_x == cols) {
+            if (cursor_x == cols && (cursor_y < rows - 1 || scroll_enabled)) {
                 cursor_x = 0;
                 cursor_y++;
             }
tab: 248 wrap: offon