mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
console: Implementing blinking of cursor
Let the text console cursor blink at 2 HZ. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
417c9d72d4
commit
bf1bed81c9
26
console.c
26
console.c
@ -28,6 +28,7 @@
|
||||
//#define DEBUG_CONSOLE
|
||||
#define DEFAULT_BACKSCROLL 512
|
||||
#define MAX_CONSOLES 12
|
||||
#define CONSOLE_CURSOR_PERIOD 500
|
||||
|
||||
#define QEMU_RGBA(r, g, b, a) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
|
||||
#define QEMU_RGB(r, g, b) QEMU_RGBA(r, g, b, 0xff)
|
||||
@ -139,6 +140,8 @@ struct TextConsole {
|
||||
TextCell *cells;
|
||||
int text_x[2], text_y[2], cursor_invalidate;
|
||||
int echo;
|
||||
bool cursor_visible_phase;
|
||||
QEMUTimer *cursor_timer;
|
||||
|
||||
int update_x0;
|
||||
int update_y0;
|
||||
@ -615,7 +618,7 @@ static void console_show_cursor(TextConsole *s, int show)
|
||||
y += s->total_height;
|
||||
if (y < s->height) {
|
||||
c = &s->cells[y1 * s->width + x];
|
||||
if (show) {
|
||||
if (show && s->cursor_visible_phase) {
|
||||
TextAttributes t_attrib = s->t_attrib_default;
|
||||
t_attrib.invers = !(t_attrib.invers); /* invert fg and bg */
|
||||
vga_putcharxy(s->ds, x, y, c->ch, &t_attrib);
|
||||
@ -1083,6 +1086,10 @@ void console_select(unsigned int index)
|
||||
s = consoles[index];
|
||||
if (s) {
|
||||
DisplayState *ds = s->ds;
|
||||
|
||||
if (active_console->cursor_timer) {
|
||||
qemu_del_timer(active_console->cursor_timer);
|
||||
}
|
||||
active_console = s;
|
||||
if (ds_get_bits_per_pixel(s->ds)) {
|
||||
ds->surface = qemu_resize_displaysurface(ds, s->g_width, s->g_height);
|
||||
@ -1090,6 +1097,10 @@ void console_select(unsigned int index)
|
||||
s->ds->surface->width = s->width;
|
||||
s->ds->surface->height = s->height;
|
||||
}
|
||||
if (s->cursor_timer) {
|
||||
qemu_mod_timer(s->cursor_timer,
|
||||
qemu_get_clock_ms(rt_clock) + CONSOLE_CURSOR_PERIOD / 2);
|
||||
}
|
||||
dpy_resize(s->ds);
|
||||
vga_hw_invalidate();
|
||||
}
|
||||
@ -1454,6 +1465,16 @@ static void text_console_set_echo(CharDriverState *chr, bool echo)
|
||||
s->echo = echo;
|
||||
}
|
||||
|
||||
static void text_console_update_cursor(void *opaque)
|
||||
{
|
||||
TextConsole *s = opaque;
|
||||
|
||||
s->cursor_visible_phase = !s->cursor_visible_phase;
|
||||
vga_hw_invalidate();
|
||||
qemu_mod_timer(s->cursor_timer,
|
||||
qemu_get_clock_ms(rt_clock) + CONSOLE_CURSOR_PERIOD / 2);
|
||||
}
|
||||
|
||||
static void text_console_do_init(CharDriverState *chr, DisplayState *ds)
|
||||
{
|
||||
TextConsole *s;
|
||||
@ -1482,6 +1503,9 @@ static void text_console_do_init(CharDriverState *chr, DisplayState *ds)
|
||||
s->g_height = ds_get_height(s->ds);
|
||||
}
|
||||
|
||||
s->cursor_timer =
|
||||
qemu_new_timer_ms(rt_clock, text_console_update_cursor, s);
|
||||
|
||||
s->hw_invalidate = text_console_invalidate;
|
||||
s->hw_text_update = text_console_update;
|
||||
s->hw = s;
|
||||
|
Loading…
Reference in New Issue
Block a user