}
static void kmscon_buffer_draw(struct kmscon_buffer *buf,
- struct font_screen *fscr)
+ struct font_screen *fscr,
+ unsigned int cur_x,
+ unsigned int cur_y)
{
- unsigned int i, j, k, num;
+ unsigned int i, j, k, num, o;
struct line *iter, *line = NULL;
struct cell *cell;
int idx;
float m[16];
+ bool cursor_done = false;
+ struct font_char_attr attr;
if (!buf || !fscr)
return;
iter = buf->position;
k = 0;
idx = 0;
+ o = 0;
for (i = 0; i < buf->size_y; ++i) {
if (iter) {
line = iter;
break;
}
k++;
+ o++;
}
if (!line)
for (j = 0; j < num; ++j) {
cell = &line->cells[j];
+ memcpy(&attr, &cell->attr, sizeof(attr));
+
+ if (o == cur_y + 1 &&
+ j == cur_x) {
+ cursor_done = true;
+ attr.inverse = !attr.inverse;
+ }
/* TODO: do some more sophisticated inverse here. When
* INVERSE mode is set, we should instead just select
* inverse colors instead of switching background and
* foreground */
if (buf->flags & KMSCON_CONSOLE_INVERSE)
- cell->attr.inverse = !cell->attr.inverse;
- font_screen_draw_char(fscr, cell->ch, &cell->attr,
+ attr.inverse = !attr.inverse;
+ font_screen_draw_char(fscr, cell->ch, &attr,
j, i, 1, 1);
- if (buf->flags & KMSCON_CONSOLE_INVERSE)
- cell->attr.inverse = !cell->attr.inverse;
+ }
+
+ if (o == cur_y + 1 && !cursor_done) {
+ cursor_done = true;
+ if (!(buf->flags & KMSCON_CONSOLE_INVERSE))
+ attr.inverse = !attr.inverse;
+ font_screen_draw_char(fscr, 0, &attr,
+ cur_x, i, 1, 1);
}
}
void kmscon_console_draw(struct kmscon_console *con, struct font_screen *fscr)
{
+ unsigned int cur_x, cur_y;
+
if (!con)
return;
- kmscon_buffer_draw(con->cells, fscr);
+ cur_x = con->cursor_x;
+ if (con->cursor_x >= con->cells->size_x)
+ cur_x = con->cells->size_x - 1;
+ cur_y = con->cursor_y;
+
+ kmscon_buffer_draw(con->cells, fscr, cur_x, cur_y);
}
void kmscon_console_write(struct kmscon_console *con, kmscon_symbol_t ch,
continue;
case 25: /* DECTCEM */
set_reset_flag(vte, set, FLAG_TEXT_CURSOR_MODE);
+ if (set)
+ kmscon_console_reset_flags(vte->con,
+ KMSCON_CONSOLE_HIDE_CURSOR);
+ else
+ kmscon_console_set_flags(vte->con,
+ KMSCON_CONSOLE_HIDE_CURSOR);
continue;
case 42: /* DECNRCM */
set_reset_flag(vte, set, FLAG_NATIONAL_CHARSET_MODE);