[译文] 如何开始一个真正的 GTK 项目(第四部分:图标和桌面文件)

原文地址:Advanced GTK Techniques。


这篇教程中你将学会:

  • 为你的程序添加一个图标;
  • 将程序添加到应用菜单中。

这篇文章是《如何开始一个真正的 GTK 项目》的一部分,如果你不想回看之前的章节,可以直接下载教学示例程序 app-skeleton2。你也可以从头开始。

相信大多数熟悉终端操作的用户对于历久弥新的 ./configuremakemake install 指令也倍感亲切。但是,Linux 桌面终究在发展,包管理器也蒸蒸日上,现在的普通用户希望的是能用一个包安装程序,然后就能在菜单里找到它。Makefile.am 可能会将我们的可执行文件安装到 /usr/local/bin,但我们不能要求用户每次都打开终端去运行它,我们需要制作一个桌面文件,让程序入驻到菜单中,变得触手可及。


向程序添加一个图标

app-skeleton2 拷贝一份至 app-skeleton3,或者直接重命名(如果你喜欢的话,你也可以顺便修改下 AC_INIT 宏中的版本号)。首先我们需要从 GNOME 图标中找一个合适的图片。这次我们依然偷个懒 —— 从 GNOME 的 git 库中下载一个具备全套尺寸的现成图标。在 app-skeleton3 目录中运行指令:

for size in 16 22 24 32 48; do
    mkdir -p pixmaps/${size}x${size}/apps
    wget -O pixmaps/${size}x${size}/apps/app-skeleton.png \
      http://git.gnome.org/browse/gnome-icon-theme/plain/gnome/${size}x${size}/status/weather-showers-scattered.png
done

这是我们刚刚下载好的图标,有五种大小:
weather-showers-scattered
weather-showers-scattered

我们使用这样一个特别的目录结构是有一定原因的,在 Free Desktop 的 Icon Theme Specification 和 Icon Naming Specification 中有相关讲解。

新的 pixmaps 目录也需要一个 Makefile.am 文件。我们在这个 Makefile.am 文件中写入以下内容:

# app-skeleton3/pixmaps/Makefile.am
iconsdir = $(datadir)/icons/hicolor

nobase_dist_icons_DATA = \
    16x16/apps/app-skeleton.png \
    22x22/apps/app-skeleton.png \
    24x24/apps/app-skeleton.png \
    32x32/apps/app-skeleton.png \
    48x48/apps/app-skeleton.png

gtk_update_icon_cache = gtk-update-icon-cache -f -t $(iconsdir)

install-data-hook: update-icon-cache
uninstall-hook: update-icon-cache
update-icon-cache:
    @-if test -z "$(DESTDIR)"; then \
        echo "Updating GTK icon cache."; \
        $(gtk_update_icon_cache); \
    else \
        echo "*** Icon cache not updated. After (un)install, run this:"; \
        echo "*** $(gtk_update_icon_cache)"; \
    fi

Automake 变量 nobase_dist_icons_DATA 包含四部分,前缀 nobase 表示文件将保持现有目录结构被安装在目标目录中。另一个前缀,dist,表示这些文件将在你输入 make dist 时被一同打包(默认设置下数据文件不会被打包)。

第三部分,icons,其作用类似于 bin_PROGRAMS 中的 bin:它告诉了 Autotools 这些文件的安装位置。不同之处在于 bin 是系统预定义变量,而 icons 则不是。Automake 会将这些文件安装到 icondir 变量指定的位置。至于变量中的目录名为什么叫作 hicolor 可以参阅文章 Icon Theme Specification。

最后,DATA 告诉 Automake 这些是数据文件,它们不需要被编译。

文件接下来的部分调用了 gtk-update-icon-cache 的功能,即使程序还未真正安装。这一步很重要,它会将新的图标录入图标主题中。test 中的内容看起来可能有些奇怪:检测 DESTDIR 是否为空意味着会确认我们是否真的要将程序安装到系统中,或者只是做一个 stage install(非全局安装)。如果是第二种情形,图标文件就不会被安装到图标主题目录中,所以更新图标缓存也就没什么意义了。这种情况下,Makefile 会提醒用户在程序真正安装后手动更新图标缓存。

万事俱备,只欠东风。我们已经做好了一切准备,现在只需要把图标嵌入到程序中即可(也就是放到程序窗口的左上角,或者在切换应用时显示)。在此之前我们已经将图标装入图标主题中,所以将其导入程序的工作也就简单许多。将下面这句话添加到 hello-world.cmain() 函数中,例如可插入到第 47 行:

// app-skeleton3/src/hello-world.c
gtk_window_set_icon_name (GTK_WINDOW (window), "app-skeleton");

当图标进入图标主题后,它就可以直接通过名称调用(记住,你必须执行 make install 后才能看到最终的效果)。

桌面文件

现在我们创建桌面文件。在 app-skeleton3 目录下创建一个名为 app-skeleton.desktop 的文件,并输入:

[Desktop Entry]
Version=1.0
Type=Application
Name=App Skeleton
Exec=app-skeleton
Comment=A sample application from the Advanced GTK+ Techniques tutorial
Icon=app-skeleton
Terminal=false
Categories=Utility;Viewer;GTK;

简单地说,Name 是程序显示在菜单中的名称。Icon 是程序在菜单中使用的图标的名称,Commet 是鼠标悬停在程序上时显示的提示。Terminal=false 表示桌面环境不需要从终端中启动该程序。Categories 表示程序在菜单中所属的分类(一些桌面环境的应用菜单没有分类概念,比如 GNOME)。

有关桌面环境中所有分类的类别名及其解释的信息可以在 Free Desktop 的规范中找到,这些规范说明有 Desktop Entry Specification 和 Desktop Menu Specification。

最后,我们更新项目根目录下的 Makefile.am

# app-skeleton3/Makefile.am
SUBDIRS = pixmaps src

desktopdir = $(datadir)/applications
dist_desktop_DATA = app-skeleton.desktop

我们将 pixmaps 添加到 SUBDIRS 中,然后告诉 Automake 把桌面文件安装到可以被桌面环境找到的地方。

最后,我们将 pixmaps/Makefile 添加到 configure.acAC_CONFIG_FILES 宏内。一切就绪,我们可以尝试 makemake install,不出意外的话,一个新的条目就会出现在你的应用菜单中。

但是如果用户使用其它语言又该怎么办呢?他们可能理解不了程序名,也看不懂桌面文件的描述。如何解决这个问题将是我们下一章节的工作。


文章许可协议:Attribution-NonCommercial-ShareAlike 3.0 Unported

你可能感兴趣的:([译文] 如何开始一个真正的 GTK 项目(第四部分:图标和桌面文件))