mirror of https://github.com/godotengine/godot
Support vibration for Android and iOS
This commit is contained in:
parent
a5082c010a
commit
081751172a
|
|
@ -76,6 +76,7 @@ void Input::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("get_joy_axis_index_from_string", "axis"), &Input::get_joy_axis_index_from_string);
|
ClassDB::bind_method(D_METHOD("get_joy_axis_index_from_string", "axis"), &Input::get_joy_axis_index_from_string);
|
||||||
ClassDB::bind_method(D_METHOD("start_joy_vibration", "device", "weak_magnitude", "strong_magnitude", "duration"), &Input::start_joy_vibration, DEFVAL(0));
|
ClassDB::bind_method(D_METHOD("start_joy_vibration", "device", "weak_magnitude", "strong_magnitude", "duration"), &Input::start_joy_vibration, DEFVAL(0));
|
||||||
ClassDB::bind_method(D_METHOD("stop_joy_vibration", "device"), &Input::stop_joy_vibration);
|
ClassDB::bind_method(D_METHOD("stop_joy_vibration", "device"), &Input::stop_joy_vibration);
|
||||||
|
ClassDB::bind_method(D_METHOD("vibrate_handheld", "duration_ms"), &Input::vibrate_handheld, DEFVAL(500));
|
||||||
ClassDB::bind_method(D_METHOD("get_gravity"), &Input::get_gravity);
|
ClassDB::bind_method(D_METHOD("get_gravity"), &Input::get_gravity);
|
||||||
ClassDB::bind_method(D_METHOD("get_accelerometer"), &Input::get_accelerometer);
|
ClassDB::bind_method(D_METHOD("get_accelerometer"), &Input::get_accelerometer);
|
||||||
ClassDB::bind_method(D_METHOD("get_magnetometer"), &Input::get_magnetometer);
|
ClassDB::bind_method(D_METHOD("get_magnetometer"), &Input::get_magnetometer);
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,7 @@ public:
|
||||||
virtual uint64_t get_joy_vibration_timestamp(int p_device) = 0;
|
virtual uint64_t get_joy_vibration_timestamp(int p_device) = 0;
|
||||||
virtual void start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration = 0) = 0;
|
virtual void start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration = 0) = 0;
|
||||||
virtual void stop_joy_vibration(int p_device) = 0;
|
virtual void stop_joy_vibration(int p_device) = 0;
|
||||||
|
virtual void vibrate_handheld(int p_duration_ms = 500) = 0;
|
||||||
|
|
||||||
virtual Point2 get_mouse_position() const = 0;
|
virtual Point2 get_mouse_position() const = 0;
|
||||||
virtual Point2 get_last_mouse_speed() const = 0;
|
virtual Point2 get_last_mouse_speed() const = 0;
|
||||||
|
|
|
||||||
|
|
@ -157,6 +157,11 @@ int OS::get_process_id() const {
|
||||||
return -1;
|
return -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void OS::vibrate_handheld(int p_duration_ms) {
|
||||||
|
|
||||||
|
WARN_PRINTS("vibrate_handheld() only works with Android and iOS");
|
||||||
|
}
|
||||||
|
|
||||||
bool OS::is_stdout_verbose() const {
|
bool OS::is_stdout_verbose() const {
|
||||||
|
|
||||||
return _verbose_stdout;
|
return _verbose_stdout;
|
||||||
|
|
|
||||||
|
|
@ -263,6 +263,7 @@ public:
|
||||||
virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false) = 0;
|
virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false) = 0;
|
||||||
virtual Error kill(const ProcessID &p_pid) = 0;
|
virtual Error kill(const ProcessID &p_pid) = 0;
|
||||||
virtual int get_process_id() const;
|
virtual int get_process_id() const;
|
||||||
|
virtual void vibrate_handheld(int p_duration_ms = 500);
|
||||||
|
|
||||||
virtual Error shell_open(String p_uri);
|
virtual Error shell_open(String p_uri);
|
||||||
virtual Error set_cwd(const String &p_cwd);
|
virtual Error set_cwd(const String &p_cwd);
|
||||||
|
|
|
||||||
|
|
@ -357,6 +357,16 @@
|
||||||
Stops the vibration of the joypad.
|
Stops the vibration of the joypad.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="vibrate_handheld">
|
||||||
|
<return type="void">
|
||||||
|
</return>
|
||||||
|
<argument index="0" name="duration_ms" type="int" default="500">
|
||||||
|
</argument>
|
||||||
|
<description>
|
||||||
|
Vibrate Android and iOS devices.
|
||||||
|
[b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS does not support duration.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="warp_mouse_position">
|
<method name="warp_mouse_position">
|
||||||
<return type="void">
|
<return type="void">
|
||||||
</return>
|
</return>
|
||||||
|
|
|
||||||
|
|
@ -472,6 +472,10 @@ void InputDefault::stop_joy_vibration(int p_device) {
|
||||||
joy_vibration[p_device] = vibration;
|
joy_vibration[p_device] = vibration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InputDefault::vibrate_handheld(int p_duration_ms) {
|
||||||
|
OS::get_singleton()->vibrate_handheld(p_duration_ms);
|
||||||
|
}
|
||||||
|
|
||||||
void InputDefault::set_gravity(const Vector3 &p_gravity) {
|
void InputDefault::set_gravity(const Vector3 &p_gravity) {
|
||||||
|
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
|
|
|
||||||
|
|
@ -226,6 +226,7 @@ public:
|
||||||
|
|
||||||
virtual void start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration = 0);
|
virtual void start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration = 0);
|
||||||
virtual void stop_joy_vibration(int p_device);
|
virtual void stop_joy_vibration(int p_device);
|
||||||
|
virtual void vibrate_handheld(int p_duration_ms = 500);
|
||||||
|
|
||||||
void set_main_loop(MainLoop *p_main_loop);
|
void set_main_loop(MainLoop *p_main_loop);
|
||||||
void set_mouse_position(const Point2 &p_posf);
|
void set_mouse_position(const Point2 &p_posf);
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,7 @@ import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.Messenger;
|
import android.os.Messenger;
|
||||||
|
import android.os.Vibrator;
|
||||||
import android.provider.Settings.Secure;
|
import android.provider.Settings.Secure;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
@ -104,6 +105,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||||
static final int MAX_SINGLETONS = 64;
|
static final int MAX_SINGLETONS = 64;
|
||||||
static final int REQUEST_RECORD_AUDIO_PERMISSION = 1;
|
static final int REQUEST_RECORD_AUDIO_PERMISSION = 1;
|
||||||
static final int REQUEST_CAMERA_PERMISSION = 2;
|
static final int REQUEST_CAMERA_PERMISSION = 2;
|
||||||
|
static final int REQUEST_VIBRATE_PERMISSION = 3;
|
||||||
private IStub mDownloaderClientStub;
|
private IStub mDownloaderClientStub;
|
||||||
private IDownloaderService mRemoteService;
|
private IDownloaderService mRemoteService;
|
||||||
private TextView mStatusText;
|
private TextView mStatusText;
|
||||||
|
|
@ -328,6 +330,15 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void vibrate(int p_duration_ms) {
|
||||||
|
if (requestPermission("VIBRATE")) {
|
||||||
|
Vibrator v = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
|
||||||
|
if (v != null) {
|
||||||
|
v.vibrate(p_duration_ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void restart() {
|
public void restart() {
|
||||||
// HACK:
|
// HACK:
|
||||||
//
|
//
|
||||||
|
|
@ -964,6 +975,13 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_name.equals("VIBRATE")) {
|
||||||
|
if (ContextCompat.checkSelfPermission(this, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requestPermissions(new String[] { Manifest.permission.VIBRATE }, REQUEST_VIBRATE_PERMISSION);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -622,6 +622,7 @@ static jmethodID _stopVideo = 0;
|
||||||
static jmethodID _setKeepScreenOn = 0;
|
static jmethodID _setKeepScreenOn = 0;
|
||||||
static jmethodID _alertDialog = 0;
|
static jmethodID _alertDialog = 0;
|
||||||
static jmethodID _requestPermission = 0;
|
static jmethodID _requestPermission = 0;
|
||||||
|
static jmethodID _vibrateDevice = 0;
|
||||||
|
|
||||||
static void _gfx_init_func(void *ud, bool gl2) {
|
static void _gfx_init_func(void *ud, bool gl2) {
|
||||||
}
|
}
|
||||||
|
|
@ -753,6 +754,11 @@ static bool _request_permission(const String &p_name) {
|
||||||
return env->CallBooleanMethod(_godot_instance, _requestPermission, jStrName);
|
return env->CallBooleanMethod(_godot_instance, _requestPermission, jStrName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _vibrate(int p_duration_ms) {
|
||||||
|
JNIEnv *env = ThreadAndroid::get_env();
|
||||||
|
env->CallVoidMethod(_godot_instance, _vibrateDevice, p_duration_ms);
|
||||||
|
}
|
||||||
|
|
||||||
// volatile because it can be changed from non-main thread and we need to
|
// volatile because it can be changed from non-main thread and we need to
|
||||||
// ensure the change is immediately visible to other threads.
|
// ensure the change is immediately visible to other threads.
|
||||||
static volatile int virtual_keyboard_height;
|
static volatile int virtual_keyboard_height;
|
||||||
|
|
@ -798,6 +804,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *en
|
||||||
_getClipboard = env->GetMethodID(cls, "getClipboard", "()Ljava/lang/String;");
|
_getClipboard = env->GetMethodID(cls, "getClipboard", "()Ljava/lang/String;");
|
||||||
_setClipboard = env->GetMethodID(cls, "setClipboard", "(Ljava/lang/String;)V");
|
_setClipboard = env->GetMethodID(cls, "setClipboard", "(Ljava/lang/String;)V");
|
||||||
_requestPermission = env->GetMethodID(cls, "requestPermission", "(Ljava/lang/String;)Z");
|
_requestPermission = env->GetMethodID(cls, "requestPermission", "(Ljava/lang/String;)Z");
|
||||||
|
_vibrateDevice = env->GetMethodID(cls, "vibrate", "(I)V");
|
||||||
|
|
||||||
if (cls) {
|
if (cls) {
|
||||||
jclass c = env->GetObjectClass(gob);
|
jclass c = env->GetObjectClass(gob);
|
||||||
|
|
@ -830,7 +837,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *en
|
||||||
AudioDriverAndroid::setup(gob);
|
AudioDriverAndroid::setup(gob);
|
||||||
}
|
}
|
||||||
|
|
||||||
os_android = new OS_Android(_gfx_init_func, env, _open_uri, _get_user_data_dir, _get_locale, _get_model, _get_screen_dpi, _show_vk, _hide_vk, _get_vk_height, _set_screen_orient, _get_unique_id, _get_system_dir, _get_gles_version_code, _play_video, _is_video_playing, _pause_video, _stop_video, _set_keep_screen_on, _alert, _set_clipboard, _get_clipboard, _request_permission, p_use_apk_expansion);
|
os_android = new OS_Android(_gfx_init_func, env, _open_uri, _get_user_data_dir, _get_locale, _get_model, _get_screen_dpi, _show_vk, _hide_vk, _get_vk_height, _set_screen_orient, _get_unique_id, _get_system_dir, _get_gles_version_code, _play_video, _is_video_playing, _pause_video, _stop_video, _set_keep_screen_on, _alert, _set_clipboard, _get_clipboard, _request_permission, _vibrate, p_use_apk_expansion);
|
||||||
|
|
||||||
char wd[500];
|
char wd[500];
|
||||||
getcwd(wd, 500);
|
getcwd(wd, 500);
|
||||||
|
|
|
||||||
|
|
@ -698,6 +698,11 @@ String OS_Android::get_joy_guid(int p_device) const {
|
||||||
return input->get_joy_guid_remapped(p_device);
|
return input->get_joy_guid_remapped(p_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OS_Android::vibrate_handheld(int p_duration_ms) {
|
||||||
|
if (vibrate_func)
|
||||||
|
vibrate_func(p_duration_ms);
|
||||||
|
}
|
||||||
|
|
||||||
bool OS_Android::_check_internal_feature_support(const String &p_feature) {
|
bool OS_Android::_check_internal_feature_support(const String &p_feature) {
|
||||||
if (p_feature == "mobile") {
|
if (p_feature == "mobile") {
|
||||||
//TODO support etc2 only if GLES3 driver is selected
|
//TODO support etc2 only if GLES3 driver is selected
|
||||||
|
|
@ -719,7 +724,7 @@ bool OS_Android::_check_internal_feature_support(const String &p_feature) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
OS_Android::OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetUserDataDirFunc p_get_user_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, VirtualKeyboardHeightFunc p_vk_height_func, SetScreenOrientationFunc p_screen_orient, GetUniqueIDFunc p_get_unique_id, GetSystemDirFunc p_get_sdir_func, GetGLVersionCodeFunc p_get_gl_version_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, SetClipboardFunc p_set_clipboard_func, GetClipboardFunc p_get_clipboard_func, RequestPermissionFunc p_request_permission, bool p_use_apk_expansion) {
|
OS_Android::OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetUserDataDirFunc p_get_user_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, VirtualKeyboardHeightFunc p_vk_height_func, SetScreenOrientationFunc p_screen_orient, GetUniqueIDFunc p_get_unique_id, GetSystemDirFunc p_get_sdir_func, GetGLVersionCodeFunc p_get_gl_version_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, SetClipboardFunc p_set_clipboard_func, GetClipboardFunc p_get_clipboard_func, RequestPermissionFunc p_request_permission, VibrateFunc p_vibrate_func, bool p_use_apk_expansion) {
|
||||||
|
|
||||||
use_apk_expansion = p_use_apk_expansion;
|
use_apk_expansion = p_use_apk_expansion;
|
||||||
default_videomode.width = 800;
|
default_videomode.width = 800;
|
||||||
|
|
@ -759,6 +764,7 @@ OS_Android::OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURI
|
||||||
set_keep_screen_on_func = p_set_keep_screen_on_func;
|
set_keep_screen_on_func = p_set_keep_screen_on_func;
|
||||||
alert_func = p_alert_func;
|
alert_func = p_alert_func;
|
||||||
request_permission_func = p_request_permission;
|
request_permission_func = p_request_permission;
|
||||||
|
vibrate_func = p_vibrate_func;
|
||||||
|
|
||||||
Vector<Logger *> loggers;
|
Vector<Logger *> loggers;
|
||||||
loggers.push_back(memnew(AndroidLogger));
|
loggers.push_back(memnew(AndroidLogger));
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,7 @@ typedef void (*SetKeepScreenOnFunc)(bool p_enabled);
|
||||||
typedef void (*AlertFunc)(const String &, const String &);
|
typedef void (*AlertFunc)(const String &, const String &);
|
||||||
typedef int (*VirtualKeyboardHeightFunc)();
|
typedef int (*VirtualKeyboardHeightFunc)();
|
||||||
typedef bool (*RequestPermissionFunc)(const String &);
|
typedef bool (*RequestPermissionFunc)(const String &);
|
||||||
|
typedef void (*VibrateFunc)(int);
|
||||||
|
|
||||||
class OS_Android : public OS_Unix {
|
class OS_Android : public OS_Unix {
|
||||||
public:
|
public:
|
||||||
|
|
@ -134,6 +135,7 @@ private:
|
||||||
SetKeepScreenOnFunc set_keep_screen_on_func;
|
SetKeepScreenOnFunc set_keep_screen_on_func;
|
||||||
AlertFunc alert_func;
|
AlertFunc alert_func;
|
||||||
RequestPermissionFunc request_permission_func;
|
RequestPermissionFunc request_permission_func;
|
||||||
|
VibrateFunc vibrate_func;
|
||||||
|
|
||||||
//PowerAndroid *power_manager;
|
//PowerAndroid *power_manager;
|
||||||
int video_driver_index;
|
int video_driver_index;
|
||||||
|
|
@ -239,9 +241,10 @@ public:
|
||||||
virtual bool is_joy_known(int p_device);
|
virtual bool is_joy_known(int p_device);
|
||||||
virtual String get_joy_guid(int p_device) const;
|
virtual String get_joy_guid(int p_device) const;
|
||||||
void joy_connection_changed(int p_device, bool p_connected, String p_name);
|
void joy_connection_changed(int p_device, bool p_connected, String p_name);
|
||||||
|
void vibrate_handheld(int p_duration_ms = 500);
|
||||||
|
|
||||||
virtual bool _check_internal_feature_support(const String &p_feature);
|
virtual bool _check_internal_feature_support(const String &p_feature);
|
||||||
OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetUserDataDirFunc p_get_user_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, VirtualKeyboardHeightFunc p_vk_height_func, SetScreenOrientationFunc p_screen_orient, GetUniqueIDFunc p_get_unique_id, GetSystemDirFunc p_get_sdir_func, GetGLVersionCodeFunc p_get_gl_version_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, SetClipboardFunc p_set_clipboard, GetClipboardFunc p_get_clipboard, RequestPermissionFunc p_request_permission, bool p_use_apk_expansion);
|
OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetUserDataDirFunc p_get_user_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, VirtualKeyboardHeightFunc p_vk_height_func, SetScreenOrientationFunc p_screen_orient, GetUniqueIDFunc p_get_unique_id, GetSystemDirFunc p_get_sdir_func, GetGLVersionCodeFunc p_get_gl_version_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, SetClipboardFunc p_set_clipboard, GetClipboardFunc p_get_clipboard, RequestPermissionFunc p_request_permission, VibrateFunc p_vibrate_func, bool p_use_apk_expansion);
|
||||||
~OS_Android();
|
~OS_Android();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@
|
||||||
#include "os_iphone.h"
|
#include "os_iphone.h"
|
||||||
|
|
||||||
#import "GameController/GameController.h"
|
#import "GameController/GameController.h"
|
||||||
|
#import <AudioToolbox/AudioServices.h>
|
||||||
|
|
||||||
#define kFilteringFactor 0.1
|
#define kFilteringFactor 0.1
|
||||||
#define kRenderingFrequency 60
|
#define kRenderingFrequency 60
|
||||||
|
|
@ -61,6 +62,10 @@ void _set_keep_screen_on(bool p_enabled) {
|
||||||
[[UIApplication sharedApplication] setIdleTimerDisabled:(BOOL)p_enabled];
|
[[UIApplication sharedApplication] setIdleTimerDisabled:(BOOL)p_enabled];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void _vibrate() {
|
||||||
|
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
|
||||||
|
};
|
||||||
|
|
||||||
@implementation AppDelegate
|
@implementation AppDelegate
|
||||||
|
|
||||||
@synthesize window;
|
@synthesize window;
|
||||||
|
|
|
||||||
|
|
@ -464,6 +464,7 @@ extern void _show_keyboard(String p_existing);
|
||||||
extern void _hide_keyboard();
|
extern void _hide_keyboard();
|
||||||
extern Error _shell_open(String p_uri);
|
extern Error _shell_open(String p_uri);
|
||||||
extern void _set_keep_screen_on(bool p_enabled);
|
extern void _set_keep_screen_on(bool p_enabled);
|
||||||
|
extern void _vibrate();
|
||||||
|
|
||||||
void OSIPhone::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect) {
|
void OSIPhone::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect) {
|
||||||
_show_keyboard(p_existing_text);
|
_show_keyboard(p_existing_text);
|
||||||
|
|
@ -585,6 +586,11 @@ void OSIPhone::native_video_stop() {
|
||||||
_stop_video();
|
_stop_video();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OSIPhone::vibrate_handheld(int p_duration_ms) {
|
||||||
|
// iOS does not support duration for vibration
|
||||||
|
_vibrate();
|
||||||
|
}
|
||||||
|
|
||||||
bool OSIPhone::_check_internal_feature_support(const String &p_feature) {
|
bool OSIPhone::_check_internal_feature_support(const String &p_feature) {
|
||||||
|
|
||||||
return p_feature == "mobile";
|
return p_feature == "mobile";
|
||||||
|
|
|
||||||
|
|
@ -195,6 +195,7 @@ public:
|
||||||
virtual void native_video_unpause();
|
virtual void native_video_unpause();
|
||||||
virtual void native_video_focus_out();
|
virtual void native_video_focus_out();
|
||||||
virtual void native_video_stop();
|
virtual void native_video_stop();
|
||||||
|
virtual void vibrate_handheld(int p_duration_ms = 500);
|
||||||
|
|
||||||
virtual bool _check_internal_feature_support(const String &p_feature);
|
virtual bool _check_internal_feature_support(const String &p_feature);
|
||||||
OSIPhone(int width, int height, String p_data_dir);
|
OSIPhone(int width, int height, String p_data_dir);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue