公开 API
基本信息
| 属性 | 值 |
|---|---|
| 入口类 | com.blamejared.controlling.api.ControllingApi |
| 入口类形态 | final 类,私有构造函数(纯静态工具类,无法实例化) |
| 公开方法 | 5 个静态方法 |
| 枚举 | com.blamejared.controlling.api.ComboModifier(4 值) |
| 兼容层 | ControllingApi → ComboKeyBinding → KeyModifier |
功能
因为本 mod 通过 Mixin 让所有 KeyBinding(含其他 mod 注册的)都实现了 ComboKeyBinding,
其他 mod 可以直接读写任意按键的组合修饰键,而不必与 mixins.controlling.early 之外的内部类耦合。
API 用独立的 ComboModifier 枚举而不是直接暴露内部的 KeyModifier,
作为对外的稳定表示层。
ComboModifier —— 对外枚举(4 值)
| 枚举值 | 映射到内部 | 说明 |
|---|---|---|
NONE |
KeyModifier.NONE |
无修饰键,即裸键绑定 |
CONTROL |
KeyModifier.CONTROL |
Ctrl |
SHIFT |
KeyModifier.SHIFT |
Shift |
ALT |
KeyModifier.ALT |
Alt |
toInternal():本值 →KeyModifierfromInternal(KeyModifier internal):内部值 →ComboModifier;internal为null时返回NONE, 其余按四个分支一一映射
取值与 修饰键枚举 完全一致,不存在 API 独有的状态。
方法详解
supportsComboKeyBinding(KeyBinding) → boolean
返回 keyBinding instanceof ComboKeyBinding。
由于本 mod 用 Mixin 改写了原版 KeyBinding,理论上所有 KeyBinding 都满足该判定;
但该方法的存在让调用方无需硬依赖 ComboKeyBinding 类型即可安全探测。
getComboModifier(KeyBinding) → ComboModifier
返回该按键当前的修饰键。若不是组合键绑定则返回 ComboModifier.NONE(不抛异常)。
getDefaultComboModifier(KeyBinding) → ComboModifier
返回该按键的默认修饰键,同样在不支持时返回 NONE。
与上一个方法的差别决定了
控制设置界面 里"恢复默认"按钮能否点击。
setComboKeyBinding(KeyBinding, ComboModifier, int keyCode) → boolean
同时设置当前修饰键与键码。
| 步骤 | 行为 |
|---|---|
非 ComboKeyBinding |
返回 false,不做任何修改 |
comboModifier == null |
归一化为 KeyModifier.NONE |
| 写入 | controlling$setKeyModifierAndCode(keyModifier, keyCode) |
| 同步 | 调用 KeyBinding.resetKeyBindingArrayAndHash() |
| 返回 | true |
最后一步是必要的:原版把按键按键码分组缓存进 keybindArray,绕过该调用会导致
按键轮询仍使用旧的分组结果。
setDefaultComboKeyBinding(KeyBinding, ComboModifier) → boolean
设置默认修饰键。默认键码仍由原版 KeyBinding.getKeyCodeDefault() 决定,
本方法不涉及键码。
| 步骤 | 行为 |
|---|---|
非 ComboKeyBinding |
返回 false |
| 记录 | 先取 controlling$isSetToDefaultValue() 到 wasDefault |
| 写入 | controlling$setDefaultKeyModifier(keyModifier) |
| 条件同步 | 若 wasDefault 为真,额外调用 controlling$setKeyModifier(keyModifier) |
| 返回 | true |
最后一步是关键细节:如果该按键当前正处于默认值状态(界面上的"恢复默认"按钮可点, 说明用户没改过它),那么改变默认值时当前值要跟着一起变,否则界面会显示成 "未修改"却与预期默认值不符。反之,若用户已经自定义过,改默认值不会覆盖其当前设置。
错误处理约定
五个方法全部遵循同一约定:不支持组合键时返回 false 或 NONE,绝不抛异常。
comboModifier 传 null 一律按 NONE 处理。调用方可以无条件调用而无需先探测类型。
与内部的对应关系
| 对外方法 | 内部接口方法 |
|---|---|
getComboModifier |
controlling$getKeyModifier() |
getDefaultComboModifier |
controlling$getDefaultKeyModifier() |
setComboKeyBinding |
controlling$setKeyModifierAndCode(KeyModifier, int) |
setDefaultComboKeyBinding |
controlling$setDefaultKeyModifier(KeyModifier) |
另外两个接口方法 controlling$isSetToDefaultValue() 与 controlling$setToDefault()
没有对应的 API 包装方法,只能通过类型判断后直接调用接口。
兼容性约束
Controlling.init 在检测到 mkb(ModernKeybinding)已加载时会直接抛出
IllegalStateException:
“Controlling now ships built-in key combo support and is incompatible with ModernKeybinding (mkb).”
即本 mod 自带组合键支持,与 ModernKeybinding 互斥,两者不能共存。