mirror of
https://github.com/Ylianst/MeshCommander
synced 2025-12-06 06:03:20 +00:00
Added support for new KVM modes.
This commit is contained in:
@@ -21,7 +21,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
obj.rwidth = 0;
|
||||
obj.rheight = 0;
|
||||
obj.bpp = 2; // Bytes per pixel (1 or 2 supported)
|
||||
obj.useZRLE = true;
|
||||
obj.useRLE = true;
|
||||
obj.showmouse = true;
|
||||
obj.buttonmask = 0;
|
||||
obj.localKeyMap = true;
|
||||
@@ -31,7 +31,6 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
obj.sparew2 = 0;
|
||||
obj.spareh2 = 0;
|
||||
obj.sparecache = {};
|
||||
obj.ZRLEfirst = 1;
|
||||
obj.onScreenSizeChange = null;
|
||||
obj.frameRateDelay = 0;
|
||||
// ###BEGIN###{DesktopRotation}
|
||||
@@ -45,6 +44,10 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
obj.onKvmDataAck = -1;
|
||||
obj.holding = false;
|
||||
obj.lastKeepAlive = Date.now();
|
||||
obj.kvmExt = {};
|
||||
obj.kvmExtChanged = null;
|
||||
obj.useZLib = false;
|
||||
obj.graymode = false;
|
||||
// ###END###{DesktopInband}
|
||||
|
||||
obj.mNagleTimer = null; // Mouse motion slowdown timer
|
||||
@@ -156,10 +159,10 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
*/
|
||||
|
||||
// SetEncodings, with AMT we can't omit RAW, must be specified.
|
||||
// Intel AMT supports encodings: RAW (0), ZRLE (16), Desktop Size (0xFFFFFF21, -223)
|
||||
// Intel AMT supports encodings: RAW (0), RLE (16), Desktop Size (0xFFFFFF21, -223)
|
||||
|
||||
var supportedEncodings = '';
|
||||
if (obj.useZRLE) supportedEncodings += IntToStr(16);
|
||||
if (obj.useRLE) supportedEncodings += IntToStr(16);
|
||||
supportedEncodings += IntToStr(0);
|
||||
// ###BEGIN###{DesktopInband}
|
||||
supportedEncodings += IntToStr(1092);
|
||||
@@ -173,12 +176,16 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
|
||||
obj.state = 4;
|
||||
if (obj.parent) { obj.parent.disconnectCode = 0; obj.parent.xxStateChange(3); }
|
||||
_SendRefresh();
|
||||
//obj.timer = setInterval(obj.xxOnTimer, 50);
|
||||
|
||||
// ###BEGIN###{DesktopFocus}
|
||||
obj.ox = -1; // Old mouse x position
|
||||
// ###END###{DesktopFocus}
|
||||
// ###BEGIN###{DesktopInband}
|
||||
obj.sendKvmExtCmd(2, obj.graymode?1:0); // Set Decimation State
|
||||
obj.sendKvmExtCmd(4, obj.useZLib?1:0); // Set ZLib state
|
||||
// ###END###{DesktopInband}
|
||||
_SendRefresh();
|
||||
|
||||
if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); }
|
||||
}
|
||||
@@ -256,7 +263,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
}
|
||||
_putImage(obj.spare, x, y);
|
||||
} else if (encoding == 16) {
|
||||
// ZRLE encoding
|
||||
// RLE encoding
|
||||
if (obj.acc.byteLength < 16) return;
|
||||
var datalen = accview.getUint32(12);
|
||||
if (obj.acc.byteLength < (16 + datalen)) return;
|
||||
@@ -595,7 +602,6 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
obj.Start = function () {
|
||||
obj.state = 0;
|
||||
obj.acc = null;
|
||||
obj.ZRLEfirst = 1;
|
||||
// ###BEGIN###{Inflate}
|
||||
obj.inflate.inflateReset();
|
||||
// ###END###{Inflate}
|
||||
@@ -603,6 +609,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
obj.onKvmDataPending = [];
|
||||
obj.onKvmDataAck = -1;
|
||||
obj.kvmDataSupported = false;
|
||||
obj.kvmExt = {};
|
||||
// ###END###{DesktopInband}
|
||||
for (var i in obj.sparecache) { delete obj.sparecache[i]; }
|
||||
}
|
||||
@@ -766,6 +773,13 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-DataChannel-Recv(' + (d.length - 16) + '): ' + d.substring(16)); }
|
||||
if (d.length >= 16) { obj.onKvmData(d.substring(16)); } // Event the data and ack
|
||||
if ((obj.onKvmDataAck == true) && (obj.onKvmDataPending.length > 0)) { obj.sendKvmData(obj.onKvmDataPending.shift()); } // Send pending data
|
||||
} else if ((d.length >= 13) && (d.substring(0, 11) == '\0KvmExtCmd\0')) {
|
||||
var cmd = d.charCodeAt(11), val = d.charCodeAt(12);
|
||||
console.log('Received KvmExtCmd', cmd, val);
|
||||
if (cmd == 1) { obj.kvmext.decimation = val; if (obj.kvmExtChanged != null) { obj.kvmExtChanged(1, val); } }
|
||||
if (cmd == 2) { obj.sendKvmExtCmd(1); }
|
||||
if (cmd == 3) { obj.kvmext.compression = val; if (obj.kvmExtChanged != null) { obj.kvmExtChanged(3, val); } }
|
||||
if (cmd == 4) { obj.sendKvmExtCmd(3); }
|
||||
} else {
|
||||
console.log('Got KVM clipboard data:', d);
|
||||
if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-ClipBoard-Recv(' + d.length + '): ' + rstr2hex(d) + ', ' + d); }
|
||||
@@ -776,6 +790,12 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
}
|
||||
|
||||
// ###BEGIN###{DesktopInband}
|
||||
obj.sendKvmExtCmd = function (cmd, val) {
|
||||
console.log('Sending KvmExtCmd', cmd, val);
|
||||
var x = '\0KvmExtCmd\0' + String.fromCharCode(cmd) + (val != null ? String.fromCharCode(val) : '');
|
||||
obj.send(String.fromCharCode(6, 0, 0, 0) + IntToStr(x.length) + x);
|
||||
}
|
||||
|
||||
obj.sendKvmData = function (x) {
|
||||
if (obj.onKvmDataAck !== true) {
|
||||
obj.onKvmDataPending.push(x);
|
||||
|
||||
83
index.html
83
index.html
@@ -1334,12 +1334,21 @@
|
||||
<br>
|
||||
<div style='height:26px'>
|
||||
<select id="idx_d7desktopmode" style="float:right;width:200px">
|
||||
<option value="1">RLE8, Color Fast</option>
|
||||
<option value="2">RLE16, Color</option>
|
||||
<option id="d7gray4" value="5">RLE4G, Gray Fastest</option>
|
||||
<option id="d7gray8" value="6">RLE8G, Gray Fast</option>
|
||||
<option value="3">RAW8, Color Slow</option>
|
||||
<option value="4">RAW16, Color Very Slow</option>
|
||||
<!-- Flags: 1 = RAW, 2 = 16bit, 4 = Gray, 8 = ZLib -->
|
||||
<!-- ###BEGIN###{DesktopInband} -->
|
||||
<option id="d7exm1" value="5">RLE8G, Gray (Fast)</option>
|
||||
<option id="d7exm2" value="7">RLE16G, Gray</option>
|
||||
<!-- ###END###{DesktopInband} -->
|
||||
<option value="1">RLE8, Color</option>
|
||||
<option value="3">RLE16, Color</option>
|
||||
<!-- ###BEGIN###{DesktopInband} -->
|
||||
<option id="d7exm3" value="13">ZRLE8G, Compressed Gray</option>
|
||||
<option id="d7exm4" value="15">ZRLE16G, Compressed Gray</option>
|
||||
<option id="d7exm5" value="9">ZRLE8, Compressed Color</option>
|
||||
<option id="d7exm6" value="11">ZRLE16, Compressed Color</option>
|
||||
<!-- ###END###{DesktopInband} -->
|
||||
<option value="0">RAW8, Color</option>
|
||||
<option value="2">RAW16, Color (Slow)</option>
|
||||
</select>
|
||||
<div>Image Encoding</div>
|
||||
</div>
|
||||
@@ -1724,7 +1733,7 @@
|
||||
// ###END###{NetworkSettings}
|
||||
// ###BEGIN###{Desktop}
|
||||
var desktop;
|
||||
var desktopsettings = { encoding:1, showfocus:false, showmouse:true, showcad:true, limitFrameRate:false, noMouseRotate:false };
|
||||
var desktopsettings = { encflags: 1, showfocus: false, showmouse: true, showcad: true, limitFrameRate: false, noMouseRotate: false };
|
||||
// ###END###{Desktop}
|
||||
// ###BEGIN###{Mode-MeshCentral2}
|
||||
var currentMeshNode = null;
|
||||
@@ -1882,6 +1891,9 @@
|
||||
// Setup the remote desktop
|
||||
desktop = CreateAmtRedirect(CreateAmtRemoteDesktop('Desk', Q('id_mainarea')));
|
||||
desktop.onStateChanged = onDesktopStateChange;
|
||||
// ###BEGIN###{DesktopInband}
|
||||
desktop.kvmExtChanged = updateDesktopState;
|
||||
// ###END###{DesktopInband}
|
||||
QE('idx_connectbutton1', true);
|
||||
try { t = localStorage.getItem('desktopsettings'); } catch (ex) {}
|
||||
if (t) { desktopsettings = JSON.parse(t); }
|
||||
@@ -8111,7 +8123,7 @@
|
||||
webRtcDesktop = null;
|
||||
// Switch back to hardware KVM
|
||||
desktop.m.hold(false);
|
||||
Q('id_deskstatus').textContent = StatusStrs[desktop.State];
|
||||
updateDesktopState();
|
||||
// ###BEGIN###{DesktopInbandFiles}
|
||||
p24files = null;
|
||||
p24downloadFileCancel() // If any downloads are in process, cancel them.
|
||||
@@ -8137,11 +8149,13 @@
|
||||
if ((skipConsent !== true) && (amtversion > 5) && (amtsysstate['IPS_OptInService'] != null) && (amtsysstate['IPS_OptInService'].response != undefined) && (amtsysstate['IPS_OptInService'].response['OptInRequired'] == 0xFFFFFFFF)) {
|
||||
connectDesktopConsent = true; amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1); return; // User consent always required, ask for it before KVM.
|
||||
}
|
||||
desktop.m.bpp = (desktopsettings.encoding == 2 || desktopsettings.encoding == 4) ? 2 : 1;
|
||||
desktop.m.graymode = 0;
|
||||
if (desktopsettings.encoding == 6) { desktop.m.graymode = 1; } // 256 grays
|
||||
if (desktopsettings.encoding == 5) { desktop.m.graymode = 2; } // 16 grays
|
||||
desktop.m.useZRLE = (desktopsettings.encoding < 3);
|
||||
// Encoding Flags: 1 = RLE, 2 = 16bit, 4 = Gray, 8 = ZLib
|
||||
desktop.m.useRLE = ((desktopsettings.encflags & 1) != 0);
|
||||
desktop.m.bpp = (desktopsettings.encflags & 2) ? 2 : 1;
|
||||
// ###BEGIN###{DesktopInband}
|
||||
desktop.m.graymode = ((desktopsettings.encflags & 4) != 0);
|
||||
desktop.m.useZLib = ((desktopsettings.encflags & 8) != 0);
|
||||
// ###END###{DesktopInband}
|
||||
desktop.m.showmouse = desktopsettings.showmouse;
|
||||
desktop.m.onScreenSizeChange = center;
|
||||
// ###BEGIN###{ComputerSelector}
|
||||
@@ -8168,7 +8182,6 @@
|
||||
webRtcDesktop.webchannel.onopen = function () {
|
||||
// Switch to software KVM
|
||||
if (urlvars && urlvars['kvmdatatrace']) { console.log('WebRTC Data Channel Open'); }
|
||||
Q('id_deskstatus').textContent = StatusStrs[desktop.State] + ", Soft-KVM";
|
||||
desktop.m.hold(true);
|
||||
webRtcDesktop.webRtcActive = true;
|
||||
webRtcDesktop.softdesktop = CreateKvmDataChannel(webRtcDesktop.webchannel, CreateAgentRemoteDesktop('Desk', Q('id_mainarea')), desktop.m);
|
||||
@@ -8176,6 +8189,7 @@
|
||||
if (desktopsettings.quality) { webRtcDesktop.softdesktop.m.CompressionLevel = desktopsettings.quality; } // Number from 1 to 100. 50 or less is best.
|
||||
if (desktopsettings.scaling) { webRtcDesktop.softdesktop.m.ScalingLevel = desktopsettings.scaling; }
|
||||
webRtcDesktop.softdesktop.Start();
|
||||
updateDesktopState();
|
||||
|
||||
// Check if we can get remote file access
|
||||
// ###BEGIN###{DesktopInbandFiles}
|
||||
@@ -8308,7 +8322,6 @@
|
||||
function onDesktopStateChange(desktop, state) {
|
||||
//console.log("onDesktopStateChange: " + state);
|
||||
idx_connectbutton1.value = (state == 0) ? "Connect" : "Disconnect";
|
||||
Q('id_deskstatus').textContent = StatusStrs[state];
|
||||
var input = ((state == 3) && !urlvars['kvmviewonly']);
|
||||
QE('id_DeskCAD', input);
|
||||
QE('deskkeys', input);
|
||||
@@ -8352,6 +8365,28 @@
|
||||
NW_SetupMainMenu(currentView);
|
||||
// ###END###{Mode-NodeWebkit}
|
||||
center();
|
||||
updateDesktopState();
|
||||
}
|
||||
|
||||
// Update remote desktop status
|
||||
function updateDesktopState() {
|
||||
// ###BEGIN###{DesktopInband}
|
||||
var x = '';
|
||||
if (desktop.State == 3) {
|
||||
if ((webRtcDesktop) && (webRtcDesktop.webRtcActive == true)) {
|
||||
x = ", Soft-KVM";
|
||||
} else {
|
||||
if (desktop.m && desktop.m.kvmExt) {
|
||||
if (desktop.m.kvmExt.decimation == 2) { x += ", Gray" }
|
||||
if (desktop.m.kvmExt.compression == 1) { x += ", ZLib" }
|
||||
}
|
||||
}
|
||||
}
|
||||
Q('id_deskstatus').textContent = StatusStrs[desktop.State] + x;
|
||||
// ###END###{DesktopInband}
|
||||
// ###BEGIN###{!DesktopInband}
|
||||
Q('id_deskstatus').textContent = StatusStrs[desktop.State];
|
||||
// ###END###{!DesktopInband}
|
||||
}
|
||||
|
||||
function showDesktopSettings() {
|
||||
@@ -8361,7 +8396,7 @@
|
||||
}
|
||||
|
||||
function showDesktopSettingsChanged() {
|
||||
desktopsettings.encoding = idx_d7desktopmode.value;
|
||||
desktopsettings.encflags = parseInt(idx_d7desktopmode.value);
|
||||
// ###BEGIN###{DesktopFocus}
|
||||
desktopsettings.showfocus = d7showfocus.checked;
|
||||
// ###END###{DesktopFocus}
|
||||
@@ -8383,7 +8418,13 @@
|
||||
}
|
||||
|
||||
function applyDesktopSettings() {
|
||||
idx_d7desktopmode.value = desktopsettings.encoding;
|
||||
// ###BEGIN###{!DesktopInband}
|
||||
desktopsettings.encflags = desktopsettings.encflags & 3; // Remove gray & zlib flags (4 and 8), keep 1 & 2
|
||||
// ###END###{!DesktopInband}
|
||||
// ###BEGIN###{DesktopInband}
|
||||
if (amtversion < 15) { desktopsettings.encflags = desktopsettings.encflags & 3; } // Remove gray & zlib flags (4 and 8), keep 1 & 2
|
||||
// ###END###{DesktopInband}
|
||||
idx_d7desktopmode.value = desktopsettings.encflags;
|
||||
// ###BEGIN###{DesktopFocus}
|
||||
d7showfocus.checked = desktopsettings.showfocus;
|
||||
// ###END###{DesktopFocus}
|
||||
@@ -8395,13 +8436,17 @@
|
||||
if (desktopsettings.quality) { d7bitmapquality.value = desktopsettings.quality; }
|
||||
if (desktopsettings.scaling) { d7bitmapscaling.value = desktopsettings.scaling; }
|
||||
QV('d7softkvmsettings', amtversion >= 12);
|
||||
QV('d7exm1', amtversion > 14);
|
||||
QV('d7exm2', amtversion > 14);
|
||||
QV('d7exm3', amtversion > 14);
|
||||
QV('d7exm4', amtversion > 14);
|
||||
QV('d7exm5', amtversion > 14);
|
||||
QV('d7exm6', amtversion > 14);
|
||||
// ###END###{DesktopInband}
|
||||
// ###BEGIN###{DesktopFocus}
|
||||
QV('idx_deskFocusBtn', desktopsettings.showfocus);
|
||||
// ###END###{DesktopFocus}
|
||||
QV('id_DeskCAD', desktopsettings.showcad);
|
||||
QV('d7gray4', urlvars['kvmgray']);
|
||||
QV('d7gray8', urlvars['kvmgray']);
|
||||
}
|
||||
|
||||
var fullscreen = false;
|
||||
|
||||
Reference in New Issue
Block a user