Use a convergence factor to make the VM's input global coordinates more closely approach the global coordinates of DOM0.
Change-Id: I2c3f12f1fe7dfb9306d1fc40c4fd4d299937f4c6 Signed-off-by: Lei Huang <lei.hu...@amd.com> --- ui/sdl2.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/ui/sdl2.c b/ui/sdl2.c index bd4f5a9da14..8f504dd8727 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -303,6 +303,34 @@ static void sdl_mouse_mode_change(Notifier *notify, void *data) } } +/* + *guest_x and guest_y represent the global coordinates on the VM side, + *while x and y represent the global coordinates on the dom0 side. + *The goal of this entire process is to align the global coordinates of + *the VM with those of dom0 using dx and dy. The current approach aims + *for precise calibration in once attempt; however, because guest_x + *and guest_y are non-zero values, they are not accurate values when + *they are counted out to become negative.Therefore, achieving perfect + *alignment in one attempt is impossible.Since the same calibration method + *is used each time, repeated attempts cannot achieve alignment either. + *By introducing a convergence factor, guest_x and guest_y can be made to + *approach dom0's x and y indefinitely. + * + * QEMU (dx,dy) VM + *calculates dx and dy using guest_x and guest_y ----> input driver + * ^ | + * | | + * | V + * | update + * | guest_x,guest_y input dispatcher ---> WindowManager + * | | | + * | | | + * | libdrm V | + * virtio-gpu <------ drmModeMoveCursor <------ compositor <------- | + * (guest_x,guest_y) calculates guest_x and + * guest_y dy using dx and dy + */ +#define CONVERGENCE_FACTOR 3 static void sdl_send_mouse_event(struct sdl2_console *scon, int dx, int dy, int x, int y, int state) { @@ -331,8 +359,8 @@ static void sdl_send_mouse_event(struct sdl2_console *scon, int dx, int dy, y -= guest_y; guest_x += x; guest_y += y; - dx = x; - dy = y; + dx = x / CONVERGENCE_FACTOR; + dy = y / CONVERGENCE_FACTOR; } qemu_input_queue_rel(scon->dcl.con, INPUT_AXIS_X, dx); qemu_input_queue_rel(scon->dcl.con, INPUT_AXIS_Y, dy); -- 2.45.2