codeblocks 20.03修改字体设置后报错并失效问题

原创
05/18 15:09
阅读数 1.6W

      前段时间安装了codeblocks新发布的20.03 For win x86_64版。发现默认字体不是等宽字体,写代码用字母数字不会混淆的等宽字体为好,设置后某些情况会弹一个错误对话框:

error dialog

    比如在打开编辑器设置,从新打开codeblocks等情况下都会弹这个框一次或几次。

    0. 分析

    折腾了一段时间codeblocks的源代码,发现这是wxWidgates 3.1.3的bug引起。在wxNativeFontInfo::FromString函数中从字体描字符串解析成字体信息时,不能正确解析大部分浮点数字号。
src/common/fontcmn.cpp 大约762行

    pointSize = static_cast<float>(d);
    if ( static_cast<double>(pointSize) != d )
        return false;

还有src/msw/font.cpp 大约695行

    pointSize = static_cast<float>(d);
    if ( static_cast<double>(pointSize) != d )
        return false;

当然还有其它地方,现在只是针对win平台。从上面的代码可以看出如果字号转换成单精度浮点,再转双精度浮点不等于字号直接转换成的双精度浮点,那么会忽略后面的字体信息,导致字重fontweight为0,fontfamily信息也丢失。直观的后果就是codeblocks ide弹错误框并且编辑器设置的字体失效被默认字体代替。

1.  解决方案

    1.1 修改wxWidgates 3.1.3的源码,编译wxWidgates,再编译codeblocks的源码。太疯狂了,不推荐、不推荐、不推荐,虽然我这么试了,感觉太麻烦了。

    1.2 推荐的解决方案是:编辑器设置字体时字号设置成整数或者带 .5 的浮点数(当然 *.25 , *.75也可以),不要设置成 .2, .3之类的会导致解析截断的字号。codeblocks的配置文件再%USERPROFILE%\AppData\Roaming\CodeBlocks\default.conf,大约4064行

		<FONT>
			<str>
				<![CDATA[1;10;-17;0;0;0;400;0;0;0;0;3;2;1;49;Microsoft YaHei Mono]]>
			</str>
		</FONT>

把CDATA中数据项的第二项改成整数。或者第一项改成0去掉第二项也会正常([CDATA[0;-17;0;0;0;400;0;0;0;0;3;2;1;49;Microsoft YaHei Mono]])。不过ide里改了配置并保存,又可能导致这里的值不正常,需要再次修正。

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部