Как мне дать скрипту собственную иконку в лаунчере Unity?

В Ubuntu 16.04, если вы создаете панель запуска (файл рабочего стола в ~/.local/share/applications) с пользовательским значком для терминального приложения (например, с Terminal=true), то при запуске оно порождает новый стандартный значок терминала, и ваш пользовательский значок будет пульсировать и исчезать в течение нескольких секунд.

В 14.04 он просто работал как ожидалось. (это не будет запускать новый стандартный значок терминала).

Есть идеи, что нужно сделать, чтобы изменить это поведение? У меня есть несколько терминальных приложений, которые я хочу запустить с сайта Unity, и новое поведение проблематично (я теряю след, который, поскольку они все заканчиваются стандартным значком терминала) ...

6
задан 27 June 2016 в 08:35

3 ответа

Почему это не работает как Вы, делают

Как упомянуто в комментарии, приложение в принципе может только быть представлено одним значком в средстве запуска за один раз. Это всегда имело место.

То, к чему Вы обращаетесь, вероятно, что Единица стала "более умной" в определении который из .desktop файлы являются лучшим представителем для окна приложения. Поэтому Ваш сценарий, выполняя окно терминала, будет представлен gnome-terminal - значок:

enter image description here

Поэтому то, что работало в прошлом в Вашей установке, просто создавая средство запуска, запуская Ваш сценарий, больше не дурачит Единицу, и это выбирает существующее gnome-terminal средство запуска для представления окна.

Плохое решение

... должен отвергнуть выбор Единицы путем добавления строки к средству запуска (для 16,04):

StartupWMClass=gnome-terminal-server

enter image description here

... но затем все окна терминала, неважно, если они запускают Ваш скрипт или нет, сгруппированы под этим значком.

Кроме того, в целом, наличие нескольких .desktop файлы, называя то же приложение в их основной команде являются плохой, грязной практикой.


Править

Как иметь отдельный значок (значки) (a) для под управлением сценария (сценариев)

Требуется немного обмана и обмана, но возможно иметь отдельный значок для нескольких сценариев, работающих в различных окнах терминала.

Как это работает на практике

  • Скажите, что у Вас есть сценарий, somscript.sh, который Вы хотите выполнить в окне терминала, показывая его специализированный значок в Средстве запуска Единицы, в то время как оно работает.
  • Выполните команду:

    showicon somescript.sh someicon.png
    

    и сценарий будет работать в недавно открытый gnome-terminal окно, показывая значок: someicon.png

  • Если окно закрывается, значок удален из средства запуска снова.

Пример

  • Я хочу сценарий, /home/jacob/Bureaublad/script.sh, выполненный, показывая в средстве запуска Единицы со значком: /home/jacob/Thema/icon/ubu.png Выполнение команды:

    showicon '/home/jacob/Bureaublad/script.sh' '/home/jacob/Thema/icon/ubu.png'
    

    сделает это:

    enter image description here

    Теперь давайте добавим другой:

    showicon '/home/jacob/Bureaublad/script2.sh' '/home/jacob/Thema/icon/banaan.png'
    

    Результат:

    enter image description here

    После того как окна закрываются, значок (значки) удалены снова.

Как установить

  1. Потребности сценария wmctrl

    sudo apt-get install wmctrl
    
  2. Создайте, если это еще не существует, каталог ~/bin

  3. Скопируйте сценарий ниже в пустой файл, сохраните его как showicon (никакое расширение) в ~/bin, и сделайте это исполняемым файлом
  4. Выйдите из системы и въезжайте задним ходом, Ваша установка должна работать. Протестируйте его с командой

    showicon </path/to/script.sh> </path/to/icon.png>
    

    иметь script.sh выполненный в терминале, показывая icon.png в средстве запуска Единицы.

Сценарий

#!/usr/bin/env python3
import subprocess
import os
import sys
import time

terminal = "gnome-terminal"
key = "com.canonical.Unity.Launcher"
script = sys.argv[1]
icon = sys.argv[2]

curr = os.path.dirname(os.path.realpath(__file__))
scriptname = script.split("/")[-1]

def get(command):
    try:
        return subprocess.check_output(command).decode("utf-8")
    except subprocess.CalledProcessError:
        pass

# --- edit Unity launcher section

def current_launcher():
    return eval(get(["gsettings", "get", key, "favorites"]))

def set_launcher(desktopfile, arg):
    curr_launcher = current_launcher()
    last = [i for i, x in enumerate(curr_launcher) if x.startswith("application://")][-1]
    new_icon = "application://"+desktopfile
    if arg == "a":
        if not new_icon in curr_launcher:
            curr_launcher.insert(0, new_icon)
            subprocess.Popen(["gsettings", "set", key,"favorites",str(curr_launcher)])
    elif arg == "r":
        curr_launcher.remove(new_icon)
        subprocess.Popen(["gsettings", "set", key,"favorites",str(curr_launcher)])

# --- end section

def create_launcher(w, scriptname, icon):
    launcher = ["[Desktop Entry]", "Type=Application",
            "Exec=wmctrl -ia "+w, "Name="+scriptname, "Icon="+icon,
            "StartupNotify=False"]
    with open(l_name, "wt") as newlauncher:
        for l in launcher:
            newlauncher.write(l+"\n")

def getname():
    # create unique launcher name
    n = 1
    while True:
        nm = os.path.join(curr, "scriptlauncher_"+str(n)+".desktop")
        if os.path.exists(nm):
            n += 1
        else:
            break
    return nm    

wlist1 = [l.split()[0] for l in get(["wmctrl", "-l"]).splitlines()]
subprocess.Popen(["gnome-terminal", "-e", script])

while True:
    time.sleep(1)
    wdata = get(["wmctrl", "-l"]).splitlines()
    if wdata:
        try:
            wlist2 = [l.split()[0] for l in wdata]
            w = [w for w in wlist2 if not w in wlist1][0]
        except IndexError:
            pass
        else:
            # check if the new window belongs to the terminal
            if terminal in get(["xprop", "-id", w]):
                # create launcher
                l_name = getname()
                create_launcher(w, scriptname, icon)
                set_launcher(l_name, "a")
                break
    wlist1 = wlist2

while True:
    time.sleep(2)
    wdata = get(["wmctrl", "-l"])
    if wdata:
        if not w in wdata:
            os.remove(l_name)
            set_launcher(l_name, "r")
            break 

Примечание:

  • Что делает значок:

    • Это представляет gnome-terminal окно, запуская Ваш скрипт
    • При нажатии на него он повышает окно, как обычно. Команда, чтобы сделать так автоматически добавляется к временному средству запуска:

      wmctrl -ia <window_id>
      
  • Что это не делает:

    • Единственный недостаток этого решения - то, что значок не показывает обычную стрелку слева для запущенных приложений, так как представление является косвенным.

Объяснение

Не вдаваясь слишком много в подробности:

  • Сценарий является оберткой. Если Вы запускаете свой сценарий через showicon, экземпляр showicon запускает Ваш скрипт в a gnome-terminal окно, подобное Terminal=true.
  • Впоследствии, showicon ожидает нового gnome-terminal окно для появления и чтения его идентификатор окна.
  • Временное средство запуска затем создается, с помощью идентификатора окна для создания команды для повышения окна в Exec= строка. Значок Вы устанавливаете как аргумент в команде для выполнения showicon автоматически установлен как значок этого временного средства запуска (определенный в строке Icon=).

    пример такого автоматически созданного (временного) средства запуска:

    [Desktop Entry]
    Type=Application
    Exec=wmctrl -ia 0x04400b7f
    Name=script2.sh
    Icon=/home/jacob/Thema/icon/ubu.png
    StartupNotify=False
    
  • Используя ту же самую процедуру как в этом ответе, временное средство запуска добавляется к Средству запуска Единицы, на ключевой позиции, для представления под управлением сценария.

  • Тем временем, showicon проверки на окно для существования. Если не (еще), временное средство запуска удалено из средства запуска Единицы и удалено из существования вообще, и showicon экземпляр завершается.
7
ответ дан 27 June 2016 в 08:35
  • 1
    Спасибо за Ваш ответ, но gsettings get org.gnome.desktop.input-sources mru-sources дает No such key 'mru-sources' – V.7 6 November 2017 в 11:57

Одна фиксация времени должна была бы записать маленькую исполняемую программу, которая запускает Ваш скрипт, и присвойте уникальный значок средства запуска исполняемому файлу.

0
ответ дан 27 June 2016 в 08:35

Другой не отвечает, но решение.

я использую quicklists для создания средств запуска для моих обычно используемых терминальных сеансов, я затем делаю профили для каждого в терминале гнома, чтобы сделать, вещам нравится, изменяют их цвета, это делает действительно легким знать, какой сервер Вы используете.

можно сделать это путем редактирования файла гнома-terminal.desktop в ~/.local/share/applications/gnome-terminal.desktop.

мой похож на это

[Desktop Entry]
Name=Terminal
Comment=Use the command line
Keywords=shell;prompt;command;commandline;
TryExec=gnome-terminal
Exec=gnome-terminal
Icon=utilities-terminal
Type=Application
X-GNOME-DocPath=gnome-terminal/index.html
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=gnome-terminal
X-GNOME-Bugzilla-Component=BugBuddyBugs
X-GNOME-Bugzilla-Version=3.16.2
Categories=GNOME;GTK;System;TerminalEmulator;
StartupNotify=true
X-GNOME-SingleWindow=false
OnlyShowIn=GNOME;Unity;
Actions=New;Item1;Item2
X-Ubuntu-Gettext-Domain=gnome-terminal

[Desktop Action New]
Name=New Terminal
Exec=gnome-terminal
OnlyShowIn=Unity

[Desktop Action Item1]
Name=SSH Shell type 1
Exec=gnome-terminal -e 'ssh item1' --profile 'Item1'
OnlyShowIn=Unity


[Desktop Action Item2]
Name=SSH Shell type 2
Exec=gnome-terminal -e 'ssh item2' --profile 'Item2'
OnlyShowIn=Unity

, я также записал сценарий только что для автоматизации добавляющих записей в quicklist от hostsfile, таким образом, любая команда ssh получает quicklist запись. Я записал это, когда quicklists не стал обновленным автоматически и сдался, потому что это сделало это неуклюжим, теперь они мгновенны, это могло работать через задание крона.

http://blog.amias.net/articles/114

0
ответ дан 27 June 2016 в 08:35
  • 1
    @V.7: Это может быть GNOME определенная вещь. Ubuntu использует GNOME по умолчанию в 17,10. – Gunnar Hjalmarsson 6 November 2017 в 11:58

Другие вопросы по тегам:

Похожие вопросы: