1

在某些 WM 中,可以选择影响窗口显示方式的主题,例如按钮背景的颜色。

如果我使用裸 Xlib 调用绘制一个窗口,我应该怎么做才能符合这些受主题影响的设置?即我应该为每个可能的 WM 编写特定的代码吗?一般是怎么解决的?

4

1 回答 1

1

有几种主题类型,它们有时会一起播放,但不应混淆。

  • 窗口管理器/边框主题描述每个窗口的装饰,而不是内容
  • UI 工具包主题/小部件主题描述了如何在窗口中绘制按钮、文本字段等
  • 图标主题描述了使用哪些图标,涵盖应用程序图标以及文件图标、操作图标、工具栏图标等。
  • 颜色主题定义了要在其他主题的框架内使用的调色板
  • 指针主题定义了一组鼠标指针图标

一些桌面环境将所有这些主题捆绑在“桌面”主题中,或者至少提供一个前端来选择所有这些主题。然而,这些主题独立于桌面环境,也相互独立。可以使用配置文件来设置它们。

如果您希望您的应用程序符合用户的偏好,首先您应该坚持 Icon 主题。Pointer 主题由 X 服务器负责,只要您只使用常用的鼠标图标并且不要将自己的图标上传到 X 服务器。

第二个明显的事情是颜色主题,但不幸的是,没有颜色主题的标准,Gtk+ 和 Qt 框架都以独立的方式提供了这个功能(桌面主题配置器理解和操作两者以提供一致性)。您可以做一些魔术来确定用户更喜欢 Gtk+ 颜色还是 Qt 颜色(例如,正在运行 Gnome 或 KDE),然后从那里提取颜色。

然而,最困难的事情是提供与用户选择的 UI 工具包主题相符的 UI 元素的外观和感觉。首先,您必须再次在 Gtk+ 和 Qt 之间做出选择(也存在其他可主题化的工具包,但通常不是由用户或像 Enlightenment 这样的小众玩家提供主题)。然后您将不得不重新实现相同的功能。有趣的是,许多主题在 Gtk+ 中都带有自己的主题引擎,并且可以让主题引擎为您完成工作。这种方法已经被多方采纳。例子:

  • Java Swing 支持通过实现 Gtk+ 主题 API 并让 Gtk+ 主题引擎完成工作来模拟 Gtk+ 应用程序,但存在一些不一致的情况。
  • Firefox 和其他使用 XUL 的 Mozilla 应用程序也这样做,但总是存在令人讨厌的差异,从默认字体大小开始。
  • Qt 本身有一个兼容的 Gtk+ 主题,基本上是一样的;这个很好用。

我的建议是不要重新发明轮子,而是使用 Qt(或 Gtk+,如果您愿意)来处理超出基本绘图操作的 GUI 元素。请注意,根据我的经验,即使是原始绘图,使用 Qt 通常也比使用 Xlib 做得更好。用户获得了她期望的外观和感觉(不仅仅是外观),界面丰富而稳定,并且您可以节省大量时间来编写所有这些内容。

于 2012-11-30T18:34:18.267 回答