SDL 输入与窗口 Mixin
基本信息
| 属性 | 值 |
|---|---|
| Mixins 条目 | 4(TEXT_FIELD_SDL_INPUT、OPEN_URL_WITH_SDL、FLOAT_MOUSE_MOVEMENT、MINECRAFT_SCALE_FULLSCREEN_CORRECTLY) |
| 阶段 | 全部 EARLY |
| 包含的 mixin 类 | 12 |
| 目标模组条件 | 无(4 个条目均无 addRequiredMod / addExcludedMod) |
| 注册位置 | Mixins.java:24-48 |
这 4 个条目把 1.7.10 原生的 LWJGL2 输入/窗口调用改接到 LWJGL3+SDL 实现上,是 LWJGL3ify 客户端侧最核心的 12 个补丁。全部使用 addClientMixins(...),仅客户端生效。
功能
TEXT_FIELD_SDL_INPUT(Mixins.java:24-31)
5 个 mixin,让文本框在 SDL 键盘布局下正确接收输入:
| mixin 类 | 目标类 |
|---|---|
game.MixinGuiEditSign |
GuiEditSign(并 implements InputEvents.KeyboardListener) |
game.MixinGuiScreenBook |
GuiScreenBook(并 implements InputEvents.KeyboardListener) |
game.MixinGuiTextField |
GuiTextField |
game.MixinGuiScreen |
GuiScreen(extends Gui) |
game.MixinGuiTextInput |
{ GuiEditSign.class, GuiScreenBook.class } 双目标,extends GuiScreen,在 initGui()V 的 HEAD 注入 |
MixinGuiEditSign 与 MixinGuiScreenBook 直接实现 InputEvents.KeyboardListener,让 GUI 打开时自动收到按键/文本事件——这是 InputEvents.injectKeyEvent 中"若当前屏幕是 KeyboardListener 就转发"分支(InputEvents.java:126-129)的接收端。
OPEN_URL_WITH_SDL(Mixins.java:32-38)
4 个 mixin,把"用系统浏览器打开链接"从已在新 JDK 移除的 java.awt.Desktop.browse(URI) 改道:
| mixin 类 | 目标类 | @ModifyConstant 所在文件行 |
|---|---|---|
game.openurl.MixinGuiChat |
GuiChat |
MixinGuiChat.java:12 |
game.openurl.MixinGuiMainMenu |
GuiMainMenu |
MixinGuiMainMenu.java:12 |
game.openurl.MixinGuiScreenDemoResourcePacks |
{ GuiScreenDemo.class, GuiScreenResourcePacks.class } 双目标 |
MixinGuiScreenDemoResourcePacks.java:13 |
game.openurl.MixinGuiStreamUnavailable |
GuiStreamUnavailable |
MixinGuiStreamUnavailable.java:12 |
4 个类都返回一个替换目标字符串 "me.eigenraven.lwjgl3ify.redirects.Desktop"(各文件第 17-18 行)。redirects.Desktop 自身的类注释写明"Mixins redirect java.awt.Desktop#browse(URI) here"(redirects/Desktop.java:12)。
注意:这三个 MixinGuiXxx 的 @ModifyConstant 与目标常量分别在同一文件内相邻行(:12 / :13 / :12),但 MixinGuiScreenDemoResourcePacks 因双目标而错开一行。
FLOAT_MOUSE_MOVEMENT(Mixins.java:39-44)
2 个 mixin,把整数像素的鼠标移动换成浮点:
game.MixinMouseHelper目标MouseHelper,并implements FloatMouseHelper。game.MixinEntityRenderer目标EntityRenderer,用两处@ModifyExpressionValue改写updateCameraAndRender,注入点为@At("MIXINEXTRAS:EXPRESSION")(MixinEntityRenderer.java:24与:31)。MIXINEXTRAS:EXPRESSION表明它依赖 MixinExtras(三个 mixin JSON 均声明"mixinextras": { "minVersion": "0.5.0" })。
MINECRAFT_SCALE_FULLSCREEN_CORRECTLY(Mixins.java:45-48)
1 个 mixin:game.MixinMinecraft_Display 目标 Minecraft,单处 @ModifyExpressionValue(MixinMinecraft_Display.java:13)。修正 Minecraft 在全屏下计算显示缩放(GUI scale)的问题。
数值
| 数值 | 值 |
|---|---|
| 覆盖的 mixin 类数 | 12 |
其中实现 InputEvents.KeyboardListener 的 |
2(MixinGuiEditSign、MixinGuiScreenBook) |
其中实现 FloatMouseHelper 的 |
1(MixinMouseHelper) |
| 双目标 mixin 数 | 2(MixinGuiTextInput、MixinGuiScreenDemoResourcePacks) |
改道到 redirects.Desktop 的 mixin 数 |
4 |
MIXINEXTRAS:EXPRESSION 注入点数 |
2(均在 MixinEntityRenderer) |
依赖 addRequiredMod 的条目数 |
0 |
交互
| 触发 | 行为 |
|---|---|
| 打开告示牌/书界面 | GuiEditSign / GuiScreenBook 作为 KeyboardListener 接收文本输入 |
| 点击含外部链接的聊天/菜单/模组包界面 | 打开系统浏览器,不触碰 java.awt.Desktop |
| 鼠标移动 | 经 FloatMouseHelper 以浮点像素传递 |
| 全屏切换 | 显示缩放被重新计算 |
相关条目
- 输入与显示事件 API -
InputEvents.KeyboardListener与FloatMouseHelper的定义 - Mixin 注册机制总览 - 本目录 4 篇条目在
Mixins枚举中的位置 - LWJGL2→LWJGL3 兼容层 -
redirects.Desktop的实现