Merge pull request #29298 from Faless/javascript/clipboard

Partial Javascript clipboard support
This commit is contained in:
Rémi Verschelde 2019-06-01 11:18:25 +02:00 committed by GitHub
commit f7953ddea8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 0 deletions

View File

@ -795,6 +795,47 @@ const char *OS_JavaScript::get_audio_driver_name(int p_driver) const {
return "JavaScript"; return "JavaScript";
} }
// Clipboard
extern "C" EMSCRIPTEN_KEEPALIVE void update_clipboard(const char *p_text) {
// Only call set_clipboard from OS (sets local clipboard)
OS::get_singleton()->OS::set_clipboard(p_text);
}
void OS_JavaScript::set_clipboard(const String &p_text) {
OS::set_clipboard(p_text);
/* clang-format off */
int err = EM_ASM_INT({
var text = UTF8ToString($0);
if (!navigator.clipboard || !navigator.clipboard.writeText)
return 1;
navigator.clipboard.writeText(text).catch(e => {
// Setting OS clipboard is only possible from an input callback.
console.error("Setting OS clipboard is only possible from an input callback for the HTML5 plafrom. Exception:", e);
});
return 0;
}, p_text.utf8().get_data());
/* clang-format on */
ERR_EXPLAIN("Clipboard API is not supported.");
ERR_FAIL_COND(err);
}
String OS_JavaScript::get_clipboard() const {
/* clang-format off */
EM_ASM({
try {
navigator.clipboard.readText().then(function (result) {
ccall('update_clipboard', 'void', ['string'], [result]);
}).catch(function (e) {
// Fail graciously.
});
} catch (e) {
// Fail graciously.
}
});
/* clang-format on */
return this->OS::get_clipboard();
}
// Lifecycle // Lifecycle
int OS_JavaScript::get_current_video_driver() const { int OS_JavaScript::get_current_video_driver() const {
return video_driver_index; return video_driver_index;
@ -939,6 +980,11 @@ Error OS_JavaScript::initialize(const VideoMode &p_desired, int p_video_driver,
(['mouseover', 'mouseleave', 'focus', 'blur']).forEach(function(event, index) { (['mouseover', 'mouseleave', 'focus', 'blur']).forEach(function(event, index) {
Module.canvas.addEventListener(event, send_notification.bind(null, notifications[index])); Module.canvas.addEventListener(event, send_notification.bind(null, notifications[index]));
}); });
// Clipboard
const update_clipboard = cwrap('update_clipboard', null, ['string']);
window.addEventListener('paste', function(evt) {
update_clipboard(evt.clipboardData.getData('text'));
}, true);
}, },
MainLoop::NOTIFICATION_WM_MOUSE_ENTER, MainLoop::NOTIFICATION_WM_MOUSE_ENTER,
MainLoop::NOTIFICATION_WM_MOUSE_EXIT, MainLoop::NOTIFICATION_WM_MOUSE_EXIT,

View File

@ -133,6 +133,9 @@ public:
virtual int get_audio_driver_count() const; virtual int get_audio_driver_count() const;
virtual const char *get_audio_driver_name(int p_driver) const; virtual const char *get_audio_driver_name(int p_driver) const;
virtual void set_clipboard(const String &p_text);
virtual String get_clipboard() const;
virtual MainLoop *get_main_loop() const; virtual MainLoop *get_main_loop() const;
void run_async(); void run_async();
bool main_loop_iterate(); bool main_loop_iterate();