From e308b0b493ea737e282127e5559b7b59cc7dc256 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Sat, 10 Feb 2018 07:39:42 +0000 Subject: [PATCH] Don't erase the cursor when moving and stuff... keep it on the screen when it's visible. --- src/conio/bitmap_con.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c index 7bc773454e..3e9d90cb96 100644 --- a/src/conio/bitmap_con.c +++ b/src/conio/bitmap_con.c @@ -112,6 +112,7 @@ static void request_redraw_locked(void); static void request_redraw(void); static void memset_u32(void *buf, uint32_t u, size_t len); static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos); +static int bitmap_draw_one_char_cursor(unsigned int xpos, unsigned int ypos); static void cb_flush(void); static int check_redraw(void); static void blinker_thread(void *data); @@ -291,7 +292,7 @@ static int bitmap_pputtext_locked(int sx, int sy, int ex, int ey, void *fill, ui vmem_ptr->fgvmem[y*cio_textinfo.screenwidth+x] = *(fgout++); if (bg) vmem_ptr->bgvmem[y*cio_textinfo.screenwidth+x] = *(bgout++); - bitmap_draw_one_char(x+1, y+1); + bitmap_draw_one_char_cursor(x+1, y+1); } } release_vmem(vmem_ptr); @@ -384,6 +385,15 @@ static BOOL bitmap_draw_cursor(void) return ret; } +static int bitmap_draw_one_char_cursor(unsigned int xpos, unsigned int ypos) +{ + if (bitmap_draw_one_char(xpos, ypos) == -1) + return -1; + if (xpos == vstat.curs_col && ypos == vstat.curs_row) + return bitmap_draw_cursor(); + return 0; +} + static void cb_drawrect(int xpos, int ypos, int width, int height, uint32_t *data) { if (data == NULL) @@ -663,11 +673,7 @@ static int update_from_vmem(int force) || ((vstat.vmem->vmem[pos] & 0x0800) && bright_attr_changed) /* Bright char */ || (redraw_cursor && (vstat.curs_col==x+1 && vstat.curs_row==y+1)) /* Cursor */ ) { - bitmap_draw_one_char(x+1,y+1); - - /* If we're overwriting the cell the cursor is in, we need to redraw it. */ - if(x+1==vstat.curs_col && y+1==vstat.curs_row) - bitmap_draw_cursor(); + bitmap_draw_one_char_cursor(x+1,y+1); } pos++; } @@ -795,6 +801,7 @@ void bitmap_gotoxy(int x, int y) if (vstat.curs_col != x+cio_textinfo.winleft-1 || vstat.curs_row != y+cio_textinfo.wintop-1) { vstat.curs_col=x+cio_textinfo.winleft-1; vstat.curs_row=y+cio_textinfo.wintop-1; + bitmap_draw_cursor(); } pthread_mutex_unlock(&vstatlock); } @@ -1129,7 +1136,7 @@ void bitmap_clreol(void) set_vmem_cell(vmem_ptr, pos+x, fill); vmem_ptr->fgvmem[pos+x] = ciolib_fg; vmem_ptr->bgvmem[pos+x] = ciolib_bg; - bitmap_draw_one_char(x+1, row); + bitmap_draw_one_char_cursor(x+1, row); } release_vmem(vmem_ptr); pthread_mutex_unlock(&vstatlock); @@ -1150,7 +1157,7 @@ void bitmap_clrscr(void) set_vmem_cell(vmem_ptr, y*cio_textinfo.screenwidth+x, fill); vmem_ptr->fgvmem[y*cio_textinfo.screenwidth+x] = ciolib_fg; vmem_ptr->bgvmem[y*cio_textinfo.screenwidth+x] = ciolib_bg; - bitmap_draw_one_char(x+1, y+1); + bitmap_draw_one_char_cursor(x+1, y+1); } } release_vmem(vmem_ptr); -- GitLab