# HG changeset patch # User John "Elwin" Edwards # Date 1421414725 18000 # Node ID 85fde763c7ed26066f2fb1922557e94688886717 # Parent b745c37fd2ec969e9d60af9315363da559dd04eb Improve the clear-command recognition. xterm and screen use different control sequences to clear the screen. Both are now recognized. diff -r b745c37fd2ec -r 85fde763c7ed rlgwebd.js --- a/rlgwebd.js Wed Jan 14 20:45:12 2015 -0500 +++ b/rlgwebd.js Fri Jan 16 08:25:25 2015 -0500 @@ -20,42 +20,42 @@ var dropToUser = "rodney"; var serveStaticRoot = "/var/www/"; // inside the chroot +var clearbufs = [ + new Buffer([27, 91, 72, 27, 91, 50, 74]), // xterm: CSI H CSI 2J + new Buffer([27, 91, 72, 27, 91, 74]) // screen: CSI H CSI J +]; + /* Data on the games available. */ var games = { "rogue3": { "name": "Rogue V3", "uname": "rogue3", "suffix": ".r3sav", - "path": "/usr/bin/rogue3", - "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J + "path": "/usr/bin/rogue3" }, "rogue4": { "name": "Rogue V4", "uname": "rogue4", "suffix": ".r4sav", - "path": "/usr/bin/rogue4", - "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J + "path": "/usr/bin/rogue4" }, "rogue5": { "name": "Rogue V5", "uname": "rogue5", "suffix": ".r5sav", - "path": "/usr/bin/rogue5", - "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J + "path": "/usr/bin/rogue5" }, "srogue": { "name": "Super-Rogue", "uname": "srogue", "suffix": ".srsav", - "path": "/usr/bin/srogue", - "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J + "path": "/usr/bin/srogue" }, "arogue5": { "name": "Advanced Rogue 5", "uname": "arogue5", "suffix": ".ar5sav", - "path": "/usr/bin/arogue5", - "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J + "path": "/usr/bin/arogue5" } }; @@ -152,7 +152,7 @@ this.term.on("data", ttyrec_chunk); this.framepush = function(chunk) { /* If this chunk resets the screen, discard what preceded it. */ - if (bufncmp(chunk, this.game.clear, this.game.clear.length)) { + if (isclear(chunk)) { this.framebuf = new Buffer(1024); this.frameoff = 0; } @@ -263,9 +263,7 @@ this.frameoff = 0; this.framepush = function(chunk) { /* If this chunk resets the screen, discard what preceded it. */ - var cgame = games[this.gname]; - if (bufncmp(chunk, cgame.clear, cgame.clear.length)) { - tslog("DGL %s: clearing frame", ss.tag()); + if (isclear(chunk)) { this.framebuf = new Buffer(1024); this.frameoff = 0; } @@ -300,8 +298,8 @@ /* Update timestamp, to within 1 second. */ ss.lasttime = new Date(1000 * buf.readUInt32LE(0)); var datalen = buf.readUInt32LE(8); - //tslog("Allocating %d bytes", datalen); if (datalen > 16384) { + // Something is probably wrong... tslog("DGL %s: looking for %d bytes", ss.tag(), datalen); } var databuf = new Buffer(datalen); @@ -536,6 +534,14 @@ return true; } +function isclear(buf) { + for (var i = 0; i < clearbufs.length; i++) { + if (bufncmp(buf, clearbufs[i], clearbufs[i].length)) + return true; + } + return false; +} + function tslog() { arguments[0] = new Date().toISOString() + ": " + String(arguments[0]); console.log.apply(console, arguments);