配置项
基本信息
| 属性 | 值 |
|---|---|
| 配置类 | com.hancinworld.fw.handler.ConfigurationHandler |
| 实际写入的配置项 | 9(general 3 个 + advanced 6 个) |
| 声明但从不加载的字段 | 1(_onlyRemoveDecorations) |
| 配置界面 | ModGuiConfig(经 @Mod(guiFactory = Reference.GUI_FACTORY_CLASS) 挂载) |
| 读配置的入口 | preInit → ClientProxy#subscribeEvents → ConfigurationHandler#init |
配置类没有自己的配置文件路径:ModGuiConfig 构造时传入的"文件名"参数是
ConfigurationHandler.instance().toString(),而 toString() 直接 return _configuration.toString()
(ConfigurationHandler.java:279-281),即整份配置的内容字符串——不是路径。
实际路径仍由 event.getSuggestedConfigurationFile() 决定,只是被当成了界面标题。
全部生效的配置项
general 分类(ConfigurationHandler.CATEGORY_GENERAL):
| 键 | 类型 | 默认值 | 作用 |
|---|---|---|---|
enableFullscreenWindowed |
boolean | true |
总开关。为 false 时完全不接管全屏 |
fullscreenMonitor |
int | 0 |
指定用第几块显示器(1 起),0 = 自动选当前窗口所在屏 |
enableMaximumCompatibility |
boolean | true |
改用延迟初始化策略以兼容 OptiFine 等改 GL 的 mod |
advanced 分类(CATEGORY_ADVANCED = "advanced"):
| 键 | 类型 | 默认值 | 作用 |
|---|---|---|---|
enableAdvancedFeatures |
boolean | false |
下面 5 项的总开关,默认全关 |
customFullscreenDimensions |
boolean | false |
是否使用自定义全屏尺寸 |
customFullscreenDimensionsX |
int | 0 |
全屏时窗口 X 坐标 |
customFullscreenDimensionsY |
int | 0 |
全屏时窗口 Y 坐标 |
customFullscreenDimensionsW |
int | 0 |
全屏时窗口宽,须 > 256 |
customFullscreenDimensionsH |
int | 0 |
全屏时窗口高,须 > 256 |
默认值分别回落到 Reference 里的常量(Reference.java:31-39):
AUTOMATIC_MONITOR_SELECTION = 0、ADVANCED_FEATURES_ENABLED = false、
CUSTOM_FULLSCREEN_DIMENSIONS = false、ENABLE_MAXIMUM_COMPATIBILITY = true、
CUSTOM_FULLSCREEN_X/Y/W/H = 0。
每个 getter 都是"字段为 null 就返回 Reference 常量"的模式,
配合 setXxx() 里的 _commitImmediately && _configuration.hasChanged() 立即存盘。
配置变更的即时重载
@SubscribeEvent onConfigurationChangedEvent(ConfigurationHandler.java:81-89)
在 modID 匹配时重新 load(),并在非初始化阶段调用
FullscreenWindowed.proxy.registerKeyBindings()——所以在设置界面里
关掉 enableFullscreenWindowed 会立刻把原版全屏键还回去。
源码缺陷:第 10 个配置项从未写入
_onlyRemoveDecorations 在 ConfigurationHandler.java:53 被声明,
isOnlyRemoveDecorations() / setOnlyRemoveDecorations() 也都实现了,
但唯一给它赋 Property 的那行被注释掉了(ConfigurationHandler.java:269-270):
// TODO: due to how LWJGL draws windows, it's not a good idea to have this... disabled until I can fix the bugs
// with X,Y being off due to decoration shadows.
// _onlyRemoveDecorations = _configuration.get(ConfigurationHandler.CATEGORY_ADVANCED, "onlyRemoveDecorations",
// Reference.ONLY_REMOVE_DECORATIONS, I18n.format("comment.fullscreenwindowed.onlyRemoveDecorations"));
后果:
- 字段永远是
null,isOnlyRemoveDecorations()恒返回Reference.ONLY_REMOVE_DECORATIONS=false; advanced.onlyRemoveDecorations不会出现在生成的 cfg 文件里,玩家改了也没地方生效;ClientProxy.java:179的if (advanced && isOnlyRemoveDecorations())分支是死分支;setOnlyRemoveDecorations()会直接 NPE——它对null调.set();- 语言文件里的
comment.fullscreenwindowed.onlyRemoveDecorations成了无人引用的孤儿键。
⚠️ 注意行首 //——这是被注释掉的代码,不是真实生效的注册。
相关条目
- 全屏切换流程 - 消费总开关与兼容模式的调用链
- 显示器选择与边界计算 - 消费
fullscreenMonitor与全部customFullscreenDimensions* - 启动初始化 -
enableMaximumCompatibility的两条分支 - 全屏键位接管 - 开关变化时如何接管 / 归还原版键位