বাশে মাউস পয়েন্টারের নীচে আমি এক্স উইন্ডো আইডিটি কীভাবে খুঁজে পাব?


20

বাশ স্ক্রিপ্ট থেকে, মাউস পয়েন্টারের নীচে X উইন্ডোর আইডি পাওয়ার কোনও উপায় আছে?

(সম্পাদনা) প্রক্রিয়াটি অ-ইন্টারেক্টিভ হতে হবে।

উত্তর:


25

xdotoolপয়েন্টার অবস্থান ( xdotool getmouselocation) এবং সাম্প্রতিক সংস্করণগুলি (2.20110530.1 থেকে) উন্মুক্ত করে যা সেই স্থানে কোন উইন্ডোটি রয়েছে তা নির্দেশ করে । কোনটিই xwininfo, wmctrlঅথবা পুরোনো সংস্করণগুলি xdotoolপ্রদর্শিত একটি উপায় একটি পর্দা অবস্থান যেখানে এটি দৃশ্যমান দ্বারা একটি উইন্ডো মেলে আছে।

অন্তর্নিহিত এক্স লাইব্রেরি কলটি XQueryPointer(কোনও QueryPointerবার্তার সাথে সম্পর্কিত)। এই কলটির চারপাশে এখানে একটি সাধারণ পাইথন র‍্যাপার স্ক্রিপ্ট রয়েছে (ব্যবহার করে ctypes)। চেক করার সময় ত্রুটি মূলত বাদ পড়েছে। ধরে নিন আপনি পর্দা 0 ব্যবহার করছেন (যদি আপনি না জানতেন যে ডিসপ্লেতে একাধিক স্ক্রিন থাকতে পারে তবে এটিকে এড়িয়ে যান)।

#! /usr/bin/env python
import sys
from ctypes import *
Xlib = CDLL("libX11.so.6")
display = Xlib.XOpenDisplay(None)
if display == 0: sys.exit(2)
w = Xlib.XRootWindow(display, c_int(0))
(root_id, child_id) = (c_uint32(), c_uint32())
(root_x, root_y, win_x, win_y) = (c_int(), c_int(), c_int(), c_int())
mask = c_uint()
ret = Xlib.XQueryPointer(display, c_uint32(w), byref(root_id), byref(child_id),
                         byref(root_x), byref(root_y),
                         byref(win_x), byref(win_y), byref(mask))
if ret == 0: sys.exit(1)
print child_id.value

ব্যবহারের উদাহরণ:

xwininfo -tree -id $(XQueryPointer)

1
থ্যাঙ্কস গিলস: এটি আমার প্রায় প্রয়োজন (এটি প্রায়) ... এটি আদর্শ তবে এটি ডেস্কটপের জন্য নিজেই '0' এর মান প্রদান করে .. একটি শূন্য-উইন্ডো আইডি ফিরে আসে (ডেস্কটপের জন্য) অ্যাসিঙ্ক্রোনাস দ্বারা xdotool click 1পদ্ধতিতে মন্তব্যে উল্লেখ ব্রুস Ediger এর উত্তর .. নন-জিরো ডেস্কটপ আইডি বৈধ এই পর্যন্ত যে এটা মাধ্যমে উপযুক্ত ইমেজ ফেরৎ import -window $nonzeroID screen.png.... আছে কি পাইথন স্ক্রিপ্টের জন্য কিছু সহজ খামচি ফিরে যাওয়ার যে ডেস্কটপের জন্য মান ?
পিটার.ও

@ গিলিস ... পরীক্ষা করার $(XQueryPointer)জন্য 0, এবং xwininfo -rootএই শর্তটি আহ্বান করা এই
চক্রটিকে

@ ফ্রেড আনটেস্টেড কারণ আমি ইউনিক্স মেশিনের সামনে নেই: root_id.valueযদি ছাপার চেষ্টা করুন child_id.value == 0
গিলস

হ্যাঁ, আপনার মোড if child_id.value == 0: print root_id.value else: print child_id.value
ঠিকঠাক

sed /x[0-9]\\++/q\;d <(xwininfo -tree -id $(XQueryPointer))
এফ। হাউরি

21

xwininfoকমান্ড আউটপুট এই ধরনের দেয়, কিন্তু আপনি উইন্ডো আপনি উপর তথ্য চান তার উপর ক্লিক করতে হবে না:

% xwininfo
xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0xa0000d "flask"

...

তাই করা: xwininfo | grep 'Window id:'আপনাকে আইডিটি বিশ্লেষণ করতে এমন কিছু দিতে পারে।


1
আমার এটি অ-ইন্টারেক্টিভ হওয়া দরকার ...
পিটার.ও

1
এটিকে ব্যাকগ্রাউন্ডে চালিয়ে xwinfo |grep window id:' &এবং এটিকে অনুসরণ করে অ-ইন্টারেক্টিভ করা যেতে পারে xdotool click 1... তবে এটি মাউসটি আঁকড়ে ধরার clickআগেই অগ্রভাগের মৃত্যুর ঝুঁকি চালায় xdotool। আমি রাথিন নামমাত্র `ঘুম এন ব্যবহার করতাম না, সুতরাং যদিও এই উত্তরটি অন ট্র্যাক, আমি আরও কিছু ইনলাইন রূপান্তরিত হয়েছে কিনা তা দেখার জন্য আমি একটি উইলইলে অপেক্ষা করব ...
পিটার.ও

8

এটি ব্যবহার করে দেখুন, এটি কেবল এক্সডটুল ব্যবহার করে তবে এর সংস্করণটি কমপক্ষে "2.20110530.1"

xdotool getmouselocation --shell | grep WINDOW

উইন্ডো আইডি সরাসরি পেতে আপনি এটি ব্যবহার করতে পারেন:

sedGetValue='s/.*=\(.*\)/\1/'
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId

1
কাজ করেছেন, ধন্যবাদ, xdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
বিটিডাব্লু

1

এক্সডটুল এটি করার জন্য যথেষ্ট ভাল।

দৌড়ুন xdotool getactivewindowএবং আপনি ফলাফলটি দেখতে পাবেন (int) উইন্ডোটি কোনও মনিটরের উপরে থাকতে পারে। X11 পয়েন্টারটি যেখানে ক্লিকের জন্য অপেক্ষা করছে সেখানে কেবল পড়ুন :) এবং এটি কোনও দূরবর্তী উইন্ডো, কোনও ভিএনসিএসভার বা কিউব ডেস্কটপ এনভায়রনমেন্টের 3 য় ডেস্কটপ হোক if শুধু কাজ করে।

আপনি আরও ভাল পরীক্ষার জন্য ঘুম ব্যবহার করে এটি খেলতে পারেন sleep 3; xdotool click 1+2; xdotool getactivewindow

আমি দেখতে পেয়েছি যে getwindowsfocusতুলনায় একই মান প্রদান getactivewindow

আপনি যদি ক্লিকগুলি ম্যানুয়ালি করেন তবে আপনি প্রাসঙ্গিক মেনুটি দেখতে পাবেন তবে 1 + 2 ক্লিক করে বর্তমান মাউসের অবস্থানে ক্লিক করে এবং পছন্দসই আইডি পেয়ে উভয় ক্লিক ফায়ার করতে পারেন।

চেষ্টা করে দেখুন :)


1
এটি সক্রিয় উইন্ডোটির আইডি দেয় (যে উইন্ডোটি যেখানেই থাকুক না কেন), সক্রিয় উইন্ডোটি মাউস পয়েন্টারের নীচে থাকুক বা না থাকুক। প্রশ্নের বাক্য অনুসারে: "... মাউস পয়েন্টারের নীচে X উইন্ডো আইডিটি সন্ধান করুন ..." (যেদিকে মাউসটি যেখানেই থাকুক না কেন )।
পিটার.ও

1
সংশোধনের জন্য আপনাকে ধন্যবাদ, আপনি ঠিক বলেছেন। আপডেট হয়েছে । আমি getmouselocation ধারণাটি অ্যাক্টিভ উইন্ডোর সাথে মিশ্রিত করেছিলাম, তবে যাইহোক, এক্সডটুল যথেষ্ট দুর্দান্ত।
এম


0

আমি পিটারের কাছ থেকে উত্তরটি নিয়ে কথা বললাম O ও এসেছি:

xdotool click 1|xwininfo|grep 'Window id:'

1
এটি একটি মাউস ক্লিক প্রেরণ করে, সুতরাং এটি উদাহরণস্বরূপ মাউস কার্সার যেখানে একটি বোতাম ক্লিক করুন। এটি ঘটনাক্রমে উইন্ডোটির প্রতিবেদন করবে যেখানে কার্সারটি রয়েছে যেখানে আপনি ফোকাস করতে ক্লিক ব্যবহার করেন তবে ক্লিক ইভেন্ট প্রেরণ ব্যাহত হয়।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

0

আর্কউইকির এটির একটি ভাল উত্তর রয়েছে:

activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}

sedআপনি ব্যবহার করে এটি একক লাইনে এটি করতে পারেন, এটি সম্ভবত এটি সবচেয়ে পাঠযোগ্য উপায়:

activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"

নোটটি xdotoolআমার ডেবিয়ান মিনিমাম এক্স 11 এ অনুপস্থিত ছিল যখন xpropঅন্তর্ভুক্ত ছিল (একইভাবে sedঅবশ্যই)।

আপনি যদি কাঁটাচামচা করতে না চান sedবা grepআপনি এটি সম্পূর্ণরূপে পাঠ্য রূপান্তর করতে না পারেন bashযা কিছুটা xpropপরিবর্তনের আউটপুট কিছুটা হলেও সম্ভবত আরও কিছুটা নিরাপদ :

activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'

যাইহোক, এত সহজ কাজ সংরক্ষণাগারভুক্ত করার এখনও একটি অদ্ভুত উপায়।


3
এটি মাউস পয়েন্টারের নীচে উইন্ডোর পরিবর্তে সক্রিয় উইন্ডোর আইডি দেয়।
পিটার.ও

@ পিটার.ও আপনি ঠিক বলেছেন এটি সক্রিয় উইন্ডোটি ফিরিয়ে দেয়। ভুল উত্তরের জন্য দুঃখিত, তবে আমার পরীক্ষাগুলি দিয়ে এটি কাজ করেছে - সম্ভবত কারণ আমার ফোকাস-ফলোস-মাউস ছিল।
টিনো

0
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'

1
এটি মাউস পয়েন্টারের নীচে উইন্ডোর পরিবর্তে সক্রিয় উইন্ডোর আইডি দেয়।
পিটার.ও

ওহ, আমি এখানে স্লোপি ফোকাস (ফোকাসটি মাউসের অনুসরণ করে) ধরে নিচ্ছিলাম।
নীল রঙের

@ ব্লুয়েড ফোকাস সক্রিয় উইন্ডোগুলিতে রয়েছে এবং এই উইন্ডোজগুলি কেইবোর্ডকে প্রতিক্রিয়া জানায়। মাউস এটি থেকে সার্ভার হিসাবে এক্স 11 দ্বারা অনুসরণ / অনুসরণ করা হয় এবং আপনি যখন উইন্ডোতে ক্লিক করেন, এক্স 11 ক্লিক করা উইন্ডোতে উইন্ডো-ম্যানেজার ফোকাস সেট করে। ফোকাস সত্যিই মাউস অনুসরণ করবেন না। আপনি xdotool getwindowsfocusচারপাশে কনসোল এবং চলমান মাউস থেকে চলমান পরীক্ষা করতে পারেন । আপনি মাউস ক্লিক না করা বা কীবোর্ড (Alt + ট্যাব ইত্যাদি) ব্যবহার না করা অবধি মান সমান হবে
এম 3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.