From fb7ecc748ff7ef60e70078a8e52f355669066ddb Mon Sep 17 00:00:00 2001 From: pattlebass <49322676+pattlebass@users.noreply.github.com> Date: Wed, 27 Jul 2022 13:51:40 +0300 Subject: [PATCH] [3.x] HTML5: Add support for `Input.vibrate_handheld()` --- core/os/os.cpp | 2 +- doc/classes/Input.xml | 4 +++- platform/javascript/godot_js.h | 1 + platform/javascript/js/libs/library_godot_input.js | 9 +++++++++ platform/javascript/os_javascript.cpp | 4 ++++ platform/javascript/os_javascript.h | 1 + 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/os/os.cpp b/core/os/os.cpp index 385ebfa5485e..d7b915dd5a6f 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -187,7 +187,7 @@ int OS::get_process_id() const { }; void OS::vibrate_handheld(int p_duration_ms) { - WARN_PRINT("vibrate_handheld() only works with Android and iOS"); + WARN_PRINT("vibrate_handheld() only works with Android, iOS and HTML5"); } bool OS::is_stdout_verbose() const { diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml index 49f94cc99b72..359b91b2608b 100644 --- a/doc/classes/Input.xml +++ b/doc/classes/Input.xml @@ -379,9 +379,11 @@ - Vibrate Android and iOS devices. + Vibrate handheld devices. + [b]Note:[/b] This method is implemented on Android, iOS, and HTML5. [b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] permission in the export preset. [b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and later. + [b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not support this method. diff --git a/platform/javascript/godot_js.h b/platform/javascript/godot_js.h index d300d9fc3173..340b9c7193f9 100644 --- a/platform/javascript/godot_js.h +++ b/platform/javascript/godot_js.h @@ -58,6 +58,7 @@ extern void godot_js_input_mouse_move_cb(void (*p_callback)(double p_x, double p extern void godot_js_input_mouse_wheel_cb(int (*p_callback)(double p_delta_x, double p_delta_y)); extern void godot_js_input_touch_cb(void (*p_callback)(int p_type, int p_count), uint32_t *r_identifiers, double *r_coords); extern void godot_js_input_key_cb(void (*p_callback)(int p_type, int p_repeat, int p_modifiers), char r_code[32], char r_key[32]); +extern void godot_js_input_vibrate_handheld(int p_duration_ms); // Input gamepad extern void godot_js_input_gamepad_cb(void (*p_on_change)(int p_index, int p_connected, const char *p_id, const char *p_guid)); diff --git a/platform/javascript/js/libs/library_godot_input.js b/platform/javascript/js/libs/library_godot_input.js index 1e64c260f8d9..51571d64a2f9 100644 --- a/platform/javascript/js/libs/library_godot_input.js +++ b/platform/javascript/js/libs/library_godot_input.js @@ -534,6 +534,15 @@ const GodotInput = { GodotRuntime.free(ptr); }, false); }, + + godot_js_input_vibrate_handheld__sig: 'vi', + godot_js_input_vibrate_handheld: function (p_duration_ms) { + if (typeof navigator.vibrate !== 'function') { + GodotRuntime.print('This browser does not support vibration.'); + } else { + navigator.vibrate(p_duration_ms); + } + }, }; autoAddDeps(GodotInput, '$GodotInput'); diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp index 991b7a651476..43d3dfd77f14 100644 --- a/platform/javascript/os_javascript.cpp +++ b/platform/javascript/os_javascript.cpp @@ -992,6 +992,10 @@ bool OS_JavaScript::can_draw() const { return true; // Always? } +void OS_JavaScript::vibrate_handheld(int p_duration_ms) { + godot_js_input_vibrate_handheld(p_duration_ms); +} + String OS_JavaScript::get_user_data_dir() const { return "/userfs"; }; diff --git a/platform/javascript/os_javascript.h b/platform/javascript/os_javascript.h index a1cc7aa8371b..e88d152e5209 100644 --- a/platform/javascript/os_javascript.h +++ b/platform/javascript/os_javascript.h @@ -186,6 +186,7 @@ class OS_JavaScript : public OS_Unix { virtual String get_name() const; virtual void add_frame_delay(bool p_can_draw) {} virtual bool can_draw() const; + virtual void vibrate_handheld(int p_duration_ms); virtual String get_cache_path() const; virtual String get_config_path() const;