mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
437fe1061b
commit
64840c66b7
3 changed files with 39 additions and 51 deletions
|
@ -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);
|
||||
|
|
79
ui/console.c
79
ui/console.c
|
@ -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,52 +1325,52 @@ 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)
|
||||
{
|
||||
DisplayState **s;
|
||||
s = &display_state;
|
||||
while (*s != NULL)
|
||||
s = &(*s)->next;
|
||||
ds->next = NULL;
|
||||
*s = ds;
|
||||
}
|
||||
|
||||
DisplayState *get_displaystate(void)
|
||||
/* console.c internal use only */
|
||||
static DisplayState *get_alloc_displaystate(void)
|
||||
{
|
||||
if (!display_state) {
|
||||
dumb_display_init ();
|
||||
display_state = g_new0(DisplayState, 1);
|
||||
}
|
||||
return display_state;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called by main(), after creating QemuConsoles
|
||||
* and before initializing ui (sdl/vnc/...).
|
||||
*/
|
||||
DisplayState *init_displaystate(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!display_state) {
|
||||
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;
|
||||
}
|
||||
|
||||
QemuConsole *graphic_console_init(vga_hw_update_ptr update,
|
||||
vga_hw_invalidate_ptr invalidate,
|
||||
vga_hw_screen_dump_ptr screen_dump,
|
||||
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;
|
||||
|
|
6
vl.c
6
vl.c
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue