--- qemu/console.c 2018/04/24 18:55:58 1.1.1.11 +++ qemu/console.c 2018/04/24 19:17:02 1.1.1.12 @@ -115,6 +115,7 @@ typedef enum { /* ??? This is mis-named. It is used for both text and graphical consoles. */ struct TextConsole { + int index; console_type_t console_type; DisplayState *ds; /* Graphic console state. */ @@ -177,12 +178,17 @@ void vga_hw_screen_dump(const char *file TextConsole *previous_active_console; previous_active_console = active_console; - active_console = consoles[0]; + /* There is currently no way of specifying which screen we want to dump, so always dump the first one. */ - if (consoles[0] && consoles[0]->hw_screen_dump) + console_select(0); + if (consoles[0] && consoles[0]->hw_screen_dump) { consoles[0]->hw_screen_dump(consoles[0]->hw, filename); - active_console = previous_active_console; + } + + if (previous_active_console) { + console_select(previous_active_console->index); + } } void vga_hw_text_update(console_ch_t *chardata) @@ -343,6 +349,7 @@ static const uint32_t dmask4[4] = { static uint32_t color_table[2][8]; +#ifndef CONFIG_CURSES enum color_names { COLOR_BLACK = 0, COLOR_RED = 1, @@ -353,6 +360,7 @@ enum color_names { COLOR_CYAN = 6, COLOR_WHITE = 7 }; +#endif static const uint32_t color_table_rgb[2][8] = { { /* dark */ @@ -461,7 +469,7 @@ static void vga_putcharxy(DisplayState * font_data = *font_ptr++; if (t_attrib->uline && ((i == FONT_HEIGHT - 2) || (i == FONT_HEIGHT - 3))) { - font_data = 0xFFFF; + font_data = 0xFF; } ((uint32_t *)d)[0] = (dmask16[(font_data >> 4)] & xorcol) ^ bgcol; ((uint32_t *)d)[1] = (dmask16[(font_data >> 0) & 0xf] & xorcol) ^ bgcol; @@ -474,7 +482,7 @@ static void vga_putcharxy(DisplayState * font_data = *font_ptr++; if (t_attrib->uline && ((i == FONT_HEIGHT - 2) || (i == FONT_HEIGHT - 3))) { - font_data = 0xFFFF; + font_data = 0xFF; } ((uint32_t *)d)[0] = (dmask4[(font_data >> 6)] & xorcol) ^ bgcol; ((uint32_t *)d)[1] = (dmask4[(font_data >> 4) & 3] & xorcol) ^ bgcol; @@ -487,7 +495,7 @@ static void vga_putcharxy(DisplayState * for(i = 0; i < FONT_HEIGHT; i++) { font_data = *font_ptr++; if (t_attrib->uline && ((i == FONT_HEIGHT - 2) || (i == FONT_HEIGHT - 3))) { - font_data = 0xFFFF; + font_data = 0xFF; } ((uint32_t *)d)[0] = (-((font_data >> 7)) & xorcol) ^ bgcol; ((uint32_t *)d)[1] = (-((font_data >> 6) & 1) & xorcol) ^ bgcol; @@ -516,7 +524,7 @@ static void text_console_resize(TextCons if (s->width < w1) w1 = s->width; - cells = qemu_malloc(s->width * s->total_height * sizeof(TextCell)); + cells = g_malloc(s->width * s->total_height * sizeof(TextCell)); for(y = 0; y < s->total_height; y++) { c = &cells[y * s->width]; if (w1 > 0) { @@ -531,7 +539,7 @@ static void text_console_resize(TextCons c++; } } - qemu_free(s->cells); + g_free(s->cells); s->cells = cells; } @@ -1102,35 +1110,20 @@ static int console_puts(CharDriverState return len; } -static void console_send_event(CharDriverState *chr, int event) -{ - TextConsole *s = chr->opaque; - int i; - - if (event == CHR_EVENT_FOCUS) { - for(i = 0; i < nb_consoles; i++) { - if (consoles[i] == s) { - console_select(i); - break; - } - } - } -} - static void kbd_send_chars(void *opaque) { TextConsole *s = opaque; int len; uint8_t buf[16]; - len = qemu_chr_can_read(s->chr); + len = qemu_chr_be_can_write(s->chr); if (len > s->out_fifo.count) len = s->out_fifo.count; if (len > 0) { if (len > sizeof(buf)) len = sizeof(buf); qemu_fifo_read(&s->out_fifo, buf, len); - qemu_chr_read(s->chr, buf, len); + qemu_chr_be_write(s->chr, buf, len); } /* characters are pending: we send them a bit later (XXX: horrible, should change char device API) */ @@ -1252,7 +1245,7 @@ static TextConsole *new_console(DisplayS if (nb_consoles >= MAX_CONSOLES) return NULL; - s = qemu_mallocz(sizeof(TextConsole)); + s = g_malloc0(sizeof(TextConsole)); if (!active_console || ((active_console->console_type != GRAPHIC_CONSOLE) && (console_type == GRAPHIC_CONSOLE))) { active_console = s; @@ -1260,6 +1253,7 @@ static TextConsole *new_console(DisplayS s->ds = ds; s->console_type = console_type; if (console_type != GRAPHIC_CONSOLE) { + s->index = nb_consoles; consoles[nb_consoles++] = s; } else { /* HACK: Put graphical consoles before text consoles. */ @@ -1267,7 +1261,9 @@ static TextConsole *new_console(DisplayS if (consoles[i - 1]->console_type == GRAPHIC_CONSOLE) break; consoles[i] = consoles[i - 1]; + consoles[i]->index = i; } + s->index = i; consoles[i] = s; nb_consoles++; } @@ -1276,7 +1272,7 @@ static TextConsole *new_console(DisplayS static DisplaySurface* defaultallocator_create_displaysurface(int width, int height) { - DisplaySurface *surface = (DisplaySurface*) qemu_mallocz(sizeof(DisplaySurface)); + DisplaySurface *surface = (DisplaySurface*) g_malloc0(sizeof(DisplaySurface)); int linesize = width * 4; qemu_alloc_display(surface, width, height, linesize, @@ -1302,10 +1298,10 @@ void qemu_alloc_display(DisplaySurface * surface->linesize = linesize; surface->pf = pf; if (surface->flags & QEMU_ALLOCATED_FLAG) { - data = qemu_realloc(surface->data, + data = g_realloc(surface->data, surface->linesize * surface->height); } else { - data = qemu_malloc(surface->linesize * surface->height); + data = g_malloc(surface->linesize * surface->height); } surface->data = (uint8_t *)data; surface->flags = newflags | QEMU_ALLOCATED_FLAG; @@ -1317,7 +1313,7 @@ void qemu_alloc_display(DisplaySurface * DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp, int linesize, uint8_t *data) { - DisplaySurface *surface = (DisplaySurface*) qemu_mallocz(sizeof(DisplaySurface)); + DisplaySurface *surface = (DisplaySurface*) g_malloc0(sizeof(DisplaySurface)); surface->width = width; surface->height = height; @@ -1336,8 +1332,8 @@ static void defaultallocator_free_displa if (surface == NULL) return; if (surface->flags & QEMU_ALLOCATED_FLAG) - qemu_free(surface->data); - qemu_free(surface); + g_free(surface->data); + g_free(surface); } static struct DisplayAllocator default_allocator = { @@ -1348,7 +1344,7 @@ static struct DisplayAllocator default_a static void dumb_display_init(void) { - DisplayState *ds = qemu_mallocz(sizeof(DisplayState)); + DisplayState *ds = g_malloc0(sizeof(DisplayState)); int width = 640; int height = 480; @@ -1403,14 +1399,14 @@ DisplayState *graphic_console_init(vga_h TextConsole *s; DisplayState *ds; - ds = (DisplayState *) qemu_mallocz(sizeof(DisplayState)); + ds = (DisplayState *) g_malloc0(sizeof(DisplayState)); ds->allocator = &default_allocator; ds->surface = qemu_create_displaysurface(ds, 640, 480); s = new_console(ds, GRAPHIC_CONSOLE); if (s == NULL) { qemu_free_displaysurface(ds); - qemu_free(ds); + g_free(ds); return NULL; } s->hw_update = update; @@ -1462,7 +1458,6 @@ static void text_console_do_init(CharDri s = chr->opaque; chr->chr_write = console_puts; - chr->chr_send_event = console_send_event; s->out_fifo.buf = s->out_fifo_buf; s->out_fifo.buf_size = sizeof(s->out_fifo_buf); @@ -1521,7 +1516,7 @@ int text_console_init(QemuOpts *opts, Ch unsigned width; unsigned height; - chr = qemu_mallocz(sizeof(CharDriverState)); + chr = g_malloc0(sizeof(CharDriverState)); if (n_text_consoles == 128) { fprintf(stderr, "Too many text consoles\n"); @@ -1545,7 +1540,7 @@ int text_console_init(QemuOpts *opts, Ch } if (!s) { - free(chr); + g_free(chr); return -EBUSY; }