@replit/novnc
Advanced tools
Comparing version 2.0.0 to 2.1.0
@@ -60,8 +60,8 @@ /* This Source Code Form is subject to the terms of the Mozilla Public | ||
decode(data, offset = 0) { | ||
let data_length = data.indexOf('=') - offset; | ||
if (data_length < 0) { data_length = data.length - offset; } | ||
let dataLength = data.indexOf('=') - offset; | ||
if (dataLength < 0) { dataLength = data.length - offset; } | ||
/* Every four characters is 3 resulting numbers */ | ||
const result_length = (data_length >> 2) * 3 + Math.floor((data_length % 4) / 1.5); | ||
const result = new Array(result_length); | ||
const resultLength = (dataLength >> 2) * 3 + Math.floor((dataLength % 4) / 1.5); | ||
const result = new Array(resultLength); | ||
@@ -68,0 +68,0 @@ // Convert one by one. |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -20,2 +18,7 @@ * | ||
let deltaY = sock.rQshift16(); | ||
if ((width === 0) || (height === 0)) { | ||
return true; | ||
} | ||
display.copyImage(deltaX, deltaY, x, y, width, height); | ||
@@ -22,0 +25,0 @@ |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -18,2 +16,3 @@ * | ||
this._lastsubencoding = 0; | ||
this._tileBuffer = new Uint8Array(16 * 16 * 4); | ||
} | ||
@@ -23,6 +22,6 @@ | ||
if (this._tiles === 0) { | ||
this._tiles_x = Math.ceil(width / 16); | ||
this._tiles_y = Math.ceil(height / 16); | ||
this._total_tiles = this._tiles_x * this._tiles_y; | ||
this._tiles = this._total_tiles; | ||
this._tilesX = Math.ceil(width / 16); | ||
this._tilesY = Math.ceil(height / 16); | ||
this._totalTiles = this._tilesX * this._tilesY; | ||
this._tiles = this._totalTiles; | ||
} | ||
@@ -46,7 +45,7 @@ | ||
const curr_tile = this._total_tiles - this._tiles; | ||
const tile_x = curr_tile % this._tiles_x; | ||
const tile_y = Math.floor(curr_tile / this._tiles_x); | ||
const tx = x + tile_x * 16; | ||
const ty = y + tile_y * 16; | ||
const currTile = this._totalTiles - this._tiles; | ||
const tileX = currTile % this._tilesX; | ||
const tileY = Math.floor(currTile / this._tilesX); | ||
const tx = x + tileX * 16; | ||
const ty = y + tileY * 16; | ||
const tw = Math.min(16, (x + width) - tx); | ||
@@ -95,2 +94,7 @@ const th = Math.min(16, (y + height) - ty); | ||
} else if (subencoding & 0x01) { // Raw | ||
let pixels = tw * th; | ||
// Max sure the image is fully opaque | ||
for (let i = 0;i < pixels;i++) { | ||
rQ[rQi + i * 4 + 3] = 255; | ||
} | ||
display.blitImage(tx, ty, tw, th, rQ, rQi); | ||
@@ -108,3 +112,3 @@ rQi += bytes - 1; | ||
display.startTile(tx, ty, tw, th, this._background); | ||
this._startTile(tx, ty, tw, th, this._background); | ||
if (subencoding & 0x08) { // AnySubrects | ||
@@ -132,6 +136,6 @@ let subrects = rQ[rQi]; | ||
display.subTile(sx, sy, sw, sh, color); | ||
this._subTile(sx, sy, sw, sh, color); | ||
} | ||
} | ||
display.finishTile(); | ||
this._finishTile(display); | ||
} | ||
@@ -145,2 +149,50 @@ sock.rQi = rQi; | ||
} | ||
// start updating a tile | ||
_startTile(x, y, width, height, color) { | ||
this._tileX = x; | ||
this._tileY = y; | ||
this._tileW = width; | ||
this._tileH = height; | ||
const red = color[0]; | ||
const green = color[1]; | ||
const blue = color[2]; | ||
const data = this._tileBuffer; | ||
for (let i = 0; i < width * height * 4; i += 4) { | ||
data[i] = red; | ||
data[i + 1] = green; | ||
data[i + 2] = blue; | ||
data[i + 3] = 255; | ||
} | ||
} | ||
// update sub-rectangle of the current tile | ||
_subTile(x, y, w, h, color) { | ||
const red = color[0]; | ||
const green = color[1]; | ||
const blue = color[2]; | ||
const xend = x + w; | ||
const yend = y + h; | ||
const data = this._tileBuffer; | ||
const width = this._tileW; | ||
for (let j = y; j < yend; j++) { | ||
for (let i = x; i < xend; i++) { | ||
const p = (i + (j * width)) * 4; | ||
data[p] = red; | ||
data[p + 1] = green; | ||
data[p + 2] = blue; | ||
data[p + 3] = 255; | ||
} | ||
} | ||
} | ||
// draw the current tile to the screen | ||
_finishTile(display) { | ||
display.blitImage(this._tileX, this._tileY, | ||
this._tileW, this._tileH, | ||
this._tileBuffer, 0); | ||
} | ||
} |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -18,2 +16,6 @@ * | ||
decodeRect(x, y, width, height, sock, display, depth) { | ||
if ((width === 0) || (height === 0)) { | ||
return true; | ||
} | ||
if (this._lines === 0) { | ||
@@ -30,5 +32,7 @@ this._lines = height; | ||
const cur_y = y + (height - this._lines); | ||
const curr_height = Math.min(this._lines, | ||
Math.floor(sock.rQlen / bytesPerLine)); | ||
const curY = y + (height - this._lines); | ||
const currHeight = Math.min(this._lines, | ||
Math.floor(sock.rQlen / bytesPerLine)); | ||
const pixels = width * currHeight; | ||
let data = sock.rQ; | ||
@@ -39,3 +43,2 @@ let index = sock.rQi; | ||
if (depth == 8) { | ||
const pixels = width * curr_height; | ||
const newdata = new Uint8Array(pixels * 4); | ||
@@ -46,3 +49,3 @@ for (let i = 0; i < pixels; i++) { | ||
newdata[i * 4 + 2] = ((data[index + i] >> 4) & 0x3) * 255 / 3; | ||
newdata[i * 4 + 4] = 0; | ||
newdata[i * 4 + 3] = 255; | ||
} | ||
@@ -53,5 +56,10 @@ data = newdata; | ||
display.blitImage(x, cur_y, width, curr_height, data, index); | ||
sock.rQskipBytes(curr_height * bytesPerLine); | ||
this._lines -= curr_height; | ||
// Max sure the image is fully opaque | ||
for (let i = 0; i < pixels; i++) { | ||
data[i * 4 + 3] = 255; | ||
} | ||
display.blitImage(x, curY, width, currHeight, data, index); | ||
sock.rQskipBytes(currHeight * bytesPerLine); | ||
this._lines -= currHeight; | ||
if (this._lines > 0) { | ||
@@ -58,0 +66,0 @@ return false; |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -7,0 +5,0 @@ * |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2019 The noVNC Authors | ||
* (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca) | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -61,3 +59,3 @@ * | ||
sock, display, depth); | ||
} else if ((this._ctl & 0x80) == 0) { | ||
} else if ((this._ctl & 0x08) == 0) { | ||
ret = this._basicRect(this._ctl, x, y, width, height, | ||
@@ -86,3 +84,3 @@ sock, display, depth); | ||
display.fillRect(x, y, width, height, | ||
[rQ[rQi + 2], rQ[rQi + 1], rQ[rQi]], false); | ||
[rQ[rQi], rQ[rQi + 1], rQ[rQi + 2]], false); | ||
sock.rQskipBytes(3); | ||
@@ -99,3 +97,3 @@ | ||
display.imageRect(x, y, "image/jpeg", data); | ||
display.imageRect(x, y, width, height, "image/jpeg", data); | ||
@@ -156,2 +154,6 @@ return true; | ||
if (uncompressedSize === 0) { | ||
return true; | ||
} | ||
if (uncompressedSize < 12) { | ||
@@ -169,10 +171,17 @@ if (sock.rQwait("TIGHT", uncompressedSize)) { | ||
data = this._zlibs[streamId].inflate(data, true, uncompressedSize); | ||
if (data.length != uncompressedSize) { | ||
throw new Error("Incomplete zlib block"); | ||
} | ||
this._zlibs[streamId].setInput(data); | ||
data = this._zlibs[streamId].inflate(uncompressedSize); | ||
this._zlibs[streamId].setInput(null); | ||
} | ||
display.blitRgbImage(x, y, width, height, data, 0, false); | ||
let rgbx = new Uint8Array(width * height * 4); | ||
for (let i = 0, j = 0; i < width * height * 4; i += 4, j += 3) { | ||
rgbx[i] = data[j]; | ||
rgbx[i + 1] = data[j + 1]; | ||
rgbx[i + 2] = data[j + 2]; | ||
rgbx[i + 3] = 255; // Alpha | ||
} | ||
display.blitImage(x, y, width, height, rgbx, 0, false); | ||
return true; | ||
@@ -206,2 +215,6 @@ } | ||
if (uncompressedSize === 0) { | ||
return true; | ||
} | ||
if (uncompressedSize < 12) { | ||
@@ -219,6 +232,5 @@ if (sock.rQwait("TIGHT", uncompressedSize)) { | ||
data = this._zlibs[streamId].inflate(data, true, uncompressedSize); | ||
if (data.length != uncompressedSize) { | ||
throw new Error("Incomplete zlib block"); | ||
} | ||
this._zlibs[streamId].setInput(data); | ||
data = this._zlibs[streamId].inflate(uncompressedSize); | ||
this._zlibs[streamId].setInput(null); | ||
} | ||
@@ -251,3 +263,3 @@ | ||
sp = (data[y * w + x] >> b & 1) * 3; | ||
dest[dp] = palette[sp]; | ||
dest[dp] = palette[sp]; | ||
dest[dp + 1] = palette[sp + 1]; | ||
@@ -262,3 +274,3 @@ dest[dp + 2] = palette[sp + 2]; | ||
sp = (data[y * w + x] >> b & 1) * 3; | ||
dest[dp] = palette[sp]; | ||
dest[dp] = palette[sp]; | ||
dest[dp + 1] = palette[sp + 1]; | ||
@@ -270,3 +282,3 @@ dest[dp + 2] = palette[sp + 2]; | ||
display.blitRgbxImage(x, y, width, height, dest, 0, false); | ||
display.blitImage(x, y, width, height, dest, 0, false); | ||
} | ||
@@ -280,3 +292,3 @@ | ||
const sp = data[j] * 3; | ||
dest[i] = palette[sp]; | ||
dest[i] = palette[sp]; | ||
dest[i + 1] = palette[sp + 1]; | ||
@@ -287,3 +299,3 @@ dest[i + 2] = palette[sp + 2]; | ||
display.blitRgbxImage(x, y, width, height, dest, 0, false); | ||
display.blitImage(x, y, width, height, dest, 0, false); | ||
} | ||
@@ -290,0 +302,0 @@ |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -21,3 +19,3 @@ * | ||
display.imageRect(x, y, "image/png", data); | ||
display.imageRect(x, y, width, height, "image/png", data); | ||
@@ -24,0 +22,0 @@ return true; |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -11,3 +11,3 @@ * | ||
import Base64 from "./base64.js"; | ||
import { supportsImageMetadata } from './util/browser.js'; | ||
import { toSigned32bit } from './util/int.js'; | ||
@@ -17,3 +17,2 @@ export default class Display { | ||
this._drawCtx = null; | ||
this._c_forceCanvas = false; | ||
@@ -24,10 +23,6 @@ this._renderQ = []; // queue drawing actions for in-oder rendering | ||
// the full frame buffer (logical canvas) size | ||
this._fb_width = 0; | ||
this._fb_height = 0; | ||
this._fbWidth = 0; | ||
this._fbHeight = 0; | ||
this._prevDrawStyle = ""; | ||
this._tile = null; | ||
this._tile16x16 = null; | ||
this._tile_x = 0; | ||
this._tile_y = 0; | ||
@@ -66,10 +61,2 @@ Log.Debug(">> Display.constructor"); | ||
this.clear(); | ||
// Check canvas features | ||
if (!('createImageData' in this._drawCtx)) { | ||
throw new Error("Canvas does not support createImageData"); | ||
} | ||
this._tile16x16 = this._drawCtx.createImageData(16, 16); | ||
Log.Debug("<< Display.constructor"); | ||
@@ -81,3 +68,2 @@ | ||
this._clipViewport = false; | ||
this.logo = null; | ||
@@ -106,7 +92,7 @@ // ===== EVENT HANDLERS ===== | ||
get width() { | ||
return this._fb_width; | ||
return this._fbWidth; | ||
} | ||
get height() { | ||
return this._fb_height; | ||
return this._fbHeight; | ||
} | ||
@@ -134,4 +120,4 @@ | ||
} | ||
if (vx2 + deltaX >= this._fb_width) { | ||
deltaX -= vx2 + deltaX - this._fb_width + 1; | ||
if (vx2 + deltaX >= this._fbWidth) { | ||
deltaX -= vx2 + deltaX - this._fbWidth + 1; | ||
} | ||
@@ -142,4 +128,4 @@ | ||
} | ||
if (vy2 + deltaY >= this._fb_height) { | ||
deltaY -= (vy2 + deltaY - this._fb_height + 1); | ||
if (vy2 + deltaY >= this._fbHeight) { | ||
deltaY -= (vy2 + deltaY - this._fbHeight + 1); | ||
} | ||
@@ -167,4 +153,4 @@ | ||
Log.Debug("Setting viewport to full display region"); | ||
width = this._fb_width; | ||
height = this._fb_height; | ||
width = this._fbWidth; | ||
height = this._fbHeight; | ||
} | ||
@@ -175,7 +161,7 @@ | ||
if (width > this._fb_width) { | ||
width = this._fb_width; | ||
if (width > this._fbWidth) { | ||
width = this._fbWidth; | ||
} | ||
if (height > this._fb_height) { | ||
height = this._fb_height; | ||
if (height > this._fbHeight) { | ||
height = this._fbHeight; | ||
} | ||
@@ -204,7 +190,13 @@ | ||
absX(x) { | ||
return x / this._scale + this._viewportLoc.x; | ||
if (this._scale === 0) { | ||
return 0; | ||
} | ||
return toSigned32bit(x / this._scale + this._viewportLoc.x); | ||
} | ||
absY(y) { | ||
return y / this._scale + this._viewportLoc.y; | ||
if (this._scale === 0) { | ||
return 0; | ||
} | ||
return toSigned32bit(y / this._scale + this._viewportLoc.y); | ||
} | ||
@@ -215,4 +207,4 @@ | ||
this._fb_width = width; | ||
this._fb_height = height; | ||
this._fbWidth = width; | ||
this._fbHeight = height; | ||
@@ -265,5 +257,5 @@ const canvas = this._backbuffer; | ||
// rendering canvas | ||
flip(from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
this._renderQ_push({ | ||
flip(fromQueue) { | ||
if (this._renderQ.length !== 0 && !fromQueue) { | ||
this._renderQPush({ | ||
'type': 'flip' | ||
@@ -312,13 +304,2 @@ }); | ||
clear() { | ||
if (this._logo) { | ||
this.resize(this._logo.width, this._logo.height); | ||
this.imageRect(0, 0, this._logo.type, this._logo.data); | ||
} else { | ||
this.resize(240, 20); | ||
this._drawCtx.clearRect(0, 0, this._fb_width, this._fb_height); | ||
} | ||
this.flip(); | ||
} | ||
pending() { | ||
@@ -336,5 +317,5 @@ return this._renderQ.length > 0; | ||
fillRect(x, y, width, height, color, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
this._renderQ_push({ | ||
fillRect(x, y, width, height, color, fromQueue) { | ||
if (this._renderQ.length !== 0 && !fromQueue) { | ||
this._renderQPush({ | ||
'type': 'fill', | ||
@@ -354,10 +335,10 @@ 'x': x, | ||
copyImage(old_x, old_y, new_x, new_y, w, h, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
this._renderQ_push({ | ||
copyImage(oldX, oldY, newX, newY, w, h, fromQueue) { | ||
if (this._renderQ.length !== 0 && !fromQueue) { | ||
this._renderQPush({ | ||
'type': 'copy', | ||
'old_x': old_x, | ||
'old_y': old_y, | ||
'x': new_x, | ||
'y': new_y, | ||
'oldX': oldX, | ||
'oldY': oldY, | ||
'x': newX, | ||
'y': newY, | ||
'width': w, | ||
@@ -380,80 +361,37 @@ 'height': h, | ||
this._drawCtx.drawImage(this._backbuffer, | ||
old_x, old_y, w, h, | ||
new_x, new_y, w, h); | ||
this._damage(new_x, new_y, w, h); | ||
oldX, oldY, w, h, | ||
newX, newY, w, h); | ||
this._damage(newX, newY, w, h); | ||
} | ||
} | ||
imageRect(x, y, mime, arr) { | ||
imageRect(x, y, width, height, mime, arr) { | ||
/* The internal logic cannot handle empty images, so bail early */ | ||
if ((width === 0) || (height === 0)) { | ||
return; | ||
} | ||
const img = new Image(); | ||
img.src = "data: " + mime + ";base64," + Base64.encode(arr); | ||
this._renderQ_push({ | ||
this._renderQPush({ | ||
'type': 'img', | ||
'img': img, | ||
'x': x, | ||
'y': y | ||
'y': y, | ||
'width': width, | ||
'height': height | ||
}); | ||
} | ||
// start updating a tile | ||
startTile(x, y, width, height, color) { | ||
this._tile_x = x; | ||
this._tile_y = y; | ||
if (width === 16 && height === 16) { | ||
this._tile = this._tile16x16; | ||
} else { | ||
this._tile = this._drawCtx.createImageData(width, height); | ||
} | ||
const red = color[2]; | ||
const green = color[1]; | ||
const blue = color[0]; | ||
const data = this._tile.data; | ||
for (let i = 0; i < width * height * 4; i += 4) { | ||
data[i] = red; | ||
data[i + 1] = green; | ||
data[i + 2] = blue; | ||
data[i + 3] = 255; | ||
} | ||
} | ||
// update sub-rectangle of the current tile | ||
subTile(x, y, w, h, color) { | ||
const red = color[2]; | ||
const green = color[1]; | ||
const blue = color[0]; | ||
const xend = x + w; | ||
const yend = y + h; | ||
const data = this._tile.data; | ||
const width = this._tile.width; | ||
for (let j = y; j < yend; j++) { | ||
for (let i = x; i < xend; i++) { | ||
const p = (i + (j * width)) * 4; | ||
data[p] = red; | ||
data[p + 1] = green; | ||
data[p + 2] = blue; | ||
data[p + 3] = 255; | ||
} | ||
} | ||
} | ||
// draw the current tile to the screen | ||
finishTile() { | ||
this._drawCtx.putImageData(this._tile, this._tile_x, this._tile_y); | ||
this._damage(this._tile_x, this._tile_y, | ||
this._tile.width, this._tile.height); | ||
} | ||
blitImage(x, y, width, height, arr, offset, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
blitImage(x, y, width, height, arr, offset, fromQueue) { | ||
if (this._renderQ.length !== 0 && !fromQueue) { | ||
// NB(directxman12): it's technically more performant here to use preallocated arrays, | ||
// but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, | ||
// this probably isn't getting called *nearly* as much | ||
const new_arr = new Uint8Array(width * height * 4); | ||
new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); | ||
this._renderQ_push({ | ||
const newArr = new Uint8Array(width * height * 4); | ||
newArr.set(new Uint8Array(arr.buffer, 0, newArr.length)); | ||
this._renderQPush({ | ||
'type': 'blit', | ||
'data': new_arr, | ||
'data': newArr, | ||
'x': x, | ||
@@ -465,46 +403,12 @@ 'y': y, | ||
} else { | ||
this._bgrxImageData(x, y, width, height, arr, offset); | ||
// NB(directxman12): arr must be an Type Array view | ||
let data = new Uint8ClampedArray(arr.buffer, | ||
arr.byteOffset + offset, | ||
width * height * 4); | ||
let img = new ImageData(data, width, height); | ||
this._drawCtx.putImageData(img, x, y); | ||
this._damage(x, y, width, height); | ||
} | ||
} | ||
blitRgbImage(x, y, width, height, arr, offset, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
// NB(directxman12): it's technically more performant here to use preallocated arrays, | ||
// but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, | ||
// this probably isn't getting called *nearly* as much | ||
const new_arr = new Uint8Array(width * height * 3); | ||
new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); | ||
this._renderQ_push({ | ||
'type': 'blitRgb', | ||
'data': new_arr, | ||
'x': x, | ||
'y': y, | ||
'width': width, | ||
'height': height, | ||
}); | ||
} else { | ||
this._rgbImageData(x, y, width, height, arr, offset); | ||
} | ||
} | ||
blitRgbxImage(x, y, width, height, arr, offset, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
// NB(directxman12): it's technically more performant here to use preallocated arrays, | ||
// but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, | ||
// this probably isn't getting called *nearly* as much | ||
const new_arr = new Uint8Array(width * height * 4); | ||
new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); | ||
this._renderQ_push({ | ||
'type': 'blitRgbx', | ||
'data': new_arr, | ||
'x': x, | ||
'y': y, | ||
'width': width, | ||
'height': height, | ||
}); | ||
} else { | ||
this._rgbxImageData(x, y, width, height, arr, offset); | ||
} | ||
} | ||
drawImage(img, x, y) { | ||
@@ -516,16 +420,18 @@ this._drawCtx.drawImage(img, x, y); | ||
autoscale(containerWidth, containerHeight) { | ||
let scaleRatio; | ||
if (containerWidth === 0 || containerHeight === 0) { | ||
Log.Warn("Autoscale doesn't work when width or height is zero"); | ||
return; | ||
} | ||
scaleRatio = 0; | ||
const vp = this._viewportLoc; | ||
const targetAspectRatio = containerWidth / containerHeight; | ||
const fbAspectRatio = vp.w / vp.h; | ||
} else { | ||
let scaleRatio; | ||
if (fbAspectRatio >= targetAspectRatio) { | ||
scaleRatio = containerWidth / vp.w; | ||
} else { | ||
scaleRatio = containerHeight / vp.h; | ||
const vp = this._viewportLoc; | ||
const targetAspectRatio = containerWidth / containerHeight; | ||
const fbAspectRatio = vp.w / vp.h; | ||
if (fbAspectRatio >= targetAspectRatio) { | ||
scaleRatio = containerWidth / vp.w; | ||
} else { | ||
scaleRatio = containerHeight / vp.h; | ||
} | ||
} | ||
@@ -557,3 +463,3 @@ | ||
_setFillColor(color) { | ||
const newStyle = 'rgb(' + color[2] + ',' + color[1] + ',' + color[0] + ')'; | ||
const newStyle = 'rgb(' + color[0] + ',' + color[1] + ',' + color[2] + ')'; | ||
if (newStyle !== this._prevDrawStyle) { | ||
@@ -565,42 +471,3 @@ this._drawCtx.fillStyle = newStyle; | ||
_rgbImageData(x, y, width, height, arr, offset) { | ||
const img = this._drawCtx.createImageData(width, height); | ||
const data = img.data; | ||
for (let i = 0, j = offset; i < width * height * 4; i += 4, j += 3) { | ||
data[i] = arr[j]; | ||
data[i + 1] = arr[j + 1]; | ||
data[i + 2] = arr[j + 2]; | ||
data[i + 3] = 255; // Alpha | ||
} | ||
this._drawCtx.putImageData(img, x, y); | ||
this._damage(x, y, img.width, img.height); | ||
} | ||
_bgrxImageData(x, y, width, height, arr, offset) { | ||
const img = this._drawCtx.createImageData(width, height); | ||
const data = img.data; | ||
for (let i = 0, j = offset; i < width * height * 4; i += 4, j += 4) { | ||
data[i] = arr[j + 2]; | ||
data[i + 1] = arr[j + 1]; | ||
data[i + 2] = arr[j]; | ||
data[i + 3] = 255; // Alpha | ||
} | ||
this._drawCtx.putImageData(img, x, y); | ||
this._damage(x, y, img.width, img.height); | ||
} | ||
_rgbxImageData(x, y, width, height, arr, offset) { | ||
// NB(directxman12): arr must be an Type Array view | ||
let img; | ||
if (supportsImageMetadata) { | ||
img = new ImageData(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4), width, height); | ||
} else { | ||
img = this._drawCtx.createImageData(width, height); | ||
img.data.set(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4)); | ||
} | ||
this._drawCtx.putImageData(img, x, y); | ||
this._damage(x, y, img.width, img.height); | ||
} | ||
_renderQ_push(action) { | ||
_renderQPush(action) { | ||
this._renderQ.push(action); | ||
@@ -610,14 +477,14 @@ if (this._renderQ.length === 1) { | ||
// the scanner will wait for the relevant event | ||
this._scan_renderQ(); | ||
this._scanRenderQ(); | ||
} | ||
} | ||
_resume_renderQ() { | ||
_resumeRenderQ() { | ||
// "this" is the object that is ready, not the | ||
// display object | ||
this.removeEventListener('load', this._noVNC_display._resume_renderQ); | ||
this._noVNC_display._scan_renderQ(); | ||
this.removeEventListener('load', this._noVNCDisplay._resumeRenderQ); | ||
this._noVNCDisplay._scanRenderQ(); | ||
} | ||
_scan_renderQ() { | ||
_scanRenderQ() { | ||
let ready = true; | ||
@@ -631,3 +498,3 @@ while (ready && this._renderQ.length > 0) { | ||
case 'copy': | ||
this.copyImage(a.old_x, a.old_y, a.x, a.y, a.width, a.height, true); | ||
this.copyImage(a.oldX, a.oldY, a.x, a.y, a.width, a.height, true); | ||
break; | ||
@@ -640,14 +507,14 @@ case 'fill': | ||
break; | ||
case 'blitRgb': | ||
this.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0, true); | ||
break; | ||
case 'blitRgbx': | ||
this.blitRgbxImage(a.x, a.y, a.width, a.height, a.data, 0, true); | ||
break; | ||
case 'img': | ||
if (a.img.complete) { | ||
if (a.img.width !== a.width || a.img.height !== a.height) { | ||
Log.Error("Decoded image has incorrect dimensions. Got " + | ||
a.img.width + "x" + a.img.height + ". Expected " + | ||
a.width + "x" + a.height + "."); | ||
return; | ||
} | ||
this.drawImage(a.img, a.x, a.y); | ||
} else { | ||
a.img._noVNC_display = this; | ||
a.img.addEventListener('load', this._resume_renderQ); | ||
a.img._noVNCDisplay = this; | ||
a.img.addEventListener('load', this._resumeRenderQ); | ||
// We need to wait for this image to 'load' | ||
@@ -654,0 +521,0 @@ // to keep things in-order |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -23,2 +23,3 @@ * | ||
pseudoEncodingQEMUExtendedKeyEvent: -258, | ||
pseudoEncodingDesktopName: -307, | ||
pseudoEncodingExtendedDesktopSize: -308, | ||
@@ -30,2 +31,4 @@ pseudoEncodingXvp: -309, | ||
pseudoEncodingCompressLevel0: -256, | ||
pseudoEncodingVMwareCursor: 0x574d5664, | ||
pseudoEncodingExtendedClipboard: 0xc0a1e5ce | ||
}; | ||
@@ -32,0 +35,0 @@ |
@@ -0,1 +1,9 @@ | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2020 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* See README.md for usage and integration instructions. | ||
*/ | ||
import { inflateInit, inflate, inflateReset } from "../vendor/pako/lib/zlib/inflate.js"; | ||
@@ -14,8 +22,18 @@ import ZStream from "../vendor/pako/lib/zlib/zstream.js"; | ||
inflate(data, flush, expected) { | ||
this.strm.input = data; | ||
this.strm.avail_in = this.strm.input.length; | ||
this.strm.next_in = 0; | ||
this.strm.next_out = 0; | ||
setInput(data) { | ||
if (!data) { | ||
//FIXME: flush remaining data. | ||
/* eslint-disable camelcase */ | ||
this.strm.input = null; | ||
this.strm.avail_in = 0; | ||
this.strm.next_in = 0; | ||
} else { | ||
this.strm.input = data; | ||
this.strm.avail_in = this.strm.input.length; | ||
this.strm.next_in = 0; | ||
/* eslint-enable camelcase */ | ||
} | ||
} | ||
inflate(expected) { | ||
// resize our output buffer if it's too small | ||
@@ -29,6 +47,16 @@ // (we could just use multiple chunks, but that would cause an extra | ||
this.strm.avail_out = this.chunkSize; | ||
/* eslint-disable camelcase */ | ||
this.strm.next_out = 0; | ||
this.strm.avail_out = expected; | ||
/* eslint-enable camelcase */ | ||
inflate(this.strm, flush); | ||
let ret = inflate(this.strm, 0); // Flush argument not used. | ||
if (ret < 0) { | ||
throw new Error("zlib inflate failed"); | ||
} | ||
if (this.strm.next_out != expected) { | ||
throw new Error("Incomplete zlib block"); | ||
} | ||
return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); | ||
@@ -35,0 +63,0 @@ } |
@@ -38,3 +38,3 @@ /* | ||
// 2.2. Modifier Keys | ||
// 3.2. Modifier Keys | ||
@@ -47,3 +47,2 @@ addLeftRight("Alt", KeyTable.XK_Alt_L, KeyTable.XK_Alt_R); | ||
// - FnLock | ||
addLeftRight("Hyper", KeyTable.XK_Super_L, KeyTable.XK_Super_R); | ||
addLeftRight("Meta", KeyTable.XK_Super_L, KeyTable.XK_Super_R); | ||
@@ -53,7 +52,8 @@ addStandard("NumLock", KeyTable.XK_Num_Lock); | ||
addLeftRight("Shift", KeyTable.XK_Shift_L, KeyTable.XK_Shift_R); | ||
addLeftRight("Super", KeyTable.XK_Super_L, KeyTable.XK_Super_R); | ||
// - Symbol | ||
// - SymbolLock | ||
// - Hyper | ||
// - Super | ||
// 2.3. Whitespace Keys | ||
// 3.3. Whitespace Keys | ||
@@ -64,8 +64,8 @@ addNumpad("Enter", KeyTable.XK_Return, KeyTable.XK_KP_Enter); | ||
// 2.4. Navigation Keys | ||
// 3.4. Navigation Keys | ||
addNumpad("ArrowDown", KeyTable.XK_Down, KeyTable.XK_KP_Down); | ||
addNumpad("ArrowUp", KeyTable.XK_Up, KeyTable.XK_KP_Up); | ||
addNumpad("ArrowLeft", KeyTable.XK_Left, KeyTable.XK_KP_Left); | ||
addNumpad("ArrowRight", KeyTable.XK_Right, KeyTable.XK_KP_Right); | ||
addNumpad("ArrowUp", KeyTable.XK_Up, KeyTable.XK_KP_Up); | ||
addNumpad("End", KeyTable.XK_End, KeyTable.XK_KP_End); | ||
@@ -76,5 +76,8 @@ addNumpad("Home", KeyTable.XK_Home, KeyTable.XK_KP_Home); | ||
// 2.5. Editing Keys | ||
// 3.5. Editing Keys | ||
addStandard("Backspace", KeyTable.XK_BackSpace); | ||
// Browsers send "Clear" for the numpad 5 without NumLock because | ||
// Windows uses VK_Clear for that key. But Unix expects KP_Begin for | ||
// that scenario. | ||
addNumpad("Clear", KeyTable.XK_Clear, KeyTable.XK_KP_Begin); | ||
@@ -92,3 +95,3 @@ addStandard("Copy", KeyTable.XF86XK_Copy); | ||
// 2.6. UI Keys | ||
// 3.6. UI Keys | ||
@@ -111,3 +114,3 @@ // - Accept | ||
// 2.7. Device Keys | ||
// 3.7. Device Keys | ||
@@ -125,6 +128,6 @@ addStandard("BrightnessDown", KeyTable.XF86XK_MonBrightnessDown); | ||
// 2.8. IME and Composition Keys | ||
// 3.8. IME and Composition Keys | ||
addStandard("AllCandidates", KeyTable.XK_MultipleCandidate); | ||
addStandard("Alphanumeric", KeyTable.XK_Eisu_Shift); // could also be _Eisu_Toggle | ||
addStandard("Alphanumeric", KeyTable.XK_Eisu_toggle); | ||
addStandard("CodeInput", KeyTable.XK_Codeinput); | ||
@@ -147,3 +150,3 @@ addStandard("Compose", KeyTable.XK_Multi_key); | ||
addStandard("HanjaMode", KeyTable.XK_Hangul_Hanja); | ||
addStandard("JunjuaMode", KeyTable.XK_Hangul_Jeonja); | ||
addStandard("JunjaMode", KeyTable.XK_Hangul_Jeonja); | ||
addStandard("Eisu", KeyTable.XK_Eisu_toggle); | ||
@@ -158,5 +161,5 @@ addStandard("Hankaku", KeyTable.XK_Hankaku); | ||
addStandard("Zenkaku", KeyTable.XK_Zenkaku); | ||
addStandard("ZenkakuHanaku", KeyTable.XK_Zenkaku_Hankaku); | ||
addStandard("ZenkakuHankaku", KeyTable.XK_Zenkaku_Hankaku); | ||
// 2.9. General-Purpose Function Keys | ||
// 3.9. General-Purpose Function Keys | ||
@@ -200,3 +203,3 @@ addStandard("F1", KeyTable.XK_F1); | ||
// 2.10. Multimedia Keys | ||
// 3.10. Multimedia Keys | ||
@@ -208,6 +211,8 @@ // - ChannelDown | ||
addStandard("MailReply", KeyTable.XF86XK_Reply); | ||
addStandard("MainSend", KeyTable.XF86XK_Send); | ||
addStandard("MailSend", KeyTable.XF86XK_Send); | ||
// - MediaClose | ||
addStandard("MediaFastForward", KeyTable.XF86XK_AudioForward); | ||
addStandard("MediaPause", KeyTable.XF86XK_AudioPause); | ||
addStandard("MediaPlay", KeyTable.XF86XK_AudioPlay); | ||
// - MediaPlayPause | ||
addStandard("MediaRecord", KeyTable.XF86XK_AudioRecord); | ||
@@ -224,3 +229,3 @@ addStandard("MediaRewind", KeyTable.XF86XK_AudioRewind); | ||
// 2.11. Multimedia Numpad Keys | ||
// 3.11. Multimedia Numpad Keys | ||
@@ -230,11 +235,9 @@ // - Key11 | ||
// 2.12. Audio Keys | ||
// 3.12. Audio Keys | ||
// - AudioBalanceLeft | ||
// - AudioBalanceRight | ||
// - AudioBassDown | ||
// - AudioBassBoostDown | ||
// - AudioBassBoostToggle | ||
// - AudioBassBoostUp | ||
// - AudioBassUp | ||
// - AudioFaderFront | ||
@@ -253,3 +256,3 @@ // - AudioFaderRear | ||
// 2.13. Speech Keys | ||
// 3.13. Speech Keys | ||
@@ -259,10 +262,11 @@ // - SpeechCorrectionList | ||
// 2.14. Application Keys | ||
// 3.14. Application Keys | ||
addStandard("LaunchCalculator", KeyTable.XF86XK_Calculator); | ||
addStandard("LaunchApplication1", KeyTable.XF86XK_MyComputer); | ||
addStandard("LaunchApplication2", KeyTable.XF86XK_Calculator); | ||
addStandard("LaunchCalendar", KeyTable.XF86XK_Calendar); | ||
// - LaunchContacts | ||
addStandard("LaunchMail", KeyTable.XF86XK_Mail); | ||
addStandard("LaunchMediaPlayer", KeyTable.XF86XK_AudioMedia); | ||
addStandard("LaunchMusicPlayer", KeyTable.XF86XK_Music); | ||
addStandard("LaunchMyComputer", KeyTable.XF86XK_MyComputer); | ||
addStandard("LaunchPhone", KeyTable.XF86XK_Phone); | ||
@@ -275,3 +279,3 @@ addStandard("LaunchScreenSaver", KeyTable.XF86XK_ScreenSaver); | ||
// 2.15. Browser Keys | ||
// 3.15. Browser Keys | ||
@@ -286,11 +290,11 @@ addStandard("BrowserBack", KeyTable.XF86XK_Back); | ||
// 2.16. Mobile Phone Keys | ||
// 3.16. Mobile Phone Keys | ||
// - A whole bunch... | ||
// 2.17. TV Keys | ||
// 3.17. TV Keys | ||
// - A whole bunch... | ||
// 2.18. Media Controller Keys | ||
// 3.18. Media Controller Keys | ||
@@ -297,0 +301,0 @@ // - A whole bunch... |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||
@@ -23,3 +23,2 @@ */ | ||
// (even if they are happy) | ||
this._pendingKey = null; // Key waiting for keypress | ||
this._altGrArmed = false; // Windows AltGr detection | ||
@@ -31,5 +30,3 @@ | ||
'keydown': this._handleKeyDown.bind(this), | ||
'keypress': this._handleKeyPress.bind(this), | ||
'blur': this._allKeysUp.bind(this), | ||
'checkalt': this._checkAlt.bind(this), | ||
}; | ||
@@ -67,5 +64,3 @@ | ||
// Unstable, but we don't have anything else to go on | ||
// (don't use it for 'keypress' events thought since | ||
// WebKit sets it to the same as charCode) | ||
if (e.keyCode && (e.type !== 'keypress')) { | ||
if (e.keyCode) { | ||
// 229 is used for composition events | ||
@@ -124,5 +119,3 @@ if (e.keyCode !== 229) { | ||
// to deal with virtual keyboards which omit key info | ||
// (iOS omits tracking info on keyup events, which forces us to | ||
// special treat that platform here) | ||
if ((code === 'Unidentified') || browser.isIOS()) { | ||
if (code === 'Unidentified') { | ||
if (keysym) { | ||
@@ -144,3 +137,3 @@ // If it's a virtual keyboard then it should be | ||
// possibly others). | ||
if (browser.isMac()) { | ||
if (browser.isMac() || browser.isIOS()) { | ||
switch (keysym) { | ||
@@ -172,3 +165,3 @@ case KeyTable.XK_Super_L: | ||
// it was a quick press and release of the button. | ||
if (browser.isMac() && (code === 'CapsLock')) { | ||
if ((browser.isMac() || browser.isIOS()) && (code === 'CapsLock')) { | ||
this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', true); | ||
@@ -180,16 +173,16 @@ this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', false); | ||
// If this is a legacy browser then we'll need to wait for | ||
// a keypress event as well | ||
// (IE and Edge has a broken KeyboardEvent.key, so we can't | ||
// just check for the presence of that field) | ||
if (!keysym && (!e.key || browser.isIE() || browser.isEdge())) { | ||
this._pendingKey = code; | ||
// However we might not get a keypress event if the key | ||
// is non-printable, which needs some special fallback | ||
// handling | ||
setTimeout(this._handleKeyPressTimeout.bind(this), 10, e); | ||
// Windows doesn't send proper key releases for a bunch of | ||
// Japanese IM keys so we have to fake the release right away | ||
const jpBadKeys = [ KeyTable.XK_Zenkaku_Hankaku, | ||
KeyTable.XK_Eisu_toggle, | ||
KeyTable.XK_Katakana, | ||
KeyTable.XK_Hiragana, | ||
KeyTable.XK_Romaji ]; | ||
if (browser.isWindows() && jpBadKeys.includes(keysym)) { | ||
this._sendKeyEvent(keysym, code, true); | ||
this._sendKeyEvent(keysym, code, false); | ||
stopEvent(e); | ||
return; | ||
} | ||
this._pendingKey = null; | ||
stopEvent(e); | ||
@@ -209,65 +202,2 @@ | ||
// Legacy event for browsers without code/key | ||
_handleKeyPress(e) { | ||
stopEvent(e); | ||
// Are we expecting a keypress? | ||
if (this._pendingKey === null) { | ||
return; | ||
} | ||
let code = this._getKeyCode(e); | ||
const keysym = KeyboardUtil.getKeysym(e); | ||
// The key we were waiting for? | ||
if ((code !== 'Unidentified') && (code != this._pendingKey)) { | ||
return; | ||
} | ||
code = this._pendingKey; | ||
this._pendingKey = null; | ||
if (!keysym) { | ||
Log.Info('keypress with no keysym:', e); | ||
return; | ||
} | ||
this._sendKeyEvent(keysym, code, true); | ||
} | ||
_handleKeyPressTimeout(e) { | ||
// Did someone manage to sort out the key already? | ||
if (this._pendingKey === null) { | ||
return; | ||
} | ||
let keysym; | ||
const code = this._pendingKey; | ||
this._pendingKey = null; | ||
// We have no way of knowing the proper keysym with the | ||
// information given, but the following are true for most | ||
// layouts | ||
if ((e.keyCode >= 0x30) && (e.keyCode <= 0x39)) { | ||
// Digit | ||
keysym = e.keyCode; | ||
} else if ((e.keyCode >= 0x41) && (e.keyCode <= 0x5a)) { | ||
// Character (A-Z) | ||
let char = String.fromCharCode(e.keyCode); | ||
// A feeble attempt at the correct case | ||
if (e.shiftKey) { | ||
char = char.toUpperCase(); | ||
} else { | ||
char = char.toLowerCase(); | ||
} | ||
keysym = char.charCodeAt(); | ||
} else { | ||
// Unknown, give up | ||
keysym = 0; | ||
} | ||
this._sendKeyEvent(keysym, code, true); | ||
} | ||
_handleKeyUp(e) { | ||
@@ -287,3 +217,3 @@ stopEvent(e); | ||
// See comment in _handleKeyDown() | ||
if (browser.isMac() && (code === 'CapsLock')) { | ||
if ((browser.isMac() || browser.isIOS()) && (code === 'CapsLock')) { | ||
this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', true); | ||
@@ -295,2 +225,17 @@ this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', false); | ||
this._sendKeyEvent(this._keyDownList[code], code, false); | ||
// Windows has a rather nasty bug where it won't send key | ||
// release events for a Shift button if the other Shift is still | ||
// pressed | ||
if (browser.isWindows() && ((code === 'ShiftLeft') || | ||
(code === 'ShiftRight'))) { | ||
if ('ShiftRight' in this._keyDownList) { | ||
this._sendKeyEvent(this._keyDownList['ShiftRight'], | ||
'ShiftRight', false); | ||
} | ||
if ('ShiftLeft' in this._keyDownList) { | ||
this._sendKeyEvent(this._keyDownList['ShiftLeft'], | ||
'ShiftLeft', false); | ||
} | ||
} | ||
} | ||
@@ -312,22 +257,2 @@ | ||
// Firefox Alt workaround, see below | ||
_checkAlt(e) { | ||
if (e.altKey) { | ||
return; | ||
} | ||
const target = this._target; | ||
const downList = this._keyDownList; | ||
['AltLeft', 'AltRight'].forEach((code) => { | ||
if (!(code in downList)) { | ||
return; | ||
} | ||
const event = new KeyboardEvent('keyup', | ||
{ key: downList[code], | ||
code: code }); | ||
target.dispatchEvent(event); | ||
}); | ||
} | ||
// ===== PUBLIC METHODS ===== | ||
@@ -340,3 +265,2 @@ | ||
this._target.addEventListener('keyup', this._eventHandlers.keyup); | ||
this._target.addEventListener('keypress', this._eventHandlers.keypress); | ||
@@ -346,15 +270,2 @@ // Release (key up) if window loses focus | ||
// Firefox has broken handling of Alt, so we need to poll as | ||
// best we can for releases (still doesn't prevent the menu | ||
// from popping up though as we can't call preventDefault()) | ||
if (browser.isWindows() && browser.isFirefox()) { | ||
const handler = this._eventHandlers.checkalt; | ||
['mousedown', 'mouseup', 'mousemove', 'wheel', | ||
'touchstart', 'touchend', 'touchmove', | ||
'keydown', 'keyup'].forEach(type => | ||
document.addEventListener(type, handler, | ||
{ capture: true, | ||
passive: true })); | ||
} | ||
//Log.Debug("<< Keyboard.grab"); | ||
@@ -366,12 +277,4 @@ } | ||
if (browser.isWindows() && browser.isFirefox()) { | ||
const handler = this._eventHandlers.checkalt; | ||
['mousedown', 'mouseup', 'mousemove', 'wheel', | ||
'touchstart', 'touchend', 'touchmove', | ||
'keydown', 'keyup'].forEach(type => document.removeEventListener(type, handler)); | ||
} | ||
this._target.removeEventListener('keydown', this._eventHandlers.keydown); | ||
this._target.removeEventListener('keyup', this._eventHandlers.keyup); | ||
this._target.removeEventListener('keypress', this._eventHandlers.keypress); | ||
window.removeEventListener('blur', this._eventHandlers.blur); | ||
@@ -378,0 +281,0 @@ |
@@ -0,1 +1,2 @@ | ||
import KeyTable from "./keysym.js"; | ||
import keysyms from "./keysymdef.js"; | ||
@@ -24,5 +25,4 @@ import vkeys from "./vkeys.js"; | ||
// The de-facto standard is to use Windows Virtual-Key codes | ||
// in the 'keyCode' field for non-printable characters. However | ||
// Webkit sets it to the same as charCode in 'keypress' events. | ||
if ((evt.type !== 'keypress') && (evt.keyCode in vkeys)) { | ||
// in the 'keyCode' field for non-printable characters | ||
if (evt.keyCode in vkeys) { | ||
let code = vkeys[evt.keyCode]; | ||
@@ -72,25 +72,7 @@ | ||
if (evt.key !== undefined) { | ||
// IE and Edge use some ancient version of the spec | ||
// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/ | ||
switch (evt.key) { | ||
case 'Spacebar': return ' '; | ||
case 'Esc': return 'Escape'; | ||
case 'Scroll': return 'ScrollLock'; | ||
case 'Win': return 'Meta'; | ||
case 'Apps': return 'ContextMenu'; | ||
case 'Up': return 'ArrowUp'; | ||
case 'Left': return 'ArrowLeft'; | ||
case 'Right': return 'ArrowRight'; | ||
case 'Down': return 'ArrowDown'; | ||
case 'Del': return 'Delete'; | ||
case 'Divide': return '/'; | ||
case 'Multiply': return '*'; | ||
case 'Subtract': return '-'; | ||
case 'Add': return '+'; | ||
case 'Decimal': return evt.char; | ||
} | ||
// Mozilla isn't fully in sync with the spec yet | ||
switch (evt.key) { | ||
case 'OS': return 'Meta'; | ||
case 'LaunchMyComputer': return 'LaunchApplication1'; | ||
case 'LaunchCalculator': return 'LaunchApplication2'; | ||
} | ||
@@ -107,7 +89,8 @@ | ||
// IE and Edge have broken handling of AltGraph so we cannot | ||
// trust them for printable characters | ||
if ((evt.key.length !== 1) || (!browser.isIE() && !browser.isEdge())) { | ||
return evt.key; | ||
// Broken behaviour in Chrome | ||
if ((evt.key === '\x00') && (evt.code === 'NumpadDecimal')) { | ||
return 'Delete'; | ||
} | ||
return evt.key; | ||
} | ||
@@ -147,2 +130,10 @@ | ||
// And for Clear | ||
if ((key === 'Clear') && (location === 3)) { | ||
let code = getKeycode(evt); | ||
if (code === 'NumLock') { | ||
location = 0; | ||
} | ||
} | ||
if ((location === undefined) || (location > 3)) { | ||
@@ -152,2 +143,38 @@ location = 0; | ||
// The original Meta key now gets confused with the Windows key | ||
// https://bugs.chromium.org/p/chromium/issues/detail?id=1020141 | ||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1232918 | ||
if (key === 'Meta') { | ||
let code = getKeycode(evt); | ||
if (code === 'AltLeft') { | ||
return KeyTable.XK_Meta_L; | ||
} else if (code === 'AltRight') { | ||
return KeyTable.XK_Meta_R; | ||
} | ||
} | ||
// macOS has Clear instead of NumLock, but the remote system is | ||
// probably not macOS, so lying here is probably best... | ||
if (key === 'Clear') { | ||
let code = getKeycode(evt); | ||
if (code === 'NumLock') { | ||
return KeyTable.XK_Num_Lock; | ||
} | ||
} | ||
// Windows sends alternating symbols for some keys when using a | ||
// Japanese layout. We have no way of synchronising with the IM | ||
// running on the remote system, so we send some combined keysym | ||
// instead and hope for the best. | ||
if (browser.isWindows()) { | ||
switch (key) { | ||
case 'Zenkaku': | ||
case 'Hankaku': | ||
return KeyTable.XK_Zenkaku_Hankaku; | ||
case 'Romaji': | ||
case 'KanaMode': | ||
return KeyTable.XK_Romaji; | ||
} | ||
} | ||
return DOMKeyTable[key][location]; | ||
@@ -154,0 +181,0 @@ } |
@@ -16,3 +16,2 @@ /* | ||
0x0a: 'NumpadClear', | ||
0x0c: 'Numpad5', // IE11 sends evt.keyCode: 12 when numlock is off | ||
0x0d: 'Enter', | ||
@@ -19,0 +18,0 @@ 0x10: 'ShiftLeft', |
/* | ||
* This file is auto-generated from keymaps.csv on 2017-05-31 16:20 | ||
* Database checksum sha256(92fd165507f2a3b8c5b3fa56e425d45788dbcb98cf067a307527d91ce22cab94) | ||
* This file is auto-generated from keymaps.csv | ||
* Database checksum sha256(76d68c10e97d37fe2ea459e210125ae41796253fb217e900bf2983ade13a7920) | ||
* To re-generate, run: | ||
* keymap-gen --lang=js code-map keymaps.csv html atset1 | ||
* keymap-gen code-map --lang=js keymaps.csv html atset1 | ||
*/ | ||
@@ -114,2 +114,4 @@ export default { | ||
"KeyZ": 0x2c, /* html:KeyZ (KeyZ) -> linux:44 (KEY_Z) -> atset1:44 */ | ||
"Lang1": 0x72, /* html:Lang1 (Lang1) -> linux:122 (KEY_HANGEUL) -> atset1:114 */ | ||
"Lang2": 0x71, /* html:Lang2 (Lang2) -> linux:123 (KEY_HANJA) -> atset1:113 */ | ||
"Lang3": 0x78, /* html:Lang3 (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */ | ||
@@ -116,0 +118,0 @@ "Lang4": 0x77, /* html:Lang4 (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */ |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* See README.md for usage and integration instructions. | ||
* | ||
* Browser feature support detection | ||
*/ | ||
@@ -34,3 +36,3 @@ | ||
if (target.style.cursor) { | ||
if (target.style.cursor.indexOf("url") === 0) { | ||
Log.Info("Data URI scheme cursor supported"); | ||
@@ -47,11 +49,34 @@ _supportsCursorURIs = true; | ||
let _supportsImageMetadata = false; | ||
let _hasScrollbarGutter = true; | ||
try { | ||
new ImageData(new Uint8ClampedArray(4), 1, 1); | ||
_supportsImageMetadata = true; | ||
} catch (ex) { | ||
// ignore failure | ||
// Create invisible container | ||
const container = document.createElement('div'); | ||
container.style.visibility = 'hidden'; | ||
container.style.overflow = 'scroll'; // forcing scrollbars | ||
document.body.appendChild(container); | ||
// Create a div and place it in the container | ||
const child = document.createElement('div'); | ||
container.appendChild(child); | ||
// Calculate the difference between the container's full width | ||
// and the child's width - the difference is the scrollbars | ||
const scrollbarWidth = (container.offsetWidth - child.offsetWidth); | ||
// Clean up | ||
container.parentNode.removeChild(container); | ||
_hasScrollbarGutter = scrollbarWidth != 0; | ||
} catch (exc) { | ||
Log.Error("Scrollbar test exception: " + exc); | ||
} | ||
export const supportsImageMetadata = _supportsImageMetadata; | ||
export const hasScrollbarGutter = _hasScrollbarGutter; | ||
/* | ||
* The functions for detection of platforms and browsers below are exported | ||
* but the use of these should be minimized as much as possible. | ||
* | ||
* It's better to use feature detection than platform detection. | ||
*/ | ||
export function isMac() { | ||
@@ -72,6 +97,2 @@ return navigator && !!(/mac/i).exec(navigator.platform); | ||
export function isAndroid() { | ||
return navigator && !!(/android/i).exec(navigator.userAgent); | ||
} | ||
export function isSafari() { | ||
@@ -82,10 +103,2 @@ return navigator && (navigator.userAgent.indexOf('Safari') !== -1 && | ||
export function isIE() { | ||
return navigator && !!(/trident/i).exec(navigator.userAgent); | ||
} | ||
export function isEdge() { | ||
return navigator && !!(/edge/i).exec(navigator.userAgent); | ||
} | ||
export function isFirefox() { | ||
@@ -92,0 +105,0 @@ return navigator && !!(/firefox/i).exec(navigator.userAgent); |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||
@@ -23,3 +23,2 @@ */ | ||
this._canvas.style.visibility = 'hidden'; | ||
document.body.appendChild(this._canvas); | ||
} | ||
@@ -35,5 +34,2 @@ | ||
'mouseup': this._handleMouseUp.bind(this), | ||
'touchstart': this._handleTouchStart.bind(this), | ||
'touchmove': this._handleTouchMove.bind(this), | ||
'touchend': this._handleTouchEnd.bind(this), | ||
}; | ||
@@ -50,5 +46,4 @@ } | ||
if (useFallback) { | ||
// FIXME: These don't fire properly except for mouse | ||
/// movement in IE. We want to also capture element | ||
// movement, size changes, visibility, etc. | ||
document.body.appendChild(this._canvas); | ||
const options = { capture: true, passive: true }; | ||
@@ -59,7 +54,2 @@ this._target.addEventListener('mouseover', this._eventHandlers.mouseover, options); | ||
this._target.addEventListener('mouseup', this._eventHandlers.mouseup, options); | ||
// There is no "touchleave" so we monitor touchstart globally | ||
window.addEventListener('touchstart', this._eventHandlers.touchstart, options); | ||
this._target.addEventListener('touchmove', this._eventHandlers.touchmove, options); | ||
this._target.addEventListener('touchend', this._eventHandlers.touchend, options); | ||
} | ||
@@ -71,2 +61,6 @@ | ||
detach() { | ||
if (!this._target) { | ||
return; | ||
} | ||
if (useFallback) { | ||
@@ -79,5 +73,3 @@ const options = { capture: true, passive: true }; | ||
window.removeEventListener('touchstart', this._eventHandlers.touchstart, options); | ||
this._target.removeEventListener('touchmove', this._eventHandlers.touchmove, options); | ||
this._target.removeEventListener('touchend', this._eventHandlers.touchend, options); | ||
document.body.removeChild(this._canvas); | ||
} | ||
@@ -104,10 +96,3 @@ | ||
let img; | ||
try { | ||
// IE doesn't support this | ||
img = new ImageData(new Uint8ClampedArray(rgba), w, h); | ||
} catch (ex) { | ||
img = ctx.createImageData(w, h); | ||
img.data.set(new Uint8ClampedArray(rgba)); | ||
} | ||
let img = new ImageData(new Uint8ClampedArray(rgba), w, h); | ||
ctx.clearRect(0, 0, w, h); | ||
@@ -134,2 +119,23 @@ ctx.putImageData(img, 0, 0); | ||
// Mouse events might be emulated, this allows | ||
// moving the cursor in such cases | ||
move(clientX, clientY) { | ||
if (!useFallback) { | ||
return; | ||
} | ||
// clientX/clientY are relative the _visual viewport_, | ||
// but our position is relative the _layout viewport_, | ||
// so try to compensate when we can | ||
if (window.visualViewport) { | ||
this._position.x = clientX + window.visualViewport.offsetLeft; | ||
this._position.y = clientY + window.visualViewport.offsetTop; | ||
} else { | ||
this._position.x = clientX; | ||
this._position.y = clientY; | ||
} | ||
this._updatePosition(); | ||
let target = document.elementFromPoint(clientX, clientY); | ||
this._updateVisibility(target); | ||
} | ||
_handleMouseOver(event) { | ||
@@ -143,3 +149,4 @@ // This event could be because we're entering the target, or | ||
_handleMouseLeave(event) { | ||
this._hideCursor(); | ||
// Check if we should show the cursor on the element we are leaving to | ||
this._updateVisibility(event.relatedTarget); | ||
} | ||
@@ -162,25 +169,27 @@ | ||
this._updateVisibility(target); | ||
} | ||
_handleTouchStart(event) { | ||
// Just as for mouseover, we let the move handler deal with it | ||
this._handleTouchMove(event); | ||
// Captures end with a mouseup but we can't know the event order of | ||
// mouseup vs releaseCapture. | ||
// | ||
// In the cases when releaseCapture comes first, the code above is | ||
// enough. | ||
// | ||
// In the cases when the mouseup comes first, we need wait for the | ||
// browser to flush all events and then check again if the cursor | ||
// should be visible. | ||
if (this._captureIsActive()) { | ||
window.setTimeout(() => { | ||
// We might have detached at this point | ||
if (!this._target) { | ||
return; | ||
} | ||
// Refresh the target from elementFromPoint since queued events | ||
// might have altered the DOM | ||
target = document.elementFromPoint(event.clientX, | ||
event.clientY); | ||
this._updateVisibility(target); | ||
}, 0); | ||
} | ||
} | ||
_handleTouchMove(event) { | ||
this._updateVisibility(event.target); | ||
this._position.x = event.changedTouches[0].clientX - this._hotSpot.x; | ||
this._position.y = event.changedTouches[0].clientY - this._hotSpot.y; | ||
this._updatePosition(); | ||
} | ||
_handleTouchEnd(event) { | ||
// Same principle as for mouseup | ||
let target = document.elementFromPoint(event.changedTouches[0].clientX, | ||
event.changedTouches[0].clientY); | ||
this._updateVisibility(target); | ||
} | ||
_showCursor() { | ||
@@ -202,2 +211,5 @@ if (this._canvas.style.visibility === 'hidden') { | ||
_shouldShowCursor(target) { | ||
if (!target) { | ||
return false; | ||
} | ||
// Easy case | ||
@@ -221,2 +233,7 @@ if (target === this._target) { | ||
_updateVisibility(target) { | ||
// When the cursor target has capture we want to show the cursor. | ||
// So, if a capture is active - look at the captured element instead. | ||
if (this._captureIsActive()) { | ||
target = document.captureElement; | ||
} | ||
if (this._shouldShowCursor(target)) { | ||
@@ -233,2 +250,7 @@ this._showCursor(); | ||
} | ||
_captureIsActive() { | ||
return document.captureElement && | ||
document.documentElement.contains(document.captureElement); | ||
} | ||
} |
@@ -24,3 +24,4 @@ /* | ||
let _captureRecursion = false; | ||
let _captureElem = null; | ||
let _elementForUnflushedEvents = null; | ||
document.captureElement = null; | ||
function _captureProxy(e) { | ||
@@ -34,3 +35,7 @@ // Recursion protection as we'll see our own event | ||
_captureRecursion = true; | ||
_captureElem.dispatchEvent(newEv); | ||
if (document.captureElement) { | ||
document.captureElement.dispatchEvent(newEv); | ||
} else { | ||
_elementForUnflushedEvents.dispatchEvent(newEv); | ||
} | ||
_captureRecursion = false; | ||
@@ -53,19 +58,14 @@ | ||
// Follow cursor style of target element | ||
function _captureElemChanged() { | ||
const captureElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
captureElem.style.cursor = window.getComputedStyle(_captureElem).cursor; | ||
function _capturedElemChanged() { | ||
const proxyElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
proxyElem.style.cursor = window.getComputedStyle(document.captureElement).cursor; | ||
} | ||
const _captureObserver = new MutationObserver(_captureElemChanged); | ||
const _captureObserver = new MutationObserver(_capturedElemChanged); | ||
let _captureIndex = 0; | ||
export function setCapture(target) { | ||
if (target.setCapture) { | ||
export function setCapture(elem) { | ||
if (elem.setCapture) { | ||
elem.setCapture(); | ||
// IE releases capture on 'click' events which might not trigger | ||
elem.addEventListener('mouseup', releaseCapture); | ||
target.setCapture(); | ||
document.captureElement = target; | ||
} else { | ||
@@ -76,32 +76,31 @@ // Release any existing capture in case this method is | ||
let captureElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
let proxyElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
if (captureElem === null) { | ||
captureElem = document.createElement("div"); | ||
captureElem.id = "noVNC_mouse_capture_elem"; | ||
captureElem.style.position = "fixed"; | ||
captureElem.style.top = "0px"; | ||
captureElem.style.left = "0px"; | ||
captureElem.style.width = "100%"; | ||
captureElem.style.height = "100%"; | ||
captureElem.style.zIndex = 10000; | ||
captureElem.style.display = "none"; | ||
document.body.appendChild(captureElem); | ||
if (proxyElem === null) { | ||
proxyElem = document.createElement("div"); | ||
proxyElem.id = "noVNC_mouse_capture_elem"; | ||
proxyElem.style.position = "fixed"; | ||
proxyElem.style.top = "0px"; | ||
proxyElem.style.left = "0px"; | ||
proxyElem.style.width = "100%"; | ||
proxyElem.style.height = "100%"; | ||
proxyElem.style.zIndex = 10000; | ||
proxyElem.style.display = "none"; | ||
document.body.appendChild(proxyElem); | ||
// This is to make sure callers don't get confused by having | ||
// our blocking element as the target | ||
captureElem.addEventListener('contextmenu', _captureProxy); | ||
proxyElem.addEventListener('contextmenu', _captureProxy); | ||
captureElem.addEventListener('mousemove', _captureProxy); | ||
captureElem.addEventListener('mouseup', _captureProxy); | ||
proxyElem.addEventListener('mousemove', _captureProxy); | ||
proxyElem.addEventListener('mouseup', _captureProxy); | ||
} | ||
_captureElem = elem; | ||
_captureIndex++; | ||
document.captureElement = target; | ||
// Track cursor and get initial cursor | ||
_captureObserver.observe(elem, {attributes: true}); | ||
_captureElemChanged(); | ||
_captureObserver.observe(target, {attributes: true}); | ||
_capturedElemChanged(); | ||
captureElem.style.display = ""; | ||
proxyElem.style.display = ""; | ||
@@ -119,22 +118,22 @@ // We listen to events on window in order to keep tracking if it | ||
document.releaseCapture(); | ||
document.captureElement = null; | ||
} else { | ||
if (!_captureElem) { | ||
if (!document.captureElement) { | ||
return; | ||
} | ||
// There might be events already queued, so we need to wait for | ||
// them to flush. E.g. contextmenu in Microsoft Edge | ||
window.setTimeout((expected) => { | ||
// Only clear it if it's the expected grab (i.e. no one | ||
// else has initiated a new grab) | ||
if (_captureIndex === expected) { | ||
_captureElem = null; | ||
} | ||
}, 0, _captureIndex); | ||
// There might be events already queued. The event proxy needs | ||
// access to the captured element for these queued events. | ||
// E.g. contextmenu (right-click) in Microsoft Edge | ||
// | ||
// Before removing the capturedElem pointer we save it to a | ||
// temporary variable that the unflushed events can use. | ||
_elementForUnflushedEvents = document.captureElement; | ||
document.captureElement = null; | ||
_captureObserver.disconnect(); | ||
const captureElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
captureElem.style.display = "none"; | ||
const proxyElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
proxyElem.style.display = "none"; | ||
@@ -141,0 +140,0 @@ window.removeEventListener('mousemove', _captureProxy); |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -5,0 +5,0 @@ * |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -13,3 +13,3 @@ * | ||
let _log_level = 'warn'; | ||
let _logLevel = 'warn'; | ||
@@ -21,7 +21,7 @@ let Debug = () => {}; | ||
export function init_logging(level) { | ||
export function initLogging(level) { | ||
if (typeof level === 'undefined') { | ||
level = _log_level; | ||
level = _logLevel; | ||
} else { | ||
_log_level = level; | ||
_logLevel = level; | ||
} | ||
@@ -51,4 +51,4 @@ | ||
export function get_logging() { | ||
return _log_level; | ||
export function getLogging() { | ||
return _logLevel; | ||
} | ||
@@ -59,2 +59,2 @@ | ||
// Initialize logging level | ||
init_logging(); | ||
initLogging(); |
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -9,7 +9,21 @@ * | ||
/* | ||
* Decode from UTF-8 | ||
*/ | ||
export function decodeUTF8(utf8string) { | ||
return decodeURIComponent(escape(utf8string)); | ||
// Decode from UTF-8 | ||
export function decodeUTF8(utf8string, allowLatin1=false) { | ||
try { | ||
return decodeURIComponent(escape(utf8string)); | ||
} catch (e) { | ||
if (e instanceof URIError) { | ||
if (allowLatin1) { | ||
// If we allow Latin1 we can ignore any decoding fails | ||
// and in these cases return the original string | ||
return utf8string; | ||
} | ||
} | ||
throw e; | ||
} | ||
} | ||
// Encode to UTF-8 | ||
export function encodeUTF8(DOMString) { | ||
return unescape(encodeURIComponent(DOMString)); | ||
} |
/* | ||
* Websock: high-performance binary WebSockets | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Websock: high-performance buffering wrapper | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* Websock is similar to the standard WebSocket object but with extra | ||
* buffer handling. | ||
* Websock is similar to the standard WebSocket / RTCDataChannel object | ||
* but with extra buffer handling. | ||
* | ||
@@ -20,8 +20,35 @@ * Websock has built-in receive queue buffering; the message event | ||
// at the moment. It may be valuable to turn it on in the future. | ||
const ENABLE_COPYWITHIN = false; | ||
const MAX_RQ_GROW_SIZE = 40 * 1024 * 1024; // 40 MiB | ||
// Constants pulled from RTCDataChannelState enum | ||
// https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel/readyState#RTCDataChannelState_enum | ||
const DataChannel = { | ||
CONNECTING: "connecting", | ||
OPEN: "open", | ||
CLOSING: "closing", | ||
CLOSED: "closed" | ||
}; | ||
const ReadyStates = { | ||
CONNECTING: [WebSocket.CONNECTING, DataChannel.CONNECTING], | ||
OPEN: [WebSocket.OPEN, DataChannel.OPEN], | ||
CLOSING: [WebSocket.CLOSING, DataChannel.CLOSING], | ||
CLOSED: [WebSocket.CLOSED, DataChannel.CLOSED], | ||
}; | ||
// Properties a raw channel must have, WebSocket and RTCDataChannel are two examples | ||
const rawChannelProps = [ | ||
"send", | ||
"close", | ||
"binaryType", | ||
"onerror", | ||
"onmessage", | ||
"onopen", | ||
"protocol", | ||
"readyState", | ||
]; | ||
export default class Websock { | ||
constructor() { | ||
this._websocket = null; // WebSocket object | ||
this._websocket = null; // WebSocket or RTCDataChannel object | ||
@@ -31,3 +58,2 @@ this._rQi = 0; // Receive queue index | ||
this._rQbufferSize = 1024 * 1024 * 4; // Receive queue buffer size (4 MiB) | ||
this._rQmax = this._rQbufferSize / 8; | ||
// called in init: this._rQ = new Uint8Array(this._rQbufferSize); | ||
@@ -147,4 +173,4 @@ this._rQ = null; // Receive queue | ||
flush() { | ||
if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) { | ||
this._websocket.send(this._encode_message()); | ||
if (this._sQlen > 0 && ReadyStates.OPEN.indexOf(this._websocket.readyState) >= 0) { | ||
this._websocket.send(this._encodeMessage()); | ||
this._sQlen = 0; | ||
@@ -160,3 +186,3 @@ } | ||
send_string(str) { | ||
sendString(str) { | ||
this.send(str.split('').map(chr => chr.charCodeAt(0))); | ||
@@ -174,3 +200,3 @@ } | ||
_allocate_buffers() { | ||
_allocateBuffers() { | ||
this._rQ = new Uint8Array(this._rQbufferSize); | ||
@@ -181,3 +207,3 @@ this._sQ = new Uint8Array(this._sQbufferSize); | ||
init() { | ||
this._allocate_buffers(); | ||
this._allocateBuffers(); | ||
this._rQi = 0; | ||
@@ -187,10 +213,23 @@ this._websocket = null; | ||
open(socketCreator) { | ||
open(uri, protocols) { | ||
this.attach(new WebSocket(uri, protocols)); | ||
} | ||
attach(rawChannel) { | ||
this.init(); | ||
this._websocket = socketCreator(); | ||
this._websocket.binaryType = 'arraybuffer'; | ||
// Must get object and class methods to be compatible with the tests. | ||
const channelProps = [...Object.keys(rawChannel), ...Object.getOwnPropertyNames(Object.getPrototypeOf(rawChannel))]; | ||
for (let i = 0; i < rawChannelProps.length; i++) { | ||
const prop = rawChannelProps[i]; | ||
if (channelProps.indexOf(prop) < 0) { | ||
throw new Error('Raw channel missing property: ' + prop); | ||
} | ||
} | ||
this._websocket.onmessage = this._recv_message.bind(this); | ||
this._websocket.onopen = () => { | ||
this._websocket = rawChannel; | ||
this._websocket.binaryType = "arraybuffer"; | ||
this._websocket.onmessage = this._recvMessage.bind(this); | ||
const onOpen = () => { | ||
Log.Debug('>> WebSock.onopen'); | ||
@@ -204,2 +243,11 @@ if (this._websocket.protocol) { | ||
}; | ||
// If the readyState cannot be found this defaults to assuming it's not open. | ||
const isOpen = ReadyStates.OPEN.indexOf(this._websocket.readyState) >= 0; | ||
if (isOpen) { | ||
onOpen(); | ||
} else { | ||
this._websocket.onopen = onOpen; | ||
} | ||
this._websocket.onclose = (e) => { | ||
@@ -210,2 +258,3 @@ Log.Debug(">> WebSock.onclose"); | ||
}; | ||
this._websocket.onerror = (e) => { | ||
@@ -220,4 +269,4 @@ Log.Debug(">> WebSock.onerror: " + e); | ||
if (this._websocket) { | ||
if ((this._websocket.readyState === WebSocket.OPEN) || | ||
(this._websocket.readyState === WebSocket.CONNECTING)) { | ||
if (ReadyStates.CONNECTING.indexOf(this._websocket.readyState) >= 0 || | ||
ReadyStates.OPEN.indexOf(this._websocket.readyState) >= 0) { | ||
Log.Info("Closing WebSocket connection"); | ||
@@ -232,3 +281,3 @@ this._websocket.close(); | ||
// private methods | ||
_encode_message() { | ||
_encodeMessage() { | ||
// Put in a binary arraybuffer | ||
@@ -239,12 +288,17 @@ // according to the spec, you can send ArrayBufferViews with the send method | ||
_expand_compact_rQ(min_fit) { | ||
const resizeNeeded = min_fit || this.rQlen > this._rQbufferSize / 2; | ||
// We want to move all the unread data to the start of the queue, | ||
// e.g. compacting. | ||
// The function also expands the receive que if needed, and for | ||
// performance reasons we combine these two actions to avoid | ||
// unneccessary copying. | ||
_expandCompactRQ(minFit) { | ||
// if we're using less than 1/8th of the buffer even with the incoming bytes, compact in place | ||
// instead of resizing | ||
const requiredBufferSize = (this._rQlen - this._rQi + minFit) * 8; | ||
const resizeNeeded = this._rQbufferSize < requiredBufferSize; | ||
if (resizeNeeded) { | ||
if (!min_fit) { | ||
// just double the size if we need to do compaction | ||
this._rQbufferSize *= 2; | ||
} else { | ||
// otherwise, make sure we satisy rQlen - rQi + min_fit < rQbufferSize / 8 | ||
this._rQbufferSize = (this.rQlen + min_fit) * 8; | ||
} | ||
// Make sure we always *at least* double the buffer size, and have at least space for 8x | ||
// the current amount of data | ||
this._rQbufferSize = Math.max(this._rQbufferSize * 2, requiredBufferSize); | ||
} | ||
@@ -255,3 +309,3 @@ | ||
this._rQbufferSize = MAX_RQ_GROW_SIZE; | ||
if (this._rQbufferSize - this.rQlen < min_fit) { | ||
if (this._rQbufferSize - this.rQlen < minFit) { | ||
throw new Error("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit"); | ||
@@ -262,12 +316,7 @@ } | ||
if (resizeNeeded) { | ||
const old_rQbuffer = this._rQ.buffer; | ||
this._rQmax = this._rQbufferSize / 8; | ||
const oldRQbuffer = this._rQ.buffer; | ||
this._rQ = new Uint8Array(this._rQbufferSize); | ||
this._rQ.set(new Uint8Array(old_rQbuffer, this._rQi)); | ||
this._rQ.set(new Uint8Array(oldRQbuffer, this._rQi, this._rQlen - this._rQi)); | ||
} else { | ||
if (ENABLE_COPYWITHIN) { | ||
this._rQ.copyWithin(0, this._rQi); | ||
} else { | ||
this._rQ.set(new Uint8Array(this._rQ.buffer, this._rQi)); | ||
} | ||
this._rQ.copyWithin(0, this._rQi, this._rQlen); | ||
} | ||
@@ -279,7 +328,7 @@ | ||
_decode_message(data) { | ||
// push arraybuffer values onto the end | ||
// push arraybuffer values onto the end of the receive que | ||
_DecodeMessage(data) { | ||
const u8 = new Uint8Array(data); | ||
if (u8.length > this._rQbufferSize - this._rQlen) { | ||
this._expand_compact_rQ(u8.length); | ||
this._expandCompactRQ(u8.length); | ||
} | ||
@@ -290,12 +339,11 @@ this._rQ.set(u8, this._rQlen); | ||
_recv_message(e) { | ||
this._decode_message(e.data); | ||
_recvMessage(e) { | ||
this._DecodeMessage(e.data); | ||
if (this.rQlen > 0) { | ||
this._eventHandlers.message(); | ||
// Compact the receive queue | ||
if (this._rQlen == this._rQi) { | ||
// All data has now been processed, this means we | ||
// can reset the receive queue. | ||
this._rQlen = 0; | ||
this._rQi = 0; | ||
} else if (this._rQlen > this._rQmax) { | ||
this._expand_compact_rQ(); | ||
} | ||
@@ -302,0 +350,0 @@ } else { |
@@ -27,10 +27,4 @@ # noVNC API | ||
moved to the remote session when a `mousedown` or `touchstart` | ||
event is received. | ||
event is received. Enabled by default. | ||
`touchButton` | ||
- Is a `long` controlling the button mask that should be simulated | ||
when a touch event is recieved. Uses the same values as | ||
[`MouseEvent.button`](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button). | ||
Is set to `1` by default. | ||
`clipViewport` | ||
@@ -68,2 +62,15 @@ - Is a `boolean` indicating if the remote session should be clipped | ||
`qualityLevel` | ||
- Is an `int` in range `[0-9]` controlling the desired JPEG quality. | ||
Value `0` implies low quality and `9` implies high quality. | ||
Default value is `6`. | ||
`compressionLevel` | ||
- Is an `int` in range `[0-9]` controlling the desired compression | ||
level. Value `0` means no compression. Level 1 uses a minimum of CPU | ||
resources and achieves weak compression ratios, while level 9 offers | ||
best compression but is slow in terms of CPU consumption on the server | ||
side. Use high levels with very slow network connections. | ||
Default value is `2`. | ||
`capabilities` *Read only* | ||
@@ -163,5 +170,5 @@ - Is an `Object` indicating which optional extensions are available | ||
**`url`** | ||
**`urlOrDataChannel`** | ||
- A `DOMString` specifying the VNC server to connect to. This must be | ||
a valid WebSocket URL. | ||
a valid WebSocket URL. This can also be a `WebSocket` or `RTCDataChannel`. | ||
@@ -193,2 +200,6 @@ **`options`** *Optional* | ||
`wsProtocols` | ||
- An `Array` of `DOMString`s specifying the sub-protocols to use | ||
in the WebSocket connection. Empty by default. | ||
#### connect | ||
@@ -378,3 +389,2 @@ | ||
**`text`** | ||
- A `DOMString` specifying the clipboard data to send. Currently only | ||
characters from ISO 8859-1 are supported. | ||
- A `DOMString` specifying the clipboard data to send. |
@@ -21,5 +21,5 @@ # Using the noVNC JavaScript library | ||
noVNC is written using ECMAScript 6 modules. Many of the major browsers support | ||
these modules natively, but not all. They are also not supported by Node.js. To | ||
use noVNC in these places the library must first be converted. | ||
noVNC is written using ECMAScript 6 modules. This is not supported by older | ||
versions of Node.js. To use noVNC with those older versions of Node.js the | ||
library must first be converted. | ||
@@ -31,7 +31,3 @@ Fortunately noVNC includes a script to handle this conversion. Please follow | ||
2. Run `npm install` in the noVNC directory | ||
3. Run `./utils/use_require.js --as <module format>` | ||
Several module formats are available. Please run | ||
`./utils/use_require.js --help` to see them all. | ||
The result of the conversion is available in the `lib/` directory. |
@@ -1,110 +0,115 @@ | ||
'use strict'; | ||
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _logging = require('./util/logging.js'); | ||
var Log = _interopRequireWildcard(require("./util/logging.js")); | ||
var Log = _interopRequireWildcard(_logging); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
exports.default = { | ||
/* Convert data (an array of integers) to a Base64 string. */ | ||
toBase64Table: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''), | ||
base64Pad: '=', | ||
/* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this | ||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | ||
// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js | ||
var _default = { | ||
/* Convert data (an array of integers) to a Base64 string. */ | ||
toBase64Table: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''), | ||
base64Pad: '=', | ||
encode: function encode(data) { | ||
"use strict"; | ||
encode: function encode(data) { | ||
"use strict"; | ||
var result = ''; | ||
var length = data.length; | ||
var lengthpad = length % 3; // Convert every three bytes to 4 ascii characters. | ||
var result = ''; | ||
var length = data.length; | ||
var lengthpad = length % 3; | ||
// Convert every three bytes to 4 ascii characters. | ||
for (var i = 0; i < length - 2; i += 3) { | ||
result += this.toBase64Table[data[i] >> 2]; | ||
result += this.toBase64Table[((data[i] & 0x03) << 4) + (data[i + 1] >> 4)]; | ||
result += this.toBase64Table[((data[i + 1] & 0x0f) << 2) + (data[i + 2] >> 6)]; | ||
result += this.toBase64Table[data[i + 2] & 0x3f]; | ||
} // Convert the remaining 1 or 2 bytes, pad out to 4 characters. | ||
for (var i = 0; i < length - 2; i += 3) { | ||
result += this.toBase64Table[data[i] >> 2]; | ||
result += this.toBase64Table[((data[i] & 0x03) << 4) + (data[i + 1] >> 4)]; | ||
result += this.toBase64Table[((data[i + 1] & 0x0f) << 2) + (data[i + 2] >> 6)]; | ||
result += this.toBase64Table[data[i + 2] & 0x3f]; | ||
} | ||
// Convert the remaining 1 or 2 bytes, pad out to 4 characters. | ||
var j = length - lengthpad; | ||
if (lengthpad === 2) { | ||
result += this.toBase64Table[data[j] >> 2]; | ||
result += this.toBase64Table[((data[j] & 0x03) << 4) + (data[j + 1] >> 4)]; | ||
result += this.toBase64Table[(data[j + 1] & 0x0f) << 2]; | ||
result += this.toBase64Table[64]; | ||
} else if (lengthpad === 1) { | ||
result += this.toBase64Table[data[j] >> 2]; | ||
result += this.toBase64Table[(data[j] & 0x03) << 4]; | ||
result += this.toBase64Table[64]; | ||
result += this.toBase64Table[64]; | ||
} | ||
var j = length - lengthpad; | ||
return result; | ||
}, | ||
if (lengthpad === 2) { | ||
result += this.toBase64Table[data[j] >> 2]; | ||
result += this.toBase64Table[((data[j] & 0x03) << 4) + (data[j + 1] >> 4)]; | ||
result += this.toBase64Table[(data[j + 1] & 0x0f) << 2]; | ||
result += this.toBase64Table[64]; | ||
} else if (lengthpad === 1) { | ||
result += this.toBase64Table[data[j] >> 2]; | ||
result += this.toBase64Table[(data[j] & 0x03) << 4]; | ||
result += this.toBase64Table[64]; | ||
result += this.toBase64Table[64]; | ||
} | ||
return result; | ||
}, | ||
/* Convert Base64 data to a string */ | ||
/* eslint-disable comma-spacing */ | ||
toBinaryTable: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1], | ||
/* eslint-enable comma-spacing */ | ||
/* Convert Base64 data to a string */ | ||
decode: function decode(data) { | ||
var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; | ||
/* eslint-disable comma-spacing */ | ||
toBinaryTable: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1], | ||
var data_length = data.indexOf('=') - offset; | ||
if (data_length < 0) { | ||
data_length = data.length - offset; | ||
} | ||
/* eslint-enable comma-spacing */ | ||
decode: function decode(data) { | ||
var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; | ||
var dataLength = data.indexOf('=') - offset; | ||
/* Every four characters is 3 resulting numbers */ | ||
var result_length = (data_length >> 2) * 3 + Math.floor(data_length % 4 / 1.5); | ||
var result = new Array(result_length); | ||
if (dataLength < 0) { | ||
dataLength = data.length - offset; | ||
} | ||
/* Every four characters is 3 resulting numbers */ | ||
// Convert one by one. | ||
var leftbits = 0; // number of bits decoded, but yet to be appended | ||
var leftdata = 0; // bits decoded, but yet to be appended | ||
for (var idx = 0, i = offset; i < data.length; i++) { | ||
var c = this.toBinaryTable[data.charCodeAt(i) & 0x7f]; | ||
var padding = data.charAt(i) === this.base64Pad; | ||
// Skip illegal characters and whitespace | ||
if (c === -1) { | ||
Log.Error("Illegal character code " + data.charCodeAt(i) + " at position " + i); | ||
continue; | ||
} | ||
var resultLength = (dataLength >> 2) * 3 + Math.floor(dataLength % 4 / 1.5); | ||
var result = new Array(resultLength); // Convert one by one. | ||
// Collect data into leftdata, update bitcount | ||
leftdata = leftdata << 6 | c; | ||
leftbits += 6; | ||
var leftbits = 0; // number of bits decoded, but yet to be appended | ||
// If we have 8 or more bits, append 8 bits to the result | ||
if (leftbits >= 8) { | ||
leftbits -= 8; | ||
// Append if not padding. | ||
if (!padding) { | ||
result[idx++] = leftdata >> leftbits & 0xff; | ||
} | ||
leftdata &= (1 << leftbits) - 1; | ||
} | ||
} | ||
var leftdata = 0; // bits decoded, but yet to be appended | ||
// If there are any bits left, the base64 string was corrupted | ||
if (leftbits) { | ||
var err = new Error('Corrupted base64 string'); | ||
err.name = 'Base64-Error'; | ||
throw err; | ||
for (var idx = 0, i = offset; i < data.length; i++) { | ||
var c = this.toBinaryTable[data.charCodeAt(i) & 0x7f]; | ||
var padding = data.charAt(i) === this.base64Pad; // Skip illegal characters and whitespace | ||
if (c === -1) { | ||
Log.Error("Illegal character code " + data.charCodeAt(i) + " at position " + i); | ||
continue; | ||
} // Collect data into leftdata, update bitcount | ||
leftdata = leftdata << 6 | c; | ||
leftbits += 6; // If we have 8 or more bits, append 8 bits to the result | ||
if (leftbits >= 8) { | ||
leftbits -= 8; // Append if not padding. | ||
if (!padding) { | ||
result[idx++] = leftdata >> leftbits & 0xff; | ||
} | ||
return result; | ||
leftdata &= (1 << leftbits) - 1; | ||
} | ||
} // If there are any bits left, the base64 string was corrupted | ||
if (leftbits) { | ||
var err = new Error('Corrupted base64 string'); | ||
err.name = 'Base64-Error'; | ||
throw err; | ||
} | ||
}; /* End of Base64 namespace */ | ||
/* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this | ||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | ||
// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js | ||
return result; | ||
} | ||
}; | ||
/* End of Base64 namespace */ | ||
exports["default"] = _default; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -21,26 +22,29 @@ * | ||
*/ | ||
var CopyRectDecoder = /*#__PURE__*/function () { | ||
function CopyRectDecoder() { | ||
_classCallCheck(this, CopyRectDecoder); | ||
} | ||
var CopyRectDecoder = function () { | ||
function CopyRectDecoder() { | ||
_classCallCheck(this, CopyRectDecoder); | ||
} | ||
_createClass(CopyRectDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (sock.rQwait("COPYRECT", 4)) { | ||
return false; | ||
} | ||
_createClass(CopyRectDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (sock.rQwait("COPYRECT", 4)) { | ||
return false; | ||
} | ||
var deltaX = sock.rQshift16(); | ||
var deltaY = sock.rQshift16(); | ||
var deltaX = sock.rQshift16(); | ||
var deltaY = sock.rQshift16(); | ||
display.copyImage(deltaX, deltaY, x, y, width, height); | ||
if (width === 0 || height === 0) { | ||
return true; | ||
} | ||
return true; | ||
} | ||
}]); | ||
display.copyImage(deltaX, deltaY, x, y, width, height); | ||
return true; | ||
} | ||
}]); | ||
return CopyRectDecoder; | ||
return CopyRectDecoder; | ||
}(); | ||
exports.default = CopyRectDecoder; | ||
exports["default"] = CopyRectDecoder; |
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* See README.md for usage and integration instructions. | ||
* | ||
*/ | ||
var Log = _interopRequireWildcard(require("../util/logging.js")); | ||
var _logging = require("../util/logging.js"); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
var Log = _interopRequireWildcard(_logging); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var HextileDecoder = function () { | ||
function HextileDecoder() { | ||
_classCallCheck(this, HextileDecoder); | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
this._tiles = 0; | ||
this._lastsubencoding = 0; | ||
} | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
_createClass(HextileDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (this._tiles === 0) { | ||
this._tiles_x = Math.ceil(width / 16); | ||
this._tiles_y = Math.ceil(height / 16); | ||
this._total_tiles = this._tiles_x * this._tiles_y; | ||
this._tiles = this._total_tiles; | ||
var HextileDecoder = /*#__PURE__*/function () { | ||
function HextileDecoder() { | ||
_classCallCheck(this, HextileDecoder); | ||
this._tiles = 0; | ||
this._lastsubencoding = 0; | ||
this._tileBuffer = new Uint8Array(16 * 16 * 4); | ||
} | ||
_createClass(HextileDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (this._tiles === 0) { | ||
this._tilesX = Math.ceil(width / 16); | ||
this._tilesY = Math.ceil(height / 16); | ||
this._totalTiles = this._tilesX * this._tilesY; | ||
this._tiles = this._totalTiles; | ||
} | ||
while (this._tiles > 0) { | ||
var bytes = 1; | ||
if (sock.rQwait("HEXTILE", bytes)) { | ||
return false; | ||
} | ||
var rQ = sock.rQ; | ||
var rQi = sock.rQi; | ||
var subencoding = rQ[rQi]; // Peek | ||
if (subencoding > 30) { | ||
// Raw | ||
throw new Error("Illegal hextile subencoding (subencoding: " + subencoding + ")"); | ||
} | ||
var currTile = this._totalTiles - this._tiles; | ||
var tileX = currTile % this._tilesX; | ||
var tileY = Math.floor(currTile / this._tilesX); | ||
var tx = x + tileX * 16; | ||
var ty = y + tileY * 16; | ||
var tw = Math.min(16, x + width - tx); | ||
var th = Math.min(16, y + height - ty); // Figure out how much we are expecting | ||
if (subencoding & 0x01) { | ||
// Raw | ||
bytes += tw * th * 4; | ||
} else { | ||
if (subencoding & 0x02) { | ||
// Background | ||
bytes += 4; | ||
} | ||
if (subencoding & 0x04) { | ||
// Foreground | ||
bytes += 4; | ||
} | ||
if (subencoding & 0x08) { | ||
// AnySubrects | ||
bytes++; // Since we aren't shifting it off | ||
if (sock.rQwait("HEXTILE", bytes)) { | ||
return false; | ||
} | ||
while (this._tiles > 0) { | ||
var bytes = 1; | ||
var subrects = rQ[rQi + bytes - 1]; // Peek | ||
if (sock.rQwait("HEXTILE", bytes)) { | ||
return false; | ||
} | ||
if (subencoding & 0x10) { | ||
// SubrectsColoured | ||
bytes += subrects * (4 + 2); | ||
} else { | ||
bytes += subrects * 2; | ||
} | ||
} | ||
} | ||
var rQ = sock.rQ; | ||
var rQi = sock.rQi; | ||
if (sock.rQwait("HEXTILE", bytes)) { | ||
return false; | ||
} // We know the encoding and have a whole tile | ||
var subencoding = rQ[rQi]; // Peek | ||
if (subencoding > 30) { | ||
// Raw | ||
throw new Error("Illegal hextile subencoding (subencoding: " + subencoding + ")"); | ||
} | ||
var curr_tile = this._total_tiles - this._tiles; | ||
var tile_x = curr_tile % this._tiles_x; | ||
var tile_y = Math.floor(curr_tile / this._tiles_x); | ||
var tx = x + tile_x * 16; | ||
var ty = y + tile_y * 16; | ||
var tw = Math.min(16, x + width - tx); | ||
var th = Math.min(16, y + height - ty); | ||
rQi++; | ||
// Figure out how much we are expecting | ||
if (subencoding & 0x01) { | ||
// Raw | ||
bytes += tw * th * 4; | ||
} else { | ||
if (subencoding & 0x02) { | ||
// Background | ||
bytes += 4; | ||
} | ||
if (subencoding & 0x04) { | ||
// Foreground | ||
bytes += 4; | ||
} | ||
if (subencoding & 0x08) { | ||
// AnySubrects | ||
bytes++; // Since we aren't shifting it off | ||
if (subencoding === 0) { | ||
if (this._lastsubencoding & 0x01) { | ||
// Weird: ignore blanks are RAW | ||
Log.Debug(" Ignoring blank after RAW"); | ||
} else { | ||
display.fillRect(tx, ty, tw, th, this._background); | ||
} | ||
} else if (subencoding & 0x01) { | ||
// Raw | ||
var pixels = tw * th; // Max sure the image is fully opaque | ||
if (sock.rQwait("HEXTILE", bytes)) { | ||
return false; | ||
} | ||
for (var i = 0; i < pixels; i++) { | ||
rQ[rQi + i * 4 + 3] = 255; | ||
} | ||
var subrects = rQ[rQi + bytes - 1]; // Peek | ||
if (subencoding & 0x10) { | ||
// SubrectsColoured | ||
bytes += subrects * (4 + 2); | ||
} else { | ||
bytes += subrects * 2; | ||
} | ||
} | ||
} | ||
display.blitImage(tx, ty, tw, th, rQ, rQi); | ||
rQi += bytes - 1; | ||
} else { | ||
if (subencoding & 0x02) { | ||
// Background | ||
this._background = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; | ||
rQi += 4; | ||
} | ||
if (sock.rQwait("HEXTILE", bytes)) { | ||
return false; | ||
} | ||
if (subencoding & 0x04) { | ||
// Foreground | ||
this._foreground = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; | ||
rQi += 4; | ||
} | ||
// We know the encoding and have a whole tile | ||
rQi++; | ||
if (subencoding === 0) { | ||
if (this._lastsubencoding & 0x01) { | ||
// Weird: ignore blanks are RAW | ||
Log.Debug(" Ignoring blank after RAW"); | ||
} else { | ||
display.fillRect(tx, ty, tw, th, this._background); | ||
} | ||
} else if (subencoding & 0x01) { | ||
// Raw | ||
display.blitImage(tx, ty, tw, th, rQ, rQi); | ||
rQi += bytes - 1; | ||
} else { | ||
if (subencoding & 0x02) { | ||
// Background | ||
this._background = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; | ||
rQi += 4; | ||
} | ||
if (subencoding & 0x04) { | ||
// Foreground | ||
this._foreground = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; | ||
rQi += 4; | ||
} | ||
this._startTile(tx, ty, tw, th, this._background); | ||
display.startTile(tx, ty, tw, th, this._background); | ||
if (subencoding & 0x08) { | ||
// AnySubrects | ||
var _subrects = rQ[rQi]; | ||
rQi++; | ||
if (subencoding & 0x08) { | ||
// AnySubrects | ||
var _subrects = rQ[rQi]; | ||
rQi++; | ||
for (var s = 0; s < _subrects; s++) { | ||
var color = void 0; | ||
if (subencoding & 0x10) { | ||
// SubrectsColoured | ||
color = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; | ||
rQi += 4; | ||
} else { | ||
color = this._foreground; | ||
} | ||
var xy = rQ[rQi]; | ||
rQi++; | ||
var sx = xy >> 4; | ||
var sy = xy & 0x0f; | ||
for (var s = 0; s < _subrects; s++) { | ||
var color = void 0; | ||
var wh = rQ[rQi]; | ||
rQi++; | ||
var sw = (wh >> 4) + 1; | ||
var sh = (wh & 0x0f) + 1; | ||
if (subencoding & 0x10) { | ||
// SubrectsColoured | ||
color = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; | ||
rQi += 4; | ||
} else { | ||
color = this._foreground; | ||
} | ||
display.subTile(sx, sy, sw, sh, color); | ||
} | ||
} | ||
display.finishTile(); | ||
} | ||
sock.rQi = rQi; | ||
this._lastsubencoding = subencoding; | ||
this._tiles--; | ||
var xy = rQ[rQi]; | ||
rQi++; | ||
var sx = xy >> 4; | ||
var sy = xy & 0x0f; | ||
var wh = rQ[rQi]; | ||
rQi++; | ||
var sw = (wh >> 4) + 1; | ||
var sh = (wh & 0x0f) + 1; | ||
this._subTile(sx, sy, sw, sh, color); | ||
} | ||
} | ||
return true; | ||
this._finishTile(display); | ||
} | ||
}]); | ||
return HextileDecoder; | ||
sock.rQi = rQi; | ||
this._lastsubencoding = subencoding; | ||
this._tiles--; | ||
} | ||
return true; | ||
} // start updating a tile | ||
}, { | ||
key: "_startTile", | ||
value: function _startTile(x, y, width, height, color) { | ||
this._tileX = x; | ||
this._tileY = y; | ||
this._tileW = width; | ||
this._tileH = height; | ||
var red = color[0]; | ||
var green = color[1]; | ||
var blue = color[2]; | ||
var data = this._tileBuffer; | ||
for (var i = 0; i < width * height * 4; i += 4) { | ||
data[i] = red; | ||
data[i + 1] = green; | ||
data[i + 2] = blue; | ||
data[i + 3] = 255; | ||
} | ||
} // update sub-rectangle of the current tile | ||
}, { | ||
key: "_subTile", | ||
value: function _subTile(x, y, w, h, color) { | ||
var red = color[0]; | ||
var green = color[1]; | ||
var blue = color[2]; | ||
var xend = x + w; | ||
var yend = y + h; | ||
var data = this._tileBuffer; | ||
var width = this._tileW; | ||
for (var j = y; j < yend; j++) { | ||
for (var i = x; i < xend; i++) { | ||
var p = (i + j * width) * 4; | ||
data[p] = red; | ||
data[p + 1] = green; | ||
data[p + 2] = blue; | ||
data[p + 3] = 255; | ||
} | ||
} | ||
} // draw the current tile to the screen | ||
}, { | ||
key: "_finishTile", | ||
value: function _finishTile(display) { | ||
display.blitImage(this._tileX, this._tileY, this._tileW, this._tileH, this._tileBuffer, 0); | ||
} | ||
}]); | ||
return HextileDecoder; | ||
}(); | ||
exports.default = HextileDecoder; | ||
exports["default"] = HextileDecoder; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -21,57 +22,67 @@ * | ||
*/ | ||
var RawDecoder = /*#__PURE__*/function () { | ||
function RawDecoder() { | ||
_classCallCheck(this, RawDecoder); | ||
var RawDecoder = function () { | ||
function RawDecoder() { | ||
_classCallCheck(this, RawDecoder); | ||
this._lines = 0; | ||
} | ||
this._lines = 0; | ||
} | ||
_createClass(RawDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (width === 0 || height === 0) { | ||
return true; | ||
} | ||
_createClass(RawDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (this._lines === 0) { | ||
this._lines = height; | ||
} | ||
if (this._lines === 0) { | ||
this._lines = height; | ||
} | ||
var pixelSize = depth == 8 ? 1 : 4; | ||
var bytesPerLine = width * pixelSize; | ||
var pixelSize = depth == 8 ? 1 : 4; | ||
var bytesPerLine = width * pixelSize; | ||
if (sock.rQwait("RAW", bytesPerLine)) { | ||
return false; | ||
} | ||
if (sock.rQwait("RAW", bytesPerLine)) { | ||
return false; | ||
} | ||
var cur_y = y + (height - this._lines); | ||
var curr_height = Math.min(this._lines, Math.floor(sock.rQlen / bytesPerLine)); | ||
var data = sock.rQ; | ||
var index = sock.rQi; | ||
var curY = y + (height - this._lines); | ||
var currHeight = Math.min(this._lines, Math.floor(sock.rQlen / bytesPerLine)); | ||
var pixels = width * currHeight; | ||
var data = sock.rQ; | ||
var index = sock.rQi; // Convert data if needed | ||
// Convert data if needed | ||
if (depth == 8) { | ||
var pixels = width * curr_height; | ||
var newdata = new Uint8Array(pixels * 4); | ||
for (var i = 0; i < pixels; i++) { | ||
newdata[i * 4 + 0] = (data[index + i] >> 0 & 0x3) * 255 / 3; | ||
newdata[i * 4 + 1] = (data[index + i] >> 2 & 0x3) * 255 / 3; | ||
newdata[i * 4 + 2] = (data[index + i] >> 4 & 0x3) * 255 / 3; | ||
newdata[i * 4 + 4] = 0; | ||
} | ||
data = newdata; | ||
index = 0; | ||
} | ||
if (depth == 8) { | ||
var newdata = new Uint8Array(pixels * 4); | ||
display.blitImage(x, cur_y, width, curr_height, data, index); | ||
sock.rQskipBytes(curr_height * bytesPerLine); | ||
this._lines -= curr_height; | ||
if (this._lines > 0) { | ||
return false; | ||
} | ||
return true; | ||
for (var i = 0; i < pixels; i++) { | ||
newdata[i * 4 + 0] = (data[index + i] >> 0 & 0x3) * 255 / 3; | ||
newdata[i * 4 + 1] = (data[index + i] >> 2 & 0x3) * 255 / 3; | ||
newdata[i * 4 + 2] = (data[index + i] >> 4 & 0x3) * 255 / 3; | ||
newdata[i * 4 + 3] = 255; | ||
} | ||
}]); | ||
return RawDecoder; | ||
data = newdata; | ||
index = 0; | ||
} // Max sure the image is fully opaque | ||
for (var _i = 0; _i < pixels; _i++) { | ||
data[_i * 4 + 3] = 255; | ||
} | ||
display.blitImage(x, curY, width, currHeight, data, index); | ||
sock.rQskipBytes(currHeight * bytesPerLine); | ||
this._lines -= currHeight; | ||
if (this._lines > 0) { | ||
return false; | ||
} | ||
return true; | ||
} | ||
}]); | ||
return RawDecoder; | ||
}(); | ||
exports.default = RawDecoder; | ||
exports["default"] = RawDecoder; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -21,46 +22,45 @@ * | ||
*/ | ||
var RREDecoder = /*#__PURE__*/function () { | ||
function RREDecoder() { | ||
_classCallCheck(this, RREDecoder); | ||
var RREDecoder = function () { | ||
function RREDecoder() { | ||
_classCallCheck(this, RREDecoder); | ||
this._subrects = 0; | ||
} | ||
this._subrects = 0; | ||
} | ||
_createClass(RREDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (this._subrects === 0) { | ||
if (sock.rQwait("RRE", 4 + 4)) { | ||
return false; | ||
} | ||
_createClass(RREDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (this._subrects === 0) { | ||
if (sock.rQwait("RRE", 4 + 4)) { | ||
return false; | ||
} | ||
this._subrects = sock.rQshift32(); | ||
var color = sock.rQshiftBytes(4); // Background | ||
this._subrects = sock.rQshift32(); | ||
display.fillRect(x, y, width, height, color); | ||
} | ||
var color = sock.rQshiftBytes(4); // Background | ||
display.fillRect(x, y, width, height, color); | ||
} | ||
while (this._subrects > 0) { | ||
if (sock.rQwait("RRE", 4 + 8)) { | ||
return false; | ||
} | ||
while (this._subrects > 0) { | ||
if (sock.rQwait("RRE", 4 + 8)) { | ||
return false; | ||
} | ||
var _color = sock.rQshiftBytes(4); | ||
var _color = sock.rQshiftBytes(4); | ||
var sx = sock.rQshift16(); | ||
var sy = sock.rQshift16(); | ||
var swidth = sock.rQshift16(); | ||
var sheight = sock.rQshift16(); | ||
display.fillRect(x + sx, y + sy, swidth, sheight, _color); | ||
var sx = sock.rQshift16(); | ||
var sy = sock.rQshift16(); | ||
var swidth = sock.rQshift16(); | ||
var sheight = sock.rQshift16(); | ||
display.fillRect(x + sx, y + sy, swidth, sheight, _color); | ||
this._subrects--; | ||
} | ||
this._subrects--; | ||
} | ||
return true; | ||
} | ||
}]); | ||
return true; | ||
} | ||
}]); | ||
return RREDecoder; | ||
return RREDecoder; | ||
}(); | ||
exports.default = RREDecoder; | ||
exports["default"] = RREDecoder; |
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca) | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* See README.md for usage and integration instructions. | ||
* | ||
*/ | ||
var Log = _interopRequireWildcard(require("../util/logging.js")); | ||
var _logging = require("../util/logging.js"); | ||
var _inflator = _interopRequireDefault(require("../inflator.js")); | ||
var Log = _interopRequireWildcard(_logging); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _inflator = require("../inflator.js"); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
var _inflator2 = _interopRequireDefault(_inflator); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var TightDecoder = function () { | ||
function TightDecoder() { | ||
_classCallCheck(this, TightDecoder); | ||
var TightDecoder = /*#__PURE__*/function () { | ||
function TightDecoder() { | ||
_classCallCheck(this, TightDecoder); | ||
this._ctl = null; | ||
this._filter = null; | ||
this._numColors = 0; | ||
this._palette = new Uint8Array(1024); // 256 * 4 (max palette size * max bytes-per-pixel) | ||
this._len = 0; | ||
this._ctl = null; | ||
this._filter = null; | ||
this._numColors = 0; | ||
this._palette = new Uint8Array(1024); // 256 * 4 (max palette size * max bytes-per-pixel) | ||
this._zlibs = []; | ||
for (var i = 0; i < 4; i++) { | ||
this._zlibs[i] = new _inflator2.default(); | ||
} | ||
this._len = 0; | ||
this._zlibs = []; | ||
for (var i = 0; i < 4; i++) { | ||
this._zlibs[i] = new _inflator["default"](); | ||
} | ||
} | ||
_createClass(TightDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (this._ctl === null) { | ||
if (sock.rQwait("TIGHT compression-control", 1)) { | ||
return false; | ||
} | ||
_createClass(TightDecoder, [{ | ||
key: "decodeRect", | ||
value: function decodeRect(x, y, width, height, sock, display, depth) { | ||
if (this._ctl === null) { | ||
if (sock.rQwait("TIGHT compression-control", 1)) { | ||
return false; | ||
} | ||
this._ctl = sock.rQshift8(); | ||
this._ctl = sock.rQshift8(); // Reset streams if the server requests it | ||
// Reset streams if the server requests it | ||
for (var i = 0; i < 4; i++) { | ||
if (this._ctl >> i & 1) { | ||
this._zlibs[i].reset(); | ||
Log.Info("Reset zlib stream " + i); | ||
} | ||
} | ||
for (var i = 0; i < 4; i++) { | ||
if (this._ctl >> i & 1) { | ||
this._zlibs[i].reset(); | ||
// Figure out filter | ||
this._ctl = this._ctl >> 4; | ||
} | ||
Log.Info("Reset zlib stream " + i); | ||
} | ||
} // Figure out filter | ||
var ret = void 0; | ||
if (this._ctl === 0x08) { | ||
ret = this._fillRect(x, y, width, height, sock, display, depth); | ||
} else if (this._ctl === 0x09) { | ||
ret = this._jpegRect(x, y, width, height, sock, display, depth); | ||
} else if (this._ctl === 0x0A) { | ||
ret = this._pngRect(x, y, width, height, sock, display, depth); | ||
} else if ((this._ctl & 0x80) == 0) { | ||
ret = this._basicRect(this._ctl, x, y, width, height, sock, display, depth); | ||
} else { | ||
throw new Error("Illegal tight compression received (ctl: " + this._ctl + ")"); | ||
} | ||
this._ctl = this._ctl >> 4; | ||
} | ||
if (ret) { | ||
this._ctl = null; | ||
} | ||
var ret; | ||
return ret; | ||
if (this._ctl === 0x08) { | ||
ret = this._fillRect(x, y, width, height, sock, display, depth); | ||
} else if (this._ctl === 0x09) { | ||
ret = this._jpegRect(x, y, width, height, sock, display, depth); | ||
} else if (this._ctl === 0x0A) { | ||
ret = this._pngRect(x, y, width, height, sock, display, depth); | ||
} else if ((this._ctl & 0x08) == 0) { | ||
ret = this._basicRect(this._ctl, x, y, width, height, sock, display, depth); | ||
} else { | ||
throw new Error("Illegal tight compression received (ctl: " + this._ctl + ")"); | ||
} | ||
if (ret) { | ||
this._ctl = null; | ||
} | ||
return ret; | ||
} | ||
}, { | ||
key: "_fillRect", | ||
value: function _fillRect(x, y, width, height, sock, display, depth) { | ||
if (sock.rQwait("TIGHT", 3)) { | ||
return false; | ||
} | ||
var rQi = sock.rQi; | ||
var rQ = sock.rQ; | ||
display.fillRect(x, y, width, height, [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2]], false); | ||
sock.rQskipBytes(3); | ||
return true; | ||
} | ||
}, { | ||
key: "_jpegRect", | ||
value: function _jpegRect(x, y, width, height, sock, display, depth) { | ||
var data = this._readData(sock); | ||
if (data === null) { | ||
return false; | ||
} | ||
display.imageRect(x, y, width, height, "image/jpeg", data); | ||
return true; | ||
} | ||
}, { | ||
key: "_pngRect", | ||
value: function _pngRect(x, y, width, height, sock, display, depth) { | ||
throw new Error("PNG received in standard Tight rect"); | ||
} | ||
}, { | ||
key: "_basicRect", | ||
value: function _basicRect(ctl, x, y, width, height, sock, display, depth) { | ||
if (this._filter === null) { | ||
if (ctl & 0x4) { | ||
if (sock.rQwait("TIGHT", 1)) { | ||
return false; | ||
} | ||
this._filter = sock.rQshift8(); | ||
} else { | ||
// Implicit CopyFilter | ||
this._filter = 0; | ||
} | ||
}, { | ||
key: "_fillRect", | ||
value: function _fillRect(x, y, width, height, sock, display, depth) { | ||
if (sock.rQwait("TIGHT", 3)) { | ||
return false; | ||
} | ||
} | ||
var rQi = sock.rQi; | ||
var rQ = sock.rQ; | ||
var streamId = ctl & 0x3; | ||
var ret; | ||
display.fillRect(x, y, width, height, [rQ[rQi + 2], rQ[rQi + 1], rQ[rQi]], false); | ||
sock.rQskipBytes(3); | ||
switch (this._filter) { | ||
case 0: | ||
// CopyFilter | ||
ret = this._copyFilter(streamId, x, y, width, height, sock, display, depth); | ||
break; | ||
return true; | ||
case 1: | ||
// PaletteFilter | ||
ret = this._paletteFilter(streamId, x, y, width, height, sock, display, depth); | ||
break; | ||
case 2: | ||
// GradientFilter | ||
ret = this._gradientFilter(streamId, x, y, width, height, sock, display, depth); | ||
break; | ||
default: | ||
throw new Error("Illegal tight filter received (ctl: " + this._filter + ")"); | ||
} | ||
if (ret) { | ||
this._filter = null; | ||
} | ||
return ret; | ||
} | ||
}, { | ||
key: "_copyFilter", | ||
value: function _copyFilter(streamId, x, y, width, height, sock, display, depth) { | ||
var uncompressedSize = width * height * 3; | ||
var data; | ||
if (uncompressedSize === 0) { | ||
return true; | ||
} | ||
if (uncompressedSize < 12) { | ||
if (sock.rQwait("TIGHT", uncompressedSize)) { | ||
return false; | ||
} | ||
}, { | ||
key: "_jpegRect", | ||
value: function _jpegRect(x, y, width, height, sock, display, depth) { | ||
var data = this._readData(sock); | ||
if (data === null) { | ||
return false; | ||
} | ||
display.imageRect(x, y, "image/jpeg", data); | ||
data = sock.rQshiftBytes(uncompressedSize); | ||
} else { | ||
data = this._readData(sock); | ||
return true; | ||
if (data === null) { | ||
return false; | ||
} | ||
}, { | ||
key: "_pngRect", | ||
value: function _pngRect(x, y, width, height, sock, display, depth) { | ||
throw new Error("PNG received in standard Tight rect"); | ||
} | ||
}, { | ||
key: "_basicRect", | ||
value: function _basicRect(ctl, x, y, width, height, sock, display, depth) { | ||
if (this._filter === null) { | ||
if (ctl & 0x4) { | ||
if (sock.rQwait("TIGHT", 1)) { | ||
return false; | ||
} | ||
this._filter = sock.rQshift8(); | ||
} else { | ||
// Implicit CopyFilter | ||
this._filter = 0; | ||
} | ||
} | ||
this._zlibs[streamId].setInput(data); | ||
var streamId = ctl & 0x3; | ||
data = this._zlibs[streamId].inflate(uncompressedSize); | ||
var ret = void 0; | ||
this._zlibs[streamId].setInput(null); | ||
} | ||
switch (this._filter) { | ||
case 0: | ||
// CopyFilter | ||
ret = this._copyFilter(streamId, x, y, width, height, sock, display, depth); | ||
break; | ||
case 1: | ||
// PaletteFilter | ||
ret = this._paletteFilter(streamId, x, y, width, height, sock, display, depth); | ||
break; | ||
case 2: | ||
// GradientFilter | ||
ret = this._gradientFilter(streamId, x, y, width, height, sock, display, depth); | ||
break; | ||
default: | ||
throw new Error("Illegal tight filter received (ctl: " + this._filter + ")"); | ||
} | ||
var rgbx = new Uint8Array(width * height * 4); | ||
if (ret) { | ||
this._filter = null; | ||
} | ||
for (var i = 0, j = 0; i < width * height * 4; i += 4, j += 3) { | ||
rgbx[i] = data[j]; | ||
rgbx[i + 1] = data[j + 1]; | ||
rgbx[i + 2] = data[j + 2]; | ||
rgbx[i + 3] = 255; // Alpha | ||
} | ||
return ret; | ||
display.blitImage(x, y, width, height, rgbx, 0, false); | ||
return true; | ||
} | ||
}, { | ||
key: "_paletteFilter", | ||
value: function _paletteFilter(streamId, x, y, width, height, sock, display, depth) { | ||
if (this._numColors === 0) { | ||
if (sock.rQwait("TIGHT palette", 1)) { | ||
return false; | ||
} | ||
}, { | ||
key: "_copyFilter", | ||
value: function _copyFilter(streamId, x, y, width, height, sock, display, depth) { | ||
var uncompressedSize = width * height * 3; | ||
var data = void 0; | ||
if (uncompressedSize < 12) { | ||
if (sock.rQwait("TIGHT", uncompressedSize)) { | ||
return false; | ||
} | ||
var numColors = sock.rQpeek8() + 1; | ||
var paletteSize = numColors * 3; | ||
data = sock.rQshiftBytes(uncompressedSize); | ||
} else { | ||
data = this._readData(sock); | ||
if (data === null) { | ||
return false; | ||
} | ||
if (sock.rQwait("TIGHT palette", 1 + paletteSize)) { | ||
return false; | ||
} | ||
data = this._zlibs[streamId].inflate(data, true, uncompressedSize); | ||
if (data.length != uncompressedSize) { | ||
throw new Error("Incomplete zlib block"); | ||
} | ||
} | ||
this._numColors = numColors; | ||
sock.rQskipBytes(1); | ||
sock.rQshiftTo(this._palette, paletteSize); | ||
} | ||
display.blitRgbImage(x, y, width, height, data, 0, false); | ||
var bpp = this._numColors <= 2 ? 1 : 8; | ||
var rowSize = Math.floor((width * bpp + 7) / 8); | ||
var uncompressedSize = rowSize * height; | ||
var data; | ||
return true; | ||
if (uncompressedSize === 0) { | ||
return true; | ||
} | ||
if (uncompressedSize < 12) { | ||
if (sock.rQwait("TIGHT", uncompressedSize)) { | ||
return false; | ||
} | ||
}, { | ||
key: "_paletteFilter", | ||
value: function _paletteFilter(streamId, x, y, width, height, sock, display, depth) { | ||
if (this._numColors === 0) { | ||
if (sock.rQwait("TIGHT palette", 1)) { | ||
return false; | ||
} | ||
var numColors = sock.rQpeek8() + 1; | ||
var paletteSize = numColors * 3; | ||
data = sock.rQshiftBytes(uncompressedSize); | ||
} else { | ||
data = this._readData(sock); | ||
if (sock.rQwait("TIGHT palette", 1 + paletteSize)) { | ||
return false; | ||
} | ||
if (data === null) { | ||
return false; | ||
} | ||
this._numColors = numColors; | ||
sock.rQskipBytes(1); | ||
this._zlibs[streamId].setInput(data); | ||
sock.rQshiftTo(this._palette, paletteSize); | ||
} | ||
data = this._zlibs[streamId].inflate(uncompressedSize); | ||
var bpp = this._numColors <= 2 ? 1 : 8; | ||
var rowSize = Math.floor((width * bpp + 7) / 8); | ||
var uncompressedSize = rowSize * height; | ||
this._zlibs[streamId].setInput(null); | ||
} // Convert indexed (palette based) image data to RGB | ||
var data = void 0; | ||
if (uncompressedSize < 12) { | ||
if (sock.rQwait("TIGHT", uncompressedSize)) { | ||
return false; | ||
} | ||
if (this._numColors == 2) { | ||
this._monoRect(x, y, width, height, data, this._palette, display); | ||
} else { | ||
this._paletteRect(x, y, width, height, data, this._palette, display); | ||
} | ||
data = sock.rQshiftBytes(uncompressedSize); | ||
} else { | ||
data = this._readData(sock); | ||
if (data === null) { | ||
return false; | ||
} | ||
this._numColors = 0; | ||
return true; | ||
} | ||
}, { | ||
key: "_monoRect", | ||
value: function _monoRect(x, y, width, height, data, palette, display) { | ||
// Convert indexed (palette based) image data to RGB | ||
// TODO: reduce number of calculations inside loop | ||
var dest = this._getScratchBuffer(width * height * 4); | ||
data = this._zlibs[streamId].inflate(data, true, uncompressedSize); | ||
if (data.length != uncompressedSize) { | ||
throw new Error("Incomplete zlib block"); | ||
} | ||
} | ||
var w = Math.floor((width + 7) / 8); | ||
var w1 = Math.floor(width / 8); | ||
// Convert indexed (palette based) image data to RGB | ||
if (this._numColors == 2) { | ||
this._monoRect(x, y, width, height, data, this._palette, display); | ||
} else { | ||
this._paletteRect(x, y, width, height, data, this._palette, display); | ||
} | ||
for (var _y = 0; _y < height; _y++) { | ||
var dp = void 0, | ||
sp = void 0, | ||
_x = void 0; | ||
this._numColors = 0; | ||
for (_x = 0; _x < w1; _x++) { | ||
for (var b = 7; b >= 0; b--) { | ||
dp = (_y * width + _x * 8 + 7 - b) * 4; | ||
sp = (data[_y * w + _x] >> b & 1) * 3; | ||
dest[dp] = palette[sp]; | ||
dest[dp + 1] = palette[sp + 1]; | ||
dest[dp + 2] = palette[sp + 2]; | ||
dest[dp + 3] = 255; | ||
} | ||
} | ||
return true; | ||
for (var _b = 7; _b >= 8 - width % 8; _b--) { | ||
dp = (_y * width + _x * 8 + 7 - _b) * 4; | ||
sp = (data[_y * w + _x] >> _b & 1) * 3; | ||
dest[dp] = palette[sp]; | ||
dest[dp + 1] = palette[sp + 1]; | ||
dest[dp + 2] = palette[sp + 2]; | ||
dest[dp + 3] = 255; | ||
} | ||
}, { | ||
key: "_monoRect", | ||
value: function _monoRect(x, y, width, height, data, palette, display) { | ||
// Convert indexed (palette based) image data to RGB | ||
// TODO: reduce number of calculations inside loop | ||
var dest = this._getScratchBuffer(width * height * 4); | ||
var w = Math.floor((width + 7) / 8); | ||
var w1 = Math.floor(width / 8); | ||
} | ||
for (var _y = 0; _y < height; _y++) { | ||
var dp = void 0, | ||
sp = void 0, | ||
_x = void 0; | ||
for (_x = 0; _x < w1; _x++) { | ||
for (var b = 7; b >= 0; b--) { | ||
dp = (_y * width + _x * 8 + 7 - b) * 4; | ||
sp = (data[_y * w + _x] >> b & 1) * 3; | ||
dest[dp] = palette[sp]; | ||
dest[dp + 1] = palette[sp + 1]; | ||
dest[dp + 2] = palette[sp + 2]; | ||
dest[dp + 3] = 255; | ||
} | ||
} | ||
display.blitImage(x, y, width, height, dest, 0, false); | ||
} | ||
}, { | ||
key: "_paletteRect", | ||
value: function _paletteRect(x, y, width, height, data, palette, display) { | ||
// Convert indexed (palette based) image data to RGB | ||
var dest = this._getScratchBuffer(width * height * 4); | ||
for (var _b = 7; _b >= 8 - width % 8; _b--) { | ||
dp = (_y * width + _x * 8 + 7 - _b) * 4; | ||
sp = (data[_y * w + _x] >> _b & 1) * 3; | ||
dest[dp] = palette[sp]; | ||
dest[dp + 1] = palette[sp + 1]; | ||
dest[dp + 2] = palette[sp + 2]; | ||
dest[dp + 3] = 255; | ||
} | ||
} | ||
var total = width * height * 4; | ||
display.blitRgbxImage(x, y, width, height, dest, 0, false); | ||
} | ||
}, { | ||
key: "_paletteRect", | ||
value: function _paletteRect(x, y, width, height, data, palette, display) { | ||
// Convert indexed (palette based) image data to RGB | ||
var dest = this._getScratchBuffer(width * height * 4); | ||
var total = width * height * 4; | ||
for (var i = 0, j = 0; i < total; i += 4, j++) { | ||
var sp = data[j] * 3; | ||
dest[i] = palette[sp]; | ||
dest[i + 1] = palette[sp + 1]; | ||
dest[i + 2] = palette[sp + 2]; | ||
dest[i + 3] = 255; | ||
} | ||
for (var i = 0, j = 0; i < total; i += 4, j++) { | ||
var sp = data[j] * 3; | ||
dest[i] = palette[sp]; | ||
dest[i + 1] = palette[sp + 1]; | ||
dest[i + 2] = palette[sp + 2]; | ||
dest[i + 3] = 255; | ||
} | ||
display.blitRgbxImage(x, y, width, height, dest, 0, false); | ||
display.blitImage(x, y, width, height, dest, 0, false); | ||
} | ||
}, { | ||
key: "_gradientFilter", | ||
value: function _gradientFilter(streamId, x, y, width, height, sock, display, depth) { | ||
throw new Error("Gradient filter not implemented"); | ||
} | ||
}, { | ||
key: "_readData", | ||
value: function _readData(sock) { | ||
if (this._len === 0) { | ||
if (sock.rQwait("TIGHT", 3)) { | ||
return null; | ||
} | ||
}, { | ||
key: "_gradientFilter", | ||
value: function _gradientFilter(streamId, x, y, width, height, sock, display, depth) { | ||
throw new Error("Gradient filter not implemented"); | ||
} | ||
}, { | ||
key: "_readData", | ||
value: function _readData(sock) { | ||
if (this._len === 0) { | ||
if (sock.rQwait("TIGHT", 3)) { | ||
return null; | ||
} | ||
var byte = void 0; | ||
var _byte; | ||
byte = sock.rQshift8(); | ||
this._len = byte & 0x7f; | ||
if (byte & 0x80) { | ||
byte = sock.rQshift8(); | ||
this._len |= (byte & 0x7f) << 7; | ||
if (byte & 0x80) { | ||
byte = sock.rQshift8(); | ||
this._len |= byte << 14; | ||
} | ||
} | ||
} | ||
_byte = sock.rQshift8(); | ||
this._len = _byte & 0x7f; | ||
if (sock.rQwait("TIGHT", this._len)) { | ||
return null; | ||
} | ||
if (_byte & 0x80) { | ||
_byte = sock.rQshift8(); | ||
this._len |= (_byte & 0x7f) << 7; | ||
var data = sock.rQshiftBytes(this._len); | ||
this._len = 0; | ||
return data; | ||
if (_byte & 0x80) { | ||
_byte = sock.rQshift8(); | ||
this._len |= _byte << 14; | ||
} | ||
} | ||
}, { | ||
key: "_getScratchBuffer", | ||
value: function _getScratchBuffer(size) { | ||
if (!this._scratchBuffer || this._scratchBuffer.length < size) { | ||
this._scratchBuffer = new Uint8Array(size); | ||
} | ||
return this._scratchBuffer; | ||
} | ||
}]); | ||
} | ||
return TightDecoder; | ||
if (sock.rQwait("TIGHT", this._len)) { | ||
return null; | ||
} | ||
var data = sock.rQshiftBytes(this._len); | ||
this._len = 0; | ||
return data; | ||
} | ||
}, { | ||
key: "_getScratchBuffer", | ||
value: function _getScratchBuffer(size) { | ||
if (!this._scratchBuffer || this._scratchBuffer.length < size) { | ||
this._scratchBuffer = new Uint8Array(size); | ||
} | ||
return this._scratchBuffer; | ||
} | ||
}]); | ||
return TightDecoder; | ||
}(); | ||
exports.default = TightDecoder; | ||
exports["default"] = TightDecoder; |
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
var _tight = _interopRequireDefault(require("./tight.js")); | ||
var _tight = require("./tight.js"); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _tight2 = _interopRequireDefault(_tight); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2012 Joel Martin | ||
* Copyright (C) 2018 Samuel Mannehed for Cendio AB | ||
* Copyright (C) 2018 Pierre Ossman for Cendio AB | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* See README.md for usage and integration instructions. | ||
* | ||
*/ | ||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } | ||
var TightPNGDecoder = function (_TightDecoder) { | ||
_inherits(TightPNGDecoder, _TightDecoder); | ||
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } | ||
function TightPNGDecoder() { | ||
_classCallCheck(this, TightPNGDecoder); | ||
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } | ||
return _possibleConstructorReturn(this, (TightPNGDecoder.__proto__ || Object.getPrototypeOf(TightPNGDecoder)).apply(this, arguments)); | ||
} | ||
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } | ||
_createClass(TightPNGDecoder, [{ | ||
key: "_pngRect", | ||
value: function _pngRect(x, y, width, height, sock, display, depth) { | ||
var data = this._readData(sock); | ||
if (data === null) { | ||
return false; | ||
} | ||
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } | ||
display.imageRect(x, y, "image/png", data); | ||
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } | ||
return true; | ||
} | ||
}, { | ||
key: "_basicRect", | ||
value: function _basicRect(ctl, x, y, width, height, sock, display, depth) { | ||
throw new Error("BasicCompression received in TightPNG rect"); | ||
} | ||
}]); | ||
var TightPNGDecoder = /*#__PURE__*/function (_TightDecoder) { | ||
_inherits(TightPNGDecoder, _TightDecoder); | ||
return TightPNGDecoder; | ||
}(_tight2.default); | ||
var _super = _createSuper(TightPNGDecoder); | ||
exports.default = TightPNGDecoder; | ||
function TightPNGDecoder() { | ||
_classCallCheck(this, TightPNGDecoder); | ||
return _super.apply(this, arguments); | ||
} | ||
_createClass(TightPNGDecoder, [{ | ||
key: "_pngRect", | ||
value: function _pngRect(x, y, width, height, sock, display, depth) { | ||
var data = this._readData(sock); | ||
if (data === null) { | ||
return false; | ||
} | ||
display.imageRect(x, y, width, height, "image/png", data); | ||
return true; | ||
} | ||
}, { | ||
key: "_basicRect", | ||
value: function _basicRect(ctl, x, y, width, height, sock, display, depth) { | ||
throw new Error("BasicCompression received in TightPNG rect"); | ||
} | ||
}]); | ||
return TightPNGDecoder; | ||
}(_tight["default"]); | ||
exports["default"] = TightPNGDecoder; |
348
lib/des.js
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
/* | ||
@@ -89,189 +92,224 @@ * Ported from Flashlight VNC ActionScript implementation: | ||
/* eslint-disable comma-spacing */ | ||
// Tables, permutations, S-boxes, etc. | ||
var PC2 = [13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31], | ||
totrot = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; | ||
var z = 0x0; | ||
var a = void 0, | ||
b = void 0, | ||
c = void 0, | ||
d = void 0, | ||
e = void 0, | ||
f = void 0; | ||
a = 1 << 16;b = 1 << 24;c = a | b;d = 1 << 2;e = 1 << 10;f = d | e; | ||
var a, b, c, d, e, f; | ||
a = 1 << 16; | ||
b = 1 << 24; | ||
c = a | b; | ||
d = 1 << 2; | ||
e = 1 << 10; | ||
f = d | e; | ||
var SP1 = [c | e, z | z, a | z, c | f, c | d, a | f, z | d, a | z, z | e, c | e, c | f, z | e, b | f, c | d, b | z, z | d, z | f, b | e, b | e, a | e, a | e, c | z, c | z, b | f, a | d, b | d, b | d, a | d, z | z, z | f, a | f, b | z, a | z, c | f, z | d, c | z, c | e, b | z, b | z, z | e, c | d, a | z, a | e, b | d, z | e, z | d, b | f, a | f, c | f, a | d, c | z, b | f, b | d, z | f, a | f, c | e, z | f, b | e, b | e, z | z, a | d, a | e, z | z, c | d]; | ||
a = 1 << 20;b = 1 << 31;c = a | b;d = 1 << 5;e = 1 << 15;f = d | e; | ||
a = 1 << 20; | ||
b = 1 << 31; | ||
c = a | b; | ||
d = 1 << 5; | ||
e = 1 << 15; | ||
f = d | e; | ||
var SP2 = [c | f, b | e, z | e, a | f, a | z, z | d, c | d, b | f, b | d, c | f, c | e, b | z, b | e, a | z, z | d, c | d, a | e, a | d, b | f, z | z, b | z, z | e, a | f, c | z, a | d, b | d, z | z, a | e, z | f, c | e, c | z, z | f, z | z, a | f, c | d, a | z, b | f, c | z, c | e, z | e, c | z, b | e, z | d, c | f, a | f, z | d, z | e, b | z, z | f, c | e, a | z, b | d, a | d, b | f, b | d, a | d, a | e, z | z, b | e, z | f, b | z, c | d, c | f, a | e]; | ||
a = 1 << 17;b = 1 << 27;c = a | b;d = 1 << 3;e = 1 << 9;f = d | e; | ||
a = 1 << 17; | ||
b = 1 << 27; | ||
c = a | b; | ||
d = 1 << 3; | ||
e = 1 << 9; | ||
f = d | e; | ||
var SP3 = [z | f, c | e, z | z, c | d, b | e, z | z, a | f, b | e, a | d, b | d, b | d, a | z, c | f, a | d, c | z, z | f, b | z, z | d, c | e, z | e, a | e, c | z, c | d, a | f, b | f, a | e, a | z, b | f, z | d, c | f, z | e, b | z, c | e, b | z, a | d, z | f, a | z, c | e, b | e, z | z, z | e, a | d, c | f, b | e, b | d, z | e, z | z, c | d, b | f, a | z, b | z, c | f, z | d, a | f, a | e, b | d, c | z, b | f, z | f, c | z, a | f, z | d, c | d, a | e]; | ||
a = 1 << 13;b = 1 << 23;c = a | b;d = 1 << 0;e = 1 << 7;f = d | e; | ||
a = 1 << 13; | ||
b = 1 << 23; | ||
c = a | b; | ||
d = 1 << 0; | ||
e = 1 << 7; | ||
f = d | e; | ||
var SP4 = [c | d, a | f, a | f, z | e, c | e, b | f, b | d, a | d, z | z, c | z, c | z, c | f, z | f, z | z, b | e, b | d, z | d, a | z, b | z, c | d, z | e, b | z, a | d, a | e, b | f, z | d, a | e, b | e, a | z, c | e, c | f, z | f, b | e, b | d, c | z, c | f, z | f, z | z, z | z, c | z, a | e, b | e, b | f, z | d, c | d, a | f, a | f, z | e, c | f, z | f, z | d, a | z, b | d, a | d, c | e, b | f, a | d, a | e, b | z, c | d, z | e, b | z, a | z, c | e]; | ||
a = 1 << 25;b = 1 << 30;c = a | b;d = 1 << 8;e = 1 << 19;f = d | e; | ||
a = 1 << 25; | ||
b = 1 << 30; | ||
c = a | b; | ||
d = 1 << 8; | ||
e = 1 << 19; | ||
f = d | e; | ||
var SP5 = [z | d, a | f, a | e, c | d, z | e, z | d, b | z, a | e, b | f, z | e, a | d, b | f, c | d, c | e, z | f, b | z, a | z, b | e, b | e, z | z, b | d, c | f, c | f, a | d, c | e, b | d, z | z, c | z, a | f, a | z, c | z, z | f, z | e, c | d, z | d, a | z, b | z, a | e, c | d, b | f, a | d, b | z, c | e, a | f, b | f, z | d, a | z, c | e, c | f, z | f, c | z, c | f, a | e, z | z, b | e, c | z, z | f, a | d, b | d, z | e, z | z, b | e, a | f, b | d]; | ||
a = 1 << 22;b = 1 << 29;c = a | b;d = 1 << 4;e = 1 << 14;f = d | e; | ||
a = 1 << 22; | ||
b = 1 << 29; | ||
c = a | b; | ||
d = 1 << 4; | ||
e = 1 << 14; | ||
f = d | e; | ||
var SP6 = [b | d, c | z, z | e, c | f, c | z, z | d, c | f, a | z, b | e, a | f, a | z, b | d, a | d, b | e, b | z, z | f, z | z, a | d, b | f, z | e, a | e, b | f, z | d, c | d, c | d, z | z, a | f, c | e, z | f, a | e, c | e, b | z, b | e, z | d, c | d, a | e, c | f, a | z, z | f, b | d, a | z, b | e, b | z, z | f, b | d, c | f, a | e, c | z, a | f, c | e, z | z, c | d, z | d, z | e, c | z, a | f, z | e, a | d, b | f, z | z, c | e, b | z, a | d, b | f]; | ||
a = 1 << 21;b = 1 << 26;c = a | b;d = 1 << 1;e = 1 << 11;f = d | e; | ||
a = 1 << 21; | ||
b = 1 << 26; | ||
c = a | b; | ||
d = 1 << 1; | ||
e = 1 << 11; | ||
f = d | e; | ||
var SP7 = [a | z, c | d, b | f, z | z, z | e, b | f, a | f, c | e, c | f, a | z, z | z, b | d, z | d, b | z, c | d, z | f, b | e, a | f, a | d, b | e, b | d, c | z, c | e, a | d, c | z, z | e, z | f, c | f, a | e, z | d, b | z, a | e, b | z, a | e, a | z, b | f, b | f, c | d, c | d, z | d, a | d, b | z, b | e, a | z, c | e, z | f, a | f, c | e, z | f, b | d, c | f, c | z, a | e, z | z, z | d, c | f, z | z, a | f, c | z, z | e, b | d, b | e, z | e, a | d]; | ||
a = 1 << 18;b = 1 << 28;c = a | b;d = 1 << 6;e = 1 << 12;f = d | e; | ||
a = 1 << 18; | ||
b = 1 << 28; | ||
c = a | b; | ||
d = 1 << 6; | ||
e = 1 << 12; | ||
f = d | e; | ||
var SP8 = [b | f, z | e, a | z, c | f, b | z, b | f, z | d, b | z, a | d, c | z, c | f, a | e, c | e, a | f, z | e, z | d, c | z, b | d, b | e, z | f, a | e, a | d, c | d, c | e, z | f, z | z, z | z, c | d, b | d, b | e, a | f, a | z, a | f, a | z, c | e, z | e, z | d, c | d, z | e, a | f, b | e, z | d, b | d, c | z, c | d, b | z, a | z, b | f, z | z, c | f, a | d, b | d, c | z, b | e, b | f, z | z, c | f, a | e, a | e, z | f, z | f, a | d, b | z, c | e]; | ||
/* eslint-enable comma-spacing */ | ||
var DES = function () { | ||
function DES(password) { | ||
_classCallCheck(this, DES); | ||
var DES = /*#__PURE__*/function () { | ||
function DES(password) { | ||
_classCallCheck(this, DES); | ||
this.keys = []; | ||
this.keys = []; // Set the key. | ||
// Set the key. | ||
var pc1m = [], | ||
pcr = [], | ||
kn = []; | ||
var pc1m = [], | ||
pcr = [], | ||
kn = []; | ||
for (var j = 0, l = 56; j < 56; ++j, l -= 8) { | ||
l += l < -5 ? 65 : l < -3 ? 31 : l < -1 ? 63 : l === 27 ? 35 : 0; // PC1 | ||
var m = l & 0x7; | ||
pc1m[j] = (password[l >>> 3] & 1 << m) !== 0 ? 1 : 0; | ||
for (var j = 0, l = 56; j < 56; ++j, l -= 8) { | ||
l += l < -5 ? 65 : l < -3 ? 31 : l < -1 ? 63 : l === 27 ? 35 : 0; // PC1 | ||
var m = l & 0x7; | ||
pc1m[j] = (password[l >>> 3] & 1 << m) !== 0 ? 1 : 0; | ||
} | ||
for (var i = 0; i < 16; ++i) { | ||
var _m = i << 1; | ||
var n = _m + 1; | ||
kn[_m] = kn[n] = 0; | ||
for (var o = 28; o < 59; o += 28) { | ||
for (var _j = o - 28; _j < o; ++_j) { | ||
var _l = _j + totrot[i]; | ||
pcr[_j] = _l < o ? pc1m[_l] : pc1m[_l - 28]; | ||
} | ||
} | ||
for (var i = 0; i < 16; ++i) { | ||
var _m = i << 1; | ||
var n = _m + 1; | ||
kn[_m] = kn[n] = 0; | ||
for (var o = 28; o < 59; o += 28) { | ||
for (var _j = o - 28; _j < o; ++_j) { | ||
var _l = _j + totrot[i]; | ||
pcr[_j] = _l < o ? pc1m[_l] : pc1m[_l - 28]; | ||
} | ||
} | ||
for (var _j2 = 0; _j2 < 24; ++_j2) { | ||
if (pcr[PC2[_j2]] !== 0) { | ||
kn[_m] |= 1 << 23 - _j2; | ||
} | ||
if (pcr[PC2[_j2 + 24]] !== 0) { | ||
kn[n] |= 1 << 23 - _j2; | ||
} | ||
} | ||
for (var _j2 = 0; _j2 < 24; ++_j2) { | ||
if (pcr[PC2[_j2]] !== 0) { | ||
kn[_m] |= 1 << 23 - _j2; | ||
} | ||
// cookey | ||
for (var _i = 0, rawi = 0, KnLi = 0; _i < 16; ++_i) { | ||
var raw0 = kn[rawi++]; | ||
var raw1 = kn[rawi++]; | ||
this.keys[KnLi] = (raw0 & 0x00fc0000) << 6; | ||
this.keys[KnLi] |= (raw0 & 0x00000fc0) << 10; | ||
this.keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10; | ||
this.keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6; | ||
++KnLi; | ||
this.keys[KnLi] = (raw0 & 0x0003f000) << 12; | ||
this.keys[KnLi] |= (raw0 & 0x0000003f) << 16; | ||
this.keys[KnLi] |= (raw1 & 0x0003f000) >>> 4; | ||
this.keys[KnLi] |= raw1 & 0x0000003f; | ||
++KnLi; | ||
if (pcr[PC2[_j2 + 24]] !== 0) { | ||
kn[n] |= 1 << 23 - _j2; | ||
} | ||
} | ||
} // cookey | ||
for (var _i = 0, rawi = 0, KnLi = 0; _i < 16; ++_i) { | ||
var raw0 = kn[rawi++]; | ||
var raw1 = kn[rawi++]; | ||
this.keys[KnLi] = (raw0 & 0x00fc0000) << 6; | ||
this.keys[KnLi] |= (raw0 & 0x00000fc0) << 10; | ||
this.keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10; | ||
this.keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6; | ||
++KnLi; | ||
this.keys[KnLi] = (raw0 & 0x0003f000) << 12; | ||
this.keys[KnLi] |= (raw0 & 0x0000003f) << 16; | ||
this.keys[KnLi] |= (raw1 & 0x0003f000) >>> 4; | ||
this.keys[KnLi] |= raw1 & 0x0000003f; | ||
++KnLi; | ||
} | ||
} // Encrypt 8 bytes of text | ||
// Encrypt 8 bytes of text | ||
_createClass(DES, [{ | ||
key: "enc8", | ||
value: function enc8(text) { | ||
var b = text.slice(); | ||
var i = 0, | ||
l, | ||
r, | ||
x; // left, right, accumulator | ||
// Squash 8 bytes to 2 ints | ||
_createClass(DES, [{ | ||
key: "enc8", | ||
value: function enc8(text) { | ||
var b = text.slice(); | ||
var i = 0, | ||
l = void 0, | ||
r = void 0, | ||
x = void 0; // left, right, accumulator | ||
l = b[i++] << 24 | b[i++] << 16 | b[i++] << 8 | b[i++]; | ||
r = b[i++] << 24 | b[i++] << 16 | b[i++] << 8 | b[i++]; | ||
x = (l >>> 4 ^ r) & 0x0f0f0f0f; | ||
r ^= x; | ||
l ^= x << 4; | ||
x = (l >>> 16 ^ r) & 0x0000ffff; | ||
r ^= x; | ||
l ^= x << 16; | ||
x = (r >>> 2 ^ l) & 0x33333333; | ||
l ^= x; | ||
r ^= x << 2; | ||
x = (r >>> 8 ^ l) & 0x00ff00ff; | ||
l ^= x; | ||
r ^= x << 8; | ||
r = r << 1 | r >>> 31 & 1; | ||
x = (l ^ r) & 0xaaaaaaaa; | ||
l ^= x; | ||
r ^= x; | ||
l = l << 1 | l >>> 31 & 1; | ||
// Squash 8 bytes to 2 ints | ||
l = b[i++] << 24 | b[i++] << 16 | b[i++] << 8 | b[i++]; | ||
r = b[i++] << 24 | b[i++] << 16 | b[i++] << 8 | b[i++]; | ||
for (var _i2 = 0, keysi = 0; _i2 < 8; ++_i2) { | ||
x = r << 28 | r >>> 4; | ||
x ^= this.keys[keysi++]; | ||
var fval = SP7[x & 0x3f]; | ||
fval |= SP5[x >>> 8 & 0x3f]; | ||
fval |= SP3[x >>> 16 & 0x3f]; | ||
fval |= SP1[x >>> 24 & 0x3f]; | ||
x = r ^ this.keys[keysi++]; | ||
fval |= SP8[x & 0x3f]; | ||
fval |= SP6[x >>> 8 & 0x3f]; | ||
fval |= SP4[x >>> 16 & 0x3f]; | ||
fval |= SP2[x >>> 24 & 0x3f]; | ||
l ^= fval; | ||
x = l << 28 | l >>> 4; | ||
x ^= this.keys[keysi++]; | ||
fval = SP7[x & 0x3f]; | ||
fval |= SP5[x >>> 8 & 0x3f]; | ||
fval |= SP3[x >>> 16 & 0x3f]; | ||
fval |= SP1[x >>> 24 & 0x3f]; | ||
x = l ^ this.keys[keysi++]; | ||
fval |= SP8[x & 0x0000003f]; | ||
fval |= SP6[x >>> 8 & 0x3f]; | ||
fval |= SP4[x >>> 16 & 0x3f]; | ||
fval |= SP2[x >>> 24 & 0x3f]; | ||
r ^= fval; | ||
} | ||
x = (l >>> 4 ^ r) & 0x0f0f0f0f; | ||
r ^= x; | ||
l ^= x << 4; | ||
x = (l >>> 16 ^ r) & 0x0000ffff; | ||
r ^= x; | ||
l ^= x << 16; | ||
x = (r >>> 2 ^ l) & 0x33333333; | ||
l ^= x; | ||
r ^= x << 2; | ||
x = (r >>> 8 ^ l) & 0x00ff00ff; | ||
l ^= x; | ||
r ^= x << 8; | ||
r = r << 1 | r >>> 31 & 1; | ||
x = (l ^ r) & 0xaaaaaaaa; | ||
l ^= x; | ||
r ^= x; | ||
l = l << 1 | l >>> 31 & 1; | ||
r = r << 31 | r >>> 1; | ||
x = (l ^ r) & 0xaaaaaaaa; | ||
l ^= x; | ||
r ^= x; | ||
l = l << 31 | l >>> 1; | ||
x = (l >>> 8 ^ r) & 0x00ff00ff; | ||
r ^= x; | ||
l ^= x << 8; | ||
x = (l >>> 2 ^ r) & 0x33333333; | ||
r ^= x; | ||
l ^= x << 2; | ||
x = (r >>> 16 ^ l) & 0x0000ffff; | ||
l ^= x; | ||
r ^= x << 16; | ||
x = (r >>> 4 ^ l) & 0x0f0f0f0f; | ||
l ^= x; | ||
r ^= x << 4; // Spread ints to bytes | ||
for (var _i2 = 0, keysi = 0; _i2 < 8; ++_i2) { | ||
x = r << 28 | r >>> 4; | ||
x ^= this.keys[keysi++]; | ||
var fval = SP7[x & 0x3f]; | ||
fval |= SP5[x >>> 8 & 0x3f]; | ||
fval |= SP3[x >>> 16 & 0x3f]; | ||
fval |= SP1[x >>> 24 & 0x3f]; | ||
x = r ^ this.keys[keysi++]; | ||
fval |= SP8[x & 0x3f]; | ||
fval |= SP6[x >>> 8 & 0x3f]; | ||
fval |= SP4[x >>> 16 & 0x3f]; | ||
fval |= SP2[x >>> 24 & 0x3f]; | ||
l ^= fval; | ||
x = l << 28 | l >>> 4; | ||
x ^= this.keys[keysi++]; | ||
fval = SP7[x & 0x3f]; | ||
fval |= SP5[x >>> 8 & 0x3f]; | ||
fval |= SP3[x >>> 16 & 0x3f]; | ||
fval |= SP1[x >>> 24 & 0x3f]; | ||
x = l ^ this.keys[keysi++]; | ||
fval |= SP8[x & 0x0000003f]; | ||
fval |= SP6[x >>> 8 & 0x3f]; | ||
fval |= SP4[x >>> 16 & 0x3f]; | ||
fval |= SP2[x >>> 24 & 0x3f]; | ||
r ^= fval; | ||
} | ||
x = [r, l]; | ||
r = r << 31 | r >>> 1; | ||
x = (l ^ r) & 0xaaaaaaaa; | ||
l ^= x; | ||
r ^= x; | ||
l = l << 31 | l >>> 1; | ||
x = (l >>> 8 ^ r) & 0x00ff00ff; | ||
r ^= x; | ||
l ^= x << 8; | ||
x = (l >>> 2 ^ r) & 0x33333333; | ||
r ^= x; | ||
l ^= x << 2; | ||
x = (r >>> 16 ^ l) & 0x0000ffff; | ||
l ^= x; | ||
r ^= x << 16; | ||
x = (r >>> 4 ^ l) & 0x0f0f0f0f; | ||
l ^= x; | ||
r ^= x << 4; | ||
for (i = 0; i < 8; i++) { | ||
b[i] = (x[i >>> 2] >>> 8 * (3 - i % 4)) % 256; | ||
// Spread ints to bytes | ||
x = [r, l]; | ||
for (i = 0; i < 8; i++) { | ||
b[i] = (x[i >>> 2] >>> 8 * (3 - i % 4)) % 256; | ||
if (b[i] < 0) { | ||
b[i] += 256; | ||
} // unsigned | ||
} | ||
return b; | ||
} | ||
if (b[i] < 0) { | ||
b[i] += 256; | ||
} // unsigned | ||
// Encrypt 16 bytes of text using passwd as key | ||
} | ||
}, { | ||
key: "encrypt", | ||
value: function encrypt(t) { | ||
return this.enc8(t.slice(0, 8)).concat(this.enc8(t.slice(8, 16))); | ||
} | ||
}]); | ||
return b; | ||
} // Encrypt 16 bytes of text using passwd as key | ||
return DES; | ||
}, { | ||
key: "encrypt", | ||
value: function encrypt(t) { | ||
return this.enc8(t.slice(0, 8)).concat(this.enc8(t.slice(8, 16))); | ||
} | ||
}]); | ||
return DES; | ||
}(); | ||
exports.default = DES; | ||
exports["default"] = DES; |
1074
lib/display.js
@@ -1,714 +0,566 @@ | ||
'use strict'; | ||
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* See README.md for usage and integration instructions. | ||
*/ | ||
var Log = _interopRequireWildcard(require("./util/logging.js")); | ||
var _logging = require('./util/logging.js'); | ||
var _base = _interopRequireDefault(require("./base64.js")); | ||
var Log = _interopRequireWildcard(_logging); | ||
var _int = require("./util/int.js"); | ||
var _base = require('./base64.js'); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _base2 = _interopRequireDefault(_base); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
var _browser = require('./util/browser.js'); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var Display = function () { | ||
function Display(target) { | ||
_classCallCheck(this, Display); | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
this._drawCtx = null; | ||
this._c_forceCanvas = false; | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
this._renderQ = []; // queue drawing actions for in-oder rendering | ||
this._flushing = false; | ||
var Display = /*#__PURE__*/function () { | ||
function Display(target) { | ||
_classCallCheck(this, Display); | ||
// the full frame buffer (logical canvas) size | ||
this._fb_width = 0; | ||
this._fb_height = 0; | ||
this._drawCtx = null; | ||
this._renderQ = []; // queue drawing actions for in-oder rendering | ||
this._prevDrawStyle = ""; | ||
this._tile = null; | ||
this._tile16x16 = null; | ||
this._tile_x = 0; | ||
this._tile_y = 0; | ||
this._flushing = false; // the full frame buffer (logical canvas) size | ||
Log.Debug(">> Display.constructor"); | ||
this._fbWidth = 0; | ||
this._fbHeight = 0; | ||
this._prevDrawStyle = ""; | ||
Log.Debug(">> Display.constructor"); // The visible canvas | ||
// The visible canvas | ||
this._target = target; | ||
this._target = target; | ||
if (!this._target) { | ||
throw new Error("Target must be set"); | ||
} | ||
if (!this._target) { | ||
throw new Error("Target must be set"); | ||
} | ||
if (typeof this._target === 'string') { | ||
throw new Error('target must be a DOM element'); | ||
} | ||
if (typeof this._target === 'string') { | ||
throw new Error('target must be a DOM element'); | ||
} | ||
if (!this._target.getContext) { | ||
throw new Error("no getContext method"); | ||
} | ||
if (!this._target.getContext) { | ||
throw new Error("no getContext method"); | ||
} | ||
this._targetCtx = this._target.getContext('2d'); | ||
this._targetCtx = this._target.getContext('2d'); // the visible canvas viewport (i.e. what actually gets seen) | ||
// the visible canvas viewport (i.e. what actually gets seen) | ||
this._viewportLoc = { 'x': 0, 'y': 0, 'w': this._target.width, 'h': this._target.height }; | ||
this._viewportLoc = { | ||
'x': 0, | ||
'y': 0, | ||
'w': this._target.width, | ||
'h': this._target.height | ||
}; // The hidden canvas, where we do the actual rendering | ||
// The hidden canvas, where we do the actual rendering | ||
this._backbuffer = document.createElement('canvas'); | ||
this._drawCtx = this._backbuffer.getContext('2d'); | ||
this._backbuffer = document.createElement('canvas'); | ||
this._drawCtx = this._backbuffer.getContext('2d'); | ||
this._damageBounds = { | ||
left: 0, | ||
top: 0, | ||
right: this._backbuffer.width, | ||
bottom: this._backbuffer.height | ||
}; | ||
Log.Debug("User Agent: " + navigator.userAgent); | ||
Log.Debug("<< Display.constructor"); // ===== PROPERTIES ===== | ||
this._damageBounds = { left: 0, top: 0, | ||
right: this._backbuffer.width, | ||
bottom: this._backbuffer.height }; | ||
this._scale = 1.0; | ||
this._clipViewport = false; // ===== EVENT HANDLERS ===== | ||
Log.Debug("User Agent: " + navigator.userAgent); | ||
this.onflush = function () {}; // A flush request has finished | ||
this.clear(); | ||
} // ===== PROPERTIES ===== | ||
// Check canvas features | ||
if (!('createImageData' in this._drawCtx)) { | ||
throw new Error("Canvas does not support createImageData"); | ||
} | ||
this._tile16x16 = this._drawCtx.createImageData(16, 16); | ||
Log.Debug("<< Display.constructor"); | ||
_createClass(Display, [{ | ||
key: "scale", | ||
get: function get() { | ||
return this._scale; | ||
}, | ||
set: function set(scale) { | ||
this._rescale(scale); | ||
} | ||
}, { | ||
key: "clipViewport", | ||
get: function get() { | ||
return this._clipViewport; | ||
}, | ||
set: function set(viewport) { | ||
this._clipViewport = viewport; // May need to readjust the viewport dimensions | ||
// ===== PROPERTIES ===== | ||
var vp = this._viewportLoc; | ||
this.viewportChangeSize(vp.w, vp.h); | ||
this.viewportChangePos(0, 0); | ||
} | ||
}, { | ||
key: "width", | ||
get: function get() { | ||
return this._fbWidth; | ||
} | ||
}, { | ||
key: "height", | ||
get: function get() { | ||
return this._fbHeight; | ||
} // ===== PUBLIC METHODS ===== | ||
this._scale = 1.0; | ||
this._clipViewport = false; | ||
this.logo = null; | ||
}, { | ||
key: "viewportChangePos", | ||
value: function viewportChangePos(deltaX, deltaY) { | ||
var vp = this._viewportLoc; | ||
deltaX = Math.floor(deltaX); | ||
deltaY = Math.floor(deltaY); | ||
// ===== EVENT HANDLERS ===== | ||
if (!this._clipViewport) { | ||
deltaX = -vp.w; // clamped later of out of bounds | ||
this.onflush = function () {}; // A flush request has finished | ||
} | ||
deltaY = -vp.h; | ||
} | ||
// ===== PROPERTIES ===== | ||
var vx2 = vp.x + vp.w - 1; | ||
var vy2 = vp.y + vp.h - 1; // Position change | ||
_createClass(Display, [{ | ||
key: 'viewportChangePos', | ||
if (deltaX < 0 && vp.x + deltaX < 0) { | ||
deltaX = -vp.x; | ||
} | ||
if (vx2 + deltaX >= this._fbWidth) { | ||
deltaX -= vx2 + deltaX - this._fbWidth + 1; | ||
} | ||
// ===== PUBLIC METHODS ===== | ||
if (vp.y + deltaY < 0) { | ||
deltaY = -vp.y; | ||
} | ||
value: function viewportChangePos(deltaX, deltaY) { | ||
var vp = this._viewportLoc; | ||
deltaX = Math.floor(deltaX); | ||
deltaY = Math.floor(deltaY); | ||
if (vy2 + deltaY >= this._fbHeight) { | ||
deltaY -= vy2 + deltaY - this._fbHeight + 1; | ||
} | ||
if (!this._clipViewport) { | ||
deltaX = -vp.w; // clamped later of out of bounds | ||
deltaY = -vp.h; | ||
} | ||
if (deltaX === 0 && deltaY === 0) { | ||
return; | ||
} | ||
var vx2 = vp.x + vp.w - 1; | ||
var vy2 = vp.y + vp.h - 1; | ||
Log.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY); | ||
vp.x += deltaX; | ||
vp.y += deltaY; | ||
// Position change | ||
this._damage(vp.x, vp.y, vp.w, vp.h); | ||
if (deltaX < 0 && vp.x + deltaX < 0) { | ||
deltaX = -vp.x; | ||
} | ||
if (vx2 + deltaX >= this._fb_width) { | ||
deltaX -= vx2 + deltaX - this._fb_width + 1; | ||
} | ||
this.flip(); | ||
} | ||
}, { | ||
key: "viewportChangeSize", | ||
value: function viewportChangeSize(width, height) { | ||
if (!this._clipViewport || typeof width === "undefined" || typeof height === "undefined") { | ||
Log.Debug("Setting viewport to full display region"); | ||
width = this._fbWidth; | ||
height = this._fbHeight; | ||
} | ||
if (vp.y + deltaY < 0) { | ||
deltaY = -vp.y; | ||
} | ||
if (vy2 + deltaY >= this._fb_height) { | ||
deltaY -= vy2 + deltaY - this._fb_height + 1; | ||
} | ||
width = Math.floor(width); | ||
height = Math.floor(height); | ||
if (deltaX === 0 && deltaY === 0) { | ||
return; | ||
} | ||
Log.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY); | ||
if (width > this._fbWidth) { | ||
width = this._fbWidth; | ||
} | ||
vp.x += deltaX; | ||
vp.y += deltaY; | ||
if (height > this._fbHeight) { | ||
height = this._fbHeight; | ||
} | ||
this._damage(vp.x, vp.y, vp.w, vp.h); | ||
var vp = this._viewportLoc; | ||
this.flip(); | ||
} | ||
}, { | ||
key: 'viewportChangeSize', | ||
value: function viewportChangeSize(width, height) { | ||
if (vp.w !== width || vp.h !== height) { | ||
vp.w = width; | ||
vp.h = height; | ||
var canvas = this._target; | ||
canvas.width = width; | ||
canvas.height = height; // The position might need to be updated if we've grown | ||
if (!this._clipViewport || typeof width === "undefined" || typeof height === "undefined") { | ||
this.viewportChangePos(0, 0); | ||
Log.Debug("Setting viewport to full display region"); | ||
width = this._fb_width; | ||
height = this._fb_height; | ||
} | ||
this._damage(vp.x, vp.y, vp.w, vp.h); | ||
width = Math.floor(width); | ||
height = Math.floor(height); | ||
this.flip(); // Update the visible size of the target canvas | ||
if (width > this._fb_width) { | ||
width = this._fb_width; | ||
} | ||
if (height > this._fb_height) { | ||
height = this._fb_height; | ||
} | ||
this._rescale(this._scale); | ||
} | ||
} | ||
}, { | ||
key: "absX", | ||
value: function absX(x) { | ||
if (this._scale === 0) { | ||
return 0; | ||
} | ||
var vp = this._viewportLoc; | ||
if (vp.w !== width || vp.h !== height) { | ||
vp.w = width; | ||
vp.h = height; | ||
return (0, _int.toSigned32bit)(x / this._scale + this._viewportLoc.x); | ||
} | ||
}, { | ||
key: "absY", | ||
value: function absY(y) { | ||
if (this._scale === 0) { | ||
return 0; | ||
} | ||
var canvas = this._target; | ||
canvas.width = width; | ||
canvas.height = height; | ||
return (0, _int.toSigned32bit)(y / this._scale + this._viewportLoc.y); | ||
} | ||
}, { | ||
key: "resize", | ||
value: function resize(width, height) { | ||
this._prevDrawStyle = ""; | ||
this._fbWidth = width; | ||
this._fbHeight = height; | ||
var canvas = this._backbuffer; | ||
// The position might need to be updated if we've grown | ||
this.viewportChangePos(0, 0); | ||
if (canvas.width !== width || canvas.height !== height) { | ||
// We have to save the canvas data since changing the size will clear it | ||
var saveImg = null; | ||
this._damage(vp.x, vp.y, vp.w, vp.h); | ||
this.flip(); | ||
if (canvas.width > 0 && canvas.height > 0) { | ||
saveImg = this._drawCtx.getImageData(0, 0, canvas.width, canvas.height); | ||
} | ||
// Update the visible size of the target canvas | ||
this._rescale(this._scale); | ||
} | ||
if (canvas.width !== width) { | ||
canvas.width = width; | ||
} | ||
}, { | ||
key: 'absX', | ||
value: function absX(x) { | ||
return x / this._scale + this._viewportLoc.x; | ||
if (canvas.height !== height) { | ||
canvas.height = height; | ||
} | ||
}, { | ||
key: 'absY', | ||
value: function absY(y) { | ||
return y / this._scale + this._viewportLoc.y; | ||
if (saveImg) { | ||
this._drawCtx.putImageData(saveImg, 0, 0); | ||
} | ||
}, { | ||
key: 'resize', | ||
value: function resize(width, height) { | ||
this._prevDrawStyle = ""; | ||
} // Readjust the viewport as it may be incorrectly sized | ||
// and positioned | ||
this._fb_width = width; | ||
this._fb_height = height; | ||
var canvas = this._backbuffer; | ||
if (canvas.width !== width || canvas.height !== height) { | ||
var vp = this._viewportLoc; | ||
this.viewportChangeSize(vp.w, vp.h); | ||
this.viewportChangePos(0, 0); | ||
} // Track what parts of the visible canvas that need updating | ||
// We have to save the canvas data since changing the size will clear it | ||
var saveImg = null; | ||
if (canvas.width > 0 && canvas.height > 0) { | ||
saveImg = this._drawCtx.getImageData(0, 0, canvas.width, canvas.height); | ||
} | ||
}, { | ||
key: "_damage", | ||
value: function _damage(x, y, w, h) { | ||
if (x < this._damageBounds.left) { | ||
this._damageBounds.left = x; | ||
} | ||
if (canvas.width !== width) { | ||
canvas.width = width; | ||
} | ||
if (canvas.height !== height) { | ||
canvas.height = height; | ||
} | ||
if (y < this._damageBounds.top) { | ||
this._damageBounds.top = y; | ||
} | ||
if (saveImg) { | ||
this._drawCtx.putImageData(saveImg, 0, 0); | ||
} | ||
} | ||
if (x + w > this._damageBounds.right) { | ||
this._damageBounds.right = x + w; | ||
} | ||
// Readjust the viewport as it may be incorrectly sized | ||
// and positioned | ||
var vp = this._viewportLoc; | ||
this.viewportChangeSize(vp.w, vp.h); | ||
this.viewportChangePos(0, 0); | ||
if (y + h > this._damageBounds.bottom) { | ||
this._damageBounds.bottom = y + h; | ||
} | ||
} // Update the visible canvas with the contents of the | ||
// rendering canvas | ||
}, { | ||
key: "flip", | ||
value: function flip(fromQueue) { | ||
if (this._renderQ.length !== 0 && !fromQueue) { | ||
this._renderQPush({ | ||
'type': 'flip' | ||
}); | ||
} else { | ||
var x = this._damageBounds.left; | ||
var y = this._damageBounds.top; | ||
var w = this._damageBounds.right - x; | ||
var h = this._damageBounds.bottom - y; | ||
var vx = x - this._viewportLoc.x; | ||
var vy = y - this._viewportLoc.y; | ||
if (vx < 0) { | ||
w += vx; | ||
x -= vx; | ||
vx = 0; | ||
} | ||
// Track what parts of the visible canvas that need updating | ||
if (vy < 0) { | ||
h += vy; | ||
y -= vy; | ||
vy = 0; | ||
} | ||
}, { | ||
key: '_damage', | ||
value: function _damage(x, y, w, h) { | ||
if (x < this._damageBounds.left) { | ||
this._damageBounds.left = x; | ||
} | ||
if (y < this._damageBounds.top) { | ||
this._damageBounds.top = y; | ||
} | ||
if (x + w > this._damageBounds.right) { | ||
this._damageBounds.right = x + w; | ||
} | ||
if (y + h > this._damageBounds.bottom) { | ||
this._damageBounds.bottom = y + h; | ||
} | ||
if (vx + w > this._viewportLoc.w) { | ||
w = this._viewportLoc.w - vx; | ||
} | ||
// Update the visible canvas with the contents of the | ||
// rendering canvas | ||
if (vy + h > this._viewportLoc.h) { | ||
h = this._viewportLoc.h - vy; | ||
} | ||
}, { | ||
key: 'flip', | ||
value: function flip(from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
this._renderQ_push({ | ||
'type': 'flip' | ||
}); | ||
} else { | ||
var x = this._damageBounds.left; | ||
var y = this._damageBounds.top; | ||
var w = this._damageBounds.right - x; | ||
var h = this._damageBounds.bottom - y; | ||
if (w > 0 && h > 0) { | ||
// FIXME: We may need to disable image smoothing here | ||
// as well (see copyImage()), but we haven't | ||
// noticed any problem yet. | ||
this._targetCtx.drawImage(this._backbuffer, x, y, w, h, vx, vy, w, h); | ||
} | ||
var vx = x - this._viewportLoc.x; | ||
var vy = y - this._viewportLoc.y; | ||
this._damageBounds.left = this._damageBounds.top = 65535; | ||
this._damageBounds.right = this._damageBounds.bottom = 0; | ||
} | ||
} | ||
}, { | ||
key: "pending", | ||
value: function pending() { | ||
return this._renderQ.length > 0; | ||
} | ||
}, { | ||
key: "flush", | ||
value: function flush() { | ||
if (this._renderQ.length === 0) { | ||
this.onflush(); | ||
} else { | ||
this._flushing = true; | ||
} | ||
} | ||
}, { | ||
key: "fillRect", | ||
value: function fillRect(x, y, width, height, color, fromQueue) { | ||
if (this._renderQ.length !== 0 && !fromQueue) { | ||
this._renderQPush({ | ||
'type': 'fill', | ||
'x': x, | ||
'y': y, | ||
'width': width, | ||
'height': height, | ||
'color': color | ||
}); | ||
} else { | ||
this._setFillColor(color); | ||
if (vx < 0) { | ||
w += vx; | ||
x -= vx; | ||
vx = 0; | ||
} | ||
if (vy < 0) { | ||
h += vy; | ||
y -= vy; | ||
vy = 0; | ||
} | ||
this._drawCtx.fillRect(x, y, width, height); | ||
if (vx + w > this._viewportLoc.w) { | ||
w = this._viewportLoc.w - vx; | ||
} | ||
if (vy + h > this._viewportLoc.h) { | ||
h = this._viewportLoc.h - vy; | ||
} | ||
this._damage(x, y, width, height); | ||
} | ||
} | ||
}, { | ||
key: "copyImage", | ||
value: function copyImage(oldX, oldY, newX, newY, w, h, fromQueue) { | ||
if (this._renderQ.length !== 0 && !fromQueue) { | ||
this._renderQPush({ | ||
'type': 'copy', | ||
'oldX': oldX, | ||
'oldY': oldY, | ||
'x': newX, | ||
'y': newY, | ||
'width': w, | ||
'height': h | ||
}); | ||
} else { | ||
// Due to this bug among others [1] we need to disable the image-smoothing to | ||
// avoid getting a blur effect when copying data. | ||
// | ||
// 1. https://bugzilla.mozilla.org/show_bug.cgi?id=1194719 | ||
// | ||
// We need to set these every time since all properties are reset | ||
// when the the size is changed | ||
this._drawCtx.mozImageSmoothingEnabled = false; | ||
this._drawCtx.webkitImageSmoothingEnabled = false; | ||
this._drawCtx.msImageSmoothingEnabled = false; | ||
this._drawCtx.imageSmoothingEnabled = false; | ||
if (w > 0 && h > 0) { | ||
// FIXME: We may need to disable image smoothing here | ||
// as well (see copyImage()), but we haven't | ||
// noticed any problem yet. | ||
this._targetCtx.drawImage(this._backbuffer, x, y, w, h, vx, vy, w, h); | ||
} | ||
this._drawCtx.drawImage(this._backbuffer, oldX, oldY, w, h, newX, newY, w, h); | ||
this._damageBounds.left = this._damageBounds.top = 65535; | ||
this._damageBounds.right = this._damageBounds.bottom = 0; | ||
} | ||
} | ||
}, { | ||
key: 'clear', | ||
value: function clear() { | ||
if (this._logo) { | ||
this.resize(this._logo.width, this._logo.height); | ||
this.imageRect(0, 0, this._logo.type, this._logo.data); | ||
} else { | ||
this.resize(240, 20); | ||
this._drawCtx.clearRect(0, 0, this._fb_width, this._fb_height); | ||
} | ||
this.flip(); | ||
} | ||
}, { | ||
key: 'pending', | ||
value: function pending() { | ||
return this._renderQ.length > 0; | ||
} | ||
}, { | ||
key: 'flush', | ||
value: function flush() { | ||
if (this._renderQ.length === 0) { | ||
this.onflush(); | ||
} else { | ||
this._flushing = true; | ||
} | ||
} | ||
}, { | ||
key: 'fillRect', | ||
value: function fillRect(x, y, width, height, color, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
this._renderQ_push({ | ||
'type': 'fill', | ||
'x': x, | ||
'y': y, | ||
'width': width, | ||
'height': height, | ||
'color': color | ||
}); | ||
} else { | ||
this._setFillColor(color); | ||
this._drawCtx.fillRect(x, y, width, height); | ||
this._damage(x, y, width, height); | ||
} | ||
} | ||
}, { | ||
key: 'copyImage', | ||
value: function copyImage(old_x, old_y, new_x, new_y, w, h, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
this._renderQ_push({ | ||
'type': 'copy', | ||
'old_x': old_x, | ||
'old_y': old_y, | ||
'x': new_x, | ||
'y': new_y, | ||
'width': w, | ||
'height': h | ||
}); | ||
} else { | ||
// Due to this bug among others [1] we need to disable the image-smoothing to | ||
// avoid getting a blur effect when copying data. | ||
// | ||
// 1. https://bugzilla.mozilla.org/show_bug.cgi?id=1194719 | ||
// | ||
// We need to set these every time since all properties are reset | ||
// when the the size is changed | ||
this._drawCtx.mozImageSmoothingEnabled = false; | ||
this._drawCtx.webkitImageSmoothingEnabled = false; | ||
this._drawCtx.msImageSmoothingEnabled = false; | ||
this._drawCtx.imageSmoothingEnabled = false; | ||
this._damage(newX, newY, w, h); | ||
} | ||
} | ||
}, { | ||
key: "imageRect", | ||
value: function imageRect(x, y, width, height, mime, arr) { | ||
/* The internal logic cannot handle empty images, so bail early */ | ||
if (width === 0 || height === 0) { | ||
return; | ||
} | ||
this._drawCtx.drawImage(this._backbuffer, old_x, old_y, w, h, new_x, new_y, w, h); | ||
this._damage(new_x, new_y, w, h); | ||
} | ||
} | ||
}, { | ||
key: 'imageRect', | ||
value: function imageRect(x, y, mime, arr) { | ||
var img = new Image(); | ||
img.src = "data: " + mime + ";base64," + _base2.default.encode(arr); | ||
this._renderQ_push({ | ||
'type': 'img', | ||
'img': img, | ||
'x': x, | ||
'y': y | ||
}); | ||
} | ||
var img = new Image(); | ||
img.src = "data: " + mime + ";base64," + _base["default"].encode(arr); | ||
// start updating a tile | ||
this._renderQPush({ | ||
'type': 'img', | ||
'img': img, | ||
'x': x, | ||
'y': y, | ||
'width': width, | ||
'height': height | ||
}); | ||
} | ||
}, { | ||
key: "blitImage", | ||
value: function blitImage(x, y, width, height, arr, offset, fromQueue) { | ||
if (this._renderQ.length !== 0 && !fromQueue) { | ||
// NB(directxman12): it's technically more performant here to use preallocated arrays, | ||
// but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, | ||
// this probably isn't getting called *nearly* as much | ||
var newArr = new Uint8Array(width * height * 4); | ||
newArr.set(new Uint8Array(arr.buffer, 0, newArr.length)); | ||
}, { | ||
key: 'startTile', | ||
value: function startTile(x, y, width, height, color) { | ||
this._tile_x = x; | ||
this._tile_y = y; | ||
if (width === 16 && height === 16) { | ||
this._tile = this._tile16x16; | ||
} else { | ||
this._tile = this._drawCtx.createImageData(width, height); | ||
} | ||
this._renderQPush({ | ||
'type': 'blit', | ||
'data': newArr, | ||
'x': x, | ||
'y': y, | ||
'width': width, | ||
'height': height | ||
}); | ||
} else { | ||
// NB(directxman12): arr must be an Type Array view | ||
var data = new Uint8ClampedArray(arr.buffer, arr.byteOffset + offset, width * height * 4); | ||
var img = new ImageData(data, width, height); | ||
var red = color[2]; | ||
var green = color[1]; | ||
var blue = color[0]; | ||
this._drawCtx.putImageData(img, x, y); | ||
var data = this._tile.data; | ||
for (var i = 0; i < width * height * 4; i += 4) { | ||
data[i] = red; | ||
data[i + 1] = green; | ||
data[i + 2] = blue; | ||
data[i + 3] = 255; | ||
} | ||
} | ||
this._damage(x, y, width, height); | ||
} | ||
} | ||
}, { | ||
key: "drawImage", | ||
value: function drawImage(img, x, y) { | ||
this._drawCtx.drawImage(img, x, y); | ||
// update sub-rectangle of the current tile | ||
this._damage(x, y, img.width, img.height); | ||
} | ||
}, { | ||
key: "autoscale", | ||
value: function autoscale(containerWidth, containerHeight) { | ||
var scaleRatio; | ||
}, { | ||
key: 'subTile', | ||
value: function subTile(x, y, w, h, color) { | ||
var red = color[2]; | ||
var green = color[1]; | ||
var blue = color[0]; | ||
var xend = x + w; | ||
var yend = y + h; | ||
if (containerWidth === 0 || containerHeight === 0) { | ||
scaleRatio = 0; | ||
} else { | ||
var vp = this._viewportLoc; | ||
var targetAspectRatio = containerWidth / containerHeight; | ||
var fbAspectRatio = vp.w / vp.h; | ||
var data = this._tile.data; | ||
var width = this._tile.width; | ||
for (var j = y; j < yend; j++) { | ||
for (var i = x; i < xend; i++) { | ||
var p = (i + j * width) * 4; | ||
data[p] = red; | ||
data[p + 1] = green; | ||
data[p + 2] = blue; | ||
data[p + 3] = 255; | ||
} | ||
} | ||
if (fbAspectRatio >= targetAspectRatio) { | ||
scaleRatio = containerWidth / vp.w; | ||
} else { | ||
scaleRatio = containerHeight / vp.h; | ||
} | ||
} | ||
// draw the current tile to the screen | ||
this._rescale(scaleRatio); | ||
} // ===== PRIVATE METHODS ===== | ||
}, { | ||
key: 'finishTile', | ||
value: function finishTile() { | ||
this._drawCtx.putImageData(this._tile, this._tile_x, this._tile_y); | ||
this._damage(this._tile_x, this._tile_y, this._tile.width, this._tile.height); | ||
} | ||
}, { | ||
key: 'blitImage', | ||
value: function blitImage(x, y, width, height, arr, offset, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
// NB(directxman12): it's technically more performant here to use preallocated arrays, | ||
// but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, | ||
// this probably isn't getting called *nearly* as much | ||
var new_arr = new Uint8Array(width * height * 4); | ||
new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); | ||
this._renderQ_push({ | ||
'type': 'blit', | ||
'data': new_arr, | ||
'x': x, | ||
'y': y, | ||
'width': width, | ||
'height': height | ||
}); | ||
} else { | ||
this._bgrxImageData(x, y, width, height, arr, offset); | ||
} | ||
} | ||
}, { | ||
key: 'blitRgbImage', | ||
value: function blitRgbImage(x, y, width, height, arr, offset, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
// NB(directxman12): it's technically more performant here to use preallocated arrays, | ||
// but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, | ||
// this probably isn't getting called *nearly* as much | ||
var new_arr = new Uint8Array(width * height * 3); | ||
new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); | ||
this._renderQ_push({ | ||
'type': 'blitRgb', | ||
'data': new_arr, | ||
'x': x, | ||
'y': y, | ||
'width': width, | ||
'height': height | ||
}); | ||
} else { | ||
this._rgbImageData(x, y, width, height, arr, offset); | ||
} | ||
} | ||
}, { | ||
key: 'blitRgbxImage', | ||
value: function blitRgbxImage(x, y, width, height, arr, offset, from_queue) { | ||
if (this._renderQ.length !== 0 && !from_queue) { | ||
// NB(directxman12): it's technically more performant here to use preallocated arrays, | ||
// but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, | ||
// this probably isn't getting called *nearly* as much | ||
var new_arr = new Uint8Array(width * height * 4); | ||
new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); | ||
this._renderQ_push({ | ||
'type': 'blitRgbx', | ||
'data': new_arr, | ||
'x': x, | ||
'y': y, | ||
'width': width, | ||
'height': height | ||
}); | ||
} else { | ||
this._rgbxImageData(x, y, width, height, arr, offset); | ||
} | ||
} | ||
}, { | ||
key: 'drawImage', | ||
value: function drawImage(img, x, y) { | ||
this._drawCtx.drawImage(img, x, y); | ||
this._damage(x, y, img.width, img.height); | ||
} | ||
}, { | ||
key: 'autoscale', | ||
value: function autoscale(containerWidth, containerHeight) { | ||
if (containerWidth === 0 || containerHeight === 0) { | ||
Log.Warn("Autoscale doesn't work when width or height is zero"); | ||
return; | ||
} | ||
}, { | ||
key: "_rescale", | ||
value: function _rescale(factor) { | ||
this._scale = factor; | ||
var vp = this._viewportLoc; // NB(directxman12): If you set the width directly, or set the | ||
// style width to a number, the canvas is cleared. | ||
// However, if you set the style width to a string | ||
// ('NNNpx'), the canvas is scaled without clearing. | ||
var vp = this._viewportLoc; | ||
var targetAspectRatio = containerWidth / containerHeight; | ||
var fbAspectRatio = vp.w / vp.h; | ||
var width = factor * vp.w + 'px'; | ||
var height = factor * vp.h + 'px'; | ||
var scaleRatio = void 0; | ||
if (fbAspectRatio >= targetAspectRatio) { | ||
scaleRatio = containerWidth / vp.w; | ||
} else { | ||
scaleRatio = containerHeight / vp.h; | ||
} | ||
if (this._target.style.width !== width || this._target.style.height !== height) { | ||
this._target.style.width = width; | ||
this._target.style.height = height; | ||
} | ||
} | ||
}, { | ||
key: "_setFillColor", | ||
value: function _setFillColor(color) { | ||
var newStyle = 'rgb(' + color[0] + ',' + color[1] + ',' + color[2] + ')'; | ||
this._rescale(scaleRatio); | ||
} | ||
if (newStyle !== this._prevDrawStyle) { | ||
this._drawCtx.fillStyle = newStyle; | ||
this._prevDrawStyle = newStyle; | ||
} | ||
} | ||
}, { | ||
key: "_renderQPush", | ||
value: function _renderQPush(action) { | ||
this._renderQ.push(action); | ||
// ===== PRIVATE METHODS ===== | ||
if (this._renderQ.length === 1) { | ||
// If this can be rendered immediately it will be, otherwise | ||
// the scanner will wait for the relevant event | ||
this._scanRenderQ(); | ||
} | ||
} | ||
}, { | ||
key: "_resumeRenderQ", | ||
value: function _resumeRenderQ() { | ||
// "this" is the object that is ready, not the | ||
// display object | ||
this.removeEventListener('load', this._noVNCDisplay._resumeRenderQ); | ||
}, { | ||
key: '_rescale', | ||
value: function _rescale(factor) { | ||
this._scale = factor; | ||
var vp = this._viewportLoc; | ||
this._noVNCDisplay._scanRenderQ(); | ||
} | ||
}, { | ||
key: "_scanRenderQ", | ||
value: function _scanRenderQ() { | ||
var ready = true; | ||
// NB(directxman12): If you set the width directly, or set the | ||
// style width to a number, the canvas is cleared. | ||
// However, if you set the style width to a string | ||
// ('NNNpx'), the canvas is scaled without clearing. | ||
var width = factor * vp.w + 'px'; | ||
var height = factor * vp.h + 'px'; | ||
while (ready && this._renderQ.length > 0) { | ||
var a = this._renderQ[0]; | ||
if (this._target.style.width !== width || this._target.style.height !== height) { | ||
this._target.style.width = width; | ||
this._target.style.height = height; | ||
} | ||
} | ||
}, { | ||
key: '_setFillColor', | ||
value: function _setFillColor(color) { | ||
var newStyle = 'rgb(' + color[2] + ',' + color[1] + ',' + color[0] + ')'; | ||
if (newStyle !== this._prevDrawStyle) { | ||
this._drawCtx.fillStyle = newStyle; | ||
this._prevDrawStyle = newStyle; | ||
} | ||
} | ||
}, { | ||
key: '_rgbImageData', | ||
value: function _rgbImageData(x, y, width, height, arr, offset) { | ||
var img = this._drawCtx.createImageData(width, height); | ||
var data = img.data; | ||
for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 3) { | ||
data[i] = arr[j]; | ||
data[i + 1] = arr[j + 1]; | ||
data[i + 2] = arr[j + 2]; | ||
data[i + 3] = 255; // Alpha | ||
} | ||
this._drawCtx.putImageData(img, x, y); | ||
this._damage(x, y, img.width, img.height); | ||
} | ||
}, { | ||
key: '_bgrxImageData', | ||
value: function _bgrxImageData(x, y, width, height, arr, offset) { | ||
var img = this._drawCtx.createImageData(width, height); | ||
var data = img.data; | ||
for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 4) { | ||
data[i] = arr[j + 2]; | ||
data[i + 1] = arr[j + 1]; | ||
data[i + 2] = arr[j]; | ||
data[i + 3] = 255; // Alpha | ||
} | ||
this._drawCtx.putImageData(img, x, y); | ||
this._damage(x, y, img.width, img.height); | ||
} | ||
}, { | ||
key: '_rgbxImageData', | ||
value: function _rgbxImageData(x, y, width, height, arr, offset) { | ||
// NB(directxman12): arr must be an Type Array view | ||
var img = void 0; | ||
if (_browser.supportsImageMetadata) { | ||
img = new ImageData(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4), width, height); | ||
switch (a.type) { | ||
case 'flip': | ||
this.flip(true); | ||
break; | ||
case 'copy': | ||
this.copyImage(a.oldX, a.oldY, a.x, a.y, a.width, a.height, true); | ||
break; | ||
case 'fill': | ||
this.fillRect(a.x, a.y, a.width, a.height, a.color, true); | ||
break; | ||
case 'blit': | ||
this.blitImage(a.x, a.y, a.width, a.height, a.data, 0, true); | ||
break; | ||
case 'img': | ||
if (a.img.complete) { | ||
if (a.img.width !== a.width || a.img.height !== a.height) { | ||
Log.Error("Decoded image has incorrect dimensions. Got " + a.img.width + "x" + a.img.height + ". Expected " + a.width + "x" + a.height + "."); | ||
return; | ||
} | ||
this.drawImage(a.img, a.x, a.y); | ||
} else { | ||
img = this._drawCtx.createImageData(width, height); | ||
img.data.set(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4)); | ||
} | ||
this._drawCtx.putImageData(img, x, y); | ||
this._damage(x, y, img.width, img.height); | ||
} | ||
}, { | ||
key: '_renderQ_push', | ||
value: function _renderQ_push(action) { | ||
this._renderQ.push(action); | ||
if (this._renderQ.length === 1) { | ||
// If this can be rendered immediately it will be, otherwise | ||
// the scanner will wait for the relevant event | ||
this._scan_renderQ(); | ||
} | ||
} | ||
}, { | ||
key: '_resume_renderQ', | ||
value: function _resume_renderQ() { | ||
// "this" is the object that is ready, not the | ||
// display object | ||
this.removeEventListener('load', this._noVNC_display._resume_renderQ); | ||
this._noVNC_display._scan_renderQ(); | ||
} | ||
}, { | ||
key: '_scan_renderQ', | ||
value: function _scan_renderQ() { | ||
var ready = true; | ||
while (ready && this._renderQ.length > 0) { | ||
var a = this._renderQ[0]; | ||
switch (a.type) { | ||
case 'flip': | ||
this.flip(true); | ||
break; | ||
case 'copy': | ||
this.copyImage(a.old_x, a.old_y, a.x, a.y, a.width, a.height, true); | ||
break; | ||
case 'fill': | ||
this.fillRect(a.x, a.y, a.width, a.height, a.color, true); | ||
break; | ||
case 'blit': | ||
this.blitImage(a.x, a.y, a.width, a.height, a.data, 0, true); | ||
break; | ||
case 'blitRgb': | ||
this.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0, true); | ||
break; | ||
case 'blitRgbx': | ||
this.blitRgbxImage(a.x, a.y, a.width, a.height, a.data, 0, true); | ||
break; | ||
case 'img': | ||
if (a.img.complete) { | ||
this.drawImage(a.img, a.x, a.y); | ||
} else { | ||
a.img._noVNC_display = this; | ||
a.img.addEventListener('load', this._resume_renderQ); | ||
// We need to wait for this image to 'load' | ||
// to keep things in-order | ||
ready = false; | ||
} | ||
break; | ||
} | ||
a.img._noVNCDisplay = this; | ||
a.img.addEventListener('load', this._resumeRenderQ); // We need to wait for this image to 'load' | ||
// to keep things in-order | ||
if (ready) { | ||
this._renderQ.shift(); | ||
} | ||
ready = false; | ||
} | ||
if (this._renderQ.length === 0 && this._flushing) { | ||
this._flushing = false; | ||
this.onflush(); | ||
} | ||
break; | ||
} | ||
}, { | ||
key: 'scale', | ||
get: function get() { | ||
return this._scale; | ||
}, | ||
set: function set(scale) { | ||
this._rescale(scale); | ||
if (ready) { | ||
this._renderQ.shift(); | ||
} | ||
}, { | ||
key: 'clipViewport', | ||
get: function get() { | ||
return this._clipViewport; | ||
}, | ||
set: function set(viewport) { | ||
this._clipViewport = viewport; | ||
// May need to readjust the viewport dimensions | ||
var vp = this._viewportLoc; | ||
this.viewportChangeSize(vp.w, vp.h); | ||
this.viewportChangePos(0, 0); | ||
} | ||
}, { | ||
key: 'width', | ||
get: function get() { | ||
return this._fb_width; | ||
} | ||
}, { | ||
key: 'height', | ||
get: function get() { | ||
return this._fb_height; | ||
} | ||
}]); | ||
} | ||
return Display; | ||
if (this._renderQ.length === 0 && this._flushing) { | ||
this._flushing = false; | ||
this.onflush(); | ||
} | ||
} | ||
}]); | ||
return Display; | ||
}(); | ||
exports.default = Display; | ||
exports["default"] = Display; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports.encodingName = encodingName; | ||
exports.encodings = void 0; | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -14,42 +16,50 @@ * | ||
*/ | ||
var encodings = { | ||
encodingRaw: 0, | ||
encodingCopyRect: 1, | ||
encodingRRE: 2, | ||
encodingHextile: 5, | ||
encodingTight: 7, | ||
encodingTightPNG: -260, | ||
pseudoEncodingQualityLevel9: -23, | ||
pseudoEncodingQualityLevel0: -32, | ||
pseudoEncodingDesktopSize: -223, | ||
pseudoEncodingLastRect: -224, | ||
pseudoEncodingCursor: -239, | ||
pseudoEncodingQEMUExtendedKeyEvent: -258, | ||
pseudoEncodingDesktopName: -307, | ||
pseudoEncodingExtendedDesktopSize: -308, | ||
pseudoEncodingXvp: -309, | ||
pseudoEncodingFence: -312, | ||
pseudoEncodingContinuousUpdates: -313, | ||
pseudoEncodingCompressLevel9: -247, | ||
pseudoEncodingCompressLevel0: -256, | ||
pseudoEncodingVMwareCursor: 0x574d5664, | ||
pseudoEncodingExtendedClipboard: 0xc0a1e5ce | ||
}; | ||
exports.encodings = encodings; | ||
var encodings = exports.encodings = { | ||
encodingRaw: 0, | ||
encodingCopyRect: 1, | ||
encodingRRE: 2, | ||
encodingHextile: 5, | ||
encodingTight: 7, | ||
encodingTightPNG: -260, | ||
function encodingName(num) { | ||
switch (num) { | ||
case encodings.encodingRaw: | ||
return "Raw"; | ||
pseudoEncodingQualityLevel9: -23, | ||
pseudoEncodingQualityLevel0: -32, | ||
pseudoEncodingDesktopSize: -223, | ||
pseudoEncodingLastRect: -224, | ||
pseudoEncodingCursor: -239, | ||
pseudoEncodingQEMUExtendedKeyEvent: -258, | ||
pseudoEncodingExtendedDesktopSize: -308, | ||
pseudoEncodingXvp: -309, | ||
pseudoEncodingFence: -312, | ||
pseudoEncodingContinuousUpdates: -313, | ||
pseudoEncodingCompressLevel9: -247, | ||
pseudoEncodingCompressLevel0: -256 | ||
}; | ||
case encodings.encodingCopyRect: | ||
return "CopyRect"; | ||
function encodingName(num) { | ||
switch (num) { | ||
case encodings.encodingRaw: | ||
return "Raw"; | ||
case encodings.encodingCopyRect: | ||
return "CopyRect"; | ||
case encodings.encodingRRE: | ||
return "RRE"; | ||
case encodings.encodingHextile: | ||
return "Hextile"; | ||
case encodings.encodingTight: | ||
return "Tight"; | ||
case encodings.encodingTightPNG: | ||
return "TightPNG"; | ||
default: | ||
return "[unknown encoding " + num + "]"; | ||
} | ||
case encodings.encodingRRE: | ||
return "RRE"; | ||
case encodings.encodingHextile: | ||
return "Hextile"; | ||
case encodings.encodingTight: | ||
return "Tight"; | ||
case encodings.encodingTightPNG: | ||
return "TightPNG"; | ||
default: | ||
return "[unknown encoding " + num + "]"; | ||
} | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
var _inflate2 = require("../lib/vendor/pako/lib/zlib/inflate.js"); | ||
var _zstream = require("../lib/vendor/pako/lib/zlib/zstream.js"); | ||
var _zstream = _interopRequireDefault(require("../lib/vendor/pako/lib/zlib/zstream.js")); | ||
var _zstream2 = _interopRequireDefault(_zstream); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var Inflate = function () { | ||
function Inflate() { | ||
_classCallCheck(this, Inflate); | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
this.strm = new _zstream2.default(); | ||
this.chunkSize = 1024 * 10 * 10; | ||
this.strm.output = new Uint8Array(this.chunkSize); | ||
this.windowBits = 5; | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
(0, _inflate2.inflateInit)(this.strm, this.windowBits); | ||
var Inflate = /*#__PURE__*/function () { | ||
function Inflate() { | ||
_classCallCheck(this, Inflate); | ||
this.strm = new _zstream["default"](); | ||
this.chunkSize = 1024 * 10 * 10; | ||
this.strm.output = new Uint8Array(this.chunkSize); | ||
this.windowBits = 5; | ||
(0, _inflate2.inflateInit)(this.strm, this.windowBits); | ||
} | ||
_createClass(Inflate, [{ | ||
key: "setInput", | ||
value: function setInput(data) { | ||
if (!data) { | ||
//FIXME: flush remaining data. | ||
/* eslint-disable camelcase */ | ||
this.strm.input = null; | ||
this.strm.avail_in = 0; | ||
this.strm.next_in = 0; | ||
} else { | ||
this.strm.input = data; | ||
this.strm.avail_in = this.strm.input.length; | ||
this.strm.next_in = 0; | ||
/* eslint-enable camelcase */ | ||
} | ||
} | ||
}, { | ||
key: "inflate", | ||
value: function inflate(expected) { | ||
// resize our output buffer if it's too small | ||
// (we could just use multiple chunks, but that would cause an extra | ||
// allocation each time to flatten the chunks) | ||
if (expected > this.chunkSize) { | ||
this.chunkSize = expected; | ||
this.strm.output = new Uint8Array(this.chunkSize); | ||
} | ||
/* eslint-disable camelcase */ | ||
_createClass(Inflate, [{ | ||
key: "inflate", | ||
value: function inflate(data, flush, expected) { | ||
this.strm.input = data; | ||
this.strm.avail_in = this.strm.input.length; | ||
this.strm.next_in = 0; | ||
this.strm.next_out = 0; | ||
// resize our output buffer if it's too small | ||
// (we could just use multiple chunks, but that would cause an extra | ||
// allocation each time to flatten the chunks) | ||
if (expected > this.chunkSize) { | ||
this.chunkSize = expected; | ||
this.strm.output = new Uint8Array(this.chunkSize); | ||
} | ||
this.strm.next_out = 0; | ||
this.strm.avail_out = expected; | ||
/* eslint-enable camelcase */ | ||
this.strm.avail_out = this.chunkSize; | ||
var ret = (0, _inflate2.inflate)(this.strm, 0); // Flush argument not used. | ||
(0, _inflate2.inflate)(this.strm, flush); | ||
if (ret < 0) { | ||
throw new Error("zlib inflate failed"); | ||
} | ||
return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); | ||
} | ||
}, { | ||
key: "reset", | ||
value: function reset() { | ||
(0, _inflate2.inflateReset)(this.strm); | ||
} | ||
}]); | ||
if (this.strm.next_out != expected) { | ||
throw new Error("Incomplete zlib block"); | ||
} | ||
return Inflate; | ||
return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); | ||
} | ||
}, { | ||
key: "reset", | ||
value: function reset() { | ||
(0, _inflate2.inflateReset)(this.strm); | ||
} | ||
}]); | ||
return Inflate; | ||
}(); | ||
exports.default = Inflate; | ||
exports["default"] = Inflate; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _keysym = require("./keysym.js"); | ||
var _keysym = _interopRequireDefault(require("./keysym.js")); | ||
var _keysym2 = _interopRequireDefault(_keysym); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||
*/ | ||
@@ -19,217 +24,194 @@ /* | ||
*/ | ||
var DOMKeyTable = {}; | ||
var DOMKeyTable = {}; /* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||
*/ | ||
function addStandard(key, standard) { | ||
if (standard === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\""); | ||
DOMKeyTable[key] = [standard, standard, standard, standard]; | ||
if (standard === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\""); | ||
DOMKeyTable[key] = [standard, standard, standard, standard]; | ||
} | ||
function addLeftRight(key, left, right) { | ||
if (left === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (right === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\""); | ||
DOMKeyTable[key] = [left, left, right, left]; | ||
if (left === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (right === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\""); | ||
DOMKeyTable[key] = [left, left, right, left]; | ||
} | ||
function addNumpad(key, standard, numpad) { | ||
if (standard === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (numpad === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\""); | ||
DOMKeyTable[key] = [standard, standard, standard, numpad]; | ||
} | ||
if (standard === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (numpad === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | ||
if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\""); | ||
DOMKeyTable[key] = [standard, standard, standard, numpad]; | ||
} // 3.2. Modifier Keys | ||
// 2.2. Modifier Keys | ||
addLeftRight("Alt", _keysym2.default.XK_Alt_L, _keysym2.default.XK_Alt_R); | ||
addStandard("AltGraph", _keysym2.default.XK_ISO_Level3_Shift); | ||
addStandard("CapsLock", _keysym2.default.XK_Caps_Lock); | ||
addLeftRight("Control", _keysym2.default.XK_Control_L, _keysym2.default.XK_Control_R); | ||
// - Fn | ||
addLeftRight("Alt", _keysym["default"].XK_Alt_L, _keysym["default"].XK_Alt_R); | ||
addStandard("AltGraph", _keysym["default"].XK_ISO_Level3_Shift); | ||
addStandard("CapsLock", _keysym["default"].XK_Caps_Lock); | ||
addLeftRight("Control", _keysym["default"].XK_Control_L, _keysym["default"].XK_Control_R); // - Fn | ||
// - FnLock | ||
addLeftRight("Hyper", _keysym2.default.XK_Super_L, _keysym2.default.XK_Super_R); | ||
addLeftRight("Meta", _keysym2.default.XK_Super_L, _keysym2.default.XK_Super_R); | ||
addStandard("NumLock", _keysym2.default.XK_Num_Lock); | ||
addStandard("ScrollLock", _keysym2.default.XK_Scroll_Lock); | ||
addLeftRight("Shift", _keysym2.default.XK_Shift_L, _keysym2.default.XK_Shift_R); | ||
addLeftRight("Super", _keysym2.default.XK_Super_L, _keysym2.default.XK_Super_R); | ||
// - Symbol | ||
addLeftRight("Meta", _keysym["default"].XK_Super_L, _keysym["default"].XK_Super_R); | ||
addStandard("NumLock", _keysym["default"].XK_Num_Lock); | ||
addStandard("ScrollLock", _keysym["default"].XK_Scroll_Lock); | ||
addLeftRight("Shift", _keysym["default"].XK_Shift_L, _keysym["default"].XK_Shift_R); // - Symbol | ||
// - SymbolLock | ||
// - Hyper | ||
// - Super | ||
// 3.3. Whitespace Keys | ||
// 2.3. Whitespace Keys | ||
addNumpad("Enter", _keysym["default"].XK_Return, _keysym["default"].XK_KP_Enter); | ||
addStandard("Tab", _keysym["default"].XK_Tab); | ||
addNumpad(" ", _keysym["default"].XK_space, _keysym["default"].XK_KP_Space); // 3.4. Navigation Keys | ||
addNumpad("Enter", _keysym2.default.XK_Return, _keysym2.default.XK_KP_Enter); | ||
addStandard("Tab", _keysym2.default.XK_Tab); | ||
addNumpad(" ", _keysym2.default.XK_space, _keysym2.default.XK_KP_Space); | ||
addNumpad("ArrowDown", _keysym["default"].XK_Down, _keysym["default"].XK_KP_Down); | ||
addNumpad("ArrowLeft", _keysym["default"].XK_Left, _keysym["default"].XK_KP_Left); | ||
addNumpad("ArrowRight", _keysym["default"].XK_Right, _keysym["default"].XK_KP_Right); | ||
addNumpad("ArrowUp", _keysym["default"].XK_Up, _keysym["default"].XK_KP_Up); | ||
addNumpad("End", _keysym["default"].XK_End, _keysym["default"].XK_KP_End); | ||
addNumpad("Home", _keysym["default"].XK_Home, _keysym["default"].XK_KP_Home); | ||
addNumpad("PageDown", _keysym["default"].XK_Next, _keysym["default"].XK_KP_Next); | ||
addNumpad("PageUp", _keysym["default"].XK_Prior, _keysym["default"].XK_KP_Prior); // 3.5. Editing Keys | ||
// 2.4. Navigation Keys | ||
addStandard("Backspace", _keysym["default"].XK_BackSpace); // Browsers send "Clear" for the numpad 5 without NumLock because | ||
// Windows uses VK_Clear for that key. But Unix expects KP_Begin for | ||
// that scenario. | ||
addNumpad("ArrowDown", _keysym2.default.XK_Down, _keysym2.default.XK_KP_Down); | ||
addNumpad("ArrowUp", _keysym2.default.XK_Up, _keysym2.default.XK_KP_Up); | ||
addNumpad("ArrowLeft", _keysym2.default.XK_Left, _keysym2.default.XK_KP_Left); | ||
addNumpad("ArrowRight", _keysym2.default.XK_Right, _keysym2.default.XK_KP_Right); | ||
addNumpad("End", _keysym2.default.XK_End, _keysym2.default.XK_KP_End); | ||
addNumpad("Home", _keysym2.default.XK_Home, _keysym2.default.XK_KP_Home); | ||
addNumpad("PageDown", _keysym2.default.XK_Next, _keysym2.default.XK_KP_Next); | ||
addNumpad("PageUp", _keysym2.default.XK_Prior, _keysym2.default.XK_KP_Prior); | ||
addNumpad("Clear", _keysym["default"].XK_Clear, _keysym["default"].XK_KP_Begin); | ||
addStandard("Copy", _keysym["default"].XF86XK_Copy); // - CrSel | ||
// 2.5. Editing Keys | ||
addStandard("Backspace", _keysym2.default.XK_BackSpace); | ||
addNumpad("Clear", _keysym2.default.XK_Clear, _keysym2.default.XK_KP_Begin); | ||
addStandard("Copy", _keysym2.default.XF86XK_Copy); | ||
// - CrSel | ||
addStandard("Cut", _keysym2.default.XF86XK_Cut); | ||
addNumpad("Delete", _keysym2.default.XK_Delete, _keysym2.default.XK_KP_Delete); | ||
// - EraseEof | ||
addStandard("Cut", _keysym["default"].XF86XK_Cut); | ||
addNumpad("Delete", _keysym["default"].XK_Delete, _keysym["default"].XK_KP_Delete); // - EraseEof | ||
// - ExSel | ||
addNumpad("Insert", _keysym2.default.XK_Insert, _keysym2.default.XK_KP_Insert); | ||
addStandard("Paste", _keysym2.default.XF86XK_Paste); | ||
addStandard("Redo", _keysym2.default.XK_Redo); | ||
addStandard("Undo", _keysym2.default.XK_Undo); | ||
// 2.6. UI Keys | ||
addNumpad("Insert", _keysym["default"].XK_Insert, _keysym["default"].XK_KP_Insert); | ||
addStandard("Paste", _keysym["default"].XF86XK_Paste); | ||
addStandard("Redo", _keysym["default"].XK_Redo); | ||
addStandard("Undo", _keysym["default"].XK_Undo); // 3.6. UI Keys | ||
// - Accept | ||
// - Again (could just be XK_Redo) | ||
// - Attn | ||
addStandard("Cancel", _keysym2.default.XK_Cancel); | ||
addStandard("ContextMenu", _keysym2.default.XK_Menu); | ||
addStandard("Escape", _keysym2.default.XK_Escape); | ||
addStandard("Execute", _keysym2.default.XK_Execute); | ||
addStandard("Find", _keysym2.default.XK_Find); | ||
addStandard("Help", _keysym2.default.XK_Help); | ||
addStandard("Pause", _keysym2.default.XK_Pause); | ||
// - Play | ||
addStandard("Cancel", _keysym["default"].XK_Cancel); | ||
addStandard("ContextMenu", _keysym["default"].XK_Menu); | ||
addStandard("Escape", _keysym["default"].XK_Escape); | ||
addStandard("Execute", _keysym["default"].XK_Execute); | ||
addStandard("Find", _keysym["default"].XK_Find); | ||
addStandard("Help", _keysym["default"].XK_Help); | ||
addStandard("Pause", _keysym["default"].XK_Pause); // - Play | ||
// - Props | ||
addStandard("Select", _keysym2.default.XK_Select); | ||
addStandard("ZoomIn", _keysym2.default.XF86XK_ZoomIn); | ||
addStandard("ZoomOut", _keysym2.default.XF86XK_ZoomOut); | ||
// 2.7. Device Keys | ||
addStandard("Select", _keysym["default"].XK_Select); | ||
addStandard("ZoomIn", _keysym["default"].XF86XK_ZoomIn); | ||
addStandard("ZoomOut", _keysym["default"].XF86XK_ZoomOut); // 3.7. Device Keys | ||
addStandard("BrightnessDown", _keysym2.default.XF86XK_MonBrightnessDown); | ||
addStandard("BrightnessUp", _keysym2.default.XF86XK_MonBrightnessUp); | ||
addStandard("Eject", _keysym2.default.XF86XK_Eject); | ||
addStandard("LogOff", _keysym2.default.XF86XK_LogOff); | ||
addStandard("Power", _keysym2.default.XF86XK_PowerOff); | ||
addStandard("PowerOff", _keysym2.default.XF86XK_PowerDown); | ||
addStandard("PrintScreen", _keysym2.default.XK_Print); | ||
addStandard("Hibernate", _keysym2.default.XF86XK_Hibernate); | ||
addStandard("Standby", _keysym2.default.XF86XK_Standby); | ||
addStandard("WakeUp", _keysym2.default.XF86XK_WakeUp); | ||
addStandard("BrightnessDown", _keysym["default"].XF86XK_MonBrightnessDown); | ||
addStandard("BrightnessUp", _keysym["default"].XF86XK_MonBrightnessUp); | ||
addStandard("Eject", _keysym["default"].XF86XK_Eject); | ||
addStandard("LogOff", _keysym["default"].XF86XK_LogOff); | ||
addStandard("Power", _keysym["default"].XF86XK_PowerOff); | ||
addStandard("PowerOff", _keysym["default"].XF86XK_PowerDown); | ||
addStandard("PrintScreen", _keysym["default"].XK_Print); | ||
addStandard("Hibernate", _keysym["default"].XF86XK_Hibernate); | ||
addStandard("Standby", _keysym["default"].XF86XK_Standby); | ||
addStandard("WakeUp", _keysym["default"].XF86XK_WakeUp); // 3.8. IME and Composition Keys | ||
// 2.8. IME and Composition Keys | ||
addStandard("AllCandidates", _keysym["default"].XK_MultipleCandidate); | ||
addStandard("Alphanumeric", _keysym["default"].XK_Eisu_toggle); | ||
addStandard("CodeInput", _keysym["default"].XK_Codeinput); | ||
addStandard("Compose", _keysym["default"].XK_Multi_key); | ||
addStandard("Convert", _keysym["default"].XK_Henkan); // - Dead | ||
// - FinalMode | ||
addStandard("AllCandidates", _keysym2.default.XK_MultipleCandidate); | ||
addStandard("Alphanumeric", _keysym2.default.XK_Eisu_Shift); // could also be _Eisu_Toggle | ||
addStandard("CodeInput", _keysym2.default.XK_Codeinput); | ||
addStandard("Compose", _keysym2.default.XK_Multi_key); | ||
addStandard("Convert", _keysym2.default.XK_Henkan); | ||
// - Dead | ||
// - FinalMode | ||
addStandard("GroupFirst", _keysym2.default.XK_ISO_First_Group); | ||
addStandard("GroupLast", _keysym2.default.XK_ISO_Last_Group); | ||
addStandard("GroupNext", _keysym2.default.XK_ISO_Next_Group); | ||
addStandard("GroupPrevious", _keysym2.default.XK_ISO_Prev_Group); | ||
// - ModeChange (XK_Mode_switch is often used for AltGr) | ||
addStandard("GroupFirst", _keysym["default"].XK_ISO_First_Group); | ||
addStandard("GroupLast", _keysym["default"].XK_ISO_Last_Group); | ||
addStandard("GroupNext", _keysym["default"].XK_ISO_Next_Group); | ||
addStandard("GroupPrevious", _keysym["default"].XK_ISO_Prev_Group); // - ModeChange (XK_Mode_switch is often used for AltGr) | ||
// - NextCandidate | ||
addStandard("NonConvert", _keysym2.default.XK_Muhenkan); | ||
addStandard("PreviousCandidate", _keysym2.default.XK_PreviousCandidate); | ||
// - Process | ||
addStandard("SingleCandidate", _keysym2.default.XK_SingleCandidate); | ||
addStandard("HangulMode", _keysym2.default.XK_Hangul); | ||
addStandard("HanjaMode", _keysym2.default.XK_Hangul_Hanja); | ||
addStandard("JunjuaMode", _keysym2.default.XK_Hangul_Jeonja); | ||
addStandard("Eisu", _keysym2.default.XK_Eisu_toggle); | ||
addStandard("Hankaku", _keysym2.default.XK_Hankaku); | ||
addStandard("Hiragana", _keysym2.default.XK_Hiragana); | ||
addStandard("HiraganaKatakana", _keysym2.default.XK_Hiragana_Katakana); | ||
addStandard("KanaMode", _keysym2.default.XK_Kana_Shift); // could also be _Kana_Lock | ||
addStandard("KanjiMode", _keysym2.default.XK_Kanji); | ||
addStandard("Katakana", _keysym2.default.XK_Katakana); | ||
addStandard("Romaji", _keysym2.default.XK_Romaji); | ||
addStandard("Zenkaku", _keysym2.default.XK_Zenkaku); | ||
addStandard("ZenkakuHanaku", _keysym2.default.XK_Zenkaku_Hankaku); | ||
// 2.9. General-Purpose Function Keys | ||
addStandard("NonConvert", _keysym["default"].XK_Muhenkan); | ||
addStandard("PreviousCandidate", _keysym["default"].XK_PreviousCandidate); // - Process | ||
addStandard("F1", _keysym2.default.XK_F1); | ||
addStandard("F2", _keysym2.default.XK_F2); | ||
addStandard("F3", _keysym2.default.XK_F3); | ||
addStandard("F4", _keysym2.default.XK_F4); | ||
addStandard("F5", _keysym2.default.XK_F5); | ||
addStandard("F6", _keysym2.default.XK_F6); | ||
addStandard("F7", _keysym2.default.XK_F7); | ||
addStandard("F8", _keysym2.default.XK_F8); | ||
addStandard("F9", _keysym2.default.XK_F9); | ||
addStandard("F10", _keysym2.default.XK_F10); | ||
addStandard("F11", _keysym2.default.XK_F11); | ||
addStandard("F12", _keysym2.default.XK_F12); | ||
addStandard("F13", _keysym2.default.XK_F13); | ||
addStandard("F14", _keysym2.default.XK_F14); | ||
addStandard("F15", _keysym2.default.XK_F15); | ||
addStandard("F16", _keysym2.default.XK_F16); | ||
addStandard("F17", _keysym2.default.XK_F17); | ||
addStandard("F18", _keysym2.default.XK_F18); | ||
addStandard("F19", _keysym2.default.XK_F19); | ||
addStandard("F20", _keysym2.default.XK_F20); | ||
addStandard("F21", _keysym2.default.XK_F21); | ||
addStandard("F22", _keysym2.default.XK_F22); | ||
addStandard("F23", _keysym2.default.XK_F23); | ||
addStandard("F24", _keysym2.default.XK_F24); | ||
addStandard("F25", _keysym2.default.XK_F25); | ||
addStandard("F26", _keysym2.default.XK_F26); | ||
addStandard("F27", _keysym2.default.XK_F27); | ||
addStandard("F28", _keysym2.default.XK_F28); | ||
addStandard("F29", _keysym2.default.XK_F29); | ||
addStandard("F30", _keysym2.default.XK_F30); | ||
addStandard("F31", _keysym2.default.XK_F31); | ||
addStandard("F32", _keysym2.default.XK_F32); | ||
addStandard("F33", _keysym2.default.XK_F33); | ||
addStandard("F34", _keysym2.default.XK_F34); | ||
addStandard("F35", _keysym2.default.XK_F35); | ||
// - Soft1... | ||
addStandard("SingleCandidate", _keysym["default"].XK_SingleCandidate); | ||
addStandard("HangulMode", _keysym["default"].XK_Hangul); | ||
addStandard("HanjaMode", _keysym["default"].XK_Hangul_Hanja); | ||
addStandard("JunjaMode", _keysym["default"].XK_Hangul_Jeonja); | ||
addStandard("Eisu", _keysym["default"].XK_Eisu_toggle); | ||
addStandard("Hankaku", _keysym["default"].XK_Hankaku); | ||
addStandard("Hiragana", _keysym["default"].XK_Hiragana); | ||
addStandard("HiraganaKatakana", _keysym["default"].XK_Hiragana_Katakana); | ||
addStandard("KanaMode", _keysym["default"].XK_Kana_Shift); // could also be _Kana_Lock | ||
// 2.10. Multimedia Keys | ||
addStandard("KanjiMode", _keysym["default"].XK_Kanji); | ||
addStandard("Katakana", _keysym["default"].XK_Katakana); | ||
addStandard("Romaji", _keysym["default"].XK_Romaji); | ||
addStandard("Zenkaku", _keysym["default"].XK_Zenkaku); | ||
addStandard("ZenkakuHankaku", _keysym["default"].XK_Zenkaku_Hankaku); // 3.9. General-Purpose Function Keys | ||
addStandard("F1", _keysym["default"].XK_F1); | ||
addStandard("F2", _keysym["default"].XK_F2); | ||
addStandard("F3", _keysym["default"].XK_F3); | ||
addStandard("F4", _keysym["default"].XK_F4); | ||
addStandard("F5", _keysym["default"].XK_F5); | ||
addStandard("F6", _keysym["default"].XK_F6); | ||
addStandard("F7", _keysym["default"].XK_F7); | ||
addStandard("F8", _keysym["default"].XK_F8); | ||
addStandard("F9", _keysym["default"].XK_F9); | ||
addStandard("F10", _keysym["default"].XK_F10); | ||
addStandard("F11", _keysym["default"].XK_F11); | ||
addStandard("F12", _keysym["default"].XK_F12); | ||
addStandard("F13", _keysym["default"].XK_F13); | ||
addStandard("F14", _keysym["default"].XK_F14); | ||
addStandard("F15", _keysym["default"].XK_F15); | ||
addStandard("F16", _keysym["default"].XK_F16); | ||
addStandard("F17", _keysym["default"].XK_F17); | ||
addStandard("F18", _keysym["default"].XK_F18); | ||
addStandard("F19", _keysym["default"].XK_F19); | ||
addStandard("F20", _keysym["default"].XK_F20); | ||
addStandard("F21", _keysym["default"].XK_F21); | ||
addStandard("F22", _keysym["default"].XK_F22); | ||
addStandard("F23", _keysym["default"].XK_F23); | ||
addStandard("F24", _keysym["default"].XK_F24); | ||
addStandard("F25", _keysym["default"].XK_F25); | ||
addStandard("F26", _keysym["default"].XK_F26); | ||
addStandard("F27", _keysym["default"].XK_F27); | ||
addStandard("F28", _keysym["default"].XK_F28); | ||
addStandard("F29", _keysym["default"].XK_F29); | ||
addStandard("F30", _keysym["default"].XK_F30); | ||
addStandard("F31", _keysym["default"].XK_F31); | ||
addStandard("F32", _keysym["default"].XK_F32); | ||
addStandard("F33", _keysym["default"].XK_F33); | ||
addStandard("F34", _keysym["default"].XK_F34); | ||
addStandard("F35", _keysym["default"].XK_F35); // - Soft1... | ||
// 3.10. Multimedia Keys | ||
// - ChannelDown | ||
// - ChannelUp | ||
addStandard("Close", _keysym2.default.XF86XK_Close); | ||
addStandard("MailForward", _keysym2.default.XF86XK_MailForward); | ||
addStandard("MailReply", _keysym2.default.XF86XK_Reply); | ||
addStandard("MainSend", _keysym2.default.XF86XK_Send); | ||
addStandard("MediaFastForward", _keysym2.default.XF86XK_AudioForward); | ||
addStandard("MediaPause", _keysym2.default.XF86XK_AudioPause); | ||
addStandard("MediaPlay", _keysym2.default.XF86XK_AudioPlay); | ||
addStandard("MediaRecord", _keysym2.default.XF86XK_AudioRecord); | ||
addStandard("MediaRewind", _keysym2.default.XF86XK_AudioRewind); | ||
addStandard("MediaStop", _keysym2.default.XF86XK_AudioStop); | ||
addStandard("MediaTrackNext", _keysym2.default.XF86XK_AudioNext); | ||
addStandard("MediaTrackPrevious", _keysym2.default.XF86XK_AudioPrev); | ||
addStandard("New", _keysym2.default.XF86XK_New); | ||
addStandard("Open", _keysym2.default.XF86XK_Open); | ||
addStandard("Print", _keysym2.default.XK_Print); | ||
addStandard("Save", _keysym2.default.XF86XK_Save); | ||
addStandard("SpellCheck", _keysym2.default.XF86XK_Spell); | ||
// 2.11. Multimedia Numpad Keys | ||
addStandard("Close", _keysym["default"].XF86XK_Close); | ||
addStandard("MailForward", _keysym["default"].XF86XK_MailForward); | ||
addStandard("MailReply", _keysym["default"].XF86XK_Reply); | ||
addStandard("MailSend", _keysym["default"].XF86XK_Send); // - MediaClose | ||
addStandard("MediaFastForward", _keysym["default"].XF86XK_AudioForward); | ||
addStandard("MediaPause", _keysym["default"].XF86XK_AudioPause); | ||
addStandard("MediaPlay", _keysym["default"].XF86XK_AudioPlay); // - MediaPlayPause | ||
addStandard("MediaRecord", _keysym["default"].XF86XK_AudioRecord); | ||
addStandard("MediaRewind", _keysym["default"].XF86XK_AudioRewind); | ||
addStandard("MediaStop", _keysym["default"].XF86XK_AudioStop); | ||
addStandard("MediaTrackNext", _keysym["default"].XF86XK_AudioNext); | ||
addStandard("MediaTrackPrevious", _keysym["default"].XF86XK_AudioPrev); | ||
addStandard("New", _keysym["default"].XF86XK_New); | ||
addStandard("Open", _keysym["default"].XF86XK_Open); | ||
addStandard("Print", _keysym["default"].XK_Print); | ||
addStandard("Save", _keysym["default"].XF86XK_Save); | ||
addStandard("SpellCheck", _keysym["default"].XF86XK_Spell); // 3.11. Multimedia Numpad Keys | ||
// - Key11 | ||
// - Key12 | ||
// 2.12. Audio Keys | ||
// 3.12. Audio Keys | ||
// - AudioBalanceLeft | ||
// - AudioBalanceRight | ||
// - AudioBassDown | ||
// - AudioBassBoostDown | ||
// - AudioBassBoostToggle | ||
// - AudioBassBoostUp | ||
// - AudioBassUp | ||
// - AudioFaderFront | ||
@@ -240,78 +222,66 @@ // - AudioFaderRear | ||
// - AudioTrebleUp | ||
addStandard("AudioVolumeDown", _keysym2.default.XF86XK_AudioLowerVolume); | ||
addStandard("AudioVolumeUp", _keysym2.default.XF86XK_AudioRaiseVolume); | ||
addStandard("AudioVolumeMute", _keysym2.default.XF86XK_AudioMute); | ||
// - MicrophoneToggle | ||
addStandard("AudioVolumeDown", _keysym["default"].XF86XK_AudioLowerVolume); | ||
addStandard("AudioVolumeUp", _keysym["default"].XF86XK_AudioRaiseVolume); | ||
addStandard("AudioVolumeMute", _keysym["default"].XF86XK_AudioMute); // - MicrophoneToggle | ||
// - MicrophoneVolumeDown | ||
// - MicrophoneVolumeUp | ||
addStandard("MicrophoneVolumeMute", _keysym2.default.XF86XK_AudioMicMute); | ||
// 2.13. Speech Keys | ||
addStandard("MicrophoneVolumeMute", _keysym["default"].XF86XK_AudioMicMute); // 3.13. Speech Keys | ||
// - SpeechCorrectionList | ||
// - SpeechInputToggle | ||
// 3.14. Application Keys | ||
// 2.14. Application Keys | ||
addStandard("LaunchApplication1", _keysym["default"].XF86XK_MyComputer); | ||
addStandard("LaunchApplication2", _keysym["default"].XF86XK_Calculator); | ||
addStandard("LaunchCalendar", _keysym["default"].XF86XK_Calendar); // - LaunchContacts | ||
addStandard("LaunchCalculator", _keysym2.default.XF86XK_Calculator); | ||
addStandard("LaunchCalendar", _keysym2.default.XF86XK_Calendar); | ||
addStandard("LaunchMail", _keysym2.default.XF86XK_Mail); | ||
addStandard("LaunchMediaPlayer", _keysym2.default.XF86XK_AudioMedia); | ||
addStandard("LaunchMusicPlayer", _keysym2.default.XF86XK_Music); | ||
addStandard("LaunchMyComputer", _keysym2.default.XF86XK_MyComputer); | ||
addStandard("LaunchPhone", _keysym2.default.XF86XK_Phone); | ||
addStandard("LaunchScreenSaver", _keysym2.default.XF86XK_ScreenSaver); | ||
addStandard("LaunchSpreadsheet", _keysym2.default.XF86XK_Excel); | ||
addStandard("LaunchWebBrowser", _keysym2.default.XF86XK_WWW); | ||
addStandard("LaunchWebCam", _keysym2.default.XF86XK_WebCam); | ||
addStandard("LaunchWordProcessor", _keysym2.default.XF86XK_Word); | ||
addStandard("LaunchMail", _keysym["default"].XF86XK_Mail); | ||
addStandard("LaunchMediaPlayer", _keysym["default"].XF86XK_AudioMedia); | ||
addStandard("LaunchMusicPlayer", _keysym["default"].XF86XK_Music); | ||
addStandard("LaunchPhone", _keysym["default"].XF86XK_Phone); | ||
addStandard("LaunchScreenSaver", _keysym["default"].XF86XK_ScreenSaver); | ||
addStandard("LaunchSpreadsheet", _keysym["default"].XF86XK_Excel); | ||
addStandard("LaunchWebBrowser", _keysym["default"].XF86XK_WWW); | ||
addStandard("LaunchWebCam", _keysym["default"].XF86XK_WebCam); | ||
addStandard("LaunchWordProcessor", _keysym["default"].XF86XK_Word); // 3.15. Browser Keys | ||
// 2.15. Browser Keys | ||
addStandard("BrowserBack", _keysym2.default.XF86XK_Back); | ||
addStandard("BrowserFavorites", _keysym2.default.XF86XK_Favorites); | ||
addStandard("BrowserForward", _keysym2.default.XF86XK_Forward); | ||
addStandard("BrowserHome", _keysym2.default.XF86XK_HomePage); | ||
addStandard("BrowserRefresh", _keysym2.default.XF86XK_Refresh); | ||
addStandard("BrowserSearch", _keysym2.default.XF86XK_Search); | ||
addStandard("BrowserStop", _keysym2.default.XF86XK_Stop); | ||
// 2.16. Mobile Phone Keys | ||
addStandard("BrowserBack", _keysym["default"].XF86XK_Back); | ||
addStandard("BrowserFavorites", _keysym["default"].XF86XK_Favorites); | ||
addStandard("BrowserForward", _keysym["default"].XF86XK_Forward); | ||
addStandard("BrowserHome", _keysym["default"].XF86XK_HomePage); | ||
addStandard("BrowserRefresh", _keysym["default"].XF86XK_Refresh); | ||
addStandard("BrowserSearch", _keysym["default"].XF86XK_Search); | ||
addStandard("BrowserStop", _keysym["default"].XF86XK_Stop); // 3.16. Mobile Phone Keys | ||
// - A whole bunch... | ||
// 2.17. TV Keys | ||
// 3.17. TV Keys | ||
// - A whole bunch... | ||
// 2.18. Media Controller Keys | ||
// 3.18. Media Controller Keys | ||
// - A whole bunch... | ||
addStandard("Dimmer", _keysym2.default.XF86XK_BrightnessAdjust); | ||
addStandard("MediaAudioTrack", _keysym2.default.XF86XK_AudioCycleTrack); | ||
addStandard("RandomToggle", _keysym2.default.XF86XK_AudioRandomPlay); | ||
addStandard("SplitScreenToggle", _keysym2.default.XF86XK_SplitScreen); | ||
addStandard("Subtitle", _keysym2.default.XF86XK_Subtitle); | ||
addStandard("VideoModeNext", _keysym2.default.XF86XK_Next_VMode); | ||
// Extra: Numpad | ||
addStandard("Dimmer", _keysym["default"].XF86XK_BrightnessAdjust); | ||
addStandard("MediaAudioTrack", _keysym["default"].XF86XK_AudioCycleTrack); | ||
addStandard("RandomToggle", _keysym["default"].XF86XK_AudioRandomPlay); | ||
addStandard("SplitScreenToggle", _keysym["default"].XF86XK_SplitScreen); | ||
addStandard("Subtitle", _keysym["default"].XF86XK_Subtitle); | ||
addStandard("VideoModeNext", _keysym["default"].XF86XK_Next_VMode); // Extra: Numpad | ||
addNumpad("=", _keysym2.default.XK_equal, _keysym2.default.XK_KP_Equal); | ||
addNumpad("+", _keysym2.default.XK_plus, _keysym2.default.XK_KP_Add); | ||
addNumpad("-", _keysym2.default.XK_minus, _keysym2.default.XK_KP_Subtract); | ||
addNumpad("*", _keysym2.default.XK_asterisk, _keysym2.default.XK_KP_Multiply); | ||
addNumpad("/", _keysym2.default.XK_slash, _keysym2.default.XK_KP_Divide); | ||
addNumpad(".", _keysym2.default.XK_period, _keysym2.default.XK_KP_Decimal); | ||
addNumpad(",", _keysym2.default.XK_comma, _keysym2.default.XK_KP_Separator); | ||
addNumpad("0", _keysym2.default.XK_0, _keysym2.default.XK_KP_0); | ||
addNumpad("1", _keysym2.default.XK_1, _keysym2.default.XK_KP_1); | ||
addNumpad("2", _keysym2.default.XK_2, _keysym2.default.XK_KP_2); | ||
addNumpad("3", _keysym2.default.XK_3, _keysym2.default.XK_KP_3); | ||
addNumpad("4", _keysym2.default.XK_4, _keysym2.default.XK_KP_4); | ||
addNumpad("5", _keysym2.default.XK_5, _keysym2.default.XK_KP_5); | ||
addNumpad("6", _keysym2.default.XK_6, _keysym2.default.XK_KP_6); | ||
addNumpad("7", _keysym2.default.XK_7, _keysym2.default.XK_KP_7); | ||
addNumpad("8", _keysym2.default.XK_8, _keysym2.default.XK_KP_8); | ||
addNumpad("9", _keysym2.default.XK_9, _keysym2.default.XK_KP_9); | ||
exports.default = DOMKeyTable; | ||
addNumpad("=", _keysym["default"].XK_equal, _keysym["default"].XK_KP_Equal); | ||
addNumpad("+", _keysym["default"].XK_plus, _keysym["default"].XK_KP_Add); | ||
addNumpad("-", _keysym["default"].XK_minus, _keysym["default"].XK_KP_Subtract); | ||
addNumpad("*", _keysym["default"].XK_asterisk, _keysym["default"].XK_KP_Multiply); | ||
addNumpad("/", _keysym["default"].XK_slash, _keysym["default"].XK_KP_Divide); | ||
addNumpad(".", _keysym["default"].XK_period, _keysym["default"].XK_KP_Decimal); | ||
addNumpad(",", _keysym["default"].XK_comma, _keysym["default"].XK_KP_Separator); | ||
addNumpad("0", _keysym["default"].XK_0, _keysym["default"].XK_KP_0); | ||
addNumpad("1", _keysym["default"].XK_1, _keysym["default"].XK_KP_1); | ||
addNumpad("2", _keysym["default"].XK_2, _keysym["default"].XK_KP_2); | ||
addNumpad("3", _keysym["default"].XK_3, _keysym["default"].XK_KP_3); | ||
addNumpad("4", _keysym["default"].XK_4, _keysym["default"].XK_KP_4); | ||
addNumpad("5", _keysym["default"].XK_5, _keysym["default"].XK_KP_5); | ||
addNumpad("6", _keysym["default"].XK_6, _keysym["default"].XK_KP_6); | ||
addNumpad("7", _keysym["default"].XK_7, _keysym["default"].XK_KP_7); | ||
addNumpad("8", _keysym["default"].XK_8, _keysym["default"].XK_KP_8); | ||
addNumpad("9", _keysym["default"].XK_9, _keysym["default"].XK_KP_9); | ||
var _default = DOMKeyTable; | ||
exports["default"] = _default; |
@@ -1,6 +0,8 @@ | ||
'use strict'; | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
/* | ||
@@ -23,113 +25,100 @@ * noVNC: HTML5 VNC client | ||
/* eslint-disable key-spacing */ | ||
exports.default = { | ||
// 3.1.1.1. Writing System Keys | ||
'Backspace': 'Backspace', | ||
// 3.1.1.2. Functional Keys | ||
'AltLeft': 'Alt', | ||
'AltRight': 'Alt', // This could also be 'AltGraph' | ||
'CapsLock': 'CapsLock', | ||
'ContextMenu': 'ContextMenu', | ||
'ControlLeft': 'Control', | ||
'ControlRight': 'Control', | ||
'Enter': 'Enter', | ||
'MetaLeft': 'Meta', | ||
'MetaRight': 'Meta', | ||
'ShiftLeft': 'Shift', | ||
'ShiftRight': 'Shift', | ||
'Tab': 'Tab', | ||
// FIXME: Japanese/Korean keys | ||
// 3.1.2. Control Pad Section | ||
'Delete': 'Delete', | ||
'End': 'End', | ||
'Help': 'Help', | ||
'Home': 'Home', | ||
'Insert': 'Insert', | ||
'PageDown': 'PageDown', | ||
'PageUp': 'PageUp', | ||
// 3.1.3. Arrow Pad Section | ||
'ArrowDown': 'ArrowDown', | ||
'ArrowLeft': 'ArrowLeft', | ||
'ArrowRight': 'ArrowRight', | ||
'ArrowUp': 'ArrowUp', | ||
// 3.1.4. Numpad Section | ||
'NumLock': 'NumLock', | ||
'NumpadBackspace': 'Backspace', | ||
'NumpadClear': 'Clear', | ||
// 3.1.5. Function Section | ||
'Escape': 'Escape', | ||
'F1': 'F1', | ||
'F2': 'F2', | ||
'F3': 'F3', | ||
'F4': 'F4', | ||
'F5': 'F5', | ||
'F6': 'F6', | ||
'F7': 'F7', | ||
'F8': 'F8', | ||
'F9': 'F9', | ||
'F10': 'F10', | ||
'F11': 'F11', | ||
'F12': 'F12', | ||
'F13': 'F13', | ||
'F14': 'F14', | ||
'F15': 'F15', | ||
'F16': 'F16', | ||
'F17': 'F17', | ||
'F18': 'F18', | ||
'F19': 'F19', | ||
'F20': 'F20', | ||
'F21': 'F21', | ||
'F22': 'F22', | ||
'F23': 'F23', | ||
'F24': 'F24', | ||
'F25': 'F25', | ||
'F26': 'F26', | ||
'F27': 'F27', | ||
'F28': 'F28', | ||
'F29': 'F29', | ||
'F30': 'F30', | ||
'F31': 'F31', | ||
'F32': 'F32', | ||
'F33': 'F33', | ||
'F34': 'F34', | ||
'F35': 'F35', | ||
'PrintScreen': 'PrintScreen', | ||
'ScrollLock': 'ScrollLock', | ||
'Pause': 'Pause', | ||
// 3.1.6. Media Keys | ||
'BrowserBack': 'BrowserBack', | ||
'BrowserFavorites': 'BrowserFavorites', | ||
'BrowserForward': 'BrowserForward', | ||
'BrowserHome': 'BrowserHome', | ||
'BrowserRefresh': 'BrowserRefresh', | ||
'BrowserSearch': 'BrowserSearch', | ||
'BrowserStop': 'BrowserStop', | ||
'Eject': 'Eject', | ||
'LaunchApp1': 'LaunchMyComputer', | ||
'LaunchApp2': 'LaunchCalendar', | ||
'LaunchMail': 'LaunchMail', | ||
'MediaPlayPause': 'MediaPlay', | ||
'MediaStop': 'MediaStop', | ||
'MediaTrackNext': 'MediaTrackNext', | ||
'MediaTrackPrevious': 'MediaTrackPrevious', | ||
'Power': 'Power', | ||
'Sleep': 'Sleep', | ||
'AudioVolumeDown': 'AudioVolumeDown', | ||
'AudioVolumeMute': 'AudioVolumeMute', | ||
'AudioVolumeUp': 'AudioVolumeUp', | ||
'WakeUp': 'WakeUp' | ||
}; | ||
var _default = { | ||
// 3.1.1.1. Writing System Keys | ||
'Backspace': 'Backspace', | ||
// 3.1.1.2. Functional Keys | ||
'AltLeft': 'Alt', | ||
'AltRight': 'Alt', | ||
// This could also be 'AltGraph' | ||
'CapsLock': 'CapsLock', | ||
'ContextMenu': 'ContextMenu', | ||
'ControlLeft': 'Control', | ||
'ControlRight': 'Control', | ||
'Enter': 'Enter', | ||
'MetaLeft': 'Meta', | ||
'MetaRight': 'Meta', | ||
'ShiftLeft': 'Shift', | ||
'ShiftRight': 'Shift', | ||
'Tab': 'Tab', | ||
// FIXME: Japanese/Korean keys | ||
// 3.1.2. Control Pad Section | ||
'Delete': 'Delete', | ||
'End': 'End', | ||
'Help': 'Help', | ||
'Home': 'Home', | ||
'Insert': 'Insert', | ||
'PageDown': 'PageDown', | ||
'PageUp': 'PageUp', | ||
// 3.1.3. Arrow Pad Section | ||
'ArrowDown': 'ArrowDown', | ||
'ArrowLeft': 'ArrowLeft', | ||
'ArrowRight': 'ArrowRight', | ||
'ArrowUp': 'ArrowUp', | ||
// 3.1.4. Numpad Section | ||
'NumLock': 'NumLock', | ||
'NumpadBackspace': 'Backspace', | ||
'NumpadClear': 'Clear', | ||
// 3.1.5. Function Section | ||
'Escape': 'Escape', | ||
'F1': 'F1', | ||
'F2': 'F2', | ||
'F3': 'F3', | ||
'F4': 'F4', | ||
'F5': 'F5', | ||
'F6': 'F6', | ||
'F7': 'F7', | ||
'F8': 'F8', | ||
'F9': 'F9', | ||
'F10': 'F10', | ||
'F11': 'F11', | ||
'F12': 'F12', | ||
'F13': 'F13', | ||
'F14': 'F14', | ||
'F15': 'F15', | ||
'F16': 'F16', | ||
'F17': 'F17', | ||
'F18': 'F18', | ||
'F19': 'F19', | ||
'F20': 'F20', | ||
'F21': 'F21', | ||
'F22': 'F22', | ||
'F23': 'F23', | ||
'F24': 'F24', | ||
'F25': 'F25', | ||
'F26': 'F26', | ||
'F27': 'F27', | ||
'F28': 'F28', | ||
'F29': 'F29', | ||
'F30': 'F30', | ||
'F31': 'F31', | ||
'F32': 'F32', | ||
'F33': 'F33', | ||
'F34': 'F34', | ||
'F35': 'F35', | ||
'PrintScreen': 'PrintScreen', | ||
'ScrollLock': 'ScrollLock', | ||
'Pause': 'Pause', | ||
// 3.1.6. Media Keys | ||
'BrowserBack': 'BrowserBack', | ||
'BrowserFavorites': 'BrowserFavorites', | ||
'BrowserForward': 'BrowserForward', | ||
'BrowserHome': 'BrowserHome', | ||
'BrowserRefresh': 'BrowserRefresh', | ||
'BrowserSearch': 'BrowserSearch', | ||
'BrowserStop': 'BrowserStop', | ||
'Eject': 'Eject', | ||
'LaunchApp1': 'LaunchMyComputer', | ||
'LaunchApp2': 'LaunchCalendar', | ||
'LaunchMail': 'LaunchMail', | ||
'MediaPlayPause': 'MediaPlay', | ||
'MediaStop': 'MediaStop', | ||
'MediaTrackNext': 'MediaTrackNext', | ||
'MediaTrackPrevious': 'MediaTrackPrevious', | ||
'Power': 'Power', | ||
'Sleep': 'Sleep', | ||
'AudioVolumeDown': 'AudioVolumeDown', | ||
'AudioVolumeMute': 'AudioVolumeMute', | ||
'AudioVolumeUp': 'AudioVolumeUp', | ||
'WakeUp': 'WakeUp' | ||
}; | ||
exports["default"] = _default; |
@@ -1,412 +0,309 @@ | ||
'use strict'; | ||
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||
*/ | ||
var Log = _interopRequireWildcard(require("../util/logging.js")); | ||
var _logging = require('../util/logging.js'); | ||
var _events = require("../util/events.js"); | ||
var Log = _interopRequireWildcard(_logging); | ||
var KeyboardUtil = _interopRequireWildcard(require("./util.js")); | ||
var _events = require('../util/events.js'); | ||
var _keysym = _interopRequireDefault(require("./keysym.js")); | ||
var _util = require('./util.js'); | ||
var browser = _interopRequireWildcard(require("../util/browser.js")); | ||
var KeyboardUtil = _interopRequireWildcard(_util); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _keysym = require('./keysym.js'); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
var _keysym2 = _interopRequireDefault(_keysym); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
var _browser = require('../util/browser.js'); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var browser = _interopRequireWildcard(_browser); | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
// | ||
// Keyboard event handler | ||
// | ||
var Keyboard = /*#__PURE__*/function () { | ||
function Keyboard(target) { | ||
_classCallCheck(this, Keyboard); | ||
var Keyboard = function () { | ||
function Keyboard(target) { | ||
_classCallCheck(this, Keyboard); | ||
this._target = target || null; | ||
this._keyDownList = {}; // List of depressed keys | ||
// (even if they are happy) | ||
this._target = target || null; | ||
this._altGrArmed = false; // Windows AltGr detection | ||
// keep these here so we can refer to them later | ||
this._keyDownList = {}; // List of depressed keys | ||
// (even if they are happy) | ||
this._pendingKey = null; // Key waiting for keypress | ||
this._altGrArmed = false; // Windows AltGr detection | ||
this._eventHandlers = { | ||
'keyup': this._handleKeyUp.bind(this), | ||
'keydown': this._handleKeyDown.bind(this), | ||
'blur': this._allKeysUp.bind(this) | ||
}; // ===== EVENT HANDLERS ===== | ||
// keep these here so we can refer to them later | ||
this._eventHandlers = { | ||
'keyup': this._handleKeyUp.bind(this), | ||
'keydown': this._handleKeyDown.bind(this), | ||
'keypress': this._handleKeyPress.bind(this), | ||
'blur': this._allKeysUp.bind(this), | ||
'checkalt': this._checkAlt.bind(this) | ||
}; | ||
this.onkeyevent = function () {}; // Handler for key press/release | ||
// ===== EVENT HANDLERS ===== | ||
} // ===== PRIVATE METHODS ===== | ||
this.onkeyevent = function () {}; // Handler for key press/release | ||
_createClass(Keyboard, [{ | ||
key: "_sendKeyEvent", | ||
value: function _sendKeyEvent(keysym, code, down) { | ||
if (down) { | ||
this._keyDownList[code] = keysym; | ||
} else { | ||
// Do we really think this key is down? | ||
if (!(code in this._keyDownList)) { | ||
return; | ||
} | ||
delete this._keyDownList[code]; | ||
} | ||
Log.Debug("onkeyevent " + (down ? "down" : "up") + ", keysym: " + keysym, ", code: " + code); | ||
this.onkeyevent(keysym, code, down); | ||
} | ||
}, { | ||
key: "_getKeyCode", | ||
value: function _getKeyCode(e) { | ||
var code = KeyboardUtil.getKeycode(e); | ||
// ===== PRIVATE METHODS ===== | ||
if (code !== 'Unidentified') { | ||
return code; | ||
} // Unstable, but we don't have anything else to go on | ||
_createClass(Keyboard, [{ | ||
key: '_sendKeyEvent', | ||
value: function _sendKeyEvent(keysym, code, down) { | ||
if (down) { | ||
this._keyDownList[code] = keysym; | ||
} else { | ||
// Do we really think this key is down? | ||
if (!(code in this._keyDownList)) { | ||
return; | ||
} | ||
delete this._keyDownList[code]; | ||
} | ||
Log.Debug("onkeyevent " + (down ? "down" : "up") + ", keysym: " + keysym, ", code: " + code); | ||
this.onkeyevent(keysym, code, down); | ||
if (e.keyCode) { | ||
// 229 is used for composition events | ||
if (e.keyCode !== 229) { | ||
return 'Platform' + e.keyCode; | ||
} | ||
}, { | ||
key: '_getKeyCode', | ||
value: function _getKeyCode(e) { | ||
var code = KeyboardUtil.getKeycode(e); | ||
if (code !== 'Unidentified') { | ||
return code; | ||
} | ||
} // A precursor to the final DOM3 standard. Unfortunately it | ||
// is not layout independent, so it is as bad as using keyCode | ||
// Unstable, but we don't have anything else to go on | ||
// (don't use it for 'keypress' events thought since | ||
// WebKit sets it to the same as charCode) | ||
if (e.keyCode && e.type !== 'keypress') { | ||
// 229 is used for composition events | ||
if (e.keyCode !== 229) { | ||
return 'Platform' + e.keyCode; | ||
} | ||
} | ||
// A precursor to the final DOM3 standard. Unfortunately it | ||
// is not layout independent, so it is as bad as using keyCode | ||
if (e.keyIdentifier) { | ||
// Non-character key? | ||
if (e.keyIdentifier.substr(0, 2) !== 'U+') { | ||
return e.keyIdentifier; | ||
} | ||
if (e.keyIdentifier) { | ||
// Non-character key? | ||
if (e.keyIdentifier.substr(0, 2) !== 'U+') { | ||
return e.keyIdentifier; | ||
} | ||
var codepoint = parseInt(e.keyIdentifier.substr(2), 16); | ||
var char = String.fromCharCode(codepoint).toUpperCase(); | ||
var codepoint = parseInt(e.keyIdentifier.substr(2), 16); | ||
return 'Platform' + char.charCodeAt(); | ||
} | ||
var _char = String.fromCharCode(codepoint).toUpperCase(); | ||
return 'Unidentified'; | ||
} | ||
}, { | ||
key: '_handleKeyDown', | ||
value: function _handleKeyDown(e) { | ||
var code = this._getKeyCode(e); | ||
var keysym = KeyboardUtil.getKeysym(e); | ||
return 'Platform' + _char.charCodeAt(); | ||
} | ||
// Windows doesn't have a proper AltGr, but handles it using | ||
// fake Ctrl+Alt. However the remote end might not be Windows, | ||
// so we need to merge those in to a single AltGr event. We | ||
// detect this case by seeing the two key events directly after | ||
// each other with a very short time between them (<50ms). | ||
if (this._altGrArmed) { | ||
this._altGrArmed = false; | ||
clearTimeout(this._altGrTimeout); | ||
return 'Unidentified'; | ||
} | ||
}, { | ||
key: "_handleKeyDown", | ||
value: function _handleKeyDown(e) { | ||
var code = this._getKeyCode(e); | ||
if (code === "AltRight" && e.timeStamp - this._altGrCtrlTime < 50) { | ||
// FIXME: We fail to detect this if either Ctrl key is | ||
// first manually pressed as Windows then no | ||
// longer sends the fake Ctrl down event. It | ||
// does however happily send real Ctrl events | ||
// even when AltGr is already down. Some | ||
// browsers detect this for us though and set the | ||
// key to "AltGraph". | ||
keysym = _keysym2.default.XK_ISO_Level3_Shift; | ||
} else { | ||
this._sendKeyEvent(_keysym2.default.XK_Control_L, "ControlLeft", true); | ||
} | ||
} | ||
var keysym = KeyboardUtil.getKeysym(e); // Windows doesn't have a proper AltGr, but handles it using | ||
// fake Ctrl+Alt. However the remote end might not be Windows, | ||
// so we need to merge those in to a single AltGr event. We | ||
// detect this case by seeing the two key events directly after | ||
// each other with a very short time between them (<50ms). | ||
// We cannot handle keys we cannot track, but we also need | ||
// to deal with virtual keyboards which omit key info | ||
// (iOS omits tracking info on keyup events, which forces us to | ||
// special treat that platform here) | ||
if (code === 'Unidentified' || browser.isIOS()) { | ||
if (keysym) { | ||
// If it's a virtual keyboard then it should be | ||
// sufficient to just send press and release right | ||
// after each other | ||
this._sendKeyEvent(keysym, code, true); | ||
this._sendKeyEvent(keysym, code, false); | ||
} | ||
if (this._altGrArmed) { | ||
this._altGrArmed = false; | ||
clearTimeout(this._altGrTimeout); | ||
(0, _events.stopEvent)(e); | ||
return; | ||
} | ||
if (code === "AltRight" && e.timeStamp - this._altGrCtrlTime < 50) { | ||
// FIXME: We fail to detect this if either Ctrl key is | ||
// first manually pressed as Windows then no | ||
// longer sends the fake Ctrl down event. It | ||
// does however happily send real Ctrl events | ||
// even when AltGr is already down. Some | ||
// browsers detect this for us though and set the | ||
// key to "AltGraph". | ||
keysym = _keysym["default"].XK_ISO_Level3_Shift; | ||
} else { | ||
this._sendKeyEvent(_keysym["default"].XK_Control_L, "ControlLeft", true); | ||
} | ||
} // We cannot handle keys we cannot track, but we also need | ||
// to deal with virtual keyboards which omit key info | ||
// Alt behaves more like AltGraph on macOS, so shuffle the | ||
// keys around a bit to make things more sane for the remote | ||
// server. This method is used by RealVNC and TigerVNC (and | ||
// possibly others). | ||
if (browser.isMac()) { | ||
switch (keysym) { | ||
case _keysym2.default.XK_Super_L: | ||
keysym = _keysym2.default.XK_Alt_L; | ||
break; | ||
case _keysym2.default.XK_Super_R: | ||
keysym = _keysym2.default.XK_Super_L; | ||
break; | ||
case _keysym2.default.XK_Alt_L: | ||
keysym = _keysym2.default.XK_Mode_switch; | ||
break; | ||
case _keysym2.default.XK_Alt_R: | ||
keysym = _keysym2.default.XK_ISO_Level3_Shift; | ||
break; | ||
} | ||
} | ||
// Is this key already pressed? If so, then we must use the | ||
// same keysym or we'll confuse the server | ||
if (code in this._keyDownList) { | ||
keysym = this._keyDownList[code]; | ||
} | ||
if (code === 'Unidentified') { | ||
if (keysym) { | ||
// If it's a virtual keyboard then it should be | ||
// sufficient to just send press and release right | ||
// after each other | ||
this._sendKeyEvent(keysym, code, true); | ||
// macOS doesn't send proper key events for modifiers, only | ||
// state change events. That gets extra confusing for CapsLock | ||
// which toggles on each press, but not on release. So pretend | ||
// it was a quick press and release of the button. | ||
if (browser.isMac() && code === 'CapsLock') { | ||
this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', true); | ||
this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', false); | ||
(0, _events.stopEvent)(e); | ||
return; | ||
} | ||
this._sendKeyEvent(keysym, code, false); | ||
} | ||
// If this is a legacy browser then we'll need to wait for | ||
// a keypress event as well | ||
// (IE and Edge has a broken KeyboardEvent.key, so we can't | ||
// just check for the presence of that field) | ||
if (!keysym && (!e.key || browser.isIE() || browser.isEdge())) { | ||
this._pendingKey = code; | ||
// However we might not get a keypress event if the key | ||
// is non-printable, which needs some special fallback | ||
// handling | ||
setTimeout(this._handleKeyPressTimeout.bind(this), 10, e); | ||
return; | ||
} | ||
(0, _events.stopEvent)(e); | ||
return; | ||
} // Alt behaves more like AltGraph on macOS, so shuffle the | ||
// keys around a bit to make things more sane for the remote | ||
// server. This method is used by RealVNC and TigerVNC (and | ||
// possibly others). | ||
this._pendingKey = null; | ||
(0, _events.stopEvent)(e); | ||
// Possible start of AltGr sequence? (see above) | ||
if (code === "ControlLeft" && browser.isWindows() && !("ControlLeft" in this._keyDownList)) { | ||
this._altGrArmed = true; | ||
this._altGrTimeout = setTimeout(this._handleAltGrTimeout.bind(this), 100); | ||
this._altGrCtrlTime = e.timeStamp; | ||
return; | ||
} | ||
if (browser.isMac() || browser.isIOS()) { | ||
switch (keysym) { | ||
case _keysym["default"].XK_Super_L: | ||
keysym = _keysym["default"].XK_Alt_L; | ||
break; | ||
this._sendKeyEvent(keysym, code, true); | ||
case _keysym["default"].XK_Super_R: | ||
keysym = _keysym["default"].XK_Super_L; | ||
break; | ||
case _keysym["default"].XK_Alt_L: | ||
keysym = _keysym["default"].XK_Mode_switch; | ||
break; | ||
case _keysym["default"].XK_Alt_R: | ||
keysym = _keysym["default"].XK_ISO_Level3_Shift; | ||
break; | ||
} | ||
} // Is this key already pressed? If so, then we must use the | ||
// same keysym or we'll confuse the server | ||
// Legacy event for browsers without code/key | ||
}, { | ||
key: '_handleKeyPress', | ||
value: function _handleKeyPress(e) { | ||
(0, _events.stopEvent)(e); | ||
if (code in this._keyDownList) { | ||
keysym = this._keyDownList[code]; | ||
} // macOS doesn't send proper key events for modifiers, only | ||
// state change events. That gets extra confusing for CapsLock | ||
// which toggles on each press, but not on release. So pretend | ||
// it was a quick press and release of the button. | ||
// Are we expecting a keypress? | ||
if (this._pendingKey === null) { | ||
return; | ||
} | ||
var code = this._getKeyCode(e); | ||
var keysym = KeyboardUtil.getKeysym(e); | ||
if ((browser.isMac() || browser.isIOS()) && code === 'CapsLock') { | ||
this._sendKeyEvent(_keysym["default"].XK_Caps_Lock, 'CapsLock', true); | ||
// The key we were waiting for? | ||
if (code !== 'Unidentified' && code != this._pendingKey) { | ||
return; | ||
} | ||
this._sendKeyEvent(_keysym["default"].XK_Caps_Lock, 'CapsLock', false); | ||
code = this._pendingKey; | ||
this._pendingKey = null; | ||
(0, _events.stopEvent)(e); | ||
return; | ||
} // Windows doesn't send proper key releases for a bunch of | ||
// Japanese IM keys so we have to fake the release right away | ||
if (!keysym) { | ||
Log.Info('keypress with no keysym:', e); | ||
return; | ||
} | ||
this._sendKeyEvent(keysym, code, true); | ||
} | ||
}, { | ||
key: '_handleKeyPressTimeout', | ||
value: function _handleKeyPressTimeout(e) { | ||
// Did someone manage to sort out the key already? | ||
if (this._pendingKey === null) { | ||
return; | ||
} | ||
var jpBadKeys = [_keysym["default"].XK_Zenkaku_Hankaku, _keysym["default"].XK_Eisu_toggle, _keysym["default"].XK_Katakana, _keysym["default"].XK_Hiragana, _keysym["default"].XK_Romaji]; | ||
var keysym = void 0; | ||
if (browser.isWindows() && jpBadKeys.includes(keysym)) { | ||
this._sendKeyEvent(keysym, code, true); | ||
var code = this._pendingKey; | ||
this._pendingKey = null; | ||
this._sendKeyEvent(keysym, code, false); | ||
// We have no way of knowing the proper keysym with the | ||
// information given, but the following are true for most | ||
// layouts | ||
if (e.keyCode >= 0x30 && e.keyCode <= 0x39) { | ||
// Digit | ||
keysym = e.keyCode; | ||
} else if (e.keyCode >= 0x41 && e.keyCode <= 0x5a) { | ||
// Character (A-Z) | ||
var char = String.fromCharCode(e.keyCode); | ||
// A feeble attempt at the correct case | ||
if (e.shiftKey) { | ||
char = char.toUpperCase(); | ||
} else { | ||
char = char.toLowerCase(); | ||
} | ||
keysym = char.charCodeAt(); | ||
} else { | ||
// Unknown, give up | ||
keysym = 0; | ||
} | ||
(0, _events.stopEvent)(e); | ||
return; | ||
} | ||
this._sendKeyEvent(keysym, code, true); | ||
} | ||
}, { | ||
key: '_handleKeyUp', | ||
value: function _handleKeyUp(e) { | ||
(0, _events.stopEvent)(e); | ||
(0, _events.stopEvent)(e); // Possible start of AltGr sequence? (see above) | ||
var code = this._getKeyCode(e); | ||
if (code === "ControlLeft" && browser.isWindows() && !("ControlLeft" in this._keyDownList)) { | ||
this._altGrArmed = true; | ||
this._altGrTimeout = setTimeout(this._handleAltGrTimeout.bind(this), 100); | ||
this._altGrCtrlTime = e.timeStamp; | ||
return; | ||
} | ||
// We can't get a release in the middle of an AltGr sequence, so | ||
// abort that detection | ||
if (this._altGrArmed) { | ||
this._altGrArmed = false; | ||
clearTimeout(this._altGrTimeout); | ||
this._sendKeyEvent(_keysym2.default.XK_Control_L, "ControlLeft", true); | ||
} | ||
this._sendKeyEvent(keysym, code, true); | ||
} | ||
}, { | ||
key: "_handleKeyUp", | ||
value: function _handleKeyUp(e) { | ||
(0, _events.stopEvent)(e); | ||
// See comment in _handleKeyDown() | ||
if (browser.isMac() && code === 'CapsLock') { | ||
this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', true); | ||
this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', false); | ||
return; | ||
} | ||
var code = this._getKeyCode(e); // We can't get a release in the middle of an AltGr sequence, so | ||
// abort that detection | ||
this._sendKeyEvent(this._keyDownList[code], code, false); | ||
} | ||
}, { | ||
key: '_handleAltGrTimeout', | ||
value: function _handleAltGrTimeout() { | ||
this._altGrArmed = false; | ||
clearTimeout(this._altGrTimeout); | ||
this._sendKeyEvent(_keysym2.default.XK_Control_L, "ControlLeft", true); | ||
} | ||
}, { | ||
key: '_allKeysUp', | ||
value: function _allKeysUp() { | ||
Log.Debug(">> Keyboard.allKeysUp"); | ||
for (var code in this._keyDownList) { | ||
this._sendKeyEvent(this._keyDownList[code], code, false); | ||
} | ||
Log.Debug("<< Keyboard.allKeysUp"); | ||
} | ||
// Firefox Alt workaround, see below | ||
if (this._altGrArmed) { | ||
this._altGrArmed = false; | ||
clearTimeout(this._altGrTimeout); | ||
}, { | ||
key: '_checkAlt', | ||
value: function _checkAlt(e) { | ||
if (e.altKey) { | ||
return; | ||
} | ||
this._sendKeyEvent(_keysym["default"].XK_Control_L, "ControlLeft", true); | ||
} // See comment in _handleKeyDown() | ||
var target = this._target; | ||
var downList = this._keyDownList; | ||
['AltLeft', 'AltRight'].forEach(function (code) { | ||
if (!(code in downList)) { | ||
return; | ||
} | ||
var event = new KeyboardEvent('keyup', { key: downList[code], | ||
code: code }); | ||
target.dispatchEvent(event); | ||
}); | ||
} | ||
if ((browser.isMac() || browser.isIOS()) && code === 'CapsLock') { | ||
this._sendKeyEvent(_keysym["default"].XK_Caps_Lock, 'CapsLock', true); | ||
// ===== PUBLIC METHODS ===== | ||
this._sendKeyEvent(_keysym["default"].XK_Caps_Lock, 'CapsLock', false); | ||
}, { | ||
key: 'grab', | ||
value: function grab() { | ||
//Log.Debug(">> Keyboard.grab"); | ||
return; | ||
} | ||
this._target.addEventListener('keydown', this._eventHandlers.keydown); | ||
this._target.addEventListener('keyup', this._eventHandlers.keyup); | ||
this._target.addEventListener('keypress', this._eventHandlers.keypress); | ||
this._sendKeyEvent(this._keyDownList[code], code, false); // Windows has a rather nasty bug where it won't send key | ||
// release events for a Shift button if the other Shift is still | ||
// pressed | ||
// Release (key up) if window loses focus | ||
window.addEventListener('blur', this._eventHandlers.blur); | ||
// Firefox has broken handling of Alt, so we need to poll as | ||
// best we can for releases (still doesn't prevent the menu | ||
// from popping up though as we can't call preventDefault()) | ||
if (browser.isWindows() && browser.isFirefox()) { | ||
var handler = this._eventHandlers.checkalt; | ||
['mousedown', 'mouseup', 'mousemove', 'wheel', 'touchstart', 'touchend', 'touchmove', 'keydown', 'keyup'].forEach(function (type) { | ||
return document.addEventListener(type, handler, { capture: true, | ||
passive: true }); | ||
}); | ||
} | ||
if (browser.isWindows() && (code === 'ShiftLeft' || code === 'ShiftRight')) { | ||
if ('ShiftRight' in this._keyDownList) { | ||
this._sendKeyEvent(this._keyDownList['ShiftRight'], 'ShiftRight', false); | ||
} | ||
//Log.Debug("<< Keyboard.grab"); | ||
if ('ShiftLeft' in this._keyDownList) { | ||
this._sendKeyEvent(this._keyDownList['ShiftLeft'], 'ShiftLeft', false); | ||
} | ||
}, { | ||
key: 'ungrab', | ||
value: function ungrab() { | ||
//Log.Debug(">> Keyboard.ungrab"); | ||
} | ||
} | ||
}, { | ||
key: "_handleAltGrTimeout", | ||
value: function _handleAltGrTimeout() { | ||
this._altGrArmed = false; | ||
clearTimeout(this._altGrTimeout); | ||
if (browser.isWindows() && browser.isFirefox()) { | ||
var handler = this._eventHandlers.checkalt; | ||
['mousedown', 'mouseup', 'mousemove', 'wheel', 'touchstart', 'touchend', 'touchmove', 'keydown', 'keyup'].forEach(function (type) { | ||
return document.removeEventListener(type, handler); | ||
}); | ||
} | ||
this._sendKeyEvent(_keysym["default"].XK_Control_L, "ControlLeft", true); | ||
} | ||
}, { | ||
key: "_allKeysUp", | ||
value: function _allKeysUp() { | ||
Log.Debug(">> Keyboard.allKeysUp"); | ||
this._target.removeEventListener('keydown', this._eventHandlers.keydown); | ||
this._target.removeEventListener('keyup', this._eventHandlers.keyup); | ||
this._target.removeEventListener('keypress', this._eventHandlers.keypress); | ||
window.removeEventListener('blur', this._eventHandlers.blur); | ||
for (var code in this._keyDownList) { | ||
this._sendKeyEvent(this._keyDownList[code], code, false); | ||
} | ||
// Release (key up) all keys that are in a down state | ||
this._allKeysUp(); | ||
Log.Debug("<< Keyboard.allKeysUp"); | ||
} // ===== PUBLIC METHODS ===== | ||
//Log.Debug(">> Keyboard.ungrab"); | ||
} | ||
}]); | ||
}, { | ||
key: "grab", | ||
value: function grab() { | ||
//Log.Debug(">> Keyboard.grab"); | ||
this._target.addEventListener('keydown', this._eventHandlers.keydown); | ||
return Keyboard; | ||
this._target.addEventListener('keyup', this._eventHandlers.keyup); // Release (key up) if window loses focus | ||
window.addEventListener('blur', this._eventHandlers.blur); //Log.Debug("<< Keyboard.grab"); | ||
} | ||
}, { | ||
key: "ungrab", | ||
value: function ungrab() { | ||
//Log.Debug(">> Keyboard.ungrab"); | ||
this._target.removeEventListener('keydown', this._eventHandlers.keydown); | ||
this._target.removeEventListener('keyup', this._eventHandlers.keyup); | ||
window.removeEventListener('blur', this._eventHandlers.blur); // Release (key up) all keys that are in a down state | ||
this._allKeysUp(); //Log.Debug(">> Keyboard.ungrab"); | ||
} | ||
}]); | ||
return Keyboard; | ||
}(); | ||
exports.default = Keyboard; | ||
exports["default"] = Keyboard; |
@@ -6,21 +6,34 @@ "use strict"; | ||
}); | ||
exports["default"] = void 0; | ||
/* eslint-disable key-spacing */ | ||
var _default = { | ||
XK_VoidSymbol: 0xffffff, | ||
exports.default = { | ||
XK_VoidSymbol: 0xffffff, /* Void symbol */ | ||
/* Void symbol */ | ||
XK_BackSpace: 0xff08, | ||
XK_BackSpace: 0xff08, /* Back space, back char */ | ||
/* Back space, back char */ | ||
XK_Tab: 0xff09, | ||
XK_Linefeed: 0xff0a, /* Linefeed, LF */ | ||
XK_Linefeed: 0xff0a, | ||
/* Linefeed, LF */ | ||
XK_Clear: 0xff0b, | ||
XK_Return: 0xff0d, /* Return, enter */ | ||
XK_Pause: 0xff13, /* Pause, hold */ | ||
XK_Return: 0xff0d, | ||
/* Return, enter */ | ||
XK_Pause: 0xff13, | ||
/* Pause, hold */ | ||
XK_Scroll_Lock: 0xff14, | ||
XK_Sys_Req: 0xff15, | ||
XK_Escape: 0xff1b, | ||
XK_Delete: 0xffff, /* Delete, rubout */ | ||
XK_Delete: 0xffff, | ||
/* Delete, rubout */ | ||
/* International & multi-key character composition */ | ||
XK_Multi_key: 0xff20, | ||
XK_Multi_key: 0xff20, /* Multi-key character compose */ | ||
/* Multi-key character compose */ | ||
XK_Codeinput: 0xff37, | ||
@@ -32,61 +45,137 @@ XK_SingleCandidate: 0xff3c, | ||
/* Japanese keyboard support */ | ||
XK_Kanji: 0xff21, | ||
XK_Kanji: 0xff21, /* Kanji, Kanji convert */ | ||
XK_Muhenkan: 0xff22, /* Cancel Conversion */ | ||
XK_Henkan_Mode: 0xff23, /* Start/Stop Conversion */ | ||
XK_Henkan: 0xff23, /* Alias for Henkan_Mode */ | ||
XK_Romaji: 0xff24, /* to Romaji */ | ||
XK_Hiragana: 0xff25, /* to Hiragana */ | ||
XK_Katakana: 0xff26, /* to Katakana */ | ||
XK_Hiragana_Katakana: 0xff27, /* Hiragana/Katakana toggle */ | ||
XK_Zenkaku: 0xff28, /* to Zenkaku */ | ||
XK_Hankaku: 0xff29, /* to Hankaku */ | ||
XK_Zenkaku_Hankaku: 0xff2a, /* Zenkaku/Hankaku toggle */ | ||
XK_Touroku: 0xff2b, /* Add to Dictionary */ | ||
XK_Massyo: 0xff2c, /* Delete from Dictionary */ | ||
XK_Kana_Lock: 0xff2d, /* Kana Lock */ | ||
XK_Kana_Shift: 0xff2e, /* Kana Shift */ | ||
XK_Eisu_Shift: 0xff2f, /* Alphanumeric Shift */ | ||
XK_Eisu_toggle: 0xff30, /* Alphanumeric toggle */ | ||
XK_Kanji_Bangou: 0xff37, /* Codeinput */ | ||
XK_Zen_Koho: 0xff3d, /* Multiple/All Candidate(s) */ | ||
XK_Mae_Koho: 0xff3e, /* Previous Candidate */ | ||
/* Kanji, Kanji convert */ | ||
XK_Muhenkan: 0xff22, | ||
/* Cancel Conversion */ | ||
XK_Henkan_Mode: 0xff23, | ||
/* Start/Stop Conversion */ | ||
XK_Henkan: 0xff23, | ||
/* Alias for Henkan_Mode */ | ||
XK_Romaji: 0xff24, | ||
/* to Romaji */ | ||
XK_Hiragana: 0xff25, | ||
/* to Hiragana */ | ||
XK_Katakana: 0xff26, | ||
/* to Katakana */ | ||
XK_Hiragana_Katakana: 0xff27, | ||
/* Hiragana/Katakana toggle */ | ||
XK_Zenkaku: 0xff28, | ||
/* to Zenkaku */ | ||
XK_Hankaku: 0xff29, | ||
/* to Hankaku */ | ||
XK_Zenkaku_Hankaku: 0xff2a, | ||
/* Zenkaku/Hankaku toggle */ | ||
XK_Touroku: 0xff2b, | ||
/* Add to Dictionary */ | ||
XK_Massyo: 0xff2c, | ||
/* Delete from Dictionary */ | ||
XK_Kana_Lock: 0xff2d, | ||
/* Kana Lock */ | ||
XK_Kana_Shift: 0xff2e, | ||
/* Kana Shift */ | ||
XK_Eisu_Shift: 0xff2f, | ||
/* Alphanumeric Shift */ | ||
XK_Eisu_toggle: 0xff30, | ||
/* Alphanumeric toggle */ | ||
XK_Kanji_Bangou: 0xff37, | ||
/* Codeinput */ | ||
XK_Zen_Koho: 0xff3d, | ||
/* Multiple/All Candidate(s) */ | ||
XK_Mae_Koho: 0xff3e, | ||
/* Previous Candidate */ | ||
/* Cursor control & motion */ | ||
XK_Home: 0xff50, | ||
XK_Left: 0xff51, | ||
XK_Home: 0xff50, | ||
XK_Left: 0xff51, /* Move left, left arrow */ | ||
XK_Up: 0xff52, /* Move up, up arrow */ | ||
XK_Right: 0xff53, /* Move right, right arrow */ | ||
XK_Down: 0xff54, /* Move down, down arrow */ | ||
XK_Prior: 0xff55, /* Prior, previous */ | ||
/* Move left, left arrow */ | ||
XK_Up: 0xff52, | ||
/* Move up, up arrow */ | ||
XK_Right: 0xff53, | ||
/* Move right, right arrow */ | ||
XK_Down: 0xff54, | ||
/* Move down, down arrow */ | ||
XK_Prior: 0xff55, | ||
/* Prior, previous */ | ||
XK_Page_Up: 0xff55, | ||
XK_Next: 0xff56, /* Next */ | ||
XK_Next: 0xff56, | ||
/* Next */ | ||
XK_Page_Down: 0xff56, | ||
XK_End: 0xff57, /* EOL */ | ||
XK_Begin: 0xff58, /* BOL */ | ||
XK_End: 0xff57, | ||
/* EOL */ | ||
XK_Begin: 0xff58, | ||
/* BOL */ | ||
/* Misc functions */ | ||
XK_Select: 0xff60, | ||
XK_Select: 0xff60, /* Select, mark */ | ||
/* Select, mark */ | ||
XK_Print: 0xff61, | ||
XK_Execute: 0xff62, /* Execute, run, do */ | ||
XK_Insert: 0xff63, /* Insert, insert here */ | ||
XK_Execute: 0xff62, | ||
/* Execute, run, do */ | ||
XK_Insert: 0xff63, | ||
/* Insert, insert here */ | ||
XK_Undo: 0xff65, | ||
XK_Redo: 0xff66, /* Redo, again */ | ||
XK_Redo: 0xff66, | ||
/* Redo, again */ | ||
XK_Menu: 0xff67, | ||
XK_Find: 0xff68, /* Find, search */ | ||
XK_Cancel: 0xff69, /* Cancel, stop, abort, exit */ | ||
XK_Help: 0xff6a, /* Help */ | ||
XK_Find: 0xff68, | ||
/* Find, search */ | ||
XK_Cancel: 0xff69, | ||
/* Cancel, stop, abort, exit */ | ||
XK_Help: 0xff6a, | ||
/* Help */ | ||
XK_Break: 0xff6b, | ||
XK_Mode_switch: 0xff7e, /* Character set switch */ | ||
XK_script_switch: 0xff7e, /* Alias for mode_switch */ | ||
XK_Mode_switch: 0xff7e, | ||
/* Character set switch */ | ||
XK_script_switch: 0xff7e, | ||
/* Alias for mode_switch */ | ||
XK_Num_Lock: 0xff7f, | ||
/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ | ||
XK_KP_Space: 0xff80, | ||
XK_KP_Space: 0xff80, /* Space */ | ||
/* Space */ | ||
XK_KP_Tab: 0xff89, | ||
XK_KP_Enter: 0xff8d, /* Enter */ | ||
XK_KP_F1: 0xff91, /* PF1, KP_A, ... */ | ||
XK_KP_Enter: 0xff8d, | ||
/* Enter */ | ||
XK_KP_F1: 0xff91, | ||
/* PF1, KP_A, ... */ | ||
XK_KP_F2: 0xff92, | ||
@@ -108,10 +197,13 @@ XK_KP_F3: 0xff93, | ||
XK_KP_Delete: 0xff9f, | ||
XK_KP_Equal: 0xffbd, /* Equals */ | ||
XK_KP_Equal: 0xffbd, | ||
/* Equals */ | ||
XK_KP_Multiply: 0xffaa, | ||
XK_KP_Add: 0xffab, | ||
XK_KP_Separator: 0xffac, /* Separator, often comma */ | ||
XK_KP_Separator: 0xffac, | ||
/* Separator, often comma */ | ||
XK_KP_Subtract: 0xffad, | ||
XK_KP_Decimal: 0xffae, | ||
XK_KP_Divide: 0xffaf, | ||
XK_KP_0: 0xffb0, | ||
@@ -134,3 +226,2 @@ XK_KP_1: 0xffb1, | ||
*/ | ||
XK_F1: 0xffbe, | ||
@@ -198,19 +289,45 @@ XK_F2: 0xffbf, | ||
/* Modifiers */ | ||
XK_Shift_L: 0xffe1, | ||
XK_Shift_L: 0xffe1, /* Left shift */ | ||
XK_Shift_R: 0xffe2, /* Right shift */ | ||
XK_Control_L: 0xffe3, /* Left control */ | ||
XK_Control_R: 0xffe4, /* Right control */ | ||
XK_Caps_Lock: 0xffe5, /* Caps lock */ | ||
XK_Shift_Lock: 0xffe6, /* Shift lock */ | ||
/* Left shift */ | ||
XK_Shift_R: 0xffe2, | ||
XK_Meta_L: 0xffe7, /* Left meta */ | ||
XK_Meta_R: 0xffe8, /* Right meta */ | ||
XK_Alt_L: 0xffe9, /* Left alt */ | ||
XK_Alt_R: 0xffea, /* Right alt */ | ||
XK_Super_L: 0xffeb, /* Left super */ | ||
XK_Super_R: 0xffec, /* Right super */ | ||
XK_Hyper_L: 0xffed, /* Left hyper */ | ||
XK_Hyper_R: 0xffee, /* Right hyper */ | ||
/* Right shift */ | ||
XK_Control_L: 0xffe3, | ||
/* Left control */ | ||
XK_Control_R: 0xffe4, | ||
/* Right control */ | ||
XK_Caps_Lock: 0xffe5, | ||
/* Caps lock */ | ||
XK_Shift_Lock: 0xffe6, | ||
/* Shift lock */ | ||
XK_Meta_L: 0xffe7, | ||
/* Left meta */ | ||
XK_Meta_R: 0xffe8, | ||
/* Right meta */ | ||
XK_Alt_L: 0xffe9, | ||
/* Left alt */ | ||
XK_Alt_R: 0xffea, | ||
/* Right alt */ | ||
XK_Super_L: 0xffeb, | ||
/* Left super */ | ||
XK_Super_R: 0xffec, | ||
/* Right super */ | ||
XK_Hyper_L: 0xffed, | ||
/* Left hyper */ | ||
XK_Hyper_R: 0xffee, | ||
/* Right hyper */ | ||
/* | ||
@@ -221,4 +338,5 @@ * Keyboard (XKB) Extension function and modifier keys | ||
*/ | ||
XK_ISO_Level3_Shift: 0xfe03, | ||
XK_ISO_Level3_Shift: 0xfe03, /* AltGr */ | ||
/* AltGr */ | ||
XK_ISO_Next_Group: 0xfe08, | ||
@@ -234,202 +352,594 @@ XK_ISO_Prev_Group: 0xfe0a, | ||
*/ | ||
XK_space: 0x0020, | ||
XK_space: 0x0020, /* U+0020 SPACE */ | ||
XK_exclam: 0x0021, /* U+0021 EXCLAMATION MARK */ | ||
XK_quotedbl: 0x0022, /* U+0022 QUOTATION MARK */ | ||
XK_numbersign: 0x0023, /* U+0023 NUMBER SIGN */ | ||
XK_dollar: 0x0024, /* U+0024 DOLLAR SIGN */ | ||
XK_percent: 0x0025, /* U+0025 PERCENT SIGN */ | ||
XK_ampersand: 0x0026, /* U+0026 AMPERSAND */ | ||
XK_apostrophe: 0x0027, /* U+0027 APOSTROPHE */ | ||
XK_quoteright: 0x0027, /* deprecated */ | ||
XK_parenleft: 0x0028, /* U+0028 LEFT PARENTHESIS */ | ||
XK_parenright: 0x0029, /* U+0029 RIGHT PARENTHESIS */ | ||
XK_asterisk: 0x002a, /* U+002A ASTERISK */ | ||
XK_plus: 0x002b, /* U+002B PLUS SIGN */ | ||
XK_comma: 0x002c, /* U+002C COMMA */ | ||
XK_minus: 0x002d, /* U+002D HYPHEN-MINUS */ | ||
XK_period: 0x002e, /* U+002E FULL STOP */ | ||
XK_slash: 0x002f, /* U+002F SOLIDUS */ | ||
XK_0: 0x0030, /* U+0030 DIGIT ZERO */ | ||
XK_1: 0x0031, /* U+0031 DIGIT ONE */ | ||
XK_2: 0x0032, /* U+0032 DIGIT TWO */ | ||
XK_3: 0x0033, /* U+0033 DIGIT THREE */ | ||
XK_4: 0x0034, /* U+0034 DIGIT FOUR */ | ||
XK_5: 0x0035, /* U+0035 DIGIT FIVE */ | ||
XK_6: 0x0036, /* U+0036 DIGIT SIX */ | ||
XK_7: 0x0037, /* U+0037 DIGIT SEVEN */ | ||
XK_8: 0x0038, /* U+0038 DIGIT EIGHT */ | ||
XK_9: 0x0039, /* U+0039 DIGIT NINE */ | ||
XK_colon: 0x003a, /* U+003A COLON */ | ||
XK_semicolon: 0x003b, /* U+003B SEMICOLON */ | ||
XK_less: 0x003c, /* U+003C LESS-THAN SIGN */ | ||
XK_equal: 0x003d, /* U+003D EQUALS SIGN */ | ||
XK_greater: 0x003e, /* U+003E GREATER-THAN SIGN */ | ||
XK_question: 0x003f, /* U+003F QUESTION MARK */ | ||
XK_at: 0x0040, /* U+0040 COMMERCIAL AT */ | ||
XK_A: 0x0041, /* U+0041 LATIN CAPITAL LETTER A */ | ||
XK_B: 0x0042, /* U+0042 LATIN CAPITAL LETTER B */ | ||
XK_C: 0x0043, /* U+0043 LATIN CAPITAL LETTER C */ | ||
XK_D: 0x0044, /* U+0044 LATIN CAPITAL LETTER D */ | ||
XK_E: 0x0045, /* U+0045 LATIN CAPITAL LETTER E */ | ||
XK_F: 0x0046, /* U+0046 LATIN CAPITAL LETTER F */ | ||
XK_G: 0x0047, /* U+0047 LATIN CAPITAL LETTER G */ | ||
XK_H: 0x0048, /* U+0048 LATIN CAPITAL LETTER H */ | ||
XK_I: 0x0049, /* U+0049 LATIN CAPITAL LETTER I */ | ||
XK_J: 0x004a, /* U+004A LATIN CAPITAL LETTER J */ | ||
XK_K: 0x004b, /* U+004B LATIN CAPITAL LETTER K */ | ||
XK_L: 0x004c, /* U+004C LATIN CAPITAL LETTER L */ | ||
XK_M: 0x004d, /* U+004D LATIN CAPITAL LETTER M */ | ||
XK_N: 0x004e, /* U+004E LATIN CAPITAL LETTER N */ | ||
XK_O: 0x004f, /* U+004F LATIN CAPITAL LETTER O */ | ||
XK_P: 0x0050, /* U+0050 LATIN CAPITAL LETTER P */ | ||
XK_Q: 0x0051, /* U+0051 LATIN CAPITAL LETTER Q */ | ||
XK_R: 0x0052, /* U+0052 LATIN CAPITAL LETTER R */ | ||
XK_S: 0x0053, /* U+0053 LATIN CAPITAL LETTER S */ | ||
XK_T: 0x0054, /* U+0054 LATIN CAPITAL LETTER T */ | ||
XK_U: 0x0055, /* U+0055 LATIN CAPITAL LETTER U */ | ||
XK_V: 0x0056, /* U+0056 LATIN CAPITAL LETTER V */ | ||
XK_W: 0x0057, /* U+0057 LATIN CAPITAL LETTER W */ | ||
XK_X: 0x0058, /* U+0058 LATIN CAPITAL LETTER X */ | ||
XK_Y: 0x0059, /* U+0059 LATIN CAPITAL LETTER Y */ | ||
XK_Z: 0x005a, /* U+005A LATIN CAPITAL LETTER Z */ | ||
XK_bracketleft: 0x005b, /* U+005B LEFT SQUARE BRACKET */ | ||
XK_backslash: 0x005c, /* U+005C REVERSE SOLIDUS */ | ||
XK_bracketright: 0x005d, /* U+005D RIGHT SQUARE BRACKET */ | ||
XK_asciicircum: 0x005e, /* U+005E CIRCUMFLEX ACCENT */ | ||
XK_underscore: 0x005f, /* U+005F LOW LINE */ | ||
XK_grave: 0x0060, /* U+0060 GRAVE ACCENT */ | ||
XK_quoteleft: 0x0060, /* deprecated */ | ||
XK_a: 0x0061, /* U+0061 LATIN SMALL LETTER A */ | ||
XK_b: 0x0062, /* U+0062 LATIN SMALL LETTER B */ | ||
XK_c: 0x0063, /* U+0063 LATIN SMALL LETTER C */ | ||
XK_d: 0x0064, /* U+0064 LATIN SMALL LETTER D */ | ||
XK_e: 0x0065, /* U+0065 LATIN SMALL LETTER E */ | ||
XK_f: 0x0066, /* U+0066 LATIN SMALL LETTER F */ | ||
XK_g: 0x0067, /* U+0067 LATIN SMALL LETTER G */ | ||
XK_h: 0x0068, /* U+0068 LATIN SMALL LETTER H */ | ||
XK_i: 0x0069, /* U+0069 LATIN SMALL LETTER I */ | ||
XK_j: 0x006a, /* U+006A LATIN SMALL LETTER J */ | ||
XK_k: 0x006b, /* U+006B LATIN SMALL LETTER K */ | ||
XK_l: 0x006c, /* U+006C LATIN SMALL LETTER L */ | ||
XK_m: 0x006d, /* U+006D LATIN SMALL LETTER M */ | ||
XK_n: 0x006e, /* U+006E LATIN SMALL LETTER N */ | ||
XK_o: 0x006f, /* U+006F LATIN SMALL LETTER O */ | ||
XK_p: 0x0070, /* U+0070 LATIN SMALL LETTER P */ | ||
XK_q: 0x0071, /* U+0071 LATIN SMALL LETTER Q */ | ||
XK_r: 0x0072, /* U+0072 LATIN SMALL LETTER R */ | ||
XK_s: 0x0073, /* U+0073 LATIN SMALL LETTER S */ | ||
XK_t: 0x0074, /* U+0074 LATIN SMALL LETTER T */ | ||
XK_u: 0x0075, /* U+0075 LATIN SMALL LETTER U */ | ||
XK_v: 0x0076, /* U+0076 LATIN SMALL LETTER V */ | ||
XK_w: 0x0077, /* U+0077 LATIN SMALL LETTER W */ | ||
XK_x: 0x0078, /* U+0078 LATIN SMALL LETTER X */ | ||
XK_y: 0x0079, /* U+0079 LATIN SMALL LETTER Y */ | ||
XK_z: 0x007a, /* U+007A LATIN SMALL LETTER Z */ | ||
XK_braceleft: 0x007b, /* U+007B LEFT CURLY BRACKET */ | ||
XK_bar: 0x007c, /* U+007C VERTICAL LINE */ | ||
XK_braceright: 0x007d, /* U+007D RIGHT CURLY BRACKET */ | ||
XK_asciitilde: 0x007e, /* U+007E TILDE */ | ||
/* U+0020 SPACE */ | ||
XK_exclam: 0x0021, | ||
XK_nobreakspace: 0x00a0, /* U+00A0 NO-BREAK SPACE */ | ||
XK_exclamdown: 0x00a1, /* U+00A1 INVERTED EXCLAMATION MARK */ | ||
XK_cent: 0x00a2, /* U+00A2 CENT SIGN */ | ||
XK_sterling: 0x00a3, /* U+00A3 POUND SIGN */ | ||
XK_currency: 0x00a4, /* U+00A4 CURRENCY SIGN */ | ||
XK_yen: 0x00a5, /* U+00A5 YEN SIGN */ | ||
XK_brokenbar: 0x00a6, /* U+00A6 BROKEN BAR */ | ||
XK_section: 0x00a7, /* U+00A7 SECTION SIGN */ | ||
XK_diaeresis: 0x00a8, /* U+00A8 DIAERESIS */ | ||
XK_copyright: 0x00a9, /* U+00A9 COPYRIGHT SIGN */ | ||
XK_ordfeminine: 0x00aa, /* U+00AA FEMININE ORDINAL INDICATOR */ | ||
XK_guillemotleft: 0x00ab, /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ | ||
XK_notsign: 0x00ac, /* U+00AC NOT SIGN */ | ||
XK_hyphen: 0x00ad, /* U+00AD SOFT HYPHEN */ | ||
XK_registered: 0x00ae, /* U+00AE REGISTERED SIGN */ | ||
XK_macron: 0x00af, /* U+00AF MACRON */ | ||
XK_degree: 0x00b0, /* U+00B0 DEGREE SIGN */ | ||
XK_plusminus: 0x00b1, /* U+00B1 PLUS-MINUS SIGN */ | ||
XK_twosuperior: 0x00b2, /* U+00B2 SUPERSCRIPT TWO */ | ||
XK_threesuperior: 0x00b3, /* U+00B3 SUPERSCRIPT THREE */ | ||
XK_acute: 0x00b4, /* U+00B4 ACUTE ACCENT */ | ||
XK_mu: 0x00b5, /* U+00B5 MICRO SIGN */ | ||
XK_paragraph: 0x00b6, /* U+00B6 PILCROW SIGN */ | ||
XK_periodcentered: 0x00b7, /* U+00B7 MIDDLE DOT */ | ||
XK_cedilla: 0x00b8, /* U+00B8 CEDILLA */ | ||
XK_onesuperior: 0x00b9, /* U+00B9 SUPERSCRIPT ONE */ | ||
XK_masculine: 0x00ba, /* U+00BA MASCULINE ORDINAL INDICATOR */ | ||
XK_guillemotright: 0x00bb, /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ | ||
XK_onequarter: 0x00bc, /* U+00BC VULGAR FRACTION ONE QUARTER */ | ||
XK_onehalf: 0x00bd, /* U+00BD VULGAR FRACTION ONE HALF */ | ||
XK_threequarters: 0x00be, /* U+00BE VULGAR FRACTION THREE QUARTERS */ | ||
XK_questiondown: 0x00bf, /* U+00BF INVERTED QUESTION MARK */ | ||
XK_Agrave: 0x00c0, /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ | ||
XK_Aacute: 0x00c1, /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ | ||
XK_Acircumflex: 0x00c2, /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ | ||
XK_Atilde: 0x00c3, /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ | ||
XK_Adiaeresis: 0x00c4, /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ | ||
XK_Aring: 0x00c5, /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ | ||
XK_AE: 0x00c6, /* U+00C6 LATIN CAPITAL LETTER AE */ | ||
XK_Ccedilla: 0x00c7, /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ | ||
XK_Egrave: 0x00c8, /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ | ||
XK_Eacute: 0x00c9, /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ | ||
XK_Ecircumflex: 0x00ca, /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ | ||
XK_Ediaeresis: 0x00cb, /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ | ||
XK_Igrave: 0x00cc, /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ | ||
XK_Iacute: 0x00cd, /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ | ||
XK_Icircumflex: 0x00ce, /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ | ||
XK_Idiaeresis: 0x00cf, /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ | ||
XK_ETH: 0x00d0, /* U+00D0 LATIN CAPITAL LETTER ETH */ | ||
XK_Eth: 0x00d0, /* deprecated */ | ||
XK_Ntilde: 0x00d1, /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ | ||
XK_Ograve: 0x00d2, /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ | ||
XK_Oacute: 0x00d3, /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ | ||
XK_Ocircumflex: 0x00d4, /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ | ||
XK_Otilde: 0x00d5, /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ | ||
XK_Odiaeresis: 0x00d6, /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ | ||
XK_multiply: 0x00d7, /* U+00D7 MULTIPLICATION SIGN */ | ||
XK_Oslash: 0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ | ||
XK_Ooblique: 0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ | ||
XK_Ugrave: 0x00d9, /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ | ||
XK_Uacute: 0x00da, /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ | ||
XK_Ucircumflex: 0x00db, /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ | ||
XK_Udiaeresis: 0x00dc, /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ | ||
XK_Yacute: 0x00dd, /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ | ||
XK_THORN: 0x00de, /* U+00DE LATIN CAPITAL LETTER THORN */ | ||
XK_Thorn: 0x00de, /* deprecated */ | ||
XK_ssharp: 0x00df, /* U+00DF LATIN SMALL LETTER SHARP S */ | ||
XK_agrave: 0x00e0, /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ | ||
XK_aacute: 0x00e1, /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ | ||
XK_acircumflex: 0x00e2, /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ | ||
XK_atilde: 0x00e3, /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ | ||
XK_adiaeresis: 0x00e4, /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ | ||
XK_aring: 0x00e5, /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ | ||
XK_ae: 0x00e6, /* U+00E6 LATIN SMALL LETTER AE */ | ||
XK_ccedilla: 0x00e7, /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ | ||
XK_egrave: 0x00e8, /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ | ||
XK_eacute: 0x00e9, /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ | ||
XK_ecircumflex: 0x00ea, /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ | ||
XK_ediaeresis: 0x00eb, /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ | ||
XK_igrave: 0x00ec, /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ | ||
XK_iacute: 0x00ed, /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ | ||
XK_icircumflex: 0x00ee, /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ | ||
XK_idiaeresis: 0x00ef, /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ | ||
XK_eth: 0x00f0, /* U+00F0 LATIN SMALL LETTER ETH */ | ||
XK_ntilde: 0x00f1, /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ | ||
XK_ograve: 0x00f2, /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ | ||
XK_oacute: 0x00f3, /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ | ||
XK_ocircumflex: 0x00f4, /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ | ||
XK_otilde: 0x00f5, /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ | ||
XK_odiaeresis: 0x00f6, /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ | ||
XK_division: 0x00f7, /* U+00F7 DIVISION SIGN */ | ||
XK_oslash: 0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ | ||
XK_ooblique: 0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ | ||
XK_ugrave: 0x00f9, /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ | ||
XK_uacute: 0x00fa, /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ | ||
XK_ucircumflex: 0x00fb, /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ | ||
XK_udiaeresis: 0x00fc, /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ | ||
XK_yacute: 0x00fd, /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ | ||
XK_thorn: 0x00fe, /* U+00FE LATIN SMALL LETTER THORN */ | ||
XK_ydiaeresis: 0x00ff, /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ | ||
/* U+0021 EXCLAMATION MARK */ | ||
XK_quotedbl: 0x0022, | ||
/* U+0022 QUOTATION MARK */ | ||
XK_numbersign: 0x0023, | ||
/* U+0023 NUMBER SIGN */ | ||
XK_dollar: 0x0024, | ||
/* U+0024 DOLLAR SIGN */ | ||
XK_percent: 0x0025, | ||
/* U+0025 PERCENT SIGN */ | ||
XK_ampersand: 0x0026, | ||
/* U+0026 AMPERSAND */ | ||
XK_apostrophe: 0x0027, | ||
/* U+0027 APOSTROPHE */ | ||
XK_quoteright: 0x0027, | ||
/* deprecated */ | ||
XK_parenleft: 0x0028, | ||
/* U+0028 LEFT PARENTHESIS */ | ||
XK_parenright: 0x0029, | ||
/* U+0029 RIGHT PARENTHESIS */ | ||
XK_asterisk: 0x002a, | ||
/* U+002A ASTERISK */ | ||
XK_plus: 0x002b, | ||
/* U+002B PLUS SIGN */ | ||
XK_comma: 0x002c, | ||
/* U+002C COMMA */ | ||
XK_minus: 0x002d, | ||
/* U+002D HYPHEN-MINUS */ | ||
XK_period: 0x002e, | ||
/* U+002E FULL STOP */ | ||
XK_slash: 0x002f, | ||
/* U+002F SOLIDUS */ | ||
XK_0: 0x0030, | ||
/* U+0030 DIGIT ZERO */ | ||
XK_1: 0x0031, | ||
/* U+0031 DIGIT ONE */ | ||
XK_2: 0x0032, | ||
/* U+0032 DIGIT TWO */ | ||
XK_3: 0x0033, | ||
/* U+0033 DIGIT THREE */ | ||
XK_4: 0x0034, | ||
/* U+0034 DIGIT FOUR */ | ||
XK_5: 0x0035, | ||
/* U+0035 DIGIT FIVE */ | ||
XK_6: 0x0036, | ||
/* U+0036 DIGIT SIX */ | ||
XK_7: 0x0037, | ||
/* U+0037 DIGIT SEVEN */ | ||
XK_8: 0x0038, | ||
/* U+0038 DIGIT EIGHT */ | ||
XK_9: 0x0039, | ||
/* U+0039 DIGIT NINE */ | ||
XK_colon: 0x003a, | ||
/* U+003A COLON */ | ||
XK_semicolon: 0x003b, | ||
/* U+003B SEMICOLON */ | ||
XK_less: 0x003c, | ||
/* U+003C LESS-THAN SIGN */ | ||
XK_equal: 0x003d, | ||
/* U+003D EQUALS SIGN */ | ||
XK_greater: 0x003e, | ||
/* U+003E GREATER-THAN SIGN */ | ||
XK_question: 0x003f, | ||
/* U+003F QUESTION MARK */ | ||
XK_at: 0x0040, | ||
/* U+0040 COMMERCIAL AT */ | ||
XK_A: 0x0041, | ||
/* U+0041 LATIN CAPITAL LETTER A */ | ||
XK_B: 0x0042, | ||
/* U+0042 LATIN CAPITAL LETTER B */ | ||
XK_C: 0x0043, | ||
/* U+0043 LATIN CAPITAL LETTER C */ | ||
XK_D: 0x0044, | ||
/* U+0044 LATIN CAPITAL LETTER D */ | ||
XK_E: 0x0045, | ||
/* U+0045 LATIN CAPITAL LETTER E */ | ||
XK_F: 0x0046, | ||
/* U+0046 LATIN CAPITAL LETTER F */ | ||
XK_G: 0x0047, | ||
/* U+0047 LATIN CAPITAL LETTER G */ | ||
XK_H: 0x0048, | ||
/* U+0048 LATIN CAPITAL LETTER H */ | ||
XK_I: 0x0049, | ||
/* U+0049 LATIN CAPITAL LETTER I */ | ||
XK_J: 0x004a, | ||
/* U+004A LATIN CAPITAL LETTER J */ | ||
XK_K: 0x004b, | ||
/* U+004B LATIN CAPITAL LETTER K */ | ||
XK_L: 0x004c, | ||
/* U+004C LATIN CAPITAL LETTER L */ | ||
XK_M: 0x004d, | ||
/* U+004D LATIN CAPITAL LETTER M */ | ||
XK_N: 0x004e, | ||
/* U+004E LATIN CAPITAL LETTER N */ | ||
XK_O: 0x004f, | ||
/* U+004F LATIN CAPITAL LETTER O */ | ||
XK_P: 0x0050, | ||
/* U+0050 LATIN CAPITAL LETTER P */ | ||
XK_Q: 0x0051, | ||
/* U+0051 LATIN CAPITAL LETTER Q */ | ||
XK_R: 0x0052, | ||
/* U+0052 LATIN CAPITAL LETTER R */ | ||
XK_S: 0x0053, | ||
/* U+0053 LATIN CAPITAL LETTER S */ | ||
XK_T: 0x0054, | ||
/* U+0054 LATIN CAPITAL LETTER T */ | ||
XK_U: 0x0055, | ||
/* U+0055 LATIN CAPITAL LETTER U */ | ||
XK_V: 0x0056, | ||
/* U+0056 LATIN CAPITAL LETTER V */ | ||
XK_W: 0x0057, | ||
/* U+0057 LATIN CAPITAL LETTER W */ | ||
XK_X: 0x0058, | ||
/* U+0058 LATIN CAPITAL LETTER X */ | ||
XK_Y: 0x0059, | ||
/* U+0059 LATIN CAPITAL LETTER Y */ | ||
XK_Z: 0x005a, | ||
/* U+005A LATIN CAPITAL LETTER Z */ | ||
XK_bracketleft: 0x005b, | ||
/* U+005B LEFT SQUARE BRACKET */ | ||
XK_backslash: 0x005c, | ||
/* U+005C REVERSE SOLIDUS */ | ||
XK_bracketright: 0x005d, | ||
/* U+005D RIGHT SQUARE BRACKET */ | ||
XK_asciicircum: 0x005e, | ||
/* U+005E CIRCUMFLEX ACCENT */ | ||
XK_underscore: 0x005f, | ||
/* U+005F LOW LINE */ | ||
XK_grave: 0x0060, | ||
/* U+0060 GRAVE ACCENT */ | ||
XK_quoteleft: 0x0060, | ||
/* deprecated */ | ||
XK_a: 0x0061, | ||
/* U+0061 LATIN SMALL LETTER A */ | ||
XK_b: 0x0062, | ||
/* U+0062 LATIN SMALL LETTER B */ | ||
XK_c: 0x0063, | ||
/* U+0063 LATIN SMALL LETTER C */ | ||
XK_d: 0x0064, | ||
/* U+0064 LATIN SMALL LETTER D */ | ||
XK_e: 0x0065, | ||
/* U+0065 LATIN SMALL LETTER E */ | ||
XK_f: 0x0066, | ||
/* U+0066 LATIN SMALL LETTER F */ | ||
XK_g: 0x0067, | ||
/* U+0067 LATIN SMALL LETTER G */ | ||
XK_h: 0x0068, | ||
/* U+0068 LATIN SMALL LETTER H */ | ||
XK_i: 0x0069, | ||
/* U+0069 LATIN SMALL LETTER I */ | ||
XK_j: 0x006a, | ||
/* U+006A LATIN SMALL LETTER J */ | ||
XK_k: 0x006b, | ||
/* U+006B LATIN SMALL LETTER K */ | ||
XK_l: 0x006c, | ||
/* U+006C LATIN SMALL LETTER L */ | ||
XK_m: 0x006d, | ||
/* U+006D LATIN SMALL LETTER M */ | ||
XK_n: 0x006e, | ||
/* U+006E LATIN SMALL LETTER N */ | ||
XK_o: 0x006f, | ||
/* U+006F LATIN SMALL LETTER O */ | ||
XK_p: 0x0070, | ||
/* U+0070 LATIN SMALL LETTER P */ | ||
XK_q: 0x0071, | ||
/* U+0071 LATIN SMALL LETTER Q */ | ||
XK_r: 0x0072, | ||
/* U+0072 LATIN SMALL LETTER R */ | ||
XK_s: 0x0073, | ||
/* U+0073 LATIN SMALL LETTER S */ | ||
XK_t: 0x0074, | ||
/* U+0074 LATIN SMALL LETTER T */ | ||
XK_u: 0x0075, | ||
/* U+0075 LATIN SMALL LETTER U */ | ||
XK_v: 0x0076, | ||
/* U+0076 LATIN SMALL LETTER V */ | ||
XK_w: 0x0077, | ||
/* U+0077 LATIN SMALL LETTER W */ | ||
XK_x: 0x0078, | ||
/* U+0078 LATIN SMALL LETTER X */ | ||
XK_y: 0x0079, | ||
/* U+0079 LATIN SMALL LETTER Y */ | ||
XK_z: 0x007a, | ||
/* U+007A LATIN SMALL LETTER Z */ | ||
XK_braceleft: 0x007b, | ||
/* U+007B LEFT CURLY BRACKET */ | ||
XK_bar: 0x007c, | ||
/* U+007C VERTICAL LINE */ | ||
XK_braceright: 0x007d, | ||
/* U+007D RIGHT CURLY BRACKET */ | ||
XK_asciitilde: 0x007e, | ||
/* U+007E TILDE */ | ||
XK_nobreakspace: 0x00a0, | ||
/* U+00A0 NO-BREAK SPACE */ | ||
XK_exclamdown: 0x00a1, | ||
/* U+00A1 INVERTED EXCLAMATION MARK */ | ||
XK_cent: 0x00a2, | ||
/* U+00A2 CENT SIGN */ | ||
XK_sterling: 0x00a3, | ||
/* U+00A3 POUND SIGN */ | ||
XK_currency: 0x00a4, | ||
/* U+00A4 CURRENCY SIGN */ | ||
XK_yen: 0x00a5, | ||
/* U+00A5 YEN SIGN */ | ||
XK_brokenbar: 0x00a6, | ||
/* U+00A6 BROKEN BAR */ | ||
XK_section: 0x00a7, | ||
/* U+00A7 SECTION SIGN */ | ||
XK_diaeresis: 0x00a8, | ||
/* U+00A8 DIAERESIS */ | ||
XK_copyright: 0x00a9, | ||
/* U+00A9 COPYRIGHT SIGN */ | ||
XK_ordfeminine: 0x00aa, | ||
/* U+00AA FEMININE ORDINAL INDICATOR */ | ||
XK_guillemotleft: 0x00ab, | ||
/* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ | ||
XK_notsign: 0x00ac, | ||
/* U+00AC NOT SIGN */ | ||
XK_hyphen: 0x00ad, | ||
/* U+00AD SOFT HYPHEN */ | ||
XK_registered: 0x00ae, | ||
/* U+00AE REGISTERED SIGN */ | ||
XK_macron: 0x00af, | ||
/* U+00AF MACRON */ | ||
XK_degree: 0x00b0, | ||
/* U+00B0 DEGREE SIGN */ | ||
XK_plusminus: 0x00b1, | ||
/* U+00B1 PLUS-MINUS SIGN */ | ||
XK_twosuperior: 0x00b2, | ||
/* U+00B2 SUPERSCRIPT TWO */ | ||
XK_threesuperior: 0x00b3, | ||
/* U+00B3 SUPERSCRIPT THREE */ | ||
XK_acute: 0x00b4, | ||
/* U+00B4 ACUTE ACCENT */ | ||
XK_mu: 0x00b5, | ||
/* U+00B5 MICRO SIGN */ | ||
XK_paragraph: 0x00b6, | ||
/* U+00B6 PILCROW SIGN */ | ||
XK_periodcentered: 0x00b7, | ||
/* U+00B7 MIDDLE DOT */ | ||
XK_cedilla: 0x00b8, | ||
/* U+00B8 CEDILLA */ | ||
XK_onesuperior: 0x00b9, | ||
/* U+00B9 SUPERSCRIPT ONE */ | ||
XK_masculine: 0x00ba, | ||
/* U+00BA MASCULINE ORDINAL INDICATOR */ | ||
XK_guillemotright: 0x00bb, | ||
/* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ | ||
XK_onequarter: 0x00bc, | ||
/* U+00BC VULGAR FRACTION ONE QUARTER */ | ||
XK_onehalf: 0x00bd, | ||
/* U+00BD VULGAR FRACTION ONE HALF */ | ||
XK_threequarters: 0x00be, | ||
/* U+00BE VULGAR FRACTION THREE QUARTERS */ | ||
XK_questiondown: 0x00bf, | ||
/* U+00BF INVERTED QUESTION MARK */ | ||
XK_Agrave: 0x00c0, | ||
/* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ | ||
XK_Aacute: 0x00c1, | ||
/* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ | ||
XK_Acircumflex: 0x00c2, | ||
/* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ | ||
XK_Atilde: 0x00c3, | ||
/* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ | ||
XK_Adiaeresis: 0x00c4, | ||
/* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ | ||
XK_Aring: 0x00c5, | ||
/* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ | ||
XK_AE: 0x00c6, | ||
/* U+00C6 LATIN CAPITAL LETTER AE */ | ||
XK_Ccedilla: 0x00c7, | ||
/* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ | ||
XK_Egrave: 0x00c8, | ||
/* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ | ||
XK_Eacute: 0x00c9, | ||
/* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ | ||
XK_Ecircumflex: 0x00ca, | ||
/* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ | ||
XK_Ediaeresis: 0x00cb, | ||
/* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ | ||
XK_Igrave: 0x00cc, | ||
/* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ | ||
XK_Iacute: 0x00cd, | ||
/* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ | ||
XK_Icircumflex: 0x00ce, | ||
/* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ | ||
XK_Idiaeresis: 0x00cf, | ||
/* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ | ||
XK_ETH: 0x00d0, | ||
/* U+00D0 LATIN CAPITAL LETTER ETH */ | ||
XK_Eth: 0x00d0, | ||
/* deprecated */ | ||
XK_Ntilde: 0x00d1, | ||
/* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ | ||
XK_Ograve: 0x00d2, | ||
/* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ | ||
XK_Oacute: 0x00d3, | ||
/* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ | ||
XK_Ocircumflex: 0x00d4, | ||
/* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ | ||
XK_Otilde: 0x00d5, | ||
/* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ | ||
XK_Odiaeresis: 0x00d6, | ||
/* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ | ||
XK_multiply: 0x00d7, | ||
/* U+00D7 MULTIPLICATION SIGN */ | ||
XK_Oslash: 0x00d8, | ||
/* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ | ||
XK_Ooblique: 0x00d8, | ||
/* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ | ||
XK_Ugrave: 0x00d9, | ||
/* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ | ||
XK_Uacute: 0x00da, | ||
/* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ | ||
XK_Ucircumflex: 0x00db, | ||
/* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ | ||
XK_Udiaeresis: 0x00dc, | ||
/* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ | ||
XK_Yacute: 0x00dd, | ||
/* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ | ||
XK_THORN: 0x00de, | ||
/* U+00DE LATIN CAPITAL LETTER THORN */ | ||
XK_Thorn: 0x00de, | ||
/* deprecated */ | ||
XK_ssharp: 0x00df, | ||
/* U+00DF LATIN SMALL LETTER SHARP S */ | ||
XK_agrave: 0x00e0, | ||
/* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ | ||
XK_aacute: 0x00e1, | ||
/* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ | ||
XK_acircumflex: 0x00e2, | ||
/* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ | ||
XK_atilde: 0x00e3, | ||
/* U+00E3 LATIN SMALL LETTER A WITH TILDE */ | ||
XK_adiaeresis: 0x00e4, | ||
/* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ | ||
XK_aring: 0x00e5, | ||
/* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ | ||
XK_ae: 0x00e6, | ||
/* U+00E6 LATIN SMALL LETTER AE */ | ||
XK_ccedilla: 0x00e7, | ||
/* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ | ||
XK_egrave: 0x00e8, | ||
/* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ | ||
XK_eacute: 0x00e9, | ||
/* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ | ||
XK_ecircumflex: 0x00ea, | ||
/* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ | ||
XK_ediaeresis: 0x00eb, | ||
/* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ | ||
XK_igrave: 0x00ec, | ||
/* U+00EC LATIN SMALL LETTER I WITH GRAVE */ | ||
XK_iacute: 0x00ed, | ||
/* U+00ED LATIN SMALL LETTER I WITH ACUTE */ | ||
XK_icircumflex: 0x00ee, | ||
/* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ | ||
XK_idiaeresis: 0x00ef, | ||
/* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ | ||
XK_eth: 0x00f0, | ||
/* U+00F0 LATIN SMALL LETTER ETH */ | ||
XK_ntilde: 0x00f1, | ||
/* U+00F1 LATIN SMALL LETTER N WITH TILDE */ | ||
XK_ograve: 0x00f2, | ||
/* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ | ||
XK_oacute: 0x00f3, | ||
/* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ | ||
XK_ocircumflex: 0x00f4, | ||
/* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ | ||
XK_otilde: 0x00f5, | ||
/* U+00F5 LATIN SMALL LETTER O WITH TILDE */ | ||
XK_odiaeresis: 0x00f6, | ||
/* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ | ||
XK_division: 0x00f7, | ||
/* U+00F7 DIVISION SIGN */ | ||
XK_oslash: 0x00f8, | ||
/* U+00F8 LATIN SMALL LETTER O WITH STROKE */ | ||
XK_ooblique: 0x00f8, | ||
/* U+00F8 LATIN SMALL LETTER O WITH STROKE */ | ||
XK_ugrave: 0x00f9, | ||
/* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ | ||
XK_uacute: 0x00fa, | ||
/* U+00FA LATIN SMALL LETTER U WITH ACUTE */ | ||
XK_ucircumflex: 0x00fb, | ||
/* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ | ||
XK_udiaeresis: 0x00fc, | ||
/* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ | ||
XK_yacute: 0x00fd, | ||
/* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ | ||
XK_thorn: 0x00fe, | ||
/* U+00FE LATIN SMALL LETTER THORN */ | ||
XK_ydiaeresis: 0x00ff, | ||
/* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ | ||
/* | ||
@@ -439,7 +949,12 @@ * Korean | ||
*/ | ||
XK_Hangul: 0xff31, | ||
XK_Hangul: 0xff31, /* Hangul start/stop(toggle) */ | ||
XK_Hangul_Hanja: 0xff34, /* Start Hangul->Hanja Conversion */ | ||
XK_Hangul_Jeonja: 0xff38, /* Jeonja mode */ | ||
/* Hangul start/stop(toggle) */ | ||
XK_Hangul_Hanja: 0xff34, | ||
/* Start Hangul->Hanja Conversion */ | ||
XK_Hangul_Jeonja: 0xff38, | ||
/* Jeonja mode */ | ||
/* | ||
@@ -450,3 +965,2 @@ * XFree86 vendor specific keysyms. | ||
*/ | ||
XF86XK_ModeLock: 0x1008FF01, | ||
@@ -629,2 +1143,3 @@ XF86XK_MonBrightnessUp: 0x1008FF02, | ||
XF86XK_LogGrabInfo: 0x1008FE25 | ||
}; | ||
}; | ||
exports["default"] = _default; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
/* | ||
@@ -14,681 +16,1340 @@ * Mapping from Unicode codepoints to X11/RFB keysyms | ||
/* Functions at the bottom */ | ||
var codepoints = { | ||
0x0100: 0x03c0, | ||
// XK_Amacron | ||
0x0101: 0x03e0, | ||
// XK_amacron | ||
0x0102: 0x01c3, | ||
// XK_Abreve | ||
0x0103: 0x01e3, | ||
// XK_abreve | ||
0x0104: 0x01a1, | ||
// XK_Aogonek | ||
0x0105: 0x01b1, | ||
// XK_aogonek | ||
0x0106: 0x01c6, | ||
// XK_Cacute | ||
0x0107: 0x01e6, | ||
// XK_cacute | ||
0x0108: 0x02c6, | ||
// XK_Ccircumflex | ||
0x0109: 0x02e6, | ||
// XK_ccircumflex | ||
0x010a: 0x02c5, | ||
// XK_Cabovedot | ||
0x010b: 0x02e5, | ||
// XK_cabovedot | ||
0x010c: 0x01c8, | ||
// XK_Ccaron | ||
0x010d: 0x01e8, | ||
// XK_ccaron | ||
0x010e: 0x01cf, | ||
// XK_Dcaron | ||
0x010f: 0x01ef, | ||
// XK_dcaron | ||
0x0110: 0x01d0, | ||
// XK_Dstroke | ||
0x0111: 0x01f0, | ||
// XK_dstroke | ||
0x0112: 0x03aa, | ||
// XK_Emacron | ||
0x0113: 0x03ba, | ||
// XK_emacron | ||
0x0116: 0x03cc, | ||
// XK_Eabovedot | ||
0x0117: 0x03ec, | ||
// XK_eabovedot | ||
0x0118: 0x01ca, | ||
// XK_Eogonek | ||
0x0119: 0x01ea, | ||
// XK_eogonek | ||
0x011a: 0x01cc, | ||
// XK_Ecaron | ||
0x011b: 0x01ec, | ||
// XK_ecaron | ||
0x011c: 0x02d8, | ||
// XK_Gcircumflex | ||
0x011d: 0x02f8, | ||
// XK_gcircumflex | ||
0x011e: 0x02ab, | ||
// XK_Gbreve | ||
0x011f: 0x02bb, | ||
// XK_gbreve | ||
0x0120: 0x02d5, | ||
// XK_Gabovedot | ||
0x0121: 0x02f5, | ||
// XK_gabovedot | ||
0x0122: 0x03ab, | ||
// XK_Gcedilla | ||
0x0123: 0x03bb, | ||
// XK_gcedilla | ||
0x0124: 0x02a6, | ||
// XK_Hcircumflex | ||
0x0125: 0x02b6, | ||
// XK_hcircumflex | ||
0x0126: 0x02a1, | ||
// XK_Hstroke | ||
0x0127: 0x02b1, | ||
// XK_hstroke | ||
0x0128: 0x03a5, | ||
// XK_Itilde | ||
0x0129: 0x03b5, | ||
// XK_itilde | ||
0x012a: 0x03cf, | ||
// XK_Imacron | ||
0x012b: 0x03ef, | ||
// XK_imacron | ||
0x012e: 0x03c7, | ||
// XK_Iogonek | ||
0x012f: 0x03e7, | ||
// XK_iogonek | ||
0x0130: 0x02a9, | ||
// XK_Iabovedot | ||
0x0131: 0x02b9, | ||
// XK_idotless | ||
0x0134: 0x02ac, | ||
// XK_Jcircumflex | ||
0x0135: 0x02bc, | ||
// XK_jcircumflex | ||
0x0136: 0x03d3, | ||
// XK_Kcedilla | ||
0x0137: 0x03f3, | ||
// XK_kcedilla | ||
0x0138: 0x03a2, | ||
// XK_kra | ||
0x0139: 0x01c5, | ||
// XK_Lacute | ||
0x013a: 0x01e5, | ||
// XK_lacute | ||
0x013b: 0x03a6, | ||
// XK_Lcedilla | ||
0x013c: 0x03b6, | ||
// XK_lcedilla | ||
0x013d: 0x01a5, | ||
// XK_Lcaron | ||
0x013e: 0x01b5, | ||
// XK_lcaron | ||
0x0141: 0x01a3, | ||
// XK_Lstroke | ||
0x0142: 0x01b3, | ||
// XK_lstroke | ||
0x0143: 0x01d1, | ||
// XK_Nacute | ||
0x0144: 0x01f1, | ||
// XK_nacute | ||
0x0145: 0x03d1, | ||
// XK_Ncedilla | ||
0x0146: 0x03f1, | ||
// XK_ncedilla | ||
0x0147: 0x01d2, | ||
// XK_Ncaron | ||
0x0148: 0x01f2, | ||
// XK_ncaron | ||
0x014a: 0x03bd, | ||
// XK_ENG | ||
0x014b: 0x03bf, | ||
// XK_eng | ||
0x014c: 0x03d2, | ||
// XK_Omacron | ||
0x014d: 0x03f2, | ||
// XK_omacron | ||
0x0150: 0x01d5, | ||
// XK_Odoubleacute | ||
0x0151: 0x01f5, | ||
// XK_odoubleacute | ||
0x0152: 0x13bc, | ||
// XK_OE | ||
0x0153: 0x13bd, | ||
// XK_oe | ||
0x0154: 0x01c0, | ||
// XK_Racute | ||
0x0155: 0x01e0, | ||
// XK_racute | ||
0x0156: 0x03a3, | ||
// XK_Rcedilla | ||
0x0157: 0x03b3, | ||
// XK_rcedilla | ||
0x0158: 0x01d8, | ||
// XK_Rcaron | ||
0x0159: 0x01f8, | ||
// XK_rcaron | ||
0x015a: 0x01a6, | ||
// XK_Sacute | ||
0x015b: 0x01b6, | ||
// XK_sacute | ||
0x015c: 0x02de, | ||
// XK_Scircumflex | ||
0x015d: 0x02fe, | ||
// XK_scircumflex | ||
0x015e: 0x01aa, | ||
// XK_Scedilla | ||
0x015f: 0x01ba, | ||
// XK_scedilla | ||
0x0160: 0x01a9, | ||
// XK_Scaron | ||
0x0161: 0x01b9, | ||
// XK_scaron | ||
0x0162: 0x01de, | ||
// XK_Tcedilla | ||
0x0163: 0x01fe, | ||
// XK_tcedilla | ||
0x0164: 0x01ab, | ||
// XK_Tcaron | ||
0x0165: 0x01bb, | ||
// XK_tcaron | ||
0x0166: 0x03ac, | ||
// XK_Tslash | ||
0x0167: 0x03bc, | ||
// XK_tslash | ||
0x0168: 0x03dd, | ||
// XK_Utilde | ||
0x0169: 0x03fd, | ||
// XK_utilde | ||
0x016a: 0x03de, | ||
// XK_Umacron | ||
0x016b: 0x03fe, | ||
// XK_umacron | ||
0x016c: 0x02dd, | ||
// XK_Ubreve | ||
0x016d: 0x02fd, | ||
// XK_ubreve | ||
0x016e: 0x01d9, | ||
// XK_Uring | ||
0x016f: 0x01f9, | ||
// XK_uring | ||
0x0170: 0x01db, | ||
// XK_Udoubleacute | ||
0x0171: 0x01fb, | ||
// XK_udoubleacute | ||
0x0172: 0x03d9, | ||
// XK_Uogonek | ||
0x0173: 0x03f9, | ||
// XK_uogonek | ||
0x0178: 0x13be, | ||
// XK_Ydiaeresis | ||
0x0179: 0x01ac, | ||
// XK_Zacute | ||
0x017a: 0x01bc, | ||
// XK_zacute | ||
0x017b: 0x01af, | ||
// XK_Zabovedot | ||
0x017c: 0x01bf, | ||
// XK_zabovedot | ||
0x017d: 0x01ae, | ||
// XK_Zcaron | ||
0x017e: 0x01be, | ||
// XK_zcaron | ||
0x0192: 0x08f6, | ||
// XK_function | ||
0x01d2: 0x10001d1, | ||
// XK_Ocaron | ||
0x02c7: 0x01b7, | ||
// XK_caron | ||
0x02d8: 0x01a2, | ||
// XK_breve | ||
0x02d9: 0x01ff, | ||
// XK_abovedot | ||
0x02db: 0x01b2, | ||
// XK_ogonek | ||
0x02dd: 0x01bd, | ||
// XK_doubleacute | ||
0x0385: 0x07ae, | ||
// XK_Greek_accentdieresis | ||
0x0386: 0x07a1, | ||
// XK_Greek_ALPHAaccent | ||
0x0388: 0x07a2, | ||
// XK_Greek_EPSILONaccent | ||
0x0389: 0x07a3, | ||
// XK_Greek_ETAaccent | ||
0x038a: 0x07a4, | ||
// XK_Greek_IOTAaccent | ||
0x038c: 0x07a7, | ||
// XK_Greek_OMICRONaccent | ||
0x038e: 0x07a8, | ||
// XK_Greek_UPSILONaccent | ||
0x038f: 0x07ab, | ||
// XK_Greek_OMEGAaccent | ||
0x0390: 0x07b6, | ||
// XK_Greek_iotaaccentdieresis | ||
0x0391: 0x07c1, | ||
// XK_Greek_ALPHA | ||
0x0392: 0x07c2, | ||
// XK_Greek_BETA | ||
0x0393: 0x07c3, | ||
// XK_Greek_GAMMA | ||
0x0394: 0x07c4, | ||
// XK_Greek_DELTA | ||
0x0395: 0x07c5, | ||
// XK_Greek_EPSILON | ||
0x0396: 0x07c6, | ||
// XK_Greek_ZETA | ||
0x0397: 0x07c7, | ||
// XK_Greek_ETA | ||
0x0398: 0x07c8, | ||
// XK_Greek_THETA | ||
0x0399: 0x07c9, | ||
// XK_Greek_IOTA | ||
0x039a: 0x07ca, | ||
// XK_Greek_KAPPA | ||
0x039b: 0x07cb, | ||
// XK_Greek_LAMDA | ||
0x039c: 0x07cc, | ||
// XK_Greek_MU | ||
0x039d: 0x07cd, | ||
// XK_Greek_NU | ||
0x039e: 0x07ce, | ||
// XK_Greek_XI | ||
0x039f: 0x07cf, | ||
// XK_Greek_OMICRON | ||
0x03a0: 0x07d0, | ||
// XK_Greek_PI | ||
0x03a1: 0x07d1, | ||
// XK_Greek_RHO | ||
0x03a3: 0x07d2, | ||
// XK_Greek_SIGMA | ||
0x03a4: 0x07d4, | ||
// XK_Greek_TAU | ||
0x03a5: 0x07d5, | ||
// XK_Greek_UPSILON | ||
0x03a6: 0x07d6, | ||
// XK_Greek_PHI | ||
0x03a7: 0x07d7, | ||
// XK_Greek_CHI | ||
0x03a8: 0x07d8, | ||
// XK_Greek_PSI | ||
0x03a9: 0x07d9, | ||
// XK_Greek_OMEGA | ||
0x03aa: 0x07a5, | ||
// XK_Greek_IOTAdieresis | ||
0x03ab: 0x07a9, | ||
// XK_Greek_UPSILONdieresis | ||
0x03ac: 0x07b1, | ||
// XK_Greek_alphaaccent | ||
0x03ad: 0x07b2, | ||
// XK_Greek_epsilonaccent | ||
0x03ae: 0x07b3, | ||
// XK_Greek_etaaccent | ||
0x03af: 0x07b4, | ||
// XK_Greek_iotaaccent | ||
0x03b0: 0x07ba, | ||
// XK_Greek_upsilonaccentdieresis | ||
0x03b1: 0x07e1, | ||
// XK_Greek_alpha | ||
0x03b2: 0x07e2, | ||
// XK_Greek_beta | ||
0x03b3: 0x07e3, | ||
// XK_Greek_gamma | ||
0x03b4: 0x07e4, | ||
// XK_Greek_delta | ||
0x03b5: 0x07e5, | ||
// XK_Greek_epsilon | ||
0x03b6: 0x07e6, | ||
// XK_Greek_zeta | ||
0x03b7: 0x07e7, | ||
// XK_Greek_eta | ||
0x03b8: 0x07e8, | ||
// XK_Greek_theta | ||
0x03b9: 0x07e9, | ||
// XK_Greek_iota | ||
0x03ba: 0x07ea, | ||
// XK_Greek_kappa | ||
0x03bb: 0x07eb, | ||
// XK_Greek_lamda | ||
0x03bc: 0x07ec, | ||
// XK_Greek_mu | ||
0x03bd: 0x07ed, | ||
// XK_Greek_nu | ||
0x03be: 0x07ee, | ||
// XK_Greek_xi | ||
0x03bf: 0x07ef, | ||
// XK_Greek_omicron | ||
0x03c0: 0x07f0, | ||
// XK_Greek_pi | ||
0x03c1: 0x07f1, | ||
// XK_Greek_rho | ||
0x03c2: 0x07f3, | ||
// XK_Greek_finalsmallsigma | ||
0x03c3: 0x07f2, | ||
// XK_Greek_sigma | ||
0x03c4: 0x07f4, | ||
// XK_Greek_tau | ||
0x03c5: 0x07f5, | ||
// XK_Greek_upsilon | ||
0x03c6: 0x07f6, | ||
// XK_Greek_phi | ||
0x03c7: 0x07f7, | ||
// XK_Greek_chi | ||
0x03c8: 0x07f8, | ||
// XK_Greek_psi | ||
0x03c9: 0x07f9, | ||
// XK_Greek_omega | ||
0x03ca: 0x07b5, | ||
// XK_Greek_iotadieresis | ||
0x03cb: 0x07b9, | ||
// XK_Greek_upsilondieresis | ||
0x03cc: 0x07b7, | ||
// XK_Greek_omicronaccent | ||
0x03cd: 0x07b8, | ||
// XK_Greek_upsilonaccent | ||
0x03ce: 0x07bb, | ||
// XK_Greek_omegaaccent | ||
0x0401: 0x06b3, | ||
// XK_Cyrillic_IO | ||
0x0402: 0x06b1, | ||
// XK_Serbian_DJE | ||
0x0403: 0x06b2, | ||
// XK_Macedonia_GJE | ||
0x0404: 0x06b4, | ||
// XK_Ukrainian_IE | ||
0x0405: 0x06b5, | ||
// XK_Macedonia_DSE | ||
0x0406: 0x06b6, | ||
// XK_Ukrainian_I | ||
0x0407: 0x06b7, | ||
// XK_Ukrainian_YI | ||
0x0408: 0x06b8, | ||
// XK_Cyrillic_JE | ||
0x0409: 0x06b9, | ||
// XK_Cyrillic_LJE | ||
0x040a: 0x06ba, | ||
// XK_Cyrillic_NJE | ||
0x040b: 0x06bb, | ||
// XK_Serbian_TSHE | ||
0x040c: 0x06bc, | ||
// XK_Macedonia_KJE | ||
0x040e: 0x06be, | ||
// XK_Byelorussian_SHORTU | ||
0x040f: 0x06bf, | ||
// XK_Cyrillic_DZHE | ||
0x0410: 0x06e1, | ||
// XK_Cyrillic_A | ||
0x0411: 0x06e2, | ||
// XK_Cyrillic_BE | ||
0x0412: 0x06f7, | ||
// XK_Cyrillic_VE | ||
0x0413: 0x06e7, | ||
// XK_Cyrillic_GHE | ||
0x0414: 0x06e4, | ||
// XK_Cyrillic_DE | ||
0x0415: 0x06e5, | ||
// XK_Cyrillic_IE | ||
0x0416: 0x06f6, | ||
// XK_Cyrillic_ZHE | ||
0x0417: 0x06fa, | ||
// XK_Cyrillic_ZE | ||
0x0418: 0x06e9, | ||
// XK_Cyrillic_I | ||
0x0419: 0x06ea, | ||
// XK_Cyrillic_SHORTI | ||
0x041a: 0x06eb, | ||
// XK_Cyrillic_KA | ||
0x041b: 0x06ec, | ||
// XK_Cyrillic_EL | ||
0x041c: 0x06ed, | ||
// XK_Cyrillic_EM | ||
0x041d: 0x06ee, | ||
// XK_Cyrillic_EN | ||
0x041e: 0x06ef, | ||
// XK_Cyrillic_O | ||
0x041f: 0x06f0, | ||
// XK_Cyrillic_PE | ||
0x0420: 0x06f2, | ||
// XK_Cyrillic_ER | ||
0x0421: 0x06f3, | ||
// XK_Cyrillic_ES | ||
0x0422: 0x06f4, | ||
// XK_Cyrillic_TE | ||
0x0423: 0x06f5, | ||
// XK_Cyrillic_U | ||
0x0424: 0x06e6, | ||
// XK_Cyrillic_EF | ||
0x0425: 0x06e8, | ||
// XK_Cyrillic_HA | ||
0x0426: 0x06e3, | ||
// XK_Cyrillic_TSE | ||
0x0427: 0x06fe, | ||
// XK_Cyrillic_CHE | ||
0x0428: 0x06fb, | ||
// XK_Cyrillic_SHA | ||
0x0429: 0x06fd, | ||
// XK_Cyrillic_SHCHA | ||
0x042a: 0x06ff, | ||
// XK_Cyrillic_HARDSIGN | ||
0x042b: 0x06f9, | ||
// XK_Cyrillic_YERU | ||
0x042c: 0x06f8, | ||
// XK_Cyrillic_SOFTSIGN | ||
0x042d: 0x06fc, | ||
// XK_Cyrillic_E | ||
0x042e: 0x06e0, | ||
// XK_Cyrillic_YU | ||
0x042f: 0x06f1, | ||
// XK_Cyrillic_YA | ||
0x0430: 0x06c1, | ||
// XK_Cyrillic_a | ||
0x0431: 0x06c2, | ||
// XK_Cyrillic_be | ||
0x0432: 0x06d7, | ||
// XK_Cyrillic_ve | ||
0x0433: 0x06c7, | ||
// XK_Cyrillic_ghe | ||
0x0434: 0x06c4, | ||
// XK_Cyrillic_de | ||
0x0435: 0x06c5, | ||
// XK_Cyrillic_ie | ||
0x0436: 0x06d6, | ||
// XK_Cyrillic_zhe | ||
0x0437: 0x06da, | ||
// XK_Cyrillic_ze | ||
0x0438: 0x06c9, | ||
// XK_Cyrillic_i | ||
0x0439: 0x06ca, | ||
// XK_Cyrillic_shorti | ||
0x043a: 0x06cb, | ||
// XK_Cyrillic_ka | ||
0x043b: 0x06cc, | ||
// XK_Cyrillic_el | ||
0x043c: 0x06cd, | ||
// XK_Cyrillic_em | ||
0x043d: 0x06ce, | ||
// XK_Cyrillic_en | ||
0x043e: 0x06cf, | ||
// XK_Cyrillic_o | ||
0x043f: 0x06d0, | ||
// XK_Cyrillic_pe | ||
0x0440: 0x06d2, | ||
// XK_Cyrillic_er | ||
0x0441: 0x06d3, | ||
// XK_Cyrillic_es | ||
0x0442: 0x06d4, | ||
// XK_Cyrillic_te | ||
0x0443: 0x06d5, | ||
// XK_Cyrillic_u | ||
0x0444: 0x06c6, | ||
// XK_Cyrillic_ef | ||
0x0445: 0x06c8, | ||
// XK_Cyrillic_ha | ||
0x0446: 0x06c3, | ||
// XK_Cyrillic_tse | ||
0x0447: 0x06de, | ||
// XK_Cyrillic_che | ||
0x0448: 0x06db, | ||
// XK_Cyrillic_sha | ||
0x0449: 0x06dd, | ||
// XK_Cyrillic_shcha | ||
0x044a: 0x06df, | ||
// XK_Cyrillic_hardsign | ||
0x044b: 0x06d9, | ||
// XK_Cyrillic_yeru | ||
0x044c: 0x06d8, | ||
// XK_Cyrillic_softsign | ||
0x044d: 0x06dc, | ||
// XK_Cyrillic_e | ||
0x044e: 0x06c0, | ||
// XK_Cyrillic_yu | ||
0x044f: 0x06d1, | ||
// XK_Cyrillic_ya | ||
0x0451: 0x06a3, | ||
// XK_Cyrillic_io | ||
0x0452: 0x06a1, | ||
// XK_Serbian_dje | ||
0x0453: 0x06a2, | ||
// XK_Macedonia_gje | ||
0x0454: 0x06a4, | ||
// XK_Ukrainian_ie | ||
0x0455: 0x06a5, | ||
// XK_Macedonia_dse | ||
0x0456: 0x06a6, | ||
// XK_Ukrainian_i | ||
0x0457: 0x06a7, | ||
// XK_Ukrainian_yi | ||
0x0458: 0x06a8, | ||
// XK_Cyrillic_je | ||
0x0459: 0x06a9, | ||
// XK_Cyrillic_lje | ||
0x045a: 0x06aa, | ||
// XK_Cyrillic_nje | ||
0x045b: 0x06ab, | ||
// XK_Serbian_tshe | ||
0x045c: 0x06ac, | ||
// XK_Macedonia_kje | ||
0x045e: 0x06ae, | ||
// XK_Byelorussian_shortu | ||
0x045f: 0x06af, | ||
// XK_Cyrillic_dzhe | ||
0x0490: 0x06bd, | ||
// XK_Ukrainian_GHE_WITH_UPTURN | ||
0x0491: 0x06ad, | ||
// XK_Ukrainian_ghe_with_upturn | ||
0x05d0: 0x0ce0, | ||
// XK_hebrew_aleph | ||
0x05d1: 0x0ce1, | ||
// XK_hebrew_bet | ||
0x05d2: 0x0ce2, | ||
// XK_hebrew_gimel | ||
0x05d3: 0x0ce3, | ||
// XK_hebrew_dalet | ||
0x05d4: 0x0ce4, | ||
// XK_hebrew_he | ||
0x05d5: 0x0ce5, | ||
// XK_hebrew_waw | ||
0x05d6: 0x0ce6, | ||
// XK_hebrew_zain | ||
0x05d7: 0x0ce7, | ||
// XK_hebrew_chet | ||
0x05d8: 0x0ce8, | ||
// XK_hebrew_tet | ||
0x05d9: 0x0ce9, | ||
// XK_hebrew_yod | ||
0x05da: 0x0cea, | ||
// XK_hebrew_finalkaph | ||
0x05db: 0x0ceb, | ||
// XK_hebrew_kaph | ||
0x05dc: 0x0cec, | ||
// XK_hebrew_lamed | ||
0x05dd: 0x0ced, | ||
// XK_hebrew_finalmem | ||
0x05de: 0x0cee, | ||
// XK_hebrew_mem | ||
0x05df: 0x0cef, | ||
// XK_hebrew_finalnun | ||
0x05e0: 0x0cf0, | ||
// XK_hebrew_nun | ||
0x05e1: 0x0cf1, | ||
// XK_hebrew_samech | ||
0x05e2: 0x0cf2, | ||
// XK_hebrew_ayin | ||
0x05e3: 0x0cf3, | ||
// XK_hebrew_finalpe | ||
0x05e4: 0x0cf4, | ||
// XK_hebrew_pe | ||
0x05e5: 0x0cf5, | ||
// XK_hebrew_finalzade | ||
0x05e6: 0x0cf6, | ||
// XK_hebrew_zade | ||
0x05e7: 0x0cf7, | ||
// XK_hebrew_qoph | ||
0x05e8: 0x0cf8, | ||
// XK_hebrew_resh | ||
0x05e9: 0x0cf9, | ||
// XK_hebrew_shin | ||
0x05ea: 0x0cfa, | ||
// XK_hebrew_taw | ||
0x060c: 0x05ac, | ||
// XK_Arabic_comma | ||
0x061b: 0x05bb, | ||
// XK_Arabic_semicolon | ||
0x061f: 0x05bf, | ||
// XK_Arabic_question_mark | ||
0x0621: 0x05c1, | ||
// XK_Arabic_hamza | ||
0x0622: 0x05c2, | ||
// XK_Arabic_maddaonalef | ||
0x0623: 0x05c3, | ||
// XK_Arabic_hamzaonalef | ||
0x0624: 0x05c4, | ||
// XK_Arabic_hamzaonwaw | ||
0x0625: 0x05c5, | ||
// XK_Arabic_hamzaunderalef | ||
0x0626: 0x05c6, | ||
// XK_Arabic_hamzaonyeh | ||
0x0627: 0x05c7, | ||
// XK_Arabic_alef | ||
0x0628: 0x05c8, | ||
// XK_Arabic_beh | ||
0x0629: 0x05c9, | ||
// XK_Arabic_tehmarbuta | ||
0x062a: 0x05ca, | ||
// XK_Arabic_teh | ||
0x062b: 0x05cb, | ||
// XK_Arabic_theh | ||
0x062c: 0x05cc, | ||
// XK_Arabic_jeem | ||
0x062d: 0x05cd, | ||
// XK_Arabic_hah | ||
0x062e: 0x05ce, | ||
// XK_Arabic_khah | ||
0x062f: 0x05cf, | ||
// XK_Arabic_dal | ||
0x0630: 0x05d0, | ||
// XK_Arabic_thal | ||
0x0631: 0x05d1, | ||
// XK_Arabic_ra | ||
0x0632: 0x05d2, | ||
// XK_Arabic_zain | ||
0x0633: 0x05d3, | ||
// XK_Arabic_seen | ||
0x0634: 0x05d4, | ||
// XK_Arabic_sheen | ||
0x0635: 0x05d5, | ||
// XK_Arabic_sad | ||
0x0636: 0x05d6, | ||
// XK_Arabic_dad | ||
0x0637: 0x05d7, | ||
// XK_Arabic_tah | ||
0x0638: 0x05d8, | ||
// XK_Arabic_zah | ||
0x0639: 0x05d9, | ||
// XK_Arabic_ain | ||
0x063a: 0x05da, | ||
// XK_Arabic_ghain | ||
0x0640: 0x05e0, | ||
// XK_Arabic_tatweel | ||
0x0641: 0x05e1, | ||
// XK_Arabic_feh | ||
0x0642: 0x05e2, | ||
// XK_Arabic_qaf | ||
0x0643: 0x05e3, | ||
// XK_Arabic_kaf | ||
0x0644: 0x05e4, | ||
// XK_Arabic_lam | ||
0x0645: 0x05e5, | ||
// XK_Arabic_meem | ||
0x0646: 0x05e6, | ||
// XK_Arabic_noon | ||
0x0647: 0x05e7, | ||
// XK_Arabic_ha | ||
0x0648: 0x05e8, | ||
// XK_Arabic_waw | ||
0x0649: 0x05e9, | ||
// XK_Arabic_alefmaksura | ||
0x064a: 0x05ea, | ||
// XK_Arabic_yeh | ||
0x064b: 0x05eb, | ||
// XK_Arabic_fathatan | ||
0x064c: 0x05ec, | ||
// XK_Arabic_dammatan | ||
0x064d: 0x05ed, | ||
// XK_Arabic_kasratan | ||
0x064e: 0x05ee, | ||
// XK_Arabic_fatha | ||
0x064f: 0x05ef, | ||
// XK_Arabic_damma | ||
0x0650: 0x05f0, | ||
// XK_Arabic_kasra | ||
0x0651: 0x05f1, | ||
// XK_Arabic_shadda | ||
0x0652: 0x05f2, | ||
// XK_Arabic_sukun | ||
0x0e01: 0x0da1, | ||
// XK_Thai_kokai | ||
0x0e02: 0x0da2, | ||
// XK_Thai_khokhai | ||
0x0e03: 0x0da3, | ||
// XK_Thai_khokhuat | ||
0x0e04: 0x0da4, | ||
// XK_Thai_khokhwai | ||
0x0e05: 0x0da5, | ||
// XK_Thai_khokhon | ||
0x0e06: 0x0da6, | ||
// XK_Thai_khorakhang | ||
0x0e07: 0x0da7, | ||
// XK_Thai_ngongu | ||
0x0e08: 0x0da8, | ||
// XK_Thai_chochan | ||
0x0e09: 0x0da9, | ||
// XK_Thai_choching | ||
0x0e0a: 0x0daa, | ||
// XK_Thai_chochang | ||
0x0e0b: 0x0dab, | ||
// XK_Thai_soso | ||
0x0e0c: 0x0dac, | ||
// XK_Thai_chochoe | ||
0x0e0d: 0x0dad, | ||
// XK_Thai_yoying | ||
0x0e0e: 0x0dae, | ||
// XK_Thai_dochada | ||
0x0e0f: 0x0daf, | ||
// XK_Thai_topatak | ||
0x0e10: 0x0db0, | ||
// XK_Thai_thothan | ||
0x0e11: 0x0db1, | ||
// XK_Thai_thonangmontho | ||
0x0e12: 0x0db2, | ||
// XK_Thai_thophuthao | ||
0x0e13: 0x0db3, | ||
// XK_Thai_nonen | ||
0x0e14: 0x0db4, | ||
// XK_Thai_dodek | ||
0x0e15: 0x0db5, | ||
// XK_Thai_totao | ||
0x0e16: 0x0db6, | ||
// XK_Thai_thothung | ||
0x0e17: 0x0db7, | ||
// XK_Thai_thothahan | ||
0x0e18: 0x0db8, | ||
// XK_Thai_thothong | ||
0x0e19: 0x0db9, | ||
// XK_Thai_nonu | ||
0x0e1a: 0x0dba, | ||
// XK_Thai_bobaimai | ||
0x0e1b: 0x0dbb, | ||
// XK_Thai_popla | ||
0x0e1c: 0x0dbc, | ||
// XK_Thai_phophung | ||
0x0e1d: 0x0dbd, | ||
// XK_Thai_fofa | ||
0x0e1e: 0x0dbe, | ||
// XK_Thai_phophan | ||
0x0e1f: 0x0dbf, | ||
// XK_Thai_fofan | ||
0x0e20: 0x0dc0, | ||
// XK_Thai_phosamphao | ||
0x0e21: 0x0dc1, | ||
// XK_Thai_moma | ||
0x0e22: 0x0dc2, | ||
// XK_Thai_yoyak | ||
0x0e23: 0x0dc3, | ||
// XK_Thai_rorua | ||
0x0e24: 0x0dc4, | ||
// XK_Thai_ru | ||
0x0e25: 0x0dc5, | ||
// XK_Thai_loling | ||
0x0e26: 0x0dc6, | ||
// XK_Thai_lu | ||
0x0e27: 0x0dc7, | ||
// XK_Thai_wowaen | ||
0x0e28: 0x0dc8, | ||
// XK_Thai_sosala | ||
0x0e29: 0x0dc9, | ||
// XK_Thai_sorusi | ||
0x0e2a: 0x0dca, | ||
// XK_Thai_sosua | ||
0x0e2b: 0x0dcb, | ||
// XK_Thai_hohip | ||
0x0e2c: 0x0dcc, | ||
// XK_Thai_lochula | ||
0x0e2d: 0x0dcd, | ||
// XK_Thai_oang | ||
0x0e2e: 0x0dce, | ||
// XK_Thai_honokhuk | ||
0x0e2f: 0x0dcf, | ||
// XK_Thai_paiyannoi | ||
0x0e30: 0x0dd0, | ||
// XK_Thai_saraa | ||
0x0e31: 0x0dd1, | ||
// XK_Thai_maihanakat | ||
0x0e32: 0x0dd2, | ||
// XK_Thai_saraaa | ||
0x0e33: 0x0dd3, | ||
// XK_Thai_saraam | ||
0x0e34: 0x0dd4, | ||
// XK_Thai_sarai | ||
0x0e35: 0x0dd5, | ||
// XK_Thai_saraii | ||
0x0e36: 0x0dd6, | ||
// XK_Thai_saraue | ||
0x0e37: 0x0dd7, | ||
// XK_Thai_sarauee | ||
0x0e38: 0x0dd8, | ||
// XK_Thai_sarau | ||
0x0e39: 0x0dd9, | ||
// XK_Thai_sarauu | ||
0x0e3a: 0x0dda, | ||
// XK_Thai_phinthu | ||
0x0e3f: 0x0ddf, | ||
// XK_Thai_baht | ||
0x0e40: 0x0de0, | ||
// XK_Thai_sarae | ||
0x0e41: 0x0de1, | ||
// XK_Thai_saraae | ||
0x0e42: 0x0de2, | ||
// XK_Thai_sarao | ||
0x0e43: 0x0de3, | ||
// XK_Thai_saraaimaimuan | ||
0x0e44: 0x0de4, | ||
// XK_Thai_saraaimaimalai | ||
0x0e45: 0x0de5, | ||
// XK_Thai_lakkhangyao | ||
0x0e46: 0x0de6, | ||
// XK_Thai_maiyamok | ||
0x0e47: 0x0de7, | ||
// XK_Thai_maitaikhu | ||
0x0e48: 0x0de8, | ||
// XK_Thai_maiek | ||
0x0e49: 0x0de9, | ||
// XK_Thai_maitho | ||
0x0e4a: 0x0dea, | ||
// XK_Thai_maitri | ||
0x0e4b: 0x0deb, | ||
// XK_Thai_maichattawa | ||
0x0e4c: 0x0dec, | ||
// XK_Thai_thanthakhat | ||
0x0e4d: 0x0ded, | ||
// XK_Thai_nikhahit | ||
0x0e50: 0x0df0, | ||
// XK_Thai_leksun | ||
0x0e51: 0x0df1, | ||
// XK_Thai_leknung | ||
0x0e52: 0x0df2, | ||
// XK_Thai_leksong | ||
0x0e53: 0x0df3, | ||
// XK_Thai_leksam | ||
0x0e54: 0x0df4, | ||
// XK_Thai_leksi | ||
0x0e55: 0x0df5, | ||
// XK_Thai_lekha | ||
0x0e56: 0x0df6, | ||
// XK_Thai_lekhok | ||
0x0e57: 0x0df7, | ||
// XK_Thai_lekchet | ||
0x0e58: 0x0df8, | ||
// XK_Thai_lekpaet | ||
0x0e59: 0x0df9, | ||
// XK_Thai_lekkao | ||
0x2002: 0x0aa2, | ||
// XK_enspace | ||
0x2003: 0x0aa1, | ||
// XK_emspace | ||
0x2004: 0x0aa3, | ||
// XK_em3space | ||
0x2005: 0x0aa4, | ||
// XK_em4space | ||
0x2007: 0x0aa5, | ||
// XK_digitspace | ||
0x2008: 0x0aa6, | ||
// XK_punctspace | ||
0x2009: 0x0aa7, | ||
// XK_thinspace | ||
0x200a: 0x0aa8, | ||
// XK_hairspace | ||
0x2012: 0x0abb, | ||
// XK_figdash | ||
0x2013: 0x0aaa, | ||
// XK_endash | ||
0x2014: 0x0aa9, | ||
// XK_emdash | ||
0x2015: 0x07af, | ||
// XK_Greek_horizbar | ||
0x2017: 0x0cdf, | ||
// XK_hebrew_doublelowline | ||
0x2018: 0x0ad0, | ||
// XK_leftsinglequotemark | ||
0x2019: 0x0ad1, | ||
// XK_rightsinglequotemark | ||
0x201a: 0x0afd, | ||
// XK_singlelowquotemark | ||
0x201c: 0x0ad2, | ||
// XK_leftdoublequotemark | ||
0x201d: 0x0ad3, | ||
// XK_rightdoublequotemark | ||
0x201e: 0x0afe, | ||
// XK_doublelowquotemark | ||
0x2020: 0x0af1, | ||
// XK_dagger | ||
0x2021: 0x0af2, | ||
// XK_doubledagger | ||
0x2022: 0x0ae6, | ||
// XK_enfilledcircbullet | ||
0x2025: 0x0aaf, | ||
// XK_doubbaselinedot | ||
0x2026: 0x0aae, | ||
// XK_ellipsis | ||
0x2030: 0x0ad5, | ||
// XK_permille | ||
0x2032: 0x0ad6, | ||
// XK_minutes | ||
0x2033: 0x0ad7, | ||
// XK_seconds | ||
0x2038: 0x0afc, | ||
// XK_caret | ||
0x203e: 0x047e, | ||
// XK_overline | ||
0x20a9: 0x0eff, | ||
// XK_Korean_Won | ||
0x20ac: 0x20ac, | ||
// XK_EuroSign | ||
0x2105: 0x0ab8, | ||
// XK_careof | ||
0x2116: 0x06b0, | ||
// XK_numerosign | ||
0x2117: 0x0afb, | ||
// XK_phonographcopyright | ||
0x211e: 0x0ad4, | ||
// XK_prescription | ||
0x2122: 0x0ac9, | ||
// XK_trademark | ||
0x2153: 0x0ab0, | ||
// XK_onethird | ||
0x2154: 0x0ab1, | ||
// XK_twothirds | ||
0x2155: 0x0ab2, | ||
// XK_onefifth | ||
0x2156: 0x0ab3, | ||
// XK_twofifths | ||
0x2157: 0x0ab4, | ||
// XK_threefifths | ||
0x2158: 0x0ab5, | ||
// XK_fourfifths | ||
0x2159: 0x0ab6, | ||
// XK_onesixth | ||
0x215a: 0x0ab7, | ||
// XK_fivesixths | ||
0x215b: 0x0ac3, | ||
// XK_oneeighth | ||
0x215c: 0x0ac4, | ||
// XK_threeeighths | ||
0x215d: 0x0ac5, | ||
// XK_fiveeighths | ||
0x215e: 0x0ac6, | ||
// XK_seveneighths | ||
0x2190: 0x08fb, | ||
// XK_leftarrow | ||
0x2191: 0x08fc, | ||
// XK_uparrow | ||
0x2192: 0x08fd, | ||
// XK_rightarrow | ||
0x2193: 0x08fe, | ||
// XK_downarrow | ||
0x21d2: 0x08ce, | ||
// XK_implies | ||
0x21d4: 0x08cd, | ||
// XK_ifonlyif | ||
0x2202: 0x08ef, | ||
// XK_partialderivative | ||
0x2207: 0x08c5, | ||
// XK_nabla | ||
0x2218: 0x0bca, | ||
// XK_jot | ||
0x221a: 0x08d6, | ||
// XK_radical | ||
0x221d: 0x08c1, | ||
// XK_variation | ||
0x221e: 0x08c2, | ||
// XK_infinity | ||
0x2227: 0x08de, | ||
// XK_logicaland | ||
0x2228: 0x08df, | ||
// XK_logicalor | ||
0x2229: 0x08dc, | ||
// XK_intersection | ||
0x222a: 0x08dd, | ||
// XK_union | ||
0x222b: 0x08bf, | ||
// XK_integral | ||
0x2234: 0x08c0, | ||
// XK_therefore | ||
0x223c: 0x08c8, | ||
// XK_approximate | ||
0x2243: 0x08c9, | ||
// XK_similarequal | ||
0x2245: 0x1002248, | ||
// XK_approxeq | ||
0x2260: 0x08bd, | ||
// XK_notequal | ||
0x2261: 0x08cf, | ||
// XK_identical | ||
0x2264: 0x08bc, | ||
// XK_lessthanequal | ||
0x2265: 0x08be, | ||
// XK_greaterthanequal | ||
0x2282: 0x08da, | ||
// XK_includedin | ||
0x2283: 0x08db, | ||
// XK_includes | ||
0x22a2: 0x0bfc, | ||
// XK_righttack | ||
0x22a3: 0x0bdc, | ||
// XK_lefttack | ||
0x22a4: 0x0bc2, | ||
// XK_downtack | ||
0x22a5: 0x0bce, | ||
// XK_uptack | ||
0x2308: 0x0bd3, | ||
// XK_upstile | ||
0x230a: 0x0bc4, | ||
// XK_downstile | ||
0x2315: 0x0afa, | ||
// XK_telephonerecorder | ||
0x2320: 0x08a4, | ||
// XK_topintegral | ||
0x2321: 0x08a5, | ||
// XK_botintegral | ||
0x2395: 0x0bcc, | ||
// XK_quad | ||
0x239b: 0x08ab, | ||
// XK_topleftparens | ||
0x239d: 0x08ac, | ||
// XK_botleftparens | ||
0x239e: 0x08ad, | ||
// XK_toprightparens | ||
0x23a0: 0x08ae, | ||
// XK_botrightparens | ||
0x23a1: 0x08a7, | ||
// XK_topleftsqbracket | ||
0x23a3: 0x08a8, | ||
// XK_botleftsqbracket | ||
0x23a4: 0x08a9, | ||
// XK_toprightsqbracket | ||
0x23a6: 0x08aa, | ||
// XK_botrightsqbracket | ||
0x23a8: 0x08af, | ||
// XK_leftmiddlecurlybrace | ||
0x23ac: 0x08b0, | ||
// XK_rightmiddlecurlybrace | ||
0x23b7: 0x08a1, | ||
// XK_leftradical | ||
0x23ba: 0x09ef, | ||
// XK_horizlinescan1 | ||
0x23bb: 0x09f0, | ||
// XK_horizlinescan3 | ||
0x23bc: 0x09f2, | ||
// XK_horizlinescan7 | ||
0x23bd: 0x09f3, | ||
// XK_horizlinescan9 | ||
0x2409: 0x09e2, | ||
// XK_ht | ||
0x240a: 0x09e5, | ||
// XK_lf | ||
0x240b: 0x09e9, | ||
// XK_vt | ||
0x240c: 0x09e3, | ||
// XK_ff | ||
0x240d: 0x09e4, | ||
// XK_cr | ||
0x2423: 0x0aac, | ||
// XK_signifblank | ||
0x2424: 0x09e8, | ||
// XK_nl | ||
0x2500: 0x08a3, | ||
// XK_horizconnector | ||
0x2502: 0x08a6, | ||
// XK_vertconnector | ||
0x250c: 0x08a2, | ||
// XK_topleftradical | ||
0x2510: 0x09eb, | ||
// XK_uprightcorner | ||
0x2514: 0x09ed, | ||
// XK_lowleftcorner | ||
0x2518: 0x09ea, | ||
// XK_lowrightcorner | ||
0x251c: 0x09f4, | ||
// XK_leftt | ||
0x2524: 0x09f5, | ||
// XK_rightt | ||
0x252c: 0x09f7, | ||
// XK_topt | ||
0x2534: 0x09f6, | ||
// XK_bott | ||
0x253c: 0x09ee, | ||
// XK_crossinglines | ||
0x2592: 0x09e1, | ||
// XK_checkerboard | ||
0x25aa: 0x0ae7, | ||
// XK_enfilledsqbullet | ||
0x25ab: 0x0ae1, | ||
// XK_enopensquarebullet | ||
0x25ac: 0x0adb, | ||
// XK_filledrectbullet | ||
0x25ad: 0x0ae2, | ||
// XK_openrectbullet | ||
0x25ae: 0x0adf, | ||
// XK_emfilledrect | ||
0x25af: 0x0acf, | ||
// XK_emopenrectangle | ||
0x25b2: 0x0ae8, | ||
// XK_filledtribulletup | ||
0x25b3: 0x0ae3, | ||
// XK_opentribulletup | ||
0x25b6: 0x0add, | ||
// XK_filledrighttribullet | ||
0x25b7: 0x0acd, | ||
// XK_rightopentriangle | ||
0x25bc: 0x0ae9, | ||
// XK_filledtribulletdown | ||
0x25bd: 0x0ae4, | ||
// XK_opentribulletdown | ||
0x25c0: 0x0adc, | ||
// XK_filledlefttribullet | ||
0x25c1: 0x0acc, | ||
// XK_leftopentriangle | ||
0x25c6: 0x09e0, | ||
// XK_soliddiamond | ||
0x25cb: 0x0ace, | ||
// XK_emopencircle | ||
0x25cf: 0x0ade, | ||
// XK_emfilledcircle | ||
0x25e6: 0x0ae0, | ||
// XK_enopencircbullet | ||
0x2606: 0x0ae5, | ||
// XK_openstar | ||
0x260e: 0x0af9, | ||
// XK_telephone | ||
0x2613: 0x0aca, | ||
// XK_signaturemark | ||
0x261c: 0x0aea, | ||
// XK_leftpointer | ||
0x261e: 0x0aeb, | ||
// XK_rightpointer | ||
0x2640: 0x0af8, | ||
// XK_femalesymbol | ||
0x2642: 0x0af7, | ||
// XK_malesymbol | ||
0x2663: 0x0aec, | ||
// XK_club | ||
0x2665: 0x0aee, | ||
// XK_heart | ||
0x2666: 0x0aed, | ||
// XK_diamond | ||
0x266d: 0x0af6, | ||
// XK_musicalflat | ||
0x266f: 0x0af5, | ||
// XK_musicalsharp | ||
0x2713: 0x0af3, | ||
// XK_checkmark | ||
0x2717: 0x0af4, | ||
// XK_ballotcross | ||
0x271d: 0x0ad9, | ||
// XK_latincross | ||
0x2720: 0x0af0, | ||
// XK_maltesecross | ||
0x27e8: 0x0abc, | ||
// XK_leftanglebracket | ||
0x27e9: 0x0abe, | ||
// XK_rightanglebracket | ||
0x3001: 0x04a4, | ||
// XK_kana_comma | ||
0x3002: 0x04a1, | ||
// XK_kana_fullstop | ||
0x300c: 0x04a2, | ||
// XK_kana_openingbracket | ||
0x300d: 0x04a3, | ||
// XK_kana_closingbracket | ||
0x309b: 0x04de, | ||
// XK_voicedsound | ||
0x309c: 0x04df, | ||
// XK_semivoicedsound | ||
0x30a1: 0x04a7, | ||
// XK_kana_a | ||
0x30a2: 0x04b1, | ||
// XK_kana_A | ||
0x30a3: 0x04a8, | ||
// XK_kana_i | ||
0x30a4: 0x04b2, | ||
// XK_kana_I | ||
0x30a5: 0x04a9, | ||
// XK_kana_u | ||
0x30a6: 0x04b3, | ||
// XK_kana_U | ||
0x30a7: 0x04aa, | ||
// XK_kana_e | ||
0x30a8: 0x04b4, | ||
// XK_kana_E | ||
0x30a9: 0x04ab, | ||
// XK_kana_o | ||
0x30aa: 0x04b5, | ||
// XK_kana_O | ||
0x30ab: 0x04b6, | ||
// XK_kana_KA | ||
0x30ad: 0x04b7, | ||
// XK_kana_KI | ||
0x30af: 0x04b8, | ||
// XK_kana_KU | ||
0x30b1: 0x04b9, | ||
// XK_kana_KE | ||
0x30b3: 0x04ba, | ||
// XK_kana_KO | ||
0x30b5: 0x04bb, | ||
// XK_kana_SA | ||
0x30b7: 0x04bc, | ||
// XK_kana_SHI | ||
0x30b9: 0x04bd, | ||
// XK_kana_SU | ||
0x30bb: 0x04be, | ||
// XK_kana_SE | ||
0x30bd: 0x04bf, | ||
// XK_kana_SO | ||
0x30bf: 0x04c0, | ||
// XK_kana_TA | ||
0x30c1: 0x04c1, | ||
// XK_kana_CHI | ||
0x30c3: 0x04af, | ||
// XK_kana_tsu | ||
0x30c4: 0x04c2, | ||
// XK_kana_TSU | ||
0x30c6: 0x04c3, | ||
// XK_kana_TE | ||
0x30c8: 0x04c4, | ||
// XK_kana_TO | ||
0x30ca: 0x04c5, | ||
// XK_kana_NA | ||
0x30cb: 0x04c6, | ||
// XK_kana_NI | ||
0x30cc: 0x04c7, | ||
// XK_kana_NU | ||
0x30cd: 0x04c8, | ||
// XK_kana_NE | ||
0x30ce: 0x04c9, | ||
// XK_kana_NO | ||
0x30cf: 0x04ca, | ||
// XK_kana_HA | ||
0x30d2: 0x04cb, | ||
// XK_kana_HI | ||
0x30d5: 0x04cc, | ||
// XK_kana_FU | ||
0x30d8: 0x04cd, | ||
// XK_kana_HE | ||
0x30db: 0x04ce, | ||
// XK_kana_HO | ||
0x30de: 0x04cf, | ||
// XK_kana_MA | ||
0x30df: 0x04d0, | ||
// XK_kana_MI | ||
0x30e0: 0x04d1, | ||
// XK_kana_MU | ||
0x30e1: 0x04d2, | ||
// XK_kana_ME | ||
0x30e2: 0x04d3, | ||
// XK_kana_MO | ||
0x30e3: 0x04ac, | ||
// XK_kana_ya | ||
0x30e4: 0x04d4, | ||
// XK_kana_YA | ||
0x30e5: 0x04ad, | ||
// XK_kana_yu | ||
0x30e6: 0x04d5, | ||
// XK_kana_YU | ||
0x30e7: 0x04ae, | ||
// XK_kana_yo | ||
0x30e8: 0x04d6, | ||
// XK_kana_YO | ||
0x30e9: 0x04d7, | ||
// XK_kana_RA | ||
0x30ea: 0x04d8, | ||
// XK_kana_RI | ||
0x30eb: 0x04d9, | ||
// XK_kana_RU | ||
0x30ec: 0x04da, | ||
// XK_kana_RE | ||
0x30ed: 0x04db, | ||
// XK_kana_RO | ||
0x30ef: 0x04dc, | ||
// XK_kana_WA | ||
0x30f2: 0x04a6, | ||
// XK_kana_WO | ||
0x30f3: 0x04dd, | ||
// XK_kana_N | ||
0x30fb: 0x04a5, | ||
// XK_kana_conjunctive | ||
0x30fc: 0x04b0 // XK_prolongedsound | ||
var codepoints = { | ||
0x0100: 0x03c0, // XK_Amacron | ||
0x0101: 0x03e0, // XK_amacron | ||
0x0102: 0x01c3, // XK_Abreve | ||
0x0103: 0x01e3, // XK_abreve | ||
0x0104: 0x01a1, // XK_Aogonek | ||
0x0105: 0x01b1, // XK_aogonek | ||
0x0106: 0x01c6, // XK_Cacute | ||
0x0107: 0x01e6, // XK_cacute | ||
0x0108: 0x02c6, // XK_Ccircumflex | ||
0x0109: 0x02e6, // XK_ccircumflex | ||
0x010a: 0x02c5, // XK_Cabovedot | ||
0x010b: 0x02e5, // XK_cabovedot | ||
0x010c: 0x01c8, // XK_Ccaron | ||
0x010d: 0x01e8, // XK_ccaron | ||
0x010e: 0x01cf, // XK_Dcaron | ||
0x010f: 0x01ef, // XK_dcaron | ||
0x0110: 0x01d0, // XK_Dstroke | ||
0x0111: 0x01f0, // XK_dstroke | ||
0x0112: 0x03aa, // XK_Emacron | ||
0x0113: 0x03ba, // XK_emacron | ||
0x0116: 0x03cc, // XK_Eabovedot | ||
0x0117: 0x03ec, // XK_eabovedot | ||
0x0118: 0x01ca, // XK_Eogonek | ||
0x0119: 0x01ea, // XK_eogonek | ||
0x011a: 0x01cc, // XK_Ecaron | ||
0x011b: 0x01ec, // XK_ecaron | ||
0x011c: 0x02d8, // XK_Gcircumflex | ||
0x011d: 0x02f8, // XK_gcircumflex | ||
0x011e: 0x02ab, // XK_Gbreve | ||
0x011f: 0x02bb, // XK_gbreve | ||
0x0120: 0x02d5, // XK_Gabovedot | ||
0x0121: 0x02f5, // XK_gabovedot | ||
0x0122: 0x03ab, // XK_Gcedilla | ||
0x0123: 0x03bb, // XK_gcedilla | ||
0x0124: 0x02a6, // XK_Hcircumflex | ||
0x0125: 0x02b6, // XK_hcircumflex | ||
0x0126: 0x02a1, // XK_Hstroke | ||
0x0127: 0x02b1, // XK_hstroke | ||
0x0128: 0x03a5, // XK_Itilde | ||
0x0129: 0x03b5, // XK_itilde | ||
0x012a: 0x03cf, // XK_Imacron | ||
0x012b: 0x03ef, // XK_imacron | ||
0x012e: 0x03c7, // XK_Iogonek | ||
0x012f: 0x03e7, // XK_iogonek | ||
0x0130: 0x02a9, // XK_Iabovedot | ||
0x0131: 0x02b9, // XK_idotless | ||
0x0134: 0x02ac, // XK_Jcircumflex | ||
0x0135: 0x02bc, // XK_jcircumflex | ||
0x0136: 0x03d3, // XK_Kcedilla | ||
0x0137: 0x03f3, // XK_kcedilla | ||
0x0138: 0x03a2, // XK_kra | ||
0x0139: 0x01c5, // XK_Lacute | ||
0x013a: 0x01e5, // XK_lacute | ||
0x013b: 0x03a6, // XK_Lcedilla | ||
0x013c: 0x03b6, // XK_lcedilla | ||
0x013d: 0x01a5, // XK_Lcaron | ||
0x013e: 0x01b5, // XK_lcaron | ||
0x0141: 0x01a3, // XK_Lstroke | ||
0x0142: 0x01b3, // XK_lstroke | ||
0x0143: 0x01d1, // XK_Nacute | ||
0x0144: 0x01f1, // XK_nacute | ||
0x0145: 0x03d1, // XK_Ncedilla | ||
0x0146: 0x03f1, // XK_ncedilla | ||
0x0147: 0x01d2, // XK_Ncaron | ||
0x0148: 0x01f2, // XK_ncaron | ||
0x014a: 0x03bd, // XK_ENG | ||
0x014b: 0x03bf, // XK_eng | ||
0x014c: 0x03d2, // XK_Omacron | ||
0x014d: 0x03f2, // XK_omacron | ||
0x0150: 0x01d5, // XK_Odoubleacute | ||
0x0151: 0x01f5, // XK_odoubleacute | ||
0x0152: 0x13bc, // XK_OE | ||
0x0153: 0x13bd, // XK_oe | ||
0x0154: 0x01c0, // XK_Racute | ||
0x0155: 0x01e0, // XK_racute | ||
0x0156: 0x03a3, // XK_Rcedilla | ||
0x0157: 0x03b3, // XK_rcedilla | ||
0x0158: 0x01d8, // XK_Rcaron | ||
0x0159: 0x01f8, // XK_rcaron | ||
0x015a: 0x01a6, // XK_Sacute | ||
0x015b: 0x01b6, // XK_sacute | ||
0x015c: 0x02de, // XK_Scircumflex | ||
0x015d: 0x02fe, // XK_scircumflex | ||
0x015e: 0x01aa, // XK_Scedilla | ||
0x015f: 0x01ba, // XK_scedilla | ||
0x0160: 0x01a9, // XK_Scaron | ||
0x0161: 0x01b9, // XK_scaron | ||
0x0162: 0x01de, // XK_Tcedilla | ||
0x0163: 0x01fe, // XK_tcedilla | ||
0x0164: 0x01ab, // XK_Tcaron | ||
0x0165: 0x01bb, // XK_tcaron | ||
0x0166: 0x03ac, // XK_Tslash | ||
0x0167: 0x03bc, // XK_tslash | ||
0x0168: 0x03dd, // XK_Utilde | ||
0x0169: 0x03fd, // XK_utilde | ||
0x016a: 0x03de, // XK_Umacron | ||
0x016b: 0x03fe, // XK_umacron | ||
0x016c: 0x02dd, // XK_Ubreve | ||
0x016d: 0x02fd, // XK_ubreve | ||
0x016e: 0x01d9, // XK_Uring | ||
0x016f: 0x01f9, // XK_uring | ||
0x0170: 0x01db, // XK_Udoubleacute | ||
0x0171: 0x01fb, // XK_udoubleacute | ||
0x0172: 0x03d9, // XK_Uogonek | ||
0x0173: 0x03f9, // XK_uogonek | ||
0x0178: 0x13be, // XK_Ydiaeresis | ||
0x0179: 0x01ac, // XK_Zacute | ||
0x017a: 0x01bc, // XK_zacute | ||
0x017b: 0x01af, // XK_Zabovedot | ||
0x017c: 0x01bf, // XK_zabovedot | ||
0x017d: 0x01ae, // XK_Zcaron | ||
0x017e: 0x01be, // XK_zcaron | ||
0x0192: 0x08f6, // XK_function | ||
0x01d2: 0x10001d1, // XK_Ocaron | ||
0x02c7: 0x01b7, // XK_caron | ||
0x02d8: 0x01a2, // XK_breve | ||
0x02d9: 0x01ff, // XK_abovedot | ||
0x02db: 0x01b2, // XK_ogonek | ||
0x02dd: 0x01bd, // XK_doubleacute | ||
0x0385: 0x07ae, // XK_Greek_accentdieresis | ||
0x0386: 0x07a1, // XK_Greek_ALPHAaccent | ||
0x0388: 0x07a2, // XK_Greek_EPSILONaccent | ||
0x0389: 0x07a3, // XK_Greek_ETAaccent | ||
0x038a: 0x07a4, // XK_Greek_IOTAaccent | ||
0x038c: 0x07a7, // XK_Greek_OMICRONaccent | ||
0x038e: 0x07a8, // XK_Greek_UPSILONaccent | ||
0x038f: 0x07ab, // XK_Greek_OMEGAaccent | ||
0x0390: 0x07b6, // XK_Greek_iotaaccentdieresis | ||
0x0391: 0x07c1, // XK_Greek_ALPHA | ||
0x0392: 0x07c2, // XK_Greek_BETA | ||
0x0393: 0x07c3, // XK_Greek_GAMMA | ||
0x0394: 0x07c4, // XK_Greek_DELTA | ||
0x0395: 0x07c5, // XK_Greek_EPSILON | ||
0x0396: 0x07c6, // XK_Greek_ZETA | ||
0x0397: 0x07c7, // XK_Greek_ETA | ||
0x0398: 0x07c8, // XK_Greek_THETA | ||
0x0399: 0x07c9, // XK_Greek_IOTA | ||
0x039a: 0x07ca, // XK_Greek_KAPPA | ||
0x039b: 0x07cb, // XK_Greek_LAMDA | ||
0x039c: 0x07cc, // XK_Greek_MU | ||
0x039d: 0x07cd, // XK_Greek_NU | ||
0x039e: 0x07ce, // XK_Greek_XI | ||
0x039f: 0x07cf, // XK_Greek_OMICRON | ||
0x03a0: 0x07d0, // XK_Greek_PI | ||
0x03a1: 0x07d1, // XK_Greek_RHO | ||
0x03a3: 0x07d2, // XK_Greek_SIGMA | ||
0x03a4: 0x07d4, // XK_Greek_TAU | ||
0x03a5: 0x07d5, // XK_Greek_UPSILON | ||
0x03a6: 0x07d6, // XK_Greek_PHI | ||
0x03a7: 0x07d7, // XK_Greek_CHI | ||
0x03a8: 0x07d8, // XK_Greek_PSI | ||
0x03a9: 0x07d9, // XK_Greek_OMEGA | ||
0x03aa: 0x07a5, // XK_Greek_IOTAdieresis | ||
0x03ab: 0x07a9, // XK_Greek_UPSILONdieresis | ||
0x03ac: 0x07b1, // XK_Greek_alphaaccent | ||
0x03ad: 0x07b2, // XK_Greek_epsilonaccent | ||
0x03ae: 0x07b3, // XK_Greek_etaaccent | ||
0x03af: 0x07b4, // XK_Greek_iotaaccent | ||
0x03b0: 0x07ba, // XK_Greek_upsilonaccentdieresis | ||
0x03b1: 0x07e1, // XK_Greek_alpha | ||
0x03b2: 0x07e2, // XK_Greek_beta | ||
0x03b3: 0x07e3, // XK_Greek_gamma | ||
0x03b4: 0x07e4, // XK_Greek_delta | ||
0x03b5: 0x07e5, // XK_Greek_epsilon | ||
0x03b6: 0x07e6, // XK_Greek_zeta | ||
0x03b7: 0x07e7, // XK_Greek_eta | ||
0x03b8: 0x07e8, // XK_Greek_theta | ||
0x03b9: 0x07e9, // XK_Greek_iota | ||
0x03ba: 0x07ea, // XK_Greek_kappa | ||
0x03bb: 0x07eb, // XK_Greek_lamda | ||
0x03bc: 0x07ec, // XK_Greek_mu | ||
0x03bd: 0x07ed, // XK_Greek_nu | ||
0x03be: 0x07ee, // XK_Greek_xi | ||
0x03bf: 0x07ef, // XK_Greek_omicron | ||
0x03c0: 0x07f0, // XK_Greek_pi | ||
0x03c1: 0x07f1, // XK_Greek_rho | ||
0x03c2: 0x07f3, // XK_Greek_finalsmallsigma | ||
0x03c3: 0x07f2, // XK_Greek_sigma | ||
0x03c4: 0x07f4, // XK_Greek_tau | ||
0x03c5: 0x07f5, // XK_Greek_upsilon | ||
0x03c6: 0x07f6, // XK_Greek_phi | ||
0x03c7: 0x07f7, // XK_Greek_chi | ||
0x03c8: 0x07f8, // XK_Greek_psi | ||
0x03c9: 0x07f9, // XK_Greek_omega | ||
0x03ca: 0x07b5, // XK_Greek_iotadieresis | ||
0x03cb: 0x07b9, // XK_Greek_upsilondieresis | ||
0x03cc: 0x07b7, // XK_Greek_omicronaccent | ||
0x03cd: 0x07b8, // XK_Greek_upsilonaccent | ||
0x03ce: 0x07bb, // XK_Greek_omegaaccent | ||
0x0401: 0x06b3, // XK_Cyrillic_IO | ||
0x0402: 0x06b1, // XK_Serbian_DJE | ||
0x0403: 0x06b2, // XK_Macedonia_GJE | ||
0x0404: 0x06b4, // XK_Ukrainian_IE | ||
0x0405: 0x06b5, // XK_Macedonia_DSE | ||
0x0406: 0x06b6, // XK_Ukrainian_I | ||
0x0407: 0x06b7, // XK_Ukrainian_YI | ||
0x0408: 0x06b8, // XK_Cyrillic_JE | ||
0x0409: 0x06b9, // XK_Cyrillic_LJE | ||
0x040a: 0x06ba, // XK_Cyrillic_NJE | ||
0x040b: 0x06bb, // XK_Serbian_TSHE | ||
0x040c: 0x06bc, // XK_Macedonia_KJE | ||
0x040e: 0x06be, // XK_Byelorussian_SHORTU | ||
0x040f: 0x06bf, // XK_Cyrillic_DZHE | ||
0x0410: 0x06e1, // XK_Cyrillic_A | ||
0x0411: 0x06e2, // XK_Cyrillic_BE | ||
0x0412: 0x06f7, // XK_Cyrillic_VE | ||
0x0413: 0x06e7, // XK_Cyrillic_GHE | ||
0x0414: 0x06e4, // XK_Cyrillic_DE | ||
0x0415: 0x06e5, // XK_Cyrillic_IE | ||
0x0416: 0x06f6, // XK_Cyrillic_ZHE | ||
0x0417: 0x06fa, // XK_Cyrillic_ZE | ||
0x0418: 0x06e9, // XK_Cyrillic_I | ||
0x0419: 0x06ea, // XK_Cyrillic_SHORTI | ||
0x041a: 0x06eb, // XK_Cyrillic_KA | ||
0x041b: 0x06ec, // XK_Cyrillic_EL | ||
0x041c: 0x06ed, // XK_Cyrillic_EM | ||
0x041d: 0x06ee, // XK_Cyrillic_EN | ||
0x041e: 0x06ef, // XK_Cyrillic_O | ||
0x041f: 0x06f0, // XK_Cyrillic_PE | ||
0x0420: 0x06f2, // XK_Cyrillic_ER | ||
0x0421: 0x06f3, // XK_Cyrillic_ES | ||
0x0422: 0x06f4, // XK_Cyrillic_TE | ||
0x0423: 0x06f5, // XK_Cyrillic_U | ||
0x0424: 0x06e6, // XK_Cyrillic_EF | ||
0x0425: 0x06e8, // XK_Cyrillic_HA | ||
0x0426: 0x06e3, // XK_Cyrillic_TSE | ||
0x0427: 0x06fe, // XK_Cyrillic_CHE | ||
0x0428: 0x06fb, // XK_Cyrillic_SHA | ||
0x0429: 0x06fd, // XK_Cyrillic_SHCHA | ||
0x042a: 0x06ff, // XK_Cyrillic_HARDSIGN | ||
0x042b: 0x06f9, // XK_Cyrillic_YERU | ||
0x042c: 0x06f8, // XK_Cyrillic_SOFTSIGN | ||
0x042d: 0x06fc, // XK_Cyrillic_E | ||
0x042e: 0x06e0, // XK_Cyrillic_YU | ||
0x042f: 0x06f1, // XK_Cyrillic_YA | ||
0x0430: 0x06c1, // XK_Cyrillic_a | ||
0x0431: 0x06c2, // XK_Cyrillic_be | ||
0x0432: 0x06d7, // XK_Cyrillic_ve | ||
0x0433: 0x06c7, // XK_Cyrillic_ghe | ||
0x0434: 0x06c4, // XK_Cyrillic_de | ||
0x0435: 0x06c5, // XK_Cyrillic_ie | ||
0x0436: 0x06d6, // XK_Cyrillic_zhe | ||
0x0437: 0x06da, // XK_Cyrillic_ze | ||
0x0438: 0x06c9, // XK_Cyrillic_i | ||
0x0439: 0x06ca, // XK_Cyrillic_shorti | ||
0x043a: 0x06cb, // XK_Cyrillic_ka | ||
0x043b: 0x06cc, // XK_Cyrillic_el | ||
0x043c: 0x06cd, // XK_Cyrillic_em | ||
0x043d: 0x06ce, // XK_Cyrillic_en | ||
0x043e: 0x06cf, // XK_Cyrillic_o | ||
0x043f: 0x06d0, // XK_Cyrillic_pe | ||
0x0440: 0x06d2, // XK_Cyrillic_er | ||
0x0441: 0x06d3, // XK_Cyrillic_es | ||
0x0442: 0x06d4, // XK_Cyrillic_te | ||
0x0443: 0x06d5, // XK_Cyrillic_u | ||
0x0444: 0x06c6, // XK_Cyrillic_ef | ||
0x0445: 0x06c8, // XK_Cyrillic_ha | ||
0x0446: 0x06c3, // XK_Cyrillic_tse | ||
0x0447: 0x06de, // XK_Cyrillic_che | ||
0x0448: 0x06db, // XK_Cyrillic_sha | ||
0x0449: 0x06dd, // XK_Cyrillic_shcha | ||
0x044a: 0x06df, // XK_Cyrillic_hardsign | ||
0x044b: 0x06d9, // XK_Cyrillic_yeru | ||
0x044c: 0x06d8, // XK_Cyrillic_softsign | ||
0x044d: 0x06dc, // XK_Cyrillic_e | ||
0x044e: 0x06c0, // XK_Cyrillic_yu | ||
0x044f: 0x06d1, // XK_Cyrillic_ya | ||
0x0451: 0x06a3, // XK_Cyrillic_io | ||
0x0452: 0x06a1, // XK_Serbian_dje | ||
0x0453: 0x06a2, // XK_Macedonia_gje | ||
0x0454: 0x06a4, // XK_Ukrainian_ie | ||
0x0455: 0x06a5, // XK_Macedonia_dse | ||
0x0456: 0x06a6, // XK_Ukrainian_i | ||
0x0457: 0x06a7, // XK_Ukrainian_yi | ||
0x0458: 0x06a8, // XK_Cyrillic_je | ||
0x0459: 0x06a9, // XK_Cyrillic_lje | ||
0x045a: 0x06aa, // XK_Cyrillic_nje | ||
0x045b: 0x06ab, // XK_Serbian_tshe | ||
0x045c: 0x06ac, // XK_Macedonia_kje | ||
0x045e: 0x06ae, // XK_Byelorussian_shortu | ||
0x045f: 0x06af, // XK_Cyrillic_dzhe | ||
0x0490: 0x06bd, // XK_Ukrainian_GHE_WITH_UPTURN | ||
0x0491: 0x06ad, // XK_Ukrainian_ghe_with_upturn | ||
0x05d0: 0x0ce0, // XK_hebrew_aleph | ||
0x05d1: 0x0ce1, // XK_hebrew_bet | ||
0x05d2: 0x0ce2, // XK_hebrew_gimel | ||
0x05d3: 0x0ce3, // XK_hebrew_dalet | ||
0x05d4: 0x0ce4, // XK_hebrew_he | ||
0x05d5: 0x0ce5, // XK_hebrew_waw | ||
0x05d6: 0x0ce6, // XK_hebrew_zain | ||
0x05d7: 0x0ce7, // XK_hebrew_chet | ||
0x05d8: 0x0ce8, // XK_hebrew_tet | ||
0x05d9: 0x0ce9, // XK_hebrew_yod | ||
0x05da: 0x0cea, // XK_hebrew_finalkaph | ||
0x05db: 0x0ceb, // XK_hebrew_kaph | ||
0x05dc: 0x0cec, // XK_hebrew_lamed | ||
0x05dd: 0x0ced, // XK_hebrew_finalmem | ||
0x05de: 0x0cee, // XK_hebrew_mem | ||
0x05df: 0x0cef, // XK_hebrew_finalnun | ||
0x05e0: 0x0cf0, // XK_hebrew_nun | ||
0x05e1: 0x0cf1, // XK_hebrew_samech | ||
0x05e2: 0x0cf2, // XK_hebrew_ayin | ||
0x05e3: 0x0cf3, // XK_hebrew_finalpe | ||
0x05e4: 0x0cf4, // XK_hebrew_pe | ||
0x05e5: 0x0cf5, // XK_hebrew_finalzade | ||
0x05e6: 0x0cf6, // XK_hebrew_zade | ||
0x05e7: 0x0cf7, // XK_hebrew_qoph | ||
0x05e8: 0x0cf8, // XK_hebrew_resh | ||
0x05e9: 0x0cf9, // XK_hebrew_shin | ||
0x05ea: 0x0cfa, // XK_hebrew_taw | ||
0x060c: 0x05ac, // XK_Arabic_comma | ||
0x061b: 0x05bb, // XK_Arabic_semicolon | ||
0x061f: 0x05bf, // XK_Arabic_question_mark | ||
0x0621: 0x05c1, // XK_Arabic_hamza | ||
0x0622: 0x05c2, // XK_Arabic_maddaonalef | ||
0x0623: 0x05c3, // XK_Arabic_hamzaonalef | ||
0x0624: 0x05c4, // XK_Arabic_hamzaonwaw | ||
0x0625: 0x05c5, // XK_Arabic_hamzaunderalef | ||
0x0626: 0x05c6, // XK_Arabic_hamzaonyeh | ||
0x0627: 0x05c7, // XK_Arabic_alef | ||
0x0628: 0x05c8, // XK_Arabic_beh | ||
0x0629: 0x05c9, // XK_Arabic_tehmarbuta | ||
0x062a: 0x05ca, // XK_Arabic_teh | ||
0x062b: 0x05cb, // XK_Arabic_theh | ||
0x062c: 0x05cc, // XK_Arabic_jeem | ||
0x062d: 0x05cd, // XK_Arabic_hah | ||
0x062e: 0x05ce, // XK_Arabic_khah | ||
0x062f: 0x05cf, // XK_Arabic_dal | ||
0x0630: 0x05d0, // XK_Arabic_thal | ||
0x0631: 0x05d1, // XK_Arabic_ra | ||
0x0632: 0x05d2, // XK_Arabic_zain | ||
0x0633: 0x05d3, // XK_Arabic_seen | ||
0x0634: 0x05d4, // XK_Arabic_sheen | ||
0x0635: 0x05d5, // XK_Arabic_sad | ||
0x0636: 0x05d6, // XK_Arabic_dad | ||
0x0637: 0x05d7, // XK_Arabic_tah | ||
0x0638: 0x05d8, // XK_Arabic_zah | ||
0x0639: 0x05d9, // XK_Arabic_ain | ||
0x063a: 0x05da, // XK_Arabic_ghain | ||
0x0640: 0x05e0, // XK_Arabic_tatweel | ||
0x0641: 0x05e1, // XK_Arabic_feh | ||
0x0642: 0x05e2, // XK_Arabic_qaf | ||
0x0643: 0x05e3, // XK_Arabic_kaf | ||
0x0644: 0x05e4, // XK_Arabic_lam | ||
0x0645: 0x05e5, // XK_Arabic_meem | ||
0x0646: 0x05e6, // XK_Arabic_noon | ||
0x0647: 0x05e7, // XK_Arabic_ha | ||
0x0648: 0x05e8, // XK_Arabic_waw | ||
0x0649: 0x05e9, // XK_Arabic_alefmaksura | ||
0x064a: 0x05ea, // XK_Arabic_yeh | ||
0x064b: 0x05eb, // XK_Arabic_fathatan | ||
0x064c: 0x05ec, // XK_Arabic_dammatan | ||
0x064d: 0x05ed, // XK_Arabic_kasratan | ||
0x064e: 0x05ee, // XK_Arabic_fatha | ||
0x064f: 0x05ef, // XK_Arabic_damma | ||
0x0650: 0x05f0, // XK_Arabic_kasra | ||
0x0651: 0x05f1, // XK_Arabic_shadda | ||
0x0652: 0x05f2, // XK_Arabic_sukun | ||
0x0e01: 0x0da1, // XK_Thai_kokai | ||
0x0e02: 0x0da2, // XK_Thai_khokhai | ||
0x0e03: 0x0da3, // XK_Thai_khokhuat | ||
0x0e04: 0x0da4, // XK_Thai_khokhwai | ||
0x0e05: 0x0da5, // XK_Thai_khokhon | ||
0x0e06: 0x0da6, // XK_Thai_khorakhang | ||
0x0e07: 0x0da7, // XK_Thai_ngongu | ||
0x0e08: 0x0da8, // XK_Thai_chochan | ||
0x0e09: 0x0da9, // XK_Thai_choching | ||
0x0e0a: 0x0daa, // XK_Thai_chochang | ||
0x0e0b: 0x0dab, // XK_Thai_soso | ||
0x0e0c: 0x0dac, // XK_Thai_chochoe | ||
0x0e0d: 0x0dad, // XK_Thai_yoying | ||
0x0e0e: 0x0dae, // XK_Thai_dochada | ||
0x0e0f: 0x0daf, // XK_Thai_topatak | ||
0x0e10: 0x0db0, // XK_Thai_thothan | ||
0x0e11: 0x0db1, // XK_Thai_thonangmontho | ||
0x0e12: 0x0db2, // XK_Thai_thophuthao | ||
0x0e13: 0x0db3, // XK_Thai_nonen | ||
0x0e14: 0x0db4, // XK_Thai_dodek | ||
0x0e15: 0x0db5, // XK_Thai_totao | ||
0x0e16: 0x0db6, // XK_Thai_thothung | ||
0x0e17: 0x0db7, // XK_Thai_thothahan | ||
0x0e18: 0x0db8, // XK_Thai_thothong | ||
0x0e19: 0x0db9, // XK_Thai_nonu | ||
0x0e1a: 0x0dba, // XK_Thai_bobaimai | ||
0x0e1b: 0x0dbb, // XK_Thai_popla | ||
0x0e1c: 0x0dbc, // XK_Thai_phophung | ||
0x0e1d: 0x0dbd, // XK_Thai_fofa | ||
0x0e1e: 0x0dbe, // XK_Thai_phophan | ||
0x0e1f: 0x0dbf, // XK_Thai_fofan | ||
0x0e20: 0x0dc0, // XK_Thai_phosamphao | ||
0x0e21: 0x0dc1, // XK_Thai_moma | ||
0x0e22: 0x0dc2, // XK_Thai_yoyak | ||
0x0e23: 0x0dc3, // XK_Thai_rorua | ||
0x0e24: 0x0dc4, // XK_Thai_ru | ||
0x0e25: 0x0dc5, // XK_Thai_loling | ||
0x0e26: 0x0dc6, // XK_Thai_lu | ||
0x0e27: 0x0dc7, // XK_Thai_wowaen | ||
0x0e28: 0x0dc8, // XK_Thai_sosala | ||
0x0e29: 0x0dc9, // XK_Thai_sorusi | ||
0x0e2a: 0x0dca, // XK_Thai_sosua | ||
0x0e2b: 0x0dcb, // XK_Thai_hohip | ||
0x0e2c: 0x0dcc, // XK_Thai_lochula | ||
0x0e2d: 0x0dcd, // XK_Thai_oang | ||
0x0e2e: 0x0dce, // XK_Thai_honokhuk | ||
0x0e2f: 0x0dcf, // XK_Thai_paiyannoi | ||
0x0e30: 0x0dd0, // XK_Thai_saraa | ||
0x0e31: 0x0dd1, // XK_Thai_maihanakat | ||
0x0e32: 0x0dd2, // XK_Thai_saraaa | ||
0x0e33: 0x0dd3, // XK_Thai_saraam | ||
0x0e34: 0x0dd4, // XK_Thai_sarai | ||
0x0e35: 0x0dd5, // XK_Thai_saraii | ||
0x0e36: 0x0dd6, // XK_Thai_saraue | ||
0x0e37: 0x0dd7, // XK_Thai_sarauee | ||
0x0e38: 0x0dd8, // XK_Thai_sarau | ||
0x0e39: 0x0dd9, // XK_Thai_sarauu | ||
0x0e3a: 0x0dda, // XK_Thai_phinthu | ||
0x0e3f: 0x0ddf, // XK_Thai_baht | ||
0x0e40: 0x0de0, // XK_Thai_sarae | ||
0x0e41: 0x0de1, // XK_Thai_saraae | ||
0x0e42: 0x0de2, // XK_Thai_sarao | ||
0x0e43: 0x0de3, // XK_Thai_saraaimaimuan | ||
0x0e44: 0x0de4, // XK_Thai_saraaimaimalai | ||
0x0e45: 0x0de5, // XK_Thai_lakkhangyao | ||
0x0e46: 0x0de6, // XK_Thai_maiyamok | ||
0x0e47: 0x0de7, // XK_Thai_maitaikhu | ||
0x0e48: 0x0de8, // XK_Thai_maiek | ||
0x0e49: 0x0de9, // XK_Thai_maitho | ||
0x0e4a: 0x0dea, // XK_Thai_maitri | ||
0x0e4b: 0x0deb, // XK_Thai_maichattawa | ||
0x0e4c: 0x0dec, // XK_Thai_thanthakhat | ||
0x0e4d: 0x0ded, // XK_Thai_nikhahit | ||
0x0e50: 0x0df0, // XK_Thai_leksun | ||
0x0e51: 0x0df1, // XK_Thai_leknung | ||
0x0e52: 0x0df2, // XK_Thai_leksong | ||
0x0e53: 0x0df3, // XK_Thai_leksam | ||
0x0e54: 0x0df4, // XK_Thai_leksi | ||
0x0e55: 0x0df5, // XK_Thai_lekha | ||
0x0e56: 0x0df6, // XK_Thai_lekhok | ||
0x0e57: 0x0df7, // XK_Thai_lekchet | ||
0x0e58: 0x0df8, // XK_Thai_lekpaet | ||
0x0e59: 0x0df9, // XK_Thai_lekkao | ||
0x2002: 0x0aa2, // XK_enspace | ||
0x2003: 0x0aa1, // XK_emspace | ||
0x2004: 0x0aa3, // XK_em3space | ||
0x2005: 0x0aa4, // XK_em4space | ||
0x2007: 0x0aa5, // XK_digitspace | ||
0x2008: 0x0aa6, // XK_punctspace | ||
0x2009: 0x0aa7, // XK_thinspace | ||
0x200a: 0x0aa8, // XK_hairspace | ||
0x2012: 0x0abb, // XK_figdash | ||
0x2013: 0x0aaa, // XK_endash | ||
0x2014: 0x0aa9, // XK_emdash | ||
0x2015: 0x07af, // XK_Greek_horizbar | ||
0x2017: 0x0cdf, // XK_hebrew_doublelowline | ||
0x2018: 0x0ad0, // XK_leftsinglequotemark | ||
0x2019: 0x0ad1, // XK_rightsinglequotemark | ||
0x201a: 0x0afd, // XK_singlelowquotemark | ||
0x201c: 0x0ad2, // XK_leftdoublequotemark | ||
0x201d: 0x0ad3, // XK_rightdoublequotemark | ||
0x201e: 0x0afe, // XK_doublelowquotemark | ||
0x2020: 0x0af1, // XK_dagger | ||
0x2021: 0x0af2, // XK_doubledagger | ||
0x2022: 0x0ae6, // XK_enfilledcircbullet | ||
0x2025: 0x0aaf, // XK_doubbaselinedot | ||
0x2026: 0x0aae, // XK_ellipsis | ||
0x2030: 0x0ad5, // XK_permille | ||
0x2032: 0x0ad6, // XK_minutes | ||
0x2033: 0x0ad7, // XK_seconds | ||
0x2038: 0x0afc, // XK_caret | ||
0x203e: 0x047e, // XK_overline | ||
0x20a9: 0x0eff, // XK_Korean_Won | ||
0x20ac: 0x20ac, // XK_EuroSign | ||
0x2105: 0x0ab8, // XK_careof | ||
0x2116: 0x06b0, // XK_numerosign | ||
0x2117: 0x0afb, // XK_phonographcopyright | ||
0x211e: 0x0ad4, // XK_prescription | ||
0x2122: 0x0ac9, // XK_trademark | ||
0x2153: 0x0ab0, // XK_onethird | ||
0x2154: 0x0ab1, // XK_twothirds | ||
0x2155: 0x0ab2, // XK_onefifth | ||
0x2156: 0x0ab3, // XK_twofifths | ||
0x2157: 0x0ab4, // XK_threefifths | ||
0x2158: 0x0ab5, // XK_fourfifths | ||
0x2159: 0x0ab6, // XK_onesixth | ||
0x215a: 0x0ab7, // XK_fivesixths | ||
0x215b: 0x0ac3, // XK_oneeighth | ||
0x215c: 0x0ac4, // XK_threeeighths | ||
0x215d: 0x0ac5, // XK_fiveeighths | ||
0x215e: 0x0ac6, // XK_seveneighths | ||
0x2190: 0x08fb, // XK_leftarrow | ||
0x2191: 0x08fc, // XK_uparrow | ||
0x2192: 0x08fd, // XK_rightarrow | ||
0x2193: 0x08fe, // XK_downarrow | ||
0x21d2: 0x08ce, // XK_implies | ||
0x21d4: 0x08cd, // XK_ifonlyif | ||
0x2202: 0x08ef, // XK_partialderivative | ||
0x2207: 0x08c5, // XK_nabla | ||
0x2218: 0x0bca, // XK_jot | ||
0x221a: 0x08d6, // XK_radical | ||
0x221d: 0x08c1, // XK_variation | ||
0x221e: 0x08c2, // XK_infinity | ||
0x2227: 0x08de, // XK_logicaland | ||
0x2228: 0x08df, // XK_logicalor | ||
0x2229: 0x08dc, // XK_intersection | ||
0x222a: 0x08dd, // XK_union | ||
0x222b: 0x08bf, // XK_integral | ||
0x2234: 0x08c0, // XK_therefore | ||
0x223c: 0x08c8, // XK_approximate | ||
0x2243: 0x08c9, // XK_similarequal | ||
0x2245: 0x1002248, // XK_approxeq | ||
0x2260: 0x08bd, // XK_notequal | ||
0x2261: 0x08cf, // XK_identical | ||
0x2264: 0x08bc, // XK_lessthanequal | ||
0x2265: 0x08be, // XK_greaterthanequal | ||
0x2282: 0x08da, // XK_includedin | ||
0x2283: 0x08db, // XK_includes | ||
0x22a2: 0x0bfc, // XK_righttack | ||
0x22a3: 0x0bdc, // XK_lefttack | ||
0x22a4: 0x0bc2, // XK_downtack | ||
0x22a5: 0x0bce, // XK_uptack | ||
0x2308: 0x0bd3, // XK_upstile | ||
0x230a: 0x0bc4, // XK_downstile | ||
0x2315: 0x0afa, // XK_telephonerecorder | ||
0x2320: 0x08a4, // XK_topintegral | ||
0x2321: 0x08a5, // XK_botintegral | ||
0x2395: 0x0bcc, // XK_quad | ||
0x239b: 0x08ab, // XK_topleftparens | ||
0x239d: 0x08ac, // XK_botleftparens | ||
0x239e: 0x08ad, // XK_toprightparens | ||
0x23a0: 0x08ae, // XK_botrightparens | ||
0x23a1: 0x08a7, // XK_topleftsqbracket | ||
0x23a3: 0x08a8, // XK_botleftsqbracket | ||
0x23a4: 0x08a9, // XK_toprightsqbracket | ||
0x23a6: 0x08aa, // XK_botrightsqbracket | ||
0x23a8: 0x08af, // XK_leftmiddlecurlybrace | ||
0x23ac: 0x08b0, // XK_rightmiddlecurlybrace | ||
0x23b7: 0x08a1, // XK_leftradical | ||
0x23ba: 0x09ef, // XK_horizlinescan1 | ||
0x23bb: 0x09f0, // XK_horizlinescan3 | ||
0x23bc: 0x09f2, // XK_horizlinescan7 | ||
0x23bd: 0x09f3, // XK_horizlinescan9 | ||
0x2409: 0x09e2, // XK_ht | ||
0x240a: 0x09e5, // XK_lf | ||
0x240b: 0x09e9, // XK_vt | ||
0x240c: 0x09e3, // XK_ff | ||
0x240d: 0x09e4, // XK_cr | ||
0x2423: 0x0aac, // XK_signifblank | ||
0x2424: 0x09e8, // XK_nl | ||
0x2500: 0x08a3, // XK_horizconnector | ||
0x2502: 0x08a6, // XK_vertconnector | ||
0x250c: 0x08a2, // XK_topleftradical | ||
0x2510: 0x09eb, // XK_uprightcorner | ||
0x2514: 0x09ed, // XK_lowleftcorner | ||
0x2518: 0x09ea, // XK_lowrightcorner | ||
0x251c: 0x09f4, // XK_leftt | ||
0x2524: 0x09f5, // XK_rightt | ||
0x252c: 0x09f7, // XK_topt | ||
0x2534: 0x09f6, // XK_bott | ||
0x253c: 0x09ee, // XK_crossinglines | ||
0x2592: 0x09e1, // XK_checkerboard | ||
0x25aa: 0x0ae7, // XK_enfilledsqbullet | ||
0x25ab: 0x0ae1, // XK_enopensquarebullet | ||
0x25ac: 0x0adb, // XK_filledrectbullet | ||
0x25ad: 0x0ae2, // XK_openrectbullet | ||
0x25ae: 0x0adf, // XK_emfilledrect | ||
0x25af: 0x0acf, // XK_emopenrectangle | ||
0x25b2: 0x0ae8, // XK_filledtribulletup | ||
0x25b3: 0x0ae3, // XK_opentribulletup | ||
0x25b6: 0x0add, // XK_filledrighttribullet | ||
0x25b7: 0x0acd, // XK_rightopentriangle | ||
0x25bc: 0x0ae9, // XK_filledtribulletdown | ||
0x25bd: 0x0ae4, // XK_opentribulletdown | ||
0x25c0: 0x0adc, // XK_filledlefttribullet | ||
0x25c1: 0x0acc, // XK_leftopentriangle | ||
0x25c6: 0x09e0, // XK_soliddiamond | ||
0x25cb: 0x0ace, // XK_emopencircle | ||
0x25cf: 0x0ade, // XK_emfilledcircle | ||
0x25e6: 0x0ae0, // XK_enopencircbullet | ||
0x2606: 0x0ae5, // XK_openstar | ||
0x260e: 0x0af9, // XK_telephone | ||
0x2613: 0x0aca, // XK_signaturemark | ||
0x261c: 0x0aea, // XK_leftpointer | ||
0x261e: 0x0aeb, // XK_rightpointer | ||
0x2640: 0x0af8, // XK_femalesymbol | ||
0x2642: 0x0af7, // XK_malesymbol | ||
0x2663: 0x0aec, // XK_club | ||
0x2665: 0x0aee, // XK_heart | ||
0x2666: 0x0aed, // XK_diamond | ||
0x266d: 0x0af6, // XK_musicalflat | ||
0x266f: 0x0af5, // XK_musicalsharp | ||
0x2713: 0x0af3, // XK_checkmark | ||
0x2717: 0x0af4, // XK_ballotcross | ||
0x271d: 0x0ad9, // XK_latincross | ||
0x2720: 0x0af0, // XK_maltesecross | ||
0x27e8: 0x0abc, // XK_leftanglebracket | ||
0x27e9: 0x0abe, // XK_rightanglebracket | ||
0x3001: 0x04a4, // XK_kana_comma | ||
0x3002: 0x04a1, // XK_kana_fullstop | ||
0x300c: 0x04a2, // XK_kana_openingbracket | ||
0x300d: 0x04a3, // XK_kana_closingbracket | ||
0x309b: 0x04de, // XK_voicedsound | ||
0x309c: 0x04df, // XK_semivoicedsound | ||
0x30a1: 0x04a7, // XK_kana_a | ||
0x30a2: 0x04b1, // XK_kana_A | ||
0x30a3: 0x04a8, // XK_kana_i | ||
0x30a4: 0x04b2, // XK_kana_I | ||
0x30a5: 0x04a9, // XK_kana_u | ||
0x30a6: 0x04b3, // XK_kana_U | ||
0x30a7: 0x04aa, // XK_kana_e | ||
0x30a8: 0x04b4, // XK_kana_E | ||
0x30a9: 0x04ab, // XK_kana_o | ||
0x30aa: 0x04b5, // XK_kana_O | ||
0x30ab: 0x04b6, // XK_kana_KA | ||
0x30ad: 0x04b7, // XK_kana_KI | ||
0x30af: 0x04b8, // XK_kana_KU | ||
0x30b1: 0x04b9, // XK_kana_KE | ||
0x30b3: 0x04ba, // XK_kana_KO | ||
0x30b5: 0x04bb, // XK_kana_SA | ||
0x30b7: 0x04bc, // XK_kana_SHI | ||
0x30b9: 0x04bd, // XK_kana_SU | ||
0x30bb: 0x04be, // XK_kana_SE | ||
0x30bd: 0x04bf, // XK_kana_SO | ||
0x30bf: 0x04c0, // XK_kana_TA | ||
0x30c1: 0x04c1, // XK_kana_CHI | ||
0x30c3: 0x04af, // XK_kana_tsu | ||
0x30c4: 0x04c2, // XK_kana_TSU | ||
0x30c6: 0x04c3, // XK_kana_TE | ||
0x30c8: 0x04c4, // XK_kana_TO | ||
0x30ca: 0x04c5, // XK_kana_NA | ||
0x30cb: 0x04c6, // XK_kana_NI | ||
0x30cc: 0x04c7, // XK_kana_NU | ||
0x30cd: 0x04c8, // XK_kana_NE | ||
0x30ce: 0x04c9, // XK_kana_NO | ||
0x30cf: 0x04ca, // XK_kana_HA | ||
0x30d2: 0x04cb, // XK_kana_HI | ||
0x30d5: 0x04cc, // XK_kana_FU | ||
0x30d8: 0x04cd, // XK_kana_HE | ||
0x30db: 0x04ce, // XK_kana_HO | ||
0x30de: 0x04cf, // XK_kana_MA | ||
0x30df: 0x04d0, // XK_kana_MI | ||
0x30e0: 0x04d1, // XK_kana_MU | ||
0x30e1: 0x04d2, // XK_kana_ME | ||
0x30e2: 0x04d3, // XK_kana_MO | ||
0x30e3: 0x04ac, // XK_kana_ya | ||
0x30e4: 0x04d4, // XK_kana_YA | ||
0x30e5: 0x04ad, // XK_kana_yu | ||
0x30e6: 0x04d5, // XK_kana_YU | ||
0x30e7: 0x04ae, // XK_kana_yo | ||
0x30e8: 0x04d6, // XK_kana_YO | ||
0x30e9: 0x04d7, // XK_kana_RA | ||
0x30ea: 0x04d8, // XK_kana_RI | ||
0x30eb: 0x04d9, // XK_kana_RU | ||
0x30ec: 0x04da, // XK_kana_RE | ||
0x30ed: 0x04db, // XK_kana_RO | ||
0x30ef: 0x04dc, // XK_kana_WA | ||
0x30f2: 0x04a6, // XK_kana_WO | ||
0x30f3: 0x04dd, // XK_kana_N | ||
0x30fb: 0x04a5, // XK_kana_conjunctive | ||
0x30fc: 0x04b0 // XK_prolongedsound | ||
}; | ||
var _default = { | ||
lookup: function lookup(u) { | ||
// Latin-1 is one-to-one mapping | ||
if (u >= 0x20 && u <= 0xff) { | ||
return u; | ||
} // Lookup table (fairly random) | ||
exports.default = { | ||
lookup: function lookup(u) { | ||
// Latin-1 is one-to-one mapping | ||
if (u >= 0x20 && u <= 0xff) { | ||
return u; | ||
} | ||
// Lookup table (fairly random) | ||
var keysym = codepoints[u]; | ||
if (keysym !== undefined) { | ||
return keysym; | ||
} | ||
var keysym = codepoints[u]; | ||
// General mapping as final fallback | ||
return 0x01000000 | u; | ||
} | ||
}; | ||
if (keysym !== undefined) { | ||
return keysym; | ||
} // General mapping as final fallback | ||
return 0x01000000 | u; | ||
} | ||
}; | ||
exports["default"] = _default; |
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
@@ -10,220 +12,249 @@ exports.getKeycode = getKeycode; | ||
var _keysymdef = require("./keysymdef.js"); | ||
var _keysym = _interopRequireDefault(require("./keysym.js")); | ||
var _keysymdef2 = _interopRequireDefault(_keysymdef); | ||
var _keysymdef = _interopRequireDefault(require("./keysymdef.js")); | ||
var _vkeys = require("./vkeys.js"); | ||
var _vkeys = _interopRequireDefault(require("./vkeys.js")); | ||
var _vkeys2 = _interopRequireDefault(_vkeys); | ||
var _fixedkeys = _interopRequireDefault(require("./fixedkeys.js")); | ||
var _fixedkeys = require("./fixedkeys.js"); | ||
var _domkeytable = _interopRequireDefault(require("./domkeytable.js")); | ||
var _fixedkeys2 = _interopRequireDefault(_fixedkeys); | ||
var browser = _interopRequireWildcard(require("../util/browser.js")); | ||
var _domkeytable = require("./domkeytable.js"); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
var _domkeytable2 = _interopRequireDefault(_domkeytable); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
var _browser = require("../util/browser.js"); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var browser = _interopRequireWildcard(_browser); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
// Get 'KeyboardEvent.code', handling legacy browsers | ||
function getKeycode(evt) { | ||
// Are we getting proper key identifiers? | ||
// (unfortunately Firefox and Chrome are crappy here and gives | ||
// us an empty string on some platforms, rather than leaving it | ||
// undefined) | ||
if (evt.code) { | ||
// Mozilla isn't fully in sync with the spec yet | ||
switch (evt.code) { | ||
case 'OSLeft': | ||
return 'MetaLeft'; | ||
case 'OSRight': | ||
return 'MetaRight'; | ||
} | ||
// Are we getting proper key identifiers? | ||
// (unfortunately Firefox and Chrome are crappy here and gives | ||
// us an empty string on some platforms, rather than leaving it | ||
// undefined) | ||
if (evt.code) { | ||
// Mozilla isn't fully in sync with the spec yet | ||
switch (evt.code) { | ||
case 'OSLeft': | ||
return 'MetaLeft'; | ||
return evt.code; | ||
case 'OSRight': | ||
return 'MetaRight'; | ||
} | ||
// The de-facto standard is to use Windows Virtual-Key codes | ||
// in the 'keyCode' field for non-printable characters. However | ||
// Webkit sets it to the same as charCode in 'keypress' events. | ||
if (evt.type !== 'keypress' && evt.keyCode in _vkeys2.default) { | ||
var code = _vkeys2.default[evt.keyCode]; | ||
return evt.code; | ||
} // The de-facto standard is to use Windows Virtual-Key codes | ||
// in the 'keyCode' field for non-printable characters | ||
// macOS has messed up this code for some reason | ||
if (browser.isMac() && code === 'ContextMenu') { | ||
code = 'MetaRight'; | ||
} | ||
// The keyCode doesn't distinguish between left and right | ||
// for the standard modifiers | ||
if (evt.location === 2) { | ||
switch (code) { | ||
case 'ShiftLeft': | ||
return 'ShiftRight'; | ||
case 'ControlLeft': | ||
return 'ControlRight'; | ||
case 'AltLeft': | ||
return 'AltRight'; | ||
} | ||
} | ||
if (evt.keyCode in _vkeys["default"]) { | ||
var code = _vkeys["default"][evt.keyCode]; // macOS has messed up this code for some reason | ||
// Nor a bunch of the numpad keys | ||
if (evt.location === 3) { | ||
switch (code) { | ||
case 'Delete': | ||
return 'NumpadDecimal'; | ||
case 'Insert': | ||
return 'Numpad0'; | ||
case 'End': | ||
return 'Numpad1'; | ||
case 'ArrowDown': | ||
return 'Numpad2'; | ||
case 'PageDown': | ||
return 'Numpad3'; | ||
case 'ArrowLeft': | ||
return 'Numpad4'; | ||
case 'ArrowRight': | ||
return 'Numpad6'; | ||
case 'Home': | ||
return 'Numpad7'; | ||
case 'ArrowUp': | ||
return 'Numpad8'; | ||
case 'PageUp': | ||
return 'Numpad9'; | ||
case 'Enter': | ||
return 'NumpadEnter'; | ||
} | ||
} | ||
if (browser.isMac() && code === 'ContextMenu') { | ||
code = 'MetaRight'; | ||
} // The keyCode doesn't distinguish between left and right | ||
// for the standard modifiers | ||
return code; | ||
if (evt.location === 2) { | ||
switch (code) { | ||
case 'ShiftLeft': | ||
return 'ShiftRight'; | ||
case 'ControlLeft': | ||
return 'ControlRight'; | ||
case 'AltLeft': | ||
return 'AltRight'; | ||
} | ||
} // Nor a bunch of the numpad keys | ||
if (evt.location === 3) { | ||
switch (code) { | ||
case 'Delete': | ||
return 'NumpadDecimal'; | ||
case 'Insert': | ||
return 'Numpad0'; | ||
case 'End': | ||
return 'Numpad1'; | ||
case 'ArrowDown': | ||
return 'Numpad2'; | ||
case 'PageDown': | ||
return 'Numpad3'; | ||
case 'ArrowLeft': | ||
return 'Numpad4'; | ||
case 'ArrowRight': | ||
return 'Numpad6'; | ||
case 'Home': | ||
return 'Numpad7'; | ||
case 'ArrowUp': | ||
return 'Numpad8'; | ||
case 'PageUp': | ||
return 'Numpad9'; | ||
case 'Enter': | ||
return 'NumpadEnter'; | ||
} | ||
} | ||
return 'Unidentified'; | ||
} | ||
return code; | ||
} | ||
// Get 'KeyboardEvent.key', handling legacy browsers | ||
return 'Unidentified'; | ||
} // Get 'KeyboardEvent.key', handling legacy browsers | ||
function getKey(evt) { | ||
// Are we getting a proper key value? | ||
if (evt.key !== undefined) { | ||
// IE and Edge use some ancient version of the spec | ||
// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/ | ||
switch (evt.key) { | ||
case 'Spacebar': | ||
return ' '; | ||
case 'Esc': | ||
return 'Escape'; | ||
case 'Scroll': | ||
return 'ScrollLock'; | ||
case 'Win': | ||
return 'Meta'; | ||
case 'Apps': | ||
return 'ContextMenu'; | ||
case 'Up': | ||
return 'ArrowUp'; | ||
case 'Left': | ||
return 'ArrowLeft'; | ||
case 'Right': | ||
return 'ArrowRight'; | ||
case 'Down': | ||
return 'ArrowDown'; | ||
case 'Del': | ||
return 'Delete'; | ||
case 'Divide': | ||
return '/'; | ||
case 'Multiply': | ||
return '*'; | ||
case 'Subtract': | ||
return '-'; | ||
case 'Add': | ||
return '+'; | ||
case 'Decimal': | ||
return evt.char; | ||
} | ||
// Are we getting a proper key value? | ||
if (evt.key !== undefined) { | ||
// Mozilla isn't fully in sync with the spec yet | ||
switch (evt.key) { | ||
case 'OS': | ||
return 'Meta'; | ||
// Mozilla isn't fully in sync with the spec yet | ||
switch (evt.key) { | ||
case 'OS': | ||
return 'Meta'; | ||
} | ||
case 'LaunchMyComputer': | ||
return 'LaunchApplication1'; | ||
// iOS leaks some OS names | ||
switch (evt.key) { | ||
case 'UIKeyInputUpArrow': | ||
return 'ArrowUp'; | ||
case 'UIKeyInputDownArrow': | ||
return 'ArrowDown'; | ||
case 'UIKeyInputLeftArrow': | ||
return 'ArrowLeft'; | ||
case 'UIKeyInputRightArrow': | ||
return 'ArrowRight'; | ||
case 'UIKeyInputEscape': | ||
return 'Escape'; | ||
} | ||
case 'LaunchCalculator': | ||
return 'LaunchApplication2'; | ||
} // iOS leaks some OS names | ||
// IE and Edge have broken handling of AltGraph so we cannot | ||
// trust them for printable characters | ||
if (evt.key.length !== 1 || !browser.isIE() && !browser.isEdge()) { | ||
return evt.key; | ||
} | ||
} | ||
// Try to deduce it based on the physical key | ||
var code = getKeycode(evt); | ||
if (code in _fixedkeys2.default) { | ||
return _fixedkeys2.default[code]; | ||
} | ||
switch (evt.key) { | ||
case 'UIKeyInputUpArrow': | ||
return 'ArrowUp'; | ||
// If that failed, then see if we have a printable character | ||
if (evt.charCode) { | ||
return String.fromCharCode(evt.charCode); | ||
case 'UIKeyInputDownArrow': | ||
return 'ArrowDown'; | ||
case 'UIKeyInputLeftArrow': | ||
return 'ArrowLeft'; | ||
case 'UIKeyInputRightArrow': | ||
return 'ArrowRight'; | ||
case 'UIKeyInputEscape': | ||
return 'Escape'; | ||
} // Broken behaviour in Chrome | ||
if (evt.key === '\x00' && evt.code === 'NumpadDecimal') { | ||
return 'Delete'; | ||
} | ||
// At this point we have nothing left to go on | ||
return 'Unidentified'; | ||
} | ||
return evt.key; | ||
} // Try to deduce it based on the physical key | ||
// Get the most reliable keysym value we can get from a key event | ||
var code = getKeycode(evt); | ||
if (code in _fixedkeys["default"]) { | ||
return _fixedkeys["default"][code]; | ||
} // If that failed, then see if we have a printable character | ||
if (evt.charCode) { | ||
return String.fromCharCode(evt.charCode); | ||
} // At this point we have nothing left to go on | ||
return 'Unidentified'; | ||
} // Get the most reliable keysym value we can get from a key event | ||
function getKeysym(evt) { | ||
var key = getKey(evt); | ||
var key = getKey(evt); | ||
if (key === 'Unidentified') { | ||
return null; | ||
} | ||
if (key === 'Unidentified') { | ||
return null; | ||
} // First look up special keys | ||
// First look up special keys | ||
if (key in _domkeytable2.default) { | ||
var location = evt.location; | ||
// Safari screws up location for the right cmd key | ||
if (key === 'Meta' && location === 0) { | ||
location = 2; | ||
} | ||
if (key in _domkeytable["default"]) { | ||
var location = evt.location; // Safari screws up location for the right cmd key | ||
if (location === undefined || location > 3) { | ||
location = 0; | ||
} | ||
if (key === 'Meta' && location === 0) { | ||
location = 2; | ||
} // And for Clear | ||
return _domkeytable2.default[key][location]; | ||
} | ||
// Now we need to look at the Unicode symbol instead | ||
if (key === 'Clear' && location === 3) { | ||
var code = getKeycode(evt); | ||
// Special key? (FIXME: Should have been caught earlier) | ||
if (key.length !== 1) { | ||
return null; | ||
if (code === 'NumLock') { | ||
location = 0; | ||
} | ||
} | ||
var codepoint = key.charCodeAt(); | ||
if (codepoint) { | ||
return _keysymdef2.default.lookup(codepoint); | ||
if (location === undefined || location > 3) { | ||
location = 0; | ||
} // The original Meta key now gets confused with the Windows key | ||
// https://bugs.chromium.org/p/chromium/issues/detail?id=1020141 | ||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1232918 | ||
if (key === 'Meta') { | ||
var _code = getKeycode(evt); | ||
if (_code === 'AltLeft') { | ||
return _keysym["default"].XK_Meta_L; | ||
} else if (_code === 'AltRight') { | ||
return _keysym["default"].XK_Meta_R; | ||
} | ||
} // macOS has Clear instead of NumLock, but the remote system is | ||
// probably not macOS, so lying here is probably best... | ||
if (key === 'Clear') { | ||
var _code2 = getKeycode(evt); | ||
if (_code2 === 'NumLock') { | ||
return _keysym["default"].XK_Num_Lock; | ||
} | ||
} // Windows sends alternating symbols for some keys when using a | ||
// Japanese layout. We have no way of synchronising with the IM | ||
// running on the remote system, so we send some combined keysym | ||
// instead and hope for the best. | ||
if (browser.isWindows()) { | ||
switch (key) { | ||
case 'Zenkaku': | ||
case 'Hankaku': | ||
return _keysym["default"].XK_Zenkaku_Hankaku; | ||
case 'Romaji': | ||
case 'KanaMode': | ||
return _keysym["default"].XK_Romaji; | ||
} | ||
} | ||
return _domkeytable["default"][key][location]; | ||
} // Now we need to look at the Unicode symbol instead | ||
// Special key? (FIXME: Should have been caught earlier) | ||
if (key.length !== 1) { | ||
return null; | ||
} | ||
var codepoint = key.charCodeAt(); | ||
if (codepoint) { | ||
return _keysymdef["default"].lookup(codepoint); | ||
} | ||
return null; | ||
} |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -6,2 +6,4 @@ Object.defineProperty(exports, "__esModule", { | ||
}); | ||
exports["default"] = void 0; | ||
/* | ||
@@ -17,8 +19,6 @@ * noVNC: HTML5 VNC client | ||
*/ | ||
exports.default = { | ||
var _default = { | ||
0x08: 'Backspace', | ||
0x09: 'Tab', | ||
0x0a: 'NumpadClear', | ||
0x0c: 'Numpad5', // IE11 sends evt.keyCode: 12 when numlock is off | ||
0x0d: 'Enter', | ||
@@ -77,3 +77,4 @@ 0x10: 'ShiftLeft', | ||
0x6d: 'NumpadSubtract', | ||
0x6e: 'NumpadDecimal', // Duplicate, because buggy on Windows | ||
0x6e: 'NumpadDecimal', | ||
// Duplicate, because buggy on Windows | ||
0x6f: 'NumpadDivide', | ||
@@ -125,2 +126,4 @@ 0x70: 'F1', | ||
0xe1: 'AltRight' // Only when it is AltGraph | ||
}; | ||
}; | ||
exports["default"] = _default; |
@@ -6,172 +6,507 @@ "use strict"; | ||
}); | ||
exports["default"] = void 0; | ||
/* | ||
* This file is auto-generated from keymaps.csv on 2017-05-31 16:20 | ||
* Database checksum sha256(92fd165507f2a3b8c5b3fa56e425d45788dbcb98cf067a307527d91ce22cab94) | ||
* This file is auto-generated from keymaps.csv | ||
* Database checksum sha256(76d68c10e97d37fe2ea459e210125ae41796253fb217e900bf2983ade13a7920) | ||
* To re-generate, run: | ||
* keymap-gen --lang=js code-map keymaps.csv html atset1 | ||
* keymap-gen code-map --lang=js keymaps.csv html atset1 | ||
*/ | ||
exports.default = { | ||
"Again": 0xe005, /* html:Again (Again) -> linux:129 (KEY_AGAIN) -> atset1:57349 */ | ||
"AltLeft": 0x38, /* html:AltLeft (AltLeft) -> linux:56 (KEY_LEFTALT) -> atset1:56 */ | ||
"AltRight": 0xe038, /* html:AltRight (AltRight) -> linux:100 (KEY_RIGHTALT) -> atset1:57400 */ | ||
"ArrowDown": 0xe050, /* html:ArrowDown (ArrowDown) -> linux:108 (KEY_DOWN) -> atset1:57424 */ | ||
"ArrowLeft": 0xe04b, /* html:ArrowLeft (ArrowLeft) -> linux:105 (KEY_LEFT) -> atset1:57419 */ | ||
"ArrowRight": 0xe04d, /* html:ArrowRight (ArrowRight) -> linux:106 (KEY_RIGHT) -> atset1:57421 */ | ||
"ArrowUp": 0xe048, /* html:ArrowUp (ArrowUp) -> linux:103 (KEY_UP) -> atset1:57416 */ | ||
"AudioVolumeDown": 0xe02e, /* html:AudioVolumeDown (AudioVolumeDown) -> linux:114 (KEY_VOLUMEDOWN) -> atset1:57390 */ | ||
"AudioVolumeMute": 0xe020, /* html:AudioVolumeMute (AudioVolumeMute) -> linux:113 (KEY_MUTE) -> atset1:57376 */ | ||
"AudioVolumeUp": 0xe030, /* html:AudioVolumeUp (AudioVolumeUp) -> linux:115 (KEY_VOLUMEUP) -> atset1:57392 */ | ||
"Backquote": 0x29, /* html:Backquote (Backquote) -> linux:41 (KEY_GRAVE) -> atset1:41 */ | ||
"Backslash": 0x2b, /* html:Backslash (Backslash) -> linux:43 (KEY_BACKSLASH) -> atset1:43 */ | ||
"Backspace": 0xe, /* html:Backspace (Backspace) -> linux:14 (KEY_BACKSPACE) -> atset1:14 */ | ||
"BracketLeft": 0x1a, /* html:BracketLeft (BracketLeft) -> linux:26 (KEY_LEFTBRACE) -> atset1:26 */ | ||
"BracketRight": 0x1b, /* html:BracketRight (BracketRight) -> linux:27 (KEY_RIGHTBRACE) -> atset1:27 */ | ||
"BrowserBack": 0xe06a, /* html:BrowserBack (BrowserBack) -> linux:158 (KEY_BACK) -> atset1:57450 */ | ||
"BrowserFavorites": 0xe066, /* html:BrowserFavorites (BrowserFavorites) -> linux:156 (KEY_BOOKMARKS) -> atset1:57446 */ | ||
"BrowserForward": 0xe069, /* html:BrowserForward (BrowserForward) -> linux:159 (KEY_FORWARD) -> atset1:57449 */ | ||
"BrowserHome": 0xe032, /* html:BrowserHome (BrowserHome) -> linux:172 (KEY_HOMEPAGE) -> atset1:57394 */ | ||
"BrowserRefresh": 0xe067, /* html:BrowserRefresh (BrowserRefresh) -> linux:173 (KEY_REFRESH) -> atset1:57447 */ | ||
"BrowserSearch": 0xe065, /* html:BrowserSearch (BrowserSearch) -> linux:217 (KEY_SEARCH) -> atset1:57445 */ | ||
"BrowserStop": 0xe068, /* html:BrowserStop (BrowserStop) -> linux:128 (KEY_STOP) -> atset1:57448 */ | ||
"CapsLock": 0x3a, /* html:CapsLock (CapsLock) -> linux:58 (KEY_CAPSLOCK) -> atset1:58 */ | ||
"Comma": 0x33, /* html:Comma (Comma) -> linux:51 (KEY_COMMA) -> atset1:51 */ | ||
"ContextMenu": 0xe05d, /* html:ContextMenu (ContextMenu) -> linux:127 (KEY_COMPOSE) -> atset1:57437 */ | ||
"ControlLeft": 0x1d, /* html:ControlLeft (ControlLeft) -> linux:29 (KEY_LEFTCTRL) -> atset1:29 */ | ||
"ControlRight": 0xe01d, /* html:ControlRight (ControlRight) -> linux:97 (KEY_RIGHTCTRL) -> atset1:57373 */ | ||
"Convert": 0x79, /* html:Convert (Convert) -> linux:92 (KEY_HENKAN) -> atset1:121 */ | ||
"Copy": 0xe078, /* html:Copy (Copy) -> linux:133 (KEY_COPY) -> atset1:57464 */ | ||
"Cut": 0xe03c, /* html:Cut (Cut) -> linux:137 (KEY_CUT) -> atset1:57404 */ | ||
"Delete": 0xe053, /* html:Delete (Delete) -> linux:111 (KEY_DELETE) -> atset1:57427 */ | ||
"Digit0": 0xb, /* html:Digit0 (Digit0) -> linux:11 (KEY_0) -> atset1:11 */ | ||
"Digit1": 0x2, /* html:Digit1 (Digit1) -> linux:2 (KEY_1) -> atset1:2 */ | ||
"Digit2": 0x3, /* html:Digit2 (Digit2) -> linux:3 (KEY_2) -> atset1:3 */ | ||
"Digit3": 0x4, /* html:Digit3 (Digit3) -> linux:4 (KEY_3) -> atset1:4 */ | ||
"Digit4": 0x5, /* html:Digit4 (Digit4) -> linux:5 (KEY_4) -> atset1:5 */ | ||
"Digit5": 0x6, /* html:Digit5 (Digit5) -> linux:6 (KEY_5) -> atset1:6 */ | ||
"Digit6": 0x7, /* html:Digit6 (Digit6) -> linux:7 (KEY_6) -> atset1:7 */ | ||
"Digit7": 0x8, /* html:Digit7 (Digit7) -> linux:8 (KEY_7) -> atset1:8 */ | ||
"Digit8": 0x9, /* html:Digit8 (Digit8) -> linux:9 (KEY_8) -> atset1:9 */ | ||
"Digit9": 0xa, /* html:Digit9 (Digit9) -> linux:10 (KEY_9) -> atset1:10 */ | ||
"Eject": 0xe07d, /* html:Eject (Eject) -> linux:162 (KEY_EJECTCLOSECD) -> atset1:57469 */ | ||
"End": 0xe04f, /* html:End (End) -> linux:107 (KEY_END) -> atset1:57423 */ | ||
"Enter": 0x1c, /* html:Enter (Enter) -> linux:28 (KEY_ENTER) -> atset1:28 */ | ||
"Equal": 0xd, /* html:Equal (Equal) -> linux:13 (KEY_EQUAL) -> atset1:13 */ | ||
"Escape": 0x1, /* html:Escape (Escape) -> linux:1 (KEY_ESC) -> atset1:1 */ | ||
"F1": 0x3b, /* html:F1 (F1) -> linux:59 (KEY_F1) -> atset1:59 */ | ||
"F10": 0x44, /* html:F10 (F10) -> linux:68 (KEY_F10) -> atset1:68 */ | ||
"F11": 0x57, /* html:F11 (F11) -> linux:87 (KEY_F11) -> atset1:87 */ | ||
"F12": 0x58, /* html:F12 (F12) -> linux:88 (KEY_F12) -> atset1:88 */ | ||
"F13": 0x5d, /* html:F13 (F13) -> linux:183 (KEY_F13) -> atset1:93 */ | ||
"F14": 0x5e, /* html:F14 (F14) -> linux:184 (KEY_F14) -> atset1:94 */ | ||
"F15": 0x5f, /* html:F15 (F15) -> linux:185 (KEY_F15) -> atset1:95 */ | ||
"F16": 0x55, /* html:F16 (F16) -> linux:186 (KEY_F16) -> atset1:85 */ | ||
"F17": 0xe003, /* html:F17 (F17) -> linux:187 (KEY_F17) -> atset1:57347 */ | ||
"F18": 0xe077, /* html:F18 (F18) -> linux:188 (KEY_F18) -> atset1:57463 */ | ||
"F19": 0xe004, /* html:F19 (F19) -> linux:189 (KEY_F19) -> atset1:57348 */ | ||
"F2": 0x3c, /* html:F2 (F2) -> linux:60 (KEY_F2) -> atset1:60 */ | ||
"F20": 0x5a, /* html:F20 (F20) -> linux:190 (KEY_F20) -> atset1:90 */ | ||
"F21": 0x74, /* html:F21 (F21) -> linux:191 (KEY_F21) -> atset1:116 */ | ||
"F22": 0xe079, /* html:F22 (F22) -> linux:192 (KEY_F22) -> atset1:57465 */ | ||
"F23": 0x6d, /* html:F23 (F23) -> linux:193 (KEY_F23) -> atset1:109 */ | ||
"F24": 0x6f, /* html:F24 (F24) -> linux:194 (KEY_F24) -> atset1:111 */ | ||
"F3": 0x3d, /* html:F3 (F3) -> linux:61 (KEY_F3) -> atset1:61 */ | ||
"F4": 0x3e, /* html:F4 (F4) -> linux:62 (KEY_F4) -> atset1:62 */ | ||
"F5": 0x3f, /* html:F5 (F5) -> linux:63 (KEY_F5) -> atset1:63 */ | ||
"F6": 0x40, /* html:F6 (F6) -> linux:64 (KEY_F6) -> atset1:64 */ | ||
"F7": 0x41, /* html:F7 (F7) -> linux:65 (KEY_F7) -> atset1:65 */ | ||
"F8": 0x42, /* html:F8 (F8) -> linux:66 (KEY_F8) -> atset1:66 */ | ||
"F9": 0x43, /* html:F9 (F9) -> linux:67 (KEY_F9) -> atset1:67 */ | ||
"Find": 0xe041, /* html:Find (Find) -> linux:136 (KEY_FIND) -> atset1:57409 */ | ||
"Help": 0xe075, /* html:Help (Help) -> linux:138 (KEY_HELP) -> atset1:57461 */ | ||
"Hiragana": 0x77, /* html:Hiragana (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */ | ||
"Home": 0xe047, /* html:Home (Home) -> linux:102 (KEY_HOME) -> atset1:57415 */ | ||
"Insert": 0xe052, /* html:Insert (Insert) -> linux:110 (KEY_INSERT) -> atset1:57426 */ | ||
"IntlBackslash": 0x56, /* html:IntlBackslash (IntlBackslash) -> linux:86 (KEY_102ND) -> atset1:86 */ | ||
"IntlRo": 0x73, /* html:IntlRo (IntlRo) -> linux:89 (KEY_RO) -> atset1:115 */ | ||
"IntlYen": 0x7d, /* html:IntlYen (IntlYen) -> linux:124 (KEY_YEN) -> atset1:125 */ | ||
"KanaMode": 0x70, /* html:KanaMode (KanaMode) -> linux:93 (KEY_KATAKANAHIRAGANA) -> atset1:112 */ | ||
"Katakana": 0x78, /* html:Katakana (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */ | ||
"KeyA": 0x1e, /* html:KeyA (KeyA) -> linux:30 (KEY_A) -> atset1:30 */ | ||
"KeyB": 0x30, /* html:KeyB (KeyB) -> linux:48 (KEY_B) -> atset1:48 */ | ||
"KeyC": 0x2e, /* html:KeyC (KeyC) -> linux:46 (KEY_C) -> atset1:46 */ | ||
"KeyD": 0x20, /* html:KeyD (KeyD) -> linux:32 (KEY_D) -> atset1:32 */ | ||
"KeyE": 0x12, /* html:KeyE (KeyE) -> linux:18 (KEY_E) -> atset1:18 */ | ||
"KeyF": 0x21, /* html:KeyF (KeyF) -> linux:33 (KEY_F) -> atset1:33 */ | ||
"KeyG": 0x22, /* html:KeyG (KeyG) -> linux:34 (KEY_G) -> atset1:34 */ | ||
"KeyH": 0x23, /* html:KeyH (KeyH) -> linux:35 (KEY_H) -> atset1:35 */ | ||
"KeyI": 0x17, /* html:KeyI (KeyI) -> linux:23 (KEY_I) -> atset1:23 */ | ||
"KeyJ": 0x24, /* html:KeyJ (KeyJ) -> linux:36 (KEY_J) -> atset1:36 */ | ||
"KeyK": 0x25, /* html:KeyK (KeyK) -> linux:37 (KEY_K) -> atset1:37 */ | ||
"KeyL": 0x26, /* html:KeyL (KeyL) -> linux:38 (KEY_L) -> atset1:38 */ | ||
"KeyM": 0x32, /* html:KeyM (KeyM) -> linux:50 (KEY_M) -> atset1:50 */ | ||
"KeyN": 0x31, /* html:KeyN (KeyN) -> linux:49 (KEY_N) -> atset1:49 */ | ||
"KeyO": 0x18, /* html:KeyO (KeyO) -> linux:24 (KEY_O) -> atset1:24 */ | ||
"KeyP": 0x19, /* html:KeyP (KeyP) -> linux:25 (KEY_P) -> atset1:25 */ | ||
"KeyQ": 0x10, /* html:KeyQ (KeyQ) -> linux:16 (KEY_Q) -> atset1:16 */ | ||
"KeyR": 0x13, /* html:KeyR (KeyR) -> linux:19 (KEY_R) -> atset1:19 */ | ||
"KeyS": 0x1f, /* html:KeyS (KeyS) -> linux:31 (KEY_S) -> atset1:31 */ | ||
"KeyT": 0x14, /* html:KeyT (KeyT) -> linux:20 (KEY_T) -> atset1:20 */ | ||
"KeyU": 0x16, /* html:KeyU (KeyU) -> linux:22 (KEY_U) -> atset1:22 */ | ||
"KeyV": 0x2f, /* html:KeyV (KeyV) -> linux:47 (KEY_V) -> atset1:47 */ | ||
"KeyW": 0x11, /* html:KeyW (KeyW) -> linux:17 (KEY_W) -> atset1:17 */ | ||
"KeyX": 0x2d, /* html:KeyX (KeyX) -> linux:45 (KEY_X) -> atset1:45 */ | ||
"KeyY": 0x15, /* html:KeyY (KeyY) -> linux:21 (KEY_Y) -> atset1:21 */ | ||
"KeyZ": 0x2c, /* html:KeyZ (KeyZ) -> linux:44 (KEY_Z) -> atset1:44 */ | ||
"Lang3": 0x78, /* html:Lang3 (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */ | ||
"Lang4": 0x77, /* html:Lang4 (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */ | ||
"Lang5": 0x76, /* html:Lang5 (Lang5) -> linux:85 (KEY_ZENKAKUHANKAKU) -> atset1:118 */ | ||
"LaunchApp1": 0xe06b, /* html:LaunchApp1 (LaunchApp1) -> linux:157 (KEY_COMPUTER) -> atset1:57451 */ | ||
"LaunchApp2": 0xe021, /* html:LaunchApp2 (LaunchApp2) -> linux:140 (KEY_CALC) -> atset1:57377 */ | ||
"LaunchMail": 0xe06c, /* html:LaunchMail (LaunchMail) -> linux:155 (KEY_MAIL) -> atset1:57452 */ | ||
"MediaPlayPause": 0xe022, /* html:MediaPlayPause (MediaPlayPause) -> linux:164 (KEY_PLAYPAUSE) -> atset1:57378 */ | ||
"MediaSelect": 0xe06d, /* html:MediaSelect (MediaSelect) -> linux:226 (KEY_MEDIA) -> atset1:57453 */ | ||
"MediaStop": 0xe024, /* html:MediaStop (MediaStop) -> linux:166 (KEY_STOPCD) -> atset1:57380 */ | ||
"MediaTrackNext": 0xe019, /* html:MediaTrackNext (MediaTrackNext) -> linux:163 (KEY_NEXTSONG) -> atset1:57369 */ | ||
"MediaTrackPrevious": 0xe010, /* html:MediaTrackPrevious (MediaTrackPrevious) -> linux:165 (KEY_PREVIOUSSONG) -> atset1:57360 */ | ||
"MetaLeft": 0xe05b, /* html:MetaLeft (MetaLeft) -> linux:125 (KEY_LEFTMETA) -> atset1:57435 */ | ||
"MetaRight": 0xe05c, /* html:MetaRight (MetaRight) -> linux:126 (KEY_RIGHTMETA) -> atset1:57436 */ | ||
"Minus": 0xc, /* html:Minus (Minus) -> linux:12 (KEY_MINUS) -> atset1:12 */ | ||
"NonConvert": 0x7b, /* html:NonConvert (NonConvert) -> linux:94 (KEY_MUHENKAN) -> atset1:123 */ | ||
"NumLock": 0x45, /* html:NumLock (NumLock) -> linux:69 (KEY_NUMLOCK) -> atset1:69 */ | ||
"Numpad0": 0x52, /* html:Numpad0 (Numpad0) -> linux:82 (KEY_KP0) -> atset1:82 */ | ||
"Numpad1": 0x4f, /* html:Numpad1 (Numpad1) -> linux:79 (KEY_KP1) -> atset1:79 */ | ||
"Numpad2": 0x50, /* html:Numpad2 (Numpad2) -> linux:80 (KEY_KP2) -> atset1:80 */ | ||
"Numpad3": 0x51, /* html:Numpad3 (Numpad3) -> linux:81 (KEY_KP3) -> atset1:81 */ | ||
"Numpad4": 0x4b, /* html:Numpad4 (Numpad4) -> linux:75 (KEY_KP4) -> atset1:75 */ | ||
"Numpad5": 0x4c, /* html:Numpad5 (Numpad5) -> linux:76 (KEY_KP5) -> atset1:76 */ | ||
"Numpad6": 0x4d, /* html:Numpad6 (Numpad6) -> linux:77 (KEY_KP6) -> atset1:77 */ | ||
"Numpad7": 0x47, /* html:Numpad7 (Numpad7) -> linux:71 (KEY_KP7) -> atset1:71 */ | ||
"Numpad8": 0x48, /* html:Numpad8 (Numpad8) -> linux:72 (KEY_KP8) -> atset1:72 */ | ||
"Numpad9": 0x49, /* html:Numpad9 (Numpad9) -> linux:73 (KEY_KP9) -> atset1:73 */ | ||
"NumpadAdd": 0x4e, /* html:NumpadAdd (NumpadAdd) -> linux:78 (KEY_KPPLUS) -> atset1:78 */ | ||
"NumpadComma": 0x7e, /* html:NumpadComma (NumpadComma) -> linux:121 (KEY_KPCOMMA) -> atset1:126 */ | ||
"NumpadDecimal": 0x53, /* html:NumpadDecimal (NumpadDecimal) -> linux:83 (KEY_KPDOT) -> atset1:83 */ | ||
"NumpadDivide": 0xe035, /* html:NumpadDivide (NumpadDivide) -> linux:98 (KEY_KPSLASH) -> atset1:57397 */ | ||
"NumpadEnter": 0xe01c, /* html:NumpadEnter (NumpadEnter) -> linux:96 (KEY_KPENTER) -> atset1:57372 */ | ||
"NumpadEqual": 0x59, /* html:NumpadEqual (NumpadEqual) -> linux:117 (KEY_KPEQUAL) -> atset1:89 */ | ||
"NumpadMultiply": 0x37, /* html:NumpadMultiply (NumpadMultiply) -> linux:55 (KEY_KPASTERISK) -> atset1:55 */ | ||
"NumpadParenLeft": 0xe076, /* html:NumpadParenLeft (NumpadParenLeft) -> linux:179 (KEY_KPLEFTPAREN) -> atset1:57462 */ | ||
"NumpadParenRight": 0xe07b, /* html:NumpadParenRight (NumpadParenRight) -> linux:180 (KEY_KPRIGHTPAREN) -> atset1:57467 */ | ||
"NumpadSubtract": 0x4a, /* html:NumpadSubtract (NumpadSubtract) -> linux:74 (KEY_KPMINUS) -> atset1:74 */ | ||
"Open": 0x64, /* html:Open (Open) -> linux:134 (KEY_OPEN) -> atset1:100 */ | ||
"PageDown": 0xe051, /* html:PageDown (PageDown) -> linux:109 (KEY_PAGEDOWN) -> atset1:57425 */ | ||
"PageUp": 0xe049, /* html:PageUp (PageUp) -> linux:104 (KEY_PAGEUP) -> atset1:57417 */ | ||
"Paste": 0x65, /* html:Paste (Paste) -> linux:135 (KEY_PASTE) -> atset1:101 */ | ||
"Pause": 0xe046, /* html:Pause (Pause) -> linux:119 (KEY_PAUSE) -> atset1:57414 */ | ||
"Period": 0x34, /* html:Period (Period) -> linux:52 (KEY_DOT) -> atset1:52 */ | ||
"Power": 0xe05e, /* html:Power (Power) -> linux:116 (KEY_POWER) -> atset1:57438 */ | ||
"PrintScreen": 0x54, /* html:PrintScreen (PrintScreen) -> linux:99 (KEY_SYSRQ) -> atset1:84 */ | ||
"Props": 0xe006, /* html:Props (Props) -> linux:130 (KEY_PROPS) -> atset1:57350 */ | ||
"Quote": 0x28, /* html:Quote (Quote) -> linux:40 (KEY_APOSTROPHE) -> atset1:40 */ | ||
"ScrollLock": 0x46, /* html:ScrollLock (ScrollLock) -> linux:70 (KEY_SCROLLLOCK) -> atset1:70 */ | ||
"Semicolon": 0x27, /* html:Semicolon (Semicolon) -> linux:39 (KEY_SEMICOLON) -> atset1:39 */ | ||
"ShiftLeft": 0x2a, /* html:ShiftLeft (ShiftLeft) -> linux:42 (KEY_LEFTSHIFT) -> atset1:42 */ | ||
"ShiftRight": 0x36, /* html:ShiftRight (ShiftRight) -> linux:54 (KEY_RIGHTSHIFT) -> atset1:54 */ | ||
"Slash": 0x35, /* html:Slash (Slash) -> linux:53 (KEY_SLASH) -> atset1:53 */ | ||
"Sleep": 0xe05f, /* html:Sleep (Sleep) -> linux:142 (KEY_SLEEP) -> atset1:57439 */ | ||
"Space": 0x39, /* html:Space (Space) -> linux:57 (KEY_SPACE) -> atset1:57 */ | ||
"Suspend": 0xe025, /* html:Suspend (Suspend) -> linux:205 (KEY_SUSPEND) -> atset1:57381 */ | ||
"Tab": 0xf, /* html:Tab (Tab) -> linux:15 (KEY_TAB) -> atset1:15 */ | ||
"Undo": 0xe007, /* html:Undo (Undo) -> linux:131 (KEY_UNDO) -> atset1:57351 */ | ||
"WakeUp": 0xe063 /* html:WakeUp (WakeUp) -> linux:143 (KEY_WAKEUP) -> atset1:57443 */ | ||
}; | ||
var _default = { | ||
"Again": 0xe005, | ||
/* html:Again (Again) -> linux:129 (KEY_AGAIN) -> atset1:57349 */ | ||
"AltLeft": 0x38, | ||
/* html:AltLeft (AltLeft) -> linux:56 (KEY_LEFTALT) -> atset1:56 */ | ||
"AltRight": 0xe038, | ||
/* html:AltRight (AltRight) -> linux:100 (KEY_RIGHTALT) -> atset1:57400 */ | ||
"ArrowDown": 0xe050, | ||
/* html:ArrowDown (ArrowDown) -> linux:108 (KEY_DOWN) -> atset1:57424 */ | ||
"ArrowLeft": 0xe04b, | ||
/* html:ArrowLeft (ArrowLeft) -> linux:105 (KEY_LEFT) -> atset1:57419 */ | ||
"ArrowRight": 0xe04d, | ||
/* html:ArrowRight (ArrowRight) -> linux:106 (KEY_RIGHT) -> atset1:57421 */ | ||
"ArrowUp": 0xe048, | ||
/* html:ArrowUp (ArrowUp) -> linux:103 (KEY_UP) -> atset1:57416 */ | ||
"AudioVolumeDown": 0xe02e, | ||
/* html:AudioVolumeDown (AudioVolumeDown) -> linux:114 (KEY_VOLUMEDOWN) -> atset1:57390 */ | ||
"AudioVolumeMute": 0xe020, | ||
/* html:AudioVolumeMute (AudioVolumeMute) -> linux:113 (KEY_MUTE) -> atset1:57376 */ | ||
"AudioVolumeUp": 0xe030, | ||
/* html:AudioVolumeUp (AudioVolumeUp) -> linux:115 (KEY_VOLUMEUP) -> atset1:57392 */ | ||
"Backquote": 0x29, | ||
/* html:Backquote (Backquote) -> linux:41 (KEY_GRAVE) -> atset1:41 */ | ||
"Backslash": 0x2b, | ||
/* html:Backslash (Backslash) -> linux:43 (KEY_BACKSLASH) -> atset1:43 */ | ||
"Backspace": 0xe, | ||
/* html:Backspace (Backspace) -> linux:14 (KEY_BACKSPACE) -> atset1:14 */ | ||
"BracketLeft": 0x1a, | ||
/* html:BracketLeft (BracketLeft) -> linux:26 (KEY_LEFTBRACE) -> atset1:26 */ | ||
"BracketRight": 0x1b, | ||
/* html:BracketRight (BracketRight) -> linux:27 (KEY_RIGHTBRACE) -> atset1:27 */ | ||
"BrowserBack": 0xe06a, | ||
/* html:BrowserBack (BrowserBack) -> linux:158 (KEY_BACK) -> atset1:57450 */ | ||
"BrowserFavorites": 0xe066, | ||
/* html:BrowserFavorites (BrowserFavorites) -> linux:156 (KEY_BOOKMARKS) -> atset1:57446 */ | ||
"BrowserForward": 0xe069, | ||
/* html:BrowserForward (BrowserForward) -> linux:159 (KEY_FORWARD) -> atset1:57449 */ | ||
"BrowserHome": 0xe032, | ||
/* html:BrowserHome (BrowserHome) -> linux:172 (KEY_HOMEPAGE) -> atset1:57394 */ | ||
"BrowserRefresh": 0xe067, | ||
/* html:BrowserRefresh (BrowserRefresh) -> linux:173 (KEY_REFRESH) -> atset1:57447 */ | ||
"BrowserSearch": 0xe065, | ||
/* html:BrowserSearch (BrowserSearch) -> linux:217 (KEY_SEARCH) -> atset1:57445 */ | ||
"BrowserStop": 0xe068, | ||
/* html:BrowserStop (BrowserStop) -> linux:128 (KEY_STOP) -> atset1:57448 */ | ||
"CapsLock": 0x3a, | ||
/* html:CapsLock (CapsLock) -> linux:58 (KEY_CAPSLOCK) -> atset1:58 */ | ||
"Comma": 0x33, | ||
/* html:Comma (Comma) -> linux:51 (KEY_COMMA) -> atset1:51 */ | ||
"ContextMenu": 0xe05d, | ||
/* html:ContextMenu (ContextMenu) -> linux:127 (KEY_COMPOSE) -> atset1:57437 */ | ||
"ControlLeft": 0x1d, | ||
/* html:ControlLeft (ControlLeft) -> linux:29 (KEY_LEFTCTRL) -> atset1:29 */ | ||
"ControlRight": 0xe01d, | ||
/* html:ControlRight (ControlRight) -> linux:97 (KEY_RIGHTCTRL) -> atset1:57373 */ | ||
"Convert": 0x79, | ||
/* html:Convert (Convert) -> linux:92 (KEY_HENKAN) -> atset1:121 */ | ||
"Copy": 0xe078, | ||
/* html:Copy (Copy) -> linux:133 (KEY_COPY) -> atset1:57464 */ | ||
"Cut": 0xe03c, | ||
/* html:Cut (Cut) -> linux:137 (KEY_CUT) -> atset1:57404 */ | ||
"Delete": 0xe053, | ||
/* html:Delete (Delete) -> linux:111 (KEY_DELETE) -> atset1:57427 */ | ||
"Digit0": 0xb, | ||
/* html:Digit0 (Digit0) -> linux:11 (KEY_0) -> atset1:11 */ | ||
"Digit1": 0x2, | ||
/* html:Digit1 (Digit1) -> linux:2 (KEY_1) -> atset1:2 */ | ||
"Digit2": 0x3, | ||
/* html:Digit2 (Digit2) -> linux:3 (KEY_2) -> atset1:3 */ | ||
"Digit3": 0x4, | ||
/* html:Digit3 (Digit3) -> linux:4 (KEY_3) -> atset1:4 */ | ||
"Digit4": 0x5, | ||
/* html:Digit4 (Digit4) -> linux:5 (KEY_4) -> atset1:5 */ | ||
"Digit5": 0x6, | ||
/* html:Digit5 (Digit5) -> linux:6 (KEY_5) -> atset1:6 */ | ||
"Digit6": 0x7, | ||
/* html:Digit6 (Digit6) -> linux:7 (KEY_6) -> atset1:7 */ | ||
"Digit7": 0x8, | ||
/* html:Digit7 (Digit7) -> linux:8 (KEY_7) -> atset1:8 */ | ||
"Digit8": 0x9, | ||
/* html:Digit8 (Digit8) -> linux:9 (KEY_8) -> atset1:9 */ | ||
"Digit9": 0xa, | ||
/* html:Digit9 (Digit9) -> linux:10 (KEY_9) -> atset1:10 */ | ||
"Eject": 0xe07d, | ||
/* html:Eject (Eject) -> linux:162 (KEY_EJECTCLOSECD) -> atset1:57469 */ | ||
"End": 0xe04f, | ||
/* html:End (End) -> linux:107 (KEY_END) -> atset1:57423 */ | ||
"Enter": 0x1c, | ||
/* html:Enter (Enter) -> linux:28 (KEY_ENTER) -> atset1:28 */ | ||
"Equal": 0xd, | ||
/* html:Equal (Equal) -> linux:13 (KEY_EQUAL) -> atset1:13 */ | ||
"Escape": 0x1, | ||
/* html:Escape (Escape) -> linux:1 (KEY_ESC) -> atset1:1 */ | ||
"F1": 0x3b, | ||
/* html:F1 (F1) -> linux:59 (KEY_F1) -> atset1:59 */ | ||
"F10": 0x44, | ||
/* html:F10 (F10) -> linux:68 (KEY_F10) -> atset1:68 */ | ||
"F11": 0x57, | ||
/* html:F11 (F11) -> linux:87 (KEY_F11) -> atset1:87 */ | ||
"F12": 0x58, | ||
/* html:F12 (F12) -> linux:88 (KEY_F12) -> atset1:88 */ | ||
"F13": 0x5d, | ||
/* html:F13 (F13) -> linux:183 (KEY_F13) -> atset1:93 */ | ||
"F14": 0x5e, | ||
/* html:F14 (F14) -> linux:184 (KEY_F14) -> atset1:94 */ | ||
"F15": 0x5f, | ||
/* html:F15 (F15) -> linux:185 (KEY_F15) -> atset1:95 */ | ||
"F16": 0x55, | ||
/* html:F16 (F16) -> linux:186 (KEY_F16) -> atset1:85 */ | ||
"F17": 0xe003, | ||
/* html:F17 (F17) -> linux:187 (KEY_F17) -> atset1:57347 */ | ||
"F18": 0xe077, | ||
/* html:F18 (F18) -> linux:188 (KEY_F18) -> atset1:57463 */ | ||
"F19": 0xe004, | ||
/* html:F19 (F19) -> linux:189 (KEY_F19) -> atset1:57348 */ | ||
"F2": 0x3c, | ||
/* html:F2 (F2) -> linux:60 (KEY_F2) -> atset1:60 */ | ||
"F20": 0x5a, | ||
/* html:F20 (F20) -> linux:190 (KEY_F20) -> atset1:90 */ | ||
"F21": 0x74, | ||
/* html:F21 (F21) -> linux:191 (KEY_F21) -> atset1:116 */ | ||
"F22": 0xe079, | ||
/* html:F22 (F22) -> linux:192 (KEY_F22) -> atset1:57465 */ | ||
"F23": 0x6d, | ||
/* html:F23 (F23) -> linux:193 (KEY_F23) -> atset1:109 */ | ||
"F24": 0x6f, | ||
/* html:F24 (F24) -> linux:194 (KEY_F24) -> atset1:111 */ | ||
"F3": 0x3d, | ||
/* html:F3 (F3) -> linux:61 (KEY_F3) -> atset1:61 */ | ||
"F4": 0x3e, | ||
/* html:F4 (F4) -> linux:62 (KEY_F4) -> atset1:62 */ | ||
"F5": 0x3f, | ||
/* html:F5 (F5) -> linux:63 (KEY_F5) -> atset1:63 */ | ||
"F6": 0x40, | ||
/* html:F6 (F6) -> linux:64 (KEY_F6) -> atset1:64 */ | ||
"F7": 0x41, | ||
/* html:F7 (F7) -> linux:65 (KEY_F7) -> atset1:65 */ | ||
"F8": 0x42, | ||
/* html:F8 (F8) -> linux:66 (KEY_F8) -> atset1:66 */ | ||
"F9": 0x43, | ||
/* html:F9 (F9) -> linux:67 (KEY_F9) -> atset1:67 */ | ||
"Find": 0xe041, | ||
/* html:Find (Find) -> linux:136 (KEY_FIND) -> atset1:57409 */ | ||
"Help": 0xe075, | ||
/* html:Help (Help) -> linux:138 (KEY_HELP) -> atset1:57461 */ | ||
"Hiragana": 0x77, | ||
/* html:Hiragana (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */ | ||
"Home": 0xe047, | ||
/* html:Home (Home) -> linux:102 (KEY_HOME) -> atset1:57415 */ | ||
"Insert": 0xe052, | ||
/* html:Insert (Insert) -> linux:110 (KEY_INSERT) -> atset1:57426 */ | ||
"IntlBackslash": 0x56, | ||
/* html:IntlBackslash (IntlBackslash) -> linux:86 (KEY_102ND) -> atset1:86 */ | ||
"IntlRo": 0x73, | ||
/* html:IntlRo (IntlRo) -> linux:89 (KEY_RO) -> atset1:115 */ | ||
"IntlYen": 0x7d, | ||
/* html:IntlYen (IntlYen) -> linux:124 (KEY_YEN) -> atset1:125 */ | ||
"KanaMode": 0x70, | ||
/* html:KanaMode (KanaMode) -> linux:93 (KEY_KATAKANAHIRAGANA) -> atset1:112 */ | ||
"Katakana": 0x78, | ||
/* html:Katakana (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */ | ||
"KeyA": 0x1e, | ||
/* html:KeyA (KeyA) -> linux:30 (KEY_A) -> atset1:30 */ | ||
"KeyB": 0x30, | ||
/* html:KeyB (KeyB) -> linux:48 (KEY_B) -> atset1:48 */ | ||
"KeyC": 0x2e, | ||
/* html:KeyC (KeyC) -> linux:46 (KEY_C) -> atset1:46 */ | ||
"KeyD": 0x20, | ||
/* html:KeyD (KeyD) -> linux:32 (KEY_D) -> atset1:32 */ | ||
"KeyE": 0x12, | ||
/* html:KeyE (KeyE) -> linux:18 (KEY_E) -> atset1:18 */ | ||
"KeyF": 0x21, | ||
/* html:KeyF (KeyF) -> linux:33 (KEY_F) -> atset1:33 */ | ||
"KeyG": 0x22, | ||
/* html:KeyG (KeyG) -> linux:34 (KEY_G) -> atset1:34 */ | ||
"KeyH": 0x23, | ||
/* html:KeyH (KeyH) -> linux:35 (KEY_H) -> atset1:35 */ | ||
"KeyI": 0x17, | ||
/* html:KeyI (KeyI) -> linux:23 (KEY_I) -> atset1:23 */ | ||
"KeyJ": 0x24, | ||
/* html:KeyJ (KeyJ) -> linux:36 (KEY_J) -> atset1:36 */ | ||
"KeyK": 0x25, | ||
/* html:KeyK (KeyK) -> linux:37 (KEY_K) -> atset1:37 */ | ||
"KeyL": 0x26, | ||
/* html:KeyL (KeyL) -> linux:38 (KEY_L) -> atset1:38 */ | ||
"KeyM": 0x32, | ||
/* html:KeyM (KeyM) -> linux:50 (KEY_M) -> atset1:50 */ | ||
"KeyN": 0x31, | ||
/* html:KeyN (KeyN) -> linux:49 (KEY_N) -> atset1:49 */ | ||
"KeyO": 0x18, | ||
/* html:KeyO (KeyO) -> linux:24 (KEY_O) -> atset1:24 */ | ||
"KeyP": 0x19, | ||
/* html:KeyP (KeyP) -> linux:25 (KEY_P) -> atset1:25 */ | ||
"KeyQ": 0x10, | ||
/* html:KeyQ (KeyQ) -> linux:16 (KEY_Q) -> atset1:16 */ | ||
"KeyR": 0x13, | ||
/* html:KeyR (KeyR) -> linux:19 (KEY_R) -> atset1:19 */ | ||
"KeyS": 0x1f, | ||
/* html:KeyS (KeyS) -> linux:31 (KEY_S) -> atset1:31 */ | ||
"KeyT": 0x14, | ||
/* html:KeyT (KeyT) -> linux:20 (KEY_T) -> atset1:20 */ | ||
"KeyU": 0x16, | ||
/* html:KeyU (KeyU) -> linux:22 (KEY_U) -> atset1:22 */ | ||
"KeyV": 0x2f, | ||
/* html:KeyV (KeyV) -> linux:47 (KEY_V) -> atset1:47 */ | ||
"KeyW": 0x11, | ||
/* html:KeyW (KeyW) -> linux:17 (KEY_W) -> atset1:17 */ | ||
"KeyX": 0x2d, | ||
/* html:KeyX (KeyX) -> linux:45 (KEY_X) -> atset1:45 */ | ||
"KeyY": 0x15, | ||
/* html:KeyY (KeyY) -> linux:21 (KEY_Y) -> atset1:21 */ | ||
"KeyZ": 0x2c, | ||
/* html:KeyZ (KeyZ) -> linux:44 (KEY_Z) -> atset1:44 */ | ||
"Lang1": 0x72, | ||
/* html:Lang1 (Lang1) -> linux:122 (KEY_HANGEUL) -> atset1:114 */ | ||
"Lang2": 0x71, | ||
/* html:Lang2 (Lang2) -> linux:123 (KEY_HANJA) -> atset1:113 */ | ||
"Lang3": 0x78, | ||
/* html:Lang3 (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */ | ||
"Lang4": 0x77, | ||
/* html:Lang4 (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */ | ||
"Lang5": 0x76, | ||
/* html:Lang5 (Lang5) -> linux:85 (KEY_ZENKAKUHANKAKU) -> atset1:118 */ | ||
"LaunchApp1": 0xe06b, | ||
/* html:LaunchApp1 (LaunchApp1) -> linux:157 (KEY_COMPUTER) -> atset1:57451 */ | ||
"LaunchApp2": 0xe021, | ||
/* html:LaunchApp2 (LaunchApp2) -> linux:140 (KEY_CALC) -> atset1:57377 */ | ||
"LaunchMail": 0xe06c, | ||
/* html:LaunchMail (LaunchMail) -> linux:155 (KEY_MAIL) -> atset1:57452 */ | ||
"MediaPlayPause": 0xe022, | ||
/* html:MediaPlayPause (MediaPlayPause) -> linux:164 (KEY_PLAYPAUSE) -> atset1:57378 */ | ||
"MediaSelect": 0xe06d, | ||
/* html:MediaSelect (MediaSelect) -> linux:226 (KEY_MEDIA) -> atset1:57453 */ | ||
"MediaStop": 0xe024, | ||
/* html:MediaStop (MediaStop) -> linux:166 (KEY_STOPCD) -> atset1:57380 */ | ||
"MediaTrackNext": 0xe019, | ||
/* html:MediaTrackNext (MediaTrackNext) -> linux:163 (KEY_NEXTSONG) -> atset1:57369 */ | ||
"MediaTrackPrevious": 0xe010, | ||
/* html:MediaTrackPrevious (MediaTrackPrevious) -> linux:165 (KEY_PREVIOUSSONG) -> atset1:57360 */ | ||
"MetaLeft": 0xe05b, | ||
/* html:MetaLeft (MetaLeft) -> linux:125 (KEY_LEFTMETA) -> atset1:57435 */ | ||
"MetaRight": 0xe05c, | ||
/* html:MetaRight (MetaRight) -> linux:126 (KEY_RIGHTMETA) -> atset1:57436 */ | ||
"Minus": 0xc, | ||
/* html:Minus (Minus) -> linux:12 (KEY_MINUS) -> atset1:12 */ | ||
"NonConvert": 0x7b, | ||
/* html:NonConvert (NonConvert) -> linux:94 (KEY_MUHENKAN) -> atset1:123 */ | ||
"NumLock": 0x45, | ||
/* html:NumLock (NumLock) -> linux:69 (KEY_NUMLOCK) -> atset1:69 */ | ||
"Numpad0": 0x52, | ||
/* html:Numpad0 (Numpad0) -> linux:82 (KEY_KP0) -> atset1:82 */ | ||
"Numpad1": 0x4f, | ||
/* html:Numpad1 (Numpad1) -> linux:79 (KEY_KP1) -> atset1:79 */ | ||
"Numpad2": 0x50, | ||
/* html:Numpad2 (Numpad2) -> linux:80 (KEY_KP2) -> atset1:80 */ | ||
"Numpad3": 0x51, | ||
/* html:Numpad3 (Numpad3) -> linux:81 (KEY_KP3) -> atset1:81 */ | ||
"Numpad4": 0x4b, | ||
/* html:Numpad4 (Numpad4) -> linux:75 (KEY_KP4) -> atset1:75 */ | ||
"Numpad5": 0x4c, | ||
/* html:Numpad5 (Numpad5) -> linux:76 (KEY_KP5) -> atset1:76 */ | ||
"Numpad6": 0x4d, | ||
/* html:Numpad6 (Numpad6) -> linux:77 (KEY_KP6) -> atset1:77 */ | ||
"Numpad7": 0x47, | ||
/* html:Numpad7 (Numpad7) -> linux:71 (KEY_KP7) -> atset1:71 */ | ||
"Numpad8": 0x48, | ||
/* html:Numpad8 (Numpad8) -> linux:72 (KEY_KP8) -> atset1:72 */ | ||
"Numpad9": 0x49, | ||
/* html:Numpad9 (Numpad9) -> linux:73 (KEY_KP9) -> atset1:73 */ | ||
"NumpadAdd": 0x4e, | ||
/* html:NumpadAdd (NumpadAdd) -> linux:78 (KEY_KPPLUS) -> atset1:78 */ | ||
"NumpadComma": 0x7e, | ||
/* html:NumpadComma (NumpadComma) -> linux:121 (KEY_KPCOMMA) -> atset1:126 */ | ||
"NumpadDecimal": 0x53, | ||
/* html:NumpadDecimal (NumpadDecimal) -> linux:83 (KEY_KPDOT) -> atset1:83 */ | ||
"NumpadDivide": 0xe035, | ||
/* html:NumpadDivide (NumpadDivide) -> linux:98 (KEY_KPSLASH) -> atset1:57397 */ | ||
"NumpadEnter": 0xe01c, | ||
/* html:NumpadEnter (NumpadEnter) -> linux:96 (KEY_KPENTER) -> atset1:57372 */ | ||
"NumpadEqual": 0x59, | ||
/* html:NumpadEqual (NumpadEqual) -> linux:117 (KEY_KPEQUAL) -> atset1:89 */ | ||
"NumpadMultiply": 0x37, | ||
/* html:NumpadMultiply (NumpadMultiply) -> linux:55 (KEY_KPASTERISK) -> atset1:55 */ | ||
"NumpadParenLeft": 0xe076, | ||
/* html:NumpadParenLeft (NumpadParenLeft) -> linux:179 (KEY_KPLEFTPAREN) -> atset1:57462 */ | ||
"NumpadParenRight": 0xe07b, | ||
/* html:NumpadParenRight (NumpadParenRight) -> linux:180 (KEY_KPRIGHTPAREN) -> atset1:57467 */ | ||
"NumpadSubtract": 0x4a, | ||
/* html:NumpadSubtract (NumpadSubtract) -> linux:74 (KEY_KPMINUS) -> atset1:74 */ | ||
"Open": 0x64, | ||
/* html:Open (Open) -> linux:134 (KEY_OPEN) -> atset1:100 */ | ||
"PageDown": 0xe051, | ||
/* html:PageDown (PageDown) -> linux:109 (KEY_PAGEDOWN) -> atset1:57425 */ | ||
"PageUp": 0xe049, | ||
/* html:PageUp (PageUp) -> linux:104 (KEY_PAGEUP) -> atset1:57417 */ | ||
"Paste": 0x65, | ||
/* html:Paste (Paste) -> linux:135 (KEY_PASTE) -> atset1:101 */ | ||
"Pause": 0xe046, | ||
/* html:Pause (Pause) -> linux:119 (KEY_PAUSE) -> atset1:57414 */ | ||
"Period": 0x34, | ||
/* html:Period (Period) -> linux:52 (KEY_DOT) -> atset1:52 */ | ||
"Power": 0xe05e, | ||
/* html:Power (Power) -> linux:116 (KEY_POWER) -> atset1:57438 */ | ||
"PrintScreen": 0x54, | ||
/* html:PrintScreen (PrintScreen) -> linux:99 (KEY_SYSRQ) -> atset1:84 */ | ||
"Props": 0xe006, | ||
/* html:Props (Props) -> linux:130 (KEY_PROPS) -> atset1:57350 */ | ||
"Quote": 0x28, | ||
/* html:Quote (Quote) -> linux:40 (KEY_APOSTROPHE) -> atset1:40 */ | ||
"ScrollLock": 0x46, | ||
/* html:ScrollLock (ScrollLock) -> linux:70 (KEY_SCROLLLOCK) -> atset1:70 */ | ||
"Semicolon": 0x27, | ||
/* html:Semicolon (Semicolon) -> linux:39 (KEY_SEMICOLON) -> atset1:39 */ | ||
"ShiftLeft": 0x2a, | ||
/* html:ShiftLeft (ShiftLeft) -> linux:42 (KEY_LEFTSHIFT) -> atset1:42 */ | ||
"ShiftRight": 0x36, | ||
/* html:ShiftRight (ShiftRight) -> linux:54 (KEY_RIGHTSHIFT) -> atset1:54 */ | ||
"Slash": 0x35, | ||
/* html:Slash (Slash) -> linux:53 (KEY_SLASH) -> atset1:53 */ | ||
"Sleep": 0xe05f, | ||
/* html:Sleep (Sleep) -> linux:142 (KEY_SLEEP) -> atset1:57439 */ | ||
"Space": 0x39, | ||
/* html:Space (Space) -> linux:57 (KEY_SPACE) -> atset1:57 */ | ||
"Suspend": 0xe025, | ||
/* html:Suspend (Suspend) -> linux:205 (KEY_SUSPEND) -> atset1:57381 */ | ||
"Tab": 0xf, | ||
/* html:Tab (Tab) -> linux:15 (KEY_TAB) -> atset1:15 */ | ||
"Undo": 0xe007, | ||
/* html:Undo (Undo) -> linux:131 (KEY_UNDO) -> atset1:57351 */ | ||
"WakeUp": 0xe063 | ||
/* html:WakeUp (WakeUp) -> linux:143 (KEY_WAKEUP) -> atset1:57443 */ | ||
}; | ||
exports["default"] = _default; |
@@ -1,101 +0,111 @@ | ||
'use strict'; | ||
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports.supportsImageMetadata = exports.supportsCursorURIs = exports.dragThreshold = exports.isTouchDevice = undefined; | ||
exports.isMac = isMac; | ||
exports.isWindows = isWindows; | ||
exports.isIOS = isIOS; | ||
exports.isAndroid = isAndroid; | ||
exports.isSafari = isSafari; | ||
exports.isIE = isIE; | ||
exports.isEdge = isEdge; | ||
exports.isFirefox = isFirefox; | ||
exports.hasScrollbarGutter = exports.supportsCursorURIs = exports.dragThreshold = exports.isTouchDevice = void 0; | ||
var _logging = require('./logging.js'); | ||
var Log = _interopRequireWildcard(require("./logging.js")); | ||
var Log = _interopRequireWildcard(_logging); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* See README.md for usage and integration instructions. | ||
* | ||
* Browser feature support detection | ||
*/ | ||
// Touch detection | ||
var isTouchDevice = exports.isTouchDevice = 'ontouchstart' in document.documentElement || | ||
// requried for Chrome debugger | ||
document.ontouchstart !== undefined || | ||
// required for MS Surface | ||
navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; /* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* See README.md for usage and integration instructions. | ||
*/ | ||
var isTouchDevice = 'ontouchstart' in document.documentElement || // requried for Chrome debugger | ||
document.ontouchstart !== undefined || // required for MS Surface | ||
navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; | ||
exports.isTouchDevice = isTouchDevice; | ||
window.addEventListener('touchstart', function onFirstTouch() { | ||
exports.isTouchDevice = isTouchDevice = true; | ||
window.removeEventListener('touchstart', onFirstTouch, false); | ||
}, false); | ||
// The goal is to find a certain physical width, the devicePixelRatio | ||
exports.isTouchDevice = isTouchDevice = true; | ||
window.removeEventListener('touchstart', onFirstTouch, false); | ||
}, false); // The goal is to find a certain physical width, the devicePixelRatio | ||
// brings us a bit closer but is not optimal. | ||
var dragThreshold = exports.dragThreshold = 10 * (window.devicePixelRatio || 1); | ||
var dragThreshold = 10 * (window.devicePixelRatio || 1); | ||
exports.dragThreshold = dragThreshold; | ||
var _supportsCursorURIs = false; | ||
try { | ||
var target = document.createElement('canvas'); | ||
target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default'; | ||
var target = document.createElement('canvas'); | ||
target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default'; | ||
if (target.style.cursor) { | ||
Log.Info("Data URI scheme cursor supported"); | ||
_supportsCursorURIs = true; | ||
} else { | ||
Log.Warn("Data URI scheme cursor not supported"); | ||
} | ||
if (target.style.cursor.indexOf("url") === 0) { | ||
Log.Info("Data URI scheme cursor supported"); | ||
_supportsCursorURIs = true; | ||
} else { | ||
Log.Warn("Data URI scheme cursor not supported"); | ||
} | ||
} catch (exc) { | ||
Log.Error("Data URI scheme cursor test exception: " + exc); | ||
Log.Error("Data URI scheme cursor test exception: " + exc); | ||
} | ||
var supportsCursorURIs = exports.supportsCursorURIs = _supportsCursorURIs; | ||
var supportsCursorURIs = _supportsCursorURIs; | ||
exports.supportsCursorURIs = supportsCursorURIs; | ||
var _hasScrollbarGutter = true; | ||
var _supportsImageMetadata = false; | ||
try { | ||
new ImageData(new Uint8ClampedArray(4), 1, 1); | ||
_supportsImageMetadata = true; | ||
} catch (ex) { | ||
// ignore failure | ||
// Create invisible container | ||
var container = document.createElement('div'); | ||
container.style.visibility = 'hidden'; | ||
container.style.overflow = 'scroll'; // forcing scrollbars | ||
document.body.appendChild(container); // Create a div and place it in the container | ||
var child = document.createElement('div'); | ||
container.appendChild(child); // Calculate the difference between the container's full width | ||
// and the child's width - the difference is the scrollbars | ||
var scrollbarWidth = container.offsetWidth - child.offsetWidth; // Clean up | ||
container.parentNode.removeChild(container); | ||
_hasScrollbarGutter = scrollbarWidth != 0; | ||
} catch (exc) { | ||
Log.Error("Scrollbar test exception: " + exc); | ||
} | ||
var supportsImageMetadata = exports.supportsImageMetadata = _supportsImageMetadata; | ||
var hasScrollbarGutter = _hasScrollbarGutter; | ||
/* | ||
* The functions for detection of platforms and browsers below are exported | ||
* but the use of these should be minimized as much as possible. | ||
* | ||
* It's better to use feature detection than platform detection. | ||
*/ | ||
exports.hasScrollbarGutter = hasScrollbarGutter; | ||
function isMac() { | ||
return navigator && !!/mac/i.exec(navigator.platform); | ||
return navigator && !!/mac/i.exec(navigator.platform); | ||
} | ||
function isWindows() { | ||
return navigator && !!/win/i.exec(navigator.platform); | ||
return navigator && !!/win/i.exec(navigator.platform); | ||
} | ||
function isIOS() { | ||
return navigator && (!!/ipad/i.exec(navigator.platform) || !!/iphone/i.exec(navigator.platform) || !!/ipod/i.exec(navigator.platform)); | ||
return navigator && (!!/ipad/i.exec(navigator.platform) || !!/iphone/i.exec(navigator.platform) || !!/ipod/i.exec(navigator.platform)); | ||
} | ||
function isAndroid() { | ||
return navigator && !!/android/i.exec(navigator.userAgent); | ||
} | ||
function isSafari() { | ||
return navigator && navigator.userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('Chrome') === -1; | ||
return navigator && navigator.userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('Chrome') === -1; | ||
} | ||
function isIE() { | ||
return navigator && !!/trident/i.exec(navigator.userAgent); | ||
} | ||
function isEdge() { | ||
return navigator && !!/edge/i.exec(navigator.userAgent); | ||
} | ||
function isFirefox() { | ||
return navigator && !!/firefox/i.exec(navigator.userAgent); | ||
return navigator && !!/firefox/i.exec(navigator.userAgent); | ||
} |
@@ -1,254 +0,302 @@ | ||
'use strict'; | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||
*/ | ||
var _browser = require("./browser.js"); | ||
var _browser = require('./browser.js'); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var useFallback = !_browser.supportsCursorURIs || _browser.isTouchDevice; | ||
var Cursor = function () { | ||
function Cursor() { | ||
_classCallCheck(this, Cursor); | ||
var Cursor = /*#__PURE__*/function () { | ||
function Cursor() { | ||
_classCallCheck(this, Cursor); | ||
this._target = null; | ||
this._target = null; | ||
this._canvas = document.createElement('canvas'); | ||
this._canvas = document.createElement('canvas'); | ||
if (useFallback) { | ||
this._canvas.style.position = 'fixed'; | ||
this._canvas.style.zIndex = '65535'; | ||
this._canvas.style.pointerEvents = 'none'; // Can't use "display" because of Firefox bug #1445997 | ||
if (useFallback) { | ||
this._canvas.style.position = 'fixed'; | ||
this._canvas.style.zIndex = '65535'; | ||
this._canvas.style.pointerEvents = 'none'; | ||
// Can't use "display" because of Firefox bug #1445997 | ||
this._canvas.style.visibility = 'hidden'; | ||
document.body.appendChild(this._canvas); | ||
} | ||
this._canvas.style.visibility = 'hidden'; | ||
} | ||
this._position = { x: 0, y: 0 }; | ||
this._hotSpot = { x: 0, y: 0 }; | ||
this._position = { | ||
x: 0, | ||
y: 0 | ||
}; | ||
this._hotSpot = { | ||
x: 0, | ||
y: 0 | ||
}; | ||
this._eventHandlers = { | ||
'mouseover': this._handleMouseOver.bind(this), | ||
'mouseleave': this._handleMouseLeave.bind(this), | ||
'mousemove': this._handleMouseMove.bind(this), | ||
'mouseup': this._handleMouseUp.bind(this) | ||
}; | ||
} | ||
this._eventHandlers = { | ||
'mouseover': this._handleMouseOver.bind(this), | ||
'mouseleave': this._handleMouseLeave.bind(this), | ||
'mousemove': this._handleMouseMove.bind(this), | ||
'mouseup': this._handleMouseUp.bind(this), | ||
'touchstart': this._handleTouchStart.bind(this), | ||
'touchmove': this._handleTouchMove.bind(this), | ||
'touchend': this._handleTouchEnd.bind(this) | ||
_createClass(Cursor, [{ | ||
key: "attach", | ||
value: function attach(target) { | ||
if (this._target) { | ||
this.detach(); | ||
} | ||
this._target = target; | ||
if (useFallback) { | ||
document.body.appendChild(this._canvas); | ||
var options = { | ||
capture: true, | ||
passive: true | ||
}; | ||
this._target.addEventListener('mouseover', this._eventHandlers.mouseover, options); | ||
this._target.addEventListener('mouseleave', this._eventHandlers.mouseleave, options); | ||
this._target.addEventListener('mousemove', this._eventHandlers.mousemove, options); | ||
this._target.addEventListener('mouseup', this._eventHandlers.mouseup, options); | ||
} | ||
this.clear(); | ||
} | ||
}, { | ||
key: "detach", | ||
value: function detach() { | ||
if (!this._target) { | ||
return; | ||
} | ||
_createClass(Cursor, [{ | ||
key: 'attach', | ||
value: function attach(target) { | ||
if (this._target) { | ||
this.detach(); | ||
} | ||
if (useFallback) { | ||
var options = { | ||
capture: true, | ||
passive: true | ||
}; | ||
this._target = target; | ||
this._target.removeEventListener('mouseover', this._eventHandlers.mouseover, options); | ||
if (useFallback) { | ||
// FIXME: These don't fire properly except for mouse | ||
/// movement in IE. We want to also capture element | ||
// movement, size changes, visibility, etc. | ||
var options = { capture: true, passive: true }; | ||
this._target.addEventListener('mouseover', this._eventHandlers.mouseover, options); | ||
this._target.addEventListener('mouseleave', this._eventHandlers.mouseleave, options); | ||
this._target.addEventListener('mousemove', this._eventHandlers.mousemove, options); | ||
this._target.addEventListener('mouseup', this._eventHandlers.mouseup, options); | ||
this._target.removeEventListener('mouseleave', this._eventHandlers.mouseleave, options); | ||
// There is no "touchleave" so we monitor touchstart globally | ||
window.addEventListener('touchstart', this._eventHandlers.touchstart, options); | ||
this._target.addEventListener('touchmove', this._eventHandlers.touchmove, options); | ||
this._target.addEventListener('touchend', this._eventHandlers.touchend, options); | ||
} | ||
this._target.removeEventListener('mousemove', this._eventHandlers.mousemove, options); | ||
this.clear(); | ||
} | ||
}, { | ||
key: 'detach', | ||
value: function detach() { | ||
if (useFallback) { | ||
var options = { capture: true, passive: true }; | ||
this._target.removeEventListener('mouseover', this._eventHandlers.mouseover, options); | ||
this._target.removeEventListener('mouseleave', this._eventHandlers.mouseleave, options); | ||
this._target.removeEventListener('mousemove', this._eventHandlers.mousemove, options); | ||
this._target.removeEventListener('mouseup', this._eventHandlers.mouseup, options); | ||
this._target.removeEventListener('mouseup', this._eventHandlers.mouseup, options); | ||
window.removeEventListener('touchstart', this._eventHandlers.touchstart, options); | ||
this._target.removeEventListener('touchmove', this._eventHandlers.touchmove, options); | ||
this._target.removeEventListener('touchend', this._eventHandlers.touchend, options); | ||
} | ||
document.body.removeChild(this._canvas); | ||
} | ||
this._target = null; | ||
} | ||
}, { | ||
key: 'change', | ||
value: function change(rgba, hotx, hoty, w, h) { | ||
if (w === 0 || h === 0) { | ||
this.clear(); | ||
return; | ||
} | ||
this._target = null; | ||
} | ||
}, { | ||
key: "change", | ||
value: function change(rgba, hotx, hoty, w, h) { | ||
if (w === 0 || h === 0) { | ||
this.clear(); | ||
return; | ||
} | ||
this._position.x = this._position.x + this._hotSpot.x - hotx; | ||
this._position.y = this._position.y + this._hotSpot.y - hoty; | ||
this._hotSpot.x = hotx; | ||
this._hotSpot.y = hoty; | ||
this._position.x = this._position.x + this._hotSpot.x - hotx; | ||
this._position.y = this._position.y + this._hotSpot.y - hoty; | ||
this._hotSpot.x = hotx; | ||
this._hotSpot.y = hoty; | ||
var ctx = this._canvas.getContext('2d'); | ||
var ctx = this._canvas.getContext('2d'); | ||
this._canvas.width = w; | ||
this._canvas.height = h; | ||
this._canvas.width = w; | ||
this._canvas.height = h; | ||
var img = new ImageData(new Uint8ClampedArray(rgba), w, h); | ||
ctx.clearRect(0, 0, w, h); | ||
ctx.putImageData(img, 0, 0); | ||
var img = void 0; | ||
try { | ||
// IE doesn't support this | ||
img = new ImageData(new Uint8ClampedArray(rgba), w, h); | ||
} catch (ex) { | ||
img = ctx.createImageData(w, h); | ||
img.data.set(new Uint8ClampedArray(rgba)); | ||
} | ||
ctx.clearRect(0, 0, w, h); | ||
ctx.putImageData(img, 0, 0); | ||
if (useFallback) { | ||
this._updatePosition(); | ||
} else { | ||
var url = this._canvas.toDataURL(); | ||
if (useFallback) { | ||
this._updatePosition(); | ||
} else { | ||
var url = this._canvas.toDataURL(); | ||
this._target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default'; | ||
} | ||
} | ||
}, { | ||
key: 'clear', | ||
value: function clear() { | ||
this._target.style.cursor = 'none'; | ||
this._canvas.width = 0; | ||
this._canvas.height = 0; | ||
this._position.x = this._position.x + this._hotSpot.x; | ||
this._position.y = this._position.y + this._hotSpot.y; | ||
this._hotSpot.x = 0; | ||
this._hotSpot.y = 0; | ||
} | ||
}, { | ||
key: '_handleMouseOver', | ||
value: function _handleMouseOver(event) { | ||
// This event could be because we're entering the target, or | ||
// moving around amongst its sub elements. Let the move handler | ||
// sort things out. | ||
this._handleMouseMove(event); | ||
} | ||
}, { | ||
key: '_handleMouseLeave', | ||
value: function _handleMouseLeave(event) { | ||
this._hideCursor(); | ||
} | ||
}, { | ||
key: '_handleMouseMove', | ||
value: function _handleMouseMove(event) { | ||
this._updateVisibility(event.target); | ||
this._target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default'; | ||
} | ||
} | ||
}, { | ||
key: "clear", | ||
value: function clear() { | ||
this._target.style.cursor = 'none'; | ||
this._canvas.width = 0; | ||
this._canvas.height = 0; | ||
this._position.x = this._position.x + this._hotSpot.x; | ||
this._position.y = this._position.y + this._hotSpot.y; | ||
this._hotSpot.x = 0; | ||
this._hotSpot.y = 0; | ||
} // Mouse events might be emulated, this allows | ||
// moving the cursor in such cases | ||
this._position.x = event.clientX - this._hotSpot.x; | ||
this._position.y = event.clientY - this._hotSpot.y; | ||
}, { | ||
key: "move", | ||
value: function move(clientX, clientY) { | ||
if (!useFallback) { | ||
return; | ||
} // clientX/clientY are relative the _visual viewport_, | ||
// but our position is relative the _layout viewport_, | ||
// so try to compensate when we can | ||
this._updatePosition(); | ||
} | ||
}, { | ||
key: '_handleMouseUp', | ||
value: function _handleMouseUp(event) { | ||
// We might get this event because of a drag operation that | ||
// moved outside of the target. Check what's under the cursor | ||
// now and adjust visibility based on that. | ||
var target = document.elementFromPoint(event.clientX, event.clientY); | ||
this._updateVisibility(target); | ||
} | ||
}, { | ||
key: '_handleTouchStart', | ||
value: function _handleTouchStart(event) { | ||
// Just as for mouseover, we let the move handler deal with it | ||
this._handleTouchMove(event); | ||
} | ||
}, { | ||
key: '_handleTouchMove', | ||
value: function _handleTouchMove(event) { | ||
this._updateVisibility(event.target); | ||
this._position.x = event.changedTouches[0].clientX - this._hotSpot.x; | ||
this._position.y = event.changedTouches[0].clientY - this._hotSpot.y; | ||
if (window.visualViewport) { | ||
this._position.x = clientX + window.visualViewport.offsetLeft; | ||
this._position.y = clientY + window.visualViewport.offsetTop; | ||
} else { | ||
this._position.x = clientX; | ||
this._position.y = clientY; | ||
} | ||
this._updatePosition(); | ||
} | ||
}, { | ||
key: '_handleTouchEnd', | ||
value: function _handleTouchEnd(event) { | ||
// Same principle as for mouseup | ||
var target = document.elementFromPoint(event.changedTouches[0].clientX, event.changedTouches[0].clientY); | ||
this._updateVisibility(target); | ||
} | ||
}, { | ||
key: '_showCursor', | ||
value: function _showCursor() { | ||
if (this._canvas.style.visibility === 'hidden') { | ||
this._canvas.style.visibility = ''; | ||
} | ||
} | ||
}, { | ||
key: '_hideCursor', | ||
value: function _hideCursor() { | ||
if (this._canvas.style.visibility !== 'hidden') { | ||
this._canvas.style.visibility = 'hidden'; | ||
} | ||
} | ||
this._updatePosition(); | ||
// Should we currently display the cursor? | ||
// (i.e. are we over the target, or a child of the target without a | ||
// different cursor set) | ||
var target = document.elementFromPoint(clientX, clientY); | ||
}, { | ||
key: '_shouldShowCursor', | ||
value: function _shouldShowCursor(target) { | ||
// Easy case | ||
if (target === this._target) { | ||
return true; | ||
} | ||
// Other part of the DOM? | ||
if (!this._target.contains(target)) { | ||
return false; | ||
} | ||
// Has the child its own cursor? | ||
// FIXME: How can we tell that a sub element has an | ||
// explicit "cursor: none;"? | ||
if (window.getComputedStyle(target).cursor !== 'none') { | ||
return false; | ||
} | ||
return true; | ||
} | ||
}, { | ||
key: '_updateVisibility', | ||
value: function _updateVisibility(target) { | ||
if (this._shouldShowCursor(target)) { | ||
this._showCursor(); | ||
} else { | ||
this._hideCursor(); | ||
} | ||
} | ||
}, { | ||
key: '_updatePosition', | ||
value: function _updatePosition() { | ||
this._canvas.style.left = this._position.x + "px"; | ||
this._canvas.style.top = this._position.y + "px"; | ||
} | ||
}]); | ||
this._updateVisibility(target); | ||
} | ||
}, { | ||
key: "_handleMouseOver", | ||
value: function _handleMouseOver(event) { | ||
// This event could be because we're entering the target, or | ||
// moving around amongst its sub elements. Let the move handler | ||
// sort things out. | ||
this._handleMouseMove(event); | ||
} | ||
}, { | ||
key: "_handleMouseLeave", | ||
value: function _handleMouseLeave(event) { | ||
// Check if we should show the cursor on the element we are leaving to | ||
this._updateVisibility(event.relatedTarget); | ||
} | ||
}, { | ||
key: "_handleMouseMove", | ||
value: function _handleMouseMove(event) { | ||
this._updateVisibility(event.target); | ||
return Cursor; | ||
this._position.x = event.clientX - this._hotSpot.x; | ||
this._position.y = event.clientY - this._hotSpot.y; | ||
this._updatePosition(); | ||
} | ||
}, { | ||
key: "_handleMouseUp", | ||
value: function _handleMouseUp(event) { | ||
var _this = this; | ||
// We might get this event because of a drag operation that | ||
// moved outside of the target. Check what's under the cursor | ||
// now and adjust visibility based on that. | ||
var target = document.elementFromPoint(event.clientX, event.clientY); | ||
this._updateVisibility(target); // Captures end with a mouseup but we can't know the event order of | ||
// mouseup vs releaseCapture. | ||
// | ||
// In the cases when releaseCapture comes first, the code above is | ||
// enough. | ||
// | ||
// In the cases when the mouseup comes first, we need wait for the | ||
// browser to flush all events and then check again if the cursor | ||
// should be visible. | ||
if (this._captureIsActive()) { | ||
window.setTimeout(function () { | ||
// We might have detached at this point | ||
if (!_this._target) { | ||
return; | ||
} // Refresh the target from elementFromPoint since queued events | ||
// might have altered the DOM | ||
target = document.elementFromPoint(event.clientX, event.clientY); | ||
_this._updateVisibility(target); | ||
}, 0); | ||
} | ||
} | ||
}, { | ||
key: "_showCursor", | ||
value: function _showCursor() { | ||
if (this._canvas.style.visibility === 'hidden') { | ||
this._canvas.style.visibility = ''; | ||
} | ||
} | ||
}, { | ||
key: "_hideCursor", | ||
value: function _hideCursor() { | ||
if (this._canvas.style.visibility !== 'hidden') { | ||
this._canvas.style.visibility = 'hidden'; | ||
} | ||
} // Should we currently display the cursor? | ||
// (i.e. are we over the target, or a child of the target without a | ||
// different cursor set) | ||
}, { | ||
key: "_shouldShowCursor", | ||
value: function _shouldShowCursor(target) { | ||
if (!target) { | ||
return false; | ||
} // Easy case | ||
if (target === this._target) { | ||
return true; | ||
} // Other part of the DOM? | ||
if (!this._target.contains(target)) { | ||
return false; | ||
} // Has the child its own cursor? | ||
// FIXME: How can we tell that a sub element has an | ||
// explicit "cursor: none;"? | ||
if (window.getComputedStyle(target).cursor !== 'none') { | ||
return false; | ||
} | ||
return true; | ||
} | ||
}, { | ||
key: "_updateVisibility", | ||
value: function _updateVisibility(target) { | ||
// When the cursor target has capture we want to show the cursor. | ||
// So, if a capture is active - look at the captured element instead. | ||
if (this._captureIsActive()) { | ||
target = document.captureElement; | ||
} | ||
if (this._shouldShowCursor(target)) { | ||
this._showCursor(); | ||
} else { | ||
this._hideCursor(); | ||
} | ||
} | ||
}, { | ||
key: "_updatePosition", | ||
value: function _updatePosition() { | ||
this._canvas.style.left = this._position.x + "px"; | ||
this._canvas.style.top = this._position.y + "px"; | ||
} | ||
}, { | ||
key: "_captureIsActive", | ||
value: function _captureIsActive() { | ||
return document.captureElement && document.documentElement.contains(document.captureElement); | ||
} | ||
}]); | ||
return Cursor; | ||
}(); | ||
exports.default = Cursor; | ||
exports["default"] = Cursor; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
@@ -10,2 +10,3 @@ exports.getPointerEvent = getPointerEvent; | ||
exports.releaseCapture = releaseCapture; | ||
/* | ||
@@ -22,127 +23,120 @@ * noVNC: HTML5 VNC client | ||
*/ | ||
function getPointerEvent(e) { | ||
return e.changedTouches ? e.changedTouches[0] : e.touches ? e.touches[0] : e; | ||
return e.changedTouches ? e.changedTouches[0] : e.touches ? e.touches[0] : e; | ||
} | ||
function stopEvent(e) { | ||
e.stopPropagation(); | ||
e.preventDefault(); | ||
} | ||
e.stopPropagation(); | ||
e.preventDefault(); | ||
} // Emulate Element.setCapture() when not supported | ||
// Emulate Element.setCapture() when not supported | ||
var _captureRecursion = false; | ||
var _captureElem = null; | ||
var _elementForUnflushedEvents = null; | ||
document.captureElement = null; | ||
function _captureProxy(e) { | ||
// Recursion protection as we'll see our own event | ||
if (_captureRecursion) return; | ||
// Recursion protection as we'll see our own event | ||
if (_captureRecursion) return; // Clone the event as we cannot dispatch an already dispatched event | ||
// Clone the event as we cannot dispatch an already dispatched event | ||
var newEv = new e.constructor(e.type, e); | ||
var newEv = new e.constructor(e.type, e); | ||
_captureRecursion = true; | ||
_captureRecursion = true; | ||
_captureElem.dispatchEvent(newEv); | ||
_captureRecursion = false; | ||
if (document.captureElement) { | ||
document.captureElement.dispatchEvent(newEv); | ||
} else { | ||
_elementForUnflushedEvents.dispatchEvent(newEv); | ||
} | ||
// Avoid double events | ||
e.stopPropagation(); | ||
_captureRecursion = false; // Avoid double events | ||
// Respect the wishes of the redirected event handlers | ||
if (newEv.defaultPrevented) { | ||
e.preventDefault(); | ||
} | ||
e.stopPropagation(); // Respect the wishes of the redirected event handlers | ||
// Implicitly release the capture on button release | ||
if (e.type === "mouseup") { | ||
releaseCapture(); | ||
} | ||
} | ||
if (newEv.defaultPrevented) { | ||
e.preventDefault(); | ||
} // Implicitly release the capture on button release | ||
// Follow cursor style of target element | ||
function _captureElemChanged() { | ||
var captureElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
captureElem.style.cursor = window.getComputedStyle(_captureElem).cursor; | ||
} | ||
var _captureObserver = new MutationObserver(_captureElemChanged); | ||
if (e.type === "mouseup") { | ||
releaseCapture(); | ||
} | ||
} // Follow cursor style of target element | ||
var _captureIndex = 0; | ||
function setCapture(elem) { | ||
if (elem.setCapture) { | ||
function _capturedElemChanged() { | ||
var proxyElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
proxyElem.style.cursor = window.getComputedStyle(document.captureElement).cursor; | ||
} | ||
elem.setCapture(); | ||
var _captureObserver = new MutationObserver(_capturedElemChanged); | ||
// IE releases capture on 'click' events which might not trigger | ||
elem.addEventListener('mouseup', releaseCapture); | ||
} else { | ||
// Release any existing capture in case this method is | ||
// called multiple times without coordination | ||
releaseCapture(); | ||
function setCapture(target) { | ||
if (target.setCapture) { | ||
target.setCapture(); | ||
document.captureElement = target; | ||
} else { | ||
// Release any existing capture in case this method is | ||
// called multiple times without coordination | ||
releaseCapture(); | ||
var proxyElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
var captureElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
if (proxyElem === null) { | ||
proxyElem = document.createElement("div"); | ||
proxyElem.id = "noVNC_mouse_capture_elem"; | ||
proxyElem.style.position = "fixed"; | ||
proxyElem.style.top = "0px"; | ||
proxyElem.style.left = "0px"; | ||
proxyElem.style.width = "100%"; | ||
proxyElem.style.height = "100%"; | ||
proxyElem.style.zIndex = 10000; | ||
proxyElem.style.display = "none"; | ||
document.body.appendChild(proxyElem); // This is to make sure callers don't get confused by having | ||
// our blocking element as the target | ||
if (captureElem === null) { | ||
captureElem = document.createElement("div"); | ||
captureElem.id = "noVNC_mouse_capture_elem"; | ||
captureElem.style.position = "fixed"; | ||
captureElem.style.top = "0px"; | ||
captureElem.style.left = "0px"; | ||
captureElem.style.width = "100%"; | ||
captureElem.style.height = "100%"; | ||
captureElem.style.zIndex = 10000; | ||
captureElem.style.display = "none"; | ||
document.body.appendChild(captureElem); | ||
proxyElem.addEventListener('contextmenu', _captureProxy); | ||
proxyElem.addEventListener('mousemove', _captureProxy); | ||
proxyElem.addEventListener('mouseup', _captureProxy); | ||
} | ||
// This is to make sure callers don't get confused by having | ||
// our blocking element as the target | ||
captureElem.addEventListener('contextmenu', _captureProxy); | ||
document.captureElement = target; // Track cursor and get initial cursor | ||
captureElem.addEventListener('mousemove', _captureProxy); | ||
captureElem.addEventListener('mouseup', _captureProxy); | ||
} | ||
_captureObserver.observe(target, { | ||
attributes: true | ||
}); | ||
_captureElem = elem; | ||
_captureIndex++; | ||
_capturedElemChanged(); | ||
// Track cursor and get initial cursor | ||
_captureObserver.observe(elem, { attributes: true }); | ||
_captureElemChanged(); | ||
proxyElem.style.display = ""; // We listen to events on window in order to keep tracking if it | ||
// happens to leave the viewport | ||
captureElem.style.display = ""; | ||
// We listen to events on window in order to keep tracking if it | ||
// happens to leave the viewport | ||
window.addEventListener('mousemove', _captureProxy); | ||
window.addEventListener('mouseup', _captureProxy); | ||
} | ||
window.addEventListener('mousemove', _captureProxy); | ||
window.addEventListener('mouseup', _captureProxy); | ||
} | ||
} | ||
function releaseCapture() { | ||
if (document.releaseCapture) { | ||
if (document.releaseCapture) { | ||
document.releaseCapture(); | ||
document.captureElement = null; | ||
} else { | ||
if (!document.captureElement) { | ||
return; | ||
} // There might be events already queued. The event proxy needs | ||
// access to the captured element for these queued events. | ||
// E.g. contextmenu (right-click) in Microsoft Edge | ||
// | ||
// Before removing the capturedElem pointer we save it to a | ||
// temporary variable that the unflushed events can use. | ||
document.releaseCapture(); | ||
} else { | ||
if (!_captureElem) { | ||
return; | ||
} | ||
// There might be events already queued, so we need to wait for | ||
// them to flush. E.g. contextmenu in Microsoft Edge | ||
window.setTimeout(function (expected) { | ||
// Only clear it if it's the expected grab (i.e. no one | ||
// else has initiated a new grab) | ||
if (_captureIndex === expected) { | ||
_captureElem = null; | ||
} | ||
}, 0, _captureIndex); | ||
_elementForUnflushedEvents = document.captureElement; | ||
document.captureElement = null; | ||
_captureObserver.disconnect(); | ||
_captureObserver.disconnect(); | ||
var captureElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
captureElem.style.display = "none"; | ||
window.removeEventListener('mousemove', _captureProxy); | ||
window.removeEventListener('mouseup', _captureProxy); | ||
} | ||
var proxyElem = document.getElementById("noVNC_mouse_capture_elem"); | ||
proxyElem.style.display = "none"; | ||
window.removeEventListener('mousemove', _captureProxy); | ||
window.removeEventListener('mouseup', _captureProxy); | ||
} | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -18,43 +21,45 @@ * | ||
*/ | ||
var EventTargetMixin = /*#__PURE__*/function () { | ||
function EventTargetMixin() { | ||
_classCallCheck(this, EventTargetMixin); | ||
var EventTargetMixin = function () { | ||
function EventTargetMixin() { | ||
_classCallCheck(this, EventTargetMixin); | ||
this._listeners = new Map(); | ||
} | ||
this._listeners = new Map(); | ||
_createClass(EventTargetMixin, [{ | ||
key: "addEventListener", | ||
value: function addEventListener(type, callback) { | ||
if (!this._listeners.has(type)) { | ||
this._listeners.set(type, new Set()); | ||
} | ||
this._listeners.get(type).add(callback); | ||
} | ||
}, { | ||
key: "removeEventListener", | ||
value: function removeEventListener(type, callback) { | ||
if (this._listeners.has(type)) { | ||
this._listeners.get(type)["delete"](callback); | ||
} | ||
} | ||
}, { | ||
key: "dispatchEvent", | ||
value: function dispatchEvent(event) { | ||
var _this = this; | ||
_createClass(EventTargetMixin, [{ | ||
key: "addEventListener", | ||
value: function addEventListener(type, callback) { | ||
if (!this._listeners.has(type)) { | ||
this._listeners.set(type, new Set()); | ||
} | ||
this._listeners.get(type).add(callback); | ||
} | ||
}, { | ||
key: "removeEventListener", | ||
value: function removeEventListener(type, callback) { | ||
if (this._listeners.has(type)) { | ||
this._listeners.get(type).delete(callback); | ||
} | ||
} | ||
}, { | ||
key: "dispatchEvent", | ||
value: function dispatchEvent(event) { | ||
var _this = this; | ||
if (!this._listeners.has(event.type)) { | ||
return true; | ||
} | ||
if (!this._listeners.has(event.type)) { | ||
return true; | ||
} | ||
this._listeners.get(event.type).forEach(function (callback) { | ||
return callback.call(_this, event); | ||
}); | ||
return !event.defaultPrevented; | ||
} | ||
}]); | ||
this._listeners.get(event.type).forEach(function (callback) { | ||
return callback.call(_this, event); | ||
}); | ||
return EventTargetMixin; | ||
return !event.defaultPrevented; | ||
} | ||
}]); | ||
return EventTargetMixin; | ||
}(); | ||
exports.default = EventTargetMixin; | ||
exports["default"] = EventTargetMixin; |
@@ -1,11 +0,13 @@ | ||
'use strict'; | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports.init_logging = init_logging; | ||
exports.get_logging = get_logging; | ||
exports.initLogging = initLogging; | ||
exports.getLogging = getLogging; | ||
exports.Error = exports.Warn = exports.Info = exports.Debug = void 0; | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -19,50 +21,60 @@ * | ||
*/ | ||
var _logLevel = 'warn'; | ||
var _log_level = 'warn'; | ||
var Debug = function Debug() {}; | ||
var Debug = function Debug() {}; | ||
exports.Debug = Debug; | ||
var Info = function Info() {}; | ||
exports.Info = Info; | ||
var Warn = function Warn() {}; | ||
exports.Warn = Warn; | ||
var Error = function Error() {}; | ||
function init_logging(level) { | ||
if (typeof level === 'undefined') { | ||
level = _log_level; | ||
} else { | ||
_log_level = level; | ||
} | ||
exports.Error = Error; | ||
exports.Debug = Debug = exports.Info = Info = exports.Warn = Warn = exports.Error = Error = function Error() {}; | ||
function initLogging(level) { | ||
if (typeof level === 'undefined') { | ||
level = _logLevel; | ||
} else { | ||
_logLevel = level; | ||
} | ||
if (typeof window.console !== "undefined") { | ||
/* eslint-disable no-console, no-fallthrough */ | ||
switch (level) { | ||
case 'debug': | ||
exports.Debug = Debug = console.debug.bind(window.console); | ||
case 'info': | ||
exports.Info = Info = console.info.bind(window.console); | ||
case 'warn': | ||
exports.Warn = Warn = console.warn.bind(window.console); | ||
case 'error': | ||
exports.Error = Error = console.error.bind(window.console); | ||
case 'none': | ||
break; | ||
default: | ||
throw new window.Error("invalid logging type '" + level + "'"); | ||
} | ||
/* eslint-enable no-console, no-fallthrough */ | ||
exports.Debug = Debug = exports.Info = Info = exports.Warn = Warn = exports.Error = Error = function Error() {}; | ||
if (typeof window.console !== "undefined") { | ||
/* eslint-disable no-console, no-fallthrough */ | ||
switch (level) { | ||
case 'debug': | ||
exports.Debug = Debug = console.debug.bind(window.console); | ||
case 'info': | ||
exports.Info = Info = console.info.bind(window.console); | ||
case 'warn': | ||
exports.Warn = Warn = console.warn.bind(window.console); | ||
case 'error': | ||
exports.Error = Error = console.error.bind(window.console); | ||
case 'none': | ||
break; | ||
default: | ||
throw new window.Error("invalid logging type '" + level + "'"); | ||
} | ||
/* eslint-enable no-console, no-fallthrough */ | ||
} | ||
} | ||
function get_logging() { | ||
return _log_level; | ||
function getLogging() { | ||
return _logLevel; | ||
} | ||
exports.Debug = Debug; | ||
exports.Info = Info; | ||
exports.Warn = Warn; | ||
exports.Error = Error; | ||
// Initialize logging level | ||
init_logging(); | ||
initLogging(); |
@@ -7,5 +7,7 @@ "use strict"; | ||
exports.decodeUTF8 = decodeUTF8; | ||
exports.encodeUTF8 = encodeUTF8; | ||
/* | ||
* noVNC: HTML5 VNC client | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Copyright (C) 2019 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
@@ -15,8 +17,24 @@ * | ||
*/ | ||
// Decode from UTF-8 | ||
function decodeUTF8(utf8string) { | ||
var allowLatin1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; | ||
/* | ||
* Decode from UTF-8 | ||
*/ | ||
function decodeUTF8(utf8string) { | ||
return decodeURIComponent(escape(utf8string)); | ||
try { | ||
return decodeURIComponent(escape(utf8string)); | ||
} catch (e) { | ||
if (e instanceof URIError) { | ||
if (allowLatin1) { | ||
// If we allow Latin1 we can ignore any decoding fails | ||
// and in these cases return the original string | ||
return utf8string; | ||
} | ||
} | ||
throw e; | ||
} | ||
} // Encode to UTF-8 | ||
function encodeUTF8(DOMString) { | ||
return unescape(encodeURIComponent(DOMString)); | ||
} |
@@ -9,2 +9,4 @@ "use strict"; | ||
exports.flattenChunks = flattenChunks; | ||
exports.Buf32 = exports.Buf16 = exports.Buf8 = void 0; | ||
// reduce buffer size, avoiding mem copy | ||
@@ -15,9 +17,13 @@ function shrinkBuf(buf, size) { | ||
} | ||
if (buf.subarray) { | ||
return buf.subarray(0, size); | ||
} | ||
buf.length = size; | ||
return buf; | ||
}; | ||
} | ||
; | ||
function arraySet(dest, src, src_offs, len, dest_offs) { | ||
@@ -27,22 +33,24 @@ if (src.subarray && dest.subarray) { | ||
return; | ||
} | ||
// Fallback to ordinary array | ||
} // Fallback to ordinary array | ||
for (var i = 0; i < len; i++) { | ||
dest[dest_offs + i] = src[src_offs + i]; | ||
} | ||
} | ||
} // Join array of chunks to single array. | ||
// Join array of chunks to single array. | ||
function flattenChunks(chunks) { | ||
var i, l, len, pos, chunk, result; | ||
var i, l, len, pos, chunk, result; // calculate data length | ||
// calculate data length | ||
len = 0; | ||
for (i = 0, l = chunks.length; i < l; i++) { | ||
len += chunks[i].length; | ||
} | ||
} // join chunks | ||
// join chunks | ||
result = new Uint8Array(len); | ||
pos = 0; | ||
for (i = 0, l = chunks.length; i < l; i++) { | ||
@@ -57,4 +65,7 @@ chunk = chunks[i]; | ||
var Buf8 = exports.Buf8 = Uint8Array; | ||
var Buf16 = exports.Buf16 = Uint16Array; | ||
var Buf32 = exports.Buf32 = Int32Array; | ||
var Buf8 = Uint8Array; | ||
exports.Buf8 = Buf8; | ||
var Buf16 = Uint16Array; | ||
exports.Buf16 = Buf16; | ||
var Buf32 = Int32Array; | ||
exports.Buf32 = Buf32; |
@@ -6,7 +6,7 @@ "use strict"; | ||
}); | ||
exports.default = adler32; | ||
exports["default"] = adler32; | ||
// Note: adler32 takes 12% for level 0 and 2% for level 6. | ||
// It doesn't worth to make additional optimizationa as in original. | ||
// Small size is preferable. | ||
function adler32(adler, buf, len, pos) { | ||
@@ -13,0 +13,0 @@ var s1 = adler & 0xffff | 0, |
@@ -6,4 +6,4 @@ "use strict"; | ||
}); | ||
exports.default = { | ||
exports["default"] = void 0; | ||
var _default = { | ||
/* Allowed flush values; see deflate() and inflate() below for details */ | ||
@@ -36,3 +36,2 @@ Z_NO_FLUSH: 0, | ||
Z_DEFAULT_COMPRESSION: -1, | ||
Z_FILTERED: 1, | ||
@@ -51,4 +50,5 @@ Z_HUFFMAN_ONLY: 2, | ||
/* The deflate compression method */ | ||
Z_DEFLATED: 8 | ||
//Z_NULL: null // Use -1 or null inline, depending on var type | ||
}; | ||
Z_DEFLATED: 8 //Z_NULL: null // Use -1 or null inline, depending on var type | ||
}; | ||
exports["default"] = _default; |
@@ -6,8 +6,7 @@ "use strict"; | ||
}); | ||
exports.default = makeTable; | ||
exports["default"] = makeTable; | ||
// Note: we can't get significant speed boost here. | ||
// So write code to minimize size - no pregenerated tables | ||
// and array tools dependencies. | ||
// Use ordinary array, since untyped makes no boost here | ||
@@ -20,5 +19,7 @@ function makeTable() { | ||
c = n; | ||
for (var k = 0; k < 8; k++) { | ||
c = c & 1 ? 0xEDB88320 ^ c >>> 1 : c >>> 1; | ||
} | ||
table[n] = c; | ||
@@ -28,5 +29,5 @@ } | ||
return table; | ||
} | ||
} // Create table on load. Just 255 signed longs. Not a problem. | ||
// Create table on load. Just 255 signed longs. Not a problem. | ||
var crcTable = makeTable(); | ||
@@ -37,3 +38,2 @@ | ||
end = pos + len; | ||
crc ^= -1; | ||
@@ -40,0 +40,0 @@ |
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.deflateInfo = exports.deflateSetDictionary = exports.deflateEnd = exports.deflate = exports.deflateSetHeader = exports.deflateResetKeep = exports.deflateReset = exports.deflateInit2 = exports.deflateInit = undefined; | ||
exports.deflateInit = deflateInit; | ||
exports.deflateInit2 = deflateInit2; | ||
exports.deflateReset = deflateReset; | ||
exports.deflateResetKeep = deflateResetKeep; | ||
exports.deflateSetHeader = deflateSetHeader; | ||
exports.deflate = deflate; | ||
exports.deflateEnd = deflateEnd; | ||
exports.deflateSetDictionary = deflateSetDictionary; | ||
exports.deflateInfo = exports.Z_DEFLATED = exports.Z_UNKNOWN = exports.Z_DEFAULT_STRATEGY = exports.Z_FIXED = exports.Z_RLE = exports.Z_HUFFMAN_ONLY = exports.Z_FILTERED = exports.Z_DEFAULT_COMPRESSION = exports.Z_BUF_ERROR = exports.Z_DATA_ERROR = exports.Z_STREAM_ERROR = exports.Z_STREAM_END = exports.Z_OK = exports.Z_BLOCK = exports.Z_FINISH = exports.Z_FULL_FLUSH = exports.Z_PARTIAL_FLUSH = exports.Z_NO_FLUSH = void 0; | ||
var _common = require("../utils/common.js"); | ||
var utils = _interopRequireWildcard(require("../utils/common.js")); | ||
var utils = _interopRequireWildcard(_common); | ||
var trees = _interopRequireWildcard(require("./trees.js")); | ||
var _trees = require("./trees.js"); | ||
var _adler = _interopRequireDefault(require("./adler32.js")); | ||
var trees = _interopRequireWildcard(_trees); | ||
var _crc = _interopRequireDefault(require("./crc32.js")); | ||
var _adler = require("./adler32.js"); | ||
var _messages = _interopRequireDefault(require("./messages.js")); | ||
var _adler2 = _interopRequireDefault(_adler); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _crc = require("./crc32.js"); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
var _crc2 = _interopRequireDefault(_crc); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
var _messages = require("./messages.js"); | ||
/* Public constants ==========================================================*/ | ||
var _messages2 = _interopRequireDefault(_messages); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
/* Public constants ==========================================================*/ | ||
/* ===========================================================================*/ | ||
@@ -37,65 +40,86 @@ | ||
var Z_NO_FLUSH = 0; | ||
var Z_PARTIAL_FLUSH = 1; | ||
//var Z_SYNC_FLUSH = 2; | ||
exports.Z_NO_FLUSH = Z_NO_FLUSH; | ||
var Z_PARTIAL_FLUSH = 1; //export const Z_SYNC_FLUSH = 2; | ||
exports.Z_PARTIAL_FLUSH = Z_PARTIAL_FLUSH; | ||
var Z_FULL_FLUSH = 3; | ||
exports.Z_FULL_FLUSH = Z_FULL_FLUSH; | ||
var Z_FINISH = 4; | ||
var Z_BLOCK = 5; | ||
//var Z_TREES = 6; | ||
exports.Z_FINISH = Z_FINISH; | ||
var Z_BLOCK = 5; //export const Z_TREES = 6; | ||
/* Return codes for the compression/decompression functions. Negative values | ||
* are errors, positive values are used for special but normal events. | ||
*/ | ||
exports.Z_BLOCK = Z_BLOCK; | ||
var Z_OK = 0; | ||
var Z_STREAM_END = 1; | ||
//var Z_NEED_DICT = 2; | ||
//var Z_ERRNO = -1; | ||
exports.Z_OK = Z_OK; | ||
var Z_STREAM_END = 1; //export const Z_NEED_DICT = 2; | ||
//export const Z_ERRNO = -1; | ||
exports.Z_STREAM_END = Z_STREAM_END; | ||
var Z_STREAM_ERROR = -2; | ||
var Z_DATA_ERROR = -3; | ||
//var Z_MEM_ERROR = -4; | ||
var Z_BUF_ERROR = -5; | ||
//var Z_VERSION_ERROR = -6; | ||
exports.Z_STREAM_ERROR = Z_STREAM_ERROR; | ||
var Z_DATA_ERROR = -3; //export const Z_MEM_ERROR = -4; | ||
exports.Z_DATA_ERROR = Z_DATA_ERROR; | ||
var Z_BUF_ERROR = -5; //export const Z_VERSION_ERROR = -6; | ||
/* compression levels */ | ||
//var Z_NO_COMPRESSION = 0; | ||
//var Z_BEST_SPEED = 1; | ||
//var Z_BEST_COMPRESSION = 9; | ||
//export const Z_NO_COMPRESSION = 0; | ||
//export const Z_BEST_SPEED = 1; | ||
//export const Z_BEST_COMPRESSION = 9; | ||
exports.Z_BUF_ERROR = Z_BUF_ERROR; | ||
var Z_DEFAULT_COMPRESSION = -1; | ||
exports.Z_DEFAULT_COMPRESSION = Z_DEFAULT_COMPRESSION; | ||
var Z_FILTERED = 1; | ||
exports.Z_FILTERED = Z_FILTERED; | ||
var Z_HUFFMAN_ONLY = 2; | ||
exports.Z_HUFFMAN_ONLY = Z_HUFFMAN_ONLY; | ||
var Z_RLE = 3; | ||
exports.Z_RLE = Z_RLE; | ||
var Z_FIXED = 4; | ||
exports.Z_FIXED = Z_FIXED; | ||
var Z_DEFAULT_STRATEGY = 0; | ||
/* Possible values of the data_type field (though see inflate()) */ | ||
//export const Z_BINARY = 0; | ||
//export const Z_TEXT = 1; | ||
//export const Z_ASCII = 1; // = Z_TEXT | ||
/* Possible values of the data_type field (though see inflate()) */ | ||
//var Z_BINARY = 0; | ||
//var Z_TEXT = 1; | ||
//var Z_ASCII = 1; // = Z_TEXT | ||
exports.Z_DEFAULT_STRATEGY = Z_DEFAULT_STRATEGY; | ||
var Z_UNKNOWN = 2; | ||
/* The deflate compression method */ | ||
/* The deflate compression method */ | ||
exports.Z_UNKNOWN = Z_UNKNOWN; | ||
var Z_DEFLATED = 8; | ||
/*============================================================================*/ | ||
exports.Z_DEFLATED = Z_DEFLATED; | ||
var MAX_MEM_LEVEL = 9; | ||
/* Maximum value for memLevel in deflateInit2 */ | ||
var MAX_WBITS = 15; | ||
/* 32K LZ77 window */ | ||
var DEF_MEM_LEVEL = 8; | ||
var LENGTH_CODES = 29; | ||
/* number of length codes, not counting the special END_BLOCK code */ | ||
var LITERALS = 256; | ||
/* number of literal bytes 0..255 */ | ||
var L_CODES = LITERALS + 1 + LENGTH_CODES; | ||
/* number of Literal or Length codes, including the END_BLOCK code */ | ||
var D_CODES = 30; | ||
/* number of distance codes */ | ||
var BL_CODES = 19; | ||
/* number of codes used to transfer the bit lengths */ | ||
var HEAP_SIZE = 2 * L_CODES + 1; | ||
/* maximum heap size */ | ||
var MAX_BITS = 15; | ||
@@ -107,5 +131,3 @@ /* All codes must not exceed MAX_BITS bits */ | ||
var MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; | ||
var PRESET_DICT = 0x20; | ||
var INIT_STATE = 42; | ||
@@ -118,12 +140,18 @@ var EXTRA_STATE = 69; | ||
var FINISH_STATE = 666; | ||
var BS_NEED_MORE = 1; | ||
/* block not completed, need more input or more output */ | ||
var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ | ||
var BS_BLOCK_DONE = 2; /* block flush performed */ | ||
var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ | ||
var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ | ||
var BS_BLOCK_DONE = 2; | ||
/* block flush performed */ | ||
var BS_FINISH_STARTED = 3; | ||
/* finish started, need only more output at next deflate */ | ||
var BS_FINISH_DONE = 4; | ||
/* finish done, accept no more input or output */ | ||
var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. | ||
function err(strm, errorCode) { | ||
strm.msg = _messages2.default[errorCode]; | ||
strm.msg = _messages["default"][errorCode]; | ||
return errorCode; | ||
@@ -137,7 +165,8 @@ } | ||
function zero(buf) { | ||
var len = buf.length;while (--len >= 0) { | ||
var len = buf.length; | ||
while (--len >= 0) { | ||
buf[len] = 0; | ||
} | ||
} | ||
/* ========================================================================= | ||
@@ -149,10 +178,13 @@ * Flush as much pending output as possible. All deflate() output goes | ||
*/ | ||
function flush_pending(strm) { | ||
var s = strm.state; | ||
var s = strm.state; //_tr_flush_bits(s); | ||
//_tr_flush_bits(s); | ||
var len = s.pending; | ||
if (len > strm.avail_out) { | ||
len = strm.avail_out; | ||
} | ||
if (len === 0) { | ||
@@ -168,2 +200,3 @@ return; | ||
s.pending -= len; | ||
if (s.pending === 0) { | ||
@@ -176,2 +209,3 @@ s.pending_out = 0; | ||
trees._tr_flush_block(s, s.block_start >= 0 ? s.block_start : -1, s.strstart - s.block_start, last); | ||
s.block_start = s.strstart; | ||
@@ -184,3 +218,2 @@ flush_pending(s.strm); | ||
} | ||
/* ========================================================================= | ||
@@ -191,2 +224,4 @@ * Put a short in the pending buffer. The 16-bit value is put in MSB order. | ||
*/ | ||
function putShortMSB(s, b) { | ||
@@ -198,3 +233,2 @@ // put_byte(s, (Byte)(b >> 8)); | ||
} | ||
/* =========================================================================== | ||
@@ -207,2 +241,4 @@ * Read a new buffer from the current input stream, update the adler32 | ||
*/ | ||
function read_buf(strm, buf, start, size) { | ||
@@ -214,2 +250,3 @@ var len = strm.avail_in; | ||
} | ||
if (len === 0) { | ||
@@ -219,10 +256,10 @@ return 0; | ||
strm.avail_in -= len; | ||
strm.avail_in -= len; // zmemcpy(buf, strm->next_in, len); | ||
// zmemcpy(buf, strm->next_in, len); | ||
utils.arraySet(buf, strm.input, strm.next_in, len, start); | ||
if (strm.state.wrap === 1) { | ||
strm.adler = (0, _adler2.default)(strm.adler, buf, len, start); | ||
strm.adler = (0, _adler["default"])(strm.adler, buf, len, start); | ||
} else if (strm.state.wrap === 2) { | ||
strm.adler = (0, _crc2.default)(strm.adler, buf, len, start); | ||
strm.adler = (0, _crc["default"])(strm.adler, buf, len, start); | ||
} | ||
@@ -232,6 +269,4 @@ | ||
strm.total_in += len; | ||
return len; | ||
} | ||
/* =========================================================================== | ||
@@ -246,11 +281,26 @@ * Set match_start to the longest match starting at the given string and | ||
*/ | ||
function longest_match(s, cur_match) { | ||
var chain_length = s.max_chain_length; /* max hash chain length */ | ||
var scan = s.strstart; /* current string */ | ||
var match; /* matched string */ | ||
var len; /* length of current match */ | ||
var best_len = s.prev_length; /* best match length so far */ | ||
var nice_match = s.nice_match; /* stop if match long enough */ | ||
var limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0 /*NIL*/; | ||
var chain_length = s.max_chain_length; | ||
/* max hash chain length */ | ||
var scan = s.strstart; | ||
/* current string */ | ||
var match; | ||
/* matched string */ | ||
var len; | ||
/* length of current match */ | ||
var best_len = s.prev_length; | ||
/* best match length so far */ | ||
var nice_match = s.nice_match; | ||
/* stop if match long enough */ | ||
var limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0 | ||
/*NIL*/ | ||
; | ||
var _win = s.window; // shortcut | ||
@@ -260,3 +310,2 @@ | ||
var prev = s.prev; | ||
/* Stop when cur_match becomes <= limit. To simplify the code, | ||
@@ -269,3 +318,2 @@ * we prevent matches with the string of window index 0. | ||
var scan_end = _win[scan + best_len]; | ||
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. | ||
@@ -277,2 +325,3 @@ * It is easy to get rid of this optimization if necessary. | ||
/* Do not waste too much time if we already have a good match: */ | ||
if (s.prev_length >= s.good_match) { | ||
@@ -284,7 +333,8 @@ chain_length >>= 2; | ||
*/ | ||
if (nice_match > s.lookahead) { | ||
nice_match = s.lookahead; | ||
} | ||
} // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); | ||
// Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); | ||
@@ -294,3 +344,2 @@ do { | ||
match = cur_match; | ||
/* Skip to next match if the match length cannot increase | ||
@@ -308,3 +357,2 @@ * or if the match length is less than 2. Note that the checks below | ||
} | ||
/* The check at best_len-1 can be removed because it will be made | ||
@@ -316,5 +364,6 @@ * again later. (This heuristic is not always a win.) | ||
*/ | ||
scan += 2; | ||
match++; | ||
// Assert(*scan == *match, "match[2]?"); | ||
match++; // Assert(*scan == *match, "match[2]?"); | ||
@@ -324,8 +373,7 @@ /* We check for insufficient lookahead only every 8th comparison; | ||
*/ | ||
do { | ||
// Do nothing | ||
} while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend); | ||
// Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); | ||
do {// Do nothing | ||
} while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend); // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); | ||
len = MAX_MATCH - (strend - scan); | ||
@@ -337,5 +385,7 @@ scan = strend - MAX_MATCH; | ||
best_len = len; | ||
if (len >= nice_match) { | ||
break; | ||
} | ||
scan_end1 = _win[scan + best_len - 1]; | ||
@@ -349,5 +399,5 @@ scan_end = _win[scan + best_len]; | ||
} | ||
return s.lookahead; | ||
} | ||
/* =========================================================================== | ||
@@ -363,12 +413,11 @@ * Fill the window when the lookahead becomes insufficient. | ||
*/ | ||
function fill_window(s) { | ||
var _w_size = s.w_size; | ||
var p, n, m, more, str; | ||
var p, n, m, more, str; //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); | ||
//Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); | ||
do { | ||
more = s.window_size - s.lookahead - s.strstart; | ||
more = s.window_size - s.lookahead - s.strstart; // JS ints have 32 bit, block below not needed | ||
// JS ints have 32 bit, block below not needed | ||
/* Deal with !@#$% 64K limit: */ | ||
@@ -387,8 +436,7 @@ //if (sizeof(int) <= 2) { | ||
/* If the window is almost full and there is insufficient lookahead, | ||
* move the upper half to the lower one to make room in the upper half. | ||
*/ | ||
if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { | ||
utils.arraySet(s.window, s.window, _w_size, _w_size, 0); | ||
@@ -398,4 +446,4 @@ s.match_start -= _w_size; | ||
/* we now have strstart >= MAX_DIST */ | ||
s.block_start -= _w_size; | ||
/* Slide the hash table (could be avoided with 32 bit values | ||
@@ -410,2 +458,3 @@ at the expense of memory usage). We slide even when level == 0 | ||
p = n; | ||
do { | ||
@@ -418,2 +467,3 @@ m = s.head[--p]; | ||
p = n; | ||
do { | ||
@@ -429,6 +479,6 @@ m = s.prev[--p]; | ||
} | ||
if (s.strm.avail_in === 0) { | ||
break; | ||
} | ||
/* If there was no sliding: | ||
@@ -446,19 +496,20 @@ * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && | ||
//Assert(more >= 2, "more < 2"); | ||
n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); | ||
s.lookahead += n; | ||
/* Initialize the hash value now that we have some input: */ | ||
/* Initialize the hash value now that we have some input: */ | ||
if (s.lookahead + s.insert >= MIN_MATCH) { | ||
str = s.strstart - s.insert; | ||
s.ins_h = s.window[str]; | ||
/* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ | ||
/* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ | ||
s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + 1]) & s.hash_mask; | ||
//#if MIN_MATCH != 3 | ||
s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + 1]) & s.hash_mask; //#if MIN_MATCH != 3 | ||
// Call update_hash() MIN_MATCH-3 more times | ||
//#endif | ||
while (s.insert) { | ||
/* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ | ||
s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; | ||
s.prev[str & s.w_mask] = s.head[s.ins_h]; | ||
@@ -468,2 +519,3 @@ s.head[s.ins_h] = str; | ||
s.insert--; | ||
if (s.lookahead + s.insert < MIN_MATCH) { | ||
@@ -477,4 +529,4 @@ break; | ||
*/ | ||
} while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); | ||
/* If the WIN_INIT bytes after the end of the current data have never been | ||
@@ -516,4 +568,4 @@ * written, then zero those bytes in order to avoid memory check reports of | ||
// "not enough room for search"); | ||
} | ||
/* =========================================================================== | ||
@@ -528,2 +580,4 @@ * Copy without compression as much as possible from the input stream, return | ||
*/ | ||
function deflate_stored(s, flush) { | ||
@@ -538,8 +592,8 @@ /* Stored blocks are limited to 0xffff bytes, pending_buf is limited | ||
} | ||
/* Copy as much as possible from input to output: */ | ||
/* Copy as much as possible from input to output: */ | ||
for (;;) { | ||
/* Fill the window as much as possible: */ | ||
if (s.lookahead <= 1) { | ||
//Assert(s->strstart < s->w_size+MAX_DIST(s) || | ||
@@ -551,4 +605,4 @@ // s->block_start >= (long)s->w_size, "slide too late"); | ||
// } | ||
fill_window(s); | ||
fill_window(s); | ||
if (s.lookahead === 0 && flush === Z_NO_FLUSH) { | ||
@@ -562,10 +616,11 @@ return BS_NEED_MORE; | ||
/* flush the current block */ | ||
} | ||
//Assert(s->block_start >= 0L, "block gone"); | ||
} //Assert(s->block_start >= 0L, "block gone"); | ||
// if (s.block_start < 0) throw new Error("block gone"); | ||
s.strstart += s.lookahead; | ||
s.lookahead = 0; | ||
/* Emit a stored block if pending_buf will be full: */ | ||
/* Emit a stored block if pending_buf will be full: */ | ||
var max_start = s.block_start + max_block_size; | ||
@@ -578,3 +633,5 @@ | ||
/*** FLUSH_BLOCK(s, 0); ***/ | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -584,2 +641,3 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
@@ -589,5 +647,8 @@ /* Flush if we may have to slide, otherwise block_start may become | ||
*/ | ||
if (s.strstart - s.block_start >= s.w_size - MIN_LOOKAHEAD) { | ||
/*** FLUSH_BLOCK(s, 0); ***/ | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -597,2 +658,3 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
@@ -606,2 +668,3 @@ } | ||
flush_block_only(s, true); | ||
if (s.strm.avail_out === 0) { | ||
@@ -611,2 +674,4 @@ return BS_FINISH_STARTED; | ||
/***/ | ||
return BS_FINISH_DONE; | ||
@@ -618,2 +683,3 @@ } | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -623,2 +689,3 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
@@ -628,3 +695,2 @@ | ||
} | ||
/* =========================================================================== | ||
@@ -637,6 +703,11 @@ * Compress as much as possible from the input stream, return the current | ||
*/ | ||
function deflate_fast(s, flush) { | ||
var hash_head; /* head of the hash chain */ | ||
var bflush; /* set if current block must be flushed */ | ||
var hash_head; | ||
/* head of the hash chain */ | ||
var bflush; | ||
/* set if current block must be flushed */ | ||
for (;;) { | ||
@@ -650,14 +721,21 @@ /* Make sure that we always have enough lookahead, except | ||
fill_window(s); | ||
if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { | ||
return BS_NEED_MORE; | ||
} | ||
if (s.lookahead === 0) { | ||
break; /* flush the current block */ | ||
break; | ||
/* flush the current block */ | ||
} | ||
} | ||
/* Insert the string window[strstart .. strstart+2] in the | ||
* dictionary, and set hash_head to the head of the hash chain: | ||
*/ | ||
hash_head = 0 /*NIL*/; | ||
hash_head = 0 | ||
/*NIL*/ | ||
; | ||
if (s.lookahead >= MIN_MATCH) { | ||
@@ -670,7 +748,10 @@ /*** INSERT_STRING(s, s.strstart, hash_head); ***/ | ||
} | ||
/* Find the longest match, discarding those <= prev_length. | ||
* At this point we have always match_length < MIN_MATCH | ||
*/ | ||
if (hash_head !== 0 /*NIL*/ && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { | ||
if (hash_head !== 0 | ||
/*NIL*/ | ||
&& s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { | ||
/* To simplify the code, we prevent matches with the string | ||
@@ -683,2 +764,3 @@ * of window index 0 (in particular we have to avoid a match | ||
} | ||
if (s.match_length >= MIN_MATCH) { | ||
@@ -690,13 +772,17 @@ // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only | ||
bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); | ||
s.lookahead -= s.match_length; | ||
/* Insert new strings in the hash table only if the match length | ||
* is not too large. This saves time but degrades compression. | ||
*/ | ||
if (s.match_length <= s.max_lazy_match /*max_insert_length*/ && s.lookahead >= MIN_MATCH) { | ||
s.match_length--; /* string at strstart already in table */ | ||
if (s.match_length <= s.max_lazy_match | ||
/*max_insert_length*/ | ||
&& s.lookahead >= MIN_MATCH) { | ||
s.match_length--; | ||
/* string at strstart already in table */ | ||
do { | ||
s.strstart++; | ||
/*** INSERT_STRING(s, s.strstart, hash_head); ***/ | ||
s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; | ||
@@ -706,2 +792,3 @@ hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; | ||
/***/ | ||
/* strstart never exceeds WSIZE-MAX_MATCH, so there are | ||
@@ -711,2 +798,3 @@ * always MIN_MATCH bytes ahead. | ||
} while (--s.match_length !== 0); | ||
s.strstart++; | ||
@@ -718,7 +806,7 @@ } else { | ||
/* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ | ||
s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + 1]) & s.hash_mask; | ||
//#if MIN_MATCH != 3 | ||
s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + 1]) & s.hash_mask; //#if MIN_MATCH != 3 | ||
// Call UPDATE_HASH() MIN_MATCH-3 more times | ||
//#endif | ||
/* If lookahead < MIN_MATCH, ins_h is garbage, but it does not | ||
@@ -731,11 +819,13 @@ * matter since it will be recomputed at next deflate call. | ||
//Tracevv((stderr,"%c", s.window[s.strstart])); | ||
/*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ | ||
bflush = trees._tr_tally(s, 0, s.window[s.strstart]); | ||
s.lookahead--; | ||
s.strstart++; | ||
} | ||
if (bflush) { | ||
/*** FLUSH_BLOCK(s, 0); ***/ | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -745,8 +835,12 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
} | ||
s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; | ||
if (flush === Z_FINISH) { | ||
/*** FLUSH_BLOCK(s, 1); ***/ | ||
flush_block_only(s, true); | ||
if (s.strm.avail_out === 0) { | ||
@@ -756,7 +850,11 @@ return BS_FINISH_STARTED; | ||
/***/ | ||
return BS_FINISH_DONE; | ||
} | ||
if (s.last_lit) { | ||
/*** FLUSH_BLOCK(s, 0); ***/ | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -766,6 +864,7 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
return BS_BLOCK_DONE; | ||
} | ||
/* =========================================================================== | ||
@@ -776,9 +875,14 @@ * Same as above, but achieves better compression. We use a lazy | ||
*/ | ||
function deflate_slow(s, flush) { | ||
var hash_head; /* head of hash chain */ | ||
var bflush; /* set if current block must be flushed */ | ||
var hash_head; | ||
/* head of hash chain */ | ||
var bflush; | ||
/* set if current block must be flushed */ | ||
var max_insert; | ||
/* Process the input block. */ | ||
/* Process the input block. */ | ||
for (;;) { | ||
@@ -792,14 +896,22 @@ /* Make sure that we always have enough lookahead, except | ||
fill_window(s); | ||
if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { | ||
return BS_NEED_MORE; | ||
} | ||
if (s.lookahead === 0) { | ||
break; | ||
} /* flush the current block */ | ||
} | ||
/* flush the current block */ | ||
} | ||
/* Insert the string window[strstart .. strstart+2] in the | ||
* dictionary, and set hash_head to the head of the hash chain: | ||
*/ | ||
hash_head = 0 /*NIL*/; | ||
hash_head = 0 | ||
/*NIL*/ | ||
; | ||
if (s.lookahead >= MIN_MATCH) { | ||
@@ -812,5 +924,6 @@ /*** INSERT_STRING(s, s.strstart, hash_head); ***/ | ||
} | ||
/* Find the longest match, discarding those <= prev_length. | ||
*/ | ||
s.prev_length = s.match_length; | ||
@@ -820,3 +933,7 @@ s.prev_match = s.match_start; | ||
if (hash_head !== 0 /*NIL*/ && s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD /*MAX_DIST(s)*/) { | ||
if (hash_head !== 0 | ||
/*NIL*/ | ||
&& s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD | ||
/*MAX_DIST(s)*/ | ||
) { | ||
/* To simplify the code, we prevent matches with the string | ||
@@ -829,4 +946,5 @@ * of window index 0 (in particular we have to avoid a match | ||
if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096 /*TOO_FAR*/)) { | ||
if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096 | ||
/*TOO_FAR*/ | ||
)) { | ||
/* If prev_match is also MIN_MATCH, match_start is garbage | ||
@@ -841,6 +959,7 @@ * but we will ignore the current match anyway. | ||
*/ | ||
if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { | ||
max_insert = s.strstart + s.lookahead - MIN_MATCH; | ||
/* Do not insert strings in hash table beyond this. */ | ||
//check_match(s, s.strstart-1, s.prev_match, s.prev_length); | ||
@@ -850,2 +969,3 @@ | ||
s.prev_length - MIN_MATCH, bflush);***/ | ||
bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); | ||
@@ -857,4 +977,6 @@ /* Insert in hash table all strings up to the end of the match. | ||
*/ | ||
s.lookahead -= s.prev_length - 1; | ||
s.prev_length -= 2; | ||
do { | ||
@@ -869,2 +991,3 @@ if (++s.strstart <= max_insert) { | ||
} while (--s.prev_length !== 0); | ||
s.match_available = 0; | ||
@@ -877,2 +1000,3 @@ s.match_length = MIN_MATCH - 1; | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -882,2 +1006,3 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
@@ -890,2 +1015,3 @@ } else if (s.match_available) { | ||
//Tracevv((stderr,"%c", s->window[s->strstart-1])); | ||
/*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ | ||
@@ -899,4 +1025,6 @@ bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); | ||
} | ||
s.strstart++; | ||
s.lookahead--; | ||
if (s.strm.avail_out === 0) { | ||
@@ -913,15 +1041,19 @@ return BS_NEED_MORE; | ||
} | ||
} | ||
//Assert (flush != Z_NO_FLUSH, "no flush?"); | ||
} //Assert (flush != Z_NO_FLUSH, "no flush?"); | ||
if (s.match_available) { | ||
//Tracevv((stderr,"%c", s->window[s->strstart-1])); | ||
/*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ | ||
bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); | ||
s.match_available = 0; | ||
} | ||
s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; | ||
if (flush === Z_FINISH) { | ||
/*** FLUSH_BLOCK(s, 1); ***/ | ||
flush_block_only(s, true); | ||
if (s.strm.avail_out === 0) { | ||
@@ -931,7 +1063,11 @@ return BS_FINISH_STARTED; | ||
/***/ | ||
return BS_FINISH_DONE; | ||
} | ||
if (s.last_lit) { | ||
/*** FLUSH_BLOCK(s, 0); ***/ | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -941,2 +1077,3 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
@@ -946,3 +1083,2 @@ | ||
} | ||
/* =========================================================================== | ||
@@ -953,7 +1089,14 @@ * For Z_RLE, simply look for runs of bytes, generate matches only of distance | ||
*/ | ||
function deflate_rle(s, flush) { | ||
var bflush; /* set if current block must be flushed */ | ||
var prev; /* byte at distance one to match */ | ||
var scan, strend; /* scan goes up to strend for length of run */ | ||
var bflush; | ||
/* set if current block must be flushed */ | ||
var prev; | ||
/* byte at distance one to match */ | ||
var scan, strend; | ||
/* scan goes up to strend for length of run */ | ||
var _win = s.window; | ||
@@ -968,29 +1111,39 @@ | ||
fill_window(s); | ||
if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { | ||
return BS_NEED_MORE; | ||
} | ||
if (s.lookahead === 0) { | ||
break; | ||
} /* flush the current block */ | ||
} | ||
/* flush the current block */ | ||
} | ||
/* See how many times the previous byte repeats */ | ||
/* See how many times the previous byte repeats */ | ||
s.match_length = 0; | ||
if (s.lookahead >= MIN_MATCH && s.strstart > 0) { | ||
scan = s.strstart - 1; | ||
prev = _win[scan]; | ||
if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { | ||
strend = s.strstart + MAX_MATCH; | ||
do { | ||
// Do nothing | ||
do {// Do nothing | ||
} while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && scan < strend); | ||
s.match_length = MAX_MATCH - (strend - scan); | ||
if (s.match_length > s.lookahead) { | ||
s.match_length = s.lookahead; | ||
} | ||
} | ||
//Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); | ||
} //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); | ||
} | ||
/* Emit match if have run of MIN_MATCH or longer, else emit literal */ | ||
/* Emit match if have run of MIN_MATCH or longer, else emit literal */ | ||
if (s.match_length >= MIN_MATCH) { | ||
@@ -1001,3 +1154,2 @@ //check_match(s, s.strstart, s.strstart - 1, s.match_length); | ||
bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); | ||
s.lookahead -= s.match_length; | ||
@@ -1009,11 +1161,13 @@ s.strstart += s.match_length; | ||
//Tracevv((stderr,"%c", s->window[s->strstart])); | ||
/*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ | ||
bflush = trees._tr_tally(s, 0, s.window[s.strstart]); | ||
s.lookahead--; | ||
s.strstart++; | ||
} | ||
if (bflush) { | ||
/*** FLUSH_BLOCK(s, 0); ***/ | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -1023,8 +1177,12 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
} | ||
s.insert = 0; | ||
if (flush === Z_FINISH) { | ||
/*** FLUSH_BLOCK(s, 1); ***/ | ||
flush_block_only(s, true); | ||
if (s.strm.avail_out === 0) { | ||
@@ -1034,7 +1192,11 @@ return BS_FINISH_STARTED; | ||
/***/ | ||
return BS_FINISH_DONE; | ||
} | ||
if (s.last_lit) { | ||
/*** FLUSH_BLOCK(s, 0); ***/ | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -1044,6 +1206,7 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
return BS_BLOCK_DONE; | ||
} | ||
/* =========================================================================== | ||
@@ -1053,4 +1216,7 @@ * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. | ||
*/ | ||
function deflate_huff(s, flush) { | ||
var bflush; /* set if current block must be flushed */ | ||
var bflush; | ||
/* set if current block must be flushed */ | ||
@@ -1061,2 +1227,3 @@ for (;;) { | ||
fill_window(s); | ||
if (s.lookahead === 0) { | ||
@@ -1066,16 +1233,22 @@ if (flush === Z_NO_FLUSH) { | ||
} | ||
break; /* flush the current block */ | ||
break; | ||
/* flush the current block */ | ||
} | ||
} | ||
/* Output a literal byte */ | ||
/* Output a literal byte */ | ||
s.match_length = 0; | ||
//Tracevv((stderr,"%c", s->window[s->strstart])); | ||
s.match_length = 0; //Tracevv((stderr,"%c", s->window[s->strstart])); | ||
/*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ | ||
bflush = trees._tr_tally(s, 0, s.window[s.strstart]); | ||
s.lookahead--; | ||
s.strstart++; | ||
if (bflush) { | ||
/*** FLUSH_BLOCK(s, 0); ***/ | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -1085,8 +1258,12 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
} | ||
s.insert = 0; | ||
if (flush === Z_FINISH) { | ||
/*** FLUSH_BLOCK(s, 1); ***/ | ||
flush_block_only(s, true); | ||
if (s.strm.avail_out === 0) { | ||
@@ -1096,7 +1273,11 @@ return BS_FINISH_STARTED; | ||
/***/ | ||
return BS_FINISH_DONE; | ||
} | ||
if (s.last_lit) { | ||
/*** FLUSH_BLOCK(s, 0); ***/ | ||
flush_block_only(s, false); | ||
if (s.strm.avail_out === 0) { | ||
@@ -1106,6 +1287,7 @@ return BS_NEED_MORE; | ||
/***/ | ||
} | ||
return BS_BLOCK_DONE; | ||
} | ||
/* Values for max_lazy_match, good_match and max_chain_length, depending on | ||
@@ -1116,2 +1298,4 @@ * the desired pack level (0..9). The values given below have been tuned to | ||
*/ | ||
function Config(good_length, max_lazy, nice_length, max_chain, func) { | ||
@@ -1126,25 +1310,33 @@ this.good_length = good_length; | ||
var configuration_table; | ||
configuration_table = [ | ||
/* good lazy nice chain */ | ||
new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ | ||
new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ | ||
new Config(4, 5, 16, 8, deflate_fast), /* 2 */ | ||
new Config(4, 6, 32, 32, deflate_fast), /* 3 */ | ||
new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ | ||
new Config(8, 16, 32, 32, deflate_slow), /* 5 */ | ||
new Config(8, 16, 128, 128, deflate_slow), /* 6 */ | ||
new Config(8, 32, 128, 256, deflate_slow), /* 7 */ | ||
new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ | ||
new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ | ||
new Config(0, 0, 0, 0, deflate_stored), | ||
/* 0 store only */ | ||
new Config(4, 4, 8, 4, deflate_fast), | ||
/* 1 max speed, no lazy matches */ | ||
new Config(4, 5, 16, 8, deflate_fast), | ||
/* 2 */ | ||
new Config(4, 6, 32, 32, deflate_fast), | ||
/* 3 */ | ||
new Config(4, 4, 16, 16, deflate_slow), | ||
/* 4 lazy matches */ | ||
new Config(8, 16, 32, 32, deflate_slow), | ||
/* 5 */ | ||
new Config(8, 16, 128, 128, deflate_slow), | ||
/* 6 */ | ||
new Config(8, 32, 128, 256, deflate_slow), | ||
/* 7 */ | ||
new Config(32, 128, 258, 1024, deflate_slow), | ||
/* 8 */ | ||
new Config(32, 258, 258, 4096, deflate_slow) | ||
/* 9 max compression */ | ||
]; | ||
/* =========================================================================== | ||
* Initialize the "longest match" routines for a new zlib stream | ||
*/ | ||
function lm_init(s) { | ||
s.window_size = 2 * s.w_size; | ||
/*** CLEAR_HASH(s); ***/ | ||
/*** CLEAR_HASH(s); ***/ | ||
zero(s.head); // Fill with NIL (= 0); | ||
@@ -1154,2 +1346,3 @@ | ||
*/ | ||
s.max_lazy_match = configuration_table[s.level].max_lazy; | ||
@@ -1159,3 +1352,2 @@ s.good_match = configuration_table[s.level].good_length; | ||
s.max_chain_length = configuration_table[s.level].max_chain; | ||
s.strstart = 0; | ||
@@ -1171,18 +1363,44 @@ s.block_start = 0; | ||
function DeflateState() { | ||
this.strm = null; /* pointer back to this zlib stream */ | ||
this.status = 0; /* as the name implies */ | ||
this.pending_buf = null; /* output still pending */ | ||
this.pending_buf_size = 0; /* size of pending_buf */ | ||
this.pending_out = 0; /* next pending byte to output to the stream */ | ||
this.pending = 0; /* nb of bytes in the pending buffer */ | ||
this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ | ||
this.gzhead = null; /* gzip header information to write */ | ||
this.gzindex = 0; /* where in extra, name, or comment */ | ||
this.method = Z_DEFLATED; /* can only be DEFLATED */ | ||
this.last_flush = -1; /* value of flush param for previous deflate call */ | ||
this.strm = null; | ||
/* pointer back to this zlib stream */ | ||
this.w_size = 0; /* LZ77 window size (32K by default) */ | ||
this.w_bits = 0; /* log2(w_size) (8..16) */ | ||
this.w_mask = 0; /* w_size - 1 */ | ||
this.status = 0; | ||
/* as the name implies */ | ||
this.pending_buf = null; | ||
/* output still pending */ | ||
this.pending_buf_size = 0; | ||
/* size of pending_buf */ | ||
this.pending_out = 0; | ||
/* next pending byte to output to the stream */ | ||
this.pending = 0; | ||
/* nb of bytes in the pending buffer */ | ||
this.wrap = 0; | ||
/* bit 0 true for zlib, bit 1 true for gzip */ | ||
this.gzhead = null; | ||
/* gzip header information to write */ | ||
this.gzindex = 0; | ||
/* where in extra, name, or comment */ | ||
this.method = Z_DEFLATED; | ||
/* can only be DEFLATED */ | ||
this.last_flush = -1; | ||
/* value of flush param for previous deflate call */ | ||
this.w_size = 0; | ||
/* LZ77 window size (32K by default) */ | ||
this.w_bits = 0; | ||
/* log2(w_size) (8..16) */ | ||
this.w_mask = 0; | ||
/* w_size - 1 */ | ||
this.window = null; | ||
@@ -1207,9 +1425,17 @@ /* Sliding window. Input bytes are read into the second half of the window, | ||
this.head = null; /* Heads of the hash chains or NIL. */ | ||
this.head = null; | ||
/* Heads of the hash chains or NIL. */ | ||
this.ins_h = 0; /* hash index of string to be inserted */ | ||
this.hash_size = 0; /* number of elements in hash table */ | ||
this.hash_bits = 0; /* log2(hash_size) */ | ||
this.hash_mask = 0; /* hash_size-1 */ | ||
this.ins_h = 0; | ||
/* hash index of string to be inserted */ | ||
this.hash_size = 0; | ||
/* number of elements in hash table */ | ||
this.hash_bits = 0; | ||
/* log2(hash_size) */ | ||
this.hash_mask = 0; | ||
/* hash_size-1 */ | ||
this.hash_shift = 0; | ||
@@ -1227,9 +1453,20 @@ /* Number of bits by which ins_h must be shifted at each input | ||
this.match_length = 0; /* length of best match */ | ||
this.prev_match = 0; /* previous match */ | ||
this.match_available = 0; /* set if previous match exists */ | ||
this.strstart = 0; /* start of string to insert */ | ||
this.match_start = 0; /* start of matching string */ | ||
this.lookahead = 0; /* number of valid bytes ahead in window */ | ||
this.match_length = 0; | ||
/* length of best match */ | ||
this.prev_match = 0; | ||
/* previous match */ | ||
this.match_available = 0; | ||
/* set if previous match exists */ | ||
this.strstart = 0; | ||
/* start of string to insert */ | ||
this.match_start = 0; | ||
/* start of matching string */ | ||
this.lookahead = 0; | ||
/* number of valid bytes ahead in window */ | ||
this.prev_length = 0; | ||
@@ -1253,2 +1490,3 @@ /* Length of the best match at previous step. Matches not greater than this | ||
//this.max_insert_length = 0; | ||
/* Insert new strings in the hash table only if the match length is not | ||
@@ -1259,9 +1497,13 @@ * greater than this length. This saves time but degrades compression. | ||
this.level = 0; /* compression level (1..9) */ | ||
this.strategy = 0; /* favor or force Huffman coding*/ | ||
this.level = 0; | ||
/* compression level (1..9) */ | ||
this.strategy = 0; | ||
/* favor or force Huffman coding*/ | ||
this.good_match = 0; | ||
/* Use a faster search when the previous match is longer than this */ | ||
this.nice_match = 0; /* Stop searching when current match exceeds this */ | ||
this.nice_match = 0; | ||
/* Stop searching when current match exceeds this */ | ||
@@ -1271,9 +1513,8 @@ /* used by trees.c: */ | ||
/* Didn't use ct_data typedef below to suppress compiler warning */ | ||
// struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ | ||
// struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ | ||
// struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ | ||
// Use flat array of DOUBLE size, with interleaved fata, | ||
// because JS does not support effective | ||
this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); | ||
@@ -1285,17 +1526,26 @@ this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2); | ||
zero(this.bl_tree); | ||
this.l_desc = null; | ||
/* desc. for literal tree */ | ||
this.l_desc = null; /* desc. for literal tree */ | ||
this.d_desc = null; /* desc. for distance tree */ | ||
this.bl_desc = null; /* desc. for bit length tree */ | ||
this.d_desc = null; | ||
/* desc. for distance tree */ | ||
this.bl_desc = null; | ||
/* desc. for bit length tree */ | ||
//ush bl_count[MAX_BITS+1]; | ||
this.bl_count = new utils.Buf16(MAX_BITS + 1); | ||
/* number of codes at each bit length for an optimal tree */ | ||
//int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ | ||
//int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ | ||
this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */ | ||
this.heap = new utils.Buf16(2 * L_CODES + 1); | ||
/* heap used to build the Huffman trees */ | ||
zero(this.heap); | ||
this.heap_len = 0; | ||
/* number of elements in the heap */ | ||
this.heap_len = 0; /* number of elements in the heap */ | ||
this.heap_max = 0; /* element of largest frequency */ | ||
this.heap_max = 0; | ||
/* element of largest frequency */ | ||
/* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. | ||
@@ -1306,2 +1556,3 @@ * The same heap array is used to build all trees. | ||
this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; | ||
zero(this.depth); | ||
@@ -1311,3 +1562,4 @@ /* Depth of each subtree used as tie breaker for trees of equal frequency | ||
this.l_buf = 0; /* buffer index for literals or lengths */ | ||
this.l_buf = 0; | ||
/* buffer index for literals or lengths */ | ||
@@ -1334,3 +1586,4 @@ this.lit_bufsize = 0; | ||
this.last_lit = 0; /* running index in l_buf */ | ||
this.last_lit = 0; | ||
/* running index in l_buf */ | ||
@@ -1343,7 +1596,14 @@ this.d_buf = 0; | ||
this.opt_len = 0; /* bit length of current block with optimal trees */ | ||
this.static_len = 0; /* bit length of current block with static trees */ | ||
this.matches = 0; /* number of string matches in current block */ | ||
this.insert = 0; /* bytes at end of window left to insert */ | ||
this.opt_len = 0; | ||
/* bit length of current block with optimal trees */ | ||
this.static_len = 0; | ||
/* bit length of current block with static trees */ | ||
this.matches = 0; | ||
/* number of string matches in current block */ | ||
this.insert = 0; | ||
/* bytes at end of window left to insert */ | ||
this.bi_buf = 0; | ||
@@ -1353,2 +1613,3 @@ /* Output buffer. bits are inserted starting at the bottom (least | ||
*/ | ||
this.bi_valid = 0; | ||
@@ -1358,6 +1619,6 @@ /* Number of valid bits in bi_buf. All bits above the last valid bit | ||
*/ | ||
// Used for window memory init. We safely ignore it for JS. That makes | ||
// sense only for pointers and memory check tools. | ||
//this.high_water = 0; | ||
/* High water mark offset in window for initialized bytes -- bytes above | ||
@@ -1379,3 +1640,2 @@ * this are set to zero in order to avoid memory check warnings when | ||
strm.data_type = Z_UNKNOWN; | ||
s = strm.state; | ||
@@ -1389,7 +1649,11 @@ s.pending = 0; | ||
} | ||
s.status = s.wrap ? INIT_STATE : BUSY_STATE; | ||
strm.adler = s.wrap === 2 ? 0 // crc32(0, Z_NULL, 0) | ||
: 1; // adler32(0, Z_NULL, 0) | ||
s.last_flush = Z_NO_FLUSH; | ||
trees._tr_init(s); | ||
return Z_OK; | ||
@@ -1400,5 +1664,7 @@ } | ||
var ret = deflateResetKeep(strm); | ||
if (ret === Z_OK) { | ||
lm_init(strm.state); | ||
} | ||
return ret; | ||
@@ -1411,5 +1677,7 @@ } | ||
} | ||
if (strm.state.wrap !== 2) { | ||
return Z_STREAM_ERROR; | ||
} | ||
strm.state.gzhead = head; | ||
@@ -1424,2 +1692,3 @@ return Z_OK; | ||
} | ||
var wrap = 1; | ||
@@ -1436,3 +1705,5 @@ | ||
} else if (windowBits > 15) { | ||
wrap = 2; /* write gzip wrapper instead */ | ||
wrap = 2; | ||
/* write gzip wrapper instead */ | ||
windowBits -= 16; | ||
@@ -1450,7 +1721,6 @@ } | ||
var s = new DeflateState(); | ||
strm.state = s; | ||
s.strm = strm; | ||
s.wrap = wrap; | ||
@@ -1461,3 +1731,2 @@ s.gzhead = null; | ||
s.w_mask = s.w_size - 1; | ||
s.hash_bits = memLevel + 7; | ||
@@ -1467,29 +1736,22 @@ s.hash_size = 1 << s.hash_bits; | ||
s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); | ||
s.window = new utils.Buf8(s.w_size * 2); | ||
s.head = new utils.Buf16(s.hash_size); | ||
s.prev = new utils.Buf16(s.w_size); | ||
// Don't need mem init magic for JS. | ||
s.prev = new utils.Buf16(s.w_size); // Don't need mem init magic for JS. | ||
//s.high_water = 0; /* nothing written to s->window yet */ | ||
s.lit_bufsize = 1 << memLevel + 6; /* 16K elements by default */ | ||
s.lit_bufsize = 1 << memLevel + 6; | ||
/* 16K elements by default */ | ||
s.pending_buf_size = s.lit_bufsize * 4; | ||
//overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); | ||
s.pending_buf_size = s.lit_bufsize * 4; //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); | ||
//s->pending_buf = (uchf *) overlay; | ||
s.pending_buf = new utils.Buf8(s.pending_buf_size); | ||
// It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) | ||
s.pending_buf = new utils.Buf8(s.pending_buf_size); // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) | ||
//s->d_buf = overlay + s->lit_bufsize/sizeof(ush); | ||
s.d_buf = 1 * s.lit_bufsize; | ||
//s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; | ||
s.d_buf = 1 * s.lit_bufsize; //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; | ||
s.l_buf = (1 + 2) * s.lit_bufsize; | ||
s.level = level; | ||
s.strategy = strategy; | ||
s.method = method; | ||
return deflateReset(strm); | ||
@@ -1516,15 +1778,18 @@ } | ||
s.strm = strm; /* just in case */ | ||
s.strm = strm; | ||
/* just in case */ | ||
old_flush = s.last_flush; | ||
s.last_flush = flush; | ||
/* Write the header */ | ||
/* Write the header */ | ||
if (s.status === INIT_STATE) { | ||
if (s.wrap === 2) { | ||
// GZIP header | ||
strm.adler = 0; //crc32(0L, Z_NULL, 0); | ||
put_byte(s, 31); | ||
put_byte(s, 139); | ||
put_byte(s, 8); | ||
if (!s.gzhead) { | ||
@@ -1548,2 +1813,3 @@ // s->gzhead == Z_NULL | ||
put_byte(s, s.gzhead.os & 0xff); | ||
if (s.gzhead.extra && s.gzhead.extra.length) { | ||
@@ -1553,5 +1819,7 @@ put_byte(s, s.gzhead.extra.length & 0xff); | ||
} | ||
if (s.gzhead.hcrc) { | ||
strm.adler = (0, _crc2.default)(strm.adler, s.pending_buf, s.pending, 0); | ||
strm.adler = (0, _crc["default"])(strm.adler, s.pending_buf, s.pending, 0); | ||
} | ||
s.gzindex = 0; | ||
@@ -1574,12 +1842,14 @@ s.status = EXTRA_STATE; | ||
} | ||
header |= level_flags << 6; | ||
if (s.strstart !== 0) { | ||
header |= PRESET_DICT; | ||
} | ||
header += 31 - header % 31; | ||
s.status = BUSY_STATE; | ||
putShortMSB(s, header); | ||
/* Save the adler32 of the preset dictionary: */ | ||
/* Save the adler32 of the preset dictionary: */ | ||
if (s.strstart !== 0) { | ||
@@ -1589,10 +1859,14 @@ putShortMSB(s, strm.adler >>> 16); | ||
} | ||
strm.adler = 1; // adler32(0L, Z_NULL, 0); | ||
} | ||
} | ||
} //#ifdef GZIP | ||
//#ifdef GZIP | ||
if (s.status === EXTRA_STATE) { | ||
if (s.gzhead.extra /* != Z_NULL*/) { | ||
beg = s.pending; /* start of bytes to update crc */ | ||
if (s.gzhead.extra | ||
/* != Z_NULL*/ | ||
) { | ||
beg = s.pending; | ||
/* start of bytes to update crc */ | ||
@@ -1602,6 +1876,8 @@ while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { | ||
if (s.gzhead.hcrc && s.pending > beg) { | ||
strm.adler = (0, _crc2.default)(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
strm.adler = (0, _crc["default"])(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
} | ||
flush_pending(strm); | ||
beg = s.pending; | ||
if (s.pending === s.pending_buf_size) { | ||
@@ -1611,8 +1887,11 @@ break; | ||
} | ||
put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); | ||
s.gzindex++; | ||
} | ||
if (s.gzhead.hcrc && s.pending > beg) { | ||
strm.adler = (0, _crc2.default)(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
strm.adler = (0, _crc["default"])(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
} | ||
if (s.gzindex === s.gzhead.extra.length) { | ||
@@ -1626,5 +1905,9 @@ s.gzindex = 0; | ||
} | ||
if (s.status === NAME_STATE) { | ||
if (s.gzhead.name /* != Z_NULL*/) { | ||
beg = s.pending; /* start of bytes to update crc */ | ||
if (s.gzhead.name | ||
/* != Z_NULL*/ | ||
) { | ||
beg = s.pending; | ||
/* start of bytes to update crc */ | ||
//int val; | ||
@@ -1635,6 +1918,8 @@ | ||
if (s.gzhead.hcrc && s.pending > beg) { | ||
strm.adler = (0, _crc2.default)(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
strm.adler = (0, _crc["default"])(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
} | ||
flush_pending(strm); | ||
beg = s.pending; | ||
if (s.pending === s.pending_buf_size) { | ||
@@ -1644,4 +1929,5 @@ val = 1; | ||
} | ||
} | ||
// JS specific: little magic to add zero terminator to end of string | ||
} // JS specific: little magic to add zero terminator to end of string | ||
if (s.gzindex < s.gzhead.name.length) { | ||
@@ -1652,2 +1938,3 @@ val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; | ||
} | ||
put_byte(s, val); | ||
@@ -1657,4 +1944,5 @@ } while (val !== 0); | ||
if (s.gzhead.hcrc && s.pending > beg) { | ||
strm.adler = (0, _crc2.default)(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
strm.adler = (0, _crc["default"])(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
} | ||
if (val === 0) { | ||
@@ -1668,5 +1956,9 @@ s.gzindex = 0; | ||
} | ||
if (s.status === COMMENT_STATE) { | ||
if (s.gzhead.comment /* != Z_NULL*/) { | ||
beg = s.pending; /* start of bytes to update crc */ | ||
if (s.gzhead.comment | ||
/* != Z_NULL*/ | ||
) { | ||
beg = s.pending; | ||
/* start of bytes to update crc */ | ||
//int val; | ||
@@ -1677,6 +1969,8 @@ | ||
if (s.gzhead.hcrc && s.pending > beg) { | ||
strm.adler = (0, _crc2.default)(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
strm.adler = (0, _crc["default"])(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
} | ||
flush_pending(strm); | ||
beg = s.pending; | ||
if (s.pending === s.pending_buf_size) { | ||
@@ -1686,4 +1980,5 @@ val = 1; | ||
} | ||
} | ||
// JS specific: little magic to add zero terminator to end of string | ||
} // JS specific: little magic to add zero terminator to end of string | ||
if (s.gzindex < s.gzhead.comment.length) { | ||
@@ -1694,2 +1989,3 @@ val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; | ||
} | ||
put_byte(s, val); | ||
@@ -1699,4 +1995,5 @@ } while (val !== 0); | ||
if (s.gzhead.hcrc && s.pending > beg) { | ||
strm.adler = (0, _crc2.default)(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
strm.adler = (0, _crc["default"])(strm.adler, s.pending_buf, s.pending - beg, beg); | ||
} | ||
if (val === 0) { | ||
@@ -1709,2 +2006,3 @@ s.status = HCRC_STATE; | ||
} | ||
if (s.status === HCRC_STATE) { | ||
@@ -1715,2 +2013,3 @@ if (s.gzhead.hcrc) { | ||
} | ||
if (s.pending + 2 <= s.pending_buf_size) { | ||
@@ -1720,2 +2019,3 @@ put_byte(s, strm.adler & 0xff); | ||
strm.adler = 0; //crc32(0L, Z_NULL, 0); | ||
s.status = BUSY_STATE; | ||
@@ -1726,8 +2026,10 @@ } | ||
} | ||
} | ||
//#endif | ||
} //#endif | ||
/* Flush as much pending output as possible */ | ||
if (s.pending !== 0) { | ||
flush_pending(strm); | ||
if (strm.avail_out === 0) { | ||
@@ -1743,3 +2045,2 @@ /* Since avail_out is 0, deflate will be called again with | ||
} | ||
/* Make sure there is something to do and avoid duplicate consecutive | ||
@@ -1749,13 +2050,16 @@ * flushes. For repeated and useless calls with Z_FINISH, we keep | ||
*/ | ||
} else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && flush !== Z_FINISH) { | ||
return err(strm, Z_BUF_ERROR); | ||
} | ||
/* User must not provide more input after the first FINISH: */ | ||
/* User must not provide more input after the first FINISH: */ | ||
if (s.status === FINISH_STATE && strm.avail_in !== 0) { | ||
return err(strm, Z_BUF_ERROR); | ||
} | ||
/* Start a new block or continue the current one. | ||
*/ | ||
if (strm.avail_in !== 0 || s.lookahead !== 0 || flush !== Z_NO_FLUSH && s.status !== FINISH_STATE) { | ||
@@ -1767,2 +2071,3 @@ var bstate = s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s.strategy === Z_RLE ? deflate_rle(s, flush) : configuration_table[s.level].func(s, flush); | ||
} | ||
if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { | ||
@@ -1773,2 +2078,3 @@ if (strm.avail_out === 0) { | ||
} | ||
return Z_OK; | ||
@@ -1783,2 +2089,3 @@ /* If flush != Z_NO_FLUSH && avail_out == 0, the next call | ||
} | ||
if (bstate === BS_BLOCK_DONE) { | ||
@@ -1789,3 +2096,2 @@ if (flush === Z_PARTIAL_FLUSH) { | ||
/* FULL_FLUSH or SYNC_FLUSH */ | ||
trees._tr_stored_block(s, 0, 0, false); | ||
@@ -1795,4 +2101,8 @@ /* For a full flush, this empty block will be recognized | ||
*/ | ||
if (flush === Z_FULL_FLUSH) { | ||
/*** CLEAR_HASH(s); ***/ /* forget history */ | ||
/*** CLEAR_HASH(s); ***/ | ||
/* forget history */ | ||
zero(s.head); // Fill with NIL (= 0); | ||
@@ -1807,20 +2117,26 @@ | ||
} | ||
flush_pending(strm); | ||
if (strm.avail_out === 0) { | ||
s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ | ||
s.last_flush = -1; | ||
/* avoid BUF_ERROR at next call, see above */ | ||
return Z_OK; | ||
} | ||
} | ||
} | ||
//Assert(strm->avail_out > 0, "bug2"); | ||
} //Assert(strm->avail_out > 0, "bug2"); | ||
//if (strm.avail_out <= 0) { throw new Error("bug2");} | ||
if (flush !== Z_FINISH) { | ||
return Z_OK; | ||
} | ||
if (s.wrap <= 0) { | ||
return Z_STREAM_END; | ||
} | ||
/* Write the trailer */ | ||
/* Write the trailer */ | ||
if (s.wrap === 2) { | ||
@@ -1844,2 +2160,3 @@ put_byte(s, strm.adler & 0xff); | ||
*/ | ||
if (s.wrap > 0) { | ||
@@ -1849,2 +2166,4 @@ s.wrap = -s.wrap; | ||
/* write the trailer only once! */ | ||
return s.pending !== 0 ? Z_OK : Z_STREAM_END; | ||
@@ -1856,3 +2175,7 @@ } | ||
if (!strm /*== Z_NULL*/ || !strm.state /*== Z_NULL*/) { | ||
if (!strm | ||
/*== Z_NULL*/ | ||
|| !strm.state | ||
/*== Z_NULL*/ | ||
) { | ||
return Z_STREAM_ERROR; | ||
@@ -1862,2 +2185,3 @@ } | ||
status = strm.state.status; | ||
if (status !== INIT_STATE && status !== EXTRA_STATE && status !== NAME_STATE && status !== COMMENT_STATE && status !== HCRC_STATE && status !== BUSY_STATE && status !== FINISH_STATE) { | ||
@@ -1868,6 +2192,4 @@ return err(strm, Z_STREAM_ERROR); | ||
strm.state = null; | ||
return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; | ||
} | ||
/* ========================================================================= | ||
@@ -1877,5 +2199,6 @@ * Initializes the compression dictionary from the given byte | ||
*/ | ||
function deflateSetDictionary(strm, dictionary) { | ||
var dictLength = dictionary.length; | ||
var s; | ||
@@ -1889,3 +2212,7 @@ var str, n; | ||
if (!strm /*== Z_NULL*/ || !strm.state /*== Z_NULL*/) { | ||
if (!strm | ||
/*== Z_NULL*/ | ||
|| !strm.state | ||
/*== Z_NULL*/ | ||
) { | ||
return Z_STREAM_ERROR; | ||
@@ -1900,17 +2227,22 @@ } | ||
} | ||
/* when using zlib wrappers, compute Adler-32 for provided dictionary */ | ||
/* when using zlib wrappers, compute Adler-32 for provided dictionary */ | ||
if (wrap === 1) { | ||
/* adler32(strm->adler, dictionary, dictLength); */ | ||
strm.adler = (0, _adler2.default)(strm.adler, dictionary, dictLength, 0); | ||
strm.adler = (0, _adler["default"])(strm.adler, dictionary, dictLength, 0); | ||
} | ||
s.wrap = 0; /* avoid computing Adler-32 in read_buf */ | ||
s.wrap = 0; | ||
/* avoid computing Adler-32 in read_buf */ | ||
/* if dictionary would fill window, just replace the history */ | ||
if (dictLength >= s.w_size) { | ||
if (wrap === 0) { | ||
/* already empty otherwise */ | ||
/*** CLEAR_HASH(s); ***/ | ||
zero(s.head); // Fill with NIL (= 0); | ||
s.strstart = 0; | ||
@@ -1922,2 +2254,4 @@ s.block_start = 0; | ||
// dictionary = dictionary.slice(dictLength - s.w_size); | ||
tmpDict = new utils.Buf8(s.w_size); | ||
@@ -1929,2 +2263,4 @@ utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); | ||
/* insert dictionary into window and hash */ | ||
avail = strm.avail_in; | ||
@@ -1937,14 +2273,15 @@ next = strm.next_in; | ||
fill_window(s); | ||
while (s.lookahead >= MIN_MATCH) { | ||
str = s.strstart; | ||
n = s.lookahead - (MIN_MATCH - 1); | ||
do { | ||
/* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ | ||
s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; | ||
s.prev[str & s.w_mask] = s.head[s.ins_h]; | ||
s.head[s.ins_h] = str; | ||
str++; | ||
} while (--n); | ||
s.strstart = str; | ||
@@ -1954,2 +2291,3 @@ s.lookahead = MIN_MATCH - 1; | ||
} | ||
s.strstart += s.lookahead; | ||
@@ -1968,12 +2306,3 @@ s.block_start = s.strstart; | ||
exports.deflateInit = deflateInit; | ||
exports.deflateInit2 = deflateInit2; | ||
exports.deflateReset = deflateReset; | ||
exports.deflateResetKeep = deflateResetKeep; | ||
exports.deflateSetHeader = deflateSetHeader; | ||
exports.deflate = deflate; | ||
exports.deflateEnd = deflateEnd; | ||
exports.deflateSetDictionary = deflateSetDictionary; | ||
var deflateInfo = exports.deflateInfo = 'pako deflate (from Nodeca project)'; | ||
var deflateInfo = 'pako deflate (from Nodeca project)'; | ||
/* Not implemented | ||
@@ -1986,2 +2315,4 @@ exports.deflateBound = deflateBound; | ||
exports.deflateTune = deflateTune; | ||
*/ | ||
*/ | ||
exports.deflateInfo = deflateInfo; |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -6,3 +6,4 @@ Object.defineProperty(exports, "__esModule", { | ||
}); | ||
exports.default = GZheader; | ||
exports["default"] = GZheader; | ||
function GZheader() { | ||
@@ -12,13 +13,17 @@ /* true if compressed data believed to be text */ | ||
/* modification time */ | ||
this.time = 0; | ||
/* extra flags (not used when writing a gzip file) */ | ||
this.xflags = 0; | ||
/* operating system */ | ||
this.os = 0; | ||
/* pointer to extra field or Z_NULL if none */ | ||
this.extra = null; | ||
/* extra field length (valid if extra != Z_NULL) */ | ||
this.extra_len = 0; // Actually, we don't need it in JS, | ||
// but leave for few code modifications | ||
// | ||
@@ -31,14 +36,21 @@ // Setup limits is not necessary because in js we should not preallocate memory | ||
// this.extra_max = 0; | ||
/* pointer to zero-terminated file name or Z_NULL */ | ||
this.name = ''; | ||
/* space at name (only when reading header) */ | ||
// this.name_max = 0; | ||
/* pointer to zero-terminated comment or Z_NULL */ | ||
this.comment = ''; | ||
/* space at comment (only when reading header) */ | ||
// this.comm_max = 0; | ||
/* true if there was or will be a header crc */ | ||
this.hcrc = 0; | ||
/* true when done reading gzip header (not used when writing a gzip file) */ | ||
this.done = false; | ||
} |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -6,7 +6,10 @@ Object.defineProperty(exports, "__esModule", { | ||
}); | ||
exports.default = inflate_fast; | ||
exports["default"] = inflate_fast; | ||
// See state defs from inflate.js | ||
var BAD = 30; /* got a data error -- remain here until reset */ | ||
var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ | ||
var BAD = 30; | ||
/* got a data error -- remain here until reset */ | ||
var TYPE = 12; | ||
/* i: waiting for type bits, including last-flag bit */ | ||
/* | ||
@@ -47,36 +50,83 @@ Decode literal, length, and distance codes and write out the resulting | ||
*/ | ||
function inflate_fast(strm, start) { | ||
var state; | ||
var _in; /* local strm.input */ | ||
var last; /* have enough input while in < last */ | ||
var _out; /* local strm.output */ | ||
var beg; /* inflate()'s initial strm.output */ | ||
var end; /* while out < end, enough space available */ | ||
var _in; | ||
/* local strm.input */ | ||
var last; | ||
/* have enough input while in < last */ | ||
var _out; | ||
/* local strm.output */ | ||
var beg; | ||
/* inflate()'s initial strm.output */ | ||
var end; | ||
/* while out < end, enough space available */ | ||
//#ifdef INFLATE_STRICT | ||
var dmax; /* maximum distance from zlib header */ | ||
var dmax; | ||
/* maximum distance from zlib header */ | ||
//#endif | ||
var wsize; /* window size or zero if not using window */ | ||
var whave; /* valid bytes in the window */ | ||
var wnext; /* window write index */ | ||
var wsize; | ||
/* window size or zero if not using window */ | ||
var whave; | ||
/* valid bytes in the window */ | ||
var wnext; | ||
/* window write index */ | ||
// Use `s_window` instead `window`, avoid conflict with instrumentation tools | ||
var s_window; /* allocated sliding window, if wsize != 0 */ | ||
var hold; /* local strm.hold */ | ||
var bits; /* local strm.bits */ | ||
var lcode; /* local strm.lencode */ | ||
var dcode; /* local strm.distcode */ | ||
var lmask; /* mask for first level of length codes */ | ||
var dmask; /* mask for first level of distance codes */ | ||
var here; /* retrieved table entry */ | ||
var op; /* code bits, operation, extra bits, or */ | ||
var s_window; | ||
/* allocated sliding window, if wsize != 0 */ | ||
var hold; | ||
/* local strm.hold */ | ||
var bits; | ||
/* local strm.bits */ | ||
var lcode; | ||
/* local strm.lencode */ | ||
var dcode; | ||
/* local strm.distcode */ | ||
var lmask; | ||
/* mask for first level of length codes */ | ||
var dmask; | ||
/* mask for first level of distance codes */ | ||
var here; | ||
/* retrieved table entry */ | ||
var op; | ||
/* code bits, operation, extra bits, or */ | ||
/* window position, window bytes to copy */ | ||
var len; /* match length, unused bytes */ | ||
var dist; /* match distance */ | ||
var from; /* where to copy match from */ | ||
var len; | ||
/* match length, unused bytes */ | ||
var dist; | ||
/* match distance */ | ||
var from; | ||
/* where to copy match from */ | ||
var from_source; | ||
var input, output; // JS specific, because we have no pointers | ||
/* copy state to local variables */ | ||
state = strm.state; | ||
//here = state.here; | ||
state = strm.state; //here = state.here; | ||
_in = strm.next_in; | ||
@@ -88,6 +138,6 @@ input = strm.input; | ||
beg = _out - (start - strm.avail_out); | ||
end = _out + (strm.avail_out - 257); | ||
//#ifdef INFLATE_STRICT | ||
dmax = state.dmax; | ||
//#endif | ||
end = _out + (strm.avail_out - 257); //#ifdef INFLATE_STRICT | ||
dmax = state.dmax; //#endif | ||
wsize = state.wsize; | ||
@@ -103,3 +153,2 @@ whave = state.whave; | ||
dmask = (1 << state.distbits) - 1; | ||
/* decode literals and length/distances until end-of-block or not enough | ||
@@ -120,6 +169,11 @@ input data or output space */ | ||
// Goto emulation | ||
op = here >>> 24 /*here.bits*/; | ||
op = here >>> 24 | ||
/*here.bits*/ | ||
; | ||
hold >>>= op; | ||
bits -= op; | ||
op = here >>> 16 & 0xff /*here.op*/; | ||
op = here >>> 16 & 0xff | ||
/*here.op*/ | ||
; | ||
if (op === 0) { | ||
@@ -130,7 +184,13 @@ /* literal */ | ||
// "inflate: literal 0x%02x\n", here.val)); | ||
output[_out++] = here & 0xffff /*here.val*/; | ||
output[_out++] = here & 0xffff | ||
/*here.val*/ | ||
; | ||
} else if (op & 16) { | ||
/* length base */ | ||
len = here & 0xffff /*here.val*/; | ||
op &= 15; /* number of extra bits */ | ||
len = here & 0xffff | ||
/*here.val*/ | ||
; | ||
op &= 15; | ||
/* number of extra bits */ | ||
if (op) { | ||
@@ -141,7 +201,9 @@ if (bits < op) { | ||
} | ||
len += hold & (1 << op) - 1; | ||
hold >>>= op; | ||
bits -= op; | ||
} | ||
//Tracevv((stderr, "inflate: length %u\n", len)); | ||
} //Tracevv((stderr, "inflate: length %u\n", len)); | ||
if (bits < 15) { | ||
@@ -153,2 +215,3 @@ hold += input[_in++] << bits; | ||
} | ||
here = dcode[hold & dmask]; | ||
@@ -158,14 +221,23 @@ | ||
// goto emulation | ||
op = here >>> 24 /*here.bits*/; | ||
op = here >>> 24 | ||
/*here.bits*/ | ||
; | ||
hold >>>= op; | ||
bits -= op; | ||
op = here >>> 16 & 0xff /*here.op*/; | ||
op = here >>> 16 & 0xff | ||
/*here.op*/ | ||
; | ||
if (op & 16) { | ||
/* distance base */ | ||
dist = here & 0xffff /*here.val*/; | ||
op &= 15; /* number of extra bits */ | ||
dist = here & 0xffff | ||
/*here.val*/ | ||
; | ||
op &= 15; | ||
/* number of extra bits */ | ||
if (bits < op) { | ||
hold += input[_in++] << bits; | ||
bits += 8; | ||
if (bits < op) { | ||
@@ -176,4 +248,5 @@ hold += input[_in++] << bits; | ||
} | ||
dist += hold & (1 << op) - 1; | ||
//#ifdef INFLATE_STRICT | ||
dist += hold & (1 << op) - 1; //#ifdef INFLATE_STRICT | ||
if (dist > dmax) { | ||
@@ -183,11 +256,16 @@ strm.msg = 'invalid distance too far back'; | ||
break top; | ||
} | ||
//#endif | ||
} //#endif | ||
hold >>>= op; | ||
bits -= op; | ||
//Tracevv((stderr, "inflate: distance %u\n", dist)); | ||
op = _out - beg; /* max distance in output */ | ||
bits -= op; //Tracevv((stderr, "inflate: distance %u\n", dist)); | ||
op = _out - beg; | ||
/* max distance in output */ | ||
if (dist > op) { | ||
/* see if copy from window */ | ||
op = dist - op; /* distance back in window */ | ||
op = dist - op; | ||
/* distance back in window */ | ||
if (op > whave) { | ||
@@ -198,5 +276,3 @@ if (state.sane) { | ||
break top; | ||
} | ||
// (!) This block is disabled in zlib defailts, | ||
} // (!) This block is disabled in zlib defailts, | ||
// don't enable it for binary compatibility | ||
@@ -222,15 +298,24 @@ //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR | ||
//#endif | ||
} | ||
from = 0; // window index | ||
from_source = s_window; | ||
if (wnext === 0) { | ||
/* very common case */ | ||
from += wsize - op; | ||
if (op < len) { | ||
/* some from window */ | ||
len -= op; | ||
do { | ||
output[_out++] = s_window[from++]; | ||
} while (--op); | ||
from = _out - dist; /* rest from output */ | ||
from = _out - dist; | ||
/* rest from output */ | ||
from_source = output; | ||
@@ -242,9 +327,13 @@ } | ||
op -= wnext; | ||
if (op < len) { | ||
/* some from end of window */ | ||
len -= op; | ||
do { | ||
output[_out++] = s_window[from++]; | ||
} while (--op); | ||
from = 0; | ||
if (wnext < len) { | ||
@@ -254,6 +343,10 @@ /* some from start of window */ | ||
len -= op; | ||
do { | ||
output[_out++] = s_window[from++]; | ||
} while (--op); | ||
from = _out - dist; /* rest from output */ | ||
from = _out - dist; | ||
/* rest from output */ | ||
from_source = output; | ||
@@ -265,12 +358,18 @@ } | ||
from += wnext - op; | ||
if (op < len) { | ||
/* some from window */ | ||
len -= op; | ||
do { | ||
output[_out++] = s_window[from++]; | ||
} while (--op); | ||
from = _out - dist; /* rest from output */ | ||
from = _out - dist; | ||
/* rest from output */ | ||
from_source = output; | ||
} | ||
} | ||
while (len > 2) { | ||
@@ -282,4 +381,6 @@ output[_out++] = from_source[from++]; | ||
} | ||
if (len) { | ||
output[_out++] = from_source[from++]; | ||
if (len > 1) { | ||
@@ -290,3 +391,5 @@ output[_out++] = from_source[from++]; | ||
} else { | ||
from = _out - dist; /* copy direct from output */ | ||
from = _out - dist; | ||
/* copy direct from output */ | ||
do { | ||
@@ -299,4 +402,6 @@ /* minimum length is three */ | ||
} while (len > 2); | ||
if (len) { | ||
output[_out++] = output[from++]; | ||
if (len > 1) { | ||
@@ -309,3 +414,5 @@ output[_out++] = output[from++]; | ||
/* 2nd level distance code */ | ||
here = dcode[(here & 0xffff) + ( /*here.val*/hold & (1 << op) - 1)]; | ||
here = dcode[(here & 0xffff) + ( | ||
/*here.val*/ | ||
hold & (1 << op) - 1)]; | ||
continue dodist; | ||
@@ -322,3 +429,5 @@ } else { | ||
/* 2nd level length code */ | ||
here = lcode[(here & 0xffff) + ( /*here.val*/hold & (1 << op) - 1)]; | ||
here = lcode[(here & 0xffff) + ( | ||
/*here.val*/ | ||
hold & (1 << op) - 1)]; | ||
continue dolen; | ||
@@ -339,4 +448,5 @@ } else if (op & 32) { | ||
} while (_in < last && _out < end); | ||
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */ | ||
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */ | ||
len = bits >> 3; | ||
@@ -346,4 +456,4 @@ _in -= len; | ||
hold &= (1 << bits) - 1; | ||
/* update state and return */ | ||
/* update state and return */ | ||
strm.next_in = _in; | ||
@@ -356,2 +466,4 @@ strm.next_out = _out; | ||
return; | ||
}; | ||
} | ||
; |
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.inflateInfo = exports.inflateSetDictionary = exports.inflateGetHeader = exports.inflateEnd = exports.inflate = exports.inflateInit2 = exports.inflateInit = exports.inflateResetKeep = exports.inflateReset2 = exports.inflateReset = undefined; | ||
exports.inflateReset = inflateReset; | ||
exports.inflateReset2 = inflateReset2; | ||
exports.inflateResetKeep = inflateResetKeep; | ||
exports.inflateInit = inflateInit; | ||
exports.inflateInit2 = inflateInit2; | ||
exports.inflate = inflate; | ||
exports.inflateEnd = inflateEnd; | ||
exports.inflateGetHeader = inflateGetHeader; | ||
exports.inflateSetDictionary = inflateSetDictionary; | ||
exports.inflateInfo = exports.Z_DEFLATED = exports.Z_BUF_ERROR = exports.Z_MEM_ERROR = exports.Z_DATA_ERROR = exports.Z_STREAM_ERROR = exports.Z_NEED_DICT = exports.Z_STREAM_END = exports.Z_OK = exports.Z_TREES = exports.Z_BLOCK = exports.Z_FINISH = void 0; | ||
var _common = require("../utils/common.js"); | ||
var utils = _interopRequireWildcard(require("../utils/common.js")); | ||
var utils = _interopRequireWildcard(_common); | ||
var _adler = _interopRequireDefault(require("./adler32.js")); | ||
var _adler = require("./adler32.js"); | ||
var _crc = _interopRequireDefault(require("./crc32.js")); | ||
var _adler2 = _interopRequireDefault(_adler); | ||
var _inffast = _interopRequireDefault(require("./inffast.js")); | ||
var _crc = require("./crc32.js"); | ||
var _inftrees = _interopRequireDefault(require("./inftrees.js")); | ||
var _crc2 = _interopRequireDefault(_crc); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _inffast = require("./inffast.js"); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
var _inffast2 = _interopRequireDefault(_inffast); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
var _inftrees = require("./inftrees.js"); | ||
var _inftrees2 = _interopRequireDefault(_inftrees); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
var CODES = 0; | ||
var LENS = 1; | ||
var DISTS = 2; | ||
/* Public constants ==========================================================*/ | ||
/* Public constants ==========================================================*/ | ||
/* ===========================================================================*/ | ||
/* Allowed flush values; see deflate() and inflate() below for details */ | ||
//var Z_NO_FLUSH = 0; | ||
//var Z_PARTIAL_FLUSH = 1; | ||
//var Z_SYNC_FLUSH = 2; | ||
//var Z_FULL_FLUSH = 3; | ||
//export const Z_NO_FLUSH = 0; | ||
//export const Z_PARTIAL_FLUSH = 1; | ||
//export const Z_SYNC_FLUSH = 2; | ||
//export const Z_FULL_FLUSH = 3; | ||
var Z_FINISH = 4; | ||
exports.Z_FINISH = Z_FINISH; | ||
var Z_BLOCK = 5; | ||
exports.Z_BLOCK = Z_BLOCK; | ||
var Z_TREES = 6; | ||
/* Return codes for the compression/decompression functions. Negative values | ||
* are errors, positive values are used for special but normal events. | ||
*/ | ||
exports.Z_TREES = Z_TREES; | ||
var Z_OK = 0; | ||
exports.Z_OK = Z_OK; | ||
var Z_STREAM_END = 1; | ||
var Z_NEED_DICT = 2; | ||
//var Z_ERRNO = -1; | ||
exports.Z_STREAM_END = Z_STREAM_END; | ||
var Z_NEED_DICT = 2; //export const Z_ERRNO = -1; | ||
exports.Z_NEED_DICT = Z_NEED_DICT; | ||
var Z_STREAM_ERROR = -2; | ||
exports.Z_STREAM_ERROR = Z_STREAM_ERROR; | ||
var Z_DATA_ERROR = -3; | ||
exports.Z_DATA_ERROR = Z_DATA_ERROR; | ||
var Z_MEM_ERROR = -4; | ||
var Z_BUF_ERROR = -5; | ||
//var Z_VERSION_ERROR = -6; | ||
exports.Z_MEM_ERROR = Z_MEM_ERROR; | ||
var Z_BUF_ERROR = -5; //export const Z_VERSION_ERROR = -6; | ||
/* The deflate compression method */ | ||
exports.Z_BUF_ERROR = Z_BUF_ERROR; | ||
var Z_DEFLATED = 8; | ||
/* STATES ====================================================================*/ | ||
/* STATES ====================================================================*/ | ||
/* ===========================================================================*/ | ||
var HEAD = 1; /* i: waiting for magic header */ | ||
var FLAGS = 2; /* i: waiting for method and flags (gzip) */ | ||
var TIME = 3; /* i: waiting for modification time (gzip) */ | ||
var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ | ||
var EXLEN = 5; /* i: waiting for extra length (gzip) */ | ||
var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ | ||
var NAME = 7; /* i: waiting for end of file name (gzip) */ | ||
var COMMENT = 8; /* i: waiting for end of comment (gzip) */ | ||
var HCRC = 9; /* i: waiting for header crc (gzip) */ | ||
var DICTID = 10; /* i: waiting for dictionary check value */ | ||
var DICT = 11; /* waiting for inflateSetDictionary() call */ | ||
var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ | ||
var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ | ||
var STORED = 14; /* i: waiting for stored size (length and complement) */ | ||
var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ | ||
var COPY = 16; /* i/o: waiting for input or output to copy stored block */ | ||
var TABLE = 17; /* i: waiting for dynamic block table lengths */ | ||
var LENLENS = 18; /* i: waiting for code length code lengths */ | ||
var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ | ||
var LEN_ = 20; /* i: same as LEN below, but only first time in */ | ||
var LEN = 21; /* i: waiting for length/lit/eob code */ | ||
var LENEXT = 22; /* i: waiting for length extra bits */ | ||
var DIST = 23; /* i: waiting for distance code */ | ||
var DISTEXT = 24; /* i: waiting for distance extra bits */ | ||
var MATCH = 25; /* o: waiting for output space to copy string */ | ||
var LIT = 26; /* o: waiting for output space to write literal */ | ||
var CHECK = 27; /* i: waiting for 32-bit check value */ | ||
var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ | ||
var DONE = 29; /* finished check, done -- remain here until reset */ | ||
var BAD = 30; /* got a data error -- remain here until reset */ | ||
var MEM = 31; /* got an inflate() memory error -- remain here until reset */ | ||
var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ | ||
exports.Z_DEFLATED = Z_DEFLATED; | ||
var HEAD = 1; | ||
/* i: waiting for magic header */ | ||
var FLAGS = 2; | ||
/* i: waiting for method and flags (gzip) */ | ||
var TIME = 3; | ||
/* i: waiting for modification time (gzip) */ | ||
var OS = 4; | ||
/* i: waiting for extra flags and operating system (gzip) */ | ||
var EXLEN = 5; | ||
/* i: waiting for extra length (gzip) */ | ||
var EXTRA = 6; | ||
/* i: waiting for extra bytes (gzip) */ | ||
var NAME = 7; | ||
/* i: waiting for end of file name (gzip) */ | ||
var COMMENT = 8; | ||
/* i: waiting for end of comment (gzip) */ | ||
var HCRC = 9; | ||
/* i: waiting for header crc (gzip) */ | ||
var DICTID = 10; | ||
/* i: waiting for dictionary check value */ | ||
var DICT = 11; | ||
/* waiting for inflateSetDictionary() call */ | ||
var TYPE = 12; | ||
/* i: waiting for type bits, including last-flag bit */ | ||
var TYPEDO = 13; | ||
/* i: same, but skip check to exit inflate on new block */ | ||
var STORED = 14; | ||
/* i: waiting for stored size (length and complement) */ | ||
var COPY_ = 15; | ||
/* i/o: same as COPY below, but only first time in */ | ||
var COPY = 16; | ||
/* i/o: waiting for input or output to copy stored block */ | ||
var TABLE = 17; | ||
/* i: waiting for dynamic block table lengths */ | ||
var LENLENS = 18; | ||
/* i: waiting for code length code lengths */ | ||
var CODELENS = 19; | ||
/* i: waiting for length/lit and distance code lengths */ | ||
var LEN_ = 20; | ||
/* i: same as LEN below, but only first time in */ | ||
var LEN = 21; | ||
/* i: waiting for length/lit/eob code */ | ||
var LENEXT = 22; | ||
/* i: waiting for length extra bits */ | ||
var DIST = 23; | ||
/* i: waiting for distance code */ | ||
var DISTEXT = 24; | ||
/* i: waiting for distance extra bits */ | ||
var MATCH = 25; | ||
/* o: waiting for output space to copy string */ | ||
var LIT = 26; | ||
/* o: waiting for output space to write literal */ | ||
var CHECK = 27; | ||
/* i: waiting for 32-bit check value */ | ||
var LENGTH = 28; | ||
/* i: waiting for 32-bit length (gzip) */ | ||
var DONE = 29; | ||
/* finished check, done -- remain here until reset */ | ||
var BAD = 30; | ||
/* got a data error -- remain here until reset */ | ||
var MEM = 31; | ||
/* got an inflate() memory error -- remain here until reset */ | ||
var SYNC = 32; | ||
/* looking for synchronization bytes to restart inflate() */ | ||
/* ===========================================================================*/ | ||
var ENOUGH_LENS = 852; | ||
var ENOUGH_DISTS = 592; | ||
//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); | ||
var ENOUGH_DISTS = 592; //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); | ||
var MAX_WBITS = 15; | ||
/* 32K LZ77 window */ | ||
var DEF_WBITS = MAX_WBITS; | ||
@@ -115,47 +193,105 @@ | ||
function InflateState() { | ||
this.mode = 0; /* current inflate mode */ | ||
this.last = false; /* true if processing last block */ | ||
this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ | ||
this.havedict = false; /* true if dictionary provided */ | ||
this.flags = 0; /* gzip header method and flags (0 if zlib) */ | ||
this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ | ||
this.check = 0; /* protected copy of check value */ | ||
this.total = 0; /* protected copy of output count */ | ||
this.mode = 0; | ||
/* current inflate mode */ | ||
this.last = false; | ||
/* true if processing last block */ | ||
this.wrap = 0; | ||
/* bit 0 true for zlib, bit 1 true for gzip */ | ||
this.havedict = false; | ||
/* true if dictionary provided */ | ||
this.flags = 0; | ||
/* gzip header method and flags (0 if zlib) */ | ||
this.dmax = 0; | ||
/* zlib header max distance (INFLATE_STRICT) */ | ||
this.check = 0; | ||
/* protected copy of check value */ | ||
this.total = 0; | ||
/* protected copy of output count */ | ||
// TODO: may be {} | ||
this.head = null; /* where to save gzip header information */ | ||
this.head = null; | ||
/* where to save gzip header information */ | ||
/* sliding window */ | ||
this.wbits = 0; /* log base 2 of requested window size */ | ||
this.wsize = 0; /* window size or zero if not using window */ | ||
this.whave = 0; /* valid bytes in the window */ | ||
this.wnext = 0; /* window write index */ | ||
this.window = null; /* allocated sliding window, if needed */ | ||
this.wbits = 0; | ||
/* log base 2 of requested window size */ | ||
this.wsize = 0; | ||
/* window size or zero if not using window */ | ||
this.whave = 0; | ||
/* valid bytes in the window */ | ||
this.wnext = 0; | ||
/* window write index */ | ||
this.window = null; | ||
/* allocated sliding window, if needed */ | ||
/* bit accumulator */ | ||
this.hold = 0; /* input bit accumulator */ | ||
this.bits = 0; /* number of bits in "in" */ | ||
this.hold = 0; | ||
/* input bit accumulator */ | ||
this.bits = 0; | ||
/* number of bits in "in" */ | ||
/* for string and stored block copying */ | ||
this.length = 0; /* literal or length of data to copy */ | ||
this.offset = 0; /* distance back to copy string from */ | ||
this.length = 0; | ||
/* literal or length of data to copy */ | ||
this.offset = 0; | ||
/* distance back to copy string from */ | ||
/* for table and code decoding */ | ||
this.extra = 0; /* extra bits needed */ | ||
this.extra = 0; | ||
/* extra bits needed */ | ||
/* fixed and dynamic code tables */ | ||
this.lencode = null; /* starting table for length/literal codes */ | ||
this.distcode = null; /* starting table for distance codes */ | ||
this.lenbits = 0; /* index bits for lencode */ | ||
this.distbits = 0; /* index bits for distcode */ | ||
this.lencode = null; | ||
/* starting table for length/literal codes */ | ||
this.distcode = null; | ||
/* starting table for distance codes */ | ||
this.lenbits = 0; | ||
/* index bits for lencode */ | ||
this.distbits = 0; | ||
/* index bits for distcode */ | ||
/* dynamic table building */ | ||
this.ncode = 0; /* number of code length code lengths */ | ||
this.nlen = 0; /* number of length code lengths */ | ||
this.ndist = 0; /* number of distance code lengths */ | ||
this.have = 0; /* number of code lengths in lens[] */ | ||
this.next = null; /* next available space in codes[] */ | ||
this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ | ||
this.work = new utils.Buf16(288); /* work area for code table building */ | ||
this.ncode = 0; | ||
/* number of code length code lengths */ | ||
this.nlen = 0; | ||
/* number of length code lengths */ | ||
this.ndist = 0; | ||
/* number of distance code lengths */ | ||
this.have = 0; | ||
/* number of code lengths in lens[] */ | ||
this.next = null; | ||
/* next available space in codes[] */ | ||
this.lens = new utils.Buf16(320); | ||
/* temporary storage for code lengths */ | ||
this.work = new utils.Buf16(288); | ||
/* work area for code table building */ | ||
/* | ||
@@ -166,7 +302,17 @@ because we don't have pointers in js, we use lencode and distcode directly | ||
//this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ | ||
this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ | ||
this.distdyn = null; /* dynamic table for distance codes (JS specific) */ | ||
this.sane = 0; /* if false, allow invalid distance too far */ | ||
this.back = 0; /* bits back of last unprocessed length/lit */ | ||
this.was = 0; /* initial length of match */ | ||
this.lendyn = null; | ||
/* dynamic table for length/literal codes (JS specific) */ | ||
this.distdyn = null; | ||
/* dynamic table for distance codes (JS specific) */ | ||
this.sane = 0; | ||
/* if false, allow invalid distance too far */ | ||
this.back = 0; | ||
/* bits back of last unprocessed length/lit */ | ||
this.was = 0; | ||
/* initial length of match */ | ||
} | ||
@@ -180,5 +326,8 @@ | ||
} | ||
state = strm.state; | ||
strm.total_in = strm.total_out = state.total = 0; | ||
strm.msg = ''; /*Z_NULL*/ | ||
strm.msg = ''; | ||
/*Z_NULL*/ | ||
if (state.wrap) { | ||
@@ -188,2 +337,3 @@ /* to support ill-conceived Java test suite */ | ||
} | ||
state.mode = HEAD; | ||
@@ -193,12 +343,13 @@ state.last = 0; | ||
state.dmax = 32768; | ||
state.head = null /*Z_NULL*/; | ||
state.head = null | ||
/*Z_NULL*/ | ||
; | ||
state.hold = 0; | ||
state.bits = 0; | ||
//state.lencode = state.distcode = state.next = state.codes; | ||
state.bits = 0; //state.lencode = state.distcode = state.next = state.codes; | ||
state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); | ||
state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); | ||
state.sane = 1; | ||
state.back = -1; //Tracev((stderr, "inflate: reset\n")); | ||
state.sane = 1; | ||
state.back = -1; | ||
//Tracev((stderr, "inflate: reset\n")); | ||
return Z_OK; | ||
@@ -213,2 +364,3 @@ } | ||
} | ||
state = strm.state; | ||
@@ -224,10 +376,11 @@ state.wsize = 0; | ||
var state; | ||
/* get the state */ | ||
/* get the state */ | ||
if (!strm || !strm.state) { | ||
return Z_STREAM_ERROR; | ||
} | ||
state = strm.state; | ||
/* extract wrap request from windowBits parameter */ | ||
/* extract wrap request from windowBits parameter */ | ||
if (windowBits < 0) { | ||
@@ -238,2 +391,3 @@ wrap = 0; | ||
wrap = (windowBits >> 4) + 1; | ||
if (windowBits < 48) { | ||
@@ -243,12 +397,15 @@ windowBits &= 15; | ||
} | ||
/* set number of window bits, free window if different */ | ||
/* set number of window bits, free window if different */ | ||
if (windowBits && (windowBits < 8 || windowBits > 15)) { | ||
return Z_STREAM_ERROR; | ||
} | ||
if (state.window !== null && state.wbits !== windowBits) { | ||
state.window = null; | ||
} | ||
/* update state and reset the rest of it */ | ||
/* update state and reset the rest of it */ | ||
state.wrap = wrap; | ||
@@ -265,15 +422,20 @@ state.wbits = windowBits; | ||
return Z_STREAM_ERROR; | ||
} | ||
//strm.msg = Z_NULL; /* in case we return an error */ | ||
} //strm.msg = Z_NULL; /* in case we return an error */ | ||
state = new InflateState(); | ||
//if (state === Z_NULL) return Z_MEM_ERROR; | ||
state = new InflateState(); //if (state === Z_NULL) return Z_MEM_ERROR; | ||
//Tracev((stderr, "inflate: allocated\n")); | ||
strm.state = state; | ||
state.window = null /*Z_NULL*/; | ||
state.window = null | ||
/*Z_NULL*/ | ||
; | ||
ret = inflateReset2(strm, windowBits); | ||
if (ret !== Z_OK) { | ||
strm.state = null /*Z_NULL*/; | ||
strm.state = null | ||
/*Z_NULL*/ | ||
; | ||
} | ||
return ret; | ||
@@ -285,3 +447,2 @@ } | ||
} | ||
/* | ||
@@ -297,4 +458,5 @@ Return state with length and distance decoding tables and index sizes set to | ||
*/ | ||
var virgin = true; | ||
var lenfix, distfix; // We have no pointers in JS, so keep tables separate | ||
@@ -306,17 +468,20 @@ | ||
var sym; | ||
lenfix = new utils.Buf32(512); | ||
distfix = new utils.Buf32(32); | ||
/* literal/length table */ | ||
/* literal/length table */ | ||
sym = 0; | ||
while (sym < 144) { | ||
state.lens[sym++] = 8; | ||
} | ||
while (sym < 256) { | ||
state.lens[sym++] = 9; | ||
} | ||
while (sym < 280) { | ||
state.lens[sym++] = 7; | ||
} | ||
while (sym < 288) { | ||
@@ -326,6 +491,9 @@ state.lens[sym++] = 8; | ||
(0, _inftrees2.default)(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); | ||
(0, _inftrees["default"])(LENS, state.lens, 0, 288, lenfix, 0, state.work, { | ||
bits: 9 | ||
}); | ||
/* distance table */ | ||
/* distance table */ | ||
sym = 0; | ||
while (sym < 32) { | ||
@@ -335,5 +503,7 @@ state.lens[sym++] = 5; | ||
(0, _inftrees2.default)(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); | ||
(0, _inftrees["default"])(DISTS, state.lens, 0, 32, distfix, 0, state.work, { | ||
bits: 5 | ||
}); | ||
/* do this just once */ | ||
/* do this just once */ | ||
virgin = false; | ||
@@ -347,3 +517,2 @@ } | ||
} | ||
/* | ||
@@ -363,7 +532,9 @@ Update the window with the last wsize (normally 32K) bytes written before | ||
*/ | ||
function updatewindow(strm, src, end, copy) { | ||
var dist; | ||
var state = strm.state; | ||
/* if it hasn't been done already, allocate space for the window */ | ||
/* if it hasn't been done already, allocate space for the window */ | ||
if (state.window === null) { | ||
@@ -373,7 +544,7 @@ state.wsize = 1 << state.wbits; | ||
state.whave = 0; | ||
state.window = new utils.Buf8(state.wsize); | ||
} | ||
/* copy state->wsize or less output bytes into the circular window */ | ||
/* copy state->wsize or less output bytes into the circular window */ | ||
if (copy >= state.wsize) { | ||
@@ -385,8 +556,11 @@ utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); | ||
dist = state.wsize - state.wnext; | ||
if (dist > copy) { | ||
dist = copy; | ||
} | ||
//zmemcpy(state->window + state->wnext, end - copy, dist); | ||
} //zmemcpy(state->window + state->wnext, end - copy, dist); | ||
utils.arraySet(state.window, src, end - copy, dist, state.wnext); | ||
copy -= dist; | ||
if (copy) { | ||
@@ -399,5 +573,7 @@ //zmemcpy(state->window, end - copy, copy); | ||
state.wnext += dist; | ||
if (state.wnext === state.wsize) { | ||
state.wnext = 0; | ||
} | ||
if (state.whave < state.wsize) { | ||
@@ -408,2 +584,3 @@ state.whave += dist; | ||
} | ||
return 0; | ||
@@ -415,23 +592,51 @@ } | ||
var input, output; // input/output buffers | ||
var next; /* next input INDEX */ | ||
var put; /* next output INDEX */ | ||
var have, left; /* available input and output */ | ||
var hold; /* bit buffer */ | ||
var bits; /* bits in bit buffer */ | ||
var _in, _out; /* save starting available input and output */ | ||
var copy; /* number of stored or match bytes to copy */ | ||
var from; /* where to copy match bytes from */ | ||
var next; | ||
/* next input INDEX */ | ||
var put; | ||
/* next output INDEX */ | ||
var have, left; | ||
/* available input and output */ | ||
var hold; | ||
/* bit buffer */ | ||
var bits; | ||
/* bits in bit buffer */ | ||
var _in, _out; | ||
/* save starting available input and output */ | ||
var copy; | ||
/* number of stored or match bytes to copy */ | ||
var from; | ||
/* where to copy match bytes from */ | ||
var from_source; | ||
var here = 0; /* current decoding table entry */ | ||
var here = 0; | ||
/* current decoding table entry */ | ||
var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) | ||
//var last; /* parent table entry */ | ||
var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) | ||
var len; /* length to copy for repeats, bits to drop */ | ||
var ret; /* return code */ | ||
var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ | ||
var len; | ||
/* length to copy for repeats, bits to drop */ | ||
var ret; | ||
/* return code */ | ||
var hbuf = new utils.Buf8(4); | ||
/* buffer for gzip header crc calculation */ | ||
var opts; | ||
var n; // temporary var for NEED_BITS | ||
var order = /* permutation of code lengths */ | ||
var order = | ||
/* permutation of code lengths */ | ||
[16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; | ||
@@ -444,7 +649,10 @@ | ||
state = strm.state; | ||
if (state.mode === TYPE) { | ||
state.mode = TYPEDO; | ||
} /* skip check */ | ||
} | ||
/* skip check */ | ||
//--- LOAD() --- | ||
//--- LOAD() --- | ||
put = strm.next_out; | ||
@@ -457,4 +665,3 @@ output = strm.output; | ||
hold = state.hold; | ||
bits = state.bits; | ||
//--- | ||
bits = state.bits; //--- | ||
@@ -472,4 +679,5 @@ _in = have; | ||
break; | ||
} | ||
//=== NEEDBITS(16); | ||
} //=== NEEDBITS(16); | ||
while (bits < 16) { | ||
@@ -479,29 +687,39 @@ if (have === 0) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
if (state.wrap & 2 && hold === 0x8b1f) { | ||
/* gzip header */ | ||
state.check = 0 /*crc32(0L, Z_NULL, 0)*/; | ||
//=== CRC2(state.check, hold); | ||
state.check = 0 | ||
/*crc32(0L, Z_NULL, 0)*/ | ||
; //=== CRC2(state.check, hold); | ||
hbuf[0] = hold & 0xff; | ||
hbuf[1] = hold >>> 8 & 0xff; | ||
state.check = (0, _crc2.default)(state.check, hbuf, 2, 0); | ||
//===// | ||
state.check = (0, _crc["default"])(state.check, hbuf, 2, 0); //===// | ||
//=== INITBITS(); | ||
//=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
state.mode = FLAGS; | ||
break; | ||
} | ||
state.flags = 0; /* expect zlib header */ | ||
state.flags = 0; | ||
/* expect zlib header */ | ||
if (state.head) { | ||
state.head.done = false; | ||
} | ||
if (!(state.wrap & 1) || /* check if zlib header allowed */ | ||
(((hold & 0xff) << /*BITS(8)*/8) + (hold >> 8)) % 31) { | ||
if (!(state.wrap & 1) || | ||
/* check if zlib header allowed */ | ||
(((hold & 0xff) << | ||
/*BITS(8)*/ | ||
8) + (hold >> 8)) % 31) { | ||
strm.msg = 'incorrect header check'; | ||
@@ -511,12 +729,19 @@ state.mode = BAD; | ||
} | ||
if ((hold & 0x0f) !== /*BITS(4)*/Z_DEFLATED) { | ||
if ((hold & 0x0f) !== | ||
/*BITS(4)*/ | ||
Z_DEFLATED) { | ||
strm.msg = 'unknown compression method'; | ||
state.mode = BAD; | ||
break; | ||
} | ||
//--- DROPBITS(4) ---// | ||
} //--- DROPBITS(4) ---// | ||
hold >>>= 4; | ||
bits -= 4; | ||
//---// | ||
len = (hold & 0x0f) + /*BITS(4)*/8; | ||
bits -= 4; //---// | ||
len = (hold & 0x0f) + | ||
/*BITS(4)*/ | ||
8; | ||
if (state.wbits === 0) { | ||
@@ -529,11 +754,15 @@ state.wbits = len; | ||
} | ||
state.dmax = 1 << len; | ||
//Tracev((stderr, "inflate: zlib header ok\n")); | ||
strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; | ||
state.mode = hold & 0x200 ? DICTID : TYPE; | ||
//=== INITBITS(); | ||
state.dmax = 1 << len; //Tracev((stderr, "inflate: zlib header ok\n")); | ||
strm.adler = state.check = 1 | ||
/*adler32(0L, Z_NULL, 0)*/ | ||
; | ||
state.mode = hold & 0x200 ? DICTID : TYPE; //=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
break; | ||
case FLAGS: | ||
@@ -545,8 +774,11 @@ //=== NEEDBITS(16); */ | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
state.flags = hold; | ||
if ((state.flags & 0xff) !== Z_DEFLATED) { | ||
@@ -557,2 +789,3 @@ strm.msg = 'unknown compression method'; | ||
} | ||
if (state.flags & 0xe000) { | ||
@@ -563,5 +796,7 @@ strm.msg = 'unknown header flags set'; | ||
} | ||
if (state.head) { | ||
state.head.text = hold >> 8 & 1; | ||
} | ||
if (state.flags & 0x0200) { | ||
@@ -571,11 +806,13 @@ //=== CRC2(state.check, hold); | ||
hbuf[1] = hold >>> 8 & 0xff; | ||
state.check = (0, _crc2.default)(state.check, hbuf, 2, 0); | ||
//===// | ||
} | ||
//=== INITBITS(); | ||
state.check = (0, _crc["default"])(state.check, hbuf, 2, 0); //===// | ||
} //=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
state.mode = TIME; | ||
/* falls through */ | ||
case TIME: | ||
@@ -587,10 +824,13 @@ //=== NEEDBITS(32); */ | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
if (state.head) { | ||
state.head.time = hold; | ||
} | ||
if (state.flags & 0x0200) { | ||
@@ -602,11 +842,13 @@ //=== CRC4(state.check, hold) | ||
hbuf[3] = hold >>> 24 & 0xff; | ||
state.check = (0, _crc2.default)(state.check, hbuf, 4, 0); | ||
//=== | ||
} | ||
//=== INITBITS(); | ||
state.check = (0, _crc["default"])(state.check, hbuf, 4, 0); //=== | ||
} //=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
state.mode = OS; | ||
/* falls through */ | ||
case OS: | ||
@@ -618,7 +860,9 @@ //=== NEEDBITS(16); */ | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
if (state.head) { | ||
@@ -628,2 +872,3 @@ state.head.xflags = hold & 0xff; | ||
} | ||
if (state.flags & 0x0200) { | ||
@@ -633,11 +878,13 @@ //=== CRC2(state.check, hold); | ||
hbuf[1] = hold >>> 8 & 0xff; | ||
state.check = (0, _crc2.default)(state.check, hbuf, 2, 0); | ||
//===// | ||
} | ||
//=== INITBITS(); | ||
state.check = (0, _crc["default"])(state.check, hbuf, 2, 0); //===// | ||
} //=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
state.mode = EXLEN; | ||
/* falls through */ | ||
case EXLEN: | ||
@@ -650,11 +897,15 @@ if (state.flags & 0x0400) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
state.length = hold; | ||
if (state.head) { | ||
state.head.extra_len = hold; | ||
} | ||
if (state.flags & 0x0200) { | ||
@@ -664,23 +915,30 @@ //=== CRC2(state.check, hold); | ||
hbuf[1] = hold >>> 8 & 0xff; | ||
state.check = (0, _crc2.default)(state.check, hbuf, 2, 0); | ||
//===// | ||
} | ||
//=== INITBITS(); | ||
state.check = (0, _crc["default"])(state.check, hbuf, 2, 0); //===// | ||
} //=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
} else if (state.head) { | ||
state.head.extra = null /*Z_NULL*/; | ||
state.head.extra = null | ||
/*Z_NULL*/ | ||
; | ||
} | ||
state.mode = EXTRA; | ||
/* falls through */ | ||
case EXTRA: | ||
if (state.flags & 0x0400) { | ||
copy = state.length; | ||
if (copy > have) { | ||
copy = have; | ||
} | ||
if (copy) { | ||
if (state.head) { | ||
len = state.head.extra_len - state.length; | ||
if (!state.head.extra) { | ||
@@ -690,15 +948,16 @@ // Use untyped array for more conveniend processing later | ||
} | ||
utils.arraySet(state.head.extra, input, next, | ||
// extra field is limited to 65536 bytes | ||
utils.arraySet(state.head.extra, input, next, // extra field is limited to 65536 bytes | ||
// - no need for additional size check | ||
copy, | ||
/*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ | ||
len); | ||
//zmemcpy(state.head.extra + len, next, | ||
len); //zmemcpy(state.head.extra + len, next, | ||
// len + copy > state.head.extra_max ? | ||
// state.head.extra_max - len : copy); | ||
} | ||
if (state.flags & 0x0200) { | ||
state.check = (0, _crc2.default)(state.check, input, copy, next); | ||
state.check = (0, _crc["default"])(state.check, input, copy, next); | ||
} | ||
have -= copy; | ||
@@ -708,2 +967,3 @@ next += copy; | ||
} | ||
if (state.length) { | ||
@@ -713,5 +973,8 @@ break inf_leave; | ||
} | ||
state.length = 0; | ||
state.mode = NAME; | ||
/* falls through */ | ||
case NAME: | ||
@@ -722,3 +985,5 @@ if (state.flags & 0x0800) { | ||
} | ||
copy = 0; | ||
do { | ||
@@ -728,3 +993,6 @@ // TODO: 2 or 1 bytes? | ||
/* use constant limit because in js we should not preallocate memory */ | ||
if (state.head && len && state.length < 65536 /*state.head.name_max*/) { | ||
if (state.head && len && state.length < 65536 | ||
/*state.head.name_max*/ | ||
) { | ||
state.head.name += String.fromCharCode(len); | ||
@@ -735,6 +1003,8 @@ } | ||
if (state.flags & 0x0200) { | ||
state.check = (0, _crc2.default)(state.check, input, copy, next); | ||
state.check = (0, _crc["default"])(state.check, input, copy, next); | ||
} | ||
have -= copy; | ||
next += copy; | ||
if (len) { | ||
@@ -746,5 +1016,8 @@ break inf_leave; | ||
} | ||
state.length = 0; | ||
state.mode = COMMENT; | ||
/* falls through */ | ||
case COMMENT: | ||
@@ -755,15 +1028,23 @@ if (state.flags & 0x1000) { | ||
} | ||
copy = 0; | ||
do { | ||
len = input[next + copy++]; | ||
/* use constant limit because in js we should not preallocate memory */ | ||
if (state.head && len && state.length < 65536 /*state.head.comm_max*/) { | ||
if (state.head && len && state.length < 65536 | ||
/*state.head.comm_max*/ | ||
) { | ||
state.head.comment += String.fromCharCode(len); | ||
} | ||
} while (len && copy < have); | ||
if (state.flags & 0x0200) { | ||
state.check = (0, _crc2.default)(state.check, input, copy, next); | ||
state.check = (0, _crc["default"])(state.check, input, copy, next); | ||
} | ||
have -= copy; | ||
next += copy; | ||
if (len) { | ||
@@ -775,4 +1056,7 @@ break inf_leave; | ||
} | ||
state.mode = HCRC; | ||
/* falls through */ | ||
case HCRC: | ||
@@ -785,7 +1069,9 @@ if (state.flags & 0x0200) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
if (hold !== (state.check & 0xffff)) { | ||
@@ -795,8 +1081,9 @@ strm.msg = 'header crc mismatch'; | ||
break; | ||
} | ||
//=== INITBITS(); | ||
} //=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
} | ||
if (state.head) { | ||
@@ -806,5 +1093,7 @@ state.head.hcrc = state.flags >> 9 & 1; | ||
} | ||
strm.adler = state.check = 0; | ||
state.mode = TYPE; | ||
break; | ||
case DICTID: | ||
@@ -816,14 +1105,18 @@ //=== NEEDBITS(32); */ | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
strm.adler = state.check = zswap32(hold); | ||
//=== INITBITS(); | ||
} //===// | ||
strm.adler = state.check = zswap32(hold); //=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
state.mode = DICT; | ||
/* falls through */ | ||
case DICT: | ||
@@ -837,9 +1130,14 @@ if (state.havedict === 0) { | ||
state.hold = hold; | ||
state.bits = bits; | ||
//--- | ||
state.bits = bits; //--- | ||
return Z_NEED_DICT; | ||
} | ||
strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; | ||
strm.adler = state.check = 1 | ||
/*adler32(0L, Z_NULL, 0)*/ | ||
; | ||
state.mode = TYPE; | ||
/* falls through */ | ||
case TYPE: | ||
@@ -849,3 +1147,5 @@ if (flush === Z_BLOCK || flush === Z_TREES) { | ||
} | ||
/* falls through */ | ||
case TYPEDO: | ||
@@ -855,8 +1155,9 @@ if (state.last) { | ||
hold >>>= bits & 7; | ||
bits -= bits & 7; | ||
//---// | ||
bits -= bits & 7; //---// | ||
state.mode = CHECK; | ||
break; | ||
} | ||
//=== NEEDBITS(3); */ | ||
} //=== NEEDBITS(3); */ | ||
while (bits < 3) { | ||
@@ -866,14 +1167,19 @@ if (have === 0) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
state.last = hold & 0x01 /*BITS(1)*/; | ||
//--- DROPBITS(1) ---// | ||
} //===// | ||
state.last = hold & 0x01 | ||
/*BITS(1)*/ | ||
; //--- DROPBITS(1) ---// | ||
hold >>>= 1; | ||
bits -= 1; | ||
//---// | ||
bits -= 1; //---// | ||
switch (hold & 0x03) {/*BITS(2)*/case 0: | ||
switch (hold & 0x03) { | ||
/*BITS(2)*/ | ||
case 0: | ||
/* stored block */ | ||
@@ -884,16 +1190,21 @@ //Tracev((stderr, "inflate: stored block%s\n", | ||
break; | ||
case 1: | ||
/* fixed block */ | ||
fixedtables(state); | ||
//Tracev((stderr, "inflate: fixed codes block%s\n", | ||
fixedtables(state); //Tracev((stderr, "inflate: fixed codes block%s\n", | ||
// state.last ? " (last)" : "")); | ||
state.mode = LEN_; /* decode codes */ | ||
state.mode = LEN_; | ||
/* decode codes */ | ||
if (flush === Z_TREES) { | ||
//--- DROPBITS(2) ---// | ||
hold >>>= 2; | ||
bits -= 2; | ||
//---// | ||
bits -= 2; //---// | ||
break inf_leave; | ||
} | ||
break; | ||
case 2: | ||
@@ -905,17 +1216,20 @@ /* dynamic block */ | ||
break; | ||
case 3: | ||
strm.msg = 'invalid block type'; | ||
state.mode = BAD; | ||
} | ||
//--- DROPBITS(2) ---// | ||
} //--- DROPBITS(2) ---// | ||
hold >>>= 2; | ||
bits -= 2; | ||
//---// | ||
bits -= 2; //---// | ||
break; | ||
case STORED: | ||
//--- BYTEBITS() ---// /* go to byte boundary */ | ||
hold >>>= bits & 7; | ||
bits -= bits & 7; | ||
//---// | ||
bits -= bits & 7; //---// | ||
//=== NEEDBITS(32); */ | ||
while (bits < 32) { | ||
@@ -925,7 +1239,9 @@ if (have === 0) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
if ((hold & 0xffff) !== (hold >>> 16 ^ 0xffff)) { | ||
@@ -936,19 +1252,26 @@ strm.msg = 'invalid stored block lengths'; | ||
} | ||
state.length = hold & 0xffff; | ||
//Tracev((stderr, "inflate: stored length %u\n", | ||
state.length = hold & 0xffff; //Tracev((stderr, "inflate: stored length %u\n", | ||
// state.length)); | ||
//=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
state.mode = COPY_; | ||
if (flush === Z_TREES) { | ||
break inf_leave; | ||
} | ||
/* falls through */ | ||
case COPY_: | ||
state.mode = COPY; | ||
/* falls through */ | ||
case COPY: | ||
copy = state.length; | ||
if (copy) { | ||
@@ -958,11 +1281,14 @@ if (copy > have) { | ||
} | ||
if (copy > left) { | ||
copy = left; | ||
} | ||
if (copy === 0) { | ||
break inf_leave; | ||
} | ||
//--- zmemcpy(put, next, copy); --- | ||
utils.arraySet(output, input, next, copy, put); | ||
//---// | ||
} //--- zmemcpy(put, next, copy); --- | ||
utils.arraySet(output, input, next, copy, put); //---// | ||
have -= copy; | ||
@@ -974,6 +1300,8 @@ next += copy; | ||
break; | ||
} | ||
//Tracev((stderr, "inflate: stored end\n")); | ||
} //Tracev((stderr, "inflate: stored end\n")); | ||
state.mode = TYPE; | ||
break; | ||
case TABLE: | ||
@@ -985,23 +1313,31 @@ //=== NEEDBITS(14); */ | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
state.nlen = (hold & 0x1f) + /*BITS(5)*/257; | ||
//--- DROPBITS(5) ---// | ||
} //===// | ||
state.nlen = (hold & 0x1f) + | ||
/*BITS(5)*/ | ||
257; //--- DROPBITS(5) ---// | ||
hold >>>= 5; | ||
bits -= 5; | ||
//---// | ||
state.ndist = (hold & 0x1f) + /*BITS(5)*/1; | ||
//--- DROPBITS(5) ---// | ||
bits -= 5; //---// | ||
state.ndist = (hold & 0x1f) + | ||
/*BITS(5)*/ | ||
1; //--- DROPBITS(5) ---// | ||
hold >>>= 5; | ||
bits -= 5; | ||
//---// | ||
state.ncode = (hold & 0x0f) + /*BITS(4)*/4; | ||
//--- DROPBITS(4) ---// | ||
bits -= 5; //---// | ||
state.ncode = (hold & 0x0f) + | ||
/*BITS(4)*/ | ||
4; //--- DROPBITS(4) ---// | ||
hold >>>= 4; | ||
bits -= 4; | ||
//---// | ||
bits -= 4; //---// | ||
//#ifndef PKZIP_BUG_WORKAROUND | ||
if (state.nlen > 286 || state.ndist > 30) { | ||
@@ -1011,8 +1347,11 @@ strm.msg = 'too many length or distance symbols'; | ||
break; | ||
} | ||
//#endif | ||
} //#endif | ||
//Tracev((stderr, "inflate: table sizes ok\n")); | ||
state.have = 0; | ||
state.mode = LENLENS; | ||
/* falls through */ | ||
case LENLENS: | ||
@@ -1025,25 +1364,30 @@ while (state.have < state.ncode) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
state.lens[order[state.have++]] = hold & 0x07; //BITS(3); | ||
//--- DROPBITS(3) ---// | ||
hold >>>= 3; | ||
bits -= 3; | ||
//---// | ||
bits -= 3; //---// | ||
} | ||
while (state.have < 19) { | ||
state.lens[order[state.have++]] = 0; | ||
} | ||
// We have separate tables & no pointers. 2 commented lines below not needed. | ||
} // We have separate tables & no pointers. 2 commented lines below not needed. | ||
//state.next = state.codes; | ||
//state.lencode = state.next; | ||
// Switch to use dynamic table | ||
state.lencode = state.lendyn; | ||
state.lenbits = 7; | ||
opts = { bits: state.lenbits }; | ||
ret = (0, _inftrees2.default)(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); | ||
opts = { | ||
bits: state.lenbits | ||
}; | ||
ret = (0, _inftrees["default"])(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); | ||
state.lenbits = opts.bits; | ||
@@ -1055,11 +1399,16 @@ | ||
break; | ||
} | ||
//Tracev((stderr, "inflate: code lengths ok\n")); | ||
} //Tracev((stderr, "inflate: code lengths ok\n")); | ||
state.have = 0; | ||
state.mode = CODELENS; | ||
/* falls through */ | ||
case CODELENS: | ||
while (state.have < state.nlen + state.ndist) { | ||
for (;;) { | ||
here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ | ||
here = state.lencode[hold & (1 << state.lenbits) - 1]; | ||
/*BITS(state.lenbits)*/ | ||
here_bits = here >>> 24; | ||
@@ -1071,17 +1420,19 @@ here_op = here >>> 16 & 0xff; | ||
break; | ||
} | ||
//--- PULLBYTE() ---// | ||
} //--- PULLBYTE() ---// | ||
if (have === 0) { | ||
break inf_leave; | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
//---// | ||
bits += 8; //---// | ||
} | ||
if (here_val < 16) { | ||
//--- DROPBITS(here.bits) ---// | ||
hold >>>= here_bits; | ||
bits -= here_bits; | ||
//---// | ||
bits -= here_bits; //---// | ||
state.lens[state.have++] = here_val; | ||
@@ -1092,2 +1443,3 @@ } else { | ||
n = here_bits + 2; | ||
while (bits < n) { | ||
@@ -1097,11 +1449,13 @@ if (have === 0) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
//--- DROPBITS(here.bits) ---// | ||
hold >>>= here_bits; | ||
bits -= here_bits; | ||
//---// | ||
bits -= here_bits; //---// | ||
if (state.have === 0) { | ||
@@ -1112,11 +1466,13 @@ strm.msg = 'invalid bit length repeat'; | ||
} | ||
len = state.lens[state.have - 1]; | ||
copy = 3 + (hold & 0x03); //BITS(2); | ||
//--- DROPBITS(2) ---// | ||
hold >>>= 2; | ||
bits -= 2; | ||
//---// | ||
bits -= 2; //---// | ||
} else if (here_val === 17) { | ||
//=== NEEDBITS(here.bits + 3); | ||
n = here_bits + 3; | ||
while (bits < n) { | ||
@@ -1126,20 +1482,23 @@ if (have === 0) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
//--- DROPBITS(here.bits) ---// | ||
hold >>>= here_bits; | ||
bits -= here_bits; | ||
//---// | ||
bits -= here_bits; //---// | ||
len = 0; | ||
copy = 3 + (hold & 0x07); //BITS(3); | ||
//--- DROPBITS(3) ---// | ||
hold >>>= 3; | ||
bits -= 3; | ||
//---// | ||
bits -= 3; //---// | ||
} else { | ||
//=== NEEDBITS(here.bits + 7); | ||
n = here_bits + 7; | ||
while (bits < n) { | ||
@@ -1149,18 +1508,21 @@ if (have === 0) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
//--- DROPBITS(here.bits) ---// | ||
hold >>>= here_bits; | ||
bits -= here_bits; | ||
//---// | ||
bits -= here_bits; //---// | ||
len = 0; | ||
copy = 11 + (hold & 0x7f); //BITS(7); | ||
//--- DROPBITS(7) ---// | ||
hold >>>= 7; | ||
bits -= 7; | ||
//---// | ||
bits -= 7; //---// | ||
} | ||
if (state.have + copy > state.nlen + state.ndist) { | ||
@@ -1171,2 +1533,3 @@ strm.msg = 'invalid bit length repeat'; | ||
} | ||
while (copy--) { | ||
@@ -1177,9 +1540,11 @@ state.lens[state.have++] = len; | ||
} | ||
/* handle error breaks in while */ | ||
/* handle error breaks in while */ | ||
if (state.mode === BAD) { | ||
break; | ||
} | ||
/* check for end-of-block code (better have one) */ | ||
/* check for end-of-block code (better have one) */ | ||
if (state.lens[256] === 0) { | ||
@@ -1190,15 +1555,16 @@ strm.msg = 'invalid code -- missing end-of-block'; | ||
} | ||
/* build code tables -- note: do not change the lenbits or distbits | ||
values here (9 and 6) without reading the comments in inftrees.h | ||
concerning the ENOUGH constants, which depend on those values */ | ||
state.lenbits = 9; | ||
opts = { bits: state.lenbits }; | ||
ret = (0, _inftrees2.default)(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); | ||
// We have separate tables & no pointers. 2 commented lines below not needed. | ||
opts = { | ||
bits: state.lenbits | ||
}; | ||
ret = (0, _inftrees["default"])(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); // We have separate tables & no pointers. 2 commented lines below not needed. | ||
// state.next_index = opts.table_index; | ||
state.lenbits = opts.bits; | ||
// state.lencode = state.next; | ||
state.lenbits = opts.bits; // state.lencode = state.next; | ||
if (ret) { | ||
@@ -1210,13 +1576,14 @@ strm.msg = 'invalid literal/lengths set'; | ||
state.distbits = 6; | ||
//state.distcode.copy(state.codes); | ||
state.distbits = 6; //state.distcode.copy(state.codes); | ||
// Switch to use dynamic table | ||
state.distcode = state.distdyn; | ||
opts = { bits: state.distbits }; | ||
ret = (0, _inftrees2.default)(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); | ||
// We have separate tables & no pointers. 2 commented lines below not needed. | ||
opts = { | ||
bits: state.distbits | ||
}; | ||
ret = (0, _inftrees["default"])(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); // We have separate tables & no pointers. 2 commented lines below not needed. | ||
// state.next_index = opts.table_index; | ||
state.distbits = opts.bits; | ||
// state.distcode = state.next; | ||
state.distbits = opts.bits; // state.distcode = state.next; | ||
if (ret) { | ||
@@ -1226,12 +1593,18 @@ strm.msg = 'invalid distances set'; | ||
break; | ||
} | ||
//Tracev((stderr, 'inflate: codes ok\n')); | ||
} //Tracev((stderr, 'inflate: codes ok\n')); | ||
state.mode = LEN_; | ||
if (flush === Z_TREES) { | ||
break inf_leave; | ||
} | ||
/* falls through */ | ||
case LEN_: | ||
state.mode = LEN; | ||
/* falls through */ | ||
case LEN: | ||
@@ -1245,6 +1618,6 @@ if (have >= 6 && left >= 258) { | ||
state.hold = hold; | ||
state.bits = bits; | ||
//--- | ||
(0, _inffast2.default)(strm, _out); | ||
//--- LOAD() --- | ||
state.bits = bits; //--- | ||
(0, _inffast["default"])(strm, _out); //--- LOAD() --- | ||
put = strm.next_out; | ||
@@ -1257,4 +1630,3 @@ output = strm.output; | ||
hold = state.hold; | ||
bits = state.bits; | ||
//--- | ||
bits = state.bits; //--- | ||
@@ -1264,7 +1636,12 @@ if (state.mode === TYPE) { | ||
} | ||
break; | ||
} | ||
state.back = 0; | ||
for (;;) { | ||
here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ | ||
here = state.lencode[hold & (1 << state.lenbits) - 1]; | ||
/*BITS(state.lenbits)*/ | ||
here_bits = here >>> 24; | ||
@@ -1276,12 +1653,14 @@ here_op = here >>> 16 & 0xff; | ||
break; | ||
} | ||
//--- PULLBYTE() ---// | ||
} //--- PULLBYTE() ---// | ||
if (have === 0) { | ||
break inf_leave; | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
//---// | ||
bits += 8; //---// | ||
} | ||
if (here_op && (here_op & 0xf0) === 0) { | ||
@@ -1291,4 +1670,7 @@ last_bits = here_bits; | ||
last_val = here_val; | ||
for (;;) { | ||
here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> /*BITS(last.bits + last.op)*/last_bits)]; | ||
here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> | ||
/*BITS(last.bits + last.op)*/ | ||
last_bits)]; | ||
here_bits = here >>> 24; | ||
@@ -1300,24 +1682,28 @@ here_op = here >>> 16 & 0xff; | ||
break; | ||
} | ||
//--- PULLBYTE() ---// | ||
} //--- PULLBYTE() ---// | ||
if (have === 0) { | ||
break inf_leave; | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
//---// | ||
} | ||
//--- DROPBITS(last.bits) ---// | ||
bits += 8; //---// | ||
} //--- DROPBITS(last.bits) ---// | ||
hold >>>= last_bits; | ||
bits -= last_bits; | ||
//---// | ||
bits -= last_bits; //---// | ||
state.back += last_bits; | ||
} | ||
//--- DROPBITS(here.bits) ---// | ||
} //--- DROPBITS(here.bits) ---// | ||
hold >>>= here_bits; | ||
bits -= here_bits; | ||
//---// | ||
bits -= here_bits; //---// | ||
state.back += here_bits; | ||
state.length = here_val; | ||
if (here_op === 0) { | ||
@@ -1330,2 +1716,3 @@ //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? | ||
} | ||
if (here_op & 32) { | ||
@@ -1337,2 +1724,3 @@ //Tracevv((stderr, "inflate: end of block\n")); | ||
} | ||
if (here_op & 64) { | ||
@@ -1343,5 +1731,8 @@ strm.msg = 'invalid literal/length code'; | ||
} | ||
state.extra = here_op & 15; | ||
state.mode = LENEXT; | ||
/* falls through */ | ||
case LENEXT: | ||
@@ -1351,2 +1742,3 @@ if (state.extra) { | ||
n = state.extra; | ||
while (bits < n) { | ||
@@ -1356,21 +1748,30 @@ if (have === 0) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
state.length += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; | ||
//--- DROPBITS(state.extra) ---// | ||
} //===// | ||
state.length += hold & (1 << state.extra) - 1 | ||
/*BITS(state.extra)*/ | ||
; //--- DROPBITS(state.extra) ---// | ||
hold >>>= state.extra; | ||
bits -= state.extra; | ||
//---// | ||
bits -= state.extra; //---// | ||
state.back += state.extra; | ||
} | ||
//Tracevv((stderr, "inflate: length %u\n", state.length)); | ||
} //Tracevv((stderr, "inflate: length %u\n", state.length)); | ||
state.was = state.length; | ||
state.mode = DIST; | ||
/* falls through */ | ||
case DIST: | ||
for (;;) { | ||
here = state.distcode[hold & (1 << state.distbits) - 1]; /*BITS(state.distbits)*/ | ||
here = state.distcode[hold & (1 << state.distbits) - 1]; | ||
/*BITS(state.distbits)*/ | ||
here_bits = here >>> 24; | ||
@@ -1382,12 +1783,14 @@ here_op = here >>> 16 & 0xff; | ||
break; | ||
} | ||
//--- PULLBYTE() ---// | ||
} //--- PULLBYTE() ---// | ||
if (have === 0) { | ||
break inf_leave; | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
//---// | ||
bits += 8; //---// | ||
} | ||
if ((here_op & 0xf0) === 0) { | ||
@@ -1397,4 +1800,7 @@ last_bits = here_bits; | ||
last_val = here_val; | ||
for (;;) { | ||
here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> /*BITS(last.bits + last.op)*/last_bits)]; | ||
here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> | ||
/*BITS(last.bits + last.op)*/ | ||
last_bits)]; | ||
here_bits = here >>> 24; | ||
@@ -1406,23 +1812,27 @@ here_op = here >>> 16 & 0xff; | ||
break; | ||
} | ||
//--- PULLBYTE() ---// | ||
} //--- PULLBYTE() ---// | ||
if (have === 0) { | ||
break inf_leave; | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
//---// | ||
} | ||
//--- DROPBITS(last.bits) ---// | ||
bits += 8; //---// | ||
} //--- DROPBITS(last.bits) ---// | ||
hold >>>= last_bits; | ||
bits -= last_bits; | ||
//---// | ||
bits -= last_bits; //---// | ||
state.back += last_bits; | ||
} | ||
//--- DROPBITS(here.bits) ---// | ||
} //--- DROPBITS(here.bits) ---// | ||
hold >>>= here_bits; | ||
bits -= here_bits; | ||
//---// | ||
bits -= here_bits; //---// | ||
state.back += here_bits; | ||
if (here_op & 64) { | ||
@@ -1433,6 +1843,9 @@ strm.msg = 'invalid distance code'; | ||
} | ||
state.offset = here_val; | ||
state.extra = here_op & 15; | ||
state.mode = DISTEXT; | ||
/* falls through */ | ||
case DISTEXT: | ||
@@ -1442,2 +1855,3 @@ if (state.extra) { | ||
n = state.extra; | ||
while (bits < n) { | ||
@@ -1447,15 +1861,20 @@ if (have === 0) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
state.offset += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; | ||
//--- DROPBITS(state.extra) ---// | ||
} //===// | ||
state.offset += hold & (1 << state.extra) - 1 | ||
/*BITS(state.extra)*/ | ||
; //--- DROPBITS(state.extra) ---// | ||
hold >>>= state.extra; | ||
bits -= state.extra; | ||
//---// | ||
bits -= state.extra; //---// | ||
state.back += state.extra; | ||
} | ||
//#ifdef INFLATE_STRICT | ||
} //#ifdef INFLATE_STRICT | ||
if (state.offset > state.dmax) { | ||
@@ -1465,7 +1884,10 @@ strm.msg = 'invalid distance too far back'; | ||
break; | ||
} | ||
//#endif | ||
} //#endif | ||
//Tracevv((stderr, "inflate: distance %u\n", state.offset)); | ||
state.mode = MATCH; | ||
/* falls through */ | ||
case MATCH: | ||
@@ -1475,6 +1897,9 @@ if (left === 0) { | ||
} | ||
copy = _out - left; | ||
if (state.offset > copy) { | ||
/* copy from window */ | ||
copy = state.offset - copy; | ||
if (copy > state.whave) { | ||
@@ -1485,4 +1910,3 @@ if (state.sane) { | ||
break; | ||
} | ||
// (!) This block is disabled in zlib defailts, | ||
} // (!) This block is disabled in zlib defailts, | ||
// don't enable it for binary compatibility | ||
@@ -1502,3 +1926,5 @@ //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR | ||
//#endif | ||
} | ||
if (copy > state.wnext) { | ||
@@ -1510,5 +1936,7 @@ copy -= state.wnext; | ||
} | ||
if (copy > state.length) { | ||
copy = state.length; | ||
} | ||
from_source = state.window; | ||
@@ -1521,14 +1949,20 @@ } else { | ||
} | ||
if (copy > left) { | ||
copy = left; | ||
} | ||
left -= copy; | ||
state.length -= copy; | ||
do { | ||
output[put++] = from_source[from++]; | ||
} while (--copy); | ||
if (state.length === 0) { | ||
state.mode = LEN; | ||
} | ||
break; | ||
case LIT: | ||
@@ -1538,2 +1972,3 @@ if (left === 0) { | ||
} | ||
output[put++] = state.length; | ||
@@ -1543,2 +1978,3 @@ left--; | ||
break; | ||
case CHECK: | ||
@@ -1551,18 +1987,22 @@ if (state.wrap) { | ||
} | ||
have--; | ||
// Use '|' insdead of '+' to make sure that result is signed | ||
have--; // Use '|' insdead of '+' to make sure that result is signed | ||
hold |= input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
_out -= left; | ||
strm.total_out += _out; | ||
state.total += _out; | ||
if (_out) { | ||
strm.adler = state.check = | ||
/*UPDATE(state.check, put - _out, _out);*/ | ||
state.flags ? (0, _crc2.default)(state.check, output, _out, put - _out) : (0, _adler2.default)(state.check, output, _out, put - _out); | ||
state.flags ? (0, _crc["default"])(state.check, output, _out, put - _out) : (0, _adler["default"])(state.check, output, _out, put - _out); | ||
} | ||
_out = left; | ||
// NB: crc32 stored as signed 32-bit int, zswap32 returns signed too | ||
_out = left; // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too | ||
if ((state.flags ? hold : zswap32(hold)) !== state.check) { | ||
@@ -1572,11 +2012,14 @@ strm.msg = 'incorrect data check'; | ||
break; | ||
} | ||
//=== INITBITS(); | ||
} //=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
//Tracev((stderr, "inflate: check matches trailer\n")); | ||
} | ||
state.mode = LENGTH; | ||
/* falls through */ | ||
case LENGTH: | ||
@@ -1589,7 +2032,9 @@ if (state.wrap && state.flags) { | ||
} | ||
have--; | ||
hold += input[next++] << bits; | ||
bits += 8; | ||
} | ||
//===// | ||
} //===// | ||
if (hold !== (state.total & 0xffffffff)) { | ||
@@ -1599,28 +2044,33 @@ strm.msg = 'incorrect length check'; | ||
break; | ||
} | ||
//=== INITBITS(); | ||
} //=== INITBITS(); | ||
hold = 0; | ||
bits = 0; | ||
//===// | ||
bits = 0; //===// | ||
//Tracev((stderr, "inflate: length matches trailer\n")); | ||
} | ||
state.mode = DONE; | ||
/* falls through */ | ||
case DONE: | ||
ret = Z_STREAM_END; | ||
break inf_leave; | ||
case BAD: | ||
ret = Z_DATA_ERROR; | ||
break inf_leave; | ||
case MEM: | ||
return Z_MEM_ERROR; | ||
case SYNC: | ||
/* falls through */ | ||
default: | ||
return Z_STREAM_ERROR; | ||
} | ||
} | ||
} // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" | ||
// inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" | ||
/* | ||
@@ -1632,4 +2082,5 @@ Return from inflate(), updating the total counts and the check value. | ||
*/ | ||
//--- RESTORE() --- | ||
//--- RESTORE() --- | ||
strm.next_out = put; | ||
@@ -1640,4 +2091,3 @@ strm.avail_out = left; | ||
state.hold = hold; | ||
state.bits = bits; | ||
//--- | ||
state.bits = bits; //--- | ||
@@ -1650,2 +2100,3 @@ if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH)) { | ||
} | ||
_in -= strm.avail_in; | ||
@@ -1656,10 +2107,15 @@ _out -= strm.avail_out; | ||
state.total += _out; | ||
if (state.wrap && _out) { | ||
strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ | ||
state.flags ? (0, _crc2.default)(state.check, output, _out, strm.next_out - _out) : (0, _adler2.default)(state.check, output, _out, strm.next_out - _out); | ||
strm.adler = state.check = | ||
/*UPDATE(state.check, strm.next_out - _out, _out);*/ | ||
state.flags ? (0, _crc["default"])(state.check, output, _out, strm.next_out - _out) : (0, _adler["default"])(state.check, output, _out, strm.next_out - _out); | ||
} | ||
strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); | ||
if ((_in === 0 && _out === 0 || flush === Z_FINISH) && ret === Z_OK) { | ||
ret = Z_BUF_ERROR; | ||
} | ||
return ret; | ||
@@ -1669,4 +2125,5 @@ } | ||
function inflateEnd(strm) { | ||
if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { | ||
if (!strm || !strm.state | ||
/*|| strm->zfree == (free_func)0*/ | ||
) { | ||
return Z_STREAM_ERROR; | ||
@@ -1676,5 +2133,7 @@ } | ||
var state = strm.state; | ||
if (state.window) { | ||
state.window = null; | ||
} | ||
strm.state = null; | ||
@@ -1686,13 +2145,16 @@ return Z_OK; | ||
var state; | ||
/* check state */ | ||
/* check state */ | ||
if (!strm || !strm.state) { | ||
return Z_STREAM_ERROR; | ||
} | ||
state = strm.state; | ||
if ((state.wrap & 2) === 0) { | ||
return Z_STREAM_ERROR; | ||
} | ||
/* save header structure */ | ||
/* save header structure */ | ||
state.head = head; | ||
@@ -1705,11 +2167,15 @@ head.done = false; | ||
var dictLength = dictionary.length; | ||
var state; | ||
var dictid; | ||
var ret; | ||
/* check state */ | ||
/* check state */ | ||
if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { | ||
if (!strm | ||
/* == Z_NULL */ | ||
|| !strm.state | ||
/* == Z_NULL */ | ||
) { | ||
return Z_STREAM_ERROR; | ||
} | ||
state = strm.state; | ||
@@ -1720,8 +2186,13 @@ | ||
} | ||
/* check for correct dictionary identifier */ | ||
/* check for correct dictionary identifier */ | ||
if (state.mode === DICT) { | ||
dictid = 1; /* adler32(0, null, 0)*/ | ||
dictid = 1; | ||
/* adler32(0, null, 0)*/ | ||
/* dictid = adler32(dictid, dictionary, dictLength); */ | ||
dictid = (0, _adler2.default)(dictid, dictionary, dictLength, 0); | ||
dictid = (0, _adler["default"])(dictid, dictionary, dictLength, 0); | ||
if (dictid !== state.check) { | ||
@@ -1733,3 +2204,6 @@ return Z_DATA_ERROR; | ||
existing dictionary if appropriate */ | ||
ret = updatewindow(strm, dictionary, dictLength, dictLength); | ||
if (ret) { | ||
@@ -1739,18 +2213,9 @@ state.mode = MEM; | ||
} | ||
state.havedict = 1; | ||
// Tracev((stderr, "inflate: dictionary set\n")); | ||
state.havedict = 1; // Tracev((stderr, "inflate: dictionary set\n")); | ||
return Z_OK; | ||
} | ||
exports.inflateReset = inflateReset; | ||
exports.inflateReset2 = inflateReset2; | ||
exports.inflateResetKeep = inflateResetKeep; | ||
exports.inflateInit = inflateInit; | ||
exports.inflateInit2 = inflateInit2; | ||
exports.inflate = inflate; | ||
exports.inflateEnd = inflateEnd; | ||
exports.inflateGetHeader = inflateGetHeader; | ||
exports.inflateSetDictionary = inflateSetDictionary; | ||
var inflateInfo = exports.inflateInfo = 'pako inflate (from Nodeca project)'; | ||
var inflateInfo = 'pako inflate (from Nodeca project)'; | ||
/* Not implemented | ||
@@ -1764,2 +2229,4 @@ exports.inflateCopy = inflateCopy; | ||
exports.inflateUndermine = inflateUndermine; | ||
*/ | ||
*/ | ||
exports.inflateInfo = inflateInfo; |
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.default = inflate_table; | ||
exports["default"] = inflate_table; | ||
var _common = require("../utils/common.js"); | ||
var utils = _interopRequireWildcard(require("../utils/common.js")); | ||
var utils = _interopRequireWildcard(_common); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
var MAXBITS = 15; | ||
var ENOUGH_LENS = 852; | ||
var ENOUGH_DISTS = 592; | ||
//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); | ||
var ENOUGH_DISTS = 592; //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); | ||
@@ -22,45 +23,76 @@ var CODES = 0; | ||
var DISTS = 2; | ||
var lbase = [/* Length codes 257..285 base */ | ||
var lbase = [ | ||
/* Length codes 257..285 base */ | ||
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0]; | ||
var lext = [/* Length codes 257..285 extra */ | ||
var lext = [ | ||
/* Length codes 257..285 extra */ | ||
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78]; | ||
var dbase = [/* Distance codes 0..29 base */ | ||
var dbase = [ | ||
/* Distance codes 0..29 base */ | ||
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0]; | ||
var dext = [/* Distance codes 0..29 extra */ | ||
var dext = [ | ||
/* Distance codes 0..29 extra */ | ||
16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64]; | ||
function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) { | ||
var bits = opts.bits; | ||
//here = opts.here; /* table entry for duplication */ | ||
var bits = opts.bits; //here = opts.here; /* table entry for duplication */ | ||
var len = 0; /* a code's length in bits */ | ||
var sym = 0; /* index of code symbols */ | ||
var len = 0; | ||
/* a code's length in bits */ | ||
var sym = 0; | ||
/* index of code symbols */ | ||
var min = 0, | ||
max = 0; /* minimum and maximum code lengths */ | ||
var root = 0; /* number of index bits for root table */ | ||
var curr = 0; /* number of index bits for current table */ | ||
var drop = 0; /* code bits to drop for sub-table */ | ||
var left = 0; /* number of prefix codes available */ | ||
var used = 0; /* code entries in table used */ | ||
var huff = 0; /* Huffman code */ | ||
var incr; /* for incrementing code, index */ | ||
var fill; /* index for replicating entries */ | ||
var low; /* low bits for current root entry */ | ||
var mask; /* mask for low root bits */ | ||
var next; /* next available space in table */ | ||
var base = null; /* base value table to use */ | ||
var base_index = 0; | ||
// var shoextra; /* extra bits table to use */ | ||
var end; /* use base and extra for symbol > end */ | ||
max = 0; | ||
/* minimum and maximum code lengths */ | ||
var root = 0; | ||
/* number of index bits for root table */ | ||
var curr = 0; | ||
/* number of index bits for current table */ | ||
var drop = 0; | ||
/* code bits to drop for sub-table */ | ||
var left = 0; | ||
/* number of prefix codes available */ | ||
var used = 0; | ||
/* code entries in table used */ | ||
var huff = 0; | ||
/* Huffman code */ | ||
var incr; | ||
/* for incrementing code, index */ | ||
var fill; | ||
/* index for replicating entries */ | ||
var low; | ||
/* low bits for current root entry */ | ||
var mask; | ||
/* mask for low root bits */ | ||
var next; | ||
/* next available space in table */ | ||
var base = null; | ||
/* base value table to use */ | ||
var base_index = 0; // var shoextra; /* extra bits table to use */ | ||
var end; | ||
/* use base and extra for symbol > end */ | ||
var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ | ||
var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ | ||
var extra = null; | ||
var extra_index = 0; | ||
var here_bits, here_op, here_val; | ||
/* | ||
@@ -95,11 +127,15 @@ Process a set of code lengths to create a canonical Huffman code. The | ||
/* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ | ||
for (len = 0; len <= MAXBITS; len++) { | ||
count[len] = 0; | ||
} | ||
for (sym = 0; sym < codes; sym++) { | ||
count[lens[lens_index + sym]]++; | ||
} | ||
/* bound code lengths, force root to be within code lengths */ | ||
/* bound code lengths, force root to be within code lengths */ | ||
root = bits; | ||
for (max = MAXBITS; max >= 1; max--) { | ||
@@ -110,5 +146,7 @@ if (count[max] !== 0) { | ||
} | ||
if (root > max) { | ||
root = max; | ||
} | ||
if (max === 0) { | ||
@@ -119,12 +157,12 @@ /* no symbols to code at all */ | ||
//table.val[opts.table_index++] = 0; //here.val = (var short)0; | ||
table[table_index++] = 1 << 24 | 64 << 16 | 0; | ||
//table.op[opts.table_index] = 64; | ||
table[table_index++] = 1 << 24 | 64 << 16 | 0; //table.op[opts.table_index] = 64; | ||
//table.bits[opts.table_index] = 1; | ||
//table.val[opts.table_index++] = 0; | ||
table[table_index++] = 1 << 24 | 64 << 16 | 0; | ||
opts.bits = 1; | ||
return 0; /* no symbols, but wait for decoding to report error */ | ||
return 0; | ||
/* no symbols, but wait for decoding to report error */ | ||
} | ||
for (min = 1; min < max; min++) { | ||
@@ -135,26 +173,37 @@ if (count[min] !== 0) { | ||
} | ||
if (root < min) { | ||
root = min; | ||
} | ||
/* check for an over-subscribed or incomplete set of lengths */ | ||
/* check for an over-subscribed or incomplete set of lengths */ | ||
left = 1; | ||
for (len = 1; len <= MAXBITS; len++) { | ||
left <<= 1; | ||
left -= count[len]; | ||
if (left < 0) { | ||
return -1; | ||
} /* over-subscribed */ | ||
} | ||
/* over-subscribed */ | ||
} | ||
if (left > 0 && (type === CODES || max !== 1)) { | ||
return -1; /* incomplete set */ | ||
return -1; | ||
/* incomplete set */ | ||
} | ||
/* generate offsets into symbol table for each length for sorting */ | ||
/* generate offsets into symbol table for each length for sorting */ | ||
offs[1] = 0; | ||
for (len = 1; len < MAXBITS; len++) { | ||
offs[len + 1] = offs[len] + count[len]; | ||
} | ||
/* sort symbols by length, by symbol order within each length */ | ||
/* sort symbols by length, by symbol order within each length */ | ||
for (sym = 0; sym < codes; sym++) { | ||
@@ -165,3 +214,2 @@ if (lens[lens_index + sym] !== 0) { | ||
} | ||
/* | ||
@@ -197,4 +245,8 @@ Create and fill in decoding tables. In this loop, the table being | ||
// to avoid deopts in old v8 | ||
if (type === CODES) { | ||
base = extra = work; /* dummy value--not used */ | ||
base = extra = work; | ||
/* dummy value--not used */ | ||
end = 19; | ||
@@ -213,23 +265,44 @@ } else if (type === LENS) { | ||
} | ||
/* initialize opts for loop */ | ||
huff = 0; /* starting code */ | ||
sym = 0; /* starting code symbol */ | ||
len = min; /* starting code length */ | ||
next = table_index; /* current table to fill in */ | ||
curr = root; /* current table index bits */ | ||
drop = 0; /* current bits to drop from code for index */ | ||
low = -1; /* trigger new sub-table when len > root */ | ||
used = 1 << root; /* use root table entries */ | ||
mask = used - 1; /* mask for comparing low */ | ||
huff = 0; | ||
/* starting code */ | ||
sym = 0; | ||
/* starting code symbol */ | ||
len = min; | ||
/* starting code length */ | ||
next = table_index; | ||
/* current table to fill in */ | ||
curr = root; | ||
/* current table index bits */ | ||
drop = 0; | ||
/* current bits to drop from code for index */ | ||
low = -1; | ||
/* trigger new sub-table when len > root */ | ||
used = 1 << root; | ||
/* use root table entries */ | ||
mask = used - 1; | ||
/* mask for comparing low */ | ||
/* check available table space */ | ||
if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) { | ||
return 1; | ||
} | ||
/* process all codes and make table entries */ | ||
/* process all codes and make table entries */ | ||
for (;;) { | ||
/* create table entry */ | ||
here_bits = len - drop; | ||
if (work[sym] < end) { | ||
@@ -242,10 +315,15 @@ here_op = 0; | ||
} else { | ||
here_op = 32 + 64; /* end of block */ | ||
here_op = 32 + 64; | ||
/* end of block */ | ||
here_val = 0; | ||
} | ||
/* replicate for those indices with low len bits equal to huff */ | ||
/* replicate for those indices with low len bits equal to huff */ | ||
incr = 1 << len - drop; | ||
fill = 1 << curr; | ||
min = fill; /* save offset to next table */ | ||
min = fill; | ||
/* save offset to next table */ | ||
do { | ||
@@ -255,8 +333,11 @@ fill -= incr; | ||
} while (fill !== 0); | ||
/* backwards increment the len-bit code huff */ | ||
/* backwards increment the len-bit code huff */ | ||
incr = 1 << len - 1; | ||
while (huff & incr) { | ||
incr >>= 1; | ||
} | ||
if (incr !== 0) { | ||
@@ -268,5 +349,7 @@ huff &= incr - 1; | ||
} | ||
/* go to next symbol, update count, len */ | ||
/* go to next symbol, update count, len */ | ||
sym++; | ||
if (--count[len] === 0) { | ||
@@ -276,6 +359,8 @@ if (len === max) { | ||
} | ||
len = lens[lens_index + work[sym]]; | ||
} | ||
/* create new sub-table if needed */ | ||
/* create new sub-table if needed */ | ||
if (len > root && (huff & mask) !== low) { | ||
@@ -286,25 +371,34 @@ /* if first time, transition to sub-tables */ | ||
} | ||
/* increment past last table */ | ||
next += min; /* here min is 1 << curr */ | ||
next += min; | ||
/* here min is 1 << curr */ | ||
/* determine length of next table */ | ||
curr = len - drop; | ||
left = 1 << curr; | ||
while (curr + drop < max) { | ||
left -= count[curr + drop]; | ||
if (left <= 0) { | ||
break; | ||
} | ||
curr++; | ||
left <<= 1; | ||
} | ||
/* check for enough space */ | ||
/* check for enough space */ | ||
used += 1 << curr; | ||
if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) { | ||
return 1; | ||
} | ||
/* point entry in root table to sub-table */ | ||
/* point entry in root table to sub-table */ | ||
low = huff & mask; | ||
@@ -314,9 +408,11 @@ /*table.op[low] = curr; | ||
table.val[low] = next - opts.table_index;*/ | ||
table[low] = root << 24 | curr << 16 | next - table_index | 0; | ||
} | ||
} | ||
/* fill in remaining table entry if code is incomplete (guaranteed to have | ||
at most one remaining entry, since if the code is incomplete, the | ||
maximum code length that was allowed to get this far is one bit) */ | ||
if (huff !== 0) { | ||
@@ -328,7 +424,10 @@ //table.op[next + huff] = 64; /* invalid code marker */ | ||
} | ||
/* set return parameters */ | ||
//opts.table_index += used; | ||
opts.bits = root; | ||
return 0; | ||
}; | ||
} | ||
; |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -6,12 +6,32 @@ Object.defineProperty(exports, "__esModule", { | ||
}); | ||
exports.default = { | ||
2: 'need dictionary', /* Z_NEED_DICT 2 */ | ||
1: 'stream end', /* Z_STREAM_END 1 */ | ||
0: '', /* Z_OK 0 */ | ||
'-1': 'file error', /* Z_ERRNO (-1) */ | ||
'-2': 'stream error', /* Z_STREAM_ERROR (-2) */ | ||
'-3': 'data error', /* Z_DATA_ERROR (-3) */ | ||
'-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ | ||
'-5': 'buffer error', /* Z_BUF_ERROR (-5) */ | ||
'-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ | ||
}; | ||
exports["default"] = void 0; | ||
var _default = { | ||
2: 'need dictionary', | ||
/* Z_NEED_DICT 2 */ | ||
1: 'stream end', | ||
/* Z_STREAM_END 1 */ | ||
0: '', | ||
/* Z_OK 0 */ | ||
'-1': 'file error', | ||
/* Z_ERRNO (-1) */ | ||
'-2': 'stream error', | ||
/* Z_STREAM_ERROR (-2) */ | ||
'-3': 'data error', | ||
/* Z_DATA_ERROR (-3) */ | ||
'-4': 'insufficient memory', | ||
/* Z_MEM_ERROR (-4) */ | ||
'-5': 'buffer error', | ||
/* Z_BUF_ERROR (-5) */ | ||
'-6': 'incompatible version' | ||
/* Z_VERSION_ERROR (-6) */ | ||
}; | ||
exports["default"] = _default; |
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports._tr_align = exports._tr_tally = exports._tr_flush_block = exports._tr_stored_block = exports._tr_init = undefined; | ||
exports._tr_init = _tr_init; | ||
exports._tr_stored_block = _tr_stored_block; | ||
exports._tr_flush_block = _tr_flush_block; | ||
exports._tr_tally = _tr_tally; | ||
exports._tr_align = _tr_align; | ||
var _common = require("../utils/common.js"); | ||
var utils = _interopRequireWildcard(require("../utils/common.js")); | ||
var utils = _interopRequireWildcard(_common); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
/* Public constants ==========================================================*/ | ||
/* ===========================================================================*/ | ||
//var Z_FILTERED = 1; | ||
//var Z_HUFFMAN_ONLY = 2; | ||
//var Z_RLE = 3; | ||
var Z_FIXED = 4; | ||
//var Z_DEFAULT_STRATEGY = 0; | ||
var Z_FIXED = 4; //var Z_DEFAULT_STRATEGY = 0; | ||
/* Possible values of the data_type field (though see inflate()) */ | ||
var Z_BINARY = 0; | ||
var Z_TEXT = 1; | ||
//var Z_ASCII = 1; // = Z_TEXT | ||
var Z_TEXT = 1; //var Z_ASCII = 1; // = Z_TEXT | ||
var Z_UNKNOWN = 2; | ||
/*============================================================================*/ | ||
function zero(buf) { | ||
var len = buf.length;while (--len >= 0) { | ||
var len = buf.length; | ||
while (--len >= 0) { | ||
buf[len] = 0; | ||
} | ||
} | ||
} // From zutil.h | ||
// From zutil.h | ||
@@ -47,4 +53,4 @@ var STORED_BLOCK = 0; | ||
/* The minimum and maximum match lengths */ | ||
// From deflate.h | ||
// From deflate.h | ||
/* =========================================================================== | ||
@@ -98,11 +104,12 @@ * Internal compression state. | ||
/* eslint-disable comma-spacing,array-bracket-spacing */ | ||
var extra_lbits = /* extra bits for each length code */ | ||
var extra_lbits = | ||
/* extra bits for each length code */ | ||
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; | ||
var extra_dbits = /* extra bits for each distance code */ | ||
var extra_dbits = | ||
/* extra bits for each distance code */ | ||
[0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; | ||
var extra_blbits = /* extra bits for each bit length code */ | ||
var extra_blbits = | ||
/* extra bits for each bit length code */ | ||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]; | ||
var bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; | ||
@@ -118,8 +125,8 @@ /* eslint-enable comma-spacing,array-bracket-spacing */ | ||
*/ | ||
// We pre-fill arrays with 0 to avoid uninitialized gaps | ||
var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ | ||
var DIST_CODE_LEN = 512; | ||
/* see definition of array dist_code below */ | ||
// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 | ||
// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 | ||
var static_ltree = new Array((L_CODES + 2) * 2); | ||
@@ -140,2 +147,3 @@ zero(static_ltree); | ||
var _dist_code = new Array(DIST_CODE_LEN); | ||
zero(_dist_code); | ||
@@ -148,2 +156,3 @@ /* Distance codes. The first 256 values correspond to the distances | ||
var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); | ||
zero(_length_code); | ||
@@ -161,10 +170,18 @@ /* length code for each normalized match length (0 == MIN_MATCH) */ | ||
function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { | ||
this.static_tree = static_tree; | ||
/* static tree or NULL */ | ||
this.static_tree = static_tree; /* static tree or NULL */ | ||
this.extra_bits = extra_bits; /* extra bits for each code or NULL */ | ||
this.extra_base = extra_base; /* base index for extra_bits */ | ||
this.elems = elems; /* max number of elements in the tree */ | ||
this.max_length = max_length; /* max bit length for the codes */ | ||
this.extra_bits = extra_bits; | ||
/* extra bits for each code or NULL */ | ||
this.extra_base = extra_base; | ||
/* base index for extra_bits */ | ||
this.elems = elems; | ||
/* max number of elements in the tree */ | ||
this.max_length = max_length; | ||
/* max bit length for the codes */ | ||
// show if `static_tree` has data or dummy - needed for monomorphic objects | ||
this.has_stree = static_tree && static_tree.length; | ||
@@ -178,5 +195,10 @@ } | ||
function TreeDesc(dyn_tree, stat_desc) { | ||
this.dyn_tree = dyn_tree; /* the dynamic tree */ | ||
this.max_code = 0; /* largest code with non zero frequency */ | ||
this.stat_desc = stat_desc; /* the corresponding static tree */ | ||
this.dyn_tree = dyn_tree; | ||
/* the dynamic tree */ | ||
this.max_code = 0; | ||
/* largest code with non zero frequency */ | ||
this.stat_desc = stat_desc; | ||
/* the corresponding static tree */ | ||
} | ||
@@ -187,3 +209,2 @@ | ||
} | ||
/* =========================================================================== | ||
@@ -193,2 +214,4 @@ * Output a short LSB first on the stream. | ||
*/ | ||
function put_short(s, w) { | ||
@@ -200,3 +223,2 @@ // put_byte(s, (uch)((w) & 0xff)); | ||
} | ||
/* =========================================================================== | ||
@@ -206,2 +228,4 @@ * Send a value on a given number of bits. | ||
*/ | ||
function send_bits(s, value, length) { | ||
@@ -220,5 +244,8 @@ if (s.bi_valid > Buf_size - length) { | ||
function send_code(s, c, tree) { | ||
send_bits(s, tree[c * 2] /*.Code*/, tree[c * 2 + 1] /*.Len*/); | ||
send_bits(s, tree[c * 2] | ||
/*.Code*/ | ||
, tree[c * 2 + 1] | ||
/*.Len*/ | ||
); | ||
} | ||
/* =========================================================================== | ||
@@ -229,4 +256,7 @@ * Reverse the first len bits of a code, using straightforward code (a faster | ||
*/ | ||
function bi_reverse(code, len) { | ||
var res = 0; | ||
do { | ||
@@ -237,8 +267,10 @@ res |= code & 1; | ||
} while (--len > 0); | ||
return res >>> 1; | ||
} | ||
/* =========================================================================== | ||
* Flush the bit buffer, keeping at most 7 bits in it. | ||
*/ | ||
function bi_flush(s) { | ||
@@ -255,3 +287,2 @@ if (s.bi_valid === 16) { | ||
} | ||
/* =========================================================================== | ||
@@ -267,4 +298,5 @@ * Compute the optimal bit lengths for a tree and update the total bit length | ||
*/ | ||
function gen_bitlen(s, desc) | ||
// deflate_state *s; | ||
function gen_bitlen(s, desc) // deflate_state *s; | ||
// tree_desc *desc; /* the tree descriptor */ | ||
@@ -279,21 +311,41 @@ { | ||
var max_length = desc.stat_desc.max_length; | ||
var h; /* heap index */ | ||
var n, m; /* iterate over the tree elements */ | ||
var bits; /* bit length */ | ||
var xbits; /* extra bits */ | ||
var f; /* frequency */ | ||
var overflow = 0; /* number of elements with bit length too large */ | ||
var h; | ||
/* heap index */ | ||
var n, m; | ||
/* iterate over the tree elements */ | ||
var bits; | ||
/* bit length */ | ||
var xbits; | ||
/* extra bits */ | ||
var f; | ||
/* frequency */ | ||
var overflow = 0; | ||
/* number of elements with bit length too large */ | ||
for (bits = 0; bits <= MAX_BITS; bits++) { | ||
s.bl_count[bits] = 0; | ||
} | ||
/* In a first pass, compute the optimal bit lengths (which may | ||
* overflow in the case of the bit length tree). | ||
*/ | ||
tree[s.heap[s.heap_max] * 2 + 1] /*.Len*/ = 0; /* root of the heap */ | ||
tree[s.heap[s.heap_max] * 2 + 1] | ||
/*.Len*/ | ||
= 0; | ||
/* root of the heap */ | ||
for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { | ||
n = s.heap[h]; | ||
bits = tree[tree[n * 2 + 1] /*.Dad*/ * 2 + 1] /*.Len*/ + 1; | ||
bits = tree[tree[n * 2 + 1] | ||
/*.Dad*/ | ||
* 2 + 1] | ||
/*.Len*/ | ||
+ 1; | ||
if (bits > max_length) { | ||
@@ -303,3 +355,6 @@ bits = max_length; | ||
} | ||
tree[n * 2 + 1] /*.Len*/ = bits; | ||
tree[n * 2 + 1] | ||
/*.Len*/ | ||
= bits; | ||
/* We overwrite tree[n].Dad which is no longer needed */ | ||
@@ -309,30 +364,47 @@ | ||
continue; | ||
} /* not a leaf node */ | ||
} | ||
/* not a leaf node */ | ||
s.bl_count[bits]++; | ||
xbits = 0; | ||
if (n >= base) { | ||
xbits = extra[n - base]; | ||
} | ||
f = tree[n * 2] /*.Freq*/; | ||
f = tree[n * 2] | ||
/*.Freq*/ | ||
; | ||
s.opt_len += f * (bits + xbits); | ||
if (has_stree) { | ||
s.static_len += f * (stree[n * 2 + 1] /*.Len*/ + xbits); | ||
s.static_len += f * (stree[n * 2 + 1] | ||
/*.Len*/ | ||
+ xbits); | ||
} | ||
} | ||
if (overflow === 0) { | ||
return; | ||
} | ||
} // Trace((stderr,"\nbit length overflow\n")); | ||
// Trace((stderr,"\nbit length overflow\n")); | ||
/* This happens for example on obj2 and pic of the Calgary corpus */ | ||
/* Find the first bit length which could increase: */ | ||
do { | ||
bits = max_length - 1; | ||
while (s.bl_count[bits] === 0) { | ||
bits--; | ||
} | ||
s.bl_count[bits]--; /* move one leaf down the tree */ | ||
s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ | ||
s.bl_count[bits]--; | ||
/* move one leaf down the tree */ | ||
s.bl_count[bits + 1] += 2; | ||
/* move one overflow item as its brother */ | ||
s.bl_count[max_length]--; | ||
@@ -342,5 +414,5 @@ /* The brother of the overflow item also moves one step up, | ||
*/ | ||
overflow -= 2; | ||
} while (overflow > 0); | ||
/* Now recompute all bit lengths, scanning in increasing frequency. | ||
@@ -351,14 +423,28 @@ * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all | ||
*/ | ||
for (bits = max_length; bits !== 0; bits--) { | ||
n = s.bl_count[bits]; | ||
while (n !== 0) { | ||
m = s.heap[--h]; | ||
if (m > max_code) { | ||
continue; | ||
} | ||
if (tree[m * 2 + 1] /*.Len*/ !== bits) { | ||
if (tree[m * 2 + 1] | ||
/*.Len*/ | ||
!== bits) { | ||
// Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); | ||
s.opt_len += (bits - tree[m * 2 + 1] /*.Len*/) * tree[m * 2] /*.Freq*/; | ||
tree[m * 2 + 1] /*.Len*/ = bits; | ||
s.opt_len += (bits - tree[m * 2 + 1] | ||
/*.Len*/ | ||
) * tree[m * 2] | ||
/*.Freq*/ | ||
; | ||
tree[m * 2 + 1] | ||
/*.Len*/ | ||
= bits; | ||
} | ||
n--; | ||
@@ -368,3 +454,2 @@ } | ||
} | ||
/* =========================================================================== | ||
@@ -378,15 +463,24 @@ * Generate the codes for a given tree and bit counts (which need not be | ||
*/ | ||
function gen_codes(tree, max_code, bl_count) | ||
// ct_data *tree; /* the tree to decorate */ | ||
function gen_codes(tree, max_code, bl_count) // ct_data *tree; /* the tree to decorate */ | ||
// int max_code; /* largest code with non zero frequency */ | ||
// ushf *bl_count; /* number of codes at each bit length */ | ||
{ | ||
var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ | ||
var code = 0; /* running code value */ | ||
var bits; /* bit index */ | ||
var n; /* code index */ | ||
var next_code = new Array(MAX_BITS + 1); | ||
/* next code value for each bit length */ | ||
var code = 0; | ||
/* running code value */ | ||
var bits; | ||
/* bit index */ | ||
var n; | ||
/* code index */ | ||
/* The distribution counts are first used to generate the code values | ||
* without bit reversal. | ||
*/ | ||
for (bits = 1; bits <= MAX_BITS; bits++) { | ||
@@ -402,4 +496,8 @@ next_code[bits] = code = code + bl_count[bits - 1] << 1; | ||
for (n = 0; n <= max_code; n++) { | ||
var len = tree[n * 2 + 1] /*.Len*/; | ||
var len = tree[n * 2 + 1] | ||
/*.Len*/ | ||
; | ||
if (len === 0) { | ||
@@ -409,21 +507,33 @@ continue; | ||
/* Now reverse the bits */ | ||
tree[n * 2] /*.Code*/ = bi_reverse(next_code[len]++, len); | ||
//Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", | ||
tree[n * 2] | ||
/*.Code*/ | ||
= bi_reverse(next_code[len]++, len); //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", | ||
// n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); | ||
} | ||
} | ||
/* =========================================================================== | ||
* Initialize the various 'constant' tables. | ||
*/ | ||
function tr_static_init() { | ||
var n; /* iterates over tree elements */ | ||
var bits; /* bit counter */ | ||
var length; /* length value */ | ||
var code; /* code value */ | ||
var dist; /* distance index */ | ||
var n; | ||
/* iterates over tree elements */ | ||
var bits; | ||
/* bit counter */ | ||
var length; | ||
/* length value */ | ||
var code; | ||
/* code value */ | ||
var dist; | ||
/* distance index */ | ||
var bl_count = new Array(MAX_BITS + 1); | ||
/* number of codes at each bit length for an optimal tree */ | ||
// do check in _tr_init() | ||
@@ -433,2 +543,3 @@ //if (static_init_done) return; | ||
/* For some embedded targets, global variables are not initialized: */ | ||
/*#ifdef NO_INIT_GLOBAL_POINTERS | ||
@@ -443,10 +554,13 @@ static_l_desc.static_tree = static_ltree; | ||
/* Initialize the mapping length (0..255) -> length code (0..28) */ | ||
length = 0; | ||
for (code = 0; code < LENGTH_CODES - 1; code++) { | ||
base_length[code] = length; | ||
for (n = 0; n < 1 << extra_lbits[code]; n++) { | ||
_length_code[length++] = code; | ||
} | ||
} | ||
//Assert (length == 256, "tr_static_init: length != 256"); | ||
} //Assert (length == 256, "tr_static_init: length != 256"); | ||
/* Note that the length 255 (match length 258) can be represented | ||
@@ -456,23 +570,32 @@ * in two different ways: code 284 + 5 bits or code 285, so we | ||
*/ | ||
_length_code[length - 1] = code; | ||
/* Initialize the mapping dist (0..32K) -> dist code (0..29) */ | ||
/* Initialize the mapping dist (0..32K) -> dist code (0..29) */ | ||
dist = 0; | ||
for (code = 0; code < 16; code++) { | ||
base_dist[code] = dist; | ||
for (n = 0; n < 1 << extra_dbits[code]; n++) { | ||
_dist_code[dist++] = code; | ||
} | ||
} | ||
//Assert (dist == 256, "tr_static_init: dist != 256"); | ||
dist >>= 7; /* from now on, all distances are divided by 128 */ | ||
} //Assert (dist == 256, "tr_static_init: dist != 256"); | ||
dist >>= 7; | ||
/* from now on, all distances are divided by 128 */ | ||
for (; code < D_CODES; code++) { | ||
base_dist[code] = dist << 7; | ||
for (n = 0; n < 1 << extra_dbits[code] - 7; n++) { | ||
_dist_code[256 + dist++] = code; | ||
} | ||
} | ||
//Assert (dist == 256, "tr_static_init: 256+dist != 512"); | ||
} //Assert (dist == 256, "tr_static_init: 256+dist != 512"); | ||
/* Construct the codes of the static literal tree */ | ||
for (bits = 0; bits <= MAX_BITS; bits++) { | ||
@@ -483,19 +606,31 @@ bl_count[bits] = 0; | ||
n = 0; | ||
while (n <= 143) { | ||
static_ltree[n * 2 + 1] /*.Len*/ = 8; | ||
static_ltree[n * 2 + 1] | ||
/*.Len*/ | ||
= 8; | ||
n++; | ||
bl_count[8]++; | ||
} | ||
while (n <= 255) { | ||
static_ltree[n * 2 + 1] /*.Len*/ = 9; | ||
static_ltree[n * 2 + 1] | ||
/*.Len*/ | ||
= 9; | ||
n++; | ||
bl_count[9]++; | ||
} | ||
while (n <= 279) { | ||
static_ltree[n * 2 + 1] /*.Len*/ = 7; | ||
static_ltree[n * 2 + 1] | ||
/*.Len*/ | ||
= 7; | ||
n++; | ||
bl_count[7]++; | ||
} | ||
while (n <= 287) { | ||
static_ltree[n * 2 + 1] /*.Len*/ = 8; | ||
static_ltree[n * 2 + 1] | ||
/*.Len*/ | ||
= 8; | ||
n++; | ||
@@ -508,43 +643,61 @@ bl_count[8]++; | ||
*/ | ||
gen_codes(static_ltree, L_CODES + 1, bl_count); | ||
/* The static distance tree is trivial: */ | ||
/* The static distance tree is trivial: */ | ||
for (n = 0; n < D_CODES; n++) { | ||
static_dtree[n * 2 + 1] /*.Len*/ = 5; | ||
static_dtree[n * 2] /*.Code*/ = bi_reverse(n, 5); | ||
} | ||
static_dtree[n * 2 + 1] | ||
/*.Len*/ | ||
= 5; | ||
static_dtree[n * 2] | ||
/*.Code*/ | ||
= bi_reverse(n, 5); | ||
} // Now data ready and we can init static trees | ||
// Now data ready and we can init static trees | ||
static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); | ||
static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); | ||
static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); | ||
//static_init_done = true; | ||
static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); //static_init_done = true; | ||
} | ||
/* =========================================================================== | ||
* Initialize a new block. | ||
*/ | ||
function init_block(s) { | ||
var n; /* iterates over tree elements */ | ||
var n; | ||
/* iterates over tree elements */ | ||
/* Initialize the trees. */ | ||
for (n = 0; n < L_CODES; n++) { | ||
s.dyn_ltree[n * 2] /*.Freq*/ = 0; | ||
s.dyn_ltree[n * 2] | ||
/*.Freq*/ | ||
= 0; | ||
} | ||
for (n = 0; n < D_CODES; n++) { | ||
s.dyn_dtree[n * 2] /*.Freq*/ = 0; | ||
s.dyn_dtree[n * 2] | ||
/*.Freq*/ | ||
= 0; | ||
} | ||
for (n = 0; n < BL_CODES; n++) { | ||
s.bl_tree[n * 2] /*.Freq*/ = 0; | ||
s.bl_tree[n * 2] | ||
/*.Freq*/ | ||
= 0; | ||
} | ||
s.dyn_ltree[END_BLOCK * 2] /*.Freq*/ = 1; | ||
s.dyn_ltree[END_BLOCK * 2] | ||
/*.Freq*/ | ||
= 1; | ||
s.opt_len = s.static_len = 0; | ||
s.last_lit = s.matches = 0; | ||
} | ||
/* =========================================================================== | ||
* Flush the bit buffer and align the output on a byte boundary | ||
*/ | ||
function bi_windup(s) { | ||
@@ -557,6 +710,6 @@ if (s.bi_valid > 8) { | ||
} | ||
s.bi_buf = 0; | ||
s.bi_valid = 0; | ||
} | ||
/* =========================================================================== | ||
@@ -566,4 +719,5 @@ * Copy a stored block, storing first the length and its | ||
*/ | ||
function copy_block(s, buf, len, header) | ||
//DeflateState *s; | ||
function copy_block(s, buf, len, header) //DeflateState *s; | ||
//charf *buf; /* the input data */ | ||
@@ -573,3 +727,4 @@ //unsigned len; /* its length */ | ||
{ | ||
bi_windup(s); /* align on byte boundary */ | ||
bi_windup(s); | ||
/* align on byte boundary */ | ||
@@ -579,10 +734,10 @@ if (header) { | ||
put_short(s, ~len); | ||
} | ||
// while (len--) { | ||
} // while (len--) { | ||
// put_byte(s, *buf++); | ||
// } | ||
utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); | ||
s.pending += len; | ||
} | ||
/* =========================================================================== | ||
@@ -592,8 +747,19 @@ * Compares to subtrees, using the tree depth as tie breaker when | ||
*/ | ||
function smaller(tree, n, m, depth) { | ||
var _n2 = n * 2; | ||
var _m2 = m * 2; | ||
return tree[_n2] /*.Freq*/ < tree[_m2] /*.Freq*/ || tree[_n2] /*.Freq*/ === tree[_m2] /*.Freq*/ && depth[n] <= depth[m]; | ||
return tree[_n2] | ||
/*.Freq*/ | ||
< tree[_m2] | ||
/*.Freq*/ | ||
|| tree[_n2] | ||
/*.Freq*/ | ||
=== tree[_m2] | ||
/*.Freq*/ | ||
&& depth[n] <= depth[m]; | ||
} | ||
/* =========================================================================== | ||
@@ -605,4 +771,5 @@ * Restore the heap property by moving down the tree starting at node k, | ||
*/ | ||
function pqdownheap(s, tree, k) | ||
// deflate_state *s; | ||
function pqdownheap(s, tree, k) // deflate_state *s; | ||
// ct_data *tree; /* the tree to restore */ | ||
@@ -612,3 +779,5 @@ // int k; /* node to move down */ | ||
var v = s.heap[k]; | ||
var j = k << 1; /* left son of k */ | ||
var j = k << 1; | ||
/* left son of k */ | ||
while (j <= s.heap_len) { | ||
@@ -620,17 +789,19 @@ /* Set j to the smallest of the two sons: */ | ||
/* Exit if v is smaller than both sons */ | ||
if (smaller(tree, v, s.heap[j], s.depth)) { | ||
break; | ||
} | ||
/* Exchange v with the smallest son */ | ||
/* Exchange v with the smallest son */ | ||
s.heap[k] = s.heap[j]; | ||
k = j; | ||
/* And continue down the tree, setting j to the left son of k */ | ||
/* And continue down the tree, setting j to the left son of k */ | ||
j <<= 1; | ||
} | ||
s.heap[k] = v; | ||
} | ||
// inlined manually | ||
} // inlined manually | ||
// var SMALLEST = 1; | ||
@@ -641,13 +812,23 @@ | ||
*/ | ||
function compress_block(s, ltree, dtree) | ||
// deflate_state *s; | ||
function compress_block(s, ltree, dtree) // deflate_state *s; | ||
// const ct_data *ltree; /* literal tree */ | ||
// const ct_data *dtree; /* distance tree */ | ||
{ | ||
var dist; /* distance of matched string */ | ||
var lc; /* match length or unmatched char (if dist == 0) */ | ||
var lx = 0; /* running index in l_buf */ | ||
var code; /* the code to send */ | ||
var extra; /* number of extra bits to send */ | ||
var dist; | ||
/* distance of matched string */ | ||
var lc; | ||
/* match length or unmatched char (if dist == 0) */ | ||
var lx = 0; | ||
/* running index in l_buf */ | ||
var code; | ||
/* the code to send */ | ||
var extra; | ||
/* number of extra bits to send */ | ||
if (s.last_lit !== 0) { | ||
@@ -660,3 +841,4 @@ do { | ||
if (dist === 0) { | ||
send_code(s, lc, ltree); /* send a literal byte */ | ||
send_code(s, lc, ltree); | ||
/* send a literal byte */ | ||
//Tracecv(isgraph(lc), (stderr," '%c' ", lc)); | ||
@@ -666,19 +848,30 @@ } else { | ||
code = _length_code[lc]; | ||
send_code(s, code + LITERALS + 1, ltree); /* send the length code */ | ||
send_code(s, code + LITERALS + 1, ltree); | ||
/* send the length code */ | ||
extra = extra_lbits[code]; | ||
if (extra !== 0) { | ||
lc -= base_length[code]; | ||
send_bits(s, lc, extra); /* send the extra length bits */ | ||
send_bits(s, lc, extra); | ||
/* send the extra length bits */ | ||
} | ||
dist--; /* dist is now the match distance - 1 */ | ||
code = d_code(dist); | ||
//Assert (code < D_CODES, "bad d_code"); | ||
send_code(s, code, dtree); /* send the distance code */ | ||
dist--; | ||
/* dist is now the match distance - 1 */ | ||
code = d_code(dist); //Assert (code < D_CODES, "bad d_code"); | ||
send_code(s, code, dtree); | ||
/* send the distance code */ | ||
extra = extra_dbits[code]; | ||
if (extra !== 0) { | ||
dist -= base_dist[code]; | ||
send_bits(s, dist, extra); /* send the extra distance bits */ | ||
send_bits(s, dist, extra); | ||
/* send the extra distance bits */ | ||
} | ||
} /* literal or match pair ? */ | ||
} | ||
/* literal or match pair ? */ | ||
@@ -688,2 +881,3 @@ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ | ||
// "pendingBuf overflow"); | ||
} while (lx < s.last_lit); | ||
@@ -694,3 +888,2 @@ } | ||
} | ||
/* =========================================================================== | ||
@@ -704,4 +897,5 @@ * Construct one Huffman tree and assigns the code bit strings and lengths. | ||
*/ | ||
function build_tree(s, desc) | ||
// deflate_state *s; | ||
function build_tree(s, desc) // deflate_state *s; | ||
// tree_desc *desc; /* the tree descriptor */ | ||
@@ -713,6 +907,11 @@ { | ||
var elems = desc.stat_desc.elems; | ||
var n, m; /* iterate over heap elements */ | ||
var max_code = -1; /* largest code with non zero frequency */ | ||
var node; /* new node being created */ | ||
var n, m; | ||
/* iterate over heap elements */ | ||
var max_code = -1; | ||
/* largest code with non zero frequency */ | ||
var node; | ||
/* new node being created */ | ||
/* Construct the initial heap, with least frequent element in | ||
@@ -722,2 +921,3 @@ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. | ||
*/ | ||
s.heap_len = 0; | ||
@@ -727,10 +927,13 @@ s.heap_max = HEAP_SIZE; | ||
for (n = 0; n < elems; n++) { | ||
if (tree[n * 2] /*.Freq*/ !== 0) { | ||
if (tree[n * 2] | ||
/*.Freq*/ | ||
!== 0) { | ||
s.heap[++s.heap_len] = max_code = n; | ||
s.depth[n] = 0; | ||
} else { | ||
tree[n * 2 + 1] /*.Len*/ = 0; | ||
tree[n * 2 + 1] | ||
/*.Len*/ | ||
= 0; | ||
} | ||
} | ||
/* The pkzip format requires that at least one distance code exists, | ||
@@ -741,5 +944,9 @@ * and that at least one bit should be sent even if there is only one | ||
*/ | ||
while (s.heap_len < 2) { | ||
node = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0; | ||
tree[node * 2] /*.Freq*/ = 1; | ||
tree[node * 2] | ||
/*.Freq*/ | ||
= 1; | ||
s.depth[node] = 0; | ||
@@ -749,53 +956,89 @@ s.opt_len--; | ||
if (has_stree) { | ||
s.static_len -= stree[node * 2 + 1] /*.Len*/; | ||
s.static_len -= stree[node * 2 + 1] | ||
/*.Len*/ | ||
; | ||
} | ||
/* node is 0 or 1 so it does not have extra bits */ | ||
} | ||
desc.max_code = max_code; | ||
/* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, | ||
* establish sub-heaps of increasing lengths: | ||
*/ | ||
for (n = s.heap_len >> 1 /*int /2*/; n >= 1; n--) { | ||
for (n = s.heap_len >> 1 | ||
/*int /2*/ | ||
; n >= 1; n--) { | ||
pqdownheap(s, tree, n); | ||
} | ||
/* Construct the Huffman tree by repeatedly combining the least two | ||
* frequent nodes. | ||
*/ | ||
node = elems; /* next internal node of the tree */ | ||
node = elems; | ||
/* next internal node of the tree */ | ||
do { | ||
//pqremove(s, tree, n); /* n = node of least frequency */ | ||
/*** pqremove ***/ | ||
n = s.heap[1 /*SMALLEST*/]; | ||
s.heap[1 /*SMALLEST*/] = s.heap[s.heap_len--]; | ||
pqdownheap(s, tree, 1 /*SMALLEST*/); | ||
n = s.heap[1 | ||
/*SMALLEST*/ | ||
]; | ||
s.heap[1 | ||
/*SMALLEST*/ | ||
] = s.heap[s.heap_len--]; | ||
pqdownheap(s, tree, 1 | ||
/*SMALLEST*/ | ||
); | ||
/***/ | ||
m = s.heap[1 /*SMALLEST*/]; /* m = node of next least frequency */ | ||
m = s.heap[1 | ||
/*SMALLEST*/ | ||
]; | ||
/* m = node of next least frequency */ | ||
s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ | ||
s.heap[--s.heap_max] = n; | ||
/* keep the nodes sorted by frequency */ | ||
s.heap[--s.heap_max] = m; | ||
/* Create a new node father of n and m */ | ||
/* Create a new node father of n and m */ | ||
tree[node * 2] /*.Freq*/ = tree[n * 2] /*.Freq*/ + tree[m * 2] /*.Freq*/; | ||
tree[node * 2] | ||
/*.Freq*/ | ||
= tree[n * 2] | ||
/*.Freq*/ | ||
+ tree[m * 2] | ||
/*.Freq*/ | ||
; | ||
s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; | ||
tree[n * 2 + 1] /*.Dad*/ = tree[m * 2 + 1] /*.Dad*/ = node; | ||
tree[n * 2 + 1] | ||
/*.Dad*/ | ||
= tree[m * 2 + 1] | ||
/*.Dad*/ | ||
= node; | ||
/* and insert the new node in the heap */ | ||
/* and insert the new node in the heap */ | ||
s.heap[1 /*SMALLEST*/] = node++; | ||
pqdownheap(s, tree, 1 /*SMALLEST*/); | ||
s.heap[1 | ||
/*SMALLEST*/ | ||
] = node++; | ||
pqdownheap(s, tree, 1 | ||
/*SMALLEST*/ | ||
); | ||
} while (s.heap_len >= 2); | ||
s.heap[--s.heap_max] = s.heap[1 /*SMALLEST*/]; | ||
s.heap[--s.heap_max] = s.heap[1 | ||
/*SMALLEST*/ | ||
]; | ||
/* At this point, the fields freq and dad are set. We can now | ||
* generate the bit lengths. | ||
*/ | ||
gen_bitlen(s, desc); | ||
/* The field len is now set, we can generate the bit codes */ | ||
/* The field len is now set, we can generate the bit codes */ | ||
gen_codes(tree, max_code, s.bl_count); | ||
} | ||
/* =========================================================================== | ||
@@ -805,17 +1048,31 @@ * Scan a literal or distance tree to determine the frequencies of the codes | ||
*/ | ||
function scan_tree(s, tree, max_code) | ||
// deflate_state *s; | ||
function scan_tree(s, tree, max_code) // deflate_state *s; | ||
// ct_data *tree; /* the tree to be scanned */ | ||
// int max_code; /* and its largest code of non zero frequency */ | ||
{ | ||
var n; /* iterates over all tree elements */ | ||
var prevlen = -1; /* last emitted length */ | ||
var curlen; /* length of current code */ | ||
var n; | ||
/* iterates over all tree elements */ | ||
var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ | ||
var prevlen = -1; | ||
/* last emitted length */ | ||
var count = 0; /* repeat count of the current code */ | ||
var max_count = 7; /* max repeat count */ | ||
var min_count = 4; /* min repeat count */ | ||
var curlen; | ||
/* length of current code */ | ||
var nextlen = tree[0 * 2 + 1] | ||
/*.Len*/ | ||
; | ||
/* length of next code */ | ||
var count = 0; | ||
/* repeat count of the current code */ | ||
var max_count = 7; | ||
/* max repeat count */ | ||
var min_count = 4; | ||
/* min repeat count */ | ||
if (nextlen === 0) { | ||
@@ -825,7 +1082,13 @@ max_count = 138; | ||
} | ||
tree[(max_code + 1) * 2 + 1] /*.Len*/ = 0xffff; /* guard */ | ||
tree[(max_code + 1) * 2 + 1] | ||
/*.Len*/ | ||
= 0xffff; | ||
/* guard */ | ||
for (n = 0; n <= max_code; n++) { | ||
curlen = nextlen; | ||
nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; | ||
nextlen = tree[(n + 1) * 2 + 1] | ||
/*.Len*/ | ||
; | ||
@@ -835,8 +1098,10 @@ if (++count < max_count && curlen === nextlen) { | ||
} else if (count < min_count) { | ||
s.bl_tree[curlen * 2] /*.Freq*/ += count; | ||
s.bl_tree[curlen * 2] | ||
/*.Freq*/ | ||
+= count; | ||
} else if (curlen !== 0) { | ||
if (curlen !== prevlen) { | ||
s.bl_tree[curlen * 2] /*.Freq*/++; | ||
} | ||
s.bl_tree[REP_3_6 * 2] /*.Freq*/++; | ||
@@ -864,3 +1129,2 @@ } else if (count <= 10) { | ||
} | ||
/* =========================================================================== | ||
@@ -870,18 +1134,35 @@ * Send a literal or distance tree in compressed form, using the codes in | ||
*/ | ||
function send_tree(s, tree, max_code) | ||
// deflate_state *s; | ||
function send_tree(s, tree, max_code) // deflate_state *s; | ||
// ct_data *tree; /* the tree to be scanned */ | ||
// int max_code; /* and its largest code of non zero frequency */ | ||
{ | ||
var n; /* iterates over all tree elements */ | ||
var prevlen = -1; /* last emitted length */ | ||
var curlen; /* length of current code */ | ||
var n; | ||
/* iterates over all tree elements */ | ||
var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ | ||
var prevlen = -1; | ||
/* last emitted length */ | ||
var count = 0; /* repeat count of the current code */ | ||
var max_count = 7; /* max repeat count */ | ||
var min_count = 4; /* min repeat count */ | ||
var curlen; | ||
/* length of current code */ | ||
/* tree[max_code+1].Len = -1; */ /* guard already set */ | ||
var nextlen = tree[0 * 2 + 1] | ||
/*.Len*/ | ||
; | ||
/* length of next code */ | ||
var count = 0; | ||
/* repeat count of the current code */ | ||
var max_count = 7; | ||
/* max repeat count */ | ||
var min_count = 4; | ||
/* min repeat count */ | ||
/* tree[max_code+1].Len = -1; */ | ||
/* guard already set */ | ||
if (nextlen === 0) { | ||
@@ -894,3 +1175,5 @@ max_count = 138; | ||
curlen = nextlen; | ||
nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; | ||
nextlen = tree[(n + 1) * 2 + 1] | ||
/*.Len*/ | ||
; | ||
@@ -907,4 +1190,5 @@ if (++count < max_count && curlen === nextlen) { | ||
count--; | ||
} | ||
//Assert(count >= 3 && count <= 6, " 3_6?"); | ||
} //Assert(count >= 3 && count <= 6, " 3_6?"); | ||
send_code(s, REP_3_6, s.bl_tree); | ||
@@ -922,2 +1206,3 @@ send_bits(s, count - 3, 2); | ||
prevlen = curlen; | ||
if (nextlen === 0) { | ||
@@ -935,3 +1220,2 @@ max_count = 138; | ||
} | ||
/* =========================================================================== | ||
@@ -941,10 +1225,14 @@ * Construct the Huffman tree for the bit lengths and return the index in | ||
*/ | ||
function build_bl_tree(s) { | ||
var max_blindex; /* index of last bit length code of non zero freq */ | ||
var max_blindex; | ||
/* index of last bit length code of non zero freq */ | ||
/* Determine the bit length frequencies for literal and distance trees */ | ||
scan_tree(s, s.dyn_ltree, s.l_desc.max_code); | ||
scan_tree(s, s.dyn_dtree, s.d_desc.max_code); | ||
/* Build the bit length tree: */ | ||
/* Build the bit length tree: */ | ||
build_tree(s, s.bl_desc); | ||
@@ -959,4 +1247,7 @@ /* opt_len now includes the length of the tree representations, except | ||
*/ | ||
for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { | ||
if (s.bl_tree[bl_order[max_blindex] * 2 + 1] /*.Len*/ !== 0) { | ||
if (s.bl_tree[bl_order[max_blindex] * 2 + 1] | ||
/*.Len*/ | ||
!== 0) { | ||
break; | ||
@@ -966,4 +1257,5 @@ } | ||
/* Update opt_len to include the bit length tree and counts */ | ||
s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; | ||
//Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", | ||
s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", | ||
// s->opt_len, s->static_len)); | ||
@@ -973,3 +1265,2 @@ | ||
} | ||
/* =========================================================================== | ||
@@ -980,8 +1271,9 @@ * Send the header for a block using dynamic Huffman trees: the counts, the | ||
*/ | ||
function send_all_trees(s, lcodes, dcodes, blcodes) | ||
// deflate_state *s; | ||
function send_all_trees(s, lcodes, dcodes, blcodes) // deflate_state *s; | ||
// int lcodes, dcodes, blcodes; /* number of codes for each tree */ | ||
{ | ||
var rank; /* index in bl_order */ | ||
var rank; | ||
/* index in bl_order */ | ||
//Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); | ||
@@ -991,18 +1283,26 @@ //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, | ||
//Tracev((stderr, "\nbl counts: ")); | ||
send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ | ||
send_bits(s, lcodes - 257, 5); | ||
/* not +255 as stated in appnote.txt */ | ||
send_bits(s, dcodes - 1, 5); | ||
send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ | ||
send_bits(s, blcodes - 4, 4); | ||
/* not -3 as stated in appnote.txt */ | ||
for (rank = 0; rank < blcodes; rank++) { | ||
//Tracev((stderr, "\nbl code %2d ", bl_order[rank])); | ||
send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1] /*.Len*/, 3); | ||
} | ||
//Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); | ||
send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1] | ||
/*.Len*/ | ||
, 3); | ||
} //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); | ||
send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ | ||
send_tree(s, s.dyn_ltree, lcodes - 1); | ||
/* literal tree */ | ||
//Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); | ||
send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ | ||
send_tree(s, s.dyn_dtree, dcodes - 1); | ||
/* distance tree */ | ||
//Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); | ||
} | ||
/* =========================================================================== | ||
@@ -1021,2 +1321,4 @@ * Check if the data type is TEXT or BINARY, using the following algorithm: | ||
*/ | ||
function detect_data_type(s) { | ||
@@ -1029,23 +1331,36 @@ /* black_mask is the bit mask of black-listed bytes | ||
var n; | ||
/* Check for non-textual ("black-listed") bytes. */ | ||
/* Check for non-textual ("black-listed") bytes. */ | ||
for (n = 0; n <= 31; n++, black_mask >>>= 1) { | ||
if (black_mask & 1 && s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { | ||
if (black_mask & 1 && s.dyn_ltree[n * 2] | ||
/*.Freq*/ | ||
!== 0) { | ||
return Z_BINARY; | ||
} | ||
} | ||
/* Check for textual ("white-listed") bytes. */ | ||
/* Check for textual ("white-listed") bytes. */ | ||
if (s.dyn_ltree[9 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[10 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[13 * 2] /*.Freq*/ !== 0) { | ||
if (s.dyn_ltree[9 * 2] | ||
/*.Freq*/ | ||
!== 0 || s.dyn_ltree[10 * 2] | ||
/*.Freq*/ | ||
!== 0 || s.dyn_ltree[13 * 2] | ||
/*.Freq*/ | ||
!== 0) { | ||
return Z_TEXT; | ||
} | ||
for (n = 32; n < LITERALS; n++) { | ||
if (s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { | ||
if (s.dyn_ltree[n * 2] | ||
/*.Freq*/ | ||
!== 0) { | ||
return Z_TEXT; | ||
} | ||
} | ||
/* There are no "black-listed" or "white-listed" bytes: | ||
* this stream either is empty or has tolerated ("gray-listed") bytes only. | ||
*/ | ||
return Z_BINARY; | ||
@@ -1055,8 +1370,7 @@ } | ||
var static_init_done = false; | ||
/* =========================================================================== | ||
* Initialize the tree data structures for a new zlib stream. | ||
*/ | ||
function _tr_init(s) { | ||
if (!static_init_done) { | ||
@@ -1070,15 +1384,14 @@ tr_static_init(); | ||
s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); | ||
s.bi_buf = 0; | ||
s.bi_valid = 0; | ||
/* Initialize the first block of the first file: */ | ||
/* Initialize the first block of the first file: */ | ||
init_block(s); | ||
} | ||
/* =========================================================================== | ||
* Send a stored block | ||
*/ | ||
function _tr_stored_block(s, buf, stored_len, last) | ||
//DeflateState *s; | ||
function _tr_stored_block(s, buf, stored_len, last) //DeflateState *s; | ||
//charf *buf; /* input block */ | ||
@@ -1088,6 +1401,8 @@ //ulg stored_len; /* length of input block */ | ||
{ | ||
send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ | ||
copy_block(s, buf, stored_len, true); /* with header */ | ||
send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); | ||
/* send block type */ | ||
copy_block(s, buf, stored_len, true); | ||
/* with header */ | ||
} | ||
/* =========================================================================== | ||
@@ -1097,2 +1412,4 @@ * Send one empty static block to give enough lookahead for inflate. | ||
*/ | ||
function _tr_align(s) { | ||
@@ -1103,3 +1420,2 @@ send_bits(s, STATIC_TREES << 1, 3); | ||
} | ||
/* =========================================================================== | ||
@@ -1109,4 +1425,5 @@ * Determine the best encoding for the current block: dynamic trees, static | ||
*/ | ||
function _tr_flush_block(s, buf, stored_len, last) | ||
//DeflateState *s; | ||
function _tr_flush_block(s, buf, stored_len, last) //DeflateState *s; | ||
//charf *buf; /* input block, or NULL if too old */ | ||
@@ -1116,8 +1433,11 @@ //ulg stored_len; /* length of input block */ | ||
{ | ||
var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ | ||
var max_blindex = 0; /* index of last bit length code of non zero freq */ | ||
var opt_lenb, static_lenb; | ||
/* opt_len and static_len in bytes */ | ||
var max_blindex = 0; | ||
/* index of last bit length code of non zero freq */ | ||
/* Build the Huffman trees unless a stored block is forced */ | ||
if (s.level > 0) { | ||
/* Check if the file is binary or text */ | ||
@@ -1127,11 +1447,11 @@ if (s.strm.data_type === Z_UNKNOWN) { | ||
} | ||
/* Construct the literal and distance trees */ | ||
/* Construct the literal and distance trees */ | ||
build_tree(s, s.l_desc); | ||
// Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, | ||
build_tree(s, s.l_desc); // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, | ||
// s->static_len)); | ||
build_tree(s, s.d_desc); | ||
// Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, | ||
build_tree(s, s.d_desc); // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, | ||
// s->static_len)); | ||
/* At this point, opt_len and static_len are the total bit lengths of | ||
@@ -1144,9 +1464,8 @@ * the compressed block data, excluding the tree representations. | ||
*/ | ||
max_blindex = build_bl_tree(s); | ||
/* Determine the best encoding. Compute the block lengths in bytes. */ | ||
/* Determine the best encoding. Compute the block lengths in bytes. */ | ||
opt_lenb = s.opt_len + 3 + 7 >>> 3; | ||
static_lenb = s.static_len + 3 + 7 >>> 3; | ||
// Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", | ||
static_lenb = s.static_len + 3 + 7 >>> 3; // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", | ||
// opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, | ||
@@ -1160,3 +1479,4 @@ // s->last_lit)); | ||
// Assert(buf != (char*)0, "lost buf"); | ||
opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ | ||
opt_lenb = static_lenb = stored_len + 5; | ||
/* force a stored block */ | ||
} | ||
@@ -1175,3 +1495,2 @@ | ||
} else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { | ||
send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); | ||
@@ -1183,7 +1502,9 @@ compress_block(s, static_ltree, static_dtree); | ||
compress_block(s, s.dyn_ltree, s.dyn_dtree); | ||
} | ||
// Assert (s->compressed_len == s->bits_sent, "bad compressed size"); | ||
} // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); | ||
/* The above check is made mod 2^32, for files larger than 512 MB | ||
* and uLong implemented on 32 bits. | ||
*/ | ||
init_block(s); | ||
@@ -1193,7 +1514,6 @@ | ||
bi_windup(s); | ||
} | ||
// Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, | ||
} // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, | ||
// s->compressed_len-7*last)); | ||
} | ||
/* =========================================================================== | ||
@@ -1203,4 +1523,5 @@ * Save the match info and tally the frequency counts. Return true if | ||
*/ | ||
function _tr_tally(s, dist, lc) | ||
// deflate_state *s; | ||
function _tr_tally(s, dist, lc) // deflate_state *s; | ||
// unsigned dist; /* distance of matched string */ | ||
@@ -1210,6 +1531,4 @@ // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ | ||
//var out_length, in_length, dcode; | ||
s.pending_buf[s.d_buf + s.last_lit * 2] = dist >>> 8 & 0xff; | ||
s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; | ||
s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; | ||
@@ -1224,3 +1543,5 @@ s.last_lit++; | ||
/* Here, lc is the match length - MIN_MATCH */ | ||
dist--; /* dist = match distance - 1 */ | ||
dist--; | ||
/* dist = match distance - 1 */ | ||
//Assert((ush)dist < (ush)MAX_DIST(s) && | ||
@@ -1232,7 +1553,4 @@ // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && | ||
s.dyn_dtree[d_code(dist) * 2] /*.Freq*/++; | ||
} | ||
// (!) This block is disabled in zlib defailts, | ||
} // (!) This block is disabled in zlib defailts, | ||
// don't enable it for binary compatibility | ||
//#ifdef TRUNCATE_BLOCK | ||
@@ -1258,2 +1576,3 @@ // /* Try to guess if it is profitable to stop the current block here */ | ||
return s.last_lit === s.lit_bufsize - 1; | ||
@@ -1264,8 +1583,2 @@ /* We avoid equality with lit_bufsize because of wraparound at 64K | ||
*/ | ||
} | ||
exports._tr_init = _tr_init; | ||
exports._tr_stored_block = _tr_stored_block; | ||
exports._tr_flush_block = _tr_flush_block; | ||
exports._tr_tally = _tr_tally; | ||
exports._tr_align = _tr_align; | ||
} |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -6,26 +6,42 @@ Object.defineProperty(exports, "__esModule", { | ||
}); | ||
exports.default = ZStream; | ||
exports["default"] = ZStream; | ||
function ZStream() { | ||
/* next input byte */ | ||
this.input = null; // JS specific, because we have no pointers | ||
this.next_in = 0; | ||
/* number of bytes available at input */ | ||
this.avail_in = 0; | ||
/* total number of input bytes read so far */ | ||
this.total_in = 0; | ||
/* next output byte should be put there */ | ||
this.output = null; // JS specific, because we have no pointers | ||
this.next_out = 0; | ||
/* remaining free space at output */ | ||
this.avail_out = 0; | ||
/* total number of bytes output so far */ | ||
this.total_out = 0; | ||
/* last error message, NULL if no error */ | ||
this.msg = '' /*Z_NULL*/; | ||
this.msg = '' | ||
/*Z_NULL*/ | ||
; | ||
/* not visible by applications */ | ||
this.state = null; | ||
/* best guess about the data type: binary or text */ | ||
this.data_type = 2 /*Z_UNKNOWN*/; | ||
this.data_type = 2 | ||
/*Z_UNKNOWN*/ | ||
; | ||
/* adler32 value of the uncompressed data */ | ||
this.adler = 0; | ||
} |
@@ -1,361 +0,421 @@ | ||
'use strict'; | ||
"use strict"; | ||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* | ||
* Websock: high-performance binary WebSockets | ||
* Copyright (C) 2018 The noVNC Authors | ||
* Licensed under MPL 2.0 (see LICENSE.txt) | ||
* | ||
* Websock is similar to the standard WebSocket object but with extra | ||
* buffer handling. | ||
* | ||
* Websock has built-in receive queue buffering; the message event | ||
* does not contain actual data but is simply a notification that | ||
* there is new data available. Several rQ* methods are available to | ||
* read binary data off of the receive queue. | ||
*/ | ||
var Log = _interopRequireWildcard(require("./util/logging.js")); | ||
var _logging = require('./util/logging.js'); | ||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } | ||
var Log = _interopRequireWildcard(_logging); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } | ||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } | ||
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } | ||
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } | ||
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } | ||
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
// this has performance issues in some versions Chromium, and | ||
// doesn't gain a tremendous amount of performance increase in Firefox | ||
// at the moment. It may be valuable to turn it on in the future. | ||
var ENABLE_COPYWITHIN = false; | ||
var MAX_RQ_GROW_SIZE = 40 * 1024 * 1024; // 40 MiB | ||
// Constants pulled from RTCDataChannelState enum | ||
// https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel/readyState#RTCDataChannelState_enum | ||
var Websock = function () { | ||
function Websock() { | ||
_classCallCheck(this, Websock); | ||
var DataChannel = { | ||
CONNECTING: "connecting", | ||
OPEN: "open", | ||
CLOSING: "closing", | ||
CLOSED: "closed" | ||
}; | ||
var ReadyStates = { | ||
CONNECTING: [WebSocket.CONNECTING, DataChannel.CONNECTING], | ||
OPEN: [WebSocket.OPEN, DataChannel.OPEN], | ||
CLOSING: [WebSocket.CLOSING, DataChannel.CLOSING], | ||
CLOSED: [WebSocket.CLOSED, DataChannel.CLOSED] | ||
}; // Properties a raw channel must have, WebSocket and RTCDataChannel are two examples | ||
this._websocket = null; // WebSocket object | ||
var rawChannelProps = ["send", "close", "binaryType", "onerror", "onmessage", "onopen", "protocol", "readyState"]; | ||
this._rQi = 0; // Receive queue index | ||
this._rQlen = 0; // Next write position in the receive queue | ||
this._rQbufferSize = 1024 * 1024 * 4; // Receive queue buffer size (4 MiB) | ||
this._rQmax = this._rQbufferSize / 8; | ||
// called in init: this._rQ = new Uint8Array(this._rQbufferSize); | ||
this._rQ = null; // Receive queue | ||
var Websock = /*#__PURE__*/function () { | ||
function Websock() { | ||
_classCallCheck(this, Websock); | ||
this._sQbufferSize = 1024 * 10; // 10 KiB | ||
// called in init: this._sQ = new Uint8Array(this._sQbufferSize); | ||
this._sQlen = 0; | ||
this._sQ = null; // Send queue | ||
this._websocket = null; // WebSocket or RTCDataChannel object | ||
this._eventHandlers = { | ||
message: function message() {}, | ||
open: function open() {}, | ||
close: function close() {}, | ||
error: function error() {} | ||
}; | ||
this._rQi = 0; // Receive queue index | ||
this._rQlen = 0; // Next write position in the receive queue | ||
this._rQbufferSize = 1024 * 1024 * 4; // Receive queue buffer size (4 MiB) | ||
// called in init: this._rQ = new Uint8Array(this._rQbufferSize); | ||
this._rQ = null; // Receive queue | ||
this._sQbufferSize = 1024 * 10; // 10 KiB | ||
// called in init: this._sQ = new Uint8Array(this._sQbufferSize); | ||
this._sQlen = 0; | ||
this._sQ = null; // Send queue | ||
this._eventHandlers = { | ||
message: function message() {}, | ||
open: function open() {}, | ||
close: function close() {}, | ||
error: function error() {} | ||
}; | ||
} // Getters and Setters | ||
_createClass(Websock, [{ | ||
key: "sQ", | ||
get: function get() { | ||
return this._sQ; | ||
} | ||
}, { | ||
key: "rQ", | ||
get: function get() { | ||
return this._rQ; | ||
} | ||
}, { | ||
key: "rQi", | ||
get: function get() { | ||
return this._rQi; | ||
}, | ||
set: function set(val) { | ||
this._rQi = val; | ||
} // Receive Queue | ||
// Getters and Setters | ||
}, { | ||
key: "rQlen", | ||
get: function get() { | ||
return this._rQlen - this._rQi; | ||
} | ||
}, { | ||
key: "rQpeek8", | ||
value: function rQpeek8() { | ||
return this._rQ[this._rQi]; | ||
} | ||
}, { | ||
key: "rQskipBytes", | ||
value: function rQskipBytes(bytes) { | ||
this._rQi += bytes; | ||
} | ||
}, { | ||
key: "rQshift8", | ||
value: function rQshift8() { | ||
return this._rQshift(1); | ||
} | ||
}, { | ||
key: "rQshift16", | ||
value: function rQshift16() { | ||
return this._rQshift(2); | ||
} | ||
}, { | ||
key: "rQshift32", | ||
value: function rQshift32() { | ||
return this._rQshift(4); | ||
} // TODO(directxman12): test performance with these vs a DataView | ||
}, { | ||
key: "_rQshift", | ||
value: function _rQshift(bytes) { | ||
var res = 0; | ||
_createClass(Websock, [{ | ||
key: 'rQpeek8', | ||
value: function rQpeek8() { | ||
return this._rQ[this._rQi]; | ||
} | ||
}, { | ||
key: 'rQskipBytes', | ||
value: function rQskipBytes(bytes) { | ||
this._rQi += bytes; | ||
} | ||
}, { | ||
key: 'rQshift8', | ||
value: function rQshift8() { | ||
return this._rQshift(1); | ||
} | ||
}, { | ||
key: 'rQshift16', | ||
value: function rQshift16() { | ||
return this._rQshift(2); | ||
} | ||
}, { | ||
key: 'rQshift32', | ||
value: function rQshift32() { | ||
return this._rQshift(4); | ||
} | ||
for (var _byte = bytes - 1; _byte >= 0; _byte--) { | ||
res += this._rQ[this._rQi++] << _byte * 8; | ||
} | ||
// TODO(directxman12): test performance with these vs a DataView | ||
return res; | ||
} | ||
}, { | ||
key: "rQshiftStr", | ||
value: function rQshiftStr(len) { | ||
if (typeof len === 'undefined') { | ||
len = this.rQlen; | ||
} | ||
}, { | ||
key: '_rQshift', | ||
value: function _rQshift(bytes) { | ||
var res = 0; | ||
for (var byte = bytes - 1; byte >= 0; byte--) { | ||
res += this._rQ[this._rQi++] << byte * 8; | ||
} | ||
return res; | ||
} | ||
}, { | ||
key: 'rQshiftStr', | ||
value: function rQshiftStr(len) { | ||
if (typeof len === 'undefined') { | ||
len = this.rQlen; | ||
} | ||
var str = ""; | ||
// Handle large arrays in steps to avoid long strings on the stack | ||
for (var i = 0; i < len; i += 4096) { | ||
var part = this.rQshiftBytes(Math.min(4096, len - i)); | ||
str += String.fromCharCode.apply(null, part); | ||
} | ||
return str; | ||
} | ||
}, { | ||
key: 'rQshiftBytes', | ||
value: function rQshiftBytes(len) { | ||
if (typeof len === 'undefined') { | ||
len = this.rQlen; | ||
} | ||
this._rQi += len; | ||
return new Uint8Array(this._rQ.buffer, this._rQi - len, len); | ||
} | ||
}, { | ||
key: 'rQshiftTo', | ||
value: function rQshiftTo(target, len) { | ||
if (len === undefined) { | ||
len = this.rQlen; | ||
} | ||
// TODO: make this just use set with views when using a ArrayBuffer to store the rQ | ||
target.set(new Uint8Array(this._rQ.buffer, this._rQi, len)); | ||
this._rQi += len; | ||
} | ||
}, { | ||
key: 'rQslice', | ||
value: function rQslice(start) { | ||
var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.rQlen; | ||
var str = ""; // Handle large arrays in steps to avoid long strings on the stack | ||
return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start); | ||
} | ||
for (var i = 0; i < len; i += 4096) { | ||
var part = this.rQshiftBytes(Math.min(4096, len - i)); | ||
str += String.fromCharCode.apply(null, part); | ||
} | ||
// Check to see if we must wait for 'num' bytes (default to FBU.bytes) | ||
// to be available in the receive queue. Return true if we need to | ||
// wait (and possibly print a debug message), otherwise false. | ||
return str; | ||
} | ||
}, { | ||
key: "rQshiftBytes", | ||
value: function rQshiftBytes(len) { | ||
if (typeof len === 'undefined') { | ||
len = this.rQlen; | ||
} | ||
}, { | ||
key: 'rQwait', | ||
value: function rQwait(msg, num, goback) { | ||
if (this.rQlen < num) { | ||
if (goback) { | ||
if (this._rQi < goback) { | ||
throw new Error("rQwait cannot backup " + goback + " bytes"); | ||
} | ||
this._rQi -= goback; | ||
} | ||
return true; // true means need more data | ||
} | ||
return false; | ||
} | ||
this._rQi += len; | ||
return new Uint8Array(this._rQ.buffer, this._rQi - len, len); | ||
} | ||
}, { | ||
key: "rQshiftTo", | ||
value: function rQshiftTo(target, len) { | ||
if (len === undefined) { | ||
len = this.rQlen; | ||
} // TODO: make this just use set with views when using a ArrayBuffer to store the rQ | ||
// Send Queue | ||
}, { | ||
key: 'flush', | ||
value: function flush() { | ||
if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) { | ||
this._websocket.send(this._encode_message()); | ||
this._sQlen = 0; | ||
} | ||
} | ||
}, { | ||
key: 'send', | ||
value: function send(arr) { | ||
this._sQ.set(arr, this._sQlen); | ||
this._sQlen += arr.length; | ||
this.flush(); | ||
} | ||
}, { | ||
key: 'send_string', | ||
value: function send_string(str) { | ||
this.send(str.split('').map(function (chr) { | ||
return chr.charCodeAt(0); | ||
})); | ||
} | ||
target.set(new Uint8Array(this._rQ.buffer, this._rQi, len)); | ||
this._rQi += len; | ||
} | ||
}, { | ||
key: "rQslice", | ||
value: function rQslice(start) { | ||
var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.rQlen; | ||
return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start); | ||
} // Check to see if we must wait for 'num' bytes (default to FBU.bytes) | ||
// to be available in the receive queue. Return true if we need to | ||
// wait (and possibly print a debug message), otherwise false. | ||
// Event Handlers | ||
}, { | ||
key: "rQwait", | ||
value: function rQwait(msg, num, goback) { | ||
if (this.rQlen < num) { | ||
if (goback) { | ||
if (this._rQi < goback) { | ||
throw new Error("rQwait cannot backup " + goback + " bytes"); | ||
} | ||
}, { | ||
key: 'off', | ||
value: function off(evt) { | ||
this._eventHandlers[evt] = function () {}; | ||
this._rQi -= goback; | ||
} | ||
}, { | ||
key: 'on', | ||
value: function on(evt, handler) { | ||
this._eventHandlers[evt] = handler; | ||
} | ||
}, { | ||
key: '_allocate_buffers', | ||
value: function _allocate_buffers() { | ||
this._rQ = new Uint8Array(this._rQbufferSize); | ||
this._sQ = new Uint8Array(this._sQbufferSize); | ||
} | ||
}, { | ||
key: 'init', | ||
value: function init() { | ||
this._allocate_buffers(); | ||
this._rQi = 0; | ||
this._websocket = null; | ||
} | ||
}, { | ||
key: 'open', | ||
value: function open(socketCreator) { | ||
var _this = this; | ||
this.init(); | ||
return true; // true means need more data | ||
} | ||
this._websocket = socketCreator(); | ||
this._websocket.binaryType = 'arraybuffer'; | ||
return false; | ||
} // Send Queue | ||
this._websocket.onmessage = this._recv_message.bind(this); | ||
this._websocket.onopen = function () { | ||
Log.Debug('>> WebSock.onopen'); | ||
if (_this._websocket.protocol) { | ||
Log.Info("Server choose sub-protocol: " + _this._websocket.protocol); | ||
} | ||
}, { | ||
key: "flush", | ||
value: function flush() { | ||
if (this._sQlen > 0 && ReadyStates.OPEN.indexOf(this._websocket.readyState) >= 0) { | ||
this._websocket.send(this._encodeMessage()); | ||
_this._eventHandlers.open(); | ||
Log.Debug("<< WebSock.onopen"); | ||
}; | ||
this._websocket.onclose = function (e) { | ||
Log.Debug(">> WebSock.onclose"); | ||
_this._eventHandlers.close(e); | ||
Log.Debug("<< WebSock.onclose"); | ||
}; | ||
this._websocket.onerror = function (e) { | ||
Log.Debug(">> WebSock.onerror: " + e); | ||
_this._eventHandlers.error(e); | ||
Log.Debug("<< WebSock.onerror: " + e); | ||
}; | ||
this._sQlen = 0; | ||
} | ||
} | ||
}, { | ||
key: "send", | ||
value: function send(arr) { | ||
this._sQ.set(arr, this._sQlen); | ||
this._sQlen += arr.length; | ||
this.flush(); | ||
} | ||
}, { | ||
key: "sendString", | ||
value: function sendString(str) { | ||
this.send(str.split('').map(function (chr) { | ||
return chr.charCodeAt(0); | ||
})); | ||
} // Event Handlers | ||
}, { | ||
key: "off", | ||
value: function off(evt) { | ||
this._eventHandlers[evt] = function () {}; | ||
} | ||
}, { | ||
key: "on", | ||
value: function on(evt, handler) { | ||
this._eventHandlers[evt] = handler; | ||
} | ||
}, { | ||
key: "_allocateBuffers", | ||
value: function _allocateBuffers() { | ||
this._rQ = new Uint8Array(this._rQbufferSize); | ||
this._sQ = new Uint8Array(this._sQbufferSize); | ||
} | ||
}, { | ||
key: "init", | ||
value: function init() { | ||
this._allocateBuffers(); | ||
this._rQi = 0; | ||
this._websocket = null; | ||
} | ||
}, { | ||
key: "open", | ||
value: function open(uri, protocols) { | ||
this.attach(new WebSocket(uri, protocols)); | ||
} | ||
}, { | ||
key: "attach", | ||
value: function attach(rawChannel) { | ||
var _this = this; | ||
this.init(); // Must get object and class methods to be compatible with the tests. | ||
var channelProps = [].concat(_toConsumableArray(Object.keys(rawChannel)), _toConsumableArray(Object.getOwnPropertyNames(Object.getPrototypeOf(rawChannel)))); | ||
for (var i = 0; i < rawChannelProps.length; i++) { | ||
var prop = rawChannelProps[i]; | ||
if (channelProps.indexOf(prop) < 0) { | ||
throw new Error('Raw channel missing property: ' + prop); | ||
} | ||
}, { | ||
key: 'close', | ||
value: function close() { | ||
if (this._websocket) { | ||
if (this._websocket.readyState === WebSocket.OPEN || this._websocket.readyState === WebSocket.CONNECTING) { | ||
Log.Info("Closing WebSocket connection"); | ||
this._websocket.close(); | ||
} | ||
} | ||
this._websocket.onmessage = function () {}; | ||
} | ||
this._websocket = rawChannel; | ||
this._websocket.binaryType = "arraybuffer"; | ||
this._websocket.onmessage = this._recvMessage.bind(this); | ||
var onOpen = function onOpen() { | ||
Log.Debug('>> WebSock.onopen'); | ||
if (_this._websocket.protocol) { | ||
Log.Info("Server choose sub-protocol: " + _this._websocket.protocol); | ||
} | ||
// private methods | ||
_this._eventHandlers.open(); | ||
}, { | ||
key: '_encode_message', | ||
value: function _encode_message() { | ||
// Put in a binary arraybuffer | ||
// according to the spec, you can send ArrayBufferViews with the send method | ||
return new Uint8Array(this._sQ.buffer, 0, this._sQlen); | ||
Log.Debug("<< WebSock.onopen"); | ||
}; // If the readyState cannot be found this defaults to assuming it's not open. | ||
var isOpen = ReadyStates.OPEN.indexOf(this._websocket.readyState) >= 0; | ||
if (isOpen) { | ||
onOpen(); | ||
} else { | ||
this._websocket.onopen = onOpen; | ||
} | ||
this._websocket.onclose = function (e) { | ||
Log.Debug(">> WebSock.onclose"); | ||
_this._eventHandlers.close(e); | ||
Log.Debug("<< WebSock.onclose"); | ||
}; | ||
this._websocket.onerror = function (e) { | ||
Log.Debug(">> WebSock.onerror: " + e); | ||
_this._eventHandlers.error(e); | ||
Log.Debug("<< WebSock.onerror: " + e); | ||
}; | ||
} | ||
}, { | ||
key: "close", | ||
value: function close() { | ||
if (this._websocket) { | ||
if (ReadyStates.CONNECTING.indexOf(this._websocket.readyState) >= 0 || ReadyStates.OPEN.indexOf(this._websocket.readyState) >= 0) { | ||
Log.Info("Closing WebSocket connection"); | ||
this._websocket.close(); | ||
} | ||
}, { | ||
key: '_expand_compact_rQ', | ||
value: function _expand_compact_rQ(min_fit) { | ||
var resizeNeeded = min_fit || this.rQlen > this._rQbufferSize / 2; | ||
if (resizeNeeded) { | ||
if (!min_fit) { | ||
// just double the size if we need to do compaction | ||
this._rQbufferSize *= 2; | ||
} else { | ||
// otherwise, make sure we satisy rQlen - rQi + min_fit < rQbufferSize / 8 | ||
this._rQbufferSize = (this.rQlen + min_fit) * 8; | ||
} | ||
} | ||
// we don't want to grow unboundedly | ||
if (this._rQbufferSize > MAX_RQ_GROW_SIZE) { | ||
this._rQbufferSize = MAX_RQ_GROW_SIZE; | ||
if (this._rQbufferSize - this.rQlen < min_fit) { | ||
throw new Error("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit"); | ||
} | ||
} | ||
this._websocket.onmessage = function () {}; | ||
} | ||
} // private methods | ||
if (resizeNeeded) { | ||
var old_rQbuffer = this._rQ.buffer; | ||
this._rQmax = this._rQbufferSize / 8; | ||
this._rQ = new Uint8Array(this._rQbufferSize); | ||
this._rQ.set(new Uint8Array(old_rQbuffer, this._rQi)); | ||
} else { | ||
if (ENABLE_COPYWITHIN) { | ||
this._rQ.copyWithin(0, this._rQi); | ||
} else { | ||
this._rQ.set(new Uint8Array(this._rQ.buffer, this._rQi)); | ||
} | ||
} | ||
}, { | ||
key: "_encodeMessage", | ||
value: function _encodeMessage() { | ||
// Put in a binary arraybuffer | ||
// according to the spec, you can send ArrayBufferViews with the send method | ||
return new Uint8Array(this._sQ.buffer, 0, this._sQlen); | ||
} // We want to move all the unread data to the start of the queue, | ||
// e.g. compacting. | ||
// The function also expands the receive que if needed, and for | ||
// performance reasons we combine these two actions to avoid | ||
// unneccessary copying. | ||
this._rQlen = this._rQlen - this._rQi; | ||
this._rQi = 0; | ||
}, { | ||
key: "_expandCompactRQ", | ||
value: function _expandCompactRQ(minFit) { | ||
// if we're using less than 1/8th of the buffer even with the incoming bytes, compact in place | ||
// instead of resizing | ||
var requiredBufferSize = (this._rQlen - this._rQi + minFit) * 8; | ||
var resizeNeeded = this._rQbufferSize < requiredBufferSize; | ||
if (resizeNeeded) { | ||
// Make sure we always *at least* double the buffer size, and have at least space for 8x | ||
// the current amount of data | ||
this._rQbufferSize = Math.max(this._rQbufferSize * 2, requiredBufferSize); | ||
} // we don't want to grow unboundedly | ||
if (this._rQbufferSize > MAX_RQ_GROW_SIZE) { | ||
this._rQbufferSize = MAX_RQ_GROW_SIZE; | ||
if (this._rQbufferSize - this.rQlen < minFit) { | ||
throw new Error("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit"); | ||
} | ||
}, { | ||
key: '_decode_message', | ||
value: function _decode_message(data) { | ||
// push arraybuffer values onto the end | ||
var u8 = new Uint8Array(data); | ||
if (u8.length > this._rQbufferSize - this._rQlen) { | ||
this._expand_compact_rQ(u8.length); | ||
} | ||
this._rQ.set(u8, this._rQlen); | ||
this._rQlen += u8.length; | ||
} | ||
}, { | ||
key: '_recv_message', | ||
value: function _recv_message(e) { | ||
this._decode_message(e.data); | ||
if (this.rQlen > 0) { | ||
this._eventHandlers.message(); | ||
// Compact the receive queue | ||
if (this._rQlen == this._rQi) { | ||
this._rQlen = 0; | ||
this._rQi = 0; | ||
} else if (this._rQlen > this._rQmax) { | ||
this._expand_compact_rQ(); | ||
} | ||
} else { | ||
Log.Debug("Ignoring empty message"); | ||
} | ||
} | ||
}, { | ||
key: 'sQ', | ||
get: function get() { | ||
return this._sQ; | ||
} | ||
}, { | ||
key: 'rQ', | ||
get: function get() { | ||
return this._rQ; | ||
} | ||
}, { | ||
key: 'rQi', | ||
get: function get() { | ||
return this._rQi; | ||
}, | ||
set: function set(val) { | ||
this._rQi = val; | ||
} | ||
} | ||
// Receive Queue | ||
if (resizeNeeded) { | ||
var oldRQbuffer = this._rQ.buffer; | ||
this._rQ = new Uint8Array(this._rQbufferSize); | ||
}, { | ||
key: 'rQlen', | ||
get: function get() { | ||
return this._rQlen - this._rQi; | ||
this._rQ.set(new Uint8Array(oldRQbuffer, this._rQi, this._rQlen - this._rQi)); | ||
} else { | ||
this._rQ.copyWithin(0, this._rQi, this._rQlen); | ||
} | ||
this._rQlen = this._rQlen - this._rQi; | ||
this._rQi = 0; | ||
} // push arraybuffer values onto the end of the receive que | ||
}, { | ||
key: "_DecodeMessage", | ||
value: function _DecodeMessage(data) { | ||
var u8 = new Uint8Array(data); | ||
if (u8.length > this._rQbufferSize - this._rQlen) { | ||
this._expandCompactRQ(u8.length); | ||
} | ||
this._rQ.set(u8, this._rQlen); | ||
this._rQlen += u8.length; | ||
} | ||
}, { | ||
key: "_recvMessage", | ||
value: function _recvMessage(e) { | ||
this._DecodeMessage(e.data); | ||
if (this.rQlen > 0) { | ||
this._eventHandlers.message(); | ||
if (this._rQlen == this._rQi) { | ||
// All data has now been processed, this means we | ||
// can reset the receive queue. | ||
this._rQlen = 0; | ||
this._rQi = 0; | ||
} | ||
}]); | ||
} else { | ||
Log.Debug("Ignoring empty message"); | ||
} | ||
} | ||
}]); | ||
return Websock; | ||
return Websock; | ||
}(); | ||
exports.default = Websock; | ||
exports["default"] = Websock; |
@@ -1,2 +0,2 @@ | ||
noVNC is Copyright (C) 2018 The noVNC Authors | ||
noVNC is Copyright (C) 2019 The noVNC Authors | ||
(./AUTHORS) | ||
@@ -45,8 +45,2 @@ | ||
vendor/browser-es-module-loader/src/ : MIT | ||
vendor/browser-es-module-loader/dist/ : Various BSD style licenses | ||
vendor/promise.js : MIT | ||
Any other files not mentioned above are typically marked with | ||
@@ -53,0 +47,0 @@ a copyright/license header at the top of the file. The default noVNC |
{ | ||
"name": "@replit/novnc", | ||
"version": "2.0.0", | ||
"version": "2.1.0", | ||
"description": "An HTML5 VNC client", | ||
@@ -22,5 +22,5 @@ "browser": "lib/rfb", | ||
"scripts": { | ||
"lint": "eslint app core po tests utils", | ||
"lint": "eslint app core po/po2js po/xgettext-html tests utils", | ||
"test": "karma start karma.conf.js", | ||
"prepublish": "node ./utils/use_require.js --as commonjs --clean" | ||
"prepublish": "node ./utils/use_require.js --clean" | ||
}, | ||
@@ -44,32 +44,35 @@ "repository": { | ||
"devDependencies": { | ||
"babel-core": "^6.22.1", | ||
"babel-plugin-add-module-exports": "^0.2.1", | ||
"@babel/core": "*", | ||
"@babel/plugin-syntax-dynamic-import": "*", | ||
"@babel/plugin-transform-modules-commonjs": "*", | ||
"@babel/preset-env": "*", | ||
"@babel/cli": "*", | ||
"babel-plugin-import-redirect": "*", | ||
"babel-plugin-syntax-dynamic-import": "^6.18.0", | ||
"babel-plugin-transform-es2015-modules-amd": "^6.22.0", | ||
"babel-plugin-transform-es2015-modules-commonjs": "^6.18.0", | ||
"babel-plugin-transform-es2015-modules-systemjs": "^6.22.0", | ||
"babel-plugin-transform-es2015-modules-umd": "^6.22.0", | ||
"babel-preset-es2015": "^6.24.1", | ||
"babelify": "^7.3.0", | ||
"browserify": "^13.1.0", | ||
"chai": "^3.5.0", | ||
"commander": "^2.9.0", | ||
"es-module-loader": "^2.1.0", | ||
"eslint": "^4.16.0", | ||
"fs-extra": "^1.0.0", | ||
"browserify": "*", | ||
"babelify": "*", | ||
"core-js": "*", | ||
"chai": "*", | ||
"commander": "*", | ||
"es-module-loader": "*", | ||
"eslint": "*", | ||
"fs-extra": "*", | ||
"jsdom": "*", | ||
"karma": "^1.3.0", | ||
"karma-mocha": "^1.3.0", | ||
"karma-mocha-reporter": "^2.2.0", | ||
"karma-sauce-launcher": "^1.0.0", | ||
"karma-sinon-chai": "^2.0.0", | ||
"mocha": "^3.1.2", | ||
"karma": "*", | ||
"karma-mocha": "*", | ||
"karma-chrome-launcher": "*", | ||
"@chiragrupani/karma-chromium-edge-launcher": "*", | ||
"karma-firefox-launcher": "*", | ||
"karma-ie-launcher": "*", | ||
"karma-mocha-reporter": "*", | ||
"karma-safari-launcher": "*", | ||
"karma-script-launcher": "*", | ||
"karma-sinon-chai": "*", | ||
"mocha": "*", | ||
"node-getopt": "*", | ||
"po2json": "*", | ||
"requirejs": "^2.3.2", | ||
"rollup": "^0.41.4", | ||
"rollup-plugin-node-resolve": "^2.0.0", | ||
"sinon": "^4.0.0", | ||
"sinon-chai": "^2.8.0" | ||
"requirejs": "*", | ||
"rollup": "*", | ||
"rollup-plugin-node-resolve": "*", | ||
"sinon": "*", | ||
"sinon-chai": "*" | ||
}, | ||
@@ -76,0 +79,0 @@ "dependencies": {}, |
## noVNC: HTML VNC Client Library and Application | ||
[![Build Status](https://travis-ci.org/novnc/noVNC.svg?branch=master)](https://travis-ci.org/novnc/noVNC) | ||
[![Test Status](https://github.com/novnc/noVNC/workflows/Test/badge.svg)](https://github.com/novnc/noVNC/actions?query=workflow%3ATest) | ||
[![Lint Status](https://github.com/novnc/noVNC/workflows/Lint/badge.svg)](https://github.com/novnc/noVNC/actions?query=workflow%3ALint) | ||
@@ -27,2 +28,3 @@ ### Description | ||
- [Quick Start](#quick-start) | ||
- [Installation from Snap Package](#installation-from-snap-package) | ||
- [Integration and Deployment](#integration-and-deployment) | ||
@@ -72,2 +74,3 @@ - [Authors/Contributors](#authorscontributors) | ||
* Translations | ||
* Touch gestures for emulating common mouse actions | ||
* Licensed mainly under the [MPL 2.0](http://www.mozilla.org/MPL/2.0/), see | ||
@@ -93,3 +96,3 @@ [the license document](LICENSE.txt) for details | ||
* Chrome 49, Firefox 44, Safari 10, Opera 36, IE 11, Edge 12 | ||
* Chrome 49, Firefox 44, Safari 11, Opera 36, Edge 79 | ||
@@ -121,3 +124,63 @@ | ||
### Installation from Snap Package | ||
Running the command below will install the latest release of noVNC from Snap: | ||
`sudo snap install novnc` | ||
#### Running noVNC | ||
You can run the Snap-package installed novnc directly with, for example: | ||
`novnc --listen 6081 --vnc localhost:5901 # /snap/bin/novnc if /snap/bin is not in your PATH` | ||
#### Running as a Service (Daemon) | ||
The Snap package also has the capability to run a 'novnc' service which can be | ||
configured to listen on multiple ports connecting to multiple VNC servers | ||
(effectively a service runing multiple instances of novnc). | ||
Instructions (with example values): | ||
List current services (out-of-box this will be blank): | ||
``` | ||
sudo snap get novnc services | ||
Key Value | ||
services.n6080 {...} | ||
services.n6081 {...} | ||
``` | ||
Create a new service that listens on port 6082 and connects to the VNC server | ||
running on port 5902 on localhost: | ||
`sudo snap set novnc services.n6082.listen=6082 services.n6082.vnc=localhost:5902` | ||
(Any services you define with 'snap set' will be automatically started) | ||
Note that the name of the service, 'n6082' in this example, can be anything | ||
as long as it doesn't start with a number or contain spaces/special characters. | ||
View the configuration of the service just created: | ||
``` | ||
sudo snap get novnc services.n6082 | ||
Key Value | ||
services.n6082.listen 6082 | ||
services.n6082.vnc localhost:5902 | ||
``` | ||
Disable a service (note that because of a limitation in Snap it's currently not | ||
possible to unset config variables, setting them to blank values is the way | ||
to disable a service): | ||
`sudo snap set novnc services.n6082.listen='' services.n6082.vnc=''` | ||
(Any services you set to blank with 'snap set' like this will be automatically stopped) | ||
Verify that the service is disabled (blank values): | ||
``` | ||
sudo snap get novnc services.n6082 | ||
Key Value | ||
services.n6082.listen | ||
services.n6082.vnc | ||
``` | ||
### Integration and Deployment | ||
@@ -140,3 +203,2 @@ | ||
* [Samuel Mannehed](https://github.com/samhed) (Cendio) | ||
* [Peter Åstrand](https://github.com/astrand) (Cendio) | ||
* [Solly Ross](https://github.com/DirectXMan12) (Red Hat / OpenStack) | ||
@@ -143,0 +205,0 @@ * [Pierre Ossman](https://github.com/CendioOssman) (Cendio) |
@@ -12,9 +12,9 @@ import * as utils from "../utils/common.js"; | ||
/* Allowed flush values; see deflate() and inflate() below for details */ | ||
var Z_NO_FLUSH = 0; | ||
var Z_PARTIAL_FLUSH = 1; | ||
//var Z_SYNC_FLUSH = 2; | ||
var Z_FULL_FLUSH = 3; | ||
var Z_FINISH = 4; | ||
var Z_BLOCK = 5; | ||
//var Z_TREES = 6; | ||
export const Z_NO_FLUSH = 0; | ||
export const Z_PARTIAL_FLUSH = 1; | ||
//export const Z_SYNC_FLUSH = 2; | ||
export const Z_FULL_FLUSH = 3; | ||
export const Z_FINISH = 4; | ||
export const Z_BLOCK = 5; | ||
//export const Z_TREES = 6; | ||
@@ -25,35 +25,35 @@ | ||
*/ | ||
var Z_OK = 0; | ||
var Z_STREAM_END = 1; | ||
//var Z_NEED_DICT = 2; | ||
//var Z_ERRNO = -1; | ||
var Z_STREAM_ERROR = -2; | ||
var Z_DATA_ERROR = -3; | ||
//var Z_MEM_ERROR = -4; | ||
var Z_BUF_ERROR = -5; | ||
//var Z_VERSION_ERROR = -6; | ||
export const Z_OK = 0; | ||
export const Z_STREAM_END = 1; | ||
//export const Z_NEED_DICT = 2; | ||
//export const Z_ERRNO = -1; | ||
export const Z_STREAM_ERROR = -2; | ||
export const Z_DATA_ERROR = -3; | ||
//export const Z_MEM_ERROR = -4; | ||
export const Z_BUF_ERROR = -5; | ||
//export const Z_VERSION_ERROR = -6; | ||
/* compression levels */ | ||
//var Z_NO_COMPRESSION = 0; | ||
//var Z_BEST_SPEED = 1; | ||
//var Z_BEST_COMPRESSION = 9; | ||
var Z_DEFAULT_COMPRESSION = -1; | ||
//export const Z_NO_COMPRESSION = 0; | ||
//export const Z_BEST_SPEED = 1; | ||
//export const Z_BEST_COMPRESSION = 9; | ||
export const Z_DEFAULT_COMPRESSION = -1; | ||
var Z_FILTERED = 1; | ||
var Z_HUFFMAN_ONLY = 2; | ||
var Z_RLE = 3; | ||
var Z_FIXED = 4; | ||
var Z_DEFAULT_STRATEGY = 0; | ||
export const Z_FILTERED = 1; | ||
export const Z_HUFFMAN_ONLY = 2; | ||
export const Z_RLE = 3; | ||
export const Z_FIXED = 4; | ||
export const Z_DEFAULT_STRATEGY = 0; | ||
/* Possible values of the data_type field (though see inflate()) */ | ||
//var Z_BINARY = 0; | ||
//var Z_TEXT = 1; | ||
//var Z_ASCII = 1; // = Z_TEXT | ||
var Z_UNKNOWN = 2; | ||
//export const Z_BINARY = 0; | ||
//export const Z_TEXT = 1; | ||
//export const Z_ASCII = 1; // = Z_TEXT | ||
export const Z_UNKNOWN = 2; | ||
/* The deflate compression method */ | ||
var Z_DEFLATED = 8; | ||
export const Z_DEFLATED = 8; | ||
@@ -60,0 +60,0 @@ /*============================================================================*/ |
@@ -16,9 +16,9 @@ import * as utils from "../utils/common.js"; | ||
/* Allowed flush values; see deflate() and inflate() below for details */ | ||
//var Z_NO_FLUSH = 0; | ||
//var Z_PARTIAL_FLUSH = 1; | ||
//var Z_SYNC_FLUSH = 2; | ||
//var Z_FULL_FLUSH = 3; | ||
var Z_FINISH = 4; | ||
var Z_BLOCK = 5; | ||
var Z_TREES = 6; | ||
//export const Z_NO_FLUSH = 0; | ||
//export const Z_PARTIAL_FLUSH = 1; | ||
//export const Z_SYNC_FLUSH = 2; | ||
//export const Z_FULL_FLUSH = 3; | ||
export const Z_FINISH = 4; | ||
export const Z_BLOCK = 5; | ||
export const Z_TREES = 6; | ||
@@ -29,14 +29,14 @@ | ||
*/ | ||
var Z_OK = 0; | ||
var Z_STREAM_END = 1; | ||
var Z_NEED_DICT = 2; | ||
//var Z_ERRNO = -1; | ||
var Z_STREAM_ERROR = -2; | ||
var Z_DATA_ERROR = -3; | ||
var Z_MEM_ERROR = -4; | ||
var Z_BUF_ERROR = -5; | ||
//var Z_VERSION_ERROR = -6; | ||
export const Z_OK = 0; | ||
export const Z_STREAM_END = 1; | ||
export const Z_NEED_DICT = 2; | ||
//export const Z_ERRNO = -1; | ||
export const Z_STREAM_ERROR = -2; | ||
export const Z_DATA_ERROR = -3; | ||
export const Z_MEM_ERROR = -4; | ||
export const Z_BUF_ERROR = -5; | ||
//export const Z_VERSION_ERROR = -6; | ||
/* The deflate compression method */ | ||
var Z_DEFLATED = 8; | ||
export const Z_DEFLATED = 8; | ||
@@ -43,0 +43,0 @@ |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
1071076
98
26995
215
33
1