9

GTK3 应用程序可以使用 CSS 设置样式和主题。如何强制 GTK使用我的应用程序附带的 CSS,而不是将其与安装在用户系统上的主题组合/级联?

为什么要这样做?从理论上讲,CSS 将是一个很棒的基于规则的样式系统,您只需添加一个完整的屏幕并精心选择的规则来一致地定义应用程序的外观。不幸的是,在实践中,人们倾向于在样式表中添加数百个脑残、重复的定义,从而伪造级联的本质。

实际的问题是我的应用程序将获得媒体处理应用程序的典型、柔和的深灰色外观,而与用户系统上安装的全局主题无关。通过阅读 GTK 文档和GTKmm 教程,我想出了以下代码来阅读我自己的 CSS 样式表:

auto screen = Gdk::Screen::get_default();
auto css_provider = Gtk::CssProvider::create();
try {
    css_provider->load_from_path(lib::resolveModulePath (stylesheetName, resourceSerachPath));

} catch(Glib::Error const& failure) {
    WARN(gui, "Failure while loading stylesheet '%s': %s", cStr(stylesheetName), cStr(failure.what()));
}

Gtk::StyleContext::add_provider_for_screen(screen, css_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

从技术上讲,这很完美。然而——现在我被迫“反对”用户系统上的 CSS 规则。如果我首先在默认规则中设置合适的边框颜色,在 GtkWindow 的规则中设置深灰色背景和合适的文本颜色,再加上文本输入字段的一些规则,我会在某些部分获得所需的外观,但只要用户的系统主题为某些特定的小部件或小部件组合添加特定定义,从而显式重复颜色而不是从通用规则继承它们,我需要在我的应用程序样式表中添加另一个特定规则来修复该特定情况。也就是说,已安装系统主题的可能引导不当的结构迫使我的应用程序样式表采用相同的引导不当的错误做法,并且有数百个单例定义一遍又一遍地重复相同的值。

问题

  • 我怎样才能告诉 GTK 在我的应用程序中使用我的样式表?
  • 是否有任何可行的替代方案,它不是那么激进,但仍然允许我按照预期的方式使用 CSS(最少的规则集 + 级联)?
4

2 回答 2

6

您可以使用 GTK 演示中的reset.css文件来取消设置所有现有规则。

一个不太激进的选择可能是忽略默认以外的用户主题。大概如果用户有一个使用糟糕的 CSS 实践构建的主题,他们仍然会喜欢那个主题。那么为什么他们不能使用他们喜欢的主题查看您的应用程序呢?

于 2018-10-05T06:05:51.677 回答
4

正如@ptomato 所指出的,您可以安装一个 CSS 来有效地覆盖系统上任何预先存在的其他规则。然而,这也表明了一种不太激进的解决方案:只需取消预装主题的有问题的部分。

它是如何工作的?

我们在 CSS 中添加包罗万象的规则,即以某种方式选择任何可能元素或至少一个完整子树的规则。这是通过*在选择器中使用通配符来实现的。而且由于我们以更高的优先级(通常GTK_STYLE_PROVIDER_PRIORITY_APPLICATION)安装样式表,因此这些规则将“盖过”恰好以较低优先级出现的每个特定规则。

  • 我们可以使用该值unset来清除设置
  • 我们可以使用该值inherit来强制该属性从父窗口小部件的该属性设置派生。

特别是对于在具有“轻”主题的环境中获得“灰色柔和的媒体应用程序”外观的给定问题,我们可以使用

* {
    color: inherit;
    background-color: inherit;
}

...仅取消先前存在的“浅色”主题的有问题的部分,即背景和颜色设置。然后,我们可以在中心点设置一次我们自己的值,它们将按预期被继承。

通过在 CSS 上下文选择器下方使用通配符,我们甚至可以扩展该想法并在给定范围内处理更多有问题的设置。实现这一点的关键技巧是在您正在运行的应用程序上使用GTK+ 检查器并调查实际设置以找到仍然“抓住”有问题的设置的最低可能点。(要激活 GTK+ 检查器,请使用 运行您的应用程序GTK_DEBUG=interactive path/to/my/app

于 2018-10-05T16:09:09.847 回答