web-dev-qa-db-ja.com

Unityランチャーでスクリプトに独自のアイコンを付けるにはどうすればよいですか?

Ubuntu 16.04では、ターミナルアプリケーション用のカスタムアイコンを使用してランチャー(~/.local/share/applicationsのデスクトップファイル)を作成すると(そのためTerminal=trueを使用)、起動すると新しい標準のターミナルアイコンが生成されます。 、カスタムアイコンが点滅し、数秒以内に消えます。

14.04では、期待どおりに機能しました。 (新しい標準のターミナルアイコンは起動しません)。

この動作を変更するにはどうすればよいですか?私は統一から起動したいいくつかのターミナルアプリを持っていますが、新しい動作には問題があります(それらはすべて標準のターミナルアイコンで終わるので、その痕跡を失います)...

5
Se6

あなたのように機能しない理由

コメントで述べたように、アプリケーションは原則として、ランチャー内の1つのアイコン一度にのみで表すことができます。これは常にそうでした。

あなたが言及しているのは、おそらくUnityがどの.desktopファイルがアプリケーションのウィンドウの最適な代表であるかを決定する際に「賢く」なったということです。したがって、ターミナルウィンドウを実行するスクリプトは、gnome-terminal-アイコンで表されます。

enter image description here

したがって、セットアップで過去に機能していた、ランチャーの作成、スクリプトの開始は、Unityをだますことはなく、既存のgnome-terminalランチャーを選択してウィンドウを表します。

悪い解決策

...ランチャーに行を追加して、Unityの選択を無効にします(16.04の場合):

StartupWMClass=gnome-terminal-server

enter image description here

...しかし、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'
    

    それを行います:

    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. 以下のスクリプトを空のファイルにコピーし、~/binshowicon(拡張子なし)として保存し、実行可能にする
  4. ログアウトして再度ログインすると、セットアップが機能するはずです。コマンドでテストする

    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

    • このソリューションの唯一の欠点は、表示が間接的であるため、アイコンが実行中のアプリの左側に通常の矢印を表示しないことです。

説明

あまり詳しく説明しなくても:

  • スクリプトはラッパーです。スクリプトを起動する場合viashowiconshowiconのインスタンスは、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インスタンスは終了します。
5
Jacob Vlijm

別の答えではなく解決策。

クイックリストを使用して、最もよく使用されるターミナルセッションのランチャーを作成し、次に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ジョブを介して実行できます。

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

1
Amias

一時的な修正は、スクリプトを実行する小さな実行可能プログラムを作成し、実行可能ファイルに一意のランチャーアイコンを割り当てることです。

0
Michael Clayton