[译文] 如何开始一个真正的 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 SpecificationIcon 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 SpecificationDesktop 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容