diff --git a/kvmd/apps/vnc/rfb/__init__.py b/kvmd/apps/vnc/rfb/__init__.py index 83270cb9..2b8ed499 100644 --- a/kvmd/apps/vnc/rfb/__init__.py +++ b/kvmd/apps/vnc/rfb/__init__.py @@ -590,8 +590,8 @@ class RfbClient(RfbClientStream): # pylint: disable=too-many-instance-attribute move = (self._width, self._height, to_x, to_y) if self.__mouse_move != move: await self._on_mouse_move_event( - tools.remap(to_x, 0, self._width, *MouseRange.RANGE), - tools.remap(to_y, 0, self._height, *MouseRange.RANGE), + tools.remap(to_x, 0, self._width - 1, *MouseRange.RANGE), + tools.remap(to_y, 0, self._height - 1, *MouseRange.RANGE), ) self.__mouse_move = move diff --git a/kvmd/tools.py b/kvmd/tools.py index 8f82fbe5..b38ce6c6 100644 --- a/kvmd/tools.py +++ b/kvmd/tools.py @@ -33,7 +33,8 @@ from typing import TypeVar # ===== def remap(value: int, in_min: int, in_max: int, out_min: int, out_max: int) -> int: - return int((value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min) + result = int((value - in_min) * (out_max - out_min) // ((in_max - in_min) or 1) + out_min) + return min(max(result, out_min), out_max) # ===== diff --git a/web/share/js/kvm/mouse.js b/web/share/js/kvm/mouse.js index f246c3f1..b19fbfd1 100644 --- a/web/share/js/kvm/mouse.js +++ b/web/share/js/kvm/mouse.js @@ -380,8 +380,8 @@ export function Mouse(__getGeometry, __recordWsEvent) { if (pos !== null && (pos.x !== __sent_pos.x || pos.y !== __sent_pos.y)) { let geo = __getGeometry(); let to = { - "x": tools.remap(pos.x, geo.x, geo.width, -32768, 32767), - "y": tools.remap(pos.y, geo.y, geo.height, -32768, 32767), + "x": tools.remap(pos.x - geo.x, 0, geo.width - 1, -32768, 32767), + "y": tools.remap(pos.y - geo.y, 0, geo.height - 1, -32768, 32767), }; tools.debug("Mouse: moved:", to); __sendEvent("mouse_move", {"to": to}); diff --git a/web/share/js/kvm/ocr.js b/web/share/js/kvm/ocr.js index a3dbc492..398b721d 100644 --- a/web/share/js/kvm/ocr.js +++ b/web/share/js/kvm/ocr.js @@ -137,10 +137,10 @@ export function Ocr(__getGeometry) { let rel_bottom = Math.max(__start_pos.y, __end_pos.y) - rect.top + offset; let geo = __getGeometry(); __sel = { - "left": tools.remap(rel_left, geo.x, geo.width, 0, geo.real_width), - "right": tools.remap(rel_right, geo.x, geo.width, 0, geo.real_width), - "top": tools.remap(rel_top, geo.y, geo.height, 0, geo.real_height), - "bottom": tools.remap(rel_bottom, geo.y, geo.height, 0, geo.real_height), + "left": tools.remap(rel_left - geo.x, 0, geo.width, 0, geo.real_width), + "right": tools.remap(rel_right - geo.x, 0, geo.width, 0, geo.real_width), + "top": tools.remap(rel_top - geo.y, 0, geo.height, 0, geo.real_height), + "bottom": tools.remap(rel_bottom - geo.y, 0, geo.height, 0, geo.real_height), }; } else { __sel = null; diff --git a/web/share/js/tools.js b/web/share/js/tools.js index 4965a693..efe33a2f 100644 --- a/web/share/js/tools.js +++ b/web/share/js/tools.js @@ -136,14 +136,9 @@ export var tools = new function() { return `${hours}:${mins}:${secs}.${millis}`; }; - self.remap = function(x, a1, b1, a2, b2) { - let remapped = Math.round((x - a1) / b1 * (b2 - a2) + a2); - if (remapped < a2) { - return a2; - } else if (remapped > b2) { - return b2; - } - return remapped; + self.remap = function(value, in_min, in_max, out_min, out_max) { + let result = Math.round((value - in_min) * (out_max - out_min) / ((in_max - in_min) || 1) + out_min); + return Math.min(Math.max(result, out_min), out_max); }; self.getRandomInt = function(min, max) {