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(); - }