标签 GTK 下的文章

互联网档案馆要求 GitHub 下架 DRM 去除工具

互联网档案馆向 GitHub 发出移除请求,要求移除一个名为 DeGouRou 的工具。这是一个专门用于规避行业标准图书馆 TPM 的工具,可以允许读者保存他们借阅的图书的无 DRM 副本。互联网档案馆和其他图书馆使用这些 TPM 允许读者借阅加密图书,阅读加密图书,并归还加密图书。值得注意的是,互联网档案馆并“没有得到版权所有者的授权”提交这份移除通知。GitHub 满足了它的要求,但随后该软件代码出现在了更多地方。

消息来源:Torrent Freak
老王点评:嗯,被出版商们揪着不放的互联网档案馆,抽出手来打击一下盗版工具。

Meta 公司将发布 LLaMA 的商业版本

LLaMA 是 Meta 开源的大型语言模型(LLM),于今年 2 月公开发布,并提供给研究人员和学者使用,它有 70 亿、130 亿、330 亿和 650 亿等不同参数规模。开源的 LLaMA 中并没有包括其所使用的权重数据,但很快这些权重数据被“意外”泄露,并迅速引爆了一系列基于它的开源创新。尽管开源人工智能模型已经存在,但 Meta 的 LLaMA 商业化仍是重要的一步,因为它比市场上现有的许多开源 LLM 都要大,而且它来自全球最大的科技公司之一。

消息来源:ZDNet
老王点评:先开源培养生态,然后再基于此推出商业版本,这是一步好棋。

GTK 对 macOS 的支持将降到“尽力而为”的状态

GNOME 的开发者们正在考虑是否退役 macOS 上的 GLib 和 GTK 持续集成(CI)构建工具。除了 CI 硬件老化之外,CI 维护者对 macOS 也没有太多经验,而 GTK/GLib 开发者对 macOS 开发也不是特别感兴趣或熟悉。如果没有志愿者站出来处理 macOS 特定的回归问题,macOS CI 生成器可能会被逐步淘汰,反过来 GTK/GLib macOS 支持会降到“尽力而为”的状态,并依靠下游打包者和消费者来测试更改。

消息来源:Phoronix
老王点评:毕竟苹果公司不感兴趣,用户也寥寥无几,开发者自然也没有足够的动力和支持来进行。不过,还是有几个可以在 macOS 上运行的不错的 GNOME 软件的。

我们为各种 Linux 发行版提供了一个全新的最佳 GTK 主题列表。

桌面外观在你的 Linux 整体体验中起着重要作用。GTK 主题提供了一种简单而强大的方式来定制你的桌面环境的外观。应用 GTK 主题使你可以更改颜色、窗口装饰和整体样式,以适应你的喜好。

除了 KDE Plasma 和 LXQt 之外,大多数受欢迎的桌面环境都基于 GTK。因此,了解当今最好的 GTK 主题是很重要的。

在 Linux 上安装 GTK 主题相对简单。安装说明通常在主题的官方网站上。通常,它包括下载主题文件并将它们(提取后)放置在主目录下的 ~/.themes 文件夹中。

让我们深入了解在 2023 年最流行的前 15 个 GTK 主题。

2023 年最佳 GTK 主题

Orchis

Orchis 是一款备受推崇的 GTK 主题,因其清新独特的设计而广受欢迎。受到 macOS Big Sur 外观的启发,Orchis 为 Linux 桌面带来了流畅而现代的外观。

Orchis 因其将 macOS Big Sur 的优雅引入 Linux 生态系统而受到认可。通过结合现代设计和 Fluent Design 语言的元素,Orchis 提供了一个视觉吸引力和一致性的用户界面,增强了整体桌面体验。无论你喜欢浅色还是深色变体,Orchis 都为你的 Linux 桌面提供了一种清新而精致的外观。

Orchis 主题

注意:该主题支持 libadwaita/GTK4 主题。因此,适用于 GNOME 40+ 桌面。

你可以从下面的页面下载并获取安装说明。

下载 Orchis 主题

WhiteSur

WhiteSur 是一个受到 macOS Big Sur 流畅设计启发的 GTK 主题。以下是其主要特点:

  • 采用了 macOS Big Sur 的美学设计,带有圆角和半透明窗口。
  • 提供了浅色和深色模式以满足不同偏好。
  • 在基于 GTK 的应用程序中保持一致的设计。
  • 注重细节,具有平滑动画和清晰的阴影。
  • 可自定义选项,包括强调色、窗口装饰和按钮样式。

WhiteSur GTK 主题

WhiteSur 兼容多种 Linux 桌面环境,如 GNOME、Xfce 和 Cinnamon,使其能够受到广大用户的喜爱。通过 WhiteSur 干净统一的界面,在你的 Linux 桌面上体验 macOS Big Sur 的优雅。

注意:该主题还支持 GTK4/libadwaita 主题。

你可以从下面的页面下载主题并获取安装说明。

下载 WhiteSur 主题

Vimix

Vimix 是一款受欢迎的 GTK 主题,为 Linux 桌面环境提供时尚现代的外观。以下是它的主要特点:

  • Vimix 采用了时尚现代的设计风格,具有扁平界面、简洁线条和细微渐变。
  • 该主题提供了多种颜色变体,包括浅色的 Vimix Light 和深色的 Vimix Dark。
  • Vimix 兼容多种 Linux 桌面环境,包括 GNOME、Xfce、Cinnamon 等,适用于各种 Linux 用户。

Vimix 主题

Vimix 通过现代设计元素的结合、颜色的多样性以及与各种桌面环境的兼容性而受到欢迎。其时尚的外观和自定义选项使其成为寻求视觉上愉悦和一致用户界面的 Linux 用户的绝佳选择。

注意:它支持现代的 GTK4/libadwaita 主题。

你可以从下面的页面下载 Vimix 主题。

下载 Vimix 主题

Prof-GNOME-theme

Prof-GNOME-theme 是一个著名的 GTK 主题,为 Linux 桌面环境(特别是 GNOME)带来了专业而精致的外观。以下是其主要特点:

  • Prof-GNOME-theme 采用了简洁而专业的设计,呈现出极简主义的风格、优雅的线条和精致的美学。
  • 该主题采用了细腻而优雅的调色板,专注于中性色调和柔和的变化,营造出宁静而专业的氛围。
  • 该主题确保在基于 GTK 的应用程序中保持一致,为整个桌面环境提供了协调和和谐的体验。

Prof-GNOME 主题 - 2022 年 GNOME 主题

Prof-GNOME-theme 受到专业人士和欣赏干净精致桌面环境的用户的青睐。它注重细节,专注于专业主义,使它成为那些寻求精致而优雅外观的 Linux 桌面用户的绝佳选择。

你可以从下面的页面下载该主题并获取安装说明:

下载 Prof-GNOME 主题

Ant

Ant 是一款受欢迎的 GTK 主题,以其简洁和极简主义的设计而闻名。其主要特点包括:

  • 清爽而扁平的美学,带有微妙的阴影。
  • 一致且清晰的图标。
  • 色彩平衡而悦目。
  • 支持浅色和深色变体。
  • 与 GNOME 桌面环境无缝集成。

Ant 主题

用户可以在其 Linux 系统上享受到 Ant 主题带来的现代且视觉上愉悦的体验。其简约和优雅外观,使其成为寻求 GTK 应用程序和桌面的精致外观的人士的首选。

你可以从下面的页面下载 Ant 主题。

注意:该主题不支持 GTK4/libadwaita。
下载 Ant 主题

Flat Remix

Flat Remix 是一款备受赞誉的 GTK 主题,为 Linux 桌面提供了清新现代的外观。它的主要特点包括:

  • 扁平和极简主义的设计,色彩鲜明。
  • 在基于 GTK 的应用程序中保持一致和统一的外观。
  • 全面的图标集,提供精细的视觉体验。
  • 支持浅色和深色变体。

Flat Remix 主题

Flat Remix 为 Linux 桌面环境带来了愉悦的触感,提升了整体美学和用户体验。其鲜明的色彩和协调的设计使其受到喜欢清洁和现代界面的用户的欢迎。

注意:该主题不支持 GTK4/libadwaita。

你可以从下面的页面下载 Flat Remix 主题。

下载 Flat Remix 主题

Fluent

Fluent GTK 主题是一款现代时尚的主题,受到了微软的 Fluent Design System 的启发。以下是其主要特点:

  • 光滑和精致的外观,融入了 Fluent Design 的深度、动态和透明度原则。
  • 基于 Fluent 的图标提供了一致和统一的外观。
  • 与基于 GTK 的应用程序无缝集成,提供一致的用户体验。
  • 支持浅色和深色模式,允许用户个性化他们的桌面。
  • 持续开发和定期更新,确保与最新的 GTK 版本兼容。

Fluent GTK 主题

Fluent GTK 主题为 Linux 桌面带来了微软设计的优雅风采,吸引了欣赏现代和精致视觉体验的用户。其遵循 Fluent Design 指南并持续发展,使其成为寻求现代和精致 GTK 主题的人士的理想选择。

注意:该主题支持 GTK4/libadwaita 主题。

你可以从下面的页面下载 Fluent GTK 主题并获取安装说明。

下载 Fluent GTK 主题

Grvbox

Grvbox 是一款受 Vim 著名配色方案 gruvbox 启发的热门 GTK 主题。以下是其主要特点:

  • 温暖复古的调色板让人想起老式终端界面。
  • 经过精心设计,提供舒适和愉悦的视觉体验。
  • 提供浅色和深色变体,让用户选择其喜好的风格。
  • 与基于 GTK 的应用程序无缝集成,确保一致和统一的外观。
  • 定期更新和社区支持,确保与最新的 GTK 版本兼容。

Gruvbox GTK 主题

Grvbox 主题为 Linux 桌面带来了怀旧的魅力,唤起了熟悉和简约的感觉。其精心选择的颜色和注重细节,使其受到那些欣赏基于 GTK 的应用程序和桌面环境的复古魅力的爱好者的喜爱。

注意:该主题支持 GTK4/libadwaita 主题。

你可以从下面的页面获取 Grvbox 主题的下载和安装说明:

下载 Grvbox 主题

Graphite

Graphite 是适用于基于 GTK 的桌面环境的深色主题。它旨在简约而优雅,非常适合希望拥有干净、无干扰界面的用户。

Graphite 主题基于 Adwaita 主题,并拥有许多相同的功能。但是,Graphite 具有更暗的色彩调色板和更加简约的设计。

Graphite GTK 主题

如果你正在寻找一款既简约又优雅的深色主题,那么 Graphite 主题是一个很好的选择。它易于安装和使用,并与许多桌面环境兼容。

几个月前,我对该主题进行了评估,你可能会对此感兴趣:Graphite 主题概述

注意:该主题支持 GTK4/libadwaita。

你可以使用下面页面上的说明安装此主题。

Graphite GTK 主题

Material

Material 是一款受到 Material for Neovim 和 Graphite 主题(上面有提到)启发的广为人知的 GTK 主题。以下是其主要特点:

  • 清爽现代的美学,采用扁平设计元素和鲜明色彩。
  • 一致且协调的图标设计,符合 Material Design 的指南。
  • 提供浅色和深色变体,让用户自定义视觉体验。
  • 与基于 GTK 的应用程序无缝集成,确保统一的外观和感觉。
  • 定期更新和社区支持,确保与最新的 GTK 版本兼容。

Material GTK 主题

Material 主题将流行的 Material Design 风格带到了 Linux 桌面,提供了视觉上令人愉悦且直观的用户体验。凭借其时尚的设计和与各种 GTK 环境的兼容性,Material 主题受到喜欢现代和和谐界面的用户的欢迎。

注意:该主题支持现代的 GTK4/libadwaita 主题。

你可以从下面的页面下载并安装 Material 主题:

下载 Material 主题

Arc

Arc 主题是 Linux 社区中受欢迎的 GTK 主题,以其流线型和现代的设计而闻名。它提供了干净、简约的外观,与各种桌面环境(特别是 GNOME)相得益彰。以下是 Arc 主题的一些主要特点:

  • 美观的设计,拥有平滑曲线和扁平界面
  • 多种颜色变体,包括 Arc、Arc-Darker 和 Arc-Dark
  • 可更改按钮样式、标题栏布局和窗口边框的选项

Arc 主题将美学和功能性融为一体,成为许多寻求视觉上愉快和一致用户界面的 Linux 用户的首选。

Ubuntu GNOME 中的 Arc Darker 主题

然而,当前版本的主题不支持现代的 GTK4/libadwaita。

你可以从下面的官方仓库中下载 Arc 主题(这是原始 Arc 主题的另一个分支):

下载 Arc 主题

此外,在 Ubuntu 及相关发行版上,你可以使用以下命令进行安装:

sudo apt install arc-theme

Nordic

Nordic 是一款备受赞誉的 GTK 主题,受到北欧地区宁静景色的启发。以下是其主要特点:

  • 细腻而舒缓的调色板让人想起极光和雪景。
  • 浅色和深色元素的和谐组合,提供最佳的对比度和可读性。
  • 高度精心设计的图标完美地补充了整体美学。
  • 跨平台兼容,使用户可以在各种基于 GTK 的环境中享受 Nord 主题。
  • 定期更新和社区支持,确保持续的改进和兼容性。

Nordic 主题

Nordic 主题为 Linux 桌面带来了宁静和优雅的氛围,让用户沉浸在一个视觉上迷人的环境中。其精心选择的颜色和对细节的关注,使其在寻求视觉上愉快和放松的 GTK 主题的 Linux 系统用户中广受欢迎。

它还附带了一个适用于 Firefox 的主题,以获得更好的外观和集成。

注意:该主题支持现代的 GTK4/libadwaita 主题。

你可以从下面的页面下载 Nordic 主题:

下载 Nordic 主题

Adapta

Adapta 是一款备受赞誉的 GTK 主题,以其多功能性和现代设计而闻名。

Adapta 主题增强了 Linux 桌面的时尚和适应性风格,允许用户在保持精致和统一外观的同时个性化他们的界面。它的灵活性和持续发展使其成为那些寻求现代且可定制的 GTK 主题的人们的首选。

然而,这个优秀主题的开发已经停止了多年。你仍然可以从下面的官方页面下载并使用该主题:

下载 Adapta 主题

Equilux

Equilux 是一款适用于基于 GTK+ 的桌面环境的暗色主题。它的设计旨在中性且不分散注意力,非常适合在低光环境下使用或对亮色敏感的人士。

Equilux 主题基于 Materia 主题,并拥有许多相同的功能。然而,Equilux 使用了更柔和的调色板,使其更适合于暗环境。

Equilux 主题

如果你正在寻找一款既中性又不分散注意力的暗色主题,那么 Equilux 主题是一个很好的选择。它易于安装和使用,并且与各种桌面环境兼容。

注意:该主题的开发已经 停止。不会有进一步的更新。

你可以在下面的页面上找到该主题的当前版本:

下载 Equilux 主题

Paper

Paper 是一款广为人知的 GTK 主题,以其简约而优雅的设计而闻名。以下是其主要特点:

  • 干净而扁平的视觉风格,具有微妙的阴影效果。
  • 精心设计的图标提供了一致且精致的外观。
  • 提供多种颜色变体,包括浅色和深色主题。
  • 维护良好且积极开发,确保与最新的 GTK 版本兼容。
  • 支持 GNOME、Xfce 和 Unity 等流行的桌面环境。

GNOME 中的 Paper 主题

Paper 以其极简的风格和注重细节的特点,为用户提供了视觉上愉悦和和谐的桌面体验。其多样的颜色选项和与多种桌面环境的兼容性,使其成为寻求时尚和现代外观的 Linux 爱好者的热门选择。

注意:该主题的开发在 2016 年已结束。不支持现代的 GTK4+。
下载 Paper 主题

关于 Adwaita 的说明

流行的 Adwaita 主题是最好和最稳定的 GTK 主题之一。我之前没有将其列入上述列表的原因是它已经作为默认主题包含在许多发行版中,用户已经在其系统中安装了该主题。

总结

上述 GTK 主题代表了各种风格的不同口味,从现代设计到充满活力和丰富多彩的美学。无论你偏好极简的外观还是视觉上惊艳的界面,都可以找到适合你口味的 GTK 主题。我鼓励你尝试上述主题并搭配各种图标和鼠标主题,以获得更好的体验。

部分图片来源归属于各自的作者。

(题图:MJ/cf5c27f6-ea23-4d9b-a311-168c45d9ea92)


via: https://www.debugpoint.com/best-gtk-themes/

作者:Arindam 选题:lkxed 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

推特创始人说他最大的遗憾是推特成为一家公司

在回答关于“推特是否变成了他所设想的那样”的问题时,推特创始人 Jack Dorsey 说,“最大的问题和我最大的遗憾是它变成了一家公司”,他进一步说,这应该是“一种协议”,推特不应该由国家或其他公司拥有。如果它是一种协议,那么推特的运作就会很像电子邮件,它不受一个中央实体的控制,使用不同电子邮件供应商的人能够相互沟通。

消息来源:路透社
老王点评:这是真正有开放情怀的人的想法,虽然未必是一条成功之路。不过,已经有类似的“协议”出现,也许真的会出现一个这样的去中心化的推特。

RHEL 10 将取消 GTK2 工具包支持,最大绊脚石可能是 GIMP

虽然 GTK2 工具包在 Linux 应用程序中已经使用了很久,但 GTK3 已经推出了十多年,连 GTK4 也已经推出了两年。大多数著名的 Linux 软件已经从 GTK2 移植到 GTK3 或 GTK4,但也有少数例外,包括 GIMP 和它酝酿已久的 GIMP 3.0 版本仍在使用 GTK2。GTK 最初是来自于 GIMP 项目的一个副产品,是 GIMP 本身的底层框架。红帽称,“这个工具包为我们提供了很好的服务,但在现代技术方面,如 Wayland、HiDPI 屏幕、HDR 和其他方面,它开始显示出它已经开始老化。”RHEL 10 计划在 2025 年推出稳定版。

消息来源:Phoronix
老王点评:这应该对大部分使用 GTK 的图形应用没有什么影响,基本上都使用了较新的 GTK 了。但是有趣的是,GIMP 这么多年一直抱着老旧的 GTK2 不升级,反而成为升级换代的最大绊脚石。难怪 GIMP 这么多年还那个样子。

Heroku 宣布取消免费计划

在提供了十多年的服务后,Heroku 本周宣布,它将取消所有的免费服务。Heroku 是一个支持多种编程语言的云平台,允许程序员使用 Java、PHP、Scala 和 Go 等编程语言构建、运行和扩展应用程序。它是最早的云平台之一,其声称被用于开发了 1300 万个应用程序。Heroku 将免费服务的消亡归咎于“滥用”,将于 10 月底开始删除不活跃的账户和超过一年的账户的相关存储,并在 11 月底停止提供免费产品计划,并关闭免费数据服务。

消息来源:Tech Crunch
老王点评:又一个免费服务的消失,但是根本原因还是找不到免费服务的生存价值,或者说,免费服务不能给他们带来足够的潜在利益。

这个简单教程教你如何测试你应用的功能。

 title=

自动化测试用来保证你程序的质量以及让它以预想的运行。单元测试只是检测你算法的某一部分,而并不注重各组件间的适应性。这就是为什么会有功能测试,它有时也称为集成测试。

功能测试简单地与你的用户界面进行交互,无论它是网站还是桌面应用。为了展示功能测试如何工作,我们以测试一个 Gtk+ 应用为例。为了简单起见,这个教程里,我们使用 Gtk+ 2.0 教程的示例。

基础设置

对于每一个功能测试,你通常需要定义一些全局变量,比如 “用户交互时延” 或者 “失败的超时时间”(也就是说,如果在指定的时间内一个事件没有发生,程序就要中断)。

#define TTT_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(f) ((TttFunctionalTestUtilIdleCondition)(f))
#define TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME (125000)
#define TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG (500000)
typedef gboolean (*TttFunctionalTestUtilIdleCondition)(gpointer data);
struct timespec ttt_functional_test_util_default_timeout = {
  20,
  0,
};

现在我们可以实现我们自己的超时函数。这里,为了能够得到期望的延迟,我们采用 usleep 函数。

void
ttt_functional_test_util_reaction_time()
{
  usleep(TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
}

void
ttt_functional_test_util_reaction_time_long()
{
  usleep(TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG);
}

直到获得控制状态,超时函数才会推迟执行。这对于一个异步执行的动作很有帮助,这也是为什么采用这么长的时延。

void
ttt_functional_test_util_idle_condition_and_timeout(
     TttFunctionalTestUtilIdleCondition idle_condition,
     struct timespec *timeout,
     pointer data)
{
  struct timespec start_time, current_time;

  clock_gettime(CLOCK_MONOTONIC,
                &start_time);

  while(TTT_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(idle_condition)(data)){
    ttt_functional_test_util_reaction_time();

    clock_gettime(CLOCK_MONOTONIC,
                  &current_time);

    if(start_time.tv_sec + timeout->tv_sec < current_time.tv_sec){
      break;
    }
  }

  ttt_functional_test_util_reaction_time();
}

与图形化用户界面交互

为了模拟用户交互的操作, Gdk 库 为我们提供了一些需要的函数。要完成我们的工作,我们只需要如下 3 个函数:

  • gdk_display_warp_pointer()
  • gdk_test_simulate_button()
  • gdk_test_simulate_key()

举个例子,为了测试按钮点击,我们可以这么做:

gboolean
ttt_functional_test_util_button_click(GtkButton *button)
{
  GtkWidget *widget;

  GdkWindow *window;

  gint x, y;
  gint origin_x, origin_y;

  if(button == NULL ||
     !GTK_IS_BUTTON(button)){
    return(FALSE);
  }

  widget = button;

  if(!GTK_WIDGET_REALIZED(widget)){
    ttt_functional_test_util_reaction_time_long();
  }

  /* retrieve window and pointer position */
  gdk_threads_enter();

  window = gtk_widget_get_window(widget);

  x = widget->allocation.x + widget->allocation.width / 2.0;
  y = widget->allocation.y + widget->allocation.height / 2.0;

  gdk_window_get_origin(window, &origin_x, &origin_y);

  gdk_display_warp_pointer(gtk_widget_get_display(widget),
                           gtk_widget_get_screen(widget),
                           origin_x + x, origin_y + y);

  gdk_threads_leave();

  /* click the button */
  ttt_functional_test_util_reaction_time();

  gdk_test_simulate_button(window,
                           x,
                           y,
                           1,
                           GDK_BUTTON1_MASK,
                           GDK_BUTTON_PRESS);

  ttt_functional_test_util_reaction_time();

  gdk_test_simulate_button(window,
                           x,
                           y,
                           1,
                           GDK_BUTTON1_MASK,
                           GDK_BUTTON_RELEASE);

  ttt_functional_test_util_reaction_time();

  ttt_functional_test_util_reaction_time_long();

  return(TRUE);
}

我们想要保证按钮处于激活状态,因此我们提供一个空闲条件函数:

gboolean
ttt_functional_test_util_idle_test_toggle_active(
     GtkToggleButton **toggle_button)
{
  gboolean do_idle;

  do_idle = TRUE;

  gdk_threads_enter();

  if(*toggle_button != NULL &&
     GTK_IS_TOGGLE_BUTTON(*toggle_button) &&
     gtk_toggle_button_get_active(*toggle_button)){
    do_idle = FALSE;
  }

  gdk_threads_leave();

  return(do_idle);
}

测试场景

因为这个 Tictactoe 程序非常简单,我们只需要确保点击了一个 GtkToggleButton 按钮即可。一旦该按钮肯定进入了激活状态,功能测试就可以执行。为了点击按钮,我们使用上面提到的很方便的 util 函数。

如图所示,我们假设,填满第一行,玩家 A 就赢,因为玩家 B 没有注意,只填充了第二行。

GtkWindow *window;
Tictactoe *ttt;

void*
ttt_functional_test_gtk_main(void *)
{
  gtk_main();

  pthread_exit(NULL);
}

void
ttt_functional_test_dumb_player_b()
{
  GtkButton *buttons[3][3];

  guint i;

  /* to avoid race-conditions copy the buttons */
  gdk_threads_enter();

  memcpy(buttons, ttt->buttons, 9 * sizeof(GtkButton *));

  gdk_threads_leave();

  /* TEST 1 - the dumb player B */
  for(i = 0; i < 3; i++){
    /* assert player A clicks the button successfully */
    if(!ttt_functional_test_util_button_click(buttons[0][i])){
      exit(-1);
    }

    functional_test_util_idle_condition_and_timeout(
         ttt_functional_test_util_idle_test_toggle_active,
         ttt_functional_test_util_default_timeout,
         &buttons[0][i]);

    /* assert player B clicks the button successfully */
    if(!ttt_functional_test_util_button_click(buttons[1][i])){
      exit(-1);
    }

    functional_test_util_idle_condition_and_timeout(
         ttt_functional_test_util_idle_test_toggle_active,
         ttt_functional_test_util_default_timeout,
         &buttons[1][i]);
  }
}

int
main(int argc, char **argv)
{
  pthread_t thread;

  gtk_init(&argc, &argv);

  /* start the tictactoe application */
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  ttt = tictactoe_new();
  gtk_container_add(window, ttt);

  gtk_widget_show_all(window);

  /* start the Gtk+ dispatcher */
  pthread_create(&thread, NULL,
                 ttt_functional_test_gtk_main, NULL);

  /* launch test routines */
  ttt_functional_test_dumb_player_b();

  /* terminate the application */
  gdk_threads_enter();

  gtk_main_quit();

  gdk_threads_leave();

  return(0);
}

(题图:opensource.com)


作者简介:

Joël Krähemann - 精通 C 语言编程的自由软件爱好者。不管代码多复杂,它也是一点点写成的。作为高级的 Gtk+ 程序开发者,我知道多线程编程有多大的挑战性,有了多线程编程,我们就有了未来需求的良好基础。

摘自: https://opensource.com/article/17/7/functional-testing

作者:Joël Krähemann 译者:sugarfillet 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

多数桌面版 Linux 都支持主题。GUI(LCTT 译注:图形用户界面)独有的外观或者“风格”叫做主题。用户可以改变主题让桌面看起来与众不同。通常,用户也会更改图标,然而,主题和图标包是两个独立的实体。很多人想制作他们自己的主题,因此这是一篇关于 GTK 主题的制作以及各种制作时所必需的信息的文章。

注意: 这篇文章着重讨论 GTK3,但会稍微谈一下 GTK2、Metacity 等。本文不会讨论光标和图标。

基本概念

GIMP 工具包(简称 GTK)是一个用来在多种系统上(因此造就了 GTK 的跨平台)创建图形用户界面的构件工具包。GTK(http://www.gtk.org/)通常被误认为代表“GNOME 工具包”,但实际上它代表“GIMP 工具包”,因为最初创造它是为了给 GIMP 设计用户界面。GTK 是一个用 C 语言编写的面向对象工具包(GTK 本身不是一种语言)。GTK 遵循 LGPL 协议完全开源。GTK 是一个广泛使用的图形用户界面工具包,它含有很多用于 GTK 的工具。

为 GTK 制作的主题无法用在基于 Qt 的应用上。QT 应用需要使用 Qt 主题。

主题使用层叠样式表(CSS)来生成主题样式。这里的 CSS 和网站开发者在网页上使用的相同。然而不是引用 HTML 标签,而是引用 GTK 构件的专用标签。学习 CSS 对主题开发者来说很重要。

主题存放位置

主题可能会存储在 ~/.themes 或者 /usr/share/themes 文件夹中。存放在 ~/.themes 文件夹下的主题只有此 home 文件夹的所有者可以使用。而存放在 /usr/share/themes 文件夹下的全局主题可供所有用户使用。当执行 GTK 程序时,它会按照某种确定的顺序检查可用主题文件的列表。如果没有找到主题文件,它会尝试检查列表中的下一个文件。下述文字是 GTK3 程序检查时的顺序列表。

  1. $XDG_CONFIG_HOME/gtk-3.0/gtk.css (另一写法 ~/.config/gtk-3.0/gtk.css
  2. ~/.themes/NAME/gtk-3.0/gtk.css
  3. $datadir/share/themes/NAME/gtk-3.0/gtk.css (另一写法 /usr/share/themes/name/gtk-3.0/gtk.css

注意: “NAME”代表当前主题名称。

如果有两个主题名字相同,那么存放在用户 home 文件夹(~/.themes)里的主题会被优先使用。开发者可以利用这个 GTK 主题查找算法的优势来测试存放在本地 home 文件夹的主题。

主题引擎

主题引擎是软件的一部分,用来改变图形用户界面构件的外观。引擎通过解析主题文件来了解应当绘制多少种构件。有些引擎随着主题被开发出来。每种引擎都有优点和缺点,还有些引擎添加了某些特性和特色。

从默认软件源中可以获取很多主题引擎。Debian 系的 Linux 发行版可以执行 apt-get install gtk2-engines-murrine gtk2-engines-pixbuf gtk3-engines-unico 命令来安装三种不同的引擎。很多引擎同时支持 GTK2 和 GTK3。以下述列表为例:

  • gtk2-engines-aurora - Aurora GTK2 引擎
  • gtk2-engines-pixbuf - Pixbuf GTK2 引擎
  • gtk3-engines-oxygen - 将 Oxygen 组件风格移植 GTK 的引擎
  • gtk3-engines-unico - Unico GTK3 引擎
  • gtk3-engines-xfce - 用于 Xfce 的 GTK3 引擎

创作 GTK3 主题

开发者创作 GTK3 主题时,或者从空文件着手,或者将已有的主题作为模板。从现存主题着手可能会对新手有帮助。比如,开发者可以把主题复制到用户的 home 文件夹,然后编辑这些文件。

GTK3 主题的通用格式是新建一个以主题名字命名的文件夹。然后新建一个名为 gtk-3.0 的子目录,在子目录里新建一个名为 gtk.css 的文件。在文件 gtk.css 里,使用 CSS 代码写出主题的外观。为了测试可以将主题移动到 ~/.theme 里。使用新主题并在必要时进行改进。如果有需求,开发者可以添加额外的组件,使主题支持 GTK2、Openbox、Metacity、Unity 等桌面环境。

为了阐明如何创造主题,我们会学习 Ambiance 主题,通常可以在 /usr/share/themes/Ambiance 找到它。此目录包含下面列出的子目录以及一个名为 index.theme 的文件。

  • gtk-2.0
  • gtk-3.0
  • metacity-1
  • unity

index.theme 含有元数据(比如主题的名字)和一些重要的配置(比如按钮的布局)。下面是 Ambiance 主题的 index.theme 文件内容。

[Desktop Entry]
Type=X-GNOME-Metatheme
Name=Ambiance
Comment=Ubuntu Ambiance theme
Encoding=UTF-8

[X-GNOME-Metatheme]
GtkTheme=Ambiance
MetacityTheme=Ambiance
IconTheme=ubuntu-mono-dark
CursorTheme=DMZ-White
ButtonLayout=close,minimize,maximize:
X-Ubuntu-UseOverlayScrollbars=true

gtk-2.0 目录包括支持 GTK2 的文件,比如文件 gtkrc 和文件夹 apps。文件夹 apps 包括具体程序的 GTK 配置。文件 gtkrc 是 GTK2 部分的主要 CSS 文件。下面是 /usr/share/themes/Ambiance/gtk-2.0/apps/nautilus.rc 文件的内容。

# ==============================================================================
# NAUTILUS SPECIFIC SETTINGS
# ==============================================================================

style "nautilus_info_pane" {
   bg[NORMAL] = @bg_color
}

widget_class "*Nautilus*<GtkNotebook>*<GtkEventBox>" style "nautilus_info_pane"
widget_class "*Nautilus*<GtkButton>" style "notebook_button"
widget_class "*Nautilus*<GtkButton>*<GtkLabel>" style "notebook_button"

gtk-3.0 目录里是 GTK3 的文件。GTK3 使用 gtk.css 取代了 gtkrc 作为主文件。对于 Ambiance 主题,此文件有一行 @import url("gtk-main.css");settings.ini 包含重要的主题级配置。GTK3 主题的 apps 目录和 GTK2 有同样的作用。assets 目录里有单选按钮、多选框等的图像文件。下面是 /usr/share/themes/Ambiance/gtk-3.0/gtk-main.css 的内容。

/*default color scheme */
@define-color bg_color #f2f1f0;
@define-color fg_color #4c4c4c;
@define-color base_color #ffffff;
@define-color text_color #3C3C3C;
@define-color selected_bg_color #f07746;
@define-color selected_fg_color #ffffff;
@define-color tooltip_bg_color #000000;
@define-color tooltip_fg_color #ffffff;

/* misc colors used by gtk+
 *
 * Gtk doesn't currently expand color variables for style properties. Thus,
 * gtk-widgets.css uses literal color names, but includes a comment containing
 * the name of the variable. Please remember to change values there as well
 * when changing one of the variables below.
 */
@define-color info_fg_color rgb (181, 171, 156);
@define-color info_bg_color rgb (252, 252, 189);
@define-color warning_fg_color rgb (173, 120, 41);
@define-color warning_bg_color rgb (250, 173, 61);
@define-color question_fg_color rgb (97, 122, 214);
@define-color question_bg_color rgb (138, 173, 212);
@define-color error_fg_color rgb (235, 235, 235);
@define-color error_bg_color rgb (223, 56, 44);
@define-color link_color @selected_bg_color;
@define-color success_color #4e9a06;
@define-color error_color #df382c;

/* theme common colors */
@define-color button_bg_color shade (@bg_color, 1.02); /*shade (#cdcdcd, 1.08);*/
@define-color notebook_button_bg_color shade (@bg_color, 1.02);
@define-color button_insensitive_bg_color mix (@button_bg_color, @bg_color, 0.6);
@define-color dark_bg_color #3c3b37;
@define-color dark_fg_color #dfdbd2;

@define-color backdrop_fg_color mix (@bg_color, @fg_color, 0.8);
@define-color backdrop_text_color mix (@base_color, @text_color, 0.8);
@define-color backdrop_dark_fg_color mix (@dark_bg_color, @dark_fg_color, 0.75);
/*@define-color backdrop_dark_bg_color mix (@dark_bg_color, @dark_fg_color, 0.75);*/
@define-color backdrop_selected_bg_color shade (@bg_color, 0.92);
@define-color backdrop_selected_fg_color @fg_color;

@define-color focus_color alpha (@selected_bg_color, 0.5);
@define-color focus_bg_color alpha (@selected_bg_color, 0.1);

@define-color shadow_color alpha(black, 0.5);

@define-color osd_fg_color #eeeeec;
@define-color osd_bg_color alpha(#202526, 0.7);
@define-color osd_border_color alpha(black, 0.7);

@import url("gtk-widgets-borders.css");
@import url("gtk-widgets-assets.css");
@import url("gtk-widgets.css");
@import url("apps/geary.css");
@import url("apps/unity.css");
@import url("apps/baobab.css");
@import url("apps/gedit.css");
@import url("apps/nautilus.css");
@import url("apps/gnome-panel.css");
@import url("apps/gnome-terminal.css");
@import url("apps/gnome-system-log.css");
@import url("apps/unity-greeter.css");
@import url("apps/glade.css");
@import url("apps/california.css");
@import url("apps/software-center.css");
@import url("public-colors.css");

metacity-1 文件夹含有 Metacity 窗口管理器按钮(比如“关闭窗口”按钮)的图像文件。此目录还有一个名为 metacity-theme-1.xml 的文件,包括了主题的元数据(像开发者的名字)和主题设计。然而,主题的 Metacity 部分使用 XML 文件而不是 CSS 文件。

unity 文件夹含有 Unity 按钮使用的 SVG 文件。除了 SVG 文件,这里没有其他的文件。

一些主题可能也会包含其他的目录。比如, Clearlooks-Phenix 主题有名为 openbox-3xfwm4 的文件夹。openbox-3 文件夹仅有一个 themerc 文件,声明了主题配置和外观(下面有文件示例)。xfwm4 目录含有几个 xpm 文件、几个 png 图像文件(在 png 文件夹里)、一个 README 文件,还有个包含了主题配置的 themerc 文件(就像下面看到的那样)。

/usr/share/themes/Clearlooks-Phenix/xfwm4/themerc

# Clearlooks XFWM4 by Casey Kirsle

show_app_icon=true
active_text_color=#FFFFFF
inactive_text_color=#939393
title_shadow_active=frame
title_shadow_inactive=false
button_layout=O|HMC
button_offset=2
button_spacing=2
full_width_title=true
maximized_offset=0
title_vertical_offset_active=1
title_vertical_offset_inactive=1

/usr/share/themes/Clearlooks-Phenix/openbox-3/themerc

!# Clearlooks-Evolving
!# Clearlooks as it evolves in gnome-git...
!# Last updated 09/03/10

# Fonts
# these are really halos, but who cares?

*.font: shadow=n
window.active.label.text.font:shadow=y:shadowtint=30:shadowoffset=1
window.inactive.label.text.font:shadow=y:shadowtint=00:shadowoffset=0
menu.items.font:shadow=y:shadowtint=0:shadowoffset=1

!# general stuff

border.width: 1
padding.width: 3
padding.height: 2
window.handle.width: 3
window.client.padding.width: 0
menu.overlap: 2
*.justify: center

!# lets set our damn shadows here, eh?

*.bg.highlight: 50
*.bg.shadow:  05

window.active.title.bg.highlight: 35
window.active.title.bg.shadow:  05

window.inactive.title.bg.highlight: 30
window.inactive.title.bg.shadow:  05

window.*.grip.bg.highlight: 50
window.*.grip.bg.shadow:  30

window.*.handle.bg.highlight: 50
window.*.handle.bg.shadow:  30

!# Menu settings

menu.border.color: #aaaaaa
menu.border.width: 1

menu.title.bg: solid flat
menu.title.bg.color: #E6E7E6
menu.title.text.color: #111111

menu.items.bg: Flat Solid
menu.items.bg.color: #ffffff
menu.items.text.color: #111111
menu.items.disabled.text.color: #aaaaaa

menu.items.active.bg: Flat Gradient splitvertical border

menu.items.active.bg.color: #97b8e2
menu.items.active.bg.color.splitTo: #a8c5e9

menu.items.active.bg.colorTo: #91b3de
menu.items.active.bg.colorTo.splitTo: #80a7d6
menu.items.active.bg.border.color: #4b6e99
menu.items.active.text.color: #ffffff

menu.separator.width: 1
menu.separator.padding.width: 0
menu.separator.padding.height: 3
menu.separator.color: #aaaaaa

!# set handles here and only the once?

window.*.handle.bg: Raised solid
window.*.handle.bg.color: #eaebec

window.*.grip.bg: Raised solid
window.*.grip.bg.color: #eaebec

!# Active

window.*.border.color: #585a5d

window.active.title.separator.color: #4e76a8

*.title.bg: Raised Gradient splitvertical
*.title.bg.color: #8CB0DC
*.title.bg.color.splitTo: #99BAE3
*.title.bg.colorTo: #86ABD9
*.title.bg.colorTo.splitTo: #7AA1D1

window.active.label.bg: Parentrelative
window.active.label.text.color: #ffffff

window.active.button.*.bg: Flat Gradient splitvertical Border

window.active.button.*.bg.color: #92B4DF
window.active.button.*.bg.color.splitTo: #B0CAEB
window.active.button.*.bg.colorTo: #86ABD9
window.active.button.*.bg.colorTo.splitTo: #769FD0

window.active.button.*.bg.border.color: #49678B
window.active.button.*.image.color: #F4F5F6

window.active.button.hover.bg.color: #b5d3ef
window.active.button.hover.bg.color.splitTo: #b5d3ef
window.active.button.hover.bg.colorTo: #9cbae7
window.active.button.hover.bg.colorTo.splitTo: #8caede
window.active.button.hover.bg.border.color: #4A658C
window.active.button.hover.image.color: #ffffff

window.active.button.pressed.bg: Flat solid Border
window.active.button.pressed.bg.color: #7aa1d2

window.active.button.hover.bg.border.color: #4A658C

!# inactive

!#window.inactive.border.color: #7e8285
window.inactive.title.separator.color: #96999d

window.inactive.title.bg: Raised Gradient splitvertical
window.inactive.title.bg.color: #E3E2E0
window.inactive.title.bg.color.splitTo: #EBEAE9
window.inactive.title.bg.colorTo: #DEDCDA
window.inactive.title.bg.colorTo.splitTo: #D5D3D1

window.inactive.label.bg: Parentrelative
window.inactive.label.text.color: #70747d

window.inactive.button.*.bg: Flat Gradient splitVertical Border
window.inactive.button.*.bg.color: #ffffff
window.inactive.button.*.bg.color.splitto: #ffffff
window.inactive.button.*.bg.colorTo: #F9F8F8
window.inactive.button.*.bg.colorTo.splitto: #E9E7E6
window.inactive.button.*.bg.border.color: #928F8B
window.inactive.button.*.image.color: #6D6C6C

!# osd (pop ups and what not, dock?)

osd.border.width: 1
osd.border.color:  #aaaaaa

osd.bg: flat border gradient splitvertical
osd.bg.color: #F0EFEE
osd.bg.color.splitto: #f5f5f4
osd.bg.colorTo: #EAEBEC
osd.bg.colorTo.splitto: #E7E5E4

osd.bg.border.color: #ffffff

osd.active.label.bg: parentrelative
osd.active.label.bg.color: #efefef
osd.active.label.bg.border.color: #9c9e9c
osd.active.label.text.color: #444

osd.inactive.label.bg: parentrelative
osd.inactive.label.text.color: #70747d

!# yeah whatever, this is fine anyhoo?
osd.hilight.bg: flat vertical gradient
osd.hilight.bg.color: #9ebde5
osd.hilight.bg.colorTo: #749dcf
osd.unhilight.bg: flat vertical gradient
osd.unhilight.bg.color: #BABDB6
osd.unhilight.bg.colorTo: #efefef

测试主题

在创作主题时,测试主题并且微调代码对得到想要的样子是很有帮助的。有相当的开发者想要用到“主题预览器”这样的工具。幸运的是,已经有了。

  • GTK+ Change Theme - 这个程序可以更改 GTK 主题,开发者可以用它预览主题。这个程序由一个含有很多构件的窗口组成,因此可以为主题提供一个完整的预览。要安装它,只需输入命令 apt-get install gtk-chtheme
  • GTK Theme Switch - 用户可以使用它轻松地更换用户主题。测试主题时确保打开了一些应用,方便预览效果。要安装它,只需输入命令 apt-get install gtk-theme-switch,然后在终端敲出 gtk-theme-switch2 即可运行。
  • LXappearance - 它可以更换主题,图标以及字体。
  • PyWF - 这是基于 Python 开发的一个 The Widget Factory 的替代品。可以在 http://gtk-apps.org/content/show.php/PyTWF?content=102024 获取 PyWF。
  • The Widget Factory - 这是一个古老的 GTK 预览器。要安装它,只需输入命令 apt-get install thewidgetfactory,然后在终端敲出 twf 即可运行。

主题下载

延伸阅读


via: http://www.linux.org/threads/installing-obtaining-and-making-gtk-themes.8463/

作者:DevynCJohnson 译者:fuowang 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

现在我居住的地方正值炎夏,但是相比较我正在写的文章将会引来的暴风雨,还是温和了不少:是的!我正在写关于Windows GTK主题的文章。

好吧,认错时间:我,个人并没有坐在桌前想着:“我的Ubuntu桌面真的需要...需要看起来像另一个操作系统一样!”。当我确认模仿另一个操作系统的外观的行为很不对我的胃口时,但世界上有那么多的用户,没准有些用户——可能也包括你——会对这有兴趣呢!

这件事本身也并没有任何问题。虽然这会引来很多狂热爱好者或者喷子,但是这提供的种灵活性也可以更好地为改进者,自定义者和主题制作者服务,因此我说:“何乐而不为呢?”

Winodws 8 的现代UI

“Windows XP的卡通蓝边界和过度透明的Aero Glass主题早就过时了”

Windows作为世界上最被广泛运用的操作系统(吁~ 一片嘘声),那么GTK的高山与Metacity主题再邀请下模仿Windows的外观一点也不让人惊奇。

但是Windows XP年长的卡通蓝边界以及过度透明的Aero Glass已经过时,当前的热门话题应该属于五彩缤纷的现代UI。

Windows 8引入了一种平整,实心而且转折角度明显的主题特色,这位微软桌面操作系统带来了新鲜的感觉。按照在微软其他产品中的统一的设计脉络),比如Windows Phone 8以及Xbox One为用户提供了不少的相似点。

Windows 8 GTK主题与其他主题相比,更体现了它的设计感觉。我承认我并没有常用Windows 8从而可以对其设计方方面面十分了解,但是这个主题已经包含了它大多数的表面设计,如果通过这个评分的话,这个主题可以算成功的了。

在这同时,扁平化主题并不由微软专属,类似Iris Light, which we shared recently等主题都在Linux中十分流行。

下载Linux上的Windows 8主题

从GNOME-Look上可以获取文件,将他们放在'/usr/share/theme'文件夹,然后用类似Unity Tweak的应用启用配置。


via: http://www.omgubuntu.co.uk/2014/02/windows-8-metro-gtk-theme

译者:ThomazL 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出