xdotool: কীভাবে উইন্ডোটি শিরোনাম এবং শ্রেণি দ্বারা বিভিন্ন নিদর্শন (অটোহোটির অনুরূপ) দ্বারা অনুসন্ধান করতে হবে


10

এক্সডটুল আপনাকে উইন্ডোগুলির অনুসন্ধান সাবকম্যান্ড ব্যবহার করে অনুসন্ধান করতে দেয়। আমার একটি উইন্ডো সনাক্ত করতে হবে, এতে ক্লাস 'gvim' রয়েছে এবং শিরোনামটিতে 'TODO' শব্দ রয়েছে। আমি এটা কিভাবে করবো?

আমি যা চেষ্টা করেছি:

  • আপনি করতে পারেন xdotool search --name --class, তবে এটি কেবল নাম এবং শিরোনাম উভয়ের জন্য একটি প্যাটার্ন গ্রহণ করবে ।
  • xdotool কমান্ড শৃঙ্খলাবদ্ধ সমর্থন করে, কিন্তু আমি দুটি অনুসন্ধান কল চেইনের কোনও উপায় খুঁজে পেলাম না - দ্বিতীয়টি কেবল প্রথমটিকে ওভাররাইড করে।

xdotoolস্তন্যপান ... এটি একটি সাধারণ অপারেশন এবং মার্জিতভাবে এটি করার উপায় নেই।
ইয়ান কিং ইয়িন

উত্তর:


13

আমার এক্সডটুল সাহায্য আমাকে জানিয়েছে যে আপনার দুটি স্যুইচ একই (এক্সডটুল সংস্করণ 3.20150503.1),

--name          check regexp_pattern agains the window name
--title         DEPRECATED. Same as --name.

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

pids=$(xdotool search --class "gvim")
for pid in $pids; do
    name=$(xdotool getwindowname $pid)
    if [[ $name == *"TODO"* ]]; then
        #Do what you want, $pid is your sought for PID,
        #matching both class gvim and TODO in title
    fi
done

যদি স্টেটমেন্টের স্টারিংসগুলি একটি স্ট্রিং ম্যাচ করার জন্য TODOথাকে তবে শিরোনামের যেখানেই এটি ঘটতে পারে।


হ্যাঁ, দুঃখিত, একটি ভুল ছাপ, আমার অর্থ - নাম এবং - ক্লাস। ঠিক করবে এখনই।
t7ko

@ ডিডিএস আপনি কি বলতে পারেন যে কেন xdotool অনুসন্ধান - ক্লাস "gedit" এখন কেবল জিডিটের জন্য কাজ করবে, তবে অন্য কোনও উইন্ডোতে কাজ করবে? এক্সপ্রপ ইউটিলিটি সহ একই গল্প।
গনকি

6

আমি সংক্ষিপ্ত এবং ইউনিক্স-ওয়ে সমাধান সনাক্ত করতে সক্ষম হয়েছি:

comm -12 \
  <(xdotool search --name  'title-pattern'  | sort) \
  <(xdotool search --class 'class-pattern'  | sort)

3

এখানে ইউনিক্সের সাথে মেনে চলার আরেকটি সমাধান!

প্রথম দর্শনে, এটি আপনার মতো সুন্দর নয়, @ t7ko:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

তবে আমার সাথে সহ্য করুন! এর মধ্যে কিছু লুকানো সৌন্দর্য রয়েছে।

সংক্ষেপে, এটি

  1. গাছের কাঠামোর পরিবর্তে একটি লিনিয়ার কাঠামো রয়েছে , যেমন দুটি মাত্রার পরিবর্তে
  2. আরও সুপরিচিত শেল সিনট্যাক্স ব্যবহার করে
  3. আসলে আপনার প্রশ্নের উত্তর দেয়: এটি উইন্ডোটি সনাক্ত করে।

(এই পয়েন্টগুলি সুবিধাগুলি প্রসঙ্গে নির্ভর করে - আসুন এই দিকটি উপেক্ষা করুন * ))

ধাপে ধাপে বুঝতে আরও সহজ করতে আমি নীচের আরও কাঠামোগত বিন্যাসে একই কোডটি দেখাব।
তবে নোটটি ব্যাখ্যা করার জন্য ইন্ডেন্টেশনটি উল্লেখ করুন - এটি বাসা বাঁধতে বা এটি নির্দেশ করে না, সমস্ত এখনও লিনিয়ার ইউনিক্স পাইপলাইন is

একই কমান্ডটি কেবল পাইপগুলির পরে বিভক্ত ( |):

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
    sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

পূর্ণ কমান্ড উপরে দেখানো, পিক্সেল অবস্থান দেয় gvim, উইন্ডো পিক্সেল স্থানাঙ্ক শীর্ষ আপেক্ষিক বর্তমান (সম্ভবত ভার্চুয়াল) নামে পর্দার কোণ বাম ফিরে x,y, মত 42,433, হয়তো বা -5375,-3809যখন এটি চার ভার্চুয়াল স্ক্রীণ দ্বারা চার প্রথম উপর , এবং বর্তমানটি কোথাও ডানদিকে নীচে রয়েছে।

আপাতত, কেবলমাত্র একটি এক্স 11 উইন্ডো আইডি সন্ধানের জন্য আমি কমান্ডটি সংক্ষিপ্ত করব - সম্ভবত এটিই ওপি দ্বারা যা প্রয়োজন ছিল, নিশ্চিত নয়:

সংক্ষিপ্ত কমান্ড পাইপলাইন, প্রতিটি লাইনে একটি পৃথক শেল কমান্ড:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO'

এখন, এটি পঠনযোগ্য হতে শুরু করে:

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool search --all --pid {} --name 'TODO' 

xdotoolকমান্ড search"সঙ্গে জানালা এটি ব্যবহার করা হয় বর্গ " gvimকিছু "অভ্যন্তরীণ" Windows যাব। ফলাফলটি PID(প্রক্রিয়া শনাক্তকারী) হিসাবে তালিকাভুক্ত ।
প্রত্যেকের জন্য PID, xargsঅন্যটি চালান xdotool search, আমাদের উদাহরণ প্যাটার্নের জন্য "নাম" পরীক্ষা করে TODO- এর জন্য পরীক্ষা করার পরে PID

(ঠিক এক্ষেত্রে: \অব্যাহত রেখাগুলি - শেষ হওয়া লাইনগুলিকে নতুন লাইনের \আগে আসলে এবং কোনও শ্বেত স্পেস দিয়ে শেষ করতে হবে ))

আসল কমান্ডে ফিরে আসুন:

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool \
        search --all --pid {} --name 'TODO' \
        getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

বাকী অংশে পজিশন সহ উইন্ডো সম্পর্কে কিছু বিশদ তালিকাভুক্ত করে। sedকমান্ডটি কেবল x,yপজিশনের সাথে মেলে এবং ফিরে দেয় ।

উদাহরণস্বরূপ, আমার 16 তম ভার্চুয়াল স্ক্রিনে (4 বাই 4 এর) শীর্ষে কমান্ডটি চালানো, gvim1 স্ক্রিনে "টডো" দিয়ে:

$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732

*) দাবি অস্বীকার: আমি @ t7ko এর কোড পছন্দ করি। অনেক!


ব্যবহার দুর্দান্ত --onlyvisible। অনুরূপ ইস্যুতে আমাকে সহায়তা করেছে। থান্ডারবার্ড 14 টি উইন্ডো দিয়ে শুরু করতে পারে এবং ডেস্কটপে কেবল এক বা দুটি থাকে। অন্যগুলি কীসের জন্য তা আমার কোনও ধারণা নেই। বিটিডাব্লু কেবলমাত্র দৃশ্যমান মাধ্যমগুলি প্রদর্শিত হতে পারে - কেবলমাত্র বর্তমান ডেস্কটপে প্রদর্শিত হবে না।
জো

1

সংক্ষিপ্ত এবং মার্জিত উত্তর (যা ব্যবহার করে wmctrl):

result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')

ফলস্বরূপ উইন্ডো আইডি হেক্সে রয়েছে, সুতরাং আপনাকে এটিকে দশমিক (রূপে ব্যবহৃত xdotool) এ রূপান্তর করতে হবে :

printf "%d\n" $result

তারপরে আপনি যা কিছু করতে পারেন xdotool


1
wmctrlম্যানুয়ালটি বলে যে -lউইন্ডো শ্রেণি প্রিন্ট করে না, কেবল শিরোনাম; সুতরাং আপনার কোড স্নিপেট আমার সমস্যা "শিরোনাম এবং শ্রেণীর দ্বারা অনুসন্ধান করুন" সমাধান করে না।
t7ko

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