如何在 Unity 启动器中为脚本提供自己的图标?

Se6*_*Se6 7 icons scripts unity launcher .desktop

在 Ubuntu 16.04 中,如果您~/.local/share/applications为终端应用程序创建一个带有自定义图标的启动器(Terminal=true在 .几秒钟。

在 14.04 中,它按预期工作。(它不会启动新的标准终端图标)。

知道如何改变这种行为吗?我有几个终端应用程序想要从统一启动,但新行为是有问题的(我不知道哪个是哪个终端应用程序,因为它们都以标准终端图标结束)...

Jac*_*ijm 7

为什么它不像你那样工作

正如评论中提到的,一个应用程序原则上一次只能由启动器中的一个图标表示。情况一直如此。

您所指的可能是 Unity 在确定哪个.desktop文件最能代表应用程序窗口方面变得“更聪明” 。因此,运行终端窗口的脚本将由gnome-terminal-icon表示:

在此处输入图片说明

因此,过去在您的设置中起作用的方法,只需创建一个启动器,启动您的脚本,就不再欺骗 Unity,它会选择现有的gnome-terminal启动器来代表您的窗口。

糟糕的解决方案

...是通过在启动器中添加一行来否决 Unity 的选择(对于 16.04):

StartupWMClass=gnome-terminal-server
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

...但是所有终端窗口,无论它们是否运行您的脚本,都在此图标下分组。

此外,一般来说,拥有多个.desktop文件,在它们的主命令中调用同一个应用程序是不好的、不干净的做法。


编辑

如何为正在运行的脚本使用 (a) 单独的图标

这需要一些弄虚作假和欺骗的,但它可以有多个脚本一个单独的图标,在不同的终端窗口运行。

在实践中如何运作

  • 假设您有一个脚本,somscript.sh您希望在终端窗口中运行该脚本,并在运行时在 Unity Launcher 中显示其专用图标。
  • 运行命令:

    showicon somescript.sh someicon.png
    
    Run Code Online (Sandbox Code Playgroud)

    脚本将在新打开的gnome-terminal窗口中运行,显示图标:someicon.png

  • 如果窗口关闭,图标会再次从启动器中删除。

一个例子

  • 我想要一个脚本,/home/jacob/Bureaublad/script.sh运行,显示在带有图标的 Unity 启动器中:/home/jacob/Thema/icon/ubu.png 运行命令:

    showicon '/home/jacob/Bureaublad/script.sh' '/home/jacob/Thema/icon/ubu.png'
    
    Run Code Online (Sandbox Code Playgroud)

    会这样做:

    在此处输入图片说明

    现在让我们添加另一个:

    showicon '/home/jacob/Bureaublad/script2.sh' '/home/jacob/Thema/icon/banaan.png'
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    在此处输入图片说明

    关闭窗口后,将再次删除图标。

如何设置

  1. 脚本需要 wmctrl

    sudo apt-get install wmctrl
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建,如果它还不存在,目录 ~/bin

  3. 将下面的脚本复制到一个空文件中,将其另存为showicon(无扩展名)~/bin,并使其可执行
  4. 注销并重新登录,您的设置应该可以工作。用命令测试一下

    showicon </path/to/script.sh> </path/to/icon.png>
    
    Run Code Online (Sandbox Code Playgroud)

    已经script.sh在终端上运行,显示出icon.png在Unity启动器。

剧本

StartupWMClass=gnome-terminal-server
Run Code Online (Sandbox Code Playgroud)

笔记

  • 图标的作用:

    • 它代表gnome-terminal窗口,运行你的脚本
    • 单击它时,它会像往常一样升起窗口。执行此操作的命令会自动添加到临时启动器中:

      wmctrl -ia <window_id>
      
      Run Code Online (Sandbox Code Playgroud)
  • 它没有什么

    • 此解决方案的唯一缺点是图标不会在左侧显示用于运行应用程序的常用箭头,因为表示是间接的。

解释

无需过多赘述:

  • 该脚本是一个包装器。如果您通过 启动您的脚本showicon, 的实例showicon将在gnome-terminal窗口中运行您的脚本,类似于Terminal=true.
  • 随后,showicon等待新gnome-terminal窗口出现并读取其窗口 ID。
  • 然后创建一个临时启动器,使用窗口 id 创建命令以在其Exec=行中提升窗口。您在要运行的命令中设置为参数的图标showicon会自动设置为此临时启动器的图标(在 行中定义Icon=)。

    这种自动创建(临时)启动器的示例:

    [Desktop Entry]
    Type=Application
    Exec=wmctrl -ia 0x04400b7f
    Name=script2.sh
    Icon=/home/jacob/Thema/icon/ubu.png
    StartupNotify=False
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用与此答案完全相同的过程,将临时启动器添加到 Unity Launcher 的顶部位置,以表示您正在运行的脚本。

  • 同时,showicon检查窗口是否存在。如果不(再),临时发射器从发射团结移除并从存在删除所有showicon实例终止。