現在Dashで開いている/実行しているアプリのみのリストが必要です。これらのアプリには、アイコンの左側に小さな白い矢印があります。
入手する方法はありますか?
現在Dashで開いている/実行しているアプリのみのリストが必要です。これらのアプリには、アイコンの左側に小さな白い矢印があります。
入手する方法はありますか?
回答:
でそれを行うための方法qdbus
およびorg.ayatana.bamf
インタフェース。
.desktop
ファイルごとの開いているアプリケーションのリスト:
$ qdbus org.ayatana.bamf /org/ayatana/bamf/matcher \
> org.ayatana.bamf.matcher.RunningApplicationsDesktopFiles
/usr/share/applications/compiz.desktop
/usr/share/applications/firefox.desktop
/usr/share/applications/x-terminal-emulator.desktop
使用org.ayatana.bamf.matcher.RunningApplications
と org.ayatana.bamf.view.Name
方法
$ qdbus org.ayatana.bamf /org/ayatana/bamf/matcher \
> org.ayatana.bamf.matcher.RunningApplications | \
> xargs -I {} qdbus org.ayatana.bamf {} org.ayatana.bamf.view.Name
Firefox Web Browser
MY CUSTOM TERMINAL
Compiz
興味深い質問です。
いつものように、これらのアプリケーションのリストを取得するにはさまざまな方法があり、それぞれに特定の利点と欠点があります。
(マップされた)ウィンドウのあるアプリケーションのみがランチャーに表示されるため、以下を使用します。
wmctrl -lp
(wmctrl
デフォルトではインストールされていません)、開いているウィンドウとそのウィンドウが属するプロセスIDのリストを取得できます。出力の形式は次のとおりです。
0x05204641 0 12618 jacob-System-Product-Name verhaal (~) - gedit
私たちにとって最も重要な情報は次のとおりです。
0x05204641
); これはウィンドウ-idです12618
); これは、ウィンドウが属するプロセスID(pid)であり、verhaal (~) - gedit
); これはウィンドウ名です。pidを取得したら、次のコマンドで対応するプロセス名を検索できます。
ps -p <pid> -o comm=
上記の手順をスクリプト化し、既存のウィンドウの出力をリストすることができます(を使用してpython
):
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
これは簡単に思えます。ただし、いつものように、現実はもう少し複雑です。いくつかの例外と面倒な問題があります。
Idle
(python
IDE)、またはtkinter
、そのようなウィンドウです。wmctrl
Dashでは個別に表示されません。LibreOffice
すべてのモジュールのプロセス名がである場合など、アプリケーションの名前がプロセス名とはかなり異なる場合がありますsoffice.bin
。同時に、コマンド soffice.bin
を実行しても機能しません。ケースでは、識別するために必要なモジュール(Calc
、Writer
など)を個別に、あなたは窓のから、追加情報を取得する必要があると思い名たとえば。gnome-terminal
の出力のようにプロセスリストに表示されるのプロセス名ですps -e ww
。14.04ではとgnome-terminal
表示されますがgnome-terminal
、15.04 / 15.10ではと表示されます/usr/lib/gnome-terminal/gnome-terminal-server
。上記の最も重要な問題を修正するには、次のことを行う必要があります。
ウィンドウが「実際の」ウィンドウか「通常の」ウィンドウかを確認し、
xprop -id <window_id>
出力に次の行が含まれる場合:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
ウィンドウはUnityランチャーの意味で有効なウィンドウです
gnome-terminal
in のプロセス名を修正するには15.x
(表示されたプロセス名をにする場合gnome-terminal
)、例外を追加して、次のgnome-terminal
ように表示される場合にプロセス名をに変更する必要があります。
/usr/lib/gnome-terminal/gnome-terminal-server
#!/usr/bin/env python3
import subprocess
import sys
try:
listed = sys.argv[1]
except IndexError:
listed = []
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
def check_wtype(w_id):
# check the type of window; only list "NORMAL" windows
return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id])
def get_process(w_id):
# get the name of the process, owning the window
proc = get(["ps", "-p", w_id, "-o", "comm="])
proc = "gnome-terminal" if "gnome-terminal" in proc else proc
return proc
wlist = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"])\
.decode("utf-8").splitlines()]
validprocs = set([get_process(w[2]) for w in wlist if check_wtype(w[0]) == True])
if listed == "-list":
for p in validprocs:
print(p)
else:
print(validprocs)
スクリプトに必要なものwmctrl
:
sudo apt-get install wmctrl
上記のスクリプトを空のファイルにコピーし、名前を付けて保存します get_running.py
次のコマンドで実行します。
python3 /path/to/get_running.py
次のように出力されます:
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
または、引数を指定して実行します-list
。
thunderbird
nautilus
gnome-terminal
firefox
gedit
GuitarPro.exe
soffice.bin
あなたの質問から、見つかったリストの目的が正確に何であるかは完全に明確ではありません。アプリケーションの名前(インターフェースに表示される名前)が必要な場合(「読み取り可能な」名前)、まったく異なるアプローチが適している可能性があります。
.desktop
ファイルがあります/usr/share/applications
。ほとんどの場合、ファイルからアプリケーションのプロセス名とインターフェース名を結論付けることができ.desktop
ます。この情報を使用して、実行可能なGUIアプリケーションのリストを、「読み取り可能な」名前で提示することで、比較的簡単に作成できます。