From dca57e1f59fa9b25ad5ddf068d32d0d18b185c81 Mon Sep 17 00:00:00 2001 From: Andreas Venizelou Date: Mon, 13 May 2024 17:10:06 +0300 Subject: [PATCH] Telnet, auto-scroll --- Protest/Front/mono/scroll.svg | 3 +++ Protest/Front/telnet.js | 28 ++++++++++++++++++++-------- Protest/Front/ui.js | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 Protest/Front/mono/scroll.svg diff --git a/Protest/Front/mono/scroll.svg b/Protest/Front/mono/scroll.svg new file mode 100644 index 00000000..03cce2e5 --- /dev/null +++ b/Protest/Front/mono/scroll.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Protest/Front/telnet.js b/Protest/Front/telnet.js index 1c9b66d5..b01b79a9 100644 --- a/Protest/Front/telnet.js +++ b/Protest/Front/telnet.js @@ -5,7 +5,7 @@ class Telnet extends Window { constructor(params) { super(); - this.params = params ? params : {host:"", isAnsi:true, bell:true}; + this.params = params ? params : {host:"", ansi:true, autoScroll:true, bell:true}; this.cursor = {x:0, y:0}; this.chars = {}; @@ -36,8 +36,8 @@ class Telnet extends Window { this.connectButton = this.AddToolbarButton("Connect", "mono/connect.svg?light"); this.optionsButton = this.AddToolbarButton("Options", "mono/wrench.svg?light"); this.AddToolbarSeparator(); - this.sendKeyButton = this.AddToolbarButton("Send key", "mono/keyboard.svg?light"); this.pasteButton = this.AddToolbarButton("Paste", "mono/clipboard.svg?light"); + this.sendKeyButton = this.AddToolbarButton("Send key", "mono/keyboard.svg?light"); this.content.tabIndex = 1; this.content.classList.add("terminal-content"); @@ -55,8 +55,8 @@ class Telnet extends Window { this.connectButton.onclick = ()=> this.ConnectDialog(this.params.host); this.optionsButton.onclick = ()=> this.OptionsDialog(); - this.sendKeyButton.onclick = ()=> this.CustomKeyDialog(); this.pasteButton.onclick = ()=> this.ClipboardDialog(); + this.sendKeyButton.onclick = ()=> this.CustomKeyDialog(); this.ConnectDialog(this.params.host, true); @@ -125,7 +125,7 @@ class Telnet extends Window { } OptionsDialog() { - const dialog = this.DialogBox("168px"); + const dialog = this.DialogBox("200px"); if (dialog === null) return; const okButton = dialog.okButton; @@ -138,7 +138,7 @@ class Telnet extends Window { const ansiCheckbox = document.createElement("input"); ansiCheckbox.type = "checkbox"; - ansiCheckbox.checked = this.params.isAnsi; + ansiCheckbox.checked = this.params.ansi; innerBox.appendChild(ansiCheckbox); this.AddCheckBoxLabel(innerBox, ansiCheckbox, "Escape ANSI codes"); @@ -151,9 +151,19 @@ class Telnet extends Window { innerBox.appendChild(bellCheckbox); this.AddCheckBoxLabel(innerBox, bellCheckbox, "Play bell sound"); + innerBox.appendChild(document.createElement("br")); + innerBox.appendChild(document.createElement("br")); + + const autoScrollCheckbox = document.createElement("input"); + autoScrollCheckbox.type = "checkbox"; + autoScrollCheckbox.checked = this.params.autoScroll; + innerBox.appendChild(autoScrollCheckbox); + this.AddCheckBoxLabel(innerBox, autoScrollCheckbox, "Auto-scroll"); + okButton.onclick = ()=> { - this.params.isAnsi = ansiCheckbox.checked; + this.params.ansi = ansiCheckbox.checked; this.params.bell = bellCheckbox.checked; + this.params.autoScroll = autoScrollCheckbox.checked; dialog.Close(); }; } @@ -444,7 +454,7 @@ class Telnet extends Window { break; case "\x1b": //esc - if (this.params.isAnsi) { + if (this.params.ansi) { i += this.HandleEscSequence(data, i) - 1; } else { @@ -488,7 +498,9 @@ class Telnet extends Window { this.cursorElement.style.left = Telnet.CURSOR_WIDTH * this.cursor.x + "px"; this.cursorElement.style.top = Telnet.CURSOR_HEIGHT * this.cursor.y + "px"; - this.cursorElement.scrollIntoView(); + if (this.params.autoScroll) { + this.cursorElement.scrollIntoView(); + } } HandleEscSequence(data, index) { //Control Sequence Introducer diff --git a/Protest/Front/ui.js b/Protest/Front/ui.js index 679e8381..c426240b 100644 --- a/Protest/Front/ui.js +++ b/Protest/Front/ui.js @@ -301,7 +301,7 @@ const MENU = { { t:"Watchdog", i:"mono/watchdog.svg?light", g:"documentation", h:false, f:params=> new Watchdog(params), k:"" }, { t:"Team chat", i:"mono/chat.svg?light", g:"documentation", h:false, f:params=> new Chat(), k:"messages" }, - { t:"Telnet", i:"mono/telnet.svg?light", g:"tools", h:true, f:params=> new Telnet({host:"", isAnsi:true, bell:true}) }, + { t:"Telnet", i:"mono/telnet.svg?light", g:"tools", h:true, f:params=> new Telnet({host:"", ansi:true, autoScroll:true, bell:true}) }, //{ t:"Secure shell", i:"mono/ssh.svg?light", g:"tools", h:true, f:params=> {} }, { t:"WMI client", i:"mono/wmi.svg?light", g:"tools", h:false, f:params=> new Wmi(params), k:"windows management instrumentation viewer" }, { t:"SNMP polling", i:"mono/snmp.svg?light", g:"tools", h:false, f:params=> new Snmp(params) },