啊哈!我发现了这个问题。这是一个被诅咒的舍入错误。
- 这是bzr rev 116690(git commit 08885465fcc080f369f0958fcd85e37e28a7526f)。
./autogen.sh
,则:
./configure --prefix=/opt/emacs/usr --sysconfdir=/opt/emacs/etc \
--libexecdir=/opt/emacs/usr/lib --localstatedir=/opt/emacs/var \
--with-x-toolkit=gtk3 --with-xft CFLAGS=-g
安装迪尔斯是/opt/emacs
下避免重挫了现有的安装。
make
,(sudo) make install
,gdb src/emacs
。
罪魁祸首功能是xg_set_widget_bg
在src/gtkutil.c
。在1039线,这台从浮点颜色值背景设置断点 :
gtk_widget_override_background_color (w, GTK_STATE_FLAG_NORMAL, &bg);
在我的情况下,xg_set_widget_bg
第一个电话是无关紧要的。第二个是 乐趣发生。捅结构:
Breakpoint 1, xg_set_widget_bg (f=0x1209908, w=0x1658110, pixel=2500134) at gtkutil.c:1039
1039 gtk_widget_override_background_color (w, GTK_STATE_FLAG_NORMAL, &bg);
(gdb) print xbg
$1 = {pixel = 2500134, red = 9764, green = 9764, blue = 9764, flags = 7 '\a', pad = 0 '\000'}
(gdb) print bg
$2 = {red = 0.14898908979934386, green = 0.14898908979934386, blue = 0.14898908979934386, alpha = 1}
(gdb) print bg.red * 0xffff
$3 = 9763.9999999999982
(gdb) print bg.red * 0xff
$4 = 37.992217898832678
(gdb) set bg.red = bg.green = bg.blue = (double)0x26/0xff
(gdb) print bg
$5 = {red = 0.14901960784313725, green = 0.14901960784313725, blue = 0.14901960784313725, alpha = 1}
(gdb) print bg.red * 0xffff
$6 = 9765.9999999999982
(gdb) print bg.red * 0xff
$7 = 37.999999999999993
cont
,看看问题奇迹般地消失了。调试器非常酷。
如果您想了解Emacs如何获取xbg
中的值,请参阅xfns.c
。 当您说(set-background-color "#262626")
时,Emacs将每个组件转换为 0x2600,然后向X请求最接近的颜色值。这里是9764(0x2624)。 您可以使用xmag
进行验证,因为它报告了16位组件。显然,GTK将其像素值缩放为0xff,并且存在足够的错误以使其围绕(floor?)到37(0x25)而不是38(0x26)。文本呈现在其他地方完成 ,并没有相同的问题。
最后,我想这主要是GTK的错。我现在并不想触及GTK源代码,但至少我知道发生了什么。
您的第二个设置是否处理所有事情,以至于不需要第一个设置?如果你有'(set-face-attribute'default nil:background“#262626”)',你为什么还需要其他东西?也许Arch Linux是不同的,但在OSX上不需要使用'(add-to-list'default-frame-alist'(background-color。“#262626”))' – lawlist
除了寻找解决方法在这里寻求帮助,考虑提交一份Emacs错误报告/增强请求:'Mx report-emacs-bug'。即使对于目前的行为有一个很好的理由或解释,也许还有改进的空间。 – Drew
@lawlist我刚刚测试过,看起来你是正确的自动添加框架参数。我想确认一切正确,但在这种情况下,这是多余的。不幸的是,即使没有多余的设置也会发生同样的问题。 –