ভূমিকা
শক্তি xdotool
এবং wmctrl
আসে আউট যখন আপনি চলন্ত বা মাপ হিসাবে উইন্ডোজ, উপর ম্যানিপুলেশন করতে হবে। যাইহোক, আমি দৃ strongly়ভাবে বিশ্বাস করি যে কেবল চলমান প্রোগ্রামগুলি এবং তাদের সম্পর্কে তথ্য তালিকাভুক্ত করার উদ্দেশ্যে xprop
এবং qdbus
দুটি পর্যাপ্ত সরঞ্জাম এবং ইনস্টল করা xdotool
এবং wmctrl
ব্যবহারকারী অতিরিক্ত কার্যকারিতার জন্য এটি না চাইলে - এটি উদ্দেশ্যহীন কাজ। এই উত্তরে আমি xprop
এবং সাথে দুটি স্ক্রিপ্টিং সমাধান উপস্থাপন করতে চাই qdbus
।
নোট করুন আমি কোনওভাবেই xdotool
বা এর বিপক্ষে নই wmctrl
। আমি এগুলিকে আমার নিজেরাই ব্যাপকভাবে ব্যবহার করেছি তবে অন্যান্য সরঞ্জামের সাথে মিলিত হয়ে এগুলিকে আমি আরও শক্তিশালী মনে করি। এখানে আমি কয়েকটি ব্যবহার করেছি যেখানে আমি সেগুলি ব্যবহার করেছি:
Xprop
স্ক্রিপ্ট বেলো সক্রিয় উইন্ডোজের তালিকাটি বের করার জন্য কেবল এক্সপ্রপ ব্যবহার করে, কেবলমাত্র সত্য উইন্ডোগুলি ফিল্টার করে (ডক টাইপ নয় যা ইউনিটি লঞ্চার বা ইউনিটি প্যানেল হিসাবে স্তন্যপান করে) এবং তাদের তথ্য প্রদর্শন করে:
ডেমো:
$ bash xprop_windows.sh
XID TYPE TITLE
--------------------------------
56623112| "x-terminal-emulator", "X-terminal-emulator"| "sakura"
81789126| "Navigator", "Firefox"| "Restore Session - Mozilla Firefox"
82002372| "Navigator", "Firefox"| "gui - How do I get a list of running applications by using the command line? - Ask Ubuntu - Mozilla Firefox"
33554444| "gnome-terminal", "Gnome-terminal"| "\"Terminal\""
33554486| "gnome-terminal", "Gnome-terminal"| "\"Terminal\""
স্ক্রিপ্ট উত্স :
get_hex_xids()
{
xprop -root -notype _NET_CLIENT_LIST | \
awk 'BEGIN{printf "ibase=16"}\
{gsub(/\,/," ");for(i=1;i<=NF;i++) \
if ($i~/0x/) printf ";%s",substr(toupper($i),3) }'
}
convert_hex2dec()
{
HEXIDS=$(get_hex_xids)
echo $HEXIDS | bc
}
print_header()
{
printf "%s\t%s\t%s\n" "XID" "TYPE" "TITLE"
printf "%s\n" "--------------------------------"
}
list_info()
{
convert_hex2dec | while read line;
do
TYPE=$( xprop -id $line _NET_WM_WINDOW_TYPE | awk -F '=' '{print $2}' )
if [ $TYPE != "_NET_WM_WINDOW_TYPE_NORMAL" ]; then
continue
fi
CLASS=$(xprop -id $line WM_CLASS | awk -F '=' '{print $2}' )
NAME=$( xprop -id $line _NET_WM_NAME | awk -F '=' '{print $2}' )
printf "\n%s|%s|%s\n" "$line" "$CLASS" "$NAME"
done
}
print_header
list_info
Qdbus
কোড বেলো মূলত একই কাজটি সম্পাদন করে, তবে এটি প্রথমে অ্যাপ্লিকেশনগুলি ফিল্টার করে, তারপরে বাচ্চাদের উইন্ডো তালিকাভুক্ত করে এবং শেষ পর্যন্ত তাদের সম্পর্কে তথ্য সরবরাহ করে।
নমুনা রান:
$ bash ~/bin/qdbus_windows.sh
Name: Terminal
Active :false
Children:
33554486|false|""Terminal""
33554444|false|""Terminal""
--------------
Name: Firefox Web Browser
Active :false
Children:
82002372|false|"gui - How do I get a list of running applications by using the command line? - Ask Ubuntu - Mozilla Firefox"
81789126|false|"Restore Session - Mozilla Firefox"
--------------
Name: MY CUSTOM TERMINAL
Active :true
Children:
56623112|true|"sakura"
--------------
কোড নিজেই:
#!/bin/bash
get_window_paths()
{
qdbus org.ayatana.bamf /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.WindowPaths
}
get_running_apps()
{
qdbus org.ayatana.bamf /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.RunningApplications
}
list_children()
{
qdbus org.ayatana.bamf "$1" org.ayatana.bamf.view.Children
}
window_info()
{
for window in "$@" ; do
XID=${window##*/}
TYPE=$(qdbus org.ayatana.bamf $window org.ayatana.bamf.window.WindowType)
NAME="$(qdbus org.ayatana.bamf $window org.ayatana.bamf.view.Name)"
ACTIVE=$(qdbus org.ayatana.bamf $window org.ayatana.bamf.view.IsActive)
MONITOR=$(qdbus org.ayatana.bamf $window org.ayatana.bamf.window.Monitor)
# printf "%s|%s|%s|%s\n" $TYPE $MONITOR $ACTIVE "$NAME"
printf "%s|%s|\"%s\"\n" $XID $ACTIVE "$NAME"
done
}
window_paths=( $( get_window_paths | tr '\n' ' ') )
apps_list=( $( get_running_apps | tr '\n' ' ' ) )
for app in ${apps_list[@]} ; do
#echo $app
printf "Name: "
qdbus org.ayatana.bamf $app org.ayatana.bamf.view.Name
printf "Active :"
qdbus org.ayatana.bamf $app org.ayatana.bamf.view.IsActive
printf "Children:\n"
# list_children $app
windows=( $( list_children $app | tr '\n' ' ' ) )
window_info "${windows[@]}"
printf "%s\n" "--------------"
done
কিছুটা সহজ কমান্ড তবে আউটপুট ফিল্টারিংয়ের জন্য ইউনিটির উইন্ডো স্ট্যাক ডিবিস ইন্টারফেস ব্যবহার করা হয়। এখানে মূলত আমার একটি ফাংশন রয়েছে.mkshrc
window_stack()
{
qdbus --literal com.canonical.Unity.WindowStack
/com/canonical/Unity/WindowStack \
com.canonical.Unity.WindowStack.GetWindowStack | \
awk -F '{' '{gsub(/\}|\]|,/,"");gsub(/\[/,"\n");print $2}' | \
awk '!/compiz/&&!/^$/ && $4!="\""$3"\"" { L[n++] = $0 }\
END { while(n--) print L[n] }'
}
নমুনা রান:
$ window_stack
Argument: (usbu) 56623112 "x-terminal-emulator" true 0
Argument: (usbu) 82002372 "firefox" false 0
Argument: (usbu) 81789126 "firefox" false 0
Argument: (usbu) 33554486 "gnome-terminal" false 0
Argument: (usbu) 33554444 "gnome-terminal" false 0
Qdbus ব্যবহারের উদাহরণ: