Hi On Mon, Jul 17, 2023 at 12:54 PM Gao,Shiyuan <[email protected]> wrote:
> Hi, > > Hi Shiyuan > > > > On Mon, Jul 17, 2023 at 7:16 AM Shiyuan Gao <[email protected]> > 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 <[email protected]> > > > --- > > > 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 > > > > > > > >
