console: delayed ui_info guest notification

So we don't flood the guest with display change notifications
while the user resizes the window.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2015-03-12 12:51:13 +01:00
parent 874e9aeeeb
commit cf1ecc82ab
1 changed files with 19 additions and 3 deletions

View File

@ -126,6 +126,7 @@ struct QemuConsole {
Object *device;
uint32_t head;
QemuUIInfo ui_info;
QEMUTimer *ui_timer;
const GraphicHwOps *hw_ops;
void *hw;
@ -1383,14 +1384,28 @@ void unregister_displaychangelistener(DisplayChangeListener *dcl)
gui_setup_refresh(ds);
}
static void dpy_set_ui_info_timer(void *opaque)
{
QemuConsole *con = opaque;
con->hw_ops->ui_info(con->hw, con->head, &con->ui_info);
}
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info)
{
assert(con != NULL);
con->ui_info = *info;
if (con->hw_ops->ui_info) {
return con->hw_ops->ui_info(con->hw, con->head, info);
}
if (!con->hw_ops->ui_info) {
return -1;
}
/*
* Typically we get a flood of these as the user resizes the window.
* Wait until the dust has settled (one second without updates), then
* go notify the guest.
*/
timer_mod(con->ui_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 1000);
return 0;
}
void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h)
@ -1724,6 +1739,7 @@ QemuConsole *graphic_console_init(DeviceState *dev, uint32_t head,
ds = get_alloc_displaystate();
trace_console_gfx_new();
s = new_console(ds, GRAPHIC_CONSOLE, head);
s->ui_timer = timer_new_ms(QEMU_CLOCK_REALTIME, dpy_set_ui_info_timer, s);
graphic_console_set_hwops(s, hw_ops, opaque);
if (dev) {
object_property_set_link(OBJECT(s), OBJECT(dev), "device",