diff options
author | Devaev Maxim <[email protected]> | 2021-04-13 09:36:44 +0300 |
---|---|---|
committer | Devaev Maxim <[email protected]> | 2021-04-13 09:36:50 +0300 |
commit | 6de0ee0017df50d155a00d748ed2b676f8293655 (patch) | |
tree | a183e310397cdb4972ee312ea498c3d1dbece6f1 /web/share/js/kvm/mouse.js | |
parent | a145e7295415fbf97d36170df9a7bc1f8d59255e (diff) |
simplified mouse code, fixed some bugs
Diffstat (limited to 'web/share/js/kvm/mouse.js')
-rw-r--r-- | web/share/js/kvm/mouse.js | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/web/share/js/kvm/mouse.js b/web/share/js/kvm/mouse.js index 2893a5ae..bae2f15b 100644 --- a/web/share/js/kvm/mouse.js +++ b/web/share/js/kvm/mouse.js @@ -210,16 +210,14 @@ export function Mouse(record_callback) { if (__absolute) { let pos = __current_pos; if (pos.x !== __sent_pos.x || pos.y !== __sent_pos.y) { - let geometry = $("stream-box").stream_geometry; - if (geometry) { - let to = { - x: __translate(pos.x, geometry.x, geometry.width, -32768, 32767), - y: __translate(pos.y, geometry.y, geometry.height, -32768, 32767), - }; - tools.debug("Mouse: moved:", to); - __sendEvent("mouse_move", {"to": to}); - __sent_pos = pos; - } + let geo = __getVideoGeometry(); + let to = { + "x": __translatePosition(pos.x, geo.x, geo.width, -32768, 32767), + "y": __translatePosition(pos.y, geo.y, geo.height, -32768, 32767), + }; + tools.debug("Mouse: moved:", to); + __sendEvent("mouse_move", {"to": to}); + __sent_pos = pos; } } else if (__relative_deltas.length) { tools.debug("Mouse: relative:", __relative_deltas); @@ -228,7 +226,31 @@ export function Mouse(record_callback) { } }; - var __translate = function(x, a, b, c, d) { + var __getVideoGeometry = function() { + // Первоначально обновление геометрии считалось через ResizeObserver. + // Но оно не ловило некоторые события, например в последовательности: + // - Находять в HD переходим в фулскрин + // - Меняем разрешение на маленькое + // - Убираем фулскрин + // - Переходим в HD + // - Видим нарушение пропорций + // Так что теперь используются быстре рассчеты через offset* + // вместо getBoundingClientRect(). + let el_image = $("stream-image"); + let real_width = el_image.naturalWidth; + let real_height = el_image.naturalHeight; + let view_width = el_image.offsetWidth; + let view_height = el_image.offsetHeight; + let ratio = Math.min(view_width / real_width, view_height / real_height); + return { + "x": Math.round((view_width - ratio * real_width) / 2), + "y": Math.round((view_height - ratio * real_height) / 2), + "width": Math.round(ratio * real_width), + "height": Math.round(ratio * real_height), + }; + }; + + var __translatePosition = function(x, a, b, c, d) { let translated = Math.round((x - a) / b * (d - c) + c); if (translated < c) { return c; |