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
);これはwindow -id12618
);これは、プロセスid(pid)ウィンドウが属する、およびverhaal (~) - gedit
);これはウィンドウnameです。Pidを取得したら、対応するプロセスnameをコマンドで検索できます。
ps -p <pid> -o comm=
上記の手順をスクリプト化して、既存のウィンドウの出力を一覧表示できます(python
を使用)。
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'Thunderbird', 'soffice.bin'}
これは簡単そうです。しかし、いつものように、現実はもう少し複雑です。注意が必要ないくつかの例外と合併症があります。
Idle
(python
IDE)またはtkinter
のウィンドウはそのようなウィンドウです。wmctrl
の出力にウィンドウとしてリストされますが、Dashに個別には表示されません。soffice.bin
であるLibreOffice
の場合です。同時に、commandsoffice.bin
を実行しても機能しません。 modules(Calc
、Writer
など)を個別に識別する必要がある場合は、追加を取得する必要があります。たとえば、ウィンドウのnameからの情報。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
の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アプリケーションのリストを「読みやすい」名前で比較的簡単に作成できます。ただし、この場合も、説明は ここ のように、現実は理論よりも複雑です。