Commit 64840c66 authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

console: displaystate init revamp



We have only one DisplayState, so there is no need for the "next"
linking, rip it.  Also consolidate all displaystate initialization
into init_displaystate().  This function is called by vl.c after
creating the devices (and thus all QemuConsoles) and before
initializing DisplayChangeListensers (aka gtk/sdl/vnc/spice ui).

Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 437fe106
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -189,12 +189,9 @@ struct DisplayState {
    bool have_text;

    QLIST_HEAD(, DisplayChangeListener) listeners;

    struct DisplayState *next;
};

void register_displaystate(DisplayState *ds);
DisplayState *get_displaystate(void);
DisplayState *init_displaystate(void);
DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
                                                int linesize, uint8_t *data,
                                                bool byteswap);
+34 −39
Original line number Diff line number Diff line
@@ -163,6 +163,8 @@ static QemuConsole *active_console;
static QemuConsole *consoles[MAX_CONSOLES];
static int nb_consoles = 0;

static void text_console_do_init(CharDriverState *chr, DisplayState *ds);

void vga_hw_update(void)
{
    if (active_console && active_console->hw_update)
@@ -1323,39 +1325,37 @@ bool dpy_cursor_define_supported(QemuConsole *con)
    return false;
}

static void dumb_display_init(void)
{
    DisplayState *ds = g_malloc0(sizeof(DisplayState));
    int width = 640;
    int height = 480;

    if (is_fixedsize_console()) {
        width = active_console->g_width;
        height = active_console->g_height;
    }
    ds->surface = qemu_create_displaysurface(width, height);

    register_displaystate(ds);
}

/***********************************************************/
/* register display */

void register_displaystate(DisplayState *ds)
/* console.c internal use only */
static DisplayState *get_alloc_displaystate(void)
{
    DisplayState **s;
    s = &display_state;
    while (*s != NULL)
        s = &(*s)->next;
    ds->next = NULL;
    *s = ds;
    if (!display_state) {
        display_state = g_new0(DisplayState, 1);
    }
    return display_state;
}

DisplayState *get_displaystate(void)
/*
 * Called by main(), after creating QemuConsoles
 * and before initializing ui (sdl/vnc/...).
 */
DisplayState *init_displaystate(void)
{
    int i;

    if (!display_state) {
        dumb_display_init ();
        display_state = g_new0(DisplayState, 1);
    }

    for (i = 0; i < nb_consoles; i++) {
        if (consoles[i]->console_type != GRAPHIC_CONSOLE &&
            consoles[i]->ds == NULL) {
            text_console_do_init(consoles[i]->chr, display_state);
        }
    }

    return display_state;
}

@@ -1365,10 +1365,12 @@ QemuConsole *graphic_console_init(vga_hw_update_ptr update,
                                  vga_hw_text_update_ptr text_update,
                                  void *opaque)
{
    int width = 640;
    int height = 480;
    QemuConsole *s;
    DisplayState *ds;

    ds = (DisplayState *) g_malloc0(sizeof(DisplayState));
    ds = get_alloc_displaystate();
    trace_console_gfx_new();
    s = new_console(ds, GRAPHIC_CONSOLE);
    s->hw_update = update;
@@ -1377,9 +1379,9 @@ QemuConsole *graphic_console_init(vga_hw_update_ptr update,
    s->hw_text_update = text_update;
    s->hw = opaque;

    ds->surface = qemu_create_displaysurface(640, 480);

    register_displaystate(ds);
    if (!ds->surface) {
        ds->surface = qemu_create_displaysurface(width, height);
    }
    return s;
}

@@ -1505,6 +1507,10 @@ static CharDriverState *text_console_init(ChardevVC *vc)
    s->g_height = height;
    chr->opaque = s;
    chr->chr_set_echo = text_console_set_echo;

    if (display_state) {
        text_console_do_init(chr, display_state);
    }
    return chr;
}

@@ -1520,17 +1526,6 @@ void register_vc_handler(VcHandler *handler)
    vc_handler = handler;
}

void text_consoles_set_display(DisplayState *ds)
{
    int i;

    for (i = 0; i < nb_consoles; i++) {
        if (consoles[i]->console_type != GRAPHIC_CONSOLE) {
            text_console_do_init(consoles[i]->chr, ds);
        }
    }
}

void qemu_console_resize(QemuConsole *s, int width, int height)
{
    s->g_width = width;
+1 −5
Original line number Diff line number Diff line
@@ -4331,8 +4331,7 @@ int main(int argc, char **argv, char **envp)

    net_check_clients();

    /* just use the first displaystate for the moment */
    ds = get_displaystate();
    ds = init_displaystate();

    /* init local displays */
    switch (display_type) {
@@ -4388,9 +4387,6 @@ int main(int argc, char **argv, char **envp)
    }
#endif

    /* display setup */
    text_consoles_set_display(ds);

    if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
        exit(1);
    }