Làm cách nào để có được danh sách các ứng dụng GUI đang chạy trong Unity Launcher?


8

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ó?

dấu gạch ngang với mũi tên màn hình


1
Bối cảnh là gì và bạn cần danh sách như thế nào (ở dạng nào)?
Jacob Vlijm

Danh sách các cửa sổ đang mở? Có thể dễ dàng thực hiện, nhưng như Jacob nói, có lẽ chúng ta cần biết thêm thông tin
Sergiy Kolodyazhnyy

Liên quan và rất có thể là một bản sao: Askubfox.com/q/483554/295286
Sergiy Kolodyazhnyy

Câu trả lời:


4

Cách để làm điều đó với qdbusorg.ayatana.bamfgiao diện.

Danh sách các ứng dụng mở theo .desktoptệ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.RunningApplicationsorg.ayatana.bamf.view.Namephươ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

Bây giờ thật ấn tượng!
Jacob Vlijm

@JacobVlijm Có nhiều biến thể hơn về điều này, nhưng chúng có mục đích cụ thể và yêu cầu nhiều mã và phân tích cú pháp hơn. Tôi chỉ dán những cái đơn giản nhất ở đây. Nhưng cảm ơn bạn :)
Sergiy Kolodyazhnyy

5

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ể.

Lấy danh sách các quy trình, được trình bày trong Trình khởi chạy, sử dụng danh sách cửa sổ

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 

( wmctrlkhô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à:

  • chuỗi đầu tiên ( 0x05204641); đây là cửa sổ
  • chuỗi thứ ba ( 12618); đây là id quá trình (pid) cửa sổ thuộc về, và,
  • phần cuối cùng ( 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'}

Biến chứng

Đ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:

  1. Một số cửa sổ sẽ thuộc về pid 0 , điều này sẽ gây ra lỗi khi cố gắng lấy các thuộc tính của chúng. Windows của Idle( pythonIDE) hoặc tkinterlà các cửa sổ như vậy.
  2. Một số cửa sổ không có "thực" hoặc cửa sổ, như cửa sổ thoáng qua (cửa sổ, được gọi từ và thuộc về các cửa sổ khác) hoặc ví dụ như chính máy tính để bàn. Các cửa sổ này được liệt kê dưới dạng cửa sổ trong đầu ra của wmctrl, nhưng không xuất hiện riêng trong Dash.
  3. Trong một số trường hợp, tên của ứng dụng khá khác với tên quy trình, ví dụ trong trường hợp LibreOfficetấ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, Writerv.v.), bạn cần lấy thêm thông tin, từ tên của cửa sổ chẳng hạn.
  4. Một ví dụ khác là tên quy trình của 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-terminalxuấ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.

Những gì chúng ta cần sửa chữa ít nhất

Để 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

  • Để khắc phục những tên quá trình gnome-terminaltrong 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-terminalnếu nó xuất hiện như /usr/lib/gnome-terminal/gnome-terminal-server

Kịch bản

#!/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)

Cách sử dụng

  1. Kịch bản cần wmctrl:

    sudo apt-get install wmctrl
    
  2. 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

  3. 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
    

Ghi chú

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:

  • Tất cả các ứng dụng được cài đặt trên toàn cầu đều có .desktoptệ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 tên giao diện của ứng dụng từ .desktoptệ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 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.