* Markus Armbruster (arm...@redhat.com) wrote: > Dave, please have a look at the HMP compatibility issue in > hmp-command.hx below. > > Kshitij Suri <kshitij.s...@nutanix.com> writes: > > > Currently screendump only supports PPM format, which is un-compressed and > > not > > standard. > > If "standard" means "have to pay a standards organization $$$ to access > the spec", PPM is not standard. If it means "widely supported", it > certainly is. I'd drop "and not standard". Suggestion, not demand. > > > Added a "format" parameter to qemu monitor screendump capabilites > > to support PNG image capture using libpng. The param was added in QAPI > > schema > > of screendump present in ui.json along with png_save() function which > > converts > > pixman_image to PNG. HMP command equivalent was also modified to support the > > feature. > > Suggest to use imperative mood to describe the commit, and omit details > that aren't necessary here: > > Add a "format" parameter to QMP and HMP screendump command > to support PNG image capture using libpng. > > > > > Example usage: > > { "execute": "screendump", "arguments": { "filename": "/tmp/image", > > "format":"png" } } > > Providing an example in the commit message is always nice, thanks! > > > > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/718 > > > > Signed-off-by: Kshitij Suri <kshitij.s...@nutanix.com> > > > > Reviewed-by: Daniel P. Berrangé <berra...@redhat.com> > > --- > > hmp-commands.hx | 11 ++--- > > monitor/hmp-cmds.c | 12 +++++- > > qapi/ui.json | 24 +++++++++-- > > ui/console.c | 101 +++++++++++++++++++++++++++++++++++++++++++-- > > 4 files changed, 136 insertions(+), 12 deletions(-) > > > > diff --git a/hmp-commands.hx b/hmp-commands.hx > > index 8476277aa9..19b7cab595 100644 > > --- a/hmp-commands.hx > > +++ b/hmp-commands.hx > > @@ -244,11 +244,12 @@ ERST > > > > { > > .name = "screendump", > > - .args_type = "filename:F,device:s?,head:i?", > > - .params = "filename [device [head]]", > > - .help = "save screen from head 'head' of display device > > 'device' " > > - "into PPM image 'filename'", > > - .cmd = hmp_screendump, > > + .args_type = "filename:F,format:s?,device:s?,head:i?", > > Incompatible change: meaning of "screendump ONE TWO" changes from > filename=ONE, device=TWO to filename=ONE, format=TWO. > > As HMP is not a stable interface, incompatible change is permissible. > But is this one wise? > > Could we add the new argument at the end instead? > > .args_type = "filename:F,device:s?,head:i?,format:s?", > > Could we do *without* an argument, and derive the format from the > filename extension? .png means format=png, anything else format=ppm. > Would be a bad idea for QMP. Okay for HMP?
Could we use the new optional flag with value that Stefan Reiter added in 26fcd76 ? (and used in 675fd3c) In which case I think we'd have: "filename:F,format:-fs,device:s?,head:i?" That would seem cleanest; Extracting from the filename would be OKish if it errored if the format wasn't obvious. Dave > > + .params = "filename [format] [device [head]]", > > This tells us that parameter format can be omitted like so > > screendump foo.ppm device-id > > which isn't true. Better: "filename [format [device [head]]". > > > + .help = "save screen from head 'head' of display device > > 'device'" > > + "in specified format 'format' as image 'filename'." > > + "Currently only 'png' and 'ppm' formats are > > supported.", > > + .cmd = hmp_screendump, > > .coroutine = true, > > }, > > > > diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c > > index 634968498b..2442bfa989 100644 > > --- a/monitor/hmp-cmds.c > > +++ b/monitor/hmp-cmds.c > > @@ -1720,9 +1720,19 @@ hmp_screendump(Monitor *mon, const QDict *qdict) > > const char *filename = qdict_get_str(qdict, "filename"); > > const char *id = qdict_get_try_str(qdict, "device"); > > int64_t head = qdict_get_try_int(qdict, "head", 0); > > + const char *input_format = qdict_get_try_str(qdict, "format"); > > Error *err = NULL; > > + ImageFormat format; > > > > - qmp_screendump(filename, id != NULL, id, id != NULL, head, &err); > > + format = qapi_enum_parse(&ImageFormat_lookup, input_format, > > + IMAGE_FORMAT_PPM, &err); > > + if (err) { > > + goto end; > > + } > > + > > + qmp_screendump(filename, id != NULL, id, id != NULL, head, > > + input_format != NULL, format, &err); > > +end: > > hmp_handle_error(mon, err); > > } > > > > diff --git a/qapi/ui.json b/qapi/ui.json > > index 664da9e462..24371fce05 100644 > > --- a/qapi/ui.json > > +++ b/qapi/ui.json > > @@ -157,12 +157,27 @@ > > ## > > { 'command': 'expire_password', 'boxed': true, 'data': > > 'ExpirePasswordOptions' } > > > > +## > > +# @ImageFormat: > > +# > > +# Supported image format types. > > +# > > +# @png: PNG format > > +# > > +# @ppm: PPM format > > +# > > +# Since: 7.1 > > +# > > +## > > +{ 'enum': 'ImageFormat', > > + 'data': ['ppm', 'png'] } > > + > > ## > > # @screendump: > > # > > -# Write a PPM of the VGA screen to a file. > > +# Capture the contents of a screen and write it to a file. > > # > > -# @filename: the path of a new PPM file to store the image > > +# @filename: the path of a new file to store the image > > # > > # @device: ID of the display device that should be dumped. If this > > parameter > > # is missing, the primary display will be used. (Since 2.12) > > @@ -171,6 +186,8 @@ > > # parameter is missing, head #0 will be used. Also note that the > > head > > # can only be specified in conjunction with the device ID. (Since > > 2.12) > > # > > +# @format: image format for screendump is specified. (default: ppm) (Since > > 7.1) > > Recommend > > # @format: image format for screendump (default: ppm) (Since 7.1) > > > +# > > # Returns: Nothing on success > > # > > # Since: 0.14 > > @@ -183,7 +200,8 @@ > > # > > ## > > { 'command': 'screendump', > > - 'data': {'filename': 'str', '*device': 'str', '*head': 'int'}, > > + 'data': {'filename': 'str', '*device': 'str', '*head': 'int', > > + '*format': 'ImageFormat'}, > > 'coroutine': true } > > > > ## > > QAPI schema > Acked-by: Markus Armbruster <arm...@redhat.com> > > [...] > -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK