[pve-devel] [PATCH qemu-server v2 1/5] enable clipboard parameter in vga_fmt

Markus Frank m.frank at proxmox.com
Thu Oct 20 13:14:39 CEST 2022


added Options to use the qemu vdagent implementation to enable the noVNC clipboard.
When enabled with SPICE the spice-vdagent gets replaced with the qemu
implementation.

This patch does not solve #1406, but does allow copy and paste with
a running X-session, when spice-vdagent is installed.

Signed-off-by: Markus Frank <m.frank at proxmox.com>
---
v2: added pci address to virtio-serial-pci

With this Patch you have the ability to choose which
clipboard-implementation to use when using Spice.
The alternative would be to only allow noVNC
clipboard if no SPICE is running, because qemu cannot use the same
virtserialport twice. This alternative would also disable the ability
to use the noVNC clipboard with VirtIO/VirGL.

 PVE/QemuServer.pm     | 19 ++++++++++++++++++-
 PVE/QemuServer/PCI.pm |  3 ++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index c706653..333afc2 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -190,6 +190,12 @@ my $vga_fmt = {
 	minimum => 4,
 	maximum => 512,
     },
+    clipboard => {
+	description => "enable clipboard (requires spice-vdagent)",
+	type => 'boolean',
+	optional => 1,
+	default => 0
+    }
 };
 
 my $ivshmem_fmt = {
@@ -3836,6 +3842,13 @@ sub config_to_command {
 	}
     }
 
+    if ($vga->{clipboard} && $vga->{type} =~ /^std|^cirrus|^vmware/) {
+	push @$devices, '-chardev', 'qemu-vdagent,id=vdagent,name=vdagent,clipboard=on';
+	my $pciaddr = print_pci_addr("clipboard", $bridges, $arch, $machine_type);
+	push @$devices, '-device', "virtio-serial-pci$pciaddr";
+	push @$devices, '-device', 'virtserialport,chardev=vdagent,name=com.redhat.spice.0';
+    }
+
     my $rng = $conf->{rng0} ? parse_rng($conf->{rng0}) : undef;
     if ($rng && $version_guard->(4, 1, 2)) {
 	check_rng_source($rng->{source});
@@ -3880,7 +3893,11 @@ sub config_to_command {
 	die "failed to get an ip address of type $pfamily for 'localhost'\n" if !@nodeaddrs;
 
 	push @$devices, '-device', "virtio-serial,id=spice$pciaddr";
-	push @$devices, '-chardev', "spicevmc,id=vdagent,name=vdagent";
+	if ($vga->{clipboard}) {
+	    push @$devices, '-chardev', 'qemu-vdagent,id=vdagent,name=vdagent,clipboard=on';
+	} else {
+	    push @$devices, '-chardev', 'spicevmc,id=vdagent,name=vdagent';
+	}
 	push @$devices, '-device', "virtserialport,chardev=vdagent,name=com.redhat.spice.0";
 
 	my $localhost = PVE::Network::addr_to_ip($nodeaddrs[0]->{addr});
diff --git a/PVE/QemuServer/PCI.pm b/PVE/QemuServer/PCI.pm
index 3d0e70e..7ddabe0 100644
--- a/PVE/QemuServer/PCI.pm
+++ b/PVE/QemuServer/PCI.pm
@@ -138,7 +138,8 @@ sub get_pci_addr_map {
 	scsihw1 => { bus => 0, addr => 6 },
 	ahci0 => { bus => 0, addr => 7 },
 	qga0 => { bus => 0, addr => 8 },
-	spice => { bus => 0, addr => 9 },
+	spice => { bus => 0, addr => 9, conflict_ok => qw(clipboard) },
+	clipboard => { bus => 0, addr => 9, conflict_ok => qw(spice) }, # clipboard is used if spice is not running
 	virtio0 => { bus => 0, addr => 10 },
 	virtio1 => { bus => 0, addr => 11 },
 	virtio2 => { bus => 0, addr => 12 },
-- 
2.30.2






More information about the pve-devel mailing list