diff options
| author | Jeremy White <jwhite@codeweavers.com> | 2012-06-04 17:22:01 +0300 |
|---|---|---|
| committer | Alon Levy <alevy@redhat.com> | 2012-06-04 17:22:01 +0300 |
| commit | f8f622157c174ba3facc088646484ccba99acc69 (patch) | |
| tree | 88d99c83e53fa8509a8ca33a6e9f6bdc015e5791 /utils.js | |
initial
Diffstat (limited to 'utils.js')
| -rw-r--r-- | utils.js | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/utils.js b/utils.js new file mode 100644 index 0000000..3a0ee28 --- /dev/null +++ b/utils.js @@ -0,0 +1,239 @@ +"use strict"; +/* + Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com> + + This file is part of spice-html5. + + spice-html5 is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + spice-html5 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with spice-html5. If not, see <http://www.gnu.org/licenses/>. +*/ + +/*---------------------------------------------------------------------------- +** Utility settings and functions for Spice +**--------------------------------------------------------------------------*/ +var DEBUG = 0; +var DUMP_DRAWS = false; +var DUMP_CANVASES = false; + + +/*---------------------------------------------------------------------------- +** combine_array_buffers +** Combine two array buffers. +** FIXME - this can't be optimal. See wire.js about eliminating the need. +**--------------------------------------------------------------------------*/ +function combine_array_buffers(a1, a2) +{ + var in1 = new Uint8Array(a1); + var in2 = new Uint8Array(a2); + var ret = new ArrayBuffer(a1.byteLength + a2.byteLength); + var out = new Uint8Array(ret); + var o = 0; + var i; + for (i = 0; i < in1.length; i++) + out[o++] = in1[i]; + for (i = 0; i < in2.length; i++) + out[o++] = in2[i]; + + return ret; +} + +/*---------------------------------------------------------------------------- +** hexdump_buffer +**--------------------------------------------------------------------------*/ +function hexdump_buffer(a) +{ + var mg = new Uint8Array(a); + var hex = ""; + var str = ""; + var last_zeros = 0; + for (var i = 0; i < mg.length; i++) + { + var h = Number(mg[i]).toString(16); + if (h.length == 1) + hex += "0"; + hex += h + " "; + + str += String.fromCharCode(mg[i]); + + if ((i % 16 == 15) || (i == (mg.length - 1))) + { + while (i % 16 != 15) + { + hex += " "; + i++; + } + + if (last_zeros == 0) + console.log(hex + " | " + str); + + if (hex == "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ") + { + if (last_zeros == 1) + { + console.log("."); + last_zeros++; + } + else if (last_zeros == 0) + last_zeros++; + } + else + last_zeros = 0; + + hex = str = ""; + } + } +} + + +/*---------------------------------------------------------------------------- +** FIXME FIXME FIXME - web key code to scan code mapping +** This is really atrocious code. At the end of the day, we need to +** map keystrokes generated by the browser into the scan codes required +** by spice. This table was literally built by me pressing keys on my keyboard +** and typing the resulting value in by hand. +** I'm sure Europeans will hate me, and the Chinese will likely *never* +** talk to me. +**--------------------------------------------------------------------------*/ +var scanmap = []; +var codei = 1; +scanmap[27] = codei++; +scanmap['1'.charCodeAt(0)] = codei++; +scanmap['2'.charCodeAt(0)] = codei++; +scanmap['3'.charCodeAt(0)] = codei++; +scanmap['4'.charCodeAt(0)] = codei++; +scanmap['5'.charCodeAt(0)] = codei++; +scanmap['6'.charCodeAt(0)] = codei++; +scanmap['7'.charCodeAt(0)] = codei++; +scanmap['8'.charCodeAt(0)] = codei++; +scanmap['9'.charCodeAt(0)] = codei++; +scanmap['0'.charCodeAt(0)] = codei++; +scanmap[109] = codei++; +scanmap['='.charCodeAt(0)] = codei++; +scanmap[8] = codei++; +scanmap[9] = codei++; +scanmap['Q'.charCodeAt(0)] = codei++; +scanmap['W'.charCodeAt(0)] = codei++; +scanmap['E'.charCodeAt(0)] = codei++; +scanmap['R'.charCodeAt(0)] = codei++; +scanmap['T'.charCodeAt(0)] = codei++; +scanmap['Y'.charCodeAt(0)] = codei++; +scanmap['U'.charCodeAt(0)] = codei++; +scanmap['I'.charCodeAt(0)] = codei++; +scanmap['O'.charCodeAt(0)] = codei++; +scanmap['P'.charCodeAt(0)] = codei++; +scanmap[219] = codei++; +scanmap[221] = codei++; +scanmap[13] = codei++; +scanmap[17] = codei++; +scanmap['A'.charCodeAt(0)] = codei++; +scanmap['S'.charCodeAt(0)] = codei++; +scanmap['D'.charCodeAt(0)] = codei++; +scanmap['F'.charCodeAt(0)] = codei++; +scanmap['G'.charCodeAt(0)] = codei++; +scanmap['H'.charCodeAt(0)] = codei++; +scanmap['J'.charCodeAt(0)] = codei++; +scanmap['K'.charCodeAt(0)] = codei++; +scanmap['L'.charCodeAt(0)] = codei++; +scanmap[';'.charCodeAt(0)] = codei++; +scanmap[222] = codei++; +scanmap[192] = codei++; +scanmap[16] = codei++; +scanmap[220] = codei++; +scanmap['Z'.charCodeAt(0)] = codei++; +scanmap['X'.charCodeAt(0)] = codei++; +scanmap['C'.charCodeAt(0)] = codei++; +scanmap['V'.charCodeAt(0)] = codei++; +scanmap['B'.charCodeAt(0)] = codei++; +scanmap['N'.charCodeAt(0)] = codei++; +scanmap['M'.charCodeAt(0)] = codei++; +scanmap[188] = codei++; +scanmap[190] = codei++; +scanmap[191] = codei++; +codei++; // right shift seems to be same +scanmap[106] = codei++; +scanmap[18] = codei++; +scanmap[' '.charCodeAt(0)] = codei++; +scanmap[20] = codei++; +scanmap[112] = codei++; +scanmap[113] = codei++; +scanmap[114] = codei++; +scanmap[115] = codei++; +scanmap[116] = codei++; +scanmap[117] = codei++; +scanmap[118] = codei++; +scanmap[119] = codei++; +scanmap[120] = codei++; +scanmap[121] = codei++; +scanmap[144] = codei++; +scanmap[145] = codei++; // Scroll lock +scanmap[103] = codei++; +scanmap[104] = codei++; +scanmap[105] = codei++; +codei++;// skip minus; +scanmap[100] = codei++; +scanmap[101] = codei++; +scanmap[102] = codei++; +scanmap[107] = codei++; +scanmap[97] = codei++; +scanmap[98] = codei++; +scanmap[99] = codei++; +scanmap[96] = codei++; +scanmap[110] = codei++; + +// F11 + 12 go up at 87/88, after the less +codei = 87; +scanmap[122] = codei++; +scanmap[123] = codei++; + +codei = 99; +scanmap[42] = codei++; +codei++; // skip alt +scanmap[19] = codei++; // break + +scanmap[36] = codei++; // home +scanmap[38] = codei++; // up +scanmap[33] = codei++; // page up +scanmap[37] = codei++; // left +scanmap[39] = codei++; // right +scanmap[35] = codei++; // end +scanmap[40] = codei++; // down +scanmap[34] = codei++; // page down +scanmap[45] = codei++; // insert +scanmap[46] = codei++; // delete + +function keycode_to_start_scan(code) +{ + if (scanmap[code] === undefined) + { + alert('no map for ' + code); + return 0; + } + + if (scanmap[code] < 0x100) { + return scanmap[code]; + } else { + return 0xe0 | ((scanmap[code] - 0x100) << 8); + } +} + +function keycode_to_end_scan(code) +{ + if (scanmap[code] === undefined) + return 0; + + if (scanmap[code] < 0x100) { + return scanmap[code] | 0x80; + } else { + return 0x80e0 | ((scanmap[code] - 0x100) << 8); + } +} |
