diff --git a/.mailmap b/.mailmap index 451551082b..fb167ff104 100644 --- a/.mailmap +++ b/.mailmap @@ -21,3 +21,4 @@ + diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 98fb2b4de7..267839b577 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1838,6 +1838,7 @@ qemu-kvm -net nic,model=? /dev/null <channel name='record' mode='insecure'/> <image compression='auto_glz'/> <streaming mode='filter'/> + <clipboard copypaste='no'/> </graphics>

Spice supports variable compression settings for audio, @@ -1862,6 +1863,14 @@ qemu-kvm -net nic,model=? /dev/null of filter, all or off, since 0.9.2.

+

+ Copy & Paste functionality (via Spice agent) is set + by the clipboard element. It is enabled by + default, and can be disabled by setting + the copypaste property + to no, since + 0.9.3. +

"rdp"
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index 0be03711a4..b71778bda3 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -1379,6 +1379,17 @@ + + + + + yes + no + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index be5267bf2c..7393690dfb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -364,6 +364,12 @@ VIR_ENUM_IMPL(virDomainGraphicsSpiceStreamingMode, "all", "off"); +VIR_ENUM_IMPL(virDomainGraphicsSpiceClipboardCopypaste, + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_LAST, + "default", + "yes", + "no"); + VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST, "subsystem", "capabilities") @@ -4287,6 +4293,26 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, int flags) { VIR_FREE(mode); def->data.spice.streaming = modeVal; + } else if (xmlStrEqual(cur->name, BAD_CAST "clipboard")) { + const char *copypaste = virXMLPropString(cur, "copypaste"); + int copypasteVal; + + if (!copypaste) { + virDomainReportError(VIR_ERR_XML_ERROR, "%s", + _("spice clipboard missing copypaste")); + goto error; + } + + if ((copypasteVal = + virDomainGraphicsSpiceClipboardCopypasteTypeFromString(copypaste)) <= 0) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown copypaste value '%s'"), copypaste); + VIR_FREE(copypaste); + goto error; + } + VIR_FREE(copypaste); + + def->data.spice.copypaste = copypasteVal; } } cur = cur->next; @@ -9212,7 +9238,7 @@ virDomainGraphicsDefFormat(virBufferPtr buf, } if (!children && (def->data.spice.image || def->data.spice.jpeg || def->data.spice.zlib || def->data.spice.playback || - def->data.spice.streaming)) { + def->data.spice.streaming || def->data.spice.copypaste)) { virBufferAddLit(buf, ">\n"); children = 1; } @@ -9231,6 +9257,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf, if (def->data.spice.streaming) virBufferAsprintf(buf, " \n", virDomainGraphicsSpiceStreamingModeTypeToString(def->data.spice.streaming)); + if (def->data.spice.copypaste) + virBufferAsprintf(buf, " \n", + virDomainGraphicsSpiceClipboardCopypasteTypeToString(def->data.spice.copypaste)); } if (children) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 41c8136ce8..3ef48d14f4 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -715,6 +715,14 @@ enum virDomainGraphicsSpiceStreamingMode { VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_LAST }; +enum virDomainGraphicsSpiceClipboardCopypaste { + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_DEFAULT = 0, + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_YES, + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_NO, + + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_LAST +}; + typedef struct _virDomainGraphicsDef virDomainGraphicsDef; typedef virDomainGraphicsDef *virDomainGraphicsDefPtr; struct _virDomainGraphicsDef { @@ -757,6 +765,7 @@ struct _virDomainGraphicsDef { int zlib; int playback; int streaming; + int copypaste; } spice; } data; }; @@ -1553,6 +1562,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpiceJpegCompression) VIR_ENUM_DECL(virDomainGraphicsSpiceZlibCompression) VIR_ENUM_DECL(virDomainGraphicsSpicePlaybackCompression) VIR_ENUM_DECL(virDomainGraphicsSpiceStreamingMode) +VIR_ENUM_DECL(virDomainGraphicsSpiceClipboardCopypaste) /* from libvirt.h */ VIR_ENUM_DECL(virDomainState) VIR_ENUM_DECL(virDomainNostateReason) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 7a05539ce5..635193839b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -274,8 +274,10 @@ virDomainGraphicsSpiceChannelModeTypeFromString; virDomainGraphicsSpiceChannelModeTypeToString; virDomainGraphicsSpiceChannelNameTypeFromString; virDomainGraphicsSpiceChannelNameTypeToString; -virDomainGraphicsSpiceImageCompressionTypeToString; +virDomainGraphicsSpiceClipboardCopypasteFromString; +virDomainGraphicsSpiceClipboardCopypasteToString; virDomainGraphicsSpiceImageCompressionTypeFromString; +virDomainGraphicsSpiceImageCompressionTypeToString; virDomainGraphicsSpiceJpegCompressionTypeFromString; virDomainGraphicsSpiceJpegCompressionTypeToString; virDomainGraphicsSpicePlaybackCompressionTypeFromString; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cb81354f7f..f3607a97c3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4161,6 +4161,8 @@ qemuBuildCommandLine(virConnectPtr conn, if (def->graphics[0]->data.spice.streaming) virBufferAsprintf(&opt, ",streaming-video=%s", virDomainGraphicsSpiceStreamingModeTypeToString(def->graphics[0]->data.spice.streaming)); + if (def->graphics[0]->data.spice.copypaste == VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_NO) + virBufferAddLit(&opt, ",disable-copy-paste"); virCommandAddArg(cmd, "-spice"); virCommandAddArgBuffer(cmd, &opt); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args index 084a100197..c9fdb99276 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args @@ -4,6 +4,6 @@ unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda \ /dev/HostVG/QEMUGuest1 -usb -spice port=5903,tls-port=5904,addr=127.0.0.1,\ x509-dir=/etc/pki/libvirt-spice,tls-channel=main,plaintext-channel=inputs,\ image-compression=auto_glz,jpeg-wan-compression=auto,zlib-glz-wan-compression=auto,\ -playback-compression=on,streaming-video=filter -vga \ +playback-compression=on,streaming-video=filter,disable-copy-paste -vga \ qxl -global qxl.vram_size=18874368 -device qxl,id=video1,vram_size=33554432,bus=pci.0,addr=0x4 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml index 0d3dd48761..79780c6349 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml @@ -29,6 +29,7 @@ +