বিঃদ্রঃ
স্ক্রিপ্টটি 16 জানুয়ারী 2017 এ প্যাচ করা হয়েছে / ঠিক করা হয়েছিল, কয়েকটি অ্যাপ্লিকেশনের জন্য ঠিক করা, যার মধ্যে অ্যাপ্লিকেশনটি চালানোর জন্য প্রক্রিয়াটির নাম আদেশের থেকে পৃথক হয় । সম্ভবত, অ্যাপ্লিকেশনগুলিতে এটি মাঝে মধ্যে ঘটে। যদি কারও একটি পাওয়া যায় তবে দয়া করে একটি মন্তব্য করুন।
উইন্ডো বিন্যাস এবং তাদের সম্পর্কিত অ্যাপ্লিকেশন মনে রাখবেন এবং পুনরুদ্ধার করতে স্ক্রিপ্ট।
নীচের স্ক্রিপ্টটি দুটি বিকল্প দিয়ে চালানো যেতে পারে। ধরা যাক আপনার নীচের মত উইন্ডো ব্যবস্থা আছে:
করার পড়া (স্মরণ কর) বর্তমান উইন্ডোটি বিন্যাস এবং তাদের অ্যাপ্লিকেশন, বিকল্প স্ক্রিপ্ট সঞ্চালন করুন:
<script> -read
তারপরে সমস্ত উইন্ডো বন্ধ করুন:
তারপরে সর্বশেষ স্মরণে রাখা উইন্ডো বিন্যাসটি সেট আপ করতে, বিকল্পটি দিয়ে এটি চালান:
<script> -run
এবং শেষ মনে রাখা উইন্ডো বিন্যাস পুনরুদ্ধার করা হবে:
এটি পুনরায় চালু করার পরেও কাজ করবে।
দুটি কমান্ড দুটি পৃথক শর্টকাট কীগুলির অধীনে রেখে, আপনি আপনার উইন্ডোটির ব্যবস্থাটি "রেকর্ড" করতে পারেন, আপনার কম্পিউটারটি বন্ধ করে দিতে পারেন এবং (উইন্ডোজ) পুনরায় চালু করার পরে একই উইন্ডো বিন্যাসটি স্মরণ করতে পারেন।
স্ক্রিপ্টটি কী করে এবং কী করে না
অপশন দিয়ে চালান -read
- স্ক্রিপ্টটি
wmctrl
সমস্ত ওয়ার্কস্পেসে, তাদের অবস্থানগুলি, আকারগুলি, অ্যাপ্লিকেশনগুলির সাথে সম্পর্কিত সমস্ত উইন্ডো তালিকাবদ্ধ করতে ব্যবহার করে
- স্ক্রিপ্টটি আপনার বিস্তৃত ওয়ার্কস্পেসগুলিতে উইন্ডো অবস্থানকে আপেক্ষিক (বর্তমান ওয়ার্কস্পেসে, যেমন আউটপুট হিসাবে
wmctrl
) পরম অবস্থানগুলিতে "রূপান্তর" করে । অতএব আপনি যে উইন্ডোগুলি মনে রাখতে চান তা কেবল একটি ওয়ার্ক স্পেসে রয়েছে বা বিভিন্ন ওয়ার্কস্পেসে ছড়িয়ে রয়েছে তা বিবেচ্য নয়।
- স্ক্রিপ্টটি আপনার উইন্ডো ডিরেক্টরিতে অদৃশ্য ফাইলে এটি লিখে বর্তমান উইন্ডো বিন্যাসটিকে "মনে রাখে"।
অপশন দিয়ে চালান -run
- স্ক্রিপ্টটি সর্বশেষ স্মরণে রাখা উইন্ডো বিন্যাসটি পড়ে; এটি সম্পর্কিত অ্যাপ্লিকেশনগুলি শুরু করে, উইন্ডোগুলির সাহায্যে স্মরণে রাখা পজিশনে সরিয়ে দেয়
wmctrl
স্ক্রিপ্টটি সেই ফাইলগুলি মনে রাখে না যা সম্ভবত উইন্ডোগুলিতে খোলা হতে পারে এবং (যেমন) ব্রাউজার উইন্ডোতে খোলা ওয়েবসাইটগুলি।
সমস্যা
সমন্বয় wmctrl
এবং Unity
কিছু বাগ, কয়েকটি উদাহরণ রয়েছে:
- উইন্ডো স্থানাঙ্ক হিসাবে
wmctrl
কিছুটা আলাদা করে পড়লে উইন্ডো অবস্থানের জন্য কিছুটা কমান্ড তৈরি করে , যেমনটি এখানে উল্লেখ করা হয়েছে । সুতরাং পুনরায় কল করা উইন্ডো অবস্থানগুলি মূল অবস্থান থেকে কিছুটা পৃথক হতে পারে।
wmctrl
কমান্ড একটু অনিশ্চিত কাজ করে উইন্ডোর প্রান্ত খুব কাছাকাছি হয় হয় Unity Launcher
বা প্যানেল।
wmctrl
প্লেসমেন্ট কমান্ডটি ভালভাবে কাজ করতে "ওয়ার্মস্পেসের সীমানার ভিতরে" মনে রাখা "উইন্ডোজগুলি সম্পূর্ণরূপে থাকা দরকার ।
কিছু অ্যাপ্লিকেশন একই উইন্ডোটিতে একটি নতুন ট্যাবে (পছন্দ মতো gedit
) ডিফল্টরূপে নতুন উইন্ডোজ খোলায় । আমি এটির জন্য স্থির করেছি gedit
, তবে আপনি যদি আরও ব্যতিক্রম খুঁজে পান তবে দয়া করে এটি উল্লেখ করুন।
এই পান্ডুলিপি
#!/usr/bin/env python3
import subprocess
import os
import sys
import time
wfile = os.environ["HOME"]+"/.windowlist"
arg = sys.argv[1]
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def check_window(w_id):
w_type = get("xprop -id "+w_id)
if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
return True
else:
return False
def get_res():
# get resolution and the workspace correction (vector)
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
res = [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
return [res, curr_vpdata]
app = lambda pid: subprocess.check_output(["ps", "-p", pid, "-o", "comm="]).decode("utf-8").strip()
def read_windows():
res = get_res()
w_list = [l.split() for l in get("wmctrl -lpG").splitlines()]
relevant = [[w[2],[int(n) for n in w[3:7]]] for w in w_list if check_window(w[0]) == True]
for i, r in enumerate(relevant):
relevant[i] = app(r[0])+" "+str((" ").join([str(n) for n in r[1]]))
with open(wfile, "wt") as out:
for l in relevant:
out.write(l+"\n")
def open_appwindow(app, x, y, w, h):
ws1 = get("wmctrl -lp"); t = 0
# fix command for certain apps that open in new tab by default
if app == "gedit":
option = " --new-window"
else:
option = ""
# fix command if process name and command to run are different
if "gnome-terminal" in app:
app = "gnome-terminal"
elif "chrome" in app:
app = "/usr/bin/google-chrome-stable"
subprocess.Popen(["/bin/bash", "-c", app+option])
# fix exception for Chrome (command = google-chrome-stable, but processname = chrome)
app = "chrome" if "chrome" in app else app
while t < 30:
ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
procs = [[(p, w[0]) for p in get("ps -e ww").splitlines() \
if app in p and w[2] in p] for w in ws2]
if len(procs) > 0:
time.sleep(0.5)
w_id = procs[0][0][1]
cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
cmd3 = "wmctrl -ir "+procs[0][0][1]+" -e 0,"+x+","+y+","+w+","+h
for cmd in [cmd1, cmd2, cmd3]:
subprocess.call(["/bin/bash", "-c", cmd])
break
time.sleep(0.5)
t = t+1
def run_remembered():
res = get_res()[1]
try:
lines = [l.split() for l in open(wfile).read().splitlines()]
for l in lines:
l[1] = str(int(l[1]) - res[0]); l[2] = str(int(l[2]) - res[1] - 24)
open_appwindow(l[0], l[1], l[2], l[3], l[4])
except FileNotFoundError:
pass
if arg == "-run":
run_remembered()
elif arg == "-read":
read_windows()
কিভাবে বসাব
আপনি শুরু করার আগে, নিশ্চিত হয়ে নিন যে wmctrl
এটি ইনস্টল রয়েছে:
sudo apt-get install wmctrl
তারপর:
- একটি খালি ফাইলে স্ক্রিপ্ট কপি, যেমন এটি সংরক্ষণ
recall_windows
মধ্যে ~/bin
। প্রয়োজনে ডিরেক্টরি তৈরি করুন। ডিরেক্টরিটি এখনও উপস্থিত না থাকলে source ~/.profile
ডিরেক্টরিটি তৈরি করার পরে চালনা করুন বা লগ আউট করুন। এটা এখন হবে$PATH
- স্ক্রিপ্টটি কার্যকর (()) করুন।
এখন কয়েক উইন্ডোজ, খুলতে gedit
, firefox
বা যাই হোক না কেন, এবং কমান্ডটি (কোন পথ উপসর্গ প্রয়োজন) দ্বারা টার্মিনালে স্ক্রিপ্ট পরীক্ষা সঞ্চালন করুন:
recall_windows -read
জানালাগুলো বন্ধ কর. এখন একটি টার্মিনাল চালান:
recall_windows -run
আপনার উইন্ডো সেটআপ এখন পুনরুদ্ধার করা উচিত
যদি সমস্ত ঠিকঠাক হয়, শর্টকাট কীগুলিতে দুটি কমান্ড যুক্ত করুন: চয়ন করুন: সিস্টেম সেটিংস> "কীবোর্ড"> "শর্টকাট"> "কাস্টম শর্টকাট"। "+" ক্লিক করুন এবং কমান্ডগুলি যুক্ত করুন:
recall_windows -read
এবং
recall_windows -run
দুটি ভিন্ন শর্টকাট কী