Ubuntu 16.04では、ターミナルアプリケーション用のカスタムアイコンを使用してランチャー(~/.local/share/applications
のデスクトップファイル)を作成すると(そのためTerminal=true
を使用)、起動すると新しい標準のターミナルアイコンが生成されます。 、カスタムアイコンが点滅し、数秒以内に消えます。
14.04では、期待どおりに機能しました。 (新しい標準のターミナルアイコンは起動しません)。
この動作を変更するにはどうすればよいですか?私は統一から起動したいいくつかのターミナルアプリを持っていますが、新しい動作には問題があります(それらはすべて標準のターミナルアイコンで終わるので、その痕跡を失います)...
コメントで述べたように、アプリケーションは原則として、ランチャー内の1つのアイコン一度にのみで表すことができます。これは常にそうでした。
あなたが言及しているのは、おそらくUnityがどの.desktop
ファイルがアプリケーションのウィンドウの最適な代表であるかを決定する際に「賢く」なったということです。したがって、ターミナルウィンドウを実行するスクリプトは、gnome-terminal
-アイコンで表されます。
したがって、セットアップで過去に機能していた、ランチャーの作成、スクリプトの開始は、Unityをだますことはなく、既存のgnome-terminal
ランチャーを選択してウィンドウを表します。
...ランチャーに行を追加して、Unityの選択を無効にします(16.04の場合):
StartupWMClass=gnome-terminal-server
...しかし、all端末ウィンドウは、スクリプトを実行するかどうかに関係なく、このアイコンの下にグループ化されます。
さらに、一般に、複数の.desktop
ファイルを使用して、メインコマンドで同じアプリケーションを呼び出すことは、良くない、汚れた方法です。
それは少しの策略と欺takesを必要としますが、それはis異なるターミナルウィンドウで実行される、複数のスクリプト用に別々のアイコンを持つことが可能です。
somscript.sh
があり、実行中にUnityランチャーに専用アイコンを表示するとします。コマンドを実行します:
showicon somescript.sh someicon.png
スクリプトは、新しく開いた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'
それを行います:
次に、別のものを追加しましょう。
showicon '/home/jacob/Bureaublad/script2.sh' '/home/jacob/Thema/icon/banaan.png'
結果:
ウィンドウが閉じられると、アイコンは再び削除されます。
スクリプトにはwmctrl
が必要です
Sudo apt-get install wmctrl
まだ存在しない場合は、~/bin
ディレクトリを作成します
~/bin
にshowicon
(拡張子なし)として保存し、実行可能にするログアウトして再度ログインすると、セットアップが機能するはずです。コマンドでテストする
showicon </path/to/script.sh> </path/to/icon.png>
ターミナルでscript.sh
を実行し、Unityランチャーで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>
それがすることnot:
あまり詳しく説明しなくても:
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
this answer と同じ手順を使用して、一時ランチャーがUnityランチャーの最上部に追加され、実行中のスクリプトを表します。
showicon
はウィンドウが存在することを確認します。そうでない場合(もう)、一時ランチャーはUnityランチャーから削除され、存在から削除されますat all、およびshowicon
インスタンスは終了します。別の答えではなく解決策。
クイックリストを使用して、最もよく使用されるターミナルセッションのランチャーを作成し、次にgnome-terminalでそれぞれのプロファイルを作成して、色を変更するなどのことを行います。これにより、使用しているサーバーを簡単に知ることができます。
これを行うには、〜/ .local/share/applications/gnome-terminal.desktopの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
また、hostsファイルからクイックリストへのエントリの追加を自動化して、sshコマンドがクイックリストエントリを取得するスクリプトを作成しました。クイックリストが自動的に更新されず、それが不格好になったためあきらめたときに書きましたが、今では即座にcronジョブを介して実行できます。
一時的な修正は、スクリプトを実行する小さな実行可能プログラムを作成し、実行可能ファイルに一意のランチャーアイコンを割り当てることです。