mirror of https://github.com/proxmox/mirror_qemu
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>master
parent
437fe1061b
commit
64840c66b7
|
@ -189,12 +189,9 @@ struct DisplayState {
|
||||||
bool have_text;
|
bool have_text;
|
||||||
|
|
||||||
QLIST_HEAD(, DisplayChangeListener) listeners;
|
QLIST_HEAD(, DisplayChangeListener) listeners;
|
||||||
|
|
||||||
struct DisplayState *next;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void register_displaystate(DisplayState *ds);
|
DisplayState *init_displaystate(void);
|
||||||
DisplayState *get_displaystate(void);
|
|
||||||
DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
|
DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
|
||||||
int linesize, uint8_t *data,
|
int linesize, uint8_t *data,
|
||||||
bool byteswap);
|
bool byteswap);
|
||||||
|
|
79
ui/console.c
79
ui/console.c
|
@ -163,6 +163,8 @@ static QemuConsole *active_console;
|
||||||
static QemuConsole *consoles[MAX_CONSOLES];
|
static QemuConsole *consoles[MAX_CONSOLES];
|
||||||
static int nb_consoles = 0;
|
static int nb_consoles = 0;
|
||||||
|
|
||||||
|
static void text_console_do_init(CharDriverState *chr, DisplayState *ds);
|
||||||
|
|
||||||
void vga_hw_update(void)
|
void vga_hw_update(void)
|
||||||
{
|
{
|
||||||
if (active_console && active_console->hw_update)
|
if (active_console && active_console->hw_update)
|
||||||
|
@ -1323,52 +1325,52 @@ bool dpy_cursor_define_supported(QemuConsole *con)
|
||||||
return false;
|
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 */
|
/* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
DisplayState *get_displaystate(void)
|
|
||||||
{
|
{
|
||||||
if (!display_state) {
|
if (!display_state) {
|
||||||
dumb_display_init ();
|
display_state = g_new0(DisplayState, 1);
|
||||||
}
|
}
|
||||||
return display_state;
|
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,
|
QemuConsole *graphic_console_init(vga_hw_update_ptr update,
|
||||||
vga_hw_invalidate_ptr invalidate,
|
vga_hw_invalidate_ptr invalidate,
|
||||||
vga_hw_screen_dump_ptr screen_dump,
|
vga_hw_screen_dump_ptr screen_dump,
|
||||||
vga_hw_text_update_ptr text_update,
|
vga_hw_text_update_ptr text_update,
|
||||||
void *opaque)
|
void *opaque)
|
||||||
{
|
{
|
||||||
|
int width = 640;
|
||||||
|
int height = 480;
|
||||||
QemuConsole *s;
|
QemuConsole *s;
|
||||||
DisplayState *ds;
|
DisplayState *ds;
|
||||||
|
|
||||||
ds = (DisplayState *) g_malloc0(sizeof(DisplayState));
|
ds = get_alloc_displaystate();
|
||||||
trace_console_gfx_new();
|
trace_console_gfx_new();
|
||||||
s = new_console(ds, GRAPHIC_CONSOLE);
|
s = new_console(ds, GRAPHIC_CONSOLE);
|
||||||
s->hw_update = update;
|
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_text_update = text_update;
|
||||||
s->hw = opaque;
|
s->hw = opaque;
|
||||||
|
|
||||||
ds->surface = qemu_create_displaysurface(640, 480);
|
if (!ds->surface) {
|
||||||
|
ds->surface = qemu_create_displaysurface(width, height);
|
||||||
register_displaystate(ds);
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1505,6 +1507,10 @@ static CharDriverState *text_console_init(ChardevVC *vc)
|
||||||
s->g_height = height;
|
s->g_height = height;
|
||||||
chr->opaque = s;
|
chr->opaque = s;
|
||||||
chr->chr_set_echo = text_console_set_echo;
|
chr->chr_set_echo = text_console_set_echo;
|
||||||
|
|
||||||
|
if (display_state) {
|
||||||
|
text_console_do_init(chr, display_state);
|
||||||
|
}
|
||||||
return chr;
|
return chr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1520,17 +1526,6 @@ void register_vc_handler(VcHandler *handler)
|
||||||
vc_handler = 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)
|
void qemu_console_resize(QemuConsole *s, int width, int height)
|
||||||
{
|
{
|
||||||
s->g_width = width;
|
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();
|
net_check_clients();
|
||||||
|
|
||||||
/* just use the first displaystate for the moment */
|
ds = init_displaystate();
|
||||||
ds = get_displaystate();
|
|
||||||
|
|
||||||
/* init local displays */
|
/* init local displays */
|
||||||
switch (display_type) {
|
switch (display_type) {
|
||||||
|
@ -4388,9 +4387,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* display setup */
|
|
||||||
text_consoles_set_display(ds);
|
|
||||||
|
|
||||||
if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
|
if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue