ইউনিটি লঞ্চারে চলমান জিইউআই অ্যাপ্লিকেশনগুলির তালিকা কীভাবে পাবেন?


8

ড্যাশটিতে বর্তমানে কেবল খোলা / চলমান, আইকনটির বাম পাশে যে সাদা সাদা তীর রয়েছে সেগুলি নিয়ে আমার কেবল একটি তালিকা প্রয়োজন।

এটি পাওয়ার কোনও উপায় আছে কি?

তীর স্ক্রিনশুট দিয়ে ড্যাশ


1
প্রসঙ্গটি কী এবং আপনার কীভাবে তালিকাটি উপলব্ধ হতে হবে (কী আকারে)?
জ্যাকব Vlijm

খোলা উইন্ডোজের তালিকা? সহজেই করা যায়, তবে যাকোব যেমন বলেছিলেন, আমাদের সম্ভবত আরও তথ্য জানা দরকার
সের্গি কলডিয়াজহনি

সম্পর্কিত, এবং খুব সম্ভবত একটি ডুপ্লিকেট: askubuntu.com/q/483554/295286
Sergiy Kolodyazhnyy

উত্তর:


4

এটি করার উপায় 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

এখন যে চিত্তাকর্ষক!
জ্যাকব ভিলিজম

@ জ্যাকবভিলিজম এ সম্পর্কে আরও বিভিন্ন প্রকরণ রয়েছে তবে তাদের নির্দিষ্ট উদ্দেশ্য রয়েছে এবং তাদের আরও কোড এবং পার্সিং প্রয়োজন। আমি এখানে সর্বাধিক সহজ পেস্ট করেছি। তবে আপনাকে ধন্যবাদ :)
সের্গেই কোলোডিযজনি

5

আকর্ষণীয় প্রশ্ন।

সর্বদা হিসাবে, এই অ্যাপ্লিকেশনগুলির একটি তালিকা পাওয়ার বিভিন্ন উপায় রয়েছে, যার মধ্যে প্রতিটি নির্দিষ্ট বিজ্ঞাপন- এবং অসুবিধা রয়েছে।

উইন্ডো তালিকাটি ব্যবহার করে লঞ্চারটিতে প্রতিনিধিত্বমূলক প্রক্রিয়াগুলির একটি তালিকা প্রাপ্ত করা

যেহেতু কেবলমাত্র (ম্যাপ করা) উইন্ডোযুক্ত অ্যাপ্লিকেশনগুলি লঞ্চারটিতে উপস্থিত রয়েছে তা ব্যবহার করে:

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'}

জটিলতা

এটা সোজা মনে হচ্ছে। তবে, বরাবরের মতো বাস্তবতা কিছুটা জটিল। আমাদের যত্ন নিতে কয়েকটি ব্যতিক্রম এবং জটিলতা রয়েছে:

  1. কিছু উইন্ডো পিড 0 এর সাথে সম্পর্কিত হবে যা তাদের সম্পত্তি পাওয়ার চেষ্টা করার সময় একটি ত্রুটি বাড়িয়ে তুলবে। উইন্ডোজ Idle( pythonআইডিই) বা tkinterএ জাতীয় উইন্ডোজ।
  2. কিছু উইন্ডো হ'ল "আসল" বা উইন্ডোজ যেমন ক্ষণস্থায়ী উইন্ডোজ (উইন্ডোজ, যা অন্য উইন্ডো থেকে আহবান করা হয়) এবং উদাহরণস্বরূপ ডেস্কটপ নিজেই নয়। এই উইন্ডোজগুলির আউটপুটটিতে উইন্ডোজ হিসাবে তালিকাভুক্ত করা হয় wmctrlতবে ড্যাশটিতে আলাদাভাবে উপস্থিত হয় না।
  3. কিছু কিছু ক্ষেত্রে, অ্যাপ্লিকেশন নাম ক্ষেত্রে উদাহরণস্বরূপ প্রক্রিয়া নাম থেকে পুরোপুরি ভিন্ন, LibreOfficeযেখানে সকল মডিউল প্রক্রিয়া নাম আছে soffice.bin। একই সময়ে, কমান্ড চালানো কার্যকর soffice.binহবে না। যদি আপনি চিহ্নিত করতে হবে মডিউল ( Calc, Writerইত্যাদি) উইন্ডোর থেকে আলাদাভাবে, আপনি অতিরিক্ত তথ্য পেতে প্রয়োজন চাই, নাম উদাহরণস্বরূপ।
  4. আর একটি উদাহরণ প্রক্রিয়া নাম 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-terminal15.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)

ব্যবহারবিধি

  1. স্ক্রিপ্টটির প্রয়োজন wmctrl:

    sudo apt-get install wmctrl
    
  2. উপরের স্ক্রিপ্টটি একটি খালি ফাইলটিতে অনুলিপি করুন, এটি সংরক্ষণ করুন get_running.py

  3. কমান্ড দ্বারা এটি চালান:

    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। এই তথ্যটি ব্যবহার করে আমরা তুলনামূলকভাবে সহজভাবে চলমান জিইউআই অ্যাপ্লিকেশনগুলির একটি তালিকা তৈরি করতে পারি, যা তাদের "পাঠযোগ্য" নাম দ্বারা উপস্থাপিত।

এছাড়াও এই ক্ষেত্রে যদিও বাস্তবতা তত বেশি জটিল তত্ত্ব, যেমন এখানে ব্যাখ্যা করা হয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.