forked from Clones/Controlify
➕ Config option delegate_setup
to not discover controllers immediately.
This commit is contained in:
@ -63,6 +63,7 @@ public class Controlify implements ControlifyApi {
|
|||||||
private final ControlifyConfig config = new ControlifyConfig(this);
|
private final ControlifyConfig config = new ControlifyConfig(this);
|
||||||
|
|
||||||
private final Queue<Controller<?, ?>> calibrationQueue = new ArrayDeque<>();
|
private final Queue<Controller<?, ?>> calibrationQueue = new ArrayDeque<>();
|
||||||
|
private boolean canDiscoverControllers = true;
|
||||||
|
|
||||||
private int consecutiveInputSwitches = 0;
|
private int consecutiveInputSwitches = 0;
|
||||||
private double lastInputSwitchTime = 0;
|
private double lastInputSwitchTime = 0;
|
||||||
@ -78,7 +79,20 @@ public class Controlify implements ControlifyApi {
|
|||||||
|
|
||||||
var controllersConnected = IntStream.range(0, GLFW.GLFW_JOYSTICK_LAST + 1).anyMatch(GLFW::glfwJoystickPresent);
|
var controllersConnected = IntStream.range(0, GLFW.GLFW_JOYSTICK_LAST + 1).anyMatch(GLFW::glfwJoystickPresent);
|
||||||
if (controllersConnected) {
|
if (controllersConnected) {
|
||||||
askNatives().whenComplete((loaded, th) -> discoverControllers());
|
if (!config().globalSettings().delegateSetup) {
|
||||||
|
askNatives().whenComplete((loaded, th) -> discoverControllers());
|
||||||
|
} else {
|
||||||
|
ToastUtils.sendToast(
|
||||||
|
Component.translatable("controlify.toast.setup_in_config.title"),
|
||||||
|
Component.translatable(
|
||||||
|
"controlify.toast.setup_in_config.description",
|
||||||
|
Component.translatable("options.title"),
|
||||||
|
Component.translatable("controls.keybinds.title"),
|
||||||
|
Component.literal("Controlify")
|
||||||
|
),
|
||||||
|
false
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// listen for new controllers
|
// listen for new controllers
|
||||||
@ -107,7 +121,7 @@ public class Controlify implements ControlifyApi {
|
|||||||
nativeOnboardingFuture = new CompletableFuture<>();
|
nativeOnboardingFuture = new CompletableFuture<>();
|
||||||
|
|
||||||
minecraft.setScreen(new SDLOnboardingScreen(
|
minecraft.setScreen(new SDLOnboardingScreen(
|
||||||
minecraft.screen,
|
() -> minecraft.screen,
|
||||||
answer -> {
|
answer -> {
|
||||||
if (answer)
|
if (answer)
|
||||||
SDL2NativesManager.initialise();
|
SDL2NativesManager.initialise();
|
||||||
@ -118,7 +132,12 @@ public class Controlify implements ControlifyApi {
|
|||||||
return nativeOnboardingFuture;
|
return nativeOnboardingFuture;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void discoverControllers() {
|
public void discoverControllers() {
|
||||||
|
if (!canDiscoverControllers) {
|
||||||
|
throw new IllegalStateException("Cannot discover controllers!");
|
||||||
|
}
|
||||||
|
canDiscoverControllers = false;
|
||||||
|
|
||||||
DebugLog.log("Discovering and initializing controllers...");
|
DebugLog.log("Discovering and initializing controllers...");
|
||||||
|
|
||||||
if (config().globalSettings().loadVibrationNatives)
|
if (config().globalSettings().loadVibrationNatives)
|
||||||
@ -321,6 +340,8 @@ public class Controlify implements ControlifyApi {
|
|||||||
this.askToSwitchController(controller);
|
this.askToSwitchController(controller);
|
||||||
config().saveIfDirty();
|
config().saveIfDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
canDiscoverControllers = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onControllerDisconnect(int jid) {
|
private void onControllerDisconnect(int jid) {
|
||||||
|
@ -13,6 +13,7 @@ import java.io.IOException;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.StandardOpenOption;
|
import java.nio.file.StandardOpenOption;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -119,12 +120,16 @@ public class ControlifyConfig {
|
|||||||
setDirty();
|
setDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.compoundJoysticks = object
|
if (object.has("compound_joysticks")) {
|
||||||
.getAsJsonArray("compound_joysticks")
|
this.compoundJoysticks = object
|
||||||
.asList()
|
.getAsJsonArray("compound_joysticks")
|
||||||
.stream()
|
.asList()
|
||||||
.map(element -> GSON.fromJson(element, CompoundJoystickInfo.class))
|
.stream()
|
||||||
.collect(Collectors.toMap(info -> info.type().mappingId(), Function.identity()));
|
.map(element -> GSON.fromJson(element, CompoundJoystickInfo.class))
|
||||||
|
.collect(Collectors.toMap(info -> info.type().mappingId(), Function.identity()));
|
||||||
|
} else {
|
||||||
|
this.compoundJoysticks = Map.of();
|
||||||
|
}
|
||||||
|
|
||||||
if (object.has("current_controller")) {
|
if (object.has("current_controller")) {
|
||||||
JsonElement element = object.get("current_controller");
|
JsonElement element = object.get("current_controller");
|
||||||
|
@ -20,4 +20,5 @@ public class GlobalSettings {
|
|||||||
public ReachAroundMode reachAround = ReachAroundMode.OFF;
|
public ReachAroundMode reachAround = ReachAroundMode.OFF;
|
||||||
public boolean uiSounds = false;
|
public boolean uiSounds = false;
|
||||||
public boolean notifyLowBattery = true;
|
public boolean notifyLowBattery = true;
|
||||||
|
public boolean delegateSetup = false;
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,6 @@ import net.minecraft.network.chat.CommonComponents;
|
|||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
@ -48,14 +47,26 @@ public class YACLHelper {
|
|||||||
private static final Function<Float, Component> percentOrOffFormatter = v -> v == 0 ? CommonComponents.OPTION_OFF : percentFormatter.apply(v);
|
private static final Function<Float, Component> percentOrOffFormatter = v -> v == 0 ? CommonComponents.OPTION_OFF : percentFormatter.apply(v);
|
||||||
|
|
||||||
public static Screen openConfigScreen(Screen parent) {
|
public static Screen openConfigScreen(Screen parent) {
|
||||||
Screen configScreen = generateConfigScreen(parent);
|
var controlify = Controlify.instance();
|
||||||
if (!Controlify.instance().config().globalSettings().vibrationOnboarded)
|
|
||||||
configScreen = new SDLOnboardingScreen(configScreen, yes -> {
|
if (!controlify.config().globalSettings().vibrationOnboarded) {
|
||||||
|
return new SDLOnboardingScreen(() -> generateConfigScreen(parent), yes -> {
|
||||||
if (yes) {
|
if (yes) {
|
||||||
SDL2NativesManager.initialise();
|
SDL2NativesManager.initialise();
|
||||||
|
|
||||||
|
if (controlify.config().globalSettings().delegateSetup) {
|
||||||
|
controlify.discoverControllers();
|
||||||
|
controlify.config().globalSettings().delegateSetup = false;
|
||||||
|
controlify.config().save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return configScreen;
|
} else if (Controlify.instance().config().globalSettings().delegateSetup) {
|
||||||
|
controlify.discoverControllers();
|
||||||
|
controlify.config().globalSettings().delegateSetup = false;
|
||||||
|
controlify.config().save();
|
||||||
|
}
|
||||||
|
return generateConfigScreen(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Screen generateConfigScreen(Screen parent) {
|
private static Screen generateConfigScreen(Screen parent) {
|
||||||
|
@ -9,15 +9,17 @@ import net.minecraft.client.gui.screens.ConfirmScreen;
|
|||||||
import net.minecraft.client.gui.screens.Screen;
|
import net.minecraft.client.gui.screens.Screen;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class SDLOnboardingScreen extends ConfirmScreen {
|
public class SDLOnboardingScreen extends ConfirmScreen {
|
||||||
public SDLOnboardingScreen(Screen lastScreen, BooleanConsumer onAnswered) {
|
public SDLOnboardingScreen(Supplier<Screen> lastScreen, BooleanConsumer onAnswered) {
|
||||||
super(
|
super(
|
||||||
yes -> {
|
yes -> {
|
||||||
Controlify.instance().config().globalSettings().loadVibrationNatives = yes;
|
Controlify.instance().config().globalSettings().loadVibrationNatives = yes;
|
||||||
Controlify.instance().config().globalSettings().vibrationOnboarded = true;
|
Controlify.instance().config().globalSettings().vibrationOnboarded = true;
|
||||||
Controlify.instance().config().save();
|
Controlify.instance().config().save();
|
||||||
Minecraft.getInstance().setScreen(lastScreen);
|
|
||||||
onAnswered.accept(yes);
|
onAnswered.accept(yes);
|
||||||
|
Minecraft.getInstance().setScreen(lastScreen.get());
|
||||||
},
|
},
|
||||||
Component.translatable("controlify.sdl2_onboarding.title").withStyle(ChatFormatting.BOLD),
|
Component.translatable("controlify.sdl2_onboarding.title").withStyle(ChatFormatting.BOLD),
|
||||||
Util.make(() -> {
|
Util.make(() -> {
|
||||||
|
@ -128,6 +128,8 @@
|
|||||||
"controlify.toast.faulty_input.description": "The controller was found to conflict with the keyboard and mouse and is now disabled. Increase deadzone values or check joystick mapping to fix.",
|
"controlify.toast.faulty_input.description": "The controller was found to conflict with the keyboard and mouse and is now disabled. Increase deadzone values or check joystick mapping to fix.",
|
||||||
"controlify.toast.low_battery.title": "Low Battery",
|
"controlify.toast.low_battery.title": "Low Battery",
|
||||||
"controlify.toast.low_battery.message": "Your controller '%s' is low on battery. Please charge it soon.",
|
"controlify.toast.low_battery.message": "Your controller '%s' is low on battery. Please charge it soon.",
|
||||||
|
"controlify.toast.setup_in_config.title": "Controllers found!",
|
||||||
|
"controlify.toast.setup_in_config.description": "To use with Controlify, go to %s -> %s -> %s.",
|
||||||
|
|
||||||
"controlify.sdl2_onboarding.title": "Controlify Native Library",
|
"controlify.sdl2_onboarding.title": "Controlify Native Library",
|
||||||
"controlify.sdl2_onboarding.message": "Many features in Controlify require an extra library that needs to be downloaded for your system. If you do not download this library, you will lose access to many features such as: controller vibration, gyroscope control, better controller identification. This is a seamless process and will only take a few seconds. If you choose no, you may change your mind later in Controlify settings, but you won't have access to these features in the meantime.",
|
"controlify.sdl2_onboarding.message": "Many features in Controlify require an extra library that needs to be downloaded for your system. If you do not download this library, you will lose access to many features such as: controller vibration, gyroscope control, better controller identification. This is a seamless process and will only take a few seconds. If you choose no, you may change your mind later in Controlify settings, but you won't have access to these features in the meantime.",
|
||||||
|
Reference in New Issue
Block a user