我将框架背景颜色和默认的脸部背景颜色都设置为#262626:
(add-to-list 'default-frame-alist '(background-color . "#262626"))
(set-face-attribute 'default nil
:background "#262626")
尽管如此,它们的渲染略有不同:
区别几乎不明显。如果以GIMP或类似的格式查看,则可以看到有文本的背景是#262626,而没有文本(空白行)的背景是#252525。这困扰着我。
奇怪的是,为两个设置#242424时,不会发生相同的事情:
那么,为什么不只使用#242424并完成它呢?我坚持使用#262626,因为我希望Emacs与我的xterms具有相同的颜色,而我的xterms是该颜色,因为它在256色表中为235。我希望在xterm中运行的具有256色功能的应用程序能够准确地再现背景色。
那么,我的问题是:如何使Emacs渲染框架背景和文本背景相同?
(我意识到自己喜欢这件事听起来很疯狂,但是没有理由为什么它不能正常工作并且让我发疯。)
这是Arch Linux上的Emacs 24.3。
啊哈!我发现了问题。这是一个错误的舍入错误。
./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,并且有足够的错误使它四舍五入(最小?)到37(0x25)而不是38(0x26)。文本渲染在其他地方完成,没有相同的问题。
最后,我想这主要是GTK的错。我现在真的不想接触GTK来源,但至少我知道发生了什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句