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(最少的规则集 + 级联(?
您可以使用 GTK 演示中的 reset.css 文件来取消设置所有现有规则。
一个不那么激进的替代方法可能是忽略默认主题以外的用户主题。据推测,如果用户有一个使用糟糕的CSS实践构建的主题,他们仍然喜欢这个主题。那么,为什么他们不能使用他们喜欢的主题查看您的应用程序呢?
正如@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
运行您的应用程序(