Fullscreen Windowed

[!INFO] Git Commit: d7b512b | Updated: 2026-10-01

Fullscreen Windowed 是一个纯客户端的窗口模式 mod(作者 Hancin,2015 年首发), 它让 Minecraft 跑在无边框窗口(borderless windowed)而不是原版的独占全屏。

它不是一个通用的"全屏/无边框切换器"。原版 Minecraft 自带的全屏键位会被它 抢走并替换成一个绑定到 KEY_NONE 的占位键位,原版全屏因此在逻辑上永不触发; 玩家改用原来那个全屏键来触发无边框切换。源码注释说明这是为了避免游戏崩溃, 并警告占位键位不能绑到任何有效按键。

主要特性:

  • 无边框实现:靠 glfwSetWindowAttrib(GLFW_DECORATED, GLFW_FALSE) 去边框 + 始终 Display.setFullscreen(false),即"GLFW 改装饰、LWJGL 报告非全屏", 而不是 LWJGL 的真全屏模式;
  • 多显示器:可指定用第几块屏(1 起),或设为 0 自动按窗口中心点所在屏; 指定屏号接不上时自动退回自动选择;
  • 自定义尺寸(advanced,默认关):宽高都须 > 256 才生效,X/Y 在指定屏号时 解释为相对该屏原点的偏移;
  • 启动即生效:构造器先把 gameSettings.fullScreen 强制置 false(避开真全屏启动的 GL 上下文问题),再在 postInit 延迟 5 tick 补上无边框;
  • OptiFine 兼容模式(默认开):改用延迟初始化以免与其他改 GL 的 mod 冲突。

技术栈:LWJGL 3 的 GLFW 常量 + lwjgl3ify 的 org.lwjglx.opengl.Display 与 org.lwjglx.input.Keyboard,类上标注 @Lwjgl3Aware。 依赖声明只有 org.lwjgl:lwjgl-glfw:3.3.2。 gradle.properties 中 usesMixins = false,无 coremod,无 AccessTransformer。

⚠️ mcmod.info 中 modid / name / version 均为 ${modId} / ${modName} / ${modVersion} 占位符。实测 modid 来自 gradle.properties 的 modId = fw—— 与仓库名、与 modGroup = com.hancinworld.fw 的末段都不同名。 @Mod 注解写的是 modid = Tags.MOD_ID,而 Tags 是构建期生成的类, gradleTokenModId = MOD_ID 指定了替换,因此源码里看不到字面量 modid, 必须从 gradle.properties 取。资源域为 fw(语言文件在 assets/fw/lang/)。

配置

  • 配置项 - 9 个实际生效的配置(general 3 + advanced 6)、Reference 默认值回退、以及第 10 个被注释掉而从未写入的 onlyRemoveDecorations
  • 全屏切换流程 - toggleFullScreen 的 12 步顺序、去边框那一行、反射调用 Minecraft.resize、两条触发路径的差异
  • 显示器选择与边界计算 - 四级分支优先级、1 起索引、> 256 门槛、X/Y 相对偏移与降级
  • 启动初始化 - 构造器抢先禁全屏、postInit 三分支、5 tick 延迟与 40 帧去抖

键位

  • 全屏键位接管 - 备份并替换 field_152395_am、KEY_NONE 占位键、接管/归还状态机