原文地址:Advanced GTK Techniques。
这篇教程中你将学会:
- 为你的程序添加一个图标;
- 将程序添加到应用菜单中。
这篇文章是《如何开始一个真正的 GTK 项目》的一部分,如果你不想回看之前的章节,可以直接下载教学示例程序
app-skeleton2
。你也可以从头开始。
相信大多数熟悉终端操作的用户对于历久弥新的 ./configure
、make
和 make 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
这是我们刚刚下载好的图标,有五种大小:
我们使用这样一个特别的目录结构是有一定原因的,在 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.c
的 main()
函数中,例如可插入到第 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.ac
的 AC_CONFIG_FILES
宏内。一切就绪,我们可以尝试 make
和 make install
,不出意外的话,一个新的条目就会出现在你的应用菜单中。
但是如果用户使用其它语言又该怎么办呢?他们可能理解不了程序名,也看不懂桌面文件的描述。如何解决这个问题将是我们下一章节的工作。
文章许可协议:Attribution-NonCommercial-ShareAlike 3.0 Unported