一般情况下,我们写了一个GUI程序,想要像火狐或者等其它程序一样在桌面显示我们的快捷方式,并且单击就可以启动,不需要使用终端命令行的方法和Windows有很大的区别
Windows上的EXE程序点击Windows内核会自动装载到内存,自动解析PE文件格式,而Linux下不一样,Linux思想就是终端shell,而非可视化GUI,所以Linux对GUI支持并不高,很多发行版如Ubnutu,就是所有Debian发行版里比较受欢迎的一个桌面版,每个发行版都提供一些针对生成桌面快捷方式的方法。
Linux内核本身并不支持这样的方法,而Ubnutu只是在Debian的发行版上增加了自己的桌面而已,也就是一个程序,并且在内核启动时的入口函数完成所有初始化后第一个调用的入口函数。
首先Ubnutu的桌面快捷文件存放在“/usr/share/applications”路径下(一般基于debian的内核都在这个目录下)
进入到这个目录下会看到很多文件:
均以.desktop结尾,这是debian系统的桌面启动程序认的文件后缀
这些文件内容是以“Desktop Entry”类型为格式
在第一行一定要写[Desktop Entry]指明为桌面快捷配置文件,否则debian的桌面管理器不认
下面介绍一下常用关键字:
-
关键字"Name":[必选]
该数值指定了相关应用程序的名称。 -
关键字"GenericName":[可选]
该数值指定了相关应用程序的通用名称。 -
关键字"Comment":[可选]
该数值是对当前Desktop Entry的简单描述。 -
关键字"Type":[必选]
关键字"Type"定义了Desktop Entry文件的类型。常见的"Type"数值是"Application"和"Link"。"Type = Application"表示当前Desktop Entry文件指向了一个应用程序;而"Type = Link"表示当前Desktop Entry文件指向了一个URL (Uniform Resource Locator)。 -
关键字"Exec":[可选]
关键字"Exec"只有在"Type"类型是"Application"时才有意义。"Exec"的数值定义了启动指定应用程序所要执行的命令,在此命令是可以带参数的。在本例中,关键字"Exec"的数值是字符串"gnome-open /usr/share/doc/manual/sled-gnome-cbt_en/index.html"。在shell中输入该字符串并按回车键同样可以启动指定应用程序。 -
关键字"URL":[可选]
关键字"URL"只有在"Type"类型是"Link"时才有意义。"URL"的数值定义了该Desktop Entry文件指向的URL。 -
关键字"Icon":[可选]
该数值定义了当前Desktop Entry文件在应用程序浏览器或是在文件浏览器中所显示的图标。如果关键字"Icon"的数值是以绝对路径的格式给出,那么其数值所指定图标文件将被使用;反之,Linux系统将使用"Icon Theme Specification"在系统指定图标目录下定位所需要使用的图标文件。 -
关键字"Terminal":[可选]
和"StartupNotify"一样,关键字"StartupNotify"的数值也是布尔值,并且该关键字只有在"Type"类型是"Application"时才有意义。其数值指出了相关应用程序(即关键字"Exec"的数值)是否需要在终端窗口中运行。
基本上就像写windows下的ini文件一样简单,只需要将上面的必选项配置完成基本上就大功告成了。
下面是我写的一个配置选项:
简简单单的配置,我们可以在ubnutu的桌面管理器里找到它
注意有的时候可能ubnutu需要更新,需要等待几十秒左右才能看见
点击即会正常运行
如果你的程序是终端程序,需要shell,那么需要把“Terminal”字段设置为true
如果我们的程序需要管理员权限呢?
答:
pkexec,gksu已经被ubnutu淘汰了,取而代之的是pkexec
只需要在前面加上pkexec即可:
注意可能会出现这样的情况:
Unable to init server: 无法连接: 拒绝连接
(Weye_RadarState:85711): Gtk-WARNING **: 00:38:53.716: cannot open display:
这个原因是因为su不能拥有当前用户的屏幕,有很多人说用xhost +,但是博主试过,但是无效
这里有两种解决方案,第一种是将Terminal设置为true,然后把pkexec替换成sudo
每次运行都会弹出终端让你输入密码:
但是很明显,我们的程序属于application的不属于CUI而是GUI,这不符合风格
第二种方法就是使用pkexec指定环境用户
pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY
将屏幕以及x服务都提供给root用户,这样就拥有了屏幕所有权
注意如果使用pkexec需要把Terminal设置为false或者直接去掉,否则会秒退
但是启动时还是秒退
经过博主的测试与调试发现,你需要在当前目录下生成一个.sh文件
然后把命令写进去
在指定
然后在运行即可:
大功告成
如何生成桌面快捷方式呢?
我们只需要在把desktop文件,复制到桌面即可
然后右键会看到一个允许启动
选中即可
这样桌面就生成我们的图标了
如何把图标添加到左侧呢?
首先点击这里:
在搜索栏里搜索你的程序,然后右键添加到收藏夹即可
当你把程序添加到收藏夹时会出现两个图标的问题:
可以看到我们从收藏夹里打开我们的程序,但是却生成了一个新的图标。
这是因为不符合通知协议
在通知协议里有一个StartupNotify协议,它负责决定StartupWMClass是否有效
而StartupWMClass是决定是否开启一个新的窗口,当它的值与窗口名称一致是且StartupNotify为false的情况下,则通知方式不会开启一个新的图标,直接在收藏栏图标上打开。
所以我们在刚刚的desktop文件里修改一下
[Desktop Entry]
Name=WeyeDataHub
Comment=JM Data Server
Type=Application
Icon=/usr/bin/WeyeDataHub/image/ico/jm.ico
Exec=sh /usr/bin/WeyeDataHub/app/start.sh
StartupNotify=false
StartupWMClass=WeyeDataHub
但是遗憾的是还是无效,我仔细去阅读了一下desktop的桌面通知协议,发现StartupWMClass的值要与程序文件名的值一致,而不是Name值一致。
Name变量只是显示的是程序在通知栏与桌面快捷方式显示的名字。
所以我把StartupWMClass这里改成了执行程序的名字:
[Desktop Entry]
Name=WeyeDataHub
Comment=JM Data Server
Type=Application
Icon=/usr/bin/WeyeDataHub/image/ico/jm.ico
Exec=sh /usr/bin/WeyeDataHub/app/start.sh
StartupNotify=false
StartupWMClass=RadarSimSystem.elf
然后就成功了
若你不确定文件名,则可以使用这个命令:
xprop WM_CLASS
在你程序窗口处于打开的情况下,在新建一个终端窗口里输入这个命令,然后你的鼠标样式就会变成十字样式,然后点击一下你的窗口。
第二个就是你窗口的实际文件名,把这个复制到desktop里就可以了。