通过 GTK3 CSS 样式表自定义 GtkTextTag 外观?

标签 c linux gtk3

我有一些 GtkTextTable*mom_tagtable;GtkTextBuffer *mom_obtextbuf; 的标签表(显示在两个 TextView 中 GtkWidget *mom_tview1; & GtkWidget*mom_tview2;)。我在 Linux/Debian/Sid 上使用 GTK3.21,它用于与 this other 中相同的(免费软件,GPLv3)应用程序问题:expjs branch (在 github 上)的 MELT 监视器。顺便说一句,所有 GTK 代码都在一个 C99 文件中 gui.c .我有几十个文本标签:

static GtkTextTag *mom_tag_toptitle;    // tag for top text
static GtkTextTag *mom_tag_objtitle;    // tag for object title line
static GtkTextTag *mom_tag_objsubtitle; // tag for object subtitle line
static GtkTextTag *mom_tag_idstart;     // tag for first characters of objids
/* etc .... */

我不想使用 GtkBuilder 构建我的 GUI(我更喜欢手动编码,因为大部分代码稍后可以由我的应用程序生成)。我想在同一个文本文件中自定义标签和我所有应用程序的外观。似乎GTK CSS stylesheets可能会有用。

实际上,看起来 GTK3 已经或曾经有几种方法来描述文本文件中应用程序的外观和主题(GtkBuilder 也定义了 GUI,我不想拥有它,GTK-CSS stylesheets,过时了Gtk resource 文件,已过时的 GtkUIManager 等...)并且它正在过渡到 GTK CSS 框架,但过渡未在 GTK3.20 中完成。

我目前正在使用硬编码的外观和感觉来初始化这些标签:

    mom_tag_toptitle =
      gtk_text_buffer_create_tag (mom_obtextbuf,
                                  "toptitle",
                                  "justification", GTK_JUSTIFY_CENTER,
                                  "pixels-above-lines", 2,
                                  "pixels-below-lines", 4,
                                  "foreground", "navy",
                                  "paragraph-background", "lightyellow",
                                  "font", "Helvetica Bold", "scale", 1.5, NULL);
    mom_tag_objtitle =
      gtk_text_buffer_create_tag (mom_obtextbuf,
                                  "objtitle",
                                  "justification", GTK_JUSTIFY_CENTER,
                                  "pixels-above-lines", 4,
                                  "pixels-below-lines", 2,
                                  "foreground", "brown",
                                  "font", "Sans Bold",
                                  "paragraph-background", "lightcyan",
                                  "scale", 1.3, NULL);
    mom_tag_objsubtitle =
      gtk_text_buffer_create_tag (mom_obtextbuf,
                                  "objsubtitle",
                                  "justification", GTK_JUSTIFY_CENTER,
                                  "pixels-above-lines", 1,
                                  "pixels-below-lines", 1,
                                  "foreground", "chocolate4",
                                  "font", "Sans Bold",
                                  "paragraph-background", "lightgoldenrod",
                                  "scale", 1.15, NULL);
    mom_tag_idstart =
      gtk_text_buffer_create_tag (mom_obtextbuf,
                                  "idstart",
                                  "font", "Courier Bold",
                                  "foreground", "darkgreen", NULL);

我对这种方法不满意,我希望这些标签具有在某些外部文本文件中描述的外观(字体、大小、颜色)(同样适用于 TextView 周围的小部件)。

所以我的问题是:

如何通过 GTK CSS 样式表自定义 GtkTextTag

我正在考虑创建一些“假”GtkWidgetPath (我应该为每个 gtk 文本标签创建一个这样的路径)并使用它来检索 GTK CSS 中的样式信息,但我完全不确定这是正确的方法。

我也不明白为什么显示相同文本缓冲区的两个不同的 TextView 对于相同的文本可以有不同的样式(我希望这是不可能的,但我不确定为什么) .

This可能是一个相关的问题,但它看起来与我的完全不同。

附言。我并不特别关注 GTK3 CSS,但如果可能的话,我确实希望有一个描述我的整个 GTK3 应用程序外观的文本文件。

最佳答案

要回答我自己的问题,正如 Nominal Animal 在评论中所建议的那样,为了将来引用,不可能使用 CSS,但可以使用 UI 构建器(实际工作代码在 C++ 中并使用 GtkMM libgtkmm 和 GTK 3.22,即在我的 github melt-monitor master 分支 git commit d947aedc723913789515 )。确实使用(相当于 GtkMM 的)gtk_builder_new_from_file(传递 "browsermom.ui",这是下面的 XML GTK UI 文件的路径)来获取 GtkBuilder,使用 gtk_builder_get_object 从中获取 GtkTextTagTable,使用 gtk_text_buffer_new 将其提供给 GtkTextBuffer

这是我正在使用的 XML GTK UI 文件 browsermom.ui

<?xml version="1.0" encoding="UTF-8"?>
<!-- file browsermom.ui for GtkBuilder describing tags in browsing textview -->
<!-- see also https://stackoverflow.com/q/39466395/841108 -->
<interface>
    <requires lib="gtk+" version="3.22"/>
    <object class='GtkTextTagTable' id='browsertagtable_id'>
      <!-- page_title_tag for the entire page -->
        <child type="tag">
            <object class='GtkTextTag'>
                <property name="name">page_title_tag</property>
                <property name="font">Arial Bold</property>
                <property name="scale">1.35</property>
                <property name="paragraph-background">lemonchiffon1</property>
                <property name="pixels-above-lines">3</property>
                <property name="pixels-below-lines">6</property>
                <property name="foreground">navyblue</property>
                <property name="justification">GTK_JUSTIFY_CENTER</property>
            </object>
        </child>
      <!-- object_title_tag for start of object -->
        <child type="tag">
            <object class='GtkTextTag'>
                <property name="name">object_title_tag</property>
                <property name="font">Cabin Medium</property>
                <property name="scale">1.27</property>
                <property name="paragraph-background">cornsilk</property>
                <property name="pixels-above-lines">2</property>
                <property name="pixels-below-lines">3</property>
                <property name="foreground">navyblue</property>
                <property name="justification">GTK_JUSTIFY_CENTER</property>
            </object>
        </child>
 <!-- etc.... --->
 </object>
</interface>

(棘手的部分是理解 <child XML 标记需要 type="tag" XML 属性)

顺便说一句,出于某种我不明白的原因,我收到了类似 GTk 的警告

(monimelt:25323): Gtk-WARNING **: Failed to set property gtkmm__GtkTextTag.scale to O.9: Could not parse double 'O.9'

即使 0.9 没有出现在该文件中。

关于通过 GTK3 CSS 样式表自定义 GtkTextTag 外观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39466395/

相关文章:

c - 限制 malloc() 的虚拟内存空间

linux - 127 构建步骤 > 'Execute shell script on remote host using ssh' 标记构建为 > 失败完成 : FAILURE

linux - 如何修复我的 SSH 配置以在 SSH 代理后面使用 git?

linux - Unix - 将所有行组合成逗号分隔的单行

autocomplete - PyCharm - Gtk3 的自动完成功能神​​奇地停止工作

gtk - 如何在 GLib 对象上设置枚举属性?

c - 强制套接字函数创建一个旧的 id

const int *ptr=500;它到底存储在哪里

c - Ubuntu 12.04 不支持 libipq

windows - 打开文件选择器对话框时出现 Glib-GIO-ERROR