아이콘 왼쪽에 작은 흰색 화살표가있는 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에서는 15.04 / 15.10에서는 다음 gnome-terminal
과 같이 나타납니다 .gnome-terminal
/usr/lib/gnome-terminal/gnome-terminal-server
위의 가장 중요한 문제를 해결하려면 다음을 수행해야합니다.
윈도우가 "실제"또는 "정상"윈도우인지 확인하고,
xprop -id <window_id>
출력에 라인이 포함 된 경우 :
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
이 창은 Unity Launcher와 관련하여 유효한 창입니다.
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 응용 프로그램 목록을 비교적 쉽게 만들 수 있습니다.그러나이 경우에도 여기에 설명 된 바와 같이 현실은 이론보다 복잡하다 .