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.fr...@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



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to