C语言 Evince 中的 GTK+ 插入符号颜色 CSS 属性



使用深色主题时,Evince 中的插入符号(按 F7 进入插入符号模式)是一种非常浅的颜色,因此在文档通常的白色背景下显示效果不佳。

我想解决这个问题,我打算破解一个主题来做到这一点,但在挖掘时,似乎 evince 正在使用一个不推荐使用的属性:cursor-color(在 ev-view.c:4260):

gtk_style_context_get_style (context,
                 "cursor-color",
                 &style_color,
                 NULL);

回退是:

gtk_style_context_save (context);                                   
gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, color);
gtk_style_context_restore (context);                                

用已在此处完成。所以我想尝试更新 evince 以使用 CSS 属性,然后更新我的主题以EvView对象设置它以将其应用于 evince 的主文档视图:

我在~/.config/gtk-3.0/gtk.css中设置了以下 CSS 作为测试:

* {
     caret-color: rgba(0,255,0,1.0);
}

例如,这确实适用于 gedit - 主编辑器中的插入符号和对话框都是绿色的。

然后,我尝试将其读出,使用与GTK内部用于插入符号颜色的逻辑类似的逻辑(c.f. gtk/gtkstylecontext.c @ 9b86d6da2)

gtk_style_context_get (context,
                gtk_style_context_get_state (context),
                "caret-color", color,
                NULL);

但是,这不起作用,我的颜色是透明的黑色,而不是预期的不透明绿色。然而,对gtk_style_context_get()的呼吁实际上是将颜色设置为透明的黑色,而不仅仅是让它不理会。

仅使用GTK_STATE_FLAG_NORMAL而不是gtk_style_context_get_state (context),因为过去的回退也不起作用。

读取此属性的正确方法是什么,以便我可以将其设置为我的主题并选取它?

要获取插入符号颜色,您应该执行以下操作:

GdkRGBA *caret_color;
gtk_style_context_get (context,
                       gtk_style_context_get_state (context),
                       "caret-color",
                       &caret_color,
                       NULL);

代码的后面,在 Evince 中,您有:

if (style_color) {
    color->red = style_color->red / 65535.0;
    color->green = style_color->green / 65535.0;
    color->blue = style_color->blue / 65535.0;
    color->alpha = 1;

其中颜色值从GdkColor转换为GdkRGBA。一旦您获得"插入符号颜色",就不需要这种转换,我想这可能已经如您所料地改变了颜色。

最新更新