You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-11 13:10:58 +00:00
Android: Include Joysticks/Gamepads which are available on app start.
This commit is contained in:
@@ -1059,4 +1059,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
|||||||
mProgressFraction.setText(Helpers.getDownloadProgressString(progress.mOverallProgress,
|
mProgressFraction.setText(Helpers.getDownloadProgressString(progress.mOverallProgress,
|
||||||
progress.mOverallTotal));
|
progress.mOverallTotal));
|
||||||
}
|
}
|
||||||
|
public void initInputDevices() {
|
||||||
|
mView.initInputDevices();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,6 +111,18 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
|
|||||||
init(translucent, depth, stencil);
|
init(translucent, depth, stencil);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void initInputDevices() {
|
||||||
|
/* initially add input devices*/
|
||||||
|
int[] deviceIds = mInputManager.getInputDeviceIds();
|
||||||
|
for (int deviceId : deviceIds) {
|
||||||
|
InputDevice device = mInputManager.getInputDevice(deviceId);
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.v("GodotView", String.format("init() deviceId:%d, Name:%s\n", deviceId, device.getName()));
|
||||||
|
}
|
||||||
|
onInputDeviceAdded(deviceId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent event) {
|
public boolean onTouchEvent(MotionEvent event) {
|
||||||
@@ -217,36 +229,42 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
|
|||||||
// Check if the device has not been already added
|
// Check if the device has not been already added
|
||||||
if (id < 0) {
|
if (id < 0) {
|
||||||
InputDevice device = mInputManager.getInputDevice(deviceId);
|
InputDevice device = mInputManager.getInputDevice(deviceId);
|
||||||
|
//device can be null if deviceId is not found
|
||||||
|
if (device != null) {
|
||||||
|
int sources = device.getSources();
|
||||||
|
if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) ||
|
||||||
|
((sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK)) {
|
||||||
|
id = joy_devices.size();
|
||||||
|
|
||||||
id = joy_devices.size();
|
joystick joy = new joystick();
|
||||||
|
joy.device_id = deviceId;
|
||||||
|
joy.name = device.getName();
|
||||||
|
joy.axes = new ArrayList<InputDevice.MotionRange>();
|
||||||
|
joy.hats = new ArrayList<InputDevice.MotionRange>();
|
||||||
|
|
||||||
joystick joy = new joystick();
|
List<InputDevice.MotionRange> ranges = device.getMotionRanges();
|
||||||
joy.device_id = deviceId;
|
Collections.sort(ranges, new RangeComparator());
|
||||||
joy.name = device.getName();
|
|
||||||
joy.axes = new ArrayList<InputDevice.MotionRange>();
|
|
||||||
joy.hats = new ArrayList<InputDevice.MotionRange>();
|
|
||||||
|
|
||||||
List<InputDevice.MotionRange> ranges = device.getMotionRanges();
|
for (InputDevice.MotionRange range : ranges) {
|
||||||
Collections.sort(ranges, new RangeComparator());
|
if (range.getAxis() == MotionEvent.AXIS_HAT_X || range.getAxis() == MotionEvent.AXIS_HAT_Y) {
|
||||||
|
joy.hats.add(range);
|
||||||
|
} else {
|
||||||
|
joy.axes.add(range);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (InputDevice.MotionRange range : ranges) {
|
joy_devices.add(joy);
|
||||||
if (range.getAxis() == MotionEvent.AXIS_HAT_X || range.getAxis() == MotionEvent.AXIS_HAT_Y) {
|
|
||||||
joy.hats.add(range);
|
final int device_id = id;
|
||||||
} else {
|
final String name = joy.name;
|
||||||
joy.axes.add(range);
|
queueEvent(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
GodotLib.joyconnectionchanged(device_id, true, name);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
joy_devices.add(joy);
|
|
||||||
|
|
||||||
final int device_id = id;
|
|
||||||
final String name = joy.name;
|
|
||||||
queueEvent(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
GodotLib.joyconnectionchanged(device_id, true, name);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,6 +287,8 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInputDeviceChanged(int deviceId) {
|
public void onInputDeviceChanged(int deviceId) {
|
||||||
|
onInputDeviceRemoved(deviceId);
|
||||||
|
onInputDeviceAdded(deviceId);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public boolean onKeyUp(final int keyCode, KeyEvent event) {
|
public boolean onKeyUp(final int keyCode, KeyEvent event) {
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ GodotJavaWrapper::GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance) {
|
|||||||
_get_clipboard = p_env->GetMethodID(cls, "getClipboard", "()Ljava/lang/String;");
|
_get_clipboard = p_env->GetMethodID(cls, "getClipboard", "()Ljava/lang/String;");
|
||||||
_set_clipboard = p_env->GetMethodID(cls, "setClipboard", "(Ljava/lang/String;)V");
|
_set_clipboard = p_env->GetMethodID(cls, "setClipboard", "(Ljava/lang/String;)V");
|
||||||
_request_permission = p_env->GetMethodID(cls, "requestPermission", "(Ljava/lang/String;)Z");
|
_request_permission = p_env->GetMethodID(cls, "requestPermission", "(Ljava/lang/String;)Z");
|
||||||
|
_init_input_devices = p_env->GetMethodID(cls, "initInputDevices", "()V");
|
||||||
}
|
}
|
||||||
|
|
||||||
GodotJavaWrapper::~GodotJavaWrapper() {
|
GodotJavaWrapper::~GodotJavaWrapper() {
|
||||||
@@ -183,3 +184,10 @@ bool GodotJavaWrapper::request_permission(const String &p_name) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GodotJavaWrapper::init_input_devices() {
|
||||||
|
if (_init_input_devices) {
|
||||||
|
JNIEnv *env = ThreadAndroid::get_env();
|
||||||
|
env->CallVoidMethod(godot_instance, _init_input_devices);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ private:
|
|||||||
jmethodID _get_clipboard = 0;
|
jmethodID _get_clipboard = 0;
|
||||||
jmethodID _set_clipboard = 0;
|
jmethodID _set_clipboard = 0;
|
||||||
jmethodID _request_permission = 0;
|
jmethodID _request_permission = 0;
|
||||||
|
jmethodID _init_input_devices = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance);
|
GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance);
|
||||||
@@ -76,6 +77,7 @@ public:
|
|||||||
bool has_set_clipboard();
|
bool has_set_clipboard();
|
||||||
void set_clipboard(const String &p_text);
|
void set_clipboard(const String &p_text);
|
||||||
bool request_permission(const String &p_name);
|
bool request_permission(const String &p_name);
|
||||||
|
void init_input_devices();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* !JAVA_GODOT_WRAPPER_H */
|
#endif /* !JAVA_GODOT_WRAPPER_H */
|
||||||
|
|||||||
@@ -251,6 +251,10 @@ int OS_Android::get_mouse_button_state() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OS_Android::set_window_title(const String &p_title) {
|
void OS_Android::set_window_title(const String &p_title) {
|
||||||
|
//This queries/updates the currently connected devices/joypads
|
||||||
|
//Set_window_title is called when initializing the main loop (main.cpp)
|
||||||
|
//therefore this place is found to be suitable (I found no better).
|
||||||
|
godot_java->init_input_devices();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OS_Android::set_video_mode(const VideoMode &p_video_mode, int p_screen) {
|
void OS_Android::set_video_mode(const VideoMode &p_video_mode, int p_screen) {
|
||||||
|
|||||||
Reference in New Issue
Block a user