diff --git a/lime/_backend/html5/HTML5Window.hx b/lime/_backend/html5/HTML5Window.hx index d85fbda2e..9c5e62bf5 100644 --- a/lime/_backend/html5/HTML5Window.hx +++ b/lime/_backend/html5/HTML5Window.hx @@ -10,11 +10,13 @@ import js.html.InputElement; import js.html.InputEvent; import js.html.MouseEvent; import js.html.TouchEvent; +import js.html.ClipboardEvent; import js.Browser; import lime.app.Application; import lime.graphics.Image; import lime.system.Display; import lime.system.System; +import lime.system.Clipboard; import lime.ui.Gamepad; import lime.ui.Joystick; import lime.ui.Touch; @@ -277,12 +279,36 @@ class HTML5Window { } + private function handleCutOrCopyEvent (event:ClipboardEvent):Void { + + event.clipboardData.setData('text/plain', Clipboard.text); + event.preventDefault(); // We want our data, not data from any selection, to be written to the clipboard + + } + + + private function handlePasteEvent (event:ClipboardEvent):Void { + + if(untyped event.clipboardData.types.indexOf('text/plain') > -1){ + var text = Clipboard.text = event.clipboardData.getData('text/plain'); + parent.onTextInput.dispatch (text); + + // We are already handling the data from the clipboard, we do not want it inserted into the hidden input + event.preventDefault(); + } + + } + + private function handleInputEvent (event:InputEvent):Void { - if (textInput.value != "") { + // In order to ensure that the browser will fire clipboard events, we always need to have something selected. + // Therefore, `value` cannot be "". + + if (textInput.value != " ") { - parent.onTextInput.dispatch (textInput.value); - textInput.value = ""; + parent.onTextInput.dispatch (textInput.value.substr(1)); + textInput.value = " "; } @@ -648,7 +674,7 @@ class HTML5Window { textInput.style.position = 'absolute'; textInput.style.opacity = "0"; textInput.style.color = "transparent"; - textInput.value = ""; + textInput.value = " "; // See: handleInputEvent() untyped textInput.autocapitalize = "off"; untyped textInput.autocorrect = "off"; @@ -683,10 +709,14 @@ class HTML5Window { textInput.addEventListener ('input', handleInputEvent, true); textInput.addEventListener ('blur', handleFocusEvent, true); + textInput.addEventListener ('cut', handleCutOrCopyEvent, true); + textInput.addEventListener ('copy', handleCutOrCopyEvent, true); + textInput.addEventListener ('paste', handlePasteEvent, true); } textInput.focus (); + textInput.select (); } else { @@ -694,6 +724,9 @@ class HTML5Window { textInput.removeEventListener ('input', handleInputEvent, true); textInput.removeEventListener ('blur', handleFocusEvent, true); + textInput.removeEventListener ('cut', handleCutOrCopyEvent, true); + textInput.removeEventListener ('copy', handleCutOrCopyEvent, true); + textInput.removeEventListener ('paste', handlePasteEvent, true); textInput.blur (); diff --git a/lime/system/Clipboard.hx b/lime/system/Clipboard.hx index 728b31603..88f3ed37a 100644 --- a/lime/system/Clipboard.hx +++ b/lime/system/Clipboard.hx @@ -3,6 +3,8 @@ package lime.system; #if flash import flash.desktop.Clipboard in FlashClipboard; +#elseif js +import js.Browser.document; #end #if !macro @@ -14,6 +16,10 @@ class Clipboard { public static var text (get, set):String; + + #if js + private static var _text : String; + #end @@ -33,6 +39,8 @@ class Clipboard { return FlashClipboard.generalClipboard.getData (TEXT_FORMAT); } + #elseif js + return _text; #end return null; @@ -45,8 +53,19 @@ class Clipboard { #if (lime_cffi && !macro) lime_clipboard_set_text (value); return value; + #elseif flash FlashClipboard.generalClipboard.setData (TEXT_FORMAT, value); + return value; + + #elseif js + _text = value; + + #if html5 + if (document.queryCommandEnabled("copy")) + document.execCommand("copy"); + #end + return value; #end