New features for QEMU text console, by Stefan Weil.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3068 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									37a4c5392d
								
							
						
					
					
						commit
						af3a903106
					
				
							
								
								
									
										61
									
								
								console.c
								
								
								
								
							
							
						
						
									
										61
									
								
								console.c
								
								
								
								
							| 
						 | 
				
			
			@ -104,10 +104,16 @@ int qemu_fifo_read(QEMUFIFO *f, uint8_t *buf, int len1)
 | 
			
		|||
    return len1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
    GRAPHIC_CONSOLE,
 | 
			
		||||
    TEXT_CONSOLE,
 | 
			
		||||
    TEXT_CONSOLE_FIXED_SIZE
 | 
			
		||||
} console_type_t;
 | 
			
		||||
 | 
			
		||||
/* ??? This is mis-named.
 | 
			
		||||
   It is used for both text and graphical consoles.  */
 | 
			
		||||
struct TextConsole {
 | 
			
		||||
    int text_console; /* true if text console */
 | 
			
		||||
    console_type_t console_type;
 | 
			
		||||
    DisplayState *ds;
 | 
			
		||||
    /* Graphic console state.  */
 | 
			
		||||
    vga_hw_update_ptr hw_update;
 | 
			
		||||
| 
						 | 
				
			
			@ -587,7 +593,7 @@ static void console_scroll(int ydelta)
 | 
			
		|||
    int i, y1;
 | 
			
		||||
    
 | 
			
		||||
    s = active_console;
 | 
			
		||||
    if (!s || !s->text_console)
 | 
			
		||||
    if (!s || (s->console_type == GRAPHIC_CONSOLE))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (ydelta > 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -990,13 +996,17 @@ void console_select(unsigned int index)
 | 
			
		|||
    s = consoles[index];
 | 
			
		||||
    if (s) {
 | 
			
		||||
        active_console = s;
 | 
			
		||||
        if (s->text_console) {
 | 
			
		||||
        if (s->console_type != GRAPHIC_CONSOLE) {
 | 
			
		||||
            if (s->g_width != s->ds->width ||
 | 
			
		||||
                s->g_height != s->ds->height) {
 | 
			
		||||
                if (s->console_type == TEXT_CONSOLE_FIXED_SIZE) {
 | 
			
		||||
                    dpy_resize(s->ds, s->g_width, s->g_height);
 | 
			
		||||
                } else {
 | 
			
		||||
                s->g_width = s->ds->width;
 | 
			
		||||
                s->g_height = s->ds->height;
 | 
			
		||||
                text_console_resize(s);
 | 
			
		||||
            }
 | 
			
		||||
            }
 | 
			
		||||
            console_refresh(s);
 | 
			
		||||
        } else {
 | 
			
		||||
            vga_hw_invalidate();
 | 
			
		||||
| 
						 | 
				
			
			@ -1062,7 +1072,7 @@ void kbd_put_keysym(int keysym)
 | 
			
		|||
    int c;
 | 
			
		||||
 | 
			
		||||
    s = active_console;
 | 
			
		||||
    if (!s || !s->text_console)
 | 
			
		||||
    if (!s || (s->console_type == GRAPHIC_CONSOLE))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    switch(keysym) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1104,7 +1114,7 @@ void kbd_put_keysym(int keysym)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static TextConsole *new_console(DisplayState *ds, int text)
 | 
			
		||||
static TextConsole *new_console(DisplayState *ds, console_type_t console_type)
 | 
			
		||||
{
 | 
			
		||||
    TextConsole *s;
 | 
			
		||||
    int i;
 | 
			
		||||
| 
						 | 
				
			
			@ -1115,16 +1125,18 @@ static TextConsole *new_console(DisplayState *ds, int text)
 | 
			
		|||
    if (!s) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    if (!active_console || (active_console->text_console && !text))
 | 
			
		||||
    if (!active_console || ((active_console->console_type != GRAPHIC_CONSOLE) &&
 | 
			
		||||
        (console_type == GRAPHIC_CONSOLE))) {
 | 
			
		||||
        active_console = s;
 | 
			
		||||
    }
 | 
			
		||||
    s->ds = ds;
 | 
			
		||||
    s->text_console = text;
 | 
			
		||||
    if (text) {
 | 
			
		||||
    s->console_type = console_type;
 | 
			
		||||
    if (console_type != GRAPHIC_CONSOLE) {
 | 
			
		||||
        consoles[nb_consoles++] = s;
 | 
			
		||||
    } else {
 | 
			
		||||
        /* HACK: Put graphical consoles before text consoles.  */
 | 
			
		||||
        for (i = nb_consoles; i > 0; i--) {
 | 
			
		||||
            if (!consoles[i - 1]->text_console)
 | 
			
		||||
            if (consoles[i - 1]->console_type == GRAPHIC_CONSOLE)
 | 
			
		||||
                break;
 | 
			
		||||
            consoles[i] = consoles[i - 1];
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -1140,7 +1152,7 @@ TextConsole *graphic_console_init(DisplayState *ds, vga_hw_update_ptr update,
 | 
			
		|||
{
 | 
			
		||||
    TextConsole *s;
 | 
			
		||||
 | 
			
		||||
    s = new_console(ds, 0);
 | 
			
		||||
    s = new_console(ds, GRAPHIC_CONSOLE);
 | 
			
		||||
    if (!s)
 | 
			
		||||
      return NULL;
 | 
			
		||||
    s->hw_update = update;
 | 
			
		||||
| 
						 | 
				
			
			@ -1152,20 +1164,22 @@ TextConsole *graphic_console_init(DisplayState *ds, vga_hw_update_ptr update,
 | 
			
		|||
 | 
			
		||||
int is_graphic_console(void)
 | 
			
		||||
{
 | 
			
		||||
    return !active_console->text_console;
 | 
			
		||||
    return active_console->console_type == GRAPHIC_CONSOLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CharDriverState *text_console_init(DisplayState *ds)
 | 
			
		||||
CharDriverState *text_console_init(DisplayState *ds, const char *p)
 | 
			
		||||
{
 | 
			
		||||
    CharDriverState *chr;
 | 
			
		||||
    TextConsole *s;
 | 
			
		||||
    int i,j;
 | 
			
		||||
    unsigned width;
 | 
			
		||||
    unsigned height;
 | 
			
		||||
    static int color_inited;
 | 
			
		||||
 | 
			
		||||
    chr = qemu_mallocz(sizeof(CharDriverState));
 | 
			
		||||
    if (!chr)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    s = new_console(ds, 1);
 | 
			
		||||
    s = new_console(ds, (p == 0) ? TEXT_CONSOLE : TEXT_CONSOLE_FIXED_SIZE);
 | 
			
		||||
    if (!s) {
 | 
			
		||||
        free(chr);
 | 
			
		||||
        return NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -1193,8 +1207,25 @@ CharDriverState *text_console_init(DisplayState *ds)
 | 
			
		|||
    s->total_height = DEFAULT_BACKSCROLL;
 | 
			
		||||
    s->x = 0;
 | 
			
		||||
    s->y = 0;
 | 
			
		||||
    s->g_width = s->ds->width;
 | 
			
		||||
    s->g_height = s->ds->height;
 | 
			
		||||
    width = s->ds->width;
 | 
			
		||||
    height = s->ds->height;
 | 
			
		||||
    if (p != 0) {
 | 
			
		||||
        width = strtoul(p, (char **)&p, 10);
 | 
			
		||||
        if (*p == 'C') {
 | 
			
		||||
            p++;
 | 
			
		||||
            width *= FONT_WIDTH;
 | 
			
		||||
        }
 | 
			
		||||
        if (*p == 'x') {
 | 
			
		||||
            p++;
 | 
			
		||||
            height = strtoul(p, (char **)&p, 10);
 | 
			
		||||
            if (*p == 'C') {
 | 
			
		||||
                p++;
 | 
			
		||||
                height *= FONT_HEIGHT;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    s->g_width = width;
 | 
			
		||||
    s->g_height = height;
 | 
			
		||||
 | 
			
		||||
    /* Set text attribute defaults */
 | 
			
		||||
    s->t_attrib_default.bold = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -555,8 +555,15 @@ Use @code{-serial none} to disable all serial ports.
 | 
			
		|||
 | 
			
		||||
Available character devices are:
 | 
			
		||||
@table @code
 | 
			
		||||
@item vc
 | 
			
		||||
Virtual console
 | 
			
		||||
@item vc[:WxH]
 | 
			
		||||
Virtual console. Optionally, a width and height can be given in pixel with
 | 
			
		||||
@example
 | 
			
		||||
vc:800x600
 | 
			
		||||
@end example
 | 
			
		||||
It is also possible to specify width or height in characters:
 | 
			
		||||
@example
 | 
			
		||||
vc:80Cx24C
 | 
			
		||||
@end example
 | 
			
		||||
@item pty
 | 
			
		||||
[Linux only] Pseudo TTY (a new PTY is automatically allocated)
 | 
			
		||||
@item none
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										8
									
								
								vl.c
								
								
								
								
							
							
						
						
									
										8
									
								
								vl.c
								
								
								
								
							| 
						 | 
				
			
			@ -2923,7 +2923,9 @@ CharDriverState *qemu_chr_open(const char *filename)
 | 
			
		|||
    const char *p;
 | 
			
		||||
 | 
			
		||||
    if (!strcmp(filename, "vc")) {
 | 
			
		||||
        return text_console_init(&display_state);
 | 
			
		||||
        return text_console_init(&display_state, 0);
 | 
			
		||||
    } else if (strstart(filename, "vc:", &p)) {
 | 
			
		||||
        return text_console_init(&display_state, p);
 | 
			
		||||
    } else if (!strcmp(filename, "null")) {
 | 
			
		||||
        return qemu_chr_open_null();
 | 
			
		||||
    } else 
 | 
			
		||||
| 
						 | 
				
			
			@ -7970,7 +7972,7 @@ int main(int argc, char **argv)
 | 
			
		|||
                        devname);
 | 
			
		||||
                exit(1);
 | 
			
		||||
            }
 | 
			
		||||
            if (!strcmp(devname, "vc"))
 | 
			
		||||
            if (strstart(devname, "vc", 0))
 | 
			
		||||
                qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -7984,7 +7986,7 @@ int main(int argc, char **argv)
 | 
			
		|||
                        devname);
 | 
			
		||||
                exit(1);
 | 
			
		||||
            }
 | 
			
		||||
            if (!strcmp(devname, "vc"))
 | 
			
		||||
            if (strstart(devname, "vc", 0))
 | 
			
		||||
                qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								vl.h
								
								
								
								
							
							
						
						
									
										2
									
								
								vl.h
								
								
								
								
							| 
						 | 
				
			
			@ -351,7 +351,7 @@ void vga_hw_invalidate(void);
 | 
			
		|||
void vga_hw_screen_dump(const char *filename);
 | 
			
		||||
 | 
			
		||||
int is_graphic_console(void);
 | 
			
		||||
CharDriverState *text_console_init(DisplayState *ds);
 | 
			
		||||
CharDriverState *text_console_init(DisplayState *ds, const char *p);
 | 
			
		||||
void console_select(unsigned int index);
 | 
			
		||||
 | 
			
		||||
/* serial ports */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue