|

楼主 |
发表于 2012-11-24 23:37
|
显示全部楼层
本帖最后由 perryfa 于 2013-3-3 14:51 编辑
Part II 应用程序.desktop文件
这个部分不依赖桌面管理器,对lucy8k和veket系列都适用的。
.desktop文件(我有时叫它应用程序桌面文件)是个可执行文件,在文件管理器里双击它是可以运行的。但它不是任何一种脚本,文件内容的构成也没有任何逻辑结构,类似某种 conf 设置文件,里面记录了各种参数,这些参数定义了它用于菜单或者桌面快捷方式时需要的一些信息。
创建和编辑.desktop文件和一个普通的文本文件没什么区别,只是文件名必须带有.desktop后缀。
每个应用程序通常至少带有一个.desktop文件(可以有多个,不限)。这个文件的用处很多,不仅仅是用在系统菜单。常用的:
(1)将应用程序显示在系统菜单上,形成应用程序菜单项;
(2)拉到/root/Desktop/目录就是桌面快捷方式(xfce桌面管理器);
(3)建立某一类或几类文件和应用程序之间的关联,在文件管理器里显示右键菜单(打开方式)。
veket系统里有三个地方放.desktop文件。就是:
/usr/share/applications
/usr/local/share/applications
/root/.local/share/applications
前两个目录,存放一般的应用程序桌面文件。如果你的程序放在/usr目录下,桌面文件就放在/usr/share/applications;如果你的程序放在/usr/local/下,桌面文件就放在/usr/local/share/applications。
而/root/.local/share/applications这个目录里的.desktop文件,我们一般用来定义文件管理器里的右键菜单。当然,其他applictions目录里的.desktop文件也能定义右键菜单的显示,但是,/root/.local/share/applications里面的文件在右键菜单的排序时优先级较高,当某个文件类型可以有多个应用程序来打开时(例如文本文件,可以用leafpad、Geany等等程序来打开),哪个程序放在第一个、成为默认打开的应用程序,这就需要特别的指定,否则文件管理器就会按照应用程序的英文字母顺序来排列右键菜单,有可能会不方便了。所以,需要排在第一个的应用程序就在/root/.local/share/applications目录里单独放一个.desktop文件。
下面,我以mtPaint这个程序为例,介绍一下.desktop文件的写法。
.desktop文件的文件名是可以随便写的,但为了便于管理,一般就是应用程序的名字加上.desktop的后缀,mtPaint的桌面文件名是“mtPaint-image-editor.desktop”,有点罗嗦,但人家也是好意,怕你认不出它是什么。
mtPaint-image-editor.desktop的内容:- [Desktop Entry]
- Encoding=UTF-8
- Name=mtPaint image editor
- Name[zh_CN]=mtPaint画图
- Icon=applications-graphics
- Comment=mtPaint image editor
- Exec=mtpaint
- Terminal=false
- Type=Application
- Categories=RasterGraphics
- GenericName=mtPaint image editor
- MimeType=image/png;image/jpeg;
复制代码 下面我介绍一下这些内容:
1. 基本内容
首先,.desktop文件里的内容是以行区分的,一行就是一个参数,各行的上下排列顺序没有要求,也就是说,除了第一行文件标识,其他行的排列是无所谓的。
其次,除了第一行标识,.desktop文件的其他内容是可选的。也就是说,你可以根据需要选择写什么,不写什么。例如,你可以自己决定是否要写入程序的注释。
[Desktop Entry] 这是.desktop文件的标识,必须在第一行。
Encoding=UTF-8 这是编码集
Type=Application 表示是应用程序
上面三行是雷打不动的,不用改。
Name=mtPaint image editor
等号后面是应用程序的英文名字。
Name[zh_CN]=mtPaint画图
等号后面是应用程序的中文名字。在Name后面的方括号里括的是语言标识,系统在读.desktop文件时,会自动去找你的系统的默认语言,如果你的默认语言是中文,系统就会找“Name[zh_CN]=”后面的内容,如果你的.desktop文件里没有这一行,那系统就直接显示“Name=”后面写的名字了。
GenericName=mtPaint image editor
通用名/别名
也可以有中文的,加一行:
GenericName[zh_CN]=画图
Comment=mtPaint image editor
等号后面是应用程序的英文注释。
注释也可以有不同的语言,如果要写中文的注释,就加一行:
Comment[zh_CN]=mtPaint图像编辑器
Exec=mtpaint
等号后面就是运行该程序的命令了。根据需要,运行命令是可以有参数的。
一开始我说过,一个应用程序的.desktop文件可以有多个。可以用多个.desktop文件来运行多个不同的命令,分别实现不同的功能。
例如,smplayer播放器,如果.desktop文件中是这样的内容:
Exec=smplayer
这就意味着运行命令“smplayer”,就是打开播放器。这个.desktop文件用于系统菜单或桌面快捷方式。
如果是这样写的:
Exec=smplayer -add-to-playlist
后面的参数就意味着是把某个音乐文件加入播放器的播放列表,显然,这个.desktop文件是专门用于文件管理器的右键菜单的,显示在系统菜单里是毫无意义的。
问题来了,系统怎么知道这个.desktop文件不需要显示在系统菜单里呢?在.desktop里加一行就可以了:
NoDisplay=true
在/usr/share/applications目录里看到的很多.desktop文件都没有出现在系统菜单里,就是因为文件里有这一行。
Icon=applications-graphics
等号后面定义在菜单或桌面上显示什么图标。
如果所选用的图标放在系统默认的图标目录,例如/usr/share/icons,/usr/share/pixmaps,/root/.icons这些,那就不用写图标文件的路径和后缀名。上面的“applications-graphics”就是个系统默认的图标。
如果图标文件不是系统默认的,放在你自己定义的目录里,那么在等号后面就要写全图标文件的全名,即路径、文件名、后缀名写全了才行。例如这样:
Icon=/root/lucky8k/mtpaint.png
Terminal=false
这行定义在运行“Exec=”定义的命令时,是否同时要打开终端。通常都是用“false”,表示不打开。
通常就是上面这些基本内容了,还有一些不常用的这里就不作介绍了。
下面介绍两个重要的参数,因为比较复杂一点,所以单独介绍。
2. 应用程序分类名
应用程序的分类名定义了该程序在系统菜单中所处的位置。
在.desktop文件里,表达方式就是这样:
Categories=RasterGraphics
“RasterGraphics”就是mtPaint这个程序的分类名。
“Categories=”后面的分类名是可以有多个的,用“;”隔开。
当你从网上下载一个应用程序包,通常它的分类名会有很多个。如果你不加修改直接拿来就用,其后果就是,在系统菜单的多处都显示有这个程序,重复重复再重复,比较郁闷。每个分类名在系统菜单文件里都有确定的位置,例如这个“RasterGraphics”,它在veket-7的菜单文件里出现在“Graphics”子菜单的<Include>里面:
<Category>RasterGraphics</Category>
如果某个应用程序的.desktop文件里的“Categories=”后面写有多个分类名,那么该应用程序就会出现在菜单的多个位置。
产生这种问题的原因,我瞎猜一下,大概是做程序的人不可能猜到自己的程序会被安装在哪个linux系统里,因为不同的系统的系统菜单结构是不同的,能识别的分类名也会有差异,为了以防万一,写程序的人都会秉承宁多勿少的原则,把他认为可能的分类名全写上,菜单里有重复总比完全找不到好。这是从程序编写者的角度比较合适的做法,但对于针对veket分享的程序来说,应该在打包前做好修改,把多余的分类名删除,只保留一个。
当然,还有一种可能是,网上下来的程序包安装后菜单里根本找不到。因为程序编写者使用的系统不是veket,他系统里用的分类名veket里没有。这样的话,在veket-7里就会出现在“其他”菜单,因为在菜单文件的最后,我写入了这样的内容:
<Include>
<All/>
</Include>
意思是,如果分类名在菜单文件里没有,那就统统归入此类。
注意,之前的veket系列的菜单没有这个分类,分类名对不上就彻底没菜单项了。
遇到这种情况,打包者应该修改分类名,使程序项出现在正确的子菜单里。
怎样确保分类名的正确书写呢?
正规的做法,查两个系统文件:
/etc/xdg/menus/hierarchy
这个文件书写的是系统的分类结构。每个菜单名下有哪些分类名都写在这里,不过菜单名是英文的。
/etc/xdg/menus/veket_hierarchy_xfce4
这个文件是个中英文的对照表,英文的菜单名对应中文的菜单名就是写在这里。(注意,veket-7之前的版本没有这个文件,所以,你安装pet时,安装完毕跳出的提示信息里关于菜单部分是英文的,而且菜单分类有可能是错的)。
以前我介绍过一个简单的做法。就是直接从菜单上找到你要放置菜单项的位置,找到邻居,然后直接到applications目录找邻居的.desktop文件,复制粘贴邻居的分类名就没错了。
3. 文件类型关联
文件类型关联最直观的表现就是thunar文件管理器的右键菜单。就是你在文件管理器里看到一个文件,对准文件点鼠标右键,选“打开方式”,你会看到一个列表,表示该文件可以用这些应用程序来打开。(注意:rox 文件管理器的右键菜单做法不同,在此不作介绍,因为用rox的人很少)
要让你的应用程序出现在某种文件的右键菜单上,就要在应用程序的.desktop文件里加入文件类型名,就是这样:
MimeType=image/png;image/jpeg;
这是mtPaint的关联列表,表示在png和jpeg两种图片文件的打开方式菜单里会出现mtPaint这个应用程序。
image/png和image/jpeg是两个文件类型名。一些文件操作相关的应用程序中通常会关联多个文件类型名。不同的文件类型名之间用“;”隔开。
那么,veket系统里有哪些文件类型名、这些文件类型名的正确写法是什么呢?看这两个目录:
/usr/share/mime
/root/.local/share/mime
Mime是来自freedesktop.org的一套标准,mime目录是放系统文件类型定义文件的地方。
MIME判断文件类型的方式是这样的。遇到一个文件,mime首先使用magic方式来判断,所谓的magic方式就是直接读文件里的标识性字符,例如我们写shell脚本第一行必然是“#!/bin/sh”,又例如 XPM 图片文件必然以“/* XPM */”开头,这种方式比识别后缀名要更准确,不仅是因为后缀名是可以人工改的,还因为后缀名也常常有重复的,例如.dat,光看这个后缀,谁能告诉我这是一个vcd视频文件呢还是数据文件啊?因为使用了magic方式,linux的文件是可以没有后缀名的(你可以找张PNG图片,修改文件名,即删掉文件名的后缀.png,然后你再看该图片的属性,系统照样能识别,告诉你它是“PNG 图像”)。第二位的判断方式是glob,就是后缀名,如果magic无法分辨,那就用后缀名判断,例如puppy专有的pet包,就是用.pet这个后缀名来标识的。
要想知道某种文件的文件类型名是什么,可以看mime目录里的定义文件。
有个简单的方法,用命令。
假设你有一个png图片文件(/root/veket/test.png),想知道PNG图片的标准文件类型名,打开终端输入:
# file -i /root/veket/test.png
你会看到:
/root/veket/test.png: image/png
这个“image/png”就是PNG图片文件的文件类型名。
|
|