view termemu-keys.js @ 55:96815eae4ebe

RLG-Web: make multiple watchers possible. Split the TermSession class into the new TermSession, which handles the PTY, and client classes, which handle HTTP sessions. These are Player and Watcher. This allows multiple watchers per game, and other improvements.
author John "Elwin" Edwards <elwin@sdf.org>
date Mon, 18 Jun 2012 13:43:51 -0700
parents 21738794755e
children d7eb63cd7a16
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[KeyboardEvent.DOM_VK_RETURN] = ["0d", "0d"];
    this[KeyboardEvent.DOM_VK_SPACE] =  ["20", "20"];
    this[KeyboardEvent.DOM_VK_TAB] =    ["09", "09"];
    this[KeyboardEvent.DOM_VK_BACK_QUOTE] =    ["60", "7e"];
    this[KeyboardEvent.DOM_VK_OPEN_BRACKET] =  ["5b", "7b"];
    this[KeyboardEvent.DOM_VK_CLOSE_BRACKET] = ["5d", "7d"];
    this[KeyboardEvent.DOM_VK_BACK_SLASH] = ["5c", "7c"];
    this[KeyboardEvent.DOM_VK_SEMICOLON] =  ["3b", "3a"];
    this[KeyboardEvent.DOM_VK_QUOTE] =  ["27", "22"];
    this[KeyboardEvent.DOM_VK_COMMA] =  ["2c", "3c"];
    this[KeyboardEvent.DOM_VK_PERIOD] = ["2e", "3e"];
    this[KeyboardEvent.DOM_VK_SLASH] =  ["2f", "3f"];
    this[KeyboardEvent.DOM_VK_EQUALS] = ["3d", "2b"];
    this[KeyboardEvent.DOM_VK_SUBTRACT] =   ["2d", "5f"];
    this[KeyboardEvent.DOM_VK_BACK_SPACE] = ["08", "08"];
    this[KeyboardEvent.DOM_VK_DELETE] = ["1b5b337e", "1b5b337e"];
    this[KeyboardEvent.DOM_VK_ESCAPE] = ["1b", "1b"];
    this[KeyboardEvent.DOM_VK_PAGE_UP] =   ["1b5b357e", "1b5b357e"];
    this[KeyboardEvent.DOM_VK_PAGE_DOWN] = ["1b5b367e", "1b5b367e"];
    this.appCursor(false);
    this.appKeypad(false);
  },
  /* Multi-char control sequences!  Neat! */
  appCursor: function (on) {
    /* Aren't special keys vile? */
    if (on) {
      this[KeyboardEvent.DOM_VK_LEFT] =  ["1b4f44", "1b4f44"];
      this[KeyboardEvent.DOM_VK_RIGHT] = ["1b4f43", "1b4f43"];
      this[KeyboardEvent.DOM_VK_UP] =    ["1b4f41", "1b4f41"];
      this[KeyboardEvent.DOM_VK_DOWN] =  ["1b4f42", "1b4f42"];
      this[KeyboardEvent.DOM_VK_END] =   ["1b4f46", "1b4f46"];
      this[KeyboardEvent.DOM_VK_HOME] =  ["1b4f48", "1b4f48"];
    }
    else {
      this[KeyboardEvent.DOM_VK_LEFT] =  ["1b5b44", "1b5b44"];
      this[KeyboardEvent.DOM_VK_RIGHT] = ["1b5b43", "1b5b43"];
      this[KeyboardEvent.DOM_VK_UP] =    ["1b5b41", "1b5b41"];
      this[KeyboardEvent.DOM_VK_DOWN] =  ["1b5b42", "1b5b42"];
      this[KeyboardEvent.DOM_VK_END] =   ["1b5b46", "1b5b46"];
      this[KeyboardEvent.DOM_VK_HOME] =  ["1b5b48", "1b5b48"];
    }
  },
  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[KeyboardEvent.DOM_VK_NUMPAD1] = ["1b4f46", "1b4f46"];
    this[KeyboardEvent.DOM_VK_NUMPAD2] = ["1b4f42", "1b4f42"];
    this[KeyboardEvent.DOM_VK_NUMPAD3] = ["1b5b367e", "1b5b367e"];
    this[KeyboardEvent.DOM_VK_NUMPAD4] = ["1b4f44", "1b4f44"];
    this[KeyboardEvent.DOM_VK_NUMPAD5] = ["1b5b45", "1b5b45"];
    this[KeyboardEvent.DOM_VK_NUMPAD6] = ["1b4f43", "1b4f43"];
    this[KeyboardEvent.DOM_VK_NUMPAD7] = ["1b4f48", "1b4f48"];
    this[KeyboardEvent.DOM_VK_NUMPAD8] = ["1b4f41", "1b4f41"];
    this[KeyboardEvent.DOM_VK_NUMPAD9] = ["1b5b357e", "1b5b357e"];
    return;
  }
};