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 */
$.ready(function () {
// 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 box = x.querySelector('.box');
$(box).toggleClass('checked', inp.value);
var hdl = function() {
var hdl = function () {
inp.value = 1 - inp.value;
$(box).toggleClass('checked', inp.value)
};
@ -16,17 +16,17 @@ $.ready(function () {
});
// Expanding boxes on mobile
$('.Box.mobcol,.Box.fold').forEach(function(x) {
$('.Box.mobcol,.Box.fold').forEach(function (x) {
var h = x.querySelector('h2');
var hdl = function() {
var hdl = function () {
$(x).toggleClass('expanded');
};
$(h).on('click', hdl).on('keypress', cr(hdl));
});
$('form').forEach(function(x) {
$(x).on('keypress', function(e) {
$('form').forEach(function (x) {
$(x).on('keypress', function (e) {
if ((e.keyCode == 10 || e.keyCode == 13) && e.ctrlKey) {
x.submit();
}
@ -44,7 +44,7 @@ $.ready(function () {
}, 1000);
// 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 val = +$this.val();
if (isNaN(val)) val = 1;
@ -52,7 +52,7 @@ $.ready(function () {
var step = +($this.attr('step') || 1);
var min = +$this.attr('min');
var max = +$this.attr('max');
if(e.wheelDelta > 0) {
if (e.wheelDelta > 0) {
val += step;
} else {
val -= step;
@ -75,10 +75,10 @@ $.ready(function () {
var errAt = location.search.indexOf('err=');
if (errAt !== -1 && qs('.Box.errors')) {
var errs = location.search.substr(errAt+4).split(',');
var errs = location.search.substr(errAt + 4).split(',');
var hres = [];
errs.forEach(function(er) {
var lbl = qs('label[for="'+er+'"]');
errs.forEach(function (er) {
var lbl = qs('label[for="' + er + '"]');
if (lbl) {
lbl.classList.add('error');
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
var br = qs('#brand');
br && br.addEventListener('click', function() {
location.href='/'; // go to terminal
br && br.addEventListener('click', function () {
location.href = '/'; // go to terminal
});
}
});
$._loader = function(vis) {
$._loader = function (vis) {
$('#loader').toggleClass('show', vis);
};
@ -116,7 +116,7 @@ function showPage() {
$('#content').addClass('load');
}
$.ready(function() {
$.ready(function () {
if (window.noAutoShow !== true) {
setTimeout(function () {
showPage();
@ -127,19 +127,20 @@ $.ready(function() {
/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
if (!String.fromCodePoint) {
(function() {
var defineProperty = (function() {
(function () {
var defineProperty = (function () {
// IE 8 only supports `Object.defineProperty` on DOM elements
try {
var object = {};
var $defineProperty = Object.defineProperty;
var result = $defineProperty(object, object, object) && $defineProperty;
} catch(error) {}
} catch (error) {
}
return result;
}());
var stringFromCharCode = String.fromCharCode;
var floor = Math.floor;
var fromCodePoint = function() {
var fromCodePoint = function () {
var MAX_SIZE = 0x4000;
var codeUnits = [];
var highSurrogate;

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

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

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

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

@ -1,5 +1,5 @@
/** File upload utility */
var TermUpl = (function() {
var TermUpl = (function () {
var lines, // array of lines without newlines
line_i, // current line index
fuTout, // timeout handle for line sending
@ -91,7 +91,7 @@ var TermUpl = (function() {
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) {
fuTout = setTimeout(fuSendLine, send_delay_ms);
@ -108,7 +108,7 @@ var TermUpl = (function() {
} else {
fuStatus("Done.");
// delay to show it
setTimeout(function() {
setTimeout(function () {
fuClose();
}, 100);
}
@ -119,20 +119,20 @@ var TermUpl = (function() {
}
return {
init: function() {
init: function () {
qs('#fu_file').addEventListener('change', function (evt) {
var reader = new FileReader();
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.*)/)) {
// 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 = '';
return;
}
}
reader.onload = function(e) {
var txt = e.target.result.replace(/[\r\n]+/,'\n');
reader.onload = function (e) {
var txt = e.target.result.replace(/[\r\n]+/, '\n');
qs('#fu_text').value = txt;
};
console.log("Loading file...");

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

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

@ -51,6 +51,7 @@ return [
'term.default_fg_bg' => 'Text / background',
'term.buttons' => 'Button labels',
'term.theme' => 'Color scheme',
'term.cursor_shape' => 'Cursor style',
'term.parser_tout_ms' => 'Parser timeout',
'term.display_tout_ms' => 'Redraw delay',
'term.display_cooldown_ms' => 'Redraw cooldown',
@ -58,8 +59,16 @@ return [
'term.show_config_links' => 'Show nav links',
'term.show_buttons' => 'Show buttons',
'term.loopback' => 'Local Echo',
'term.crlf_mode' => 'Enter sends CR+LF',
'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
'color.0' => 'Black',
'color.1' => 'Red',

@ -108,6 +108,18 @@
<input class="short" type="text" name="btn5" id="btn5" value="%h:btn5%">
</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">
<a class="button icn-ok" href="#" onclick="qs('#form-1').submit()"><?= tr('apply') ?></a>
</div>
@ -153,6 +165,12 @@
<input type="hidden" id="fn_alt_mode" name="fn_alt_mode" value="%fn_alt_mode%">
</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" >
<label><?= tr('term.show_buttons') ?></label><!--
--><span class="box" tabindex=0 role=checkbox></span>
@ -179,6 +197,7 @@
<script>
$('#default_fg').val(%default_fg%);
$('#default_bg').val(%default_bg%);
$('#cursor_shape').val(%cursor_shape%);
$('#theme').val(%theme%);
function showColor() {

Loading…
Cancel
Save