loleaflet/src/layer/marker/TextInput.js | 65 +++++++++++++++++++++++------- loleaflet/src/map/handler/Map.Keyboard.js | 1 2 files changed, 51 insertions(+), 15 deletions(-)
New commits: commit ca39976735106c1917749a6266622413d3462acc Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Fri Jan 10 22:20:18 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Sat Jan 11 11:38:23 2020 +0100 input: map auto-correct keystrokes to key input for non-mobile. Avoid mobile's extraordinary IM work for now; encouraging the core to tolerate a number of backspace characters is a tad tough for now. Change-Id: Id3cad6ad12384440ee613e88741c395c2d742683 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/86589 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Michael Meeks <michael.me...@collabora.com> diff --git a/loleaflet/src/layer/marker/TextInput.js b/loleaflet/src/layer/marker/TextInput.js index 4a0914b4f..bc6d047a7 100644 --- a/loleaflet/src/layer/marker/TextInput.js +++ b/loleaflet/src/layer/marker/TextInput.js @@ -1,8 +1,11 @@ /* -*- js-indent-level: 8 -*- */ /* - * L.TextInput is the hidden textarea, which handles text - * input events and clipboard selection. + * L.TextInput is the hidden textarea, which handles text input events * + * This is made significantly more difficult than expected by such a + * mess of browser, and mobile IME quirks that it is not possible to + * follow events, but we have to re-construct input from a browser + * text area itself. */ /* global */ @@ -54,6 +57,27 @@ L.TextInput = L.Layer.extend({ var that = this; this._selectionHandler = function(ev) { that._onEvent(ev); } + + // Auto-correct characters can trigger auto-correction, but + // must be sent as key-up/down if we want correction. + // cf. SvxAutoCorrect::IsAutoCorrectChar + this._autoCorrectChars = { + // tab, newline - handled elsewhere + ' ': [ 32, 0, 0, 1284 ], + '!': [ 33, 0, 0, 4353 ], + '"': [ 34, 0, 0, 4353 ], + '%': [ 37, 0, 0, 4357 ], + '\'': [ 39, 0, 0, 192 ], + '*': [ 42, 0, 0, 4360 ], + ',': [ 44, 0, 0, 1291 ], + '-': [ 45, 0, 0, 1288 ], + '.': [ 46, 0, 0, 190 ], + '/': [ 47, 0, 0, 191 ], + ':': [ 58, 0, 0, 5413 ], + ';': [ 59, 0, 0, 1317 ], + '?': [ 63, 0, 0, 4287 ], + '_': [ 95, 0, 0, 5384 ] + }; }, onAdd: function() { @@ -518,8 +542,7 @@ L.TextInput = L.Layer.extend({ this._emptyArea(); } if (parts[i].length > 0) { - this._sendCompositionEvent('input', parts[i]); - this._sendCompositionEvent('end', parts[i]); + this._sendCompositionEvent(parts[i]); } } } @@ -637,17 +660,29 @@ L.TextInput = L.Layer.extend({ }, // Tiny helper - encapsulates sending a 'textinput' websocket message. - // "type" is either "input" for updates or "end" for commits. - _sendCompositionEvent: function _sendCompositionEvent(type, text) { - console.log('sending to lowsd: ', type, text); - this._map._socket.sendMessage( - 'textinput id=' + - this._map.getWinId() + - ' type=' + - type + - ' text=' + - encodeURIComponent(text) - ); + // sends a pair of "input" for a composition update paird with an "end" + _sendCompositionEvent: function _sendCompositionEvent(text) { + console.log('sending to lowsd: ', text); + + // We want to trigger auto-correction, but not if we may + // have to delete a count of characters in the future, + // which is specific to crazy mobile keyboard / IMEs: + if (!window.mode.isMobile() && !window.mode.isTablet() && + this._autoCorrectChars[text]) + { + var codes = this._autoCorrectChars[text]; + this._sendKeyEvent(codes[0], codes[1], 'input'); + this._sendKeyEvent(codes[2], codes[3], 'up'); + } + else + { + var encodedText = encodeURIComponent(text); + var winId = this._map.getWinId(); + this._map._socket.sendMessage( + 'textinput id=' + winId + ' type=input text=' + encodedText); + this._map._socket.sendMessage( + 'textinput id=' + winId + ' type=end text=' + encodedText); + } }, // Tiny helper - encapsulates sending a 'key' or 'windowkey' websocket message diff --git a/loleaflet/src/map/handler/Map.Keyboard.js b/loleaflet/src/map/handler/Map.Keyboard.js index 9eaf92784..8b5a5fad8 100644 --- a/loleaflet/src/map/handler/Map.Keyboard.js +++ b/loleaflet/src/map/handler/Map.Keyboard.js @@ -22,6 +22,7 @@ L.Map.Keyboard = L.Handler.extend({ ctrlMac: 32768 }, + // For UNO keycodes cf. offapi/com/sun/star/awt/Key.idl keymap: { 8 : 1283, // backspace : BACKSPACE 9 : 1282, // tab : TAB _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits