diff --git a/html_orig/jssrc/soft_keyboard.js b/html_orig/jssrc/soft_keyboard.js
index 68e4834..3bdcdc2 100644
--- a/html_orig/jssrc/soft_keyboard.js
+++ b/html_orig/jssrc/soft_keyboard.js
@@ -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())
})
diff --git a/html_orig/jssrc/term_screen.js b/html_orig/jssrc/term_screen.js
index 625df02..667bf0c 100644
--- a/html_orig/jssrc/term_screen.js
+++ b/html_orig/jssrc/term_screen.js
@@ -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');
}
diff --git a/html_orig/pages/term.php b/html_orig/pages/term.php
index 6464b7e..3dde626 100644
--- a/html_orig/pages/term.php
+++ b/html_orig/pages/term.php
@@ -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();
- }