Tôi cần một danh sách chỉ có những ứng dụng hiện đang mở / đang chạy trong Dash, những ứng dụng có (các) mũi tên nhỏ màu trắng ở bên trái của biểu tượng.
Có cách nào để có được nó?
Tôi cần một danh sách chỉ có những ứng dụng hiện đang mở / đang chạy trong Dash, những ứng dụng có (các) mũi tên nhỏ màu trắng ở bên trái của biểu tượng.
Có cách nào để có được nó?
Câu trả lời:
Cách để làm điều đó với qdbus
và org.ayatana.bamf
giao diện.
Danh sách các ứng dụng mở theo .desktop
tệp:
$ 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
Sử dụng org.ayatana.bamf.matcher.RunningApplications
và org.ayatana.bamf.view.Name
phương pháp
$ 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
Câu hỏi thú vị.
Như mọi khi, có nhiều cách khác nhau để có được danh sách các ứng dụng này, mỗi ứng dụng đều có những nhược điểm và quảng cáo cụ thể.
Vì chỉ các ứng dụng có cửa sổ (được ánh xạ) xuất hiện trong Trình khởi chạy, sử dụng:
wmctrl -lp
( wmctrl
không được cài đặt theo mặc định), chúng tôi có thể nhận được một danh sách các cửa sổ đã mở và quy trình mà các cửa sổ thuộc về. Định dạng của đầu ra là:
0x05204641 0 12618 jacob-System-Product-Name verhaal (~) - gedit
nơi đối với chúng tôi thông tin quan trọng nhất là:
0x05204641
); đây là cửa sổ12618
); đây là id quá trình (pid) cửa sổ thuộc về, và,verhaal (~) - gedit
); đây là cửa sổ tên .Khi chúng ta có pid, chúng ta có thể tra cứu tên tiến trình tương ứng bằng lệnh:
ps -p <pid> -o comm=
Chúng ta có thể viết kịch bản các bước ở trên và liệt kê (các) đầu ra cho các cửa sổ hiện có, trông giống như (sử dụng python
):
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
Điều này có vẻ đơn giản. Tuy nhiên, như mọi khi, thực tế phức tạp hơn một chút. Có một vài trường hợp ngoại lệ và biến chứng chúng ta cần quan tâm:
Idle
( python
IDE) hoặc tkinter
là các cửa sổ như vậy.wmctrl
, nhưng không xuất hiện riêng trong Dash.LibreOffice
tất cả các mô-đun có tên quy trình soffice.bin
. Đồng thời, chạy lệnh soffice.bin
sẽ không hoạt động. Trong trường hợp bạn cần xác định riêng các mô-đun ( Calc
, Writer
v.v.), bạn cần lấy thêm thông tin, từ tên của cửa sổ chẳng hạn.gnome-terminal
, như nó xuất hiện trong danh sách quy trình, như trong đầu ra của ps -e ww
. Trong 14.04, gnome-terminal
xuất hiện như gnome-terminal
, tuy nhiên, trong 15.04 / 15.10, nó hiển thị : /usr/lib/gnome-terminal/gnome-terminal-server
.Để khắc phục các sự cố quan trọng nhất ở trên, bạn cần:
thêm một kiểm tra nếu cửa sổ là cửa sổ "thực" hay "bình thường", kiểm tra với
xprop -id <window_id>
Nếu đầu ra bao gồm dòng:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
Cửa sổ là một cửa sổ hợp lệ theo nghĩa của Unity Launcher
gnome-terminal
trong 15.x
(giả sử bạn muốn tên quá trình trình bày cho được gnome-terminal
), chúng tôi cần thêm một ngoại lệ, để đổi tên quá trình thành gnome-terminal
nếu nó xuất hiện như
/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)
Kịch bản cần wmctrl
:
sudo apt-get install wmctrl
sao chép tập lệnh ở trên vào một tập tin trống, lưu nó dưới dạng get_running.py
chạy nó bằng lệnh:
python3 /path/to/get_running.py
Nó sẽ xuất ra như sau:
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
hoặc, chạy với đối số -list
:
thunderbird
nautilus
gnome-terminal
firefox
gedit
GuitarPro.exe
soffice.bin
Từ câu hỏi của bạn, nó không hoàn toàn rõ ràng mục đích chính xác của danh sách tìm thấy là gì. Nếu bạn cần phải có tên của ứng dụng, vì nó xuất hiện trong giao diện (tên "có thể đọc được"), một cách tiếp cận hoàn toàn khác có thể phù hợp:
.desktop
tệp /usr/share/applications
. Trong hầu hết các trường hợp, chúng ta có thể kết luận tên quy trình và tên giao diện của ứng dụng từ .desktop
tệp của nó . Sử dụng thông tin này, chúng tôi có thể dễ dàng tạo một danh sách các ứng dụng GUI đang chạy, được trình bày bằng tên "có thể đọc được" của chúng.Tuy nhiên, trong trường hợp này, thực tế cũng phức tạp hơn lý thuyết, như được giải thích ở đây .