失去焦点时停止最小化

失去焦点时停止最小化

防止Minecraft全屏窗口在失去焦点时最小化。

失焦时阻止最小化可以防止 Minecraft 在使用原生全屏模式时,当你切换窗口(Alt-Tab)、点击另一个显示器或以其他方式将焦点移出游戏时,自动最小化自身。

这是一个微小的客户端实用模组。安装与你 Minecraft 版本和加载器匹配的 jar 文件,当焦点改变时,全屏窗口应保持打开状态。

它做了什么

  • 防止原生全屏 Minecraft 窗口在失去焦点时自动最小化。
  • 在 Minecraft 的 LWJGL 后端所使用的窗口系统级别工作。
  • 在 Minecraft 创建窗口以及全屏模式改变时重新应用修复(在目标版本暴露这些钩子的情况下)。

它不做什么

  • 它不会强制 Minecraft 保持聚焦状态。
  • 它不会禁用失焦暂停行为。
  • 它不会更改无边框全屏、普通窗口模式或操作系统窗口管理器策略。
  • 它不会恢复已被其他程序最小化的窗口。

CurseForge 上的 Minecraft 版本和模组加载器支持

在 Fabric 和 Quilt 上,此模组旨在主动支持从 1.14 到最新版本的所有 Minecraft 版本。Quilt 构建是专门的 Quilt 移植版本,而非重复使用的 Fabric jar 文件。

在 Forge 上,基于现代 GLFW 的移植版本支持 1.13.2、1.16.5、1.17.x、1.18.x、1.19.x、1.20.1 和 1.20.6。同时也提供了针对 1.7.10、1.8.9 和 1.12.x 的旧版 LWJGL2 Forge 移植版本。

在 NeoForge 上,此模组支持 1.20.1、1.20.6 以及从 1.21 到最新版本的版本。

LiteLoader、Babric 和 Better Than Adventure 构建版本不在 CurseForge 上分发。这些版本可在 Modrinth 页面上获取。

此模组没有依赖关系。即使是 Fabric 版本也不使用 Fabric API。

技术细节

现代 Minecraft 版本使用 LWJGL3 和 GLFW。GLFW 有一个 GLFW_AUTO_ICONIFY 窗口属性,默认情况下,该属性可能导致原生全屏窗口在失去焦点时最小化。现代移植版本在 Minecraft 的 GLFW 窗口句柄上将该属性设置为 GLFW_FALSE:

glfwSetWindowAttrib(windowHandle, GLFW_AUTO_ICONIFY, GLFW_FALSE);

不同的 Minecraft 版本通过不同的类暴露原生窗口,因此每个目标版本会钩住相应版本的窗口类:

  • 现代的 Fabric、Forge、NeoForge 和 Quilt 构建版本会在 <init> 和 setMode 之后注入到 com.mojang.blaze3d.platform.Window 中。
  • 一些版本将原生句柄字段命名为 window,而另一些版本则命名为 handle。
  • 独立的 Forge 1.16.5 移植版本注入到 net.minecraft.client.MainWindow 中。

旧版 Forge LWJGL2 移植版本

Minecraft 1.7.10、1.8.9 和 1.12.x 使用 LWJGL2,而非 LWJGL3/GLFW。LWJGL2 没有 GLFW_AUTO_ICONIFY 属性,因此旧版 Forge 移植版本无法使用相同的单行 GLFW 修复。

相反,Forge LWJGL2 移植版本直接修补相关的 Minecraft 和 LWJGL2 显示代码:

  • Forge 1.7.10、Forge 1.8.9 和 Forge 1.12.x 使用 Forge/FML coremod 转换器。
  • 在 Linux 和其他类 Unix LWJGL2 后端(包括许多 BSD 系统)上,模组修补 org.lwjgl.opengl.LinuxDisplay 以跳过全屏失焦的图标化路径。
  • 在 Windows 上,模组修补 org.lwjgl.opengl.WindowsDisplay 以跳过全屏失焦的最小化/显示模式重置路径。
  • 在受影响的 Minecraft 版本(例如 1.7.10、1.8.9 和 1.12.x)上,模组还会抑制 Minecraft 自身的失焦全屏切换逻辑。

macOS 是 LWJGL2 构建版本的主要限制因素。相关的全屏行为是通过 LWJGL2 的原生 Cocoa 后端处理的,而不是通过可在 Java 端修补的显示代码。因此,与 Linux、Windows 以及 FreeBSD 或 OpenBSD 等类 Unix 系统相比,LWJGL2 对 macOS 的支持可能有限。现代的 LWJGL3/GLFW 移植版本则没有这个限制。