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