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 以浮点像素传递
全屏切换 显示缩放被重新计算

相关条目