From 2af3af9102e1f0b609499accccf5c73736c15b94 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 12 Jun 2020 18:18:17 +0800 Subject: [PATCH] migrate to fabric-keybindings-v1 and remove builder (#615) * Edited Clone of #244 - Fixed checkstyle issues - Migrated to fabric-keybindings-v1 - Removed sticky keybindings from #244 as it sounds useless and you can just around it by simply adding that functionality yourself, I might add it back if someone can tell me the advantages of sticky keys except bloat - Added a test mod - Added FabricKeyBinding#getBoundKeyOf for getting vanilla bound keys with ease - Renamed `registered` to `automaticallyRegister` as that is more of a better name - Added a couple Objects.requireNonNull validations * Add back StickyFabricKeyBinding as it is in vanilla, did not notice. * Remove extra "key." * Bump to 1.0.0 * build().register() * Remove `register()` Signed-off-by: shedaniel * Fix test Signed-off-by: shedaniel * Rename module Signed-off-by: shedaniel * Fix checkstyle violation Signed-off-by: shedaniel * major refactor Signed-off-by: shedaniel * revert some stuff Signed-off-by: shedaniel * fix build Signed-off-by: shedaniel * major stuff Signed-off-by: shedaniel * fix license, of course Signed-off-by: shedaniel * Add resource loader v0 Signed-off-by: shedaniel * Let's not break the api. Signed-off-by: shedaniel * Rename to buildAndRegister Signed-off-by: shedaniel * resolve reviews Signed-off-by: shedaniel * Use GLFW Signed-off-by: shedaniel * Dump the builder entirely Signed-off-by: shedaniel * Rename to Key Binding Signed-off-by: shedaniel --- fabric-key-binding-api-v1/build.gradle | 8 ++ .../keybinding/v1/KeyBindingHelper.java | 58 +++++++++ .../keybinding/KeyBindingRegistryImpl.java | 86 +++++++++++++ .../client/keybinding/KeyBindingAccessor.java | 12 +- .../client/keybinding/KeyCodeAccessor.java | 0 .../client/keybinding/MixinGameOptions.java | 6 +- .../assets/fabric-key-binding-api-v1/icon.png | Bin 0 -> 1579 bytes .../fabric-key-binding-api-v1.mixins.json | 6 +- .../src/main/resources/fabric.mod.json | 25 ++++ .../client/keybinding/KeyBindingsTest.java | 51 ++++++++ .../lang/en_us.json | 7 ++ .../src/testmod/resources/fabric.mod.json | 18 +++ fabric-keybindings-v0/build.gradle | 4 +- .../client/keybinding/FabricKeyBinding.java | 14 ++- .../client/keybinding/KeyBindingRegistry.java | 15 ++- .../keybinding/KeyBindingRegistryImpl.java | 114 ------------------ .../src/main/resources/fabric.mod.json | 7 +- settings.gradle | 1 + 18 files changed, 295 insertions(+), 137 deletions(-) create mode 100644 fabric-key-binding-api-v1/build.gradle create mode 100644 fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/api/client/keybinding/v1/KeyBindingHelper.java create mode 100644 fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java rename fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinKeyBinding.java => fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyBindingAccessor.java (78%) rename {fabric-keybindings-v0 => fabric-key-binding-api-v1}/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyCodeAccessor.java (100%) rename {fabric-keybindings-v0 => fabric-key-binding-api-v1}/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java (89%) create mode 100644 fabric-key-binding-api-v1/src/main/resources/assets/fabric-key-binding-api-v1/icon.png rename fabric-keybindings-v0/src/main/resources/fabric-keybindings-v0.mixins.json => fabric-key-binding-api-v1/src/main/resources/fabric-key-binding-api-v1.mixins.json (71%) create mode 100644 fabric-key-binding-api-v1/src/main/resources/fabric.mod.json create mode 100644 fabric-key-binding-api-v1/src/testmod/java/net/fabricmc/fabric/test/client/keybinding/KeyBindingsTest.java create mode 100644 fabric-key-binding-api-v1/src/testmod/resources/assets/fabric-keybindings-v1-testmod/lang/en_us.json create mode 100644 fabric-key-binding-api-v1/src/testmod/resources/fabric.mod.json delete mode 100644 fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java diff --git a/fabric-key-binding-api-v1/build.gradle b/fabric-key-binding-api-v1/build.gradle new file mode 100644 index 000000000..9ae9bb153 --- /dev/null +++ b/fabric-key-binding-api-v1/build.gradle @@ -0,0 +1,8 @@ +archivesBaseName = "fabric-key-binding-api-v1" +version = getSubprojectVersion(project, "1.0.0") + +dependencies { + testmodCompile project(path: ':fabric-api-base', configuration: 'dev') + testmodCompile project(path: ':fabric-events-lifecycle-v0', configuration: 'dev') + testmodCompile project(path: ':fabric-resource-loader-v0', configuration: 'dev') +} diff --git a/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/api/client/keybinding/v1/KeyBindingHelper.java b/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/api/client/keybinding/v1/KeyBindingHelper.java new file mode 100644 index 000000000..5162af51f --- /dev/null +++ b/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/api/client/keybinding/v1/KeyBindingHelper.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.api.client.keybinding.v1; + +import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.util.InputUtil; + +import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; +import net.fabricmc.fabric.mixin.client.keybinding.KeyCodeAccessor; + +/** + * Helper for registering key bindings. + * + *

Helper class for {@link KeyBinding} for use by Fabric mods.

+ * + *

+ * KeyBinding left = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.example.left", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_P, "key.category.example"));
+ * KeyBinding right = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.example.right", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.category.example"));
+ * 
+ */ +public final class KeyBindingHelper { + private KeyBindingHelper() { + } + + /** + * Registers the keybinding and add the keybinding category if required. + * + * @param keyBinding the keybinding + * @return the keybinding itself + */ + public static KeyBinding registerKeyBinding(KeyBinding keyBinding) { + return KeyBindingRegistryImpl.registerKeyBinding(keyBinding); + } + + /** + * Returns the configured KeyCode bound to the KeyBinding from the player's settings. + * + * @param keyBinding the keybinding + * @return configured KeyCode + */ + public static InputUtil.KeyCode getBoundKeyOf(KeyBinding keyBinding) { + return ((KeyCodeAccessor) keyBinding).getKeyCode(); + } +} diff --git a/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java b/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java new file mode 100644 index 000000000..23326a2ff --- /dev/null +++ b/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.impl.client.keybinding; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import com.google.common.collect.Lists; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraft.client.options.KeyBinding; + +import net.fabricmc.fabric.mixin.client.keybinding.KeyBindingAccessor; + +public final class KeyBindingRegistryImpl { + private static final Logger LOGGER = LogManager.getLogger(); + + private static final List moddedKeyBindings = Lists.newArrayList(); + + private KeyBindingRegistryImpl() { + } + + private static Map getCategoryMap() { + return KeyBindingAccessor.fabric_getCategoryMap(); + } + + private static boolean hasCategory(String categoryTranslationKey) { + return getCategoryMap().containsKey(categoryTranslationKey); + } + + public static boolean addCategory(String categoryTranslationKey) { + Map map = getCategoryMap(); + + if (map.containsKey(categoryTranslationKey)) { + return false; + } + + Optional largest = map.values().stream().max(Integer::compareTo); + int largestInt = largest.orElse(0); + map.put(categoryTranslationKey, largestInt + 1); + return true; + } + + public static KeyBinding registerKeyBinding(KeyBinding binding) { + for (KeyBinding existingKeyBindings : moddedKeyBindings) { + if (existingKeyBindings == binding) { + throw null; + } else if (existingKeyBindings.getId().equals(binding.getId())) { + throw new RuntimeException("Attempted to register two key bindings with equal ID: " + binding.getId() + "!"); + } + } + + if (!hasCategory(binding.getCategory())) { + addCategory(binding.getCategory()); + } + + return moddedKeyBindings.add(binding) ? binding : null; + } + + /** + * Processes the keybindings array for our modded ones by first removing existing modded keybindings and readding them, + * we can make sure that there are no duplicates this way. + */ + public static KeyBinding[] process(KeyBinding[] keysAll) { + List newKeysAll = Lists.newArrayList(keysAll); + newKeysAll.removeAll(moddedKeyBindings); + newKeysAll.addAll(moddedKeyBindings); + return newKeysAll.toArray(new KeyBinding[0]); + } +} diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinKeyBinding.java b/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyBindingAccessor.java similarity index 78% rename from fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinKeyBinding.java rename to fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyBindingAccessor.java index adc56a4f9..b865a9931 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinKeyBinding.java +++ b/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyBindingAccessor.java @@ -19,16 +19,14 @@ package net.fabricmc.fabric.mixin.client.keybinding; import java.util.Map; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Accessor; import net.minecraft.client.options.KeyBinding; @Mixin(KeyBinding.class) -public class MixinKeyBinding { - @Shadow - private static Map categoryOrderMap; - - private static Map fabric_getCategoryMap() { - return categoryOrderMap; +public interface KeyBindingAccessor { + @Accessor("categoryOrderMap") + static Map fabric_getCategoryMap() { + throw new AssertionError(); } } diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyCodeAccessor.java b/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyCodeAccessor.java similarity index 100% rename from fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyCodeAccessor.java rename to fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyCodeAccessor.java diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java b/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java similarity index 89% rename from fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java rename to fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java index 9038bb7ed..7396ac4f5 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java +++ b/fabric-key-binding-api-v1/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java @@ -16,7 +16,9 @@ package net.fabricmc.fabric.mixin.client.keybinding; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -29,11 +31,13 @@ import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; @Mixin(GameOptions.class) public class MixinGameOptions { + @Mutable + @Final @Shadow public KeyBinding[] keysAll; @Inject(at = @At("HEAD"), method = "load()V") public void loadHook(CallbackInfo info) { - keysAll = KeyBindingRegistryImpl.INSTANCE.process(keysAll); + keysAll = KeyBindingRegistryImpl.process(keysAll); } } diff --git a/fabric-key-binding-api-v1/src/main/resources/assets/fabric-key-binding-api-v1/icon.png b/fabric-key-binding-api-v1/src/main/resources/assets/fabric-key-binding-api-v1/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2931efbf610873c0084debb8690902b0103d27fe GIT binary patch literal 1579 zcmbVMTWB0r7@iGm)TAXsYw<=rnU=;v=W=GRbL=!tc4Brl6GO7t2vVJ$IlDV#XU;e? z+r2ymsZdMQqAyaFLLUo;RumtE8Z@?uf_*4nP^4;o6fOFoSkN+o1$K?f2nE9_*b5G-l)AV)k5Qhb^- zU{V4ZnTKgnmXdpcB*Kg!W(1hvM2N&RO30x1u~eI9meGQGe@_?PDQq%q1CiV$8~M7 z?MQ_mOdqCh^a65Sv|ntwSXjV5se1;VK1|Kr8G7TQoQL&*ctt{L{fClG}xPK5k^yK3%T69N6J=>3jBqc zDNvZsrJ-yOXI^^mWf1cmY^XST)CVzIGjvEPENowmy}ax zvJ8_(Cf#+H-dBlH53`_u-~6BVAMz|(g?jCVdBWNZ(+A}(pFV7>S3QgPiQcMaflkIC z-3Ti|VT~{au*vq0ts9O&m$p&Gl=L6+q6_m$IcVq}o~+Pl{g>1esQp4%wp~|*zk1n` zZ7T6Toc4`y88s}riCP|ZXrJ?FLz@^KTcyqLjey zu95Yz%F&S{<0~f)Iomek?+hQ%MhCu%T^zsg>C_L`1`Br`xNY&))k9yTQb$JC>)w_f zpU(^tu^Q)y%W~lVz`jz;_ jF?g&s@Y=Qe&c#kW|JbvqK0Y=Rw)4XDoVqsk_>;c_`@;F@ literal 0 HcmV?d00001 diff --git a/fabric-keybindings-v0/src/main/resources/fabric-keybindings-v0.mixins.json b/fabric-key-binding-api-v1/src/main/resources/fabric-key-binding-api-v1.mixins.json similarity index 71% rename from fabric-keybindings-v0/src/main/resources/fabric-keybindings-v0.mixins.json rename to fabric-key-binding-api-v1/src/main/resources/fabric-key-binding-api-v1.mixins.json index 4c5632e3e..82df04d34 100644 --- a/fabric-keybindings-v0/src/main/resources/fabric-keybindings-v0.mixins.json +++ b/fabric-key-binding-api-v1/src/main/resources/fabric-key-binding-api-v1.mixins.json @@ -3,9 +3,9 @@ "package": "net.fabricmc.fabric.mixin.client.keybinding", "compatibilityLevel": "JAVA_8", "client": [ - "MixinGameOptions", - "MixinKeyBinding", - "KeyCodeAccessor" + "KeyBindingAccessor", + "KeyCodeAccessor", + "MixinGameOptions" ], "injectors": { "defaultRequire": 1 diff --git a/fabric-key-binding-api-v1/src/main/resources/fabric.mod.json b/fabric-key-binding-api-v1/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..c7fe5b4ff --- /dev/null +++ b/fabric-key-binding-api-v1/src/main/resources/fabric.mod.json @@ -0,0 +1,25 @@ +{ + "schemaVersion": 1, + "id": "fabric-key-binding-api-v1", + "name": "Fabric Key Binding API (v1)", + "version": "${version}", + "environment": "client", + "license": "Apache-2.0", + "icon": "assets/fabric-key-binding-api-v1/icon.png", + "contact": { + "homepage": "https://fabricmc.net", + "irc": "irc://irc.esper.net:6667/fabric", + "issues": "https://github.com/FabricMC/fabric/issues", + "sources": "https://github.com/FabricMC/fabric" + }, + "authors": [ + "FabricMC" + ], + "depends": { + "fabricloader": ">=0.4.0" + }, + "description": "Key Binding registry API.", + "mixins": [ + "fabric-key-binding-api-v1.mixins.json" + ] +} diff --git a/fabric-key-binding-api-v1/src/testmod/java/net/fabricmc/fabric/test/client/keybinding/KeyBindingsTest.java b/fabric-key-binding-api-v1/src/testmod/java/net/fabricmc/fabric/test/client/keybinding/KeyBindingsTest.java new file mode 100644 index 000000000..56100e217 --- /dev/null +++ b/fabric-key-binding-api-v1/src/testmod/java/net/fabricmc/fabric/test/client/keybinding/KeyBindingsTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.test.client.keybinding; + +import org.lwjgl.glfw.GLFW; + +import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.options.StickyKeyBinding; +import net.minecraft.client.util.InputUtil; +import net.minecraft.text.LiteralText; + +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.fabricmc.fabric.api.event.client.ClientTickCallback; + +public class KeyBindingsTest implements ClientModInitializer { + @Override + public void onInitializeClient() { + KeyBinding binding1 = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.fabric-key-binding-api-v1-testmod.test_keybinding_1", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_P, "key.category.first.test")); + KeyBinding binding2 = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.fabric-key-binding-api-v1-testmod.test_keybinding_2", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.category.second.test")); + KeyBinding stickyBinding = KeyBindingHelper.registerKeyBinding(new StickyKeyBinding("key.fabric-key-binding-api-v1-testmod.test_keybinding_sticky", GLFW.GLFW_KEY_R, "key.category.first.test", () -> true)); + + ClientTickCallback.EVENT.register(client -> { + while (binding1.wasPressed()) { + client.player.sendMessage(new LiteralText("Key 1 was pressed!")); + } + + while (binding2.wasPressed()) { + client.player.sendMessage(new LiteralText("Key 2 was pressed!")); + } + + if (stickyBinding.isPressed()) { + client.player.sendMessage(new LiteralText("Sticky Key was pressed!")); + } + }); + } +} diff --git a/fabric-key-binding-api-v1/src/testmod/resources/assets/fabric-keybindings-v1-testmod/lang/en_us.json b/fabric-key-binding-api-v1/src/testmod/resources/assets/fabric-keybindings-v1-testmod/lang/en_us.json new file mode 100644 index 000000000..ac684d799 --- /dev/null +++ b/fabric-key-binding-api-v1/src/testmod/resources/assets/fabric-keybindings-v1-testmod/lang/en_us.json @@ -0,0 +1,7 @@ +{ + "key.category.first.test": "First Test Category", + "key.category.second.test": "Second Test Category", + "key.fabric-key-binding-api-v1-testmod.test_keybinding_1": "Test 1", + "key.fabric-key-binding-api-v1-testmod.test_keybinding_2": "Test 2", + "key.fabric-key-binding-api-v1-testmod.test_keybinding_sticky": "Sticky Test" +} diff --git a/fabric-key-binding-api-v1/src/testmod/resources/fabric.mod.json b/fabric-key-binding-api-v1/src/testmod/resources/fabric.mod.json new file mode 100644 index 000000000..c69c92675 --- /dev/null +++ b/fabric-key-binding-api-v1/src/testmod/resources/fabric.mod.json @@ -0,0 +1,18 @@ +{ + "schemaVersion": 1, + "id": "fabric-key-binding-api-v1-testmod", + "name": "Fabric Key Binding API (v1) Test Mod", + "version": "1.0.0", + "environment": "*", + "license": "Apache-2.0", + "depends": { + "fabric-api-base": "*", + "fabric-events-lifecycle-v0": "*", + "fabric-key-binding-api-v1": "*" + }, + "entrypoints": { + "client": [ + "net.fabricmc.fabric.test.client.keybinding.KeyBindingsTest" + ] + } +} diff --git a/fabric-keybindings-v0/build.gradle b/fabric-keybindings-v0/build.gradle index 7c240a7b7..4f1cb5061 100644 --- a/fabric-keybindings-v0/build.gradle +++ b/fabric-keybindings-v0/build.gradle @@ -1,6 +1,6 @@ archivesBaseName = "fabric-keybindings-v0" -version = getSubprojectVersion(project, "0.1.1") +version = getSubprojectVersion(project, "0.2.0") dependencies { - compile project(path: ':fabric-api-base', configuration: 'dev') + compile project(path: ':fabric-key-binding-api-v1', configuration: 'dev') } diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/FabricKeyBinding.java b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/FabricKeyBinding.java index 6ac86ba83..adf3a93c7 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/FabricKeyBinding.java +++ b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/FabricKeyBinding.java @@ -20,27 +20,33 @@ import net.minecraft.client.options.KeyBinding; import net.minecraft.client.util.InputUtil; import net.minecraft.util.Identifier; -import net.fabricmc.fabric.mixin.client.keybinding.KeyCodeAccessor; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; /** * Expanded version of {@link KeyBinding} for use by Fabric mods. * *

*ALL* instantiated FabricKeyBindings should be registered in - * {@link KeyBindingRegistry#register(FabricKeyBinding)}! + * {@link KeyBindingRegistry#register(FabricKeyBinding)}!

+ * + * @deprecated Please migrate to v1. Please use {@link KeyBindingHelper#registerKeyBinding(KeyBinding)} instead. */ +@Deprecated public class FabricKeyBinding extends KeyBinding { protected FabricKeyBinding(Identifier id, InputUtil.Type type, int code, String category) { - super("key." + id.toString().replace(':', '.'), type, code, category); + super(String.format("key.%s.%s", id.getNamespace(), id.getPath()), type, code, category); } /** * Returns the configured KeyCode assigned to the KeyBinding from the player's settings. + * * @return configured KeyCode */ + @Deprecated public InputUtil.KeyCode getBoundKey() { - return ((KeyCodeAccessor) this).getKeyCode(); + return KeyBindingHelper.getBoundKeyOf(this); } + @Deprecated public static class Builder { protected final FabricKeyBinding binding; diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/KeyBindingRegistry.java b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/KeyBindingRegistry.java index f7bf5945c..1dbd97c8d 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/KeyBindingRegistry.java +++ b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/KeyBindingRegistry.java @@ -18,15 +18,28 @@ package net.fabricmc.fabric.api.client.keybinding; import net.minecraft.client.options.KeyBinding; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; /** * Interface for registering key bindings. * * @see KeyBinding + * @deprecated Please migrate to v1. Please use {@link KeyBindingHelper} instead. */ +@Deprecated public interface KeyBindingRegistry { - KeyBindingRegistry INSTANCE = KeyBindingRegistryImpl.INSTANCE; + KeyBindingRegistry INSTANCE = new KeyBindingRegistry() { + @Override + public boolean addCategory(String categoryName) { + return KeyBindingRegistryImpl.addCategory(categoryName); + } + + @Override + public boolean register(FabricKeyBinding binding) { + return KeyBindingRegistryImpl.registerKeyBinding(binding) != null; + } + }; /** * Add a new key binding category. diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java deleted file mode 100644 index eba0d8b83..000000000 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.fabricmc.fabric.impl.client.keybinding; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import net.minecraft.client.options.KeyBinding; - -import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; -import net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry; - -public class KeyBindingRegistryImpl implements KeyBindingRegistry { - public static final KeyBindingRegistryImpl INSTANCE = new KeyBindingRegistryImpl(); - private static final Logger LOGGER = LogManager.getLogger(); - - private Map cachedCategoryMap; - private List fabricKeyBindingList; - - private KeyBindingRegistryImpl() { - fabricKeyBindingList = new ArrayList<>(); - } - - private Map getCategoryMap() { - if (cachedCategoryMap == null) { - try { - //noinspection JavaReflectionMemberAccess - Method m = KeyBinding.class.getDeclaredMethod("fabric_getCategoryMap"); - m.setAccessible(true); - - //noinspection unchecked - cachedCategoryMap = (Map) m.invoke(null); - } catch (Exception e) { - throw new RuntimeException(e); - } - - if (cachedCategoryMap == null) { - throw new RuntimeException("Cached key binding category map missing!"); - } - } - - return cachedCategoryMap; - } - - private boolean hasCategory(String categoryName) { - return getCategoryMap().containsKey(categoryName); - } - - @Override - public boolean addCategory(String categoryName) { - Map map = getCategoryMap(); - - if (map.containsKey(categoryName)) { - return false; - } - - Optional largest = map.values().stream().max(Integer::compareTo); - int largestInt = largest.orElse(0); - map.put(categoryName, largestInt + 1); - return true; - } - - @Override - public boolean register(FabricKeyBinding binding) { - for (KeyBinding exBinding : fabricKeyBindingList) { - if (exBinding == binding) { - return false; - } else if (exBinding.getId().equals(binding.getId())) { - throw new RuntimeException("Attempted to register two key bindings with equal ID: " + binding.getId() + "!"); - } - } - - if (!hasCategory(binding.getCategory())) { - LOGGER.warn("Tried to register key binding with unregistered category '" + binding.getCategory() + "' - please use addCategory to ensure intended category ordering!"); - addCategory(binding.getCategory()); - } - - fabricKeyBindingList.add(binding); - return true; - } - - public KeyBinding[] process(KeyBinding[] keysAll) { - List newKeysAll = new ArrayList<>(); - - for (KeyBinding binding : keysAll) { - if (!(binding instanceof FabricKeyBinding)) { - newKeysAll.add(binding); - } - } - - newKeysAll.addAll(fabricKeyBindingList); - return newKeysAll.toArray(new KeyBinding[0]); - } -} diff --git a/fabric-keybindings-v0/src/main/resources/fabric.mod.json b/fabric-keybindings-v0/src/main/resources/fabric.mod.json index d2086b5b0..a6c01bfaf 100644 --- a/fabric-keybindings-v0/src/main/resources/fabric.mod.json +++ b/fabric-keybindings-v0/src/main/resources/fabric.mod.json @@ -17,10 +17,7 @@ ], "depends": { "fabricloader": ">=0.4.0", - "fabric-api-base": "*" + "fabric-key-binding-api-v1": "*" }, - "description": "Keybinding registry API.", - "mixins": [ - "fabric-keybindings-v0.mixins.json" - ] + "description": "Keybinding registry API." } diff --git a/settings.gradle b/settings.gradle index 2b547674b..227c107e0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -26,6 +26,7 @@ include 'fabric-events-interaction-v0' include 'fabric-events-lifecycle-v0' include 'fabric-item-groups-v0' include 'fabric-keybindings-v0' +include 'fabric-key-binding-api-v1' include 'fabric-loot-tables-v1' include 'fabric-mining-levels-v0' include 'fabric-models-v0'