view termemu-keys.js @ 165:59e62710cbb5

rlgwebd.js: prevent races when reading ttyrecs. DglSession objects read a 12-byte TTYREC header, extract therefrom the length of the data chunk, and then read the data. In between these two reads, the file watcher could trigger another readchunk() invocation, which might attempt to read a header from the beginning of the data chunk. This usually results in expecting a data chunk of several GB and failing to create a Buffer for it. The race is remedied by setting a flag on the DglSession object whenever readchunk() is called, clearing it when both reads complete, and refusing to read if it is already set.
author John "Elwin" Edwards
date Wed, 07 Jan 2015 13:18:35 -0500
parents 6cfaf6d202be
children
line wrap: on
line source

/* termemu-keys.js: some key-handling code common to both drivers. */

/* ASCII values of keys 0-9. */
var numShifts = [41, 33, 64, 35, 36, 37, 94, 38, 42, 40];

var keyHexCodes = {
  init: function () {
    this[13]  = ["0d", "0d"]; // return
    this[32]  = ["20", "20"]; // space
    this[9]   = ["09", "09"]; // tab
    this[192] = ["60", "7e"]; // backtick, tilde
    this[219] = ["5b", "7b"]; // open bracket, open brace
    this[221] = ["5d", "7d"]; // close bracket, close brace
    this[220] = ["5c", "7c"]; // backslash, pipe
    this[59]  = ["3b", "3a"]; // semicolon, colon
    this[186] = ["3b", "3a"]; // semicolon, colon (Chrome)
    this[222] = ["27", "22"]; // single quote, double quote
    this[188] = ["2c", "3c"]; // comma, less than
    this[190] = ["2e", "3e"]; // period, right angle
    this[191] = ["2f", "3f"]; // slash, question mark
    this[61]  = ["3d", "2b"]; // equal, plus
    this[187] = ["3d", "2b"]; // equal, plus (Chrome)
    this[109] = ["2d", "5f"]; // subtract, underscore (maybe on numpad)
    this[173] = ["2d", "5f"]; // subtract, underscore (maybe not on numpad)
    this[189] = ["2d", "5f"]; // subtract, underscore (Chrome)
    this[8]   = ["08", "08"]; // backspace
    this[46]  = ["1b5b337e", "1b5b337e"]; // delete
    this[27]  = ["1b", "1b"]; // escape
    this[33]  = ["1b5b357e", "1b5b357e"]; // page up
    this[34]  = ["1b5b367e", "1b5b367e"]; // page down
    this[12]  = ["1b5b45", "1b5b45"]; // Clear key = numpad 5 (Firefox)
    this.appCursor(false);
    this.appKeypad(false);
  },
  /* Multi-char control sequences!  Neat! */
  appCursor: function (on) {
    /* Aren't special keys vile? */
    if (on) {
      this[37] = ["1b4f44", "1b4f44"]; // left arror
      this[39] = ["1b4f43", "1b4f43"]; // right arrow
      this[38] = ["1b4f41", "1b4f41"]; // up arrow
      this[40] = ["1b4f42", "1b4f42"]; // down arrow
      this[35] = ["1b4f46", "1b4f46"]; // end
      this[36] = ["1b4f48", "1b4f48"]; // home
    }
    else {
      this[37] = ["1b5b44", "1b5b44"]; // left arror
      this[39] = ["1b5b43", "1b5b43"]; // right arrow
      this[38] = ["1b5b41", "1b5b41"]; // up arrow
      this[40] = ["1b5b42", "1b5b42"]; // down arrow
      this[35] = ["1b5b46", "1b5b46"]; // end
      this[36] = ["1b5b48", "1b5b48"]; // home
    }
  },
  appKeypad: function (on) {
    /* In theory, these should produce either numerals or the k[a-c][1-3]
     * sequences.  Since we can't count on the terminfo description actually
     * containing those sequences, pretend they're just arrow keys etc.
     */
    this[97]  = ["1b4f46", "1b4f46"];
    this[98]  = ["1b4f42", "1b4f42"];
    this[99]  = ["1b5b367e", "1b5b367e"];
    this[100] = ["1b4f44", "1b4f44"];
    this[101] = ["1b5b45", "1b5b45"];
    this[102] = ["1b4f43", "1b4f43"];
    this[103] = ["1b4f48", "1b4f48"];
    this[104] = ["1b4f41", "1b4f41"];
    this[105] = ["1b5b357e", "1b5b357e"];
    return;
  }
};