From nobody Tue Nov 18 01:22:22 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1606994526; cv=none; d=zohomail.com; s=zohoarc; b=eInWRYZlF/Wj2wy1d9kyi3OByp/shSHQ9j0uG4hB934bpc8492YnuvhJqhOWpPUtLa64VKR0BY/MjYKcanzH4qKI5w1VbJEz5G1Jw17WP29tCe8azkfp5a+PbqH4PkE2IDDgV1uiHw42DGy7N8VuyvUYlFc5PN0E1hCSIKpfYzE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1606994526; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=fUcqX1+xwhtrDI47EC2Ns9GPCwXdBfst/FQ68qYcyTc=; b=iZxT6czd/QTz36CBI+zLkCZU7ns4/qcTxRXqx8IIgS2pbCnnlzxspFB26/mWjYv68e3GGjdZ0E6E5mX0A9/6RUoYxCuXiPDOemWbD9Wzjxs/ftjB3S+jmdcqksNmhiQFZOSyoJsxU56Kzm6HNg47URIE1Wag+9py6mQOv/DnEMU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1606994526441171.82089824646198; Thu, 3 Dec 2020 03:22:06 -0800 (PST) Received: from localhost ([::1]:49366 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kkmYn-0002R5-Ds for importer@patchew.org; Thu, 03 Dec 2020 06:14:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:50682) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kkmTF-0003Ap-JL for qemu-devel@nongnu.org; Thu, 03 Dec 2020 06:08:21 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:26286) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kkmT9-0006dW-MW for qemu-devel@nongnu.org; Thu, 03 Dec 2020 06:08:21 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-213-j8NN9ZIoMg6cDB-eyq1D3w-1; Thu, 03 Dec 2020 06:08:12 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5D3A78049EF for ; Thu, 3 Dec 2020 11:08:11 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-112-94.ams2.redhat.com [10.36.112.94]) by smtp.corp.redhat.com (Postfix) with ESMTP id EA93C5C1BD; Thu, 3 Dec 2020 11:08:10 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 56C379DA0; Thu, 3 Dec 2020 12:08:06 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1606993695; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fUcqX1+xwhtrDI47EC2Ns9GPCwXdBfst/FQ68qYcyTc=; b=QZWmuFgKLh9YyHluPJ9RtGUk/UUyQvzjXlGoBrAc16oPAF6qWoLaMsARXozaRL6jjXsuUJ UNn7SGtmdSdTYqRL3ngr/erBxs0XXhB9UMcKA9n7+ncFjYAplmmpvgCmtYA3r7DTbeE+Lb BJfh6CEhcppvqib0OO316T900SreBdM= X-MC-Unique: j8NN9ZIoMg6cDB-eyq1D3w-1 From: Gerd Hoffmann To: qemu-devel@nongnu.org Subject: [PATCH 8/9] vnc: add support for extended desktop resize Date: Thu, 3 Dec 2020 12:08:04 +0100 Message-Id: <20201203110806.13556-9-kraxel@redhat.com> In-Reply-To: <20201203110806.13556-1-kraxel@redhat.com> References: <20201203110806.13556-1-kraxel@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kraxel@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=kraxel@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -35 X-Spam_score: -3.6 X-Spam_bar: --- X-Spam_report: (-3.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.495, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" The extended desktop resize encoding adds support for (a) clients sending resize requests to the server, and (b) multihead support. This patch implements (a). All resize requests are rejected by qemu. Qemu can't resize the framebuffer on its own, this is in the hands of the guest, so all qemu can do is forward the request to the guest. Should the guest actually resize the framebuffer we can notify the vnc client later with a separate message. This requires support in the display device. Works with virtio-gpu. https://github.com/rfbproto/rfbproto/blob/master/rfbproto.rst#extendeddeskt= opsize-pseudo-encoding Signed-off-by: Gerd Hoffmann Reviewed-by: Marc-Andr=C3=A9 Lureau --- ui/vnc.h | 2 ++ ui/vnc.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/ui/vnc.h b/ui/vnc.h index c8d3ad9ec496..77a310947bd6 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -442,6 +442,7 @@ enum { =20 enum VncFeatures { VNC_FEATURE_RESIZE, + VNC_FEATURE_RESIZE_EXT, VNC_FEATURE_HEXTILE, VNC_FEATURE_POINTER_TYPE_CHANGE, VNC_FEATURE_WMVI, @@ -456,6 +457,7 @@ enum VncFeatures { }; =20 #define VNC_FEATURE_RESIZE_MASK (1 << VNC_FEATURE_RESIZE) +#define VNC_FEATURE_RESIZE_EXT_MASK (1 << VNC_FEATURE_RESIZE_EXT) #define VNC_FEATURE_HEXTILE_MASK (1 << VNC_FEATURE_HEXTILE) #define VNC_FEATURE_POINTER_TYPE_CHANGE_MASK (1 << VNC_FEATURE_POINTER_TYP= E_CHANGE) #define VNC_FEATURE_WMVI_MASK (1 << VNC_FEATURE_WMVI) diff --git a/ui/vnc.c b/ui/vnc.c index bdaf384f71a4..a15132faa96f 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -663,10 +663,35 @@ void vnc_framebuffer_update(VncState *vs, int x, int = y, int w, int h, vnc_write_s32(vs, encoding); } =20 +static void vnc_desktop_resize_ext(VncState *vs, bool reject) +{ + vnc_lock_output(vs); + vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE); + vnc_write_u8(vs, 0); + vnc_write_u16(vs, 1); /* number of rects */ + vnc_framebuffer_update(vs, + reject ? 1 : 0, + reject ? 3 : 0, + vs->client_width, vs->client_height, + VNC_ENCODING_DESKTOP_RESIZE_EXT); + vnc_write_u8(vs, 1); /* number of screens */ + vnc_write_u8(vs, 0); /* padding */ + vnc_write_u8(vs, 0); /* padding */ + vnc_write_u8(vs, 0); /* padding */ + vnc_write_u32(vs, 0); /* screen id */ + vnc_write_u16(vs, 0); /* screen x-pos */ + vnc_write_u16(vs, 0); /* screen y-pos */ + vnc_write_u16(vs, vs->client_width); + vnc_write_u16(vs, vs->client_height); + vnc_write_u32(vs, 0); /* screen flags */ + vnc_unlock_output(vs); + vnc_flush(vs); +} =20 static void vnc_desktop_resize(VncState *vs, bool force) { - if (vs->ioc =3D=3D NULL || !vnc_has_feature(vs, VNC_FEATURE_RESIZE)) { + if (vs->ioc =3D=3D NULL || (!vnc_has_feature(vs, VNC_FEATURE_RESIZE) && + !vnc_has_feature(vs, VNC_FEATURE_RESIZE_EXT)))= { return; } if (vs->client_width =3D=3D pixman_image_get_width(vs->vd->server) && @@ -681,6 +706,12 @@ static void vnc_desktop_resize(VncState *vs, bool forc= e) pixman_image_get_height(vs->vd->server) >=3D 0); vs->client_width =3D pixman_image_get_width(vs->vd->server); vs->client_height =3D pixman_image_get_height(vs->vd->server); + + if (vnc_has_feature(vs, VNC_FEATURE_RESIZE_EXT)) { + vnc_desktop_resize_ext(vs, false); + return; + } + vnc_lock_output(vs); vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE); vnc_write_u8(vs, 0); @@ -2110,6 +2141,9 @@ static void set_encodings(VncState *vs, int32_t *enco= dings, size_t n_encodings) case VNC_ENCODING_DESKTOPRESIZE: vs->features |=3D VNC_FEATURE_RESIZE_MASK; break; + case VNC_ENCODING_DESKTOP_RESIZE_EXT: + vs->features |=3D VNC_FEATURE_RESIZE_EXT_MASK; + break; case VNC_ENCODING_POINTER_TYPE_CHANGE: vs->features |=3D VNC_FEATURE_POINTER_TYPE_CHANGE_MASK; break; @@ -2431,6 +2465,34 @@ static int protocol_client_msg(VncState *vs, uint8_t= *data, size_t len) break; } break; + case VNC_MSG_CLIENT_SET_DESKTOP_SIZE: + { + size_t size; + uint8_t screens; + uint16_t width; + uint16_t height; + QemuUIInfo info; + + if (len < 8) { + return 8; + } + + screens =3D read_u8(data, 6); + size =3D 8 + screens * 16; + if (len < size) { + return size; + } + + width =3D read_u16(data, 2); + height =3D read_u16(data, 4); + vnc_desktop_resize_ext(vs, true); + + memset(&info, 0, sizeof(info)); + info.width =3D width; + info.height =3D height; + dpy_set_ui_info(vs->vd->dcl.con, &info); + break; + } default: VNC_DEBUG("Msg: %d\n", data[0]); vnc_client_error(vs); --=20 2.27.0