ড্যাশটিতে বর্তমানে কেবল খোলা / চলমান, আইকনটির বাম পাশে যে সাদা সাদা তীর রয়েছে সেগুলি নিয়ে আমার কেবল একটি তালিকা প্রয়োজন।
এটি পাওয়ার কোনও উপায় আছে কি?
ড্যাশটিতে বর্তমানে কেবল খোলা / চলমান, আইকনটির বাম পাশে যে সাদা সাদা তীর রয়েছে সেগুলি নিয়ে আমার কেবল একটি তালিকা প্রয়োজন।
এটি পাওয়ার কোনও উপায় আছে কি?
উত্তর:
এটি করার উপায় 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
ডিফল্টরূপে ইনস্টল করা হয় না), আমরা খোলা উইন্ডোগুলির একটি তালিকা এবং উইন্ডোগুলির সাথে সম্পর্কিত প্রক্রিয়া-আইডি পেতে পারি। আউটপুটটির বিন্যাসটি হ'ল:
0x05204641 0 12618 jacob-System-Product-Name verhaal (~) - gedit
আমাদের জন্য সবচেয়ে গুরুত্বপূর্ণ তথ্যটি কোথায়:
0x05204641
); এটি উইন্ডো-আইডি12618
); এটি হ'ল প্রক্রিয়া আইডি (পিড) উইন্ডোটি সম্পর্কিত, এবং,verhaal (~) - gedit
); এটি উইন্ডো নাম ।আমাদের একবার পিড হয়ে গেলে, আমরা কমান্ডের মাধ্যমে সংশ্লিষ্ট প্রক্রিয়াটির নামটি দেখতে পারি :
ps -p <pid> -o comm=
আমরা উপরের পদক্ষেপগুলি স্ক্রিপ্ট করতে পারি এবং বিদ্যমান উইন্ডোগুলির জন্য আউটপুট (দেখতে) এর মতো দেখতে (ব্যবহার করে python
) তালিকাভুক্ত করতে পারি :
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
এটা সোজা মনে হচ্ছে। তবে, বরাবরের মতো বাস্তবতা কিছুটা জটিল। আমাদের যত্ন নিতে কয়েকটি ব্যতিক্রম এবং জটিলতা রয়েছে:
Idle
( python
আইডিই) বা tkinter
এ জাতীয় উইন্ডোজ।wmctrl
তবে ড্যাশটিতে আলাদাভাবে উপস্থিত হয় না।LibreOffice
যেখানে সকল মডিউল প্রক্রিয়া নাম আছে 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
উইন্ডোটি ইউনিটি লঞ্চারের অর্থে একটি বৈধ উইন্ডো
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
। এই তথ্যটি ব্যবহার করে আমরা তুলনামূলকভাবে সহজভাবে চলমান জিইউআই অ্যাপ্লিকেশনগুলির একটি তালিকা তৈরি করতে পারি, যা তাদের "পাঠযোগ্য" নাম দ্বারা উপস্থাপিত।এছাড়াও এই ক্ষেত্রে যদিও বাস্তবতা তত বেশি জটিল তত্ত্ব, যেমন এখানে ব্যাখ্যা করা হয়েছে ।