В Ubuntu 16.04, если вы создаете панель запуска (файл рабочего стола в ~/.local/share/applications
) с пользовательским значком для терминального приложения (например, с Terminal=true
), то при запуске оно порождает новый стандартный значок терминала, и ваш пользовательский значок будет пульсировать и исчезать в течение нескольких секунд.
В 14.04 он просто работал как ожидалось. (это не будет запускать новый стандартный значок терминала).
Есть идеи, что нужно сделать, чтобы изменить это поведение? У меня есть несколько терминальных приложений, которые я хочу запустить с сайта Unity, и новое поведение проблематично (я теряю след, который, поскольку они все заканчиваются стандартным значком терминала) ...
Как упомянуто в комментарии, приложение в принципе может только быть представлено одним значком в средстве запуска за один раз. Это всегда имело место.
То, к чему Вы обращаетесь, вероятно, что Единица стала "более умной" в определении который из .desktop
файлы являются лучшим представителем для окна приложения. Поэтому Ваш сценарий, выполняя окно терминала, будет представлен gnome-terminal
- значок:
Поэтому то, что работало в прошлом в Вашей установке, просто создавая средство запуска, запуская Ваш сценарий, больше не дурачит Единицу, и это выбирает существующее gnome-terminal
средство запуска для представления окна.
... должен отвергнуть выбор Единицы путем добавления строки к средству запуска (для 16,04):
StartupWMClass=gnome-terminal-server
... но затем все окна терминала, неважно, если они запускают Ваш скрипт или нет, сгруппированы под этим значком.
Кроме того, в целом, наличие нескольких .desktop
файлы, называя то же приложение в их основной команде являются плохой, грязной практикой.
Требуется немного обмана и обмана, но возможно иметь отдельный значок для нескольких сценариев, работающих в различных окнах терминала.
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'
сделает это:
Теперь давайте добавим другой:
showicon '/home/jacob/Bureaublad/script2.sh' '/home/jacob/Thema/icon/banaan.png'
Результат:
После того как окна закрываются, значок (значки) удалены снова.
Потребности сценария wmctrl
sudo apt-get install wmctrl
Создайте, если это еще не существует, каталог ~/bin
showicon
(никакое расширение) в ~/bin
, и сделайте это исполняемым файломВыйдите из системы и въезжайте задним ходом, Ваша установка должна работать. Протестируйте его с командой
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
экземпляр завершается.Одна фиксация времени должна была бы записать маленькую исполняемую программу, которая запускает Ваш скрипт, и присвойте уникальный значок средства запуска исполняемому файлу.
Другой не отвечает, но решение.
я использую 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 не стал обновленным автоматически и сдался, потому что это сделало это неуклюжим, теперь они мгновенны, это могло работать через задание крона.
gsettings get org.gnome.desktop.input-sources mru-sources
даетNo such key 'mru-sources'
– V.7 6 November 2017 в 11:57