ฉันต้องการรายการที่มีเฉพาะแอพที่เปิด / ทำงานใน 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
คำถามที่น่าสนใจ
เช่นเคยมีวิธีที่แตกต่างกันในการรับรายการแอปพลิเคชันเหล่านี้ซึ่งแต่ละแอปพลิเคชันนั้นมีโฆษณาและข้อเสียเฉพาะ
เนื่องจากมีเฉพาะแอปพลิเคชันที่มีหน้าต่าง (แมป) ปรากฏใน Launcher โดยใช้:
wmctrl -lp
( wmctrl
ไม่ได้ติดตั้งโดยค่าเริ่มต้น) เราสามารถรับรายการของหน้าต่างที่เปิดอยู่และกระบวนการที่เป็นของ windows รูปแบบของผลลัพธ์คือ:
0x05204641 0 12618 jacob-System-Product-Name verhaal (~) - gedit
ข้อมูลที่สำคัญที่สุดสำหรับเราอยู่ที่:
0x05204641
); นี่คือหน้าต่าง -id12618
); นี่คือรหัสกระบวนการ (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
แต่ไม่ปรากฏแยกต่างหากใน DashLibreOffice
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 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 ที่ใช้งานง่ายซึ่งแสดงโดยชื่อ "ที่อ่านได้"นอกจากนี้ในกรณีนี้ แต่ความเป็นจริงก็ยังมีความซับซ้อนมากขึ้นแล้วทฤษฎีตามที่อธิบายไว้ที่นี่