Use proper soft keyboard events

...or as close as it gets because the way input events work on mobile is awful.
http-comm
cpsdqs 7 years ago
parent 93824964ed
commit 7407419e56
Signed by untrusted user: cpsdqs
GPG Key ID: 3F59586BB7448DD1
  1. 61
      html_orig/jssrc/soft_keyboard.js
  2. 6
      html_orig/jssrc/term_screen.js
  3. 15
      html_orig/pages/term.php

@ -23,16 +23,63 @@ $.ready(() => {
else input.blur()
}
input.addEventListener('keydown', e => {
if (e.key === 'Backspace') {
e.preventDefault()
e.stopPropagation()
Input.sendString('\b')
let lastCompositionString = '';
let compositing = false;
let sendInputDelta = function (newValue) {
let resend = false;
if (newValue.length > lastCompositionString.length) {
if (newValue.startsWith(lastCompositionString)) {
// characters have been added at the end
Input.sendString(newValue.substr(lastCompositionString.length))
} else resend = true;
} else if (newValue.length < lastCompositionString.length) {
if (lastCompositionString.startsWith(newValue)) {
// characters have been removed at the end
Input.sendString('\b'.repeat(lastCompositionString.length -
newValue.length))
} else resend = true;
} else if (newValue !== lastCompositionString) resend = true;
if (resend) {
// the entire string changed; resend everything
Input.sendString('\b'.repeat(lastCompositionString.length) +
newValue)
}
lastCompositionString = newValue;
}
input.addEventListener('keydown', e => {
if (e.key === 'Unidentified') return;
e.preventDefault();
input.value = '';
if (e.key === 'Backspace') Input.sendString('\b')
else if (e.key === 'Enter') Input.sendString('\x0d')
})
input.addEventListener('keypress', e => {
e.stopPropagation()
input.addEventListener('input', e => {
e.stopPropagation();
if (e.isComposing) {
sendInputDelta(e.data);
} else {
if (e.data) Input.sendString(e.data);
else if (e.inputType === 'deleteContentBackward') {
lastCompositionString
sendInputDelta('');
}
}
})
input.addEventListener('compositionstart', e => {
lastCompositionString = '';
compositing = true;
});
input.addEventListener('compositionend', e => {
lastCompositionString = '';
compositing = false;
input.value = '';
});
Screen.on('open-soft-keyboard', () => input.focus())
})

@ -333,9 +333,9 @@ class TermScreen {
}
// schedule a draw in the next tick
scheduleDraw () {
scheduleDraw (aggregateTime = 1) {
clearTimeout(this._scheduledDraw);
this._scheduledDraw = setTimeout(() => this.draw(), 1)
this._scheduledDraw = setTimeout(() => this.draw(), aggregateTime)
}
getFont (modifiers = {}) {
@ -788,7 +788,7 @@ class TermScreen {
}
}
this.scheduleDraw();
this.scheduleDraw(16);
this.emit('load');
}

@ -71,15 +71,6 @@
window.noAutoShow = true;
termInit(); // the screen will be loaded via ajax
Screen.load('%j:labels_seq%');
// auto-clear the input box
$('#softkb-input').on('input', function(e) {
setTimeout(function(){
var str = $('#softkb-input').val();
$('#softkb-input').val('');
Input.sendString(str);
}, 1);
});
} catch(e) {
console.error(e);
console.error("Fail, reloading in 3s…");
@ -87,10 +78,4 @@
location.reload(true);
}, 3000);
}
function kbOpen(yes) {
var i = qs('#softkb-input');
if (yes) i.focus();
else i.blur();
}
</script>

Loading…
Cancel
Save