=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.clipboard.js' --- src/com/goldencode/p2j/ui/client/driver/web/res/p2j.clipboard.js 2015-10-14 16:32:09 +0000 +++ src/com/goldencode/p2j/ui/client/driver/web/res/p2j.clipboard.js 2015-10-15 15:05:27 +0000 @@ -253,6 +253,10 @@ inputText.value = encodeURIComponent(text); // to escape "\n" inputText.focus(); inputText.select(); + var keyObj = p2j.keys_queue.pop(); + var completed = (Date.now() - keyObj.startTime); + console.log("[" + keyObj.seq + "] " + String.fromCodePoint(keyObj.key) + " takes " + + (completed)); } /** * Check if a string is empty. === modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.keyboard.js' --- src/com/goldencode/p2j/ui/client/driver/web/res/p2j.keyboard.js 2015-10-14 16:32:09 +0000 +++ src/com/goldencode/p2j/ui/client/driver/web/res/p2j.keyboard.js 2015-10-15 14:31:53 +0000 @@ -88,6 +88,9 @@ document.addEventListener('keydown', keyboardReader.onkeydown, true); document.addEventListener('keypress', keyboardReader.onkeypress, true); document.addEventListener('keyup', keyboardReader.onkeyup, true); + var sequence = 0; + p2j.keys_queue = []; + p2j.keys_sequence = function() { return ++sequence;}; }; /** @@ -209,6 +212,12 @@ return; } } + p2j.keys_queue.push( + { + key : key, + startTime : Date.now(), + seq : p2j.keys_sequence() + }); sendKeyCode(key); evt.preventDefault(); === modified file 'src/com/goldencode/p2j/ui/client/gui/EditorGuiImpl.java' --- src/com/goldencode/p2j/ui/client/gui/EditorGuiImpl.java 2015-10-14 16:32:09 +0000 +++ src/com/goldencode/p2j/ui/client/gui/EditorGuiImpl.java 2015-10-15 14:38:37 +0000 @@ -198,7 +198,7 @@ public void processKeyEvent(KeyInput ke) { int key = ke.actionCode(); - + gd.setCurrentSelection(String.valueOf(ke.keyChar())); boolean invalidateSelection = true; NativePoint prevCaret = new NativePoint(absoluteX(), absoluteY()); boolean setSelEnd = false;