Later the save will happen asynchronously on surface_updated callback. --- hw/qxl-render.c | 10 ++++++++++ hw/qxl.c | 2 +- hw/qxl.h | 2 ++ 3 files changed, 13 insertions(+), 1 deletions(-)
diff --git a/hw/qxl-render.c b/hw/qxl-render.c index 60b822d..e64b646 100644 --- a/hw/qxl-render.c +++ b/hw/qxl-render.c @@ -70,6 +70,15 @@ void qxl_render_resize(PCIQXLDevice *qxl) } } +static void qxl_save_ppm(PCIQXLDevice *qxl) +{ + if (qxl->ppm_save_filename) { + ppm_save(qxl->ppm_save_filename, qxl->ssd.ds->surface); + free(qxl->ppm_save_filename); + qxl->ppm_save_filename = NULL; + } +} + void qxl_render_update(PCIQXLDevice *qxl) { VGACommonState *vga = &qxl->vga; @@ -139,6 +148,7 @@ void qxl_render_update(PCIQXLDevice *qxl) dirty[i].right - dirty[i].left, dirty[i].bottom - dirty[i].top); } + qxl_save_ppm(qxl); } static QEMUCursor *qxl_cursor(PCIQXLDevice *qxl, QXLCursor *cursor) diff --git a/hw/qxl.c b/hw/qxl.c index bd540c0..de93efa 100644 --- a/hw/qxl.c +++ b/hw/qxl.c @@ -1462,8 +1462,8 @@ static void qxl_hw_screen_dump(void *opaque, const char *filename) switch (qxl->mode) { case QXL_MODE_COMPAT: case QXL_MODE_NATIVE: + qxl->ppm_save_filename = qemu_strdup(filename); qxl_render_update(qxl); - ppm_save(filename, qxl->ssd.ds->surface); break; case QXL_MODE_VGA: vga->screen_dump(vga, filename); diff --git a/hw/qxl.h b/hw/qxl.h index 064311a..2c7f94a 100644 --- a/hw/qxl.h +++ b/hw/qxl.h @@ -32,6 +32,8 @@ typedef struct PCIQXLDevice { int32_t num_memslots; int32_t num_surfaces; + char *ppm_save_filename; + #if SPICE_INTERFACE_QXL_MINOR >= 1 uint32_t current_async; QemuMutex async_lock; -- 1.7.6