updated to latest backend, cursor variants setting, reformat some files

cpsdqs/unified-input
Ondřej Hruška 7 years ago
parent 963bfce9cc
commit 036a58ce12
  1. 39
      jssrc/appcommon.js
  2. 4
      jssrc/notif.js
  3. 40
      jssrc/soft_keyboard.js
  4. 8
      jssrc/term_input.js
  5. 116
      jssrc/term_screen.js
  6. 16
      jssrc/term_upload.js
  7. 30
      jssrc/utils.js
  8. 12
      jssrc/wifi.js
  9. 9
      lang/en.php
  10. 19
      pages/cfg_term.php

@ -1,13 +1,13 @@
/** Global generic init */ /** Global generic init */
$.ready(function () { $.ready(function () {
// Checkbox UI (checkbox CSS and hidden input with int value) // Checkbox UI (checkbox CSS and hidden input with int value)
$('.Row.checkbox').forEach(function(x) { $('.Row.checkbox').forEach(function (x) {
var inp = x.querySelector('input'); var inp = x.querySelector('input');
var box = x.querySelector('.box'); var box = x.querySelector('.box');
$(box).toggleClass('checked', inp.value); $(box).toggleClass('checked', inp.value);
var hdl = function() { var hdl = function () {
inp.value = 1 - inp.value; inp.value = 1 - inp.value;
$(box).toggleClass('checked', inp.value) $(box).toggleClass('checked', inp.value)
}; };
@ -16,17 +16,17 @@ $.ready(function () {
}); });
// Expanding boxes on mobile // Expanding boxes on mobile
$('.Box.mobcol,.Box.fold').forEach(function(x) { $('.Box.mobcol,.Box.fold').forEach(function (x) {
var h = x.querySelector('h2'); var h = x.querySelector('h2');
var hdl = function() { var hdl = function () {
$(x).toggleClass('expanded'); $(x).toggleClass('expanded');
}; };
$(h).on('click', hdl).on('keypress', cr(hdl)); $(h).on('click', hdl).on('keypress', cr(hdl));
}); });
$('form').forEach(function(x) { $('form').forEach(function (x) {
$(x).on('keypress', function(e) { $(x).on('keypress', function (e) {
if ((e.keyCode == 10 || e.keyCode == 13) && e.ctrlKey) { if ((e.keyCode == 10 || e.keyCode == 13) && e.ctrlKey) {
x.submit(); x.submit();
} }
@ -44,7 +44,7 @@ $.ready(function () {
}, 1000); }, 1000);
// flipping number boxes with the mouse wheel // flipping number boxes with the mouse wheel
$('input[type=number]').on('mousewheel', function(e) { $('input[type=number]').on('mousewheel', function (e) {
var $this = $(this); var $this = $(this);
var val = +$this.val(); var val = +$this.val();
if (isNaN(val)) val = 1; if (isNaN(val)) val = 1;
@ -52,7 +52,7 @@ $.ready(function () {
var step = +($this.attr('step') || 1); var step = +($this.attr('step') || 1);
var min = +$this.attr('min'); var min = +$this.attr('min');
var max = +$this.attr('max'); var max = +$this.attr('max');
if(e.wheelDelta > 0) { if (e.wheelDelta > 0) {
val += step; val += step;
} else { } else {
val -= step; val -= step;
@ -75,10 +75,10 @@ $.ready(function () {
var errAt = location.search.indexOf('err='); var errAt = location.search.indexOf('err=');
if (errAt !== -1 && qs('.Box.errors')) { if (errAt !== -1 && qs('.Box.errors')) {
var errs = location.search.substr(errAt+4).split(','); var errs = location.search.substr(errAt + 4).split(',');
var hres = []; var hres = [];
errs.forEach(function(er) { errs.forEach(function (er) {
var lbl = qs('label[for="'+er+'"]'); var lbl = qs('label[for="' + er + '"]');
if (lbl) { if (lbl) {
lbl.classList.add('error'); lbl.classList.add('error');
hres.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, '')); hres.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, ''));
@ -102,13 +102,13 @@ $.ready(function () {
// brand works as a link back to term in widescreen mode // brand works as a link back to term in widescreen mode
var br = qs('#brand'); var br = qs('#brand');
br && br.addEventListener('click', function() { br && br.addEventListener('click', function () {
location.href='/'; // go to terminal location.href = '/'; // go to terminal
}); });
} }
}); });
$._loader = function(vis) { $._loader = function (vis) {
$('#loader').toggleClass('show', vis); $('#loader').toggleClass('show', vis);
}; };
@ -116,7 +116,7 @@ function showPage() {
$('#content').addClass('load'); $('#content').addClass('load');
} }
$.ready(function() { $.ready(function () {
if (window.noAutoShow !== true) { if (window.noAutoShow !== true) {
setTimeout(function () { setTimeout(function () {
showPage(); showPage();
@ -127,19 +127,20 @@ $.ready(function() {
/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */ /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
if (!String.fromCodePoint) { if (!String.fromCodePoint) {
(function() { (function () {
var defineProperty = (function() { var defineProperty = (function () {
// IE 8 only supports `Object.defineProperty` on DOM elements // IE 8 only supports `Object.defineProperty` on DOM elements
try { try {
var object = {}; var object = {};
var $defineProperty = Object.defineProperty; var $defineProperty = Object.defineProperty;
var result = $defineProperty(object, object, object) && $defineProperty; var result = $defineProperty(object, object, object) && $defineProperty;
} catch(error) {} } catch (error) {
}
return result; return result;
}()); }());
var stringFromCharCode = String.fromCharCode; var stringFromCharCode = String.fromCharCode;
var floor = Math.floor; var floor = Math.floor;
var fromCodePoint = function() { var fromCodePoint = function () {
var MAX_SIZE = 0x4000; var MAX_SIZE = 0x4000;
var codeUnits = []; var codeUnits = [];
var highSurrogate; var highSurrogate;

@ -24,8 +24,8 @@
}, 250); // transition time }, 250); // transition time
}; };
nt.init = function() { nt.init = function () {
$(sel).on('click', function() { $(sel).on('click', function () {
nt.hide(this); nt.hide(this);
}); });
}; };

@ -1,27 +1,29 @@
$.ready(() => { $.ready(() => {
const input = qs('#softkb-input') const input = qs('#softkb-input');
let keyboardOpen = false if (!input) return; // abort, we're not on the terminal page
let keyboardOpen = false;
let updateInputPosition = function () { let updateInputPosition = function () {
if (!keyboardOpen) return if (!keyboardOpen) return;
let [x, y] = Screen.gridToScreen(Screen.cursor.x, Screen.cursor.y) let [x, y] = Screen.gridToScreen(Screen.cursor.x, Screen.cursor.y);
input.style.transform = `translate(${x}px, ${y}px)` input.style.transform = `translate(${x}px, ${y}px)`
} };
input.addEventListener('focus', () => { input.addEventListener('focus', () => {
keyboardOpen = true keyboardOpen = true;
updateInputPosition() updateInputPosition()
}) });
input.addEventListener('blur', () => (keyboardOpen = false)) input.addEventListener('blur', () => (keyboardOpen = false));
Screen.on('cursor-moved', updateInputPosition) Screen.on('cursor-moved', updateInputPosition);
window.kbOpen = function openSoftKeyboard (open) { window.kbOpen = function openSoftKeyboard (open) {
keyboardOpen = open keyboardOpen = open;
updateInputPosition() updateInputPosition();
if (open) input.focus() if (open) input.focus();
else input.blur() else input.blur()
} };
let lastCompositionString = ''; let lastCompositionString = '';
let compositing = false; let compositing = false;
@ -47,7 +49,7 @@ $.ready(() => {
newValue) newValue)
} }
lastCompositionString = newValue; lastCompositionString = newValue;
} };
input.addEventListener('keydown', e => { input.addEventListener('keydown', e => {
if (e.key === 'Unidentified') return; if (e.key === 'Unidentified') return;
@ -55,9 +57,9 @@ $.ready(() => {
e.preventDefault(); e.preventDefault();
input.value = ''; input.value = '';
if (e.key === 'Backspace') Input.sendString('\b') if (e.key === 'Backspace') Input.sendString('\b');
else if (e.key === 'Enter') Input.sendString('\x0d') else if (e.key === 'Enter') Input.sendString('\x0d')
}) });
input.addEventListener('input', e => { input.addEventListener('input', e => {
e.stopPropagation(); e.stopPropagation();
@ -66,11 +68,11 @@ $.ready(() => {
} else { } else {
if (e.data) Input.sendString(e.data); if (e.data) Input.sendString(e.data);
else if (e.inputType === 'deleteContentBackward') { else if (e.inputType === 'deleteContentBackward') {
lastCompositionString lastCompositionString = '';
sendInputDelta(''); sendInputDelta('');
} }
} }
}) });
input.addEventListener('compositionstart', e => { input.addEventListener('compositionstart', e => {
lastCompositionString = ''; lastCompositionString = '';
compositing = true; compositing = true;
@ -82,4 +84,4 @@ $.ready(() => {
}); });
Screen.on('open-soft-keyboard', () => input.focus()) Screen.on('open-soft-keyboard', () => input.focus())
}) });

@ -22,6 +22,7 @@ var Input = (function() {
mt_click: false, mt_click: false,
mt_move: false, mt_move: false,
no_keys: false, no_keys: false,
crlf_mode: false,
}; };
/** Send a literal message */ /** Send a literal message */
@ -53,7 +54,7 @@ var Input = (function() {
var keymap = { var keymap = {
'tab': '\x09', 'tab': '\x09',
'backspace': '\x08', 'backspace': '\x08',
'enter': '\x0d', 'enter': opts.crlf_mode ? '\x0d\x0a' : '\x0d',
'ctrl+enter': '\x0a', 'ctrl+enter': '\x0a',
'esc': '\x1b', 'esc': '\x1b',
'up': ca('\x1bOA', '\x1b[A'), 'up': ca('\x1bOA', '\x1b[A'),
@ -207,11 +208,12 @@ var Input = (function() {
sendString: sendStrMsg, sendString: sendStrMsg,
/** Enable alternate key modes (cursors, numpad, fn) */ /** Enable alternate key modes (cursors, numpad, fn) */
setAlts: function(cu, np, fn) { setAlts: function(cu, np, fn, crlf) {
if (opts.cu_alt != cu || opts.np_alt != np || opts.fn_alt != fn) { if (opts.cu_alt != cu || opts.np_alt != np || opts.fn_alt != fn || opts.crlf_mode != crlf) {
opts.cu_alt = cu; opts.cu_alt = cu;
opts.np_alt = np; opts.np_alt = np;
opts.fn_alt = fn; opts.fn_alt = fn;
opts.crlf_mode = crlf;
// rebind keys - codes have changed // rebind keys - codes have changed
_bindFnKeys(); _bindFnKeys();

@ -64,6 +64,7 @@ class TermScreen {
visible: true, visible: true,
hanging: false, hanging: false,
style: 'block', style: 'block',
blinkEnable: true,
blinkInterval: 0, blinkInterval: 0,
}; };
@ -205,17 +206,17 @@ class TermScreen {
e.preventDefault(); e.preventDefault();
selectEnd(...touchPosition); selectEnd(...touchPosition);
let touchSelectMenu = qs('#touch-select-menu') let touchSelectMenu = qs('#touch-select-menu');
touchSelectMenu.classList.add('open'); touchSelectMenu.classList.add('open');
let rect = touchSelectMenu.getBoundingClientRect() let rect = touchSelectMenu.getBoundingClientRect();
// use middle position for x and one line above for y // use middle position for x and one line above for y
let selectionPos = this.gridToScreen( let selectionPos = this.gridToScreen(
(this.selection.start[0] + this.selection.end[0]) / 2, (this.selection.start[0] + this.selection.end[0]) / 2,
this.selection.start[1] - 1 this.selection.start[1] - 1
); );
selectionPos[0] -= rect.width / 2 selectionPos[0] -= rect.width / 2;
selectionPos[1] -= rect.height / 2 selectionPos[1] -= rect.height / 2;
touchSelectMenu.style.transform = `translate(${selectionPos[0]}px, ${ touchSelectMenu.style.transform = `translate(${selectionPos[0]}px, ${
selectionPos[1]}px)` selectionPos[1]}px)`
} }
@ -242,13 +243,15 @@ class TermScreen {
e.preventDefault(); e.preventDefault();
this.emit('open-soft-keyboard'); this.emit('open-soft-keyboard');
} }
}) });
$.ready(() => { $.ready(() => {
let copyButton = qs('#touch-select-copy-btn') let copyButton = qs('#touch-select-copy-btn');
if (copyButton) {
copyButton.addEventListener('click', () => { copyButton.addEventListener('click', () => {
this.copySelectionToClipboard(); this.copySelectionToClipboard();
}); });
}
}); });
this.canvas.addEventListener('mousemove', e => { this.canvas.addEventListener('mousemove', e => {
@ -274,7 +277,7 @@ class TermScreen {
this.canvas.addEventListener('contextmenu', e => { this.canvas.addEventListener('contextmenu', e => {
// prevent mouse keys getting stuck // prevent mouse keys getting stuck
e.preventDefault(); e.preventDefault();
}) });
// bind ctrl+shift+c to copy // bind ctrl+shift+c to copy
key('⌃+⇧+c', e => { key('⌃+⇧+c', e => {
@ -333,8 +336,8 @@ class TermScreen {
} }
getColor (i) { getColor (i) {
if (i === -1) return SELECTION_FG if (i === -1) return SELECTION_FG;
if (i === -2) return SELECTION_BG if (i === -2) return SELECTION_BG;
return this.colors[i] return this.colors[i]
} }
@ -398,29 +401,32 @@ class TermScreen {
const cellSize = this.getCellSize(); const cellSize = this.getCellSize();
// real height of the canvas element in pixels // real height of the canvas element in pixels
let realWidth = width * cellSize.width let realWidth = width * cellSize.width;
let realHeight = height * cellSize.height let realHeight = height * cellSize.height;
if (fitIntoWidth && fitIntoHeight) { if (fitIntoWidth && fitIntoHeight) {
if (realWidth > fitIntoWidth || realHeight > fitIntoHeight) { if (realWidth > fitIntoWidth || realHeight > fitIntoHeight) {
let terminalAspect = realWidth / realHeight let terminalAspect = realWidth / realHeight;
let fitAspect = fitIntoWidth / fitIntoHeight let fitAspect = fitIntoWidth / fitIntoHeight;
if (terminalAspect < fitAspect) { if (terminalAspect < fitAspect) {
// align heights // align heights
realHeight = fitIntoHeight realHeight = fitIntoHeight;
realWidth = realHeight * terminalAspect realWidth = realHeight * terminalAspect
} else { }
else {
// align widths // align widths
realWidth = fitIntoWidth realWidth = fitIntoWidth;
realHeight = realWidth / terminalAspect realHeight = realWidth / terminalAspect
} }
} }
} else if (fitIntoWidth && realWidth > fitIntoWidth) { }
realHeight = fitIntoWidth / (realWidth / realHeight) else if (fitIntoWidth && realWidth > fitIntoWidth) {
realHeight = fitIntoWidth / (realWidth / realHeight);
realWidth = fitIntoWidth realWidth = fitIntoWidth
} else if (fitIntoHeight && realHeight > fitIntoHeight) { }
realWidth = fitIntoHeight * (realWidth / realHeight) else if (fitIntoHeight && realHeight > fitIntoHeight) {
realWidth = fitIntoHeight * (realWidth / realHeight);
realHeight = fitIntoHeight realHeight = fitIntoHeight
} }
@ -552,11 +558,11 @@ class TermScreen {
let underline = false; let underline = false;
let blink = false; let blink = false;
let strike = false; let strike = false;
if (attrs & 1 << 1) ctx.globalAlpha = 0.5; if (attrs & (1 << 1)) ctx.globalAlpha = 0.5;
if (attrs & 1 << 3) underline = true; if (attrs & (1 << 3)) underline = true;
if (attrs & 1 << 4) blink = true; if (attrs & (1 << 4)) blink = true;
if (attrs & 1 << 5) text = TermScreen.alphaToFraktur(text); if (attrs & (1 << 5)) text = TermScreen.alphaToFraktur(text);
if (attrs & 1 << 6) strike = true; if (attrs & (1 << 6)) strike = true;
if (!blink || this.window.blinkStyleOn) { if (!blink || this.window.blinkStyleOn) {
ctx.fillStyle = this.getColor(fg); ctx.fillStyle = this.getColor(fg);
@ -618,14 +624,18 @@ class TermScreen {
// Map of (cell index) -> boolean, whether or not a cell needs to be redrawn // Map of (cell index) -> boolean, whether or not a cell needs to be redrawn
const updateMap = new Map(); const updateMap = new Map();
const cursorActive = (this.cursor.blinkOn || !this.cursor.blinkEnable);
for (let cell = 0; cell < screenLength; cell++) { for (let cell = 0; cell < screenLength; cell++) {
let x = cell % width; let x = cell % width;
let y = Math.floor(cell / width); let y = Math.floor(cell / width);
let isCursor = this.cursor.x === x && this.cursor.y === y && let isCursor = !this.cursor.hanging
!this.cursor.hanging; && this.cursor.x === x
let invertForCursor = isCursor && this.cursor.blinkOn && && this.cursor.y === y;
this.cursor.style === 'block';
let inSelection = this.isInSelection(x, y) let invertForCursor = isCursor && cursorActive && this.cursor.style === 'block';
let inSelection = this.isInSelection(x, y);
let text = this.screen[cell]; let text = this.screen[cell];
let fg = invertForCursor ? this.screenBG[cell] : this.screenFG[cell]; let fg = invertForCursor ? this.screenBG[cell] : this.screenFG[cell];
@ -636,7 +646,7 @@ class TermScreen {
if (invertForCursor && fg === bg) bg = fg === 0 ? 7 : 0; if (invertForCursor && fg === bg) bg = fg === 0 ? 7 : 0;
if (inSelection) { if (inSelection) {
fg = -1 fg = -1;
bg = -2 bg = -2
} }
@ -695,7 +705,7 @@ class TermScreen {
this.drawnScreenAttrs[cell] = attrs; this.drawnScreenAttrs[cell] = attrs;
} }
if (isCursor && this.cursor.blinkOn && this.cursor.style !== 'block') { if (isCursor && cursorActive && this.cursor.style !== 'block') {
ctx.save(); ctx.save();
ctx.beginPath(); ctx.beginPath();
if (this.cursor.style === 'bar') { if (this.cursor.style === 'bar') {
@ -748,20 +758,21 @@ class TermScreen {
} }
// attributes // attributes
let attributes = parse2B(str, i); let attributes = parse3B(str, i);
i += 2; i += 3;
this.cursor.visible = !!(attributes & 1); this.cursor.visible = !!(attributes & 1);
this.cursor.hanging = !!(attributes & 1 << 1); this.cursor.hanging = !!(attributes & (1 << 1));
Input.setAlts( Input.setAlts(
!!(attributes & 1 << 2), // cursors alt !!(attributes & (1 << 2)), // cursors alt
!!(attributes & 1 << 3), // numpad alt !!(attributes & (1 << 3)), // numpad alt
!!(attributes & 1 << 4) // fn keys alt !!(attributes & (1 << 4)), // fn keys alt
!!(attributes & (1 << 12)) // crlf mode
); );
let trackMouseClicks = !!(attributes & 1 << 5); let trackMouseClicks = !!(attributes & (1 << 5));
let trackMouseMovement = !!(attributes & 1 << 6); let trackMouseMovement = !!(attributes & (1 << 6));
Input.setMouseMode(trackMouseClicks, trackMouseMovement); Input.setMouseMode(trackMouseClicks, trackMouseMovement);
this.selection.selectable = !trackMouseMovement; this.selection.selectable = !trackMouseMovement;
@ -771,12 +782,19 @@ class TermScreen {
movement: trackMouseMovement movement: trackMouseMovement
}; };
let showButtons = !!(attributes & 1 << 7); let showButtons = !!(attributes & (1 << 7));
let showConfigLinks = !!(attributes & 1 << 8); let showConfigLinks = !!(attributes & (1 << 8));
$('.x-term-conf-btn').toggleClass('hidden', !showConfigLinks); $('.x-term-conf-btn').toggleClass('hidden', !showConfigLinks);
$('#action-buttons').toggleClass('hidden', !showButtons); $('#action-buttons').toggleClass('hidden', !showButtons);
let cursorStyle = (attributes >> 9) & 0x07;
// 0 - Block blink, 2 - Block steady
// 3 - Under blink, 4 - Under steady
// 5 - I-bar blink, 6 - I-bar steady
this.cursor.style = cursorStyle<3?'block':cursorStyle<5?'line':'bar';
this.cursor.blinkEnable = cursorStyle === 0 || cursorStyle === 3 || cursorStyle === 5;
// content // content
let fg = 7; let fg = 7;
let bg = 0; let bg = 0;
@ -932,23 +950,23 @@ Screen.once('load', () => {
} }
}); });
let fitScreen = false let fitScreen = false;
function fitScreenIfNeeded () { function fitScreenIfNeeded () {
Screen.window.fitIntoWidth = fitScreen ? window.innerWidth : 0 Screen.window.fitIntoWidth = fitScreen ? window.innerWidth : 0;
Screen.window.fitIntoHeight = fitScreen ? window.innerHeight : 0 Screen.window.fitIntoHeight = fitScreen ? window.innerHeight : 0
} }
fitScreenIfNeeded(); fitScreenIfNeeded();
window.addEventListener('resize', fitScreenIfNeeded) window.addEventListener('resize', fitScreenIfNeeded);
window.toggleFitScreen = function () { window.toggleFitScreen = function () {
fitScreen = !fitScreen; fitScreen = !fitScreen;
const resizeButtonIcon = qs('#resize-button-icon') const resizeButtonIcon = qs('#resize-button-icon');
if (fitScreen) { if (fitScreen) {
resizeButtonIcon.classList.remove('icn-resize-small') resizeButtonIcon.classList.remove('icn-resize-small');
resizeButtonIcon.classList.add('icn-resize-full') resizeButtonIcon.classList.add('icn-resize-full')
} else { } else {
resizeButtonIcon.classList.remove('icn-resize-full') resizeButtonIcon.classList.remove('icn-resize-full');
resizeButtonIcon.classList.add('icn-resize-small') resizeButtonIcon.classList.add('icn-resize-small')
} }
fitScreenIfNeeded(); fitScreenIfNeeded();
} };

@ -1,5 +1,5 @@
/** File upload utility */ /** File upload utility */
var TermUpl = (function() { var TermUpl = (function () {
var lines, // array of lines without newlines var lines, // array of lines without newlines
line_i, // current line index line_i, // current line index
fuTout, // timeout handle for line sending fuTout, // timeout handle for line sending
@ -91,7 +91,7 @@ var TermUpl = (function() {
var all = lines.length; var all = lines.length;
fuStatus(line_i+" / "+all+ " ("+(Math.round((line_i/all)*1000)/10)+"%)"); fuStatus(line_i + " / " + all + " (" + (Math.round((line_i / all) * 1000) / 10) + "%)");
if (lines.length > line_i || inline_pos > 0) { if (lines.length > line_i || inline_pos > 0) {
fuTout = setTimeout(fuSendLine, send_delay_ms); fuTout = setTimeout(fuSendLine, send_delay_ms);
@ -108,7 +108,7 @@ var TermUpl = (function() {
} else { } else {
fuStatus("Done."); fuStatus("Done.");
// delay to show it // delay to show it
setTimeout(function() { setTimeout(function () {
fuClose(); fuClose();
}, 100); }, 100);
} }
@ -119,20 +119,20 @@ var TermUpl = (function() {
} }
return { return {
init: function() { init: function () {
qs('#fu_file').addEventListener('change', function (evt) { qs('#fu_file').addEventListener('change', function (evt) {
var reader = new FileReader(); var reader = new FileReader();
var file = evt.target.files[0]; var file = evt.target.files[0];
console.log("Selected file type: "+file.type); console.log("Selected file type: " + file.type);
if (!file.type.match(/text\/.*|application\/(json|csv|.*xml.*|.*script.*)/)) { if (!file.type.match(/text\/.*|application\/(json|csv|.*xml.*|.*script.*)/)) {
// Deny load of blobs like img - can crash browser and will get corrupted anyway // Deny load of blobs like img - can crash browser and will get corrupted anyway
if (!confirm("This does not look like a text file: "+file.type+"\nReally load?")) { if (!confirm("This does not look like a text file: " + file.type + "\nReally load?")) {
qs('#fu_file').value = ''; qs('#fu_file').value = '';
return; return;
} }
} }
reader.onload = function(e) { reader.onload = function (e) {
var txt = e.target.result.replace(/[\r\n]+/,'\n'); var txt = e.target.result.replace(/[\r\n]+/, '\n');
qs('#fu_text').value = txt; qs('#fu_text').value = txt;
}; };
console.log("Loading file..."); console.log("Loading file...");

@ -1,11 +1,17 @@
/** Make a node */ /** Make a node */
function mk(e) {return document.createElement(e)} function mk(e) {
return document.createElement(e)
}
/** Find one by query */ /** Find one by query */
function qs(s) {return document.querySelector(s)} function qs(s) {
return document.querySelector(s)
}
/** Find all by query */ /** Find all by query */
function qsa(s) {return document.querySelectorAll(s)} function qsa(s) {
return document.querySelectorAll(s)
}
/** Convert any to bool safely */ /** Convert any to bool safely */
function bool(x) { function bool(x) {
@ -18,7 +24,7 @@ function bool(x) {
* use $(...).on('keypress', cr(handler)) * use $(...).on('keypress', cr(handler))
*/ */
function cr(hdl) { function cr(hdl) {
return function(e) { return function (e) {
if (e.which == 10 || e.which == 13 || e.which == 32) { if (e.which == 10 || e.which == 13 || e.which == 32) {
hdl(); hdl();
} }
@ -29,11 +35,11 @@ function cr(hdl) {
function extend(defaults, options) { function extend(defaults, options) {
var target = {}; var target = {};
Object.keys(defaults).forEach(function(k){ Object.keys(defaults).forEach(function (k) {
target[k] = defaults[k]; target[k] = defaults[k];
}); });
Object.keys(options).forEach(function(k){ Object.keys(options).forEach(function (k) {
target[k] = options[k]; target[k] = options[k];
}); });
@ -48,7 +54,7 @@ function rgxe(str) {
/** Format number to N decimal places, output as string */ /** Format number to N decimal places, output as string */
function numfmt(x, places) { function numfmt(x, places) {
var pow = Math.pow(10, places); var pow = Math.pow(10, places);
return Math.round(x*pow) / pow; return Math.round(x * pow) / pow;
} }
/** Get millisecond timestamp */ /** Get millisecond timestamp */
@ -62,7 +68,7 @@ function msElapsed(start) {
} }
/** Shim for log base 10 */ /** Shim for log base 10 */
Math.log10 = Math.log10 || function(x) { Math.log10 = Math.log10 || function (x) {
return Math.log(x) / Math.LN10; return Math.log(x) / Math.LN10;
}; };
@ -116,7 +122,7 @@ function undef(x) {
function jsp(str) { function jsp(str) {
try { try {
return JSON.parse(str); return JSON.parse(str);
} catch(e) { } catch (e) {
console.error(e); console.error(e);
return null; return null;
} }
@ -128,13 +134,13 @@ function Chr(n) {
} }
/** Decode number from 2B encoding */ /** Decode number from 2B encoding */
function parse2B(s, i=0) { function parse2B(s, i = 0) {
return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127; return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127;
} }
/** Decode number from 3B encoding */ /** Decode number from 3B encoding */
function parse3B(s, i=0) { function parse3B(s, i = 0) {
return (s.charCodeAt(i) - 1) + (s.charCodeAt(i+1) - 1) * 127 + (s.charCodeAt(i+2) - 1) * 127 * 127; return (s.charCodeAt(i) - 1) + (s.charCodeAt(i + 1) - 1) * 127 + (s.charCodeAt(i + 2) - 1) * 127 * 127;
} }
/** Encode using 2B encoding, returns string. */ /** Encode using 2B encoding, returns string. */

@ -1,10 +1,10 @@
(function(w) { (function (w) {
var authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']; var authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2'];
var curSSID; var curSSID;
// Get XX % for a slider input // Get XX % for a slider input
function rangePt(inp) { function rangePt(inp) {
return Math.round(((inp.value / inp.max)*100)) + '%'; return Math.round(((inp.value / inp.max) * 100)) + '%';
} }
// Display selected STA SSID etc // Display selected STA SSID etc
@ -19,7 +19,7 @@
var nopw = undef(password) || password.length == 0; var nopw = undef(password) || password.length == 0;
$('#sta-nw .passwd').toggleClass('hidden', nopw); $('#sta-nw .passwd').toggleClass('hidden', nopw);
$('#sta-nw .nopasswd').toggleClass('hidden', !nopw); $('#sta-nw .nopasswd').toggleClass('hidden', !nopw);
$('#sta-nw .ip').html(ip.length>0 ? tr('wifi.connected_ip_is')+ip : tr('wifi.not_conn')); $('#sta-nw .ip').html(ip.length > 0 ? tr('wifi.connected_ip_is') + ip : tr('wifi.not_conn'));
} }
/** Update display for received response */ /** Update display for received response */
@ -134,14 +134,14 @@
/** Set up the WiFi page */ /** Set up the WiFi page */
function wifiInit(cfg) { function wifiInit(cfg) {
// Update slider value displays // Update slider value displays
$('.Row.range').forEach(function(x) { $('.Row.range').forEach(function (x) {
var inp = x.querySelector('input'); var inp = x.querySelector('input');
var disp1 = x.querySelector('.x-disp1'); var disp1 = x.querySelector('.x-disp1');
var disp2 = x.querySelector('.x-disp2'); var disp2 = x.querySelector('.x-disp2');
var t = rangePt(inp); var t = rangePt(inp);
$(disp1).html(t); $(disp1).html(t);
$(disp2).html(t); $(disp2).html(t);
$(inp).on('input', function() { $(inp).on('input', function () {
t = rangePt(inp); t = rangePt(inp);
$(disp1).html(t); $(disp1).html(t);
$(disp2).html(t); $(disp2).html(t);
@ -149,7 +149,7 @@
}); });
// Forget STA credentials // Forget STA credentials
$('#forget-sta').on('click', function() { $('#forget-sta').on('click', function () {
selectSta('', '', ''); selectSta('', '', '');
return false; return false;
}); });

@ -51,6 +51,7 @@ return [
'term.default_fg_bg' => 'Text / background', 'term.default_fg_bg' => 'Text / background',
'term.buttons' => 'Button labels', 'term.buttons' => 'Button labels',
'term.theme' => 'Color scheme', 'term.theme' => 'Color scheme',
'term.cursor_shape' => 'Cursor style',
'term.parser_tout_ms' => 'Parser timeout', 'term.parser_tout_ms' => 'Parser timeout',
'term.display_tout_ms' => 'Redraw delay', 'term.display_tout_ms' => 'Redraw delay',
'term.display_cooldown_ms' => 'Redraw cooldown', 'term.display_cooldown_ms' => 'Redraw cooldown',
@ -58,8 +59,16 @@ return [
'term.show_config_links' => 'Show nav links', 'term.show_config_links' => 'Show nav links',
'term.show_buttons' => 'Show buttons', 'term.show_buttons' => 'Show buttons',
'term.loopback' => 'Local Echo', 'term.loopback' => 'Local Echo',
'term.crlf_mode' => 'Enter sends CR+LF',
'term.button_msgs' => 'Button codes<br>(ASCII, dec, CSV)', 'term.button_msgs' => 'Button codes<br>(ASCII, dec, CSV)',
'cursor.block_blink' => 'Block, blinking',
'cursor.block_steady' => 'Block, steady',
'cursor.underline_blink' => 'Underline, blinking',
'cursor.underline_steady' => 'Underline, steady',
'cursor.bar_blink' => 'I-bar, blinking',
'cursor.bar_steady' => 'I-bar, steady',
// terminal color labels // terminal color labels
'color.0' => 'Black', 'color.0' => 'Black',
'color.1' => 'Red', 'color.1' => 'Red',

@ -108,6 +108,18 @@
<input class="short" type="text" name="btn5" id="btn5" value="%h:btn5%"> <input class="short" type="text" name="btn5" id="btn5" value="%h:btn5%">
</div> </div>
<div class="Row">
<label><?= tr("term.cursor_shape") ?></label>
<select name="cursor_shape" id="cursor_shape">
<option value="0"><?= tr("cursor.block_blink") ?></option>
<option value="2"><?= tr("cursor.block_steady") ?></option>
<option value="3"><?= tr("cursor.underline_blink") ?></option>
<option value="4"><?= tr("cursor.underline_steady") ?></option>
<option value="5"><?= tr("cursor.bar_blink") ?></option>
<option value="6"><?= tr("cursor.bar_steady") ?></option>
</select>
</div>
<div class="Row buttons"> <div class="Row buttons">
<a class="button icn-ok" href="#" onclick="qs('#form-1').submit()"><?= tr('apply') ?></a> <a class="button icn-ok" href="#" onclick="qs('#form-1').submit()"><?= tr('apply') ?></a>
</div> </div>
@ -153,6 +165,12 @@
<input type="hidden" id="fn_alt_mode" name="fn_alt_mode" value="%fn_alt_mode%"> <input type="hidden" id="fn_alt_mode" name="fn_alt_mode" value="%fn_alt_mode%">
</div> </div>
<div class="Row checkbox" >
<label><?= tr('term.crlf_mode') ?></label><!--
--><span class="box" tabindex=0 role=checkbox></span>
<input type="hidden" id="crlf_mode" name="crlf_mode" value="%crlf_mode%">
</div>
<div class="Row checkbox" > <div class="Row checkbox" >
<label><?= tr('term.show_buttons') ?></label><!-- <label><?= tr('term.show_buttons') ?></label><!--
--><span class="box" tabindex=0 role=checkbox></span> --><span class="box" tabindex=0 role=checkbox></span>
@ -179,6 +197,7 @@
<script> <script>
$('#default_fg').val(%default_fg%); $('#default_fg').val(%default_fg%);
$('#default_bg').val(%default_bg%); $('#default_bg').val(%default_bg%);
$('#cursor_shape').val(%cursor_shape%);
$('#theme').val(%theme%); $('#theme').val(%theme%);
function showColor() { function showColor() {

Loading…
Cancel
Save