summaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
authorDevaev Maxim <[email protected]>2021-04-13 09:36:44 +0300
committerDevaev Maxim <[email protected]>2021-04-13 09:36:50 +0300
commit6de0ee0017df50d155a00d748ed2b676f8293655 (patch)
treea183e310397cdb4972ee312ea498c3d1dbece6f1 /web
parenta145e7295415fbf97d36170df9a7bc1f8d59255e (diff)
simplified mouse code, fixed some bugs
Diffstat (limited to 'web')
-rw-r--r--web/share/js/kvm/mouse.js44
-rw-r--r--web/share/js/kvm/stream.js19
-rw-r--r--web/share/js/wm.js3
3 files changed, 33 insertions, 33 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;
diff --git a/web/share/js/kvm/stream.js b/web/share/js/kvm/stream.js
index 2db37608..1414bda4 100644
--- a/web/share/js/kvm/stream.js
+++ b/web/share/js/kvm/stream.js
@@ -59,7 +59,6 @@ export function Streamer() {
self.setState(__state_for_invisible);
}
};
- $("stream-window").resize_hook = __resizeHook;
};
/************************************************************************/
@@ -83,11 +82,6 @@ export function Streamer() {
}
if (state && state.streamer) {
- if (!window.ResizeObserver) {
- // Browsers that don't support this API(on lower versions of iOS for example)
- __resizeHook();
- }
-
if (!$("stream-quality-slider").activated) {
wm.setElementEnabled($("stream-quality-slider"), true);
if ($("stream-quality-slider").value !== state.streamer.encoder.quality) {
@@ -255,19 +249,6 @@ export function Streamer() {
});
};
- var __resizeHook = function() {
- let rect = $("stream-image").getBoundingClientRect();
- let width = $("stream-image").naturalWidth;
- let height = $("stream-image").naturalHeight;
- let ratio = Math.min(rect.width / width, rect.height / height);
- $("stream-box").stream_geometry = {
- "x": Math.round((rect.width - ratio * width) / 2),
- "y": Math.round((rect.height - ratio * height) / 2),
- "width": Math.round(ratio * width),
- "height": Math.round(ratio * height),
- };
- };
-
var __makeStringResolution = function(resolution) {
return `${resolution.width}x${resolution.height}`;
};
diff --git a/web/share/js/wm.js b/web/share/js/wm.js
index 49e79ecb..11d86155 100644
--- a/web/share/js/wm.js
+++ b/web/share/js/wm.js
@@ -76,9 +76,6 @@ function __WindowManager() {
if (el_window.hasAttribute("data-centered")) {
__centerWindow(el_window);
}
- if (el_window.resize_hook) {
- el_window.resize_hook();
- }
}).observe(el_window);
}