原文地址:Advanced GTK Techniques退客。
這篇教程中你將學(xué)會(huì):
- 為你的程序添加一個(gè)圖標(biāo);
- 將程序添加到應(yīng)用菜單中蚌父。
這篇文章是《如何開始一個(gè)真正的 GTK 項(xiàng)目》的一部分嗦篱,如果你不想回看之前的章節(jié)肠仪,可以直接下載教學(xué)示例程序
app-skeleton2
。你也可以從頭開始奋刽。
相信大多數(shù)熟悉終端操作的用戶對(duì)于歷久彌新的 ./configure
瓦侮、make
和 make install
指令也倍感親切。但是佣谐,Linux 桌面終究在發(fā)展肚吏,包管理器也蒸蒸日上,現(xiàn)在的普通用戶希望的是能用一個(gè)包安裝程序狭魂,然后就能在菜單里找到它罚攀。Makefile.am
可能會(huì)將我們的可執(zhí)行文件安裝到 /usr/local/bin
,但我們不能要求用戶每次都打開終端去運(yùn)行它雌澄,我們需要制作一個(gè)桌面文件坞生,讓程序入駐到菜單中,變得觸手可及掷伙。
向程序添加一個(gè)圖標(biāo)
將 app-skeleton2
拷貝一份至 app-skeleton3
是己,或者直接重命名(如果你喜歡的話,你也可以順便修改下 AC_INIT
宏中的版本號(hào))任柜。首先我們需要從 GNOME 圖標(biāo)中找一個(gè)合適的圖片卒废。這次我們依然偷個(gè)懶 —— 從 GNOME 的 git 庫中下載一個(gè)具備全套尺寸的現(xiàn)成圖標(biāo)。在 app-skeleton3
目錄中運(yùn)行指令:
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
這是我們剛剛下載好的圖標(biāo)宙地,有五種大兴と稀:我們使用這樣一個(gè)特別的目錄結(jié)構(gòu)是有一定原因的,在 Free Desktop 的 Icon Theme Specification 和 Icon Naming Specification 中有相關(guān)講解宅粥。
新的 pixmaps
目錄也需要一個(gè) Makefile.am
文件参袱。我們?cè)谶@個(gè) Makefile.am
文件中寫入以下內(nèi)容:
# 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
表示文件將保持現(xiàn)有目錄結(jié)構(gòu)被安裝在目標(biāo)目錄中秽梅。另一個(gè)前綴抹蚀,dist
,表示這些文件將在你輸入 make dist
時(shí)被一同打包(默認(rèn)設(shè)置下數(shù)據(jù)文件不會(huì)被打包)企垦。
第三部分环壤,icons
,其作用類似于 bin_PROGRAMS
中的 bin
:它告訴了 Autotools
這些文件的安裝位置钞诡。不同之處在于 bin
是系統(tǒng)預(yù)定義變量郑现,而 icons
則不是湃崩。Automake
會(huì)將這些文件安裝到 icondir
變量指定的位置。至于變量中的目錄名為什么叫作 hicolor
可以參閱文章 Icon Theme Specification接箫。
最后攒读,DATA
告訴 Automake
這些是數(shù)據(jù)文件,它們不需要被編譯辛友。
文件接下來的部分調(diào)用了 gtk-update-icon-cache
的功能整陌,即使程序還未真正安裝。這一步很重要瞎领,它會(huì)將新的圖標(biāo)錄入圖標(biāo)主題中泌辫。test
中的內(nèi)容看起來可能有些奇怪:檢測 DESTDIR
是否為空意味著會(huì)確認(rèn)我們是否真的要將程序安裝到系統(tǒng)中,或者只是做一個(gè) stage install
(非全局安裝)九默。如果是第二種情形震放,圖標(biāo)文件就不會(huì)被安裝到圖標(biāo)主題目錄中,所以更新圖標(biāo)緩存也就沒什么意義了驼修。這種情況下殿遂,Makefile
會(huì)提醒用戶在程序真正安裝后手動(dòng)更新圖標(biāo)緩存。
萬事俱備乙各,只欠東風(fēng)墨礁。我們已經(jīng)做好了一切準(zhǔn)備,現(xiàn)在只需要把圖標(biāo)嵌入到程序中即可(也就是放到程序窗口的左上角耳峦,或者在切換應(yīng)用時(shí)顯示)恩静。在此之前我們已經(jīng)將圖標(biāo)裝入圖標(biāo)主題中,所以將其導(dǎo)入程序的工作也就簡單許多蹲坷。將下面這句話添加到 hello-world.c
的 main()
函數(shù)中驶乾,例如可插入到第 47 行:
// app-skeleton3/src/hello-world.c
gtk_window_set_icon_name (GTK_WINDOW (window), "app-skeleton");
當(dāng)圖標(biāo)進(jìn)入圖標(biāo)主題后,它就可以直接通過名稱調(diào)用(記住循签,你必須執(zhí)行 make install
后才能看到最終的效果)级乐。
桌面文件
現(xiàn)在我們創(chuàng)建桌面文件。在 app-skeleton3
目錄下創(chuàng)建一個(gè)名為 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
是程序在菜單中使用的圖標(biāo)的名稱乞旦,Commet
是鼠標(biāo)懸停在程序上時(shí)顯示的提示贼穆。Terminal=false
表示桌面環(huán)境不需要從終端中啟動(dòng)該程序。Categories
表示程序在菜單中所屬的分類(一些桌面環(huán)境的應(yīng)用菜單沒有分類概念杆查,比如 GNOME)扮惦。
有關(guān)桌面環(huán)境中所有分類的類別名及其解釋的信息可以在 Free Desktop 的規(guī)范中找到,這些規(guī)范說明有 Desktop Entry Specification 和 Desktop Menu Specification亲桦。
最后崖蜜,我們更新項(xiàng)目根目錄下的 Makefile.am
:
# app-skeleton3/Makefile.am
SUBDIRS = pixmaps src
desktopdir = $(datadir)/applications
dist_desktop_DATA = app-skeleton.desktop
我們將 pixmaps
添加到 SUBDIRS
中,然后告訴 Automake
把桌面文件安裝到可以被桌面環(huán)境找到的地方客峭。
最后豫领,我們將 pixmaps/Makefile
添加到 configure.ac
的 AC_CONFIG_FILES
宏內(nèi)。一切就緒舔琅,我們可以嘗試 make
和 make install
等恐,不出意外的話,一個(gè)新的條目就會(huì)出現(xiàn)在你的應(yīng)用菜單中备蚓。
但是如果用戶使用其它語言又該怎么辦呢饮焦?他們可能理解不了程序名靠胜,也看不懂桌面文件的描述。如何解決這個(gè)問題將是我們下一章節(jié)的工作。
文章許可協(xié)議:Attribution-NonCommercial-ShareAlike 3.0 Unported