WSLg下 (x-display-mm-height)返回0(异常)

问题:

最近把windows11更新到了22H2,然后wsl提示有更新(好像是什么变成store版本了),没细看就更新了。

接着emacs 29.0.50 org-mode下的org-latex-preview就出问题了,之前都是正常的,现在无法生成预览图片了,细看有个错误叫 arithmetic overflow error,打开debug-on-error,一路跟下去,最后发现是 (display-mm-height) 变成0了的缘故。看这个方法内部的代码,发现主要是因为(x-display-mm-height)变成了0,而display-mm-dimensions-alist是空的列表。

跑到windows下面的emacs看了眼display-mm-height是正常值(334),且(x-display-mm-height)也是正常值(334)。

问题锁定

那么问题应该就在(x-display-mm-height)这个C函数身上了,但是为啥更新wsl之前都正常呢?

临时解决方案

于是根据frame.el.gz里面的注释:

You can override what the system thinks the result should be by adding an entry to `display-mm-dimensions-alist’.

想了个临时解决办法,往display-mm-dimensions-alist里面手动添加一个size,

(frame-parameter nil 'display)得到"wayland-0"

之后通过(setq display-mm-dimensions-alist '(("wayland-0" . (797 . 344))))强行写入mm-size

之后display-mm-height的返回值就正常了,org-latex-preview也能正常工作了。

更多发现

再往下看,发现wsl下的emacs中display-monitor-attributes-list这个列表里面的mm-size变成了全零,而windows下面的则不是。

WSL emacs:

(display-monitor-attributes-list)

(((name . "rdp") (geometry 0 0 3440 1440) (workarea 0 0 3440 1440) (mm-size 0 0) (scale-factor . 1.0) (frames #<frame *scratch* - GNU Emacs at Inspir-xuehy-PC 0x5597d68a64c8>) (source . "Gdk")))

Win emacs:

(display-monitor-attributes-list)

(((geometry 0 0 3440 1440) (workarea 0 0 3440 1380) (mm-size 797 334) (name . "\\\\.\\DISPLAY1") (frames #<frame *scratch* - GNU Emacs at INSPIR-XUEHY-PC 0000025d56b45870>)))

windows里面的mm-size是797, 334而wsl里面的是0,0.

难道是更新了WSL之后emacs C函数里面获取display的信息出了问题?

大家有没有遇到相同问题的呢?

4 个赞