2014-03-02 36 views
5

我设置的框架背景色和默认的脸上背景颜色 都为#262626:Emacs框架背景色和默认的脸背景被设置为相等,但似乎相差#010101

(add-to-list 'default-frame-alist '(background-color . "#262626")) 
(set-face-attribute 'default nil 
        :background "#262626") 

在尽管这样,他们呈现略有不同:

Broken rendering.

的区别仅仅是几乎无法察觉。如果您在GIMP或 中查看此类似内容,则可以看到有文字的背景是#262626,而 没有文字的背景(空白行)是#252525。这困扰 我。

Non-broken rendering.

那么为什么不直接用#242424,并用它做:

奇怪的是,当设置#242424两个不发生同样的事情?我坚持#262626,因为我 希望Emacs与我的xterms颜色相同,我的xterms颜色为 ,因为它是256色表中的数字235。我希望在xterm中运行的支持256色的应用程序 能够准确再现背景色。

我的问题然后:我如何获得Emacs渲染框架的背景和文字 背景一样?

(我知道我听起来像一个疯狂的人关注了这一点,但没有 原因,它应该无法正常工作,它的驾驶我坚果。)

这是Arch Linux的Emacs的24.3。

+0

您的第二个设置是否处理所有事情,以至于不需要第一个设置?如果你有'(set-face-attribute'default nil:background“#262626”)',你为什么还需要其他东西?也许Arch Linux是不同的,但在OSX上不需要使用'(add-to-list'default-frame-alist'(background-color。“#262626”))' – lawlist

+1

除了寻找解决方法在这里寻求帮助,考虑提交一份Emacs错误报告/增强请求:'Mx report-emacs-bug'。即使对于目前的行为有一个很好的理由或解释,也许还有改进的空间。 – Drew

+1

@lawlist我刚刚测试过,看起来你是正确的自动添加框架参数。我想确认一切正确,但在这种情况下,这是多余的。不幸的是,即使没有多余的设置也会发生同样的问题。 –

回答

3

啊哈!我发现了这个问题。这是一个被诅咒的舍入错误。

  • 这是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 installgdb src/emacs

罪魁祸首功能是xg_set_widget_bgsrc/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源代码,但至少我知道发生了什么。