Przeglądaj źródła

remote desktop improvements

main
Martin Dørum 2 lat temu
rodzic
commit
7b498fc353
3 zmienionych plików z 83 dodań i 24 usunięć
  1. 1
    2
      main.go
  2. 79
    22
      web/remote.html
  3. 3
    0
      web/util.js

+ 1
- 2
main.go Wyświetl plik

} }
})) }))


http.HandleFunc("/api/remote/keyboard-keys", handler(func(w RW, req *Req) error {
http.HandleFunc("/api/remote/keyboard-key", handler(func(w RW, req *Req) error {
if req.Method == "POST" { if req.Method == "POST" {
var key KeyboardKeyData var key KeyboardKeyData
err := json.NewDecoder(req.Body).Decode(&key) err := json.NewDecoder(req.Body).Decode(&key)


for { for {
img := <-screencap.Capture() img := <-screencap.Capture()
log.Printf("Got image, %v bytes", img.Length)


var err error var err error
_, err = w.Write([]byte(fmt.Sprintf( _, err = w.Write([]byte(fmt.Sprintf(

+ 79
- 22
web/remote.html Wyświetl plik

position: absolute; position: absolute;
left: 0px; left: 0px;
top: 0px; top: 0px;
pointer-events: none;
} }


#screencast-container { #screencast-container {
</div> </div>


<form id="text-form"> <form id="text-form">
<input name="text" type="text">
<input id="text" name="text" type="text">
</form> </form>


<script src="util.js"></script> <script src="util.js"></script>
let screencastEl = document.getElementById("screencast"); let screencastEl = document.getElementById("screencast");
let screencastContainerEl = document.getElementById("screencast-container"); let screencastContainerEl = document.getElementById("screencast-container");
let textFormEl = document.getElementById("text-form"); let textFormEl = document.getElementById("text-form");
let textEl = document.getElementById("text");
let screencastSrc = screencastEl.src;

window.addEventListener("blur", () => {
let canvas = document.createElement("canvas");
canvas.width = screencastEl.width;
canvas.height = screencastEl.height;
let ctx = canvas.getContext("2d");
ctx.drawImage(screencastEl, 0, 0, canvas.width, canvas.height);
screencastEl.src = canvas.toDataURL();
});

window.addEventListener("focus", () => {
screencastEl.src = screencastSrc;
});

window.addEventListener("keydown", evt => {
let handled = true;
console.log("key:", evt.key);
if (evt.key == " ") {
api("POST", "remote/keyboard-key", {key: "space"});
} else if (evt.key == "Enter" && document.activeElement.tagName != "INPUT") {
api("POST", "remote/keyboard-key", {key: "enter"});
} else if (evt.key == "ArrowUp") {
api("POST", "remote/keyboard-key", {key: "up"});
} else if (evt.key == "ArrowDown") {
api("POST", "remote/keyboard-key", {key: "down"});
} else if (evt.key == "ArrowLeft") {
api("POST", "remote/keyboard-key", {key: "left"});
} else if (evt.key == "ArrowRight") {
api("POST", "remote/keyboard-key", {key: "right"});
} else if (evt.key == "Escape") {
api("POST", "remote/keyboard-key", {key: "escape"});
} else {
handled = false;
if (evt.key.length == 1 && document.activeElement.tagName != "INPUT") {
textEl.focus();
}
}

if (handled) {
evt.preventDefault();
}
});


function updateCursor(mousePos, screenSize) { function updateCursor(mousePos, screenSize) {
let fracX = mousePos.x / screenSize.width; let fracX = mousePos.x / screenSize.width;
cursorEl.style.top = top + "px"; cursorEl.style.top = top + "px";
} }


let scrollDist = {x: 0, y: 0};
function onScroll(delta) {
// Scroll is inverted
delta.x = -delta.x;
delta.y = -delta.y;

if (Math.abs(delta.x) > Math.abs(delta.y)) {
scrollDist.x += delta.x;
let distX = roundToZero(scrollDist.x);
if (distX != 0) {
api("POST", "remote/scroll", {x: distX, y: 0});
scrollDist.x -= distX;
}
} else {
scrollDist.y += delta.y;
let distY = roundToZero(scrollDist.y);
if (distY != 0) {
api("POST", "remote/scroll", {x: 0, y: distY});
scrollDist.y -= distY;
}
}
}

function moveDelta(mousePos, screenSize, delta) { function moveDelta(mousePos, screenSize, delta) {
mousePos.x += delta.x; mousePos.x += delta.x;
if (mousePos.x >= screenSize.width) { if (mousePos.x >= screenSize.width) {
evt.preventDefault(); evt.preventDefault();
let text = evt.target.elements.text.value; let text = evt.target.elements.text.value;
evt.target.elements.text.value = ""; evt.target.elements.text.value = "";
await api("POST", "remote/keyboard-type", {text: evt.target.elements.text.value});
api("POST", "remote/keyboard-keys", {key: "enter", modifiers: []});
await api("POST", "remote/keyboard-type", {text});
api("POST", "remote/keyboard-key", {key: "enter"});
}); });


screencastContainerEl.addEventListener("click", evt => { screencastContainerEl.addEventListener("click", evt => {
api("POST", "remote/mouse-click", {button: "left", doubleClick: true}); api("POST", "remote/mouse-click", {button: "left", doubleClick: true});
}); });


screencastContainerEl.addEventListener("wheel", evt => {
evt.preventDefault();
onScroll({x: evt.deltaX / 5, y: evt.deltaY / 5});
});

screencastEl.addEventListener("mousemove", evt => { screencastEl.addEventListener("mousemove", evt => {
if (evt.buttons != 0) { if (evt.buttons != 0) {
return; return;


let numTouches = 0; let numTouches = 0;
let touches = {}; let touches = {};
let scrollDist = {x: 0, y: 0};
screencastContainerEl.addEventListener("touchstart", evt => { screencastContainerEl.addEventListener("touchstart", evt => {
evt.preventDefault(); evt.preventDefault();
numTouches += evt.changedTouches.length; numTouches += evt.changedTouches.length;
delta.y = Math.round(signPow(delta.y, 1.5)); delta.y = Math.round(signPow(delta.y, 1.5));
moveDelta(mousePos, screenSize, delta); moveDelta(mousePos, screenSize, delta);
} else if (numTouches == 2) { } else if (numTouches == 2) {
delta.x = delta.x / 5 / numTouches;
delta.y = delta.y / 5 / numTouches;

if (Math.abs(delta.x) > Math.abs(delta.y)) {
scrollDist.x += delta.x;
let distX = roundToZero(scrollDist.x);
if (distX != 0) {
api("POST", "remote/scroll", {x: distX, y: 0});
scrollDist.x -= distX;
}
} else {
scrollDist.y += delta.y;
let distY = roundToZero(scrollDist.y);
if (distY != 0) {
api("POST", "remote/scroll", {x: 0, y: distY});
scrollDist.y -= distY;
}
}
delta.x = -delta.x / 5 / numTouches;
delta.y = -delta.y / 5 / numTouches;
onScroll(delta);
} }
}); });



+ 3
- 0
web/util.js Wyświetl plik

el.appendChild(child); el.appendChild(child);
} }
} }

function debounce(timeout) {
}

Ładowanie…
Anuluj
Zapisz