qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: "Gao,Shiyuan" <gaoshiyuan@baidu.com>
Cc: "kraxel@redhat.com" <kraxel@redhat.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	 "mark.cave-ayland@ilande.co.uk" <mark.cave-ayland@ilande.co.uk>,
	 "peter.maydell@linaro.org" <peter.maydell@linaro.org>
Subject: Re: [PATCH] vnc,ps2: fix the PS/2 mouse work badly when connect VNC
Date: Mon, 17 Jul 2023 13:16:41 +0400	[thread overview]
Message-ID: <CAMxuvaxssGvBLb-gFFEibDcQ+MJyorDJi-xSMTBVRCNyVyFVqA@mail.gmail.com> (raw)
In-Reply-To: <EF20B207-4AAE-4A30-8D0B-CB208867756A@baidu.com>

[-- Attachment #1: Type: text/plain, Size: 5423 bytes --]

Hi

On Mon, Jul 17, 2023 at 12:54 PM Gao,Shiyuan <gaoshiyuan@baidu.com> wrote:

> Hi,
> > Hi Shiyuan
> >
> > On Mon, Jul 17, 2023 at 7:16 AM Shiyuan Gao <gaoshiyuan@baidu.com>
> wrote:
> >
> > > When only use PS/2 mouse without usb-tablet, the mouse pointer of the
> > > guest on the VNC will work badly that the cursor of VNC is inconsistent
> > > with the mouse pointer of guest.
> > >
> > >
> > Afaik, VNC doesn't support client-side drawing of guest mouse (there are
> no
> > message to set guest mouse position). So the guest mouse should be drawn
> by
> > the server, and currently QEMU doesn't do it.
> >
> >
> > > The reason is the PS/2 mouse use relative coordinates and we can't know
> > > the initial position of the guest mouse pointer.
> > >
> >
> > It's not just about the initial position.
>
> Now pointer_event use the cursor of VNC init the vs->last_x, vs->last_y
> when
> connect the VNC and the relative coordinates is based on VNC cursor. If the
> initial position of VNC cursor is inconsistent with guest mouse, the
> inconsistency will keep. I think the root cause is we cann't know the
> postion
> of the guest mouse pointer.
>

last_x/last_y is only used when the client doesn't support relative motion
(pointer-motion change pseudo encoding): it doesn't have a direct relation
with the guest pointer position, it's only use to compute the relative
motion of the client pointer as a fallback.


> >
> > >
> > >
> > So move the guest mouse pointer to (0, 0) of the screen when connect the
> > > VNC, and then move the mouse pointer to the cursor of VNC(absolute
> > > coordinates are also relative coordinates).
> > >
> > >
> > It's hardly a solution, you still have no clue what will be the guest
> mouse
> > position.
>
> We have no clue what will be the guest mouse position, we can move the
> guest
> mouse to (0,0) each connect the VNC. Now, the cursor of VNC will be the
> relative coordinates. In a way, this is a quirk to know the guest mouse
> position.
>

There is no guarantee the guest pointer will be at (0,0) though, and that
doesn't explain how that would help. Which client are you using? Are you
drawing the guest cursor? This can't be done currently with the lack of a
message to tell the guest mouse position. (moving / sync-ing the client
cursor position would be even worse in many ways)


> >
> >
> > > On windows VM, also need disable "Enhance Pointer Precision" Option in
> > > "Pointer Options" (Control Panel -> Mouse).
> > >
> > >
> > Apparently, this option doesn't have much to do with relative mouse
> motion.
> > Can you explain what it does with this change?
>
> Emmm, I don't know why this can solve the problem. It's quite effective and
> get this way from
>
> https://forum.proxmox.com/threads/is-it-possible-not-to-use-usbdevice-tablet.1498/
> .
>
> Only use this way, we need to manually align the VNC cursor with the guest
> mouse.
>

It's a bit vague what the "VNC cursor" mean. If you mean the client cursor
position, there is no way to align / sync with the guest without an extra
message to inform the client of its position. There is even a comment about
that in vnc.c  /* can we ask the client(s) to move the pointer ??? */)



> >
> > Which guest OS are you using? Hopefully they all support either
> usb-tablet
> > or vmmouse extension for absolute positioning. Otherwise, I'd suggest
> using
> > Spice, which has those messages for client side guest-mouse drawing.
> >
>
> Yeah, I know the best way is use a absolute positioning. We need remove
> all usb devices,
> I can only use the PS/2 mouse.
>

Can't you use vmmouse extension?


>
> Anyway, when connecting to VNC, move the mouse to the upper left corner,
> at least not
> to make things worse.
>
> >
> > > Signed-off-by: Shiyuan Gao <gaoshiyuan@baidu.com>
> > > ---
> > >  hw/input/ps2.c | 2 +-
> > >  ui/vnc.c       | 5 +++++
> > >  2 files changed, 6 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/hw/input/ps2.c b/hw/input/ps2.c
> > > index 45af76a837..e1f44bd298 100644
> > > --- a/hw/input/ps2.c
> > > +++ b/hw/input/ps2.c
> > > @@ -77,7 +77,7 @@
> > >  #define MOUSE_STATUS_ENABLED    0x20
> > >  #define MOUSE_STATUS_SCALE21    0x10
> > >
> > > -#define PS2_QUEUE_SIZE      16  /* Queue size required by PS/2
> protocol */
> > > +#define PS2_QUEUE_SIZE      32  /* Queue size required by PS/2
> protocol */
> > >  #define PS2_QUEUE_HEADROOM  8   /* Queue size for keyboard command
> > > replies */
> > >
> > >  /* Bits for 'modifiers' field in PS2KbdState */
> > > diff --git a/ui/vnc.c b/ui/vnc.c
> > > index 92964dcc0c..a1a6048ee4 100644
> > > --- a/ui/vnc.c
> > > +++ b/ui/vnc.c
> > > @@ -1816,6 +1816,11 @@ static void pointer_event(VncState *vs, int
> > > button_mask, int x, int y)
> > >          if (vs->last_x != -1) {
> > >              qemu_input_queue_rel(con, INPUT_AXIS_X, x - vs->last_x);
> > >              qemu_input_queue_rel(con, INPUT_AXIS_Y, y - vs->last_y);
> > > +        } else {
> > > +            qemu_input_queue_rel(con, INPUT_AXIS_X, 0 - width);
> > > +            qemu_input_queue_rel(con, INPUT_AXIS_Y, 0 - height);
> > > +            x = 0;
> > > +            y = 0;
> > >          }
> > >          vs->last_x = x;
> > >          vs->last_y = y;
> > > --
> > > 2.27.0
> > >
> > >
>
>

[-- Attachment #2: Type: text/html, Size: 7489 bytes --]

  reply	other threads:[~2023-07-17  9:17 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-17  2:59 [PATCH] vnc,ps2: fix the PS/2 mouse work badly when connect VNC Shiyuan Gao
2023-07-17  7:40 ` Marc-André Lureau
2023-07-17  8:53   ` Gao,Shiyuan
2023-07-17  9:16     ` Marc-André Lureau [this message]
2023-07-17 10:05       ` Daniel P. Berrangé
2023-07-17 12:52       ` Gao,Shiyuan
2023-07-17 13:12         ` Marc-André Lureau
2023-07-17 13:41           ` Gao,Shiyuan
2023-07-17 14:05             ` Marc-André Lureau
2023-07-18  2:07               ` Gao,Shiyuan
2023-07-17 10:04 ` Daniel P. Berrangé
2023-07-17 12:49   ` Gao,Shiyuan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAMxuvaxssGvBLb-gFFEibDcQ+MJyorDJi-xSMTBVRCNyVyFVqA@mail.gmail.com \
    --to=marcandre.lureau@redhat.com \
    --cc=gaoshiyuan@baidu.com \
    --cc=kraxel@redhat.com \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).