输入与显示事件 API
基本信息
| 属性 | 值 |
|---|---|
| 包 | me.eigenraven.lwjgl3ify.api |
| 声明位置 | gradle.properties 的 apiPackage = api(与 modGroup = me.eigenraven.lwjgl3ify 合成) |
| 本条目覆盖的类型 | 6(InputEvents、DisplayEvents、DisplayWindowContext、SwapchainInvalidatingChange、FloatMouseHelper、GLCapabilitiesOverride) |
| 已知外部使用者 | ModularUI2 |
me.eigenraven.lwjgl3ify.api 是 LWJGL3ify 唯一对外承诺稳定的包(apiPackage = api,gradle.properties:105),供其他 mod 订阅原始 LWJGL3 输入与窗口生命周期事件。
功能
InputEvents
InputEvents.java:16 — 原始键盘/文本事件总线。
嵌套类型:
| 类型 | 位置 | 内容 |
|---|---|---|
enum KeyAction |
:19 |
按键动作 |
class KeyEvent |
:26 |
字段:lwjgl2KeyCode(:32)、lwjgl2ScanCode(:32)、sdlKeyCode(:37)、sdlScanCode(:37)、sdlRawKeyCode(:42)、action(:44)、sdlKeyModifiers(:46,short)、keyNamePointer(:51,long) |
class TextEvent |
:68 |
单一 public final String text(:71) |
interface KeyboardListener |
:83 |
两个 default 方法:onKeyEvent(KeyEvent)(:86)、onTextEvent(TextEvent)(:89) |
关键设计:每个 KeyEvent 同时携带 LWJGL2 与 SDL 两套编码(lwjgl2KeyCode / sdlKeyCode 等)。这让下游 mod 无需自己转换即可按需选择编码。
注册方法(静态):
| 方法 | 位置 | 语义 |
|---|---|---|
addKeyboardListener(KeyboardListener) |
:96 |
强引用持有 |
removeKeyboardListener(KeyboardListener) |
:101 |
移除强引用监听器 |
addWeakKeyboardListener(KeyboardListener) |
:109 |
仅持 WeakReference,被 GC 后自动清理 |
removeWeakKeyboardListener(KeyboardListener) |
:114 |
提前移除弱引用监听器 |
injectKeyEvent(KeyEvent) |
:125 |
合成按键事件分发给所有监听器 |
底层用两个 ArrayList:keyboardListeners(:92)与 weakKeyboardListeners(:93)。
injectKeyEvent 的分发顺序(:126-140+):先把事件投递给 Minecraft.getMinecraft().currentScreen——若当前 GUI 实现了 KeyboardListener 就直接回调(:126-129);再遍历强引用列表(:130-133);再遍历弱引用列表,遇到已被回收的引用时就地移除并把索引 i--(:134-140)。
TextEvent 有对应的合成入口吗?本次核验中未见 injectTextEvent 静态方法——TextEvent 仅在 onTextEvent 回调参数中出现。该缺口标记为无法核实是否有其他派发路径。
DisplayEvents
DisplayEvents.java:9 — 窗口与 GL 上下文生命周期事件。
| 方法 | 位置 | 语义 |
|---|---|---|
setCreateGLContext(boolean) |
:18 |
开关是否创建 GL 上下文 |
isCreateGLContextEnabled() |
:22 |
查询上一项 |
addPreWindowCreateListener(Consumer<DisplayWindowContext>) |
:26 |
窗口创建前 |
addPostWindowCreateListener(Consumer<DisplayWindowContext>) |
:30 |
窗口创建后 |
addPreSwapchainInvalidatingChangeListener(Consumer<SwapchainInvalidatingChange>) |
:38 |
交换链失效前 |
firePreWindowCreate(ctx) |
:42 |
触发 |
firePostWindowCreate(ctx) |
:46 |
触发 |
firePreSwapchainInvalidatingChange(change) |
:50 |
触发 |
DisplayWindowContext(DisplayWindowContext.java:11)是 Java record,字段 int props, long window, long glContext, PixelFormat pixelFormat, ...(:11)。
SwapchainInvalidatingChange(SwapchainInvalidatingChange.java:16)同样是 record:Kind kind, boolean newFullscreen, @Nullable DisplayMode newMode(:16),其内嵌 enum Kind 在 :18。
FloatMouseHelper
FloatMouseHelper.java:6 — 单方法接口,供 MixinMouseHelper 实现(见 SDL 输入与窗口 Mixin)。让鼠标移动以浮点像素传递,替代 1.7.10 的整数像素。
GLCapabilitiesOverride
GLCapabilitiesOverride.java:13 — final 类,提供 static void set(Set<String>)(:18)与 static Set<String> get()(:25),用于覆盖 GL 能力集名称。
数值
| 数值 | 值 |
|---|---|
InputEvents.KeyEvent 的 public final 字段数 |
8 |
| 同时携带的编码体系 | 2(LWJGL2 + SDL) |
| 键盘监听器注册方法数 | 4 |
| 合成事件注入方法数 | 1(injectKeyEvent) |
DisplayEvents 的 listener 注册方法数 |
3 |
DisplayEvents 的 fire 方法数 |
3 |
| 本包内 record 数 | 2(DisplayWindowContext、SwapchainInvalidatingChange) |
已知静默失败点
DisplayEvents.fire(ArrayList<Consumer<T>>, T)(DisplayEvents.java:54-63)对每个监听器包一层 catch (Throwable t),只打 Lwjgl3ify.LOG.error("Display event listener error", t)(:59-61)。
后果:某个第三方监听器抛异常时,异常被记录但不影响其余监听器被调用,且调用方(窗口创建/交换链切换路径)不会感知失败继续执行。异常本身未被静默——有 ERROR 级日志——但失败被隔离。
交互
| 触发 | 行为 |
|---|---|
其他 mod 调 InputEvents.addKeyboardListener |
之后每次 LWJGL3 原始按键都会回调其 onKeyEvent |
当前打开的 GUI 实现 KeyboardListener |
额外收到一次回调(早于注册列表) |
| 监听器被 GC(弱引用) | 下次派发时自动从列表移除 |
| 窗口创建 / 交换链切换 | 触发 DisplayEvents 的 pre/post 回调 |
某个 DisplayEvents 监听器抛异常 |
记 ERROR,其余监听器继续 |
相关条目
- 配置与注解 API - 本包之外的另外 3 个公开类型
- SDL 输入与窗口 Mixin - 接收
KeyboardListener事件的 mixin - 第三方兼容钩子 - ModularUI2 的实际接入方式
- FML 加载插件 - 内部监听器的注册点