* [pve-devel] [PATCH qemu-sever v13 1/6] enable VNC clipboard parameter in vga_fmt
2023-09-21 11:47 [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard Markus Frank
@ 2023-09-21 11:47 ` Markus Frank
2023-11-10 9:33 ` Dominik Csapak
2023-09-21 11:47 ` [pve-devel] [PATCH qemu-sever v13 2/6] add clipboard variable to return at status/current Markus Frank
` (5 subsequent siblings)
6 siblings, 1 reply; 11+ messages in thread
From: Markus Frank @ 2023-09-21 11:47 UTC (permalink / raw)
To: pve-devel
add option to use the qemu vdagent implementation to enable the VNC
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 on the guest.
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
PVE/API2/Qemu.pm | 7 +++++
PVE/QemuServer.pm | 66 ++++++++++++++++++++++++++++++++++-------------
2 files changed, 55 insertions(+), 18 deletions(-)
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 9606e72..8a2fdef 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -1034,6 +1034,9 @@ __PACKAGE__->register_method({
$conf->{boot} = PVE::QemuServer::print_bootorder($devs);
}
+ my $vga = PVE::QemuServer::parse_vga($conf->{vga});
+ PVE::QemuServer::assert_clipboard_config($vga);
+
# auto generate uuid if user did not specify smbios1 option
if (!$conf->{smbios1}) {
$conf->{smbios1} = PVE::QemuServer::generate_smbios1_uuid();
@@ -1856,6 +1859,10 @@ my $update_vm_api = sub {
die "only root can modify '$opt' config for real devices\n";
}
$conf->{pending}->{$opt} = $param->{$opt};
+ } elsif ($opt eq 'vga') {
+ my $vga = PVE::QemuServer::parse_vga($param->{$opt});
+ PVE::QemuServer::assert_clipboard_config($vga);
+ $conf->{pending}->{$opt} = $param->{$opt};
} elsif ($opt =~ m/^usb\d+/) {
if (my $olddevice = $conf->{$opt}) {
check_usb_perm($rpcenv, $authuser, $vmid, undef, $opt, $conf->{$opt});
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index bf1de17..2b84ed8 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -195,6 +195,13 @@ my $vga_fmt = {
minimum => 4,
maximum => 512,
},
+ clipboard => {
+ description => 'Enable a specific clipboard. If not set, depending on'
+ .' the display type the SPICE one will be added.',
+ type => 'string',
+ enum => ['vnc'],
+ optional => 1,
+ },
};
my $ivshmem_fmt = {
@@ -1375,6 +1382,21 @@ sub pve_verify_hotplug_features {
die "unable to parse hotplug option\n";
}
+sub assert_clipboard_config {
+ my ($vga) = @_;
+
+ my $clipboard_regex = qr/^(std|cirrus|vmware|virtio|qxl)/;
+
+ if (
+ $vga->{'clipboard'}
+ && $vga->{'clipboard'} eq 'vnc'
+ && $vga->{type}
+ && $vga->{type} !~ $clipboard_regex
+ ) {
+ die "vga type $vga->{type} is not compatible with VNC clipboard\n";
+ }
+}
+
sub scsi_inquiry {
my($fh, $noerr) = @_;
@@ -3945,7 +3967,10 @@ sub config_to_command {
my $spice_port;
- if ($qxlnum || $vga->{type} =~ /^virtio/) {
+ assert_clipboard_config($vga);
+ my $is_spice = $qxlnum || $vga->{type} =~ /^virtio/;
+
+ if ($is_spice || ($vga->{'clipboard'} && $vga->{'clipboard'} eq 'vnc')) {
if ($qxlnum > 1) {
if ($winversion){
for (my $i = 1; $i < $qxlnum; $i++){
@@ -3966,29 +3991,34 @@ sub config_to_command {
my $pciaddr = print_pci_addr("spice", $bridges, $arch, $machine_type);
- my $pfamily = PVE::Tools::get_host_address_family($nodename);
- my @nodeaddrs = PVE::Tools::getaddrinfo_all('localhost', family => $pfamily);
- 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'} && $vga->{'clipboard'} eq 'vnc') {
+ 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});
- $spice_port = PVE::Tools::next_spice_port($pfamily, $localhost);
+ if ($is_spice) {
+ my $pfamily = PVE::Tools::get_host_address_family($nodename);
+ my @nodeaddrs = PVE::Tools::getaddrinfo_all('localhost', family => $pfamily);
+ die "failed to get an ip address of type $pfamily for 'localhost'\n" if !@nodeaddrs;
- my $spice_enhancement_str = $conf->{spice_enhancements} // '';
- my $spice_enhancement = parse_property_string($spice_enhancements_fmt, $spice_enhancement_str);
- if ($spice_enhancement->{foldersharing}) {
- push @$devices, '-chardev', "spiceport,id=foldershare,name=org.spice-space.webdav.0";
- push @$devices, '-device', "virtserialport,chardev=foldershare,name=org.spice-space.webdav.0";
- }
+ my $localhost = PVE::Network::addr_to_ip($nodeaddrs[0]->{addr});
+ $spice_port = PVE::Tools::next_spice_port($pfamily, $localhost);
- my $spice_opts = "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on";
- $spice_opts .= ",streaming-video=$spice_enhancement->{videostreaming}"
- if $spice_enhancement->{videostreaming};
+ my $spice_enhancement_str = $conf->{spice_enhancements} // '';
+ my $spice_enhancement = parse_property_string($spice_enhancements_fmt, $spice_enhancement_str);
+ if ($spice_enhancement->{foldersharing}) {
+ push @$devices, '-chardev', "spiceport,id=foldershare,name=org.spice-space.webdav.0";
+ push @$devices, '-device', "virtserialport,chardev=foldershare,name=org.spice-space.webdav.0";
+ }
- push @$devices, '-spice', "$spice_opts";
+ my $spice_opts = "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on";
+ $spice_opts .= ",streaming-video=$spice_enhancement->{videostreaming}"
+ if $spice_enhancement->{videostreaming};
+ push @$devices, '-spice', "$spice_opts";
+ }
}
# enable balloon by default, unless explicitly disabled
--
2.39.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [pve-devel] [PATCH qemu-sever v13 1/6] enable VNC clipboard parameter in vga_fmt
2023-09-21 11:47 ` [pve-devel] [PATCH qemu-sever v13 1/6] enable VNC clipboard parameter in vga_fmt Markus Frank
@ 2023-11-10 9:33 ` Dominik Csapak
0 siblings, 0 replies; 11+ messages in thread
From: Dominik Csapak @ 2023-11-10 9:33 UTC (permalink / raw)
To: Proxmox VE development discussion, Markus Frank
one nit inline:
On 9/21/23 13:47, Markus Frank wrote:
> add option to use the qemu vdagent implementation to enable the VNC
> 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 on the guest.
>
> Signed-off-by: Markus Frank <m.frank@proxmox.com>
> ---
> PVE/API2/Qemu.pm | 7 +++++
> PVE/QemuServer.pm | 66 ++++++++++++++++++++++++++++++++++-------------
> 2 files changed, 55 insertions(+), 18 deletions(-)
>
> diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
> index 9606e72..8a2fdef 100644
> --- a/PVE/API2/Qemu.pm
> +++ b/PVE/API2/Qemu.pm
> @@ -1034,6 +1034,9 @@ __PACKAGE__->register_method({
> $conf->{boot} = PVE::QemuServer::print_bootorder($devs);
> }
>
> + my $vga = PVE::QemuServer::parse_vga($conf->{vga});
> + PVE::QemuServer::assert_clipboard_config($vga);
> +
> # auto generate uuid if user did not specify smbios1 option
> if (!$conf->{smbios1}) {
> $conf->{smbios1} = PVE::QemuServer::generate_smbios1_uuid();
> @@ -1856,6 +1859,10 @@ my $update_vm_api = sub {
> die "only root can modify '$opt' config for real devices\n";
> }
> $conf->{pending}->{$opt} = $param->{$opt};
> + } elsif ($opt eq 'vga') {
> + my $vga = PVE::QemuServer::parse_vga($param->{$opt});
> + PVE::QemuServer::assert_clipboard_config($vga);
> + $conf->{pending}->{$opt} = $param->{$opt};
> } elsif ($opt =~ m/^usb\d+/) {
> if (my $olddevice = $conf->{$opt}) {
> check_usb_perm($rpcenv, $authuser, $vmid, undef, $opt, $conf->{$opt});
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index bf1de17..2b84ed8 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -195,6 +195,13 @@ my $vga_fmt = {
> minimum => 4,
> maximum => 512,
> },
> + clipboard => {
> + description => 'Enable a specific clipboard. If not set, depending on'
> + .' the display type the SPICE one will be added.',
> + type => 'string',
> + enum => ['vnc'],
> + optional => 1,
> + },
> };
>
> my $ivshmem_fmt = {
> @@ -1375,6 +1382,21 @@ sub pve_verify_hotplug_features {
> die "unable to parse hotplug option\n";
> }
>
> +sub assert_clipboard_config {
> + my ($vga) = @_;
> +
> + my $clipboard_regex = qr/^(std|cirrus|vmware|virtio|qxl)/;
> +
> + if (
> + $vga->{'clipboard'}
> + && $vga->{'clipboard'} eq 'vnc'
> + && $vga->{type}
> + && $vga->{type} !~ $clipboard_regex
nit: there are trailing spaces here
> + ) {
> + die "vga type $vga->{type} is not compatible with VNC clipboard\n";
> + }
> +}
> +
> sub scsi_inquiry {
> my($fh, $noerr) = @_;
>
> @@ -3945,7 +3967,10 @@ sub config_to_command {
>
> my $spice_port;
>
> - if ($qxlnum || $vga->{type} =~ /^virtio/) {
> + assert_clipboard_config($vga);
> + my $is_spice = $qxlnum || $vga->{type} =~ /^virtio/;
> +
> + if ($is_spice || ($vga->{'clipboard'} && $vga->{'clipboard'} eq 'vnc')) {
> if ($qxlnum > 1) {
> if ($winversion){
> for (my $i = 1; $i < $qxlnum; $i++){
> @@ -3966,29 +3991,34 @@ sub config_to_command {
>
> my $pciaddr = print_pci_addr("spice", $bridges, $arch, $machine_type);
>
> - my $pfamily = PVE::Tools::get_host_address_family($nodename);
> - my @nodeaddrs = PVE::Tools::getaddrinfo_all('localhost', family => $pfamily);
> - 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'} && $vga->{'clipboard'} eq 'vnc') {
> + 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});
> - $spice_port = PVE::Tools::next_spice_port($pfamily, $localhost);
> + if ($is_spice) {
> + my $pfamily = PVE::Tools::get_host_address_family($nodename);
> + my @nodeaddrs = PVE::Tools::getaddrinfo_all('localhost', family => $pfamily);
> + die "failed to get an ip address of type $pfamily for 'localhost'\n" if !@nodeaddrs;
>
> - my $spice_enhancement_str = $conf->{spice_enhancements} // '';
> - my $spice_enhancement = parse_property_string($spice_enhancements_fmt, $spice_enhancement_str);
> - if ($spice_enhancement->{foldersharing}) {
> - push @$devices, '-chardev', "spiceport,id=foldershare,name=org.spice-space.webdav.0";
> - push @$devices, '-device', "virtserialport,chardev=foldershare,name=org.spice-space.webdav.0";
> - }
> + my $localhost = PVE::Network::addr_to_ip($nodeaddrs[0]->{addr});
> + $spice_port = PVE::Tools::next_spice_port($pfamily, $localhost);
>
> - my $spice_opts = "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on";
> - $spice_opts .= ",streaming-video=$spice_enhancement->{videostreaming}"
> - if $spice_enhancement->{videostreaming};
> + my $spice_enhancement_str = $conf->{spice_enhancements} // '';
> + my $spice_enhancement = parse_property_string($spice_enhancements_fmt, $spice_enhancement_str);
> + if ($spice_enhancement->{foldersharing}) {
> + push @$devices, '-chardev', "spiceport,id=foldershare,name=org.spice-space.webdav.0";
> + push @$devices, '-device', "virtserialport,chardev=foldershare,name=org.spice-space.webdav.0";
> + }
>
> - push @$devices, '-spice', "$spice_opts";
> + my $spice_opts = "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on";
> + $spice_opts .= ",streaming-video=$spice_enhancement->{videostreaming}"
> + if $spice_enhancement->{videostreaming};
> + push @$devices, '-spice', "$spice_opts";
> + }
> }
>
> # enable balloon by default, unless explicitly disabled
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH qemu-sever v13 2/6] add clipboard variable to return at status/current
2023-09-21 11:47 [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard Markus Frank
2023-09-21 11:47 ` [pve-devel] [PATCH qemu-sever v13 1/6] enable VNC clipboard parameter in vga_fmt Markus Frank
@ 2023-09-21 11:47 ` Markus Frank
2023-09-21 11:47 ` [pve-devel] [PATCH qemu-sever v13 3/6] test cases for clipboard spice & std Markus Frank
` (4 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Markus Frank @ 2023-09-21 11:47 UTC (permalink / raw)
To: pve-devel
By that noVNC is able to check if clipboard is active.
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
PVE/API2/Qemu.pm | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 8a2fdef..49d0420 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -2697,6 +2697,13 @@ __PACKAGE__->register_method({
type => 'boolean',
optional => 1,
},
+ clipboard => {
+ description => 'Enable a specific clipboard. If not set, depending on'
+ .' the display type the SPICE one will be added.',
+ type => 'string',
+ enum => ['vnc'],
+ optional => 1,
+ },
},
},
code => sub {
@@ -2715,6 +2722,7 @@ __PACKAGE__->register_method({
my $spice = defined($vga->{type}) && $vga->{type} =~ /^virtio/;
$spice ||= PVE::QemuServer::vga_conf_has_spice($conf->{vga});
$status->{spice} = 1 if $spice;
+ $status->{clipboard} = $vga->{clipboard};
}
$status->{agent} = 1 if PVE::QemuServer::get_qga_key($conf, 'enabled');
--
2.39.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH qemu-sever v13 3/6] test cases for clipboard spice & std
2023-09-21 11:47 [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard Markus Frank
2023-09-21 11:47 ` [pve-devel] [PATCH qemu-sever v13 1/6] enable VNC clipboard parameter in vga_fmt Markus Frank
2023-09-21 11:47 ` [pve-devel] [PATCH qemu-sever v13 2/6] add clipboard variable to return at status/current Markus Frank
@ 2023-09-21 11:47 ` Markus Frank
2023-09-21 11:47 ` [pve-devel] [PATCH novnc v13 4/6] add "show clipboard button" patch to series Markus Frank
` (3 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Markus Frank @ 2023-09-21 11:47 UTC (permalink / raw)
To: pve-devel
add one test case for a spice display and one for std
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
test/cfg2cmd/VNC-clipboard-spice.conf | 1 +
test/cfg2cmd/VNC-clipboard-spice.conf.cmd | 27 +++++++++++++++++++++++
test/cfg2cmd/VNC-clipboard-std.conf | 1 +
test/cfg2cmd/VNC-clipboard-std.conf.cmd | 27 +++++++++++++++++++++++
4 files changed, 56 insertions(+)
create mode 100644 test/cfg2cmd/VNC-clipboard-spice.conf
create mode 100644 test/cfg2cmd/VNC-clipboard-spice.conf.cmd
create mode 100644 test/cfg2cmd/VNC-clipboard-std.conf
create mode 100644 test/cfg2cmd/VNC-clipboard-std.conf.cmd
diff --git a/test/cfg2cmd/VNC-clipboard-spice.conf b/test/cfg2cmd/VNC-clipboard-spice.conf
new file mode 100644
index 0000000..54cfa38
--- /dev/null
+++ b/test/cfg2cmd/VNC-clipboard-spice.conf
@@ -0,0 +1 @@
+vga: qxl,clipboard=vnc
diff --git a/test/cfg2cmd/VNC-clipboard-spice.conf.cmd b/test/cfg2cmd/VNC-clipboard-spice.conf.cmd
new file mode 100644
index 0000000..f24cc7f
--- /dev/null
+++ b/test/cfg2cmd/VNC-clipboard-spice.conf.cmd
@@ -0,0 +1,27 @@
+/usr/bin/kvm \
+ -id 8006 \
+ -name 'vm8006,debug-threads=on' \
+ -no-shutdown \
+ -chardev 'socket,id=qmp,path=/var/run/qemu-server/8006.qmp,server=on,wait=off' \
+ -mon 'chardev=qmp,mode=control' \
+ -chardev 'socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5' \
+ -mon 'chardev=qmp-event,mode=control' \
+ -pidfile /var/run/qemu-server/8006.pid \
+ -daemonize \
+ -smp '1,sockets=1,cores=1,maxcpus=1' \
+ -nodefaults \
+ -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' \
+ -vnc 'unix:/var/run/qemu-server/8006.vnc,password=on' \
+ -cpu kvm64,enforce,+kvm_pv_eoi,+kvm_pv_unhalt,+lahf_lm,+sep \
+ -m 512 \
+ -device 'pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e' \
+ -device 'pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f' \
+ -device 'piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2' \
+ -device 'qxl-vga,id=vga,max_outputs=4,bus=pci.0,addr=0x2' \
+ -device 'virtio-serial,id=spice,bus=pci.0,addr=0x9' \
+ -chardev 'qemu-vdagent,id=vdagent,name=vdagent,clipboard=on' \
+ -device 'virtserialport,chardev=vdagent,name=com.redhat.spice.0' \
+ -spice 'tls-port=61000,addr=127.0.0.1,tls-ciphers=HIGH,seamless-migration=on' \
+ -device 'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3,free-page-reporting=on' \
+ -iscsi 'initiator-name=iqn.1993-08.org.debian:01:aabbccddeeff' \
+ -machine 'type=pc+pve0'
diff --git a/test/cfg2cmd/VNC-clipboard-std.conf b/test/cfg2cmd/VNC-clipboard-std.conf
new file mode 100644
index 0000000..a980f42
--- /dev/null
+++ b/test/cfg2cmd/VNC-clipboard-std.conf
@@ -0,0 +1 @@
+vga: std,clipboard=vnc
diff --git a/test/cfg2cmd/VNC-clipboard-std.conf.cmd b/test/cfg2cmd/VNC-clipboard-std.conf.cmd
new file mode 100644
index 0000000..c0c6cd2
--- /dev/null
+++ b/test/cfg2cmd/VNC-clipboard-std.conf.cmd
@@ -0,0 +1,27 @@
+/usr/bin/kvm \
+ -id 8006 \
+ -name 'vm8006,debug-threads=on' \
+ -no-shutdown \
+ -chardev 'socket,id=qmp,path=/var/run/qemu-server/8006.qmp,server=on,wait=off' \
+ -mon 'chardev=qmp,mode=control' \
+ -chardev 'socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5' \
+ -mon 'chardev=qmp-event,mode=control' \
+ -pidfile /var/run/qemu-server/8006.pid \
+ -daemonize \
+ -smp '1,sockets=1,cores=1,maxcpus=1' \
+ -nodefaults \
+ -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' \
+ -vnc 'unix:/var/run/qemu-server/8006.vnc,password=on' \
+ -cpu kvm64,enforce,+kvm_pv_eoi,+kvm_pv_unhalt,+lahf_lm,+sep \
+ -m 512 \
+ -device 'pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e' \
+ -device 'pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f' \
+ -device 'piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2' \
+ -device 'usb-tablet,id=tablet,bus=uhci.0,port=1' \
+ -device 'VGA,id=vga,bus=pci.0,addr=0x2' \
+ -device 'virtio-serial,id=spice,bus=pci.0,addr=0x9' \
+ -chardev 'qemu-vdagent,id=vdagent,name=vdagent,clipboard=on' \
+ -device 'virtserialport,chardev=vdagent,name=com.redhat.spice.0' \
+ -device 'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3,free-page-reporting=on' \
+ -iscsi 'initiator-name=iqn.1993-08.org.debian:01:aabbccddeeff' \
+ -machine 'type=pc+pve0'
--
2.39.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH novnc v13 4/6] add "show clipboard button" patch to series
2023-09-21 11:47 [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard Markus Frank
` (2 preceding siblings ...)
2023-09-21 11:47 ` [pve-devel] [PATCH qemu-sever v13 3/6] test cases for clipboard spice & std Markus Frank
@ 2023-09-21 11:47 ` Markus Frank
2023-09-21 11:47 ` [pve-devel] [PATCH manager v13 5/6] add clipboard checkbox to VM Options Markus Frank
` (2 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Markus Frank @ 2023-09-21 11:47 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
.../patches/0019-show-clipboard-button.patch | 30 +++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 31 insertions(+)
create mode 100644 debian/patches/0019-show-clipboard-button.patch
diff --git a/debian/patches/0019-show-clipboard-button.patch b/debian/patches/0019-show-clipboard-button.patch
new file mode 100644
index 0000000..b87229e
--- /dev/null
+++ b/debian/patches/0019-show-clipboard-button.patch
@@ -0,0 +1,30 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Markus Frank <m.frank@proxmox.com>
+Date: Fri, 28 Oct 2022 13:57:57 +0200
+Subject: [PATCH] show clipboard button
+
+show button when clipboard at status/current is true
+
+Signed-off-by: Markus Frank <m.frank@proxmox.com>
+---
+ app/pve.js | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/app/pve.js b/app/pve.js
+index 287615f..1b98f20 100644
+--- a/app/pve.js
++++ b/app/pve.js
+@@ -411,6 +411,10 @@ PVEUI.prototype = {
+ document.getElementById('pve_start_dlg')
+ .classList.add("noVNC_open");
+ }
++ if (result.data.clipboard === "vnc") {
++ document.getElementById('noVNC_clipboard_button')
++ .classList.remove('pve_hidden');
++ }
+ },
+ failure: function(msg, code) {
+ if (code === 403) {
+--
+2.39.2
+
diff --git a/debian/patches/series b/debian/patches/series
index 085e2b4..212add7 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -16,3 +16,4 @@
0016-hide-fullscreen-button-on-isFullscreen-get-variable.patch
0017-make-error-hideable.patch
0018-show-start-button-on-not-running-vm-ct.patch
+0019-show-clipboard-button.patch
--
2.39.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH manager v13 5/6] add clipboard checkbox to VM Options
2023-09-21 11:47 [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard Markus Frank
` (3 preceding siblings ...)
2023-09-21 11:47 ` [pve-devel] [PATCH novnc v13 4/6] add "show clipboard button" patch to series Markus Frank
@ 2023-09-21 11:47 ` Markus Frank
2023-11-10 9:34 ` Dominik Csapak
2023-09-21 11:47 ` [pve-devel] [PATCH docs v13 6/6] add VNC clipboard documentation Markus Frank
2023-11-10 9:34 ` [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard Dominik Csapak
6 siblings, 1 reply; 11+ messages in thread
From: Markus Frank @ 2023-09-21 11:47 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
www/manager6/qemu/DisplayEdit.js | 8 +++
www/manager6/qemu/Options.js | 89 ++++++++++++++++++++++++++++++++
2 files changed, 97 insertions(+)
diff --git a/www/manager6/qemu/DisplayEdit.js b/www/manager6/qemu/DisplayEdit.js
index 9bb1763e..d7cd51a9 100644
--- a/www/manager6/qemu/DisplayEdit.js
+++ b/www/manager6/qemu/DisplayEdit.js
@@ -4,6 +4,9 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
onlineHelp: 'qm_display',
onGetValues: function(values) {
+ if (typeof this.originalConfig.clipboard !== 'undefined') {
+ values.clipboard = this.originalConfig.clipboard;
+ }
let ret = PVE.Parser.printPropertyString(values, 'type');
if (ret === '') {
return { 'delete': 'vga' };
@@ -11,6 +14,11 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
return { vga: ret };
},
+ onSetValues: function(values) {
+ this.originalConfig = values;
+ return values;
+ },
+
items: [{
name: 'type',
xtype: 'proxmoxKVComboBox',
diff --git a/www/manager6/qemu/Options.js b/www/manager6/qemu/Options.js
index 7b112400..73d0c923 100644
--- a/www/manager6/qemu/Options.js
+++ b/www/manager6/qemu/Options.js
@@ -154,6 +154,95 @@ Ext.define('PVE.qemu.Options', {
},
} : undefined,
},
+ vga: {
+ header: gettext('Clipboard'),
+ defaultValue: false,
+ renderer: function(value) {
+ let vga = PVE.Parser.parsePropertyString(value, 'type');
+ if (vga.clipboard) {
+ return vga.clipboard.toUpperCase();
+ } else {
+ return Proxmox.Utils.defaultText + ' (SPICE)';
+ }
+ },
+ editor: caps.vms['VM.Config.HWType'] ? {
+ xtype: 'proxmoxWindowEdit',
+ subject: gettext('Clipboard'),
+ onlineHelp: 'qm_display',
+ items: {
+ xtype: 'pveDisplayInputPanel',
+ referenceHolder: true,
+ items: [
+ {
+ xtype: 'proxmoxKVComboBox',
+ name: 'clipboard',
+ reference: 'clipboard',
+ itemId: 'clipboardBox',
+ fieldLabel: gettext('Clipboard'),
+ deleteDefaultValue: true,
+ listeners: {
+ change: function(field, value) {
+ let inputpanel = field.up("inputpanel");
+ let vncHint = inputpanel.lookup('vncHint');
+ let defaultHint = inputpanel.lookup('defaultHint');
+ if (value === "__default__") {
+ vncHint.setVisible(false);
+ defaultHint.setVisible(true);
+ } else if (value === "vnc") {
+ vncHint.setVisible(true);
+ defaultHint.setVisible(false);
+ }
+ },
+ },
+ value: '__default__',
+ comboItems: [
+ ['__default__', Proxmox.Utils.defaultText + ' (SPICE)'],
+ ['vnc', 'VNC'],
+ ],
+ },
+ {
+ itemId: 'vncHint',
+ name: 'vncHint',
+ reference: 'vncHint',
+ xtype: 'displayfield',
+ userCls: 'pmx-hint',
+ hidden: true,
+ value: 'You cannot use the default SPICE clipboard' +
+ ' if the VNC Clipboard is selected',
+ },
+
+ {
+ itemId: 'defaultHint',
+ name: 'defaultHint',
+ reference: 'defaultHint',
+ xtype: 'displayfield',
+ userCls: 'pmx-hint',
+ hidden: false,
+ value: 'This option depends on your display type.' +
+ ' If the display type uses SPICE you are' +
+ ' able to use the default SPICE Clipboard',
+ },
+
+ ],
+ onGetValues: function(values) {
+ values = Ext.apply(this.originalConfig, values);
+ if (values.delete === "clipboard") {
+ delete values.clipboard;
+ delete values.delete;
+ }
+ let ret = PVE.Parser.printPropertyString(values, 'type');
+ if (ret === "") {
+ return { 'delete': "vga" };
+ }
+ return { vga: ret };
+ },
+ onSetValues: function(values) {
+ this.originalConfig = PVE.Parser.parsePropertyString(values.vga, 'type');
+ return this.originalConfig;
+ },
+ },
+ } : undefined,
+ },
hotplug: {
header: gettext('Hotplug'),
defaultValue: 'disk,network,usb',
--
2.39.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [pve-devel] [PATCH manager v13 5/6] add clipboard checkbox to VM Options
2023-09-21 11:47 ` [pve-devel] [PATCH manager v13 5/6] add clipboard checkbox to VM Options Markus Frank
@ 2023-11-10 9:34 ` Dominik Csapak
2023-11-10 10:00 ` Thomas Lamprecht
0 siblings, 1 reply; 11+ messages in thread
From: Dominik Csapak @ 2023-11-10 9:34 UTC (permalink / raw)
To: Proxmox VE development discussion, Markus Frank; +Cc: Thomas Lamprecht
a few nits inline:
On 9/21/23 13:47, Markus Frank wrote:
> Signed-off-by: Markus Frank <m.frank@proxmox.com>
> ---
> www/manager6/qemu/DisplayEdit.js | 8 +++
> www/manager6/qemu/Options.js | 89 ++++++++++++++++++++++++++++++++
> 2 files changed, 97 insertions(+)
>
> diff --git a/www/manager6/qemu/DisplayEdit.js b/www/manager6/qemu/DisplayEdit.js
> index 9bb1763e..d7cd51a9 100644
> --- a/www/manager6/qemu/DisplayEdit.js
> +++ b/www/manager6/qemu/DisplayEdit.js
> @@ -4,6 +4,9 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
> onlineHelp: 'qm_display',
>
> onGetValues: function(values) {
> + if (typeof this.originalConfig.clipboard !== 'undefined') {
> + values.clipboard = this.originalConfig.clipboard;
> + }
> let ret = PVE.Parser.printPropertyString(values, 'type');
> if (ret === '') {
> return { 'delete': 'vga' };
> @@ -11,6 +14,11 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
> return { vga: ret };
> },
>
> + onSetValues: function(values) {
> + this.originalConfig = values;
> + return values;
> + },
> +
> items: [{
> name: 'type',
> xtype: 'proxmoxKVComboBox',
> diff --git a/www/manager6/qemu/Options.js b/www/manager6/qemu/Options.js
> index 7b112400..73d0c923 100644
> --- a/www/manager6/qemu/Options.js
> +++ b/www/manager6/qemu/Options.js
> @@ -154,6 +154,95 @@ Ext.define('PVE.qemu.Options', {
> },
> } : undefined,
> },
> + vga: {
> + header: gettext('Clipboard'),
> + defaultValue: false,
> + renderer: function(value) {
> + let vga = PVE.Parser.parsePropertyString(value, 'type');
> + if (vga.clipboard) {
> + return vga.clipboard.toUpperCase();
> + } else {
> + return Proxmox.Utils.defaultText + ' (SPICE)';
> + }
> + },
> + editor: caps.vms['VM.Config.HWType'] ? {
> + xtype: 'proxmoxWindowEdit',
> + subject: gettext('Clipboard'),
> + onlineHelp: 'qm_display',
> + items: {
> + xtype: 'pveDisplayInputPanel',
> + referenceHolder: true,
> + items: [
> + {
> + xtype: 'proxmoxKVComboBox',
> + name: 'clipboard',
> + reference: 'clipboard',
> + itemId: 'clipboardBox',
> + fieldLabel: gettext('Clipboard'),
> + deleteDefaultValue: true,
> + listeners: {
> + change: function(field, value) {
> + let inputpanel = field.up("inputpanel");
> + let vncHint = inputpanel.lookup('vncHint');
> + let defaultHint = inputpanel.lookup('defaultHint');
> + if (value === "__default__") {
> + vncHint.setVisible(false);
> + defaultHint.setVisible(true);
> + } else if (value === "vnc") {
> + vncHint.setVisible(true);
> + defaultHint.setVisible(false);
> + }
nit: since this can only have two values currently, this could be shorter by doing:
let isVnc = value === 'vnc';
inputpanel.lookup('vncHint').setVisible(isVnc);
inputpanel.lookup('defaultHint').setVisible(!isVnc);
but no hard feelings though
> + },
> + },
> + value: '__default__',
> + comboItems: [
> + ['__default__', Proxmox.Utils.defaultText + ' (SPICE)'],
> + ['vnc', 'VNC'],
> + ],
> + },
> + {
> + itemId: 'vncHint',
> + name: 'vncHint',
> + reference: 'vncHint',
> + xtype: 'displayfield',
> + userCls: 'pmx-hint',
> + hidden: true,
> + value: 'You cannot use the default SPICE clipboard' +
> + ' if the VNC Clipboard is selected',
nit: i'd maybe like an additional sentence here that says
the user has to install the spice-tools in the guest
(to avoid confusion)
also maybe we should pack these warnings in gettexts
(what is our current policy for that regarding long texts @thomas?)
> + },
> +
> + {
> + itemId: 'defaultHint',
> + name: 'defaultHint',
> + reference: 'defaultHint',
> + xtype: 'displayfield',
> + userCls: 'pmx-hint',
> + hidden: false,
> + value: 'This option depends on your display type.' +
> + ' If the display type uses SPICE you are' +
> + ' able to use the default SPICE Clipboard',
> + },
> +
> + ],
> + onGetValues: function(values) {
> + values = Ext.apply(this.originalConfig, values);
> + if (values.delete === "clipboard") {
> + delete values.clipboard;
> + delete values.delete;
> + }
> + let ret = PVE.Parser.printPropertyString(values, 'type');
> + if (ret === "") {
> + return { 'delete': "vga" };
> + }
> + return { vga: ret };
> + },
> + onSetValues: function(values) {
> + this.originalConfig = PVE.Parser.parsePropertyString(values.vga, 'type');
> + return this.originalConfig;
> + },
> + },
> + } : undefined,
> + },
> hotplug: {
> header: gettext('Hotplug'),
> defaultValue: 'disk,network,usb',
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [pve-devel] [PATCH manager v13 5/6] add clipboard checkbox to VM Options
2023-11-10 9:34 ` Dominik Csapak
@ 2023-11-10 10:00 ` Thomas Lamprecht
0 siblings, 0 replies; 11+ messages in thread
From: Thomas Lamprecht @ 2023-11-10 10:00 UTC (permalink / raw)
To: Dominik Csapak, Proxmox VE development discussion, Markus Frank
Am 10/11/2023 um 10:34 schrieb Dominik Csapak:
>> + value: 'You cannot use the default SPICE clipboard' +
>> + ' if the VNC Clipboard is selected',
>
> nit: i'd maybe like an additional sentence here that says
> the user has to install the spice-tools in the guest
> (to avoid confusion)
>
> also maybe we should pack these warnings in gettexts
> (what is our current policy for that regarding long texts @thomas?)
The thing is: you can *never* loose with using gettext for actual text
(i.e., all but abbreviated technology terms, like VXLAN, or trade marks)
Because in the worst case nobody would going to translate it, so users
would still see the message in the original English, just as they'd if
gettext wasn't used at all.
But for a few languages we got very prolific translator, some of whom
already complained in the past about missing gettext use, so it's more
likely that these things get translated, helping users that feel more
comfortable in their native language.
So, in general, if in doubt let's use gettext, besides for the
aforementioned case, where the text consists only of abbreviations and/or
trade mark terms.
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH docs v13 6/6] add VNC clipboard documentation
2023-09-21 11:47 [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard Markus Frank
` (4 preceding siblings ...)
2023-09-21 11:47 ` [pve-devel] [PATCH manager v13 5/6] add clipboard checkbox to VM Options Markus Frank
@ 2023-09-21 11:47 ` Markus Frank
2023-11-10 9:34 ` [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard Dominik Csapak
6 siblings, 0 replies; 11+ messages in thread
From: Markus Frank @ 2023-09-21 11:47 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
qm.adoc | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/qm.adoc b/qm.adoc
index b3c3034..43c1da4 100644
--- a/qm.adoc
+++ b/qm.adoc
@@ -776,6 +776,24 @@ Selecting `serialX` as display 'type' disables the VGA output, and redirects
the Web Console to the selected serial port. A configured display 'memory'
setting will be ignored in that case.
+.VNC clipboard
+You can enable the VNC clipboard by setting `clipboard` to `vnc`.
+
+----
+# qm set <vmid> -vga <displaytype>,clipboard=vnc
+----
+
+In order to use the clipboard feature, you must first install the
+SPICE guest tools. On Debian-based distributions, this can be achieved
+by installing `spice-vdagent`. For other Operating Systems search for it
+in the offical repositories or see: https://www.spice-space.org/download.html
+
+Once you have installed the spice guest tools, you can use the VNC clipboard
+function (e.g. in the noVNC console panel). However, if you're using
+SPICE, virtio or virgl, you'll need to choose which clipboard to use.
+This is because the default *SPICE* clipboard will be replaced by the
+*VNC* clipboard, if `clipboard` is set to `vnc`.
+
[[qm_usb_passthrough]]
USB Passthrough
~~~~~~~~~~~~~~~
--
2.39.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard
2023-09-21 11:47 [pve-devel] [PATCH qemu-sever/novnc/manager/docs v13 0/6] Feature VNC-Clipboard Markus Frank
` (5 preceding siblings ...)
2023-09-21 11:47 ` [pve-devel] [PATCH docs v13 6/6] add VNC clipboard documentation Markus Frank
@ 2023-11-10 9:34 ` Dominik Csapak
6 siblings, 0 replies; 11+ messages in thread
From: Dominik Csapak @ 2023-11-10 9:34 UTC (permalink / raw)
To: Proxmox VE development discussion, Markus Frank
i tested with an ubuntu live iso (which conveniently has the
spice tools already installed and running after booting it)
found a few small nits, but those could be followed or fixed up,
not big blockers imho
aside from those, consider this series:
Reviewed-by: Dominik Csapak <d.csapak@proxmox.com>
Tested-by: Dominik Csapak <.csapak@proxmox.com>
^ permalink raw reply [flat|nested] 11+ messages in thread