mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-03-11 07:11:01 +03:00
fix: wayland controlled side, cursor misalignment (#13537)
Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
@@ -18,7 +18,8 @@ function isEnterKey(evt) {
|
||||
|
||||
function getScaleFactor() {
|
||||
if (!is_win) return 1;
|
||||
return self.toPixels(10000dip) / 10000.;
|
||||
var s = self.toPixels(10000dip) / 10000.;
|
||||
return s < 0.000001 ? 1 : s;
|
||||
}
|
||||
var scaleFactor = getScaleFactor();
|
||||
view << event resolutionchange {
|
||||
|
||||
@@ -125,8 +125,9 @@ impl InvokeUiSession for SciterHandler {
|
||||
}
|
||||
}
|
||||
|
||||
fn set_display(&self, x: i32, y: i32, w: i32, h: i32, cursor_embedded: bool) {
|
||||
self.call("setDisplay", &make_args!(x, y, w, h, cursor_embedded));
|
||||
fn set_display(&self, x: i32, y: i32, w: i32, h: i32, cursor_embedded: bool, scale: f64) {
|
||||
let scale = if scale <= 0.0 { 1.0 } else { scale };
|
||||
self.call("setDisplay", &make_args!(x, y, w, h, cursor_embedded, scale));
|
||||
// https://sciter.com/forums/topic/color_spaceiyuv-crash
|
||||
// Nothing spectacular in decoder – done on CPU side.
|
||||
// So if you can do BGRA translation on your side – the better.
|
||||
|
||||
@@ -4,10 +4,13 @@ var is_port_forward = handler.is_port_forward();
|
||||
var input_blocked = false;
|
||||
var display_width = 0;
|
||||
var display_height = 0;
|
||||
var display_remote_scale = 1;
|
||||
var display_origin_x = 0;
|
||||
var display_origin_y = 0;
|
||||
var display_cursor_embedded = false;
|
||||
var display_scale = 1;
|
||||
// the scale factor is different from `display_scale` if peer platform is Linux (Wayland).
|
||||
var cursor_scale = 1;
|
||||
var keyboard_enabled = true; // server side
|
||||
var clipboard_enabled = true; // server side
|
||||
var audio_enabled = true; // server side
|
||||
@@ -15,13 +18,15 @@ var file_enabled = true; // server side
|
||||
var restart_enabled = true; // server side
|
||||
var recording_enabled = true; // server side
|
||||
var scroll_body = $(body);
|
||||
var peer_platform = "";
|
||||
|
||||
handler.setDisplay = function(x, y, w, h, cursor_embedded) {
|
||||
handler.setDisplay = function(x, y, w, h, cursor_embedded, scale) {
|
||||
display_width = w;
|
||||
display_height = h;
|
||||
display_origin_x = x;
|
||||
display_origin_y = y;
|
||||
display_cursor_embedded = cursor_embedded;
|
||||
display_remote_scale = scale;
|
||||
adaptDisplay();
|
||||
if (recording) handler.record_screen(true, 0, w, h);
|
||||
}
|
||||
@@ -29,12 +34,24 @@ handler.setDisplay = function(x, y, w, h, cursor_embedded) {
|
||||
// in case toolbar not shown correctly
|
||||
view.windowMinSize = (scaleIt(500), scaleIt(300));
|
||||
|
||||
function get_peer_platform() {
|
||||
if (peer_platform == "") {
|
||||
peer_platform = handler.peer_platform();
|
||||
}
|
||||
return peer_platform;
|
||||
}
|
||||
|
||||
function isRemoteLinux() {
|
||||
return get_peer_platform() == "Linux";
|
||||
}
|
||||
|
||||
function adaptDisplay() {
|
||||
var w = display_width;
|
||||
var h = display_height;
|
||||
if (!w || !h) return;
|
||||
var style = handler.get_view_style();
|
||||
display_scale = 1.;
|
||||
cursor_scale = 1.;
|
||||
var (sx, sy, sw, sh) = view.screenBox(view.windowState == View.WINDOW_FULL_SCREEN ? #frame : #workarea, #rectw);
|
||||
if (sw >= w && sh > h) {
|
||||
var hh = $(header).box(#height, #border);
|
||||
@@ -71,6 +88,10 @@ function adaptDisplay() {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isRemoteLinux()) {
|
||||
cursor_scale = display_scale * display_remote_scale;
|
||||
if (cursor_scale <= 0.0001) cursor_scale = 1.;
|
||||
}
|
||||
refreshCursor();
|
||||
handler.style.set {
|
||||
width: w / scaleFactor + "px",
|
||||
@@ -279,7 +300,7 @@ function handler.onMouse(evt)
|
||||
entered = false;
|
||||
stdout.println("leave");
|
||||
handler.leave(handler.get_keyboard_mode());
|
||||
if (is_left_down && handler.peer_platform() == "Android") {
|
||||
if (is_left_down && get_peer_platform() == "Android") {
|
||||
is_left_down = false;
|
||||
handler.send_mouse((1 << 3) | 2, 0, 0, evt.altKey,
|
||||
evt.ctrlKey, evt.shiftKey, evt.commandKey);
|
||||
@@ -303,8 +324,8 @@ function handler.onMouse(evt)
|
||||
resetWheel();
|
||||
}
|
||||
if (!keyboard_enabled) return false;
|
||||
x = (x / display_scale).toInteger();
|
||||
y = (y / display_scale).toInteger();
|
||||
x = (x / cursor_scale).toInteger();
|
||||
y = (y / cursor_scale).toInteger();
|
||||
// insert down between two up, osx has this behavior for triple click
|
||||
if (last_mouse_mask == 2 && mask == 2) {
|
||||
handler.send_mouse((evt.buttons << 3) | 1, 0, 0, evt.altKey,
|
||||
@@ -339,14 +360,18 @@ var cursors = {};
|
||||
var image_binded;
|
||||
|
||||
function scaleCursorImage(img) {
|
||||
var w = (img.width * display_scale).toInteger();
|
||||
var h = (img.height * display_scale).toInteger();
|
||||
var factor = cursor_scale;
|
||||
if (cursor_img.style#display != 'none') {
|
||||
factor /= scaleFactor;
|
||||
}
|
||||
var w = (img.width * factor).toInteger();
|
||||
var h = (img.height * factor).toInteger();
|
||||
cursor_img.style.set {
|
||||
width: w + "px",
|
||||
height: h + "px",
|
||||
};
|
||||
self.bindImage("in-memory:cursor", img);
|
||||
if (display_scale == 1) return img;
|
||||
if (factor == 1) return img;
|
||||
function paint(gfx) {
|
||||
gfx.drawImage(img, 0, 0, w, h);
|
||||
}
|
||||
@@ -360,7 +385,7 @@ function updateCursor(system=false) {
|
||||
if (system) {
|
||||
handler.style#cursor = undefined;
|
||||
} else if (cur_img) {
|
||||
handler.style.cursor(cur_img, (cur_hotx * display_scale).toInteger(), (cur_hoty * display_scale).toInteger());
|
||||
handler.style.cursor(cur_img, (cur_hotx * cursor_scale).toInteger(), (cur_hoty * cursor_scale).toInteger());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -413,14 +438,15 @@ handler.setCursorPosition = function(x, y) {
|
||||
cur_y = y - display_origin_y;
|
||||
var x = cur_x - cur_hotx;
|
||||
var y = cur_y - cur_hoty;
|
||||
x *= display_scale / scaleFactor;
|
||||
y *= display_scale / scaleFactor;
|
||||
x *= cursor_scale / scaleFactor;
|
||||
y *= cursor_scale / scaleFactor;
|
||||
cursor_img.style.set {
|
||||
left: x + "px",
|
||||
top: y + "px",
|
||||
};
|
||||
if (cursor_img.style#display == 'none') {
|
||||
cursor_img.style#display = "block";
|
||||
refreshCursor();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user