এটি খুব ভালভাবে করা যেতে পারে তবে আপনার ইউনিটি / ভিউপোর্টগুলি সম্পর্কে কিছুটা বোঝাপড়া দরকার। আমি আশা করি নীচের গল্পটি বোধগম্য, যদি না হয় তবে একটি মন্তব্য করুন leave
নীচের স্ক্রিপ্টটি যদি আপনি সঠিক যুক্তি দিয়ে চালনা করেন তবে কোনও ভিউপোর্টে, যে কোনও অবস্থানে কোনও অ্যাপ্লিকেশনটির উইন্ডো খুলতে ব্যবহার করা যেতে পারে । স্ক্রিপ্ট তার সম্পাদিত সংস্করণ এই এক , কিন্তু এখন স্থান জানালা প্রস্তুত spanning ভার্চুয়াল ডেস্কটপ ।
1. ভিউপোর্ট এবং উইন্ডো সমন্বয়গুলি বোঝা
ওয়ার্কস্পেস ইন ইউনিটিতে
ইউনিটিতে, অন্যান্য উইন্ডো পরিচালকদের থেকে ভিন্ন, আপনার কাছে কেবলমাত্র একটি স্প্যানিং ওয়ার্কস্পেস রয়েছে, যা ভিউপোর্টগুলিতে বিভক্ত। আপনার ক্ষেত্রে, আপনার কর্মক্ষেত্রটি আটটি ভিউপোর্টে বিভক্ত।
উইন্ডোজের অবস্থান কীভাবে সংজ্ঞায়িত করা হয়
কমান্ডের আউটপুট হিসাবে উইন্ডো অবস্থান:
wmctrl -lG
(you need to have wmctrl installed to run the command)
বর্তমান ভিউপোর্টের উপরের বাম কোণে আপেক্ষিকভাবে অবস্থান হিসাবে বর্ণনা করা হয়েছে :
তাই আপনি যদি ভিউপোর্ট উপর 1
:
ভিউপোর্ট 2 একটি উইন্ডোতে 1700 যেমন উপর স্থান হতে পারেনি (এক্স-জ্ঞানী) x 500 (Y-অনুযায়ী)
(আমার পর্দা 1680x1050 হয়)
তবে, আপনি ভিউপোর্ট 6 এ থাকলে:
একই উইন্ডোটি 20 (x), -550 (y) এ অবস্থান করবে
নীচের বর্ণিত হিসাবে সঠিকভাবে আর্গুমেন্ট সহ স্ক্রিপ্টটি চালানো এই স্থানাঙ্কগুলি সঠিকভাবে ব্যবহার করা গুরুত্বপূর্ণ:
2. স্ক্রিপ্টটি কীভাবে ব্যবহার করবেন
নীচের স্ক্রিপ্টটি আপনার ভার্চুয়াল (স্প্যানিং) ওয়ার্কস্পেসে কোনও অ্যাপ্লিকেশনের নতুন উইন্ডো স্থাপন করতে ব্যবহার করা যেতে পারে।
wmctrl
ইনস্টল করা আছে তা নিশ্চিত করুন :
sudo apt-get install wmctrl
নীচের স্ক্রিপ্টটি একটি খালি ফাইলে অনুলিপি করুন, এটি setwindow
(কোনও প্রসার নেই) হিসাবে এটি সংরক্ষণ করুন ~/bin
। ডিরেক্টরিটি উপস্থিত না থাকলে এটি তৈরি করুন। স্ক্রিপ্ট এক্সিকিউটেবল করুন ।
- যদি আপনি সবে তৈরি করেছেন
~/bin
, হয় source ~/.profile
ডিরেক্টরিটি উপলব্ধ করতে কমান্ডটি চালান বা লগ আউট / ইন করুন $PATH
।
কমান্ড চালানোর পরীক্ষা করুন:
setwindow <application> <x_position> <y_position> <horizontal_size> <vertical_size>
যেমন
setwindow gedit 100 100 200 200
একটি জেডিট উইন্ডো বর্তমান ভিউপোর্টে প্রদর্শিত হবে।
মন্তব্য:
- মনে রাখবেন যে সমস্ত অ্যাপ্লিকেশনগুলি নির্দিষ্ট প্রস্থ বা উচ্চতার নীচে উইন্ডো আকারের মঞ্জুরি দেয় না।
gedit
আমার সিস্টেমে উইন্ডোর সর্বনিম্ন প্রস্থ যেমন অ্যাপ্লিকেশন। 470 পিক্সেল।
- স্ক্রিপ্টটি কেবলমাত্র সূক্ষ্মভাবে কাজ করে যদি পুরো উইন্ডোটি টার্গেটেড ভিউপোর্টে ফিট করে, সেই অনুযায়ী আপনার স্থানাঙ্ক / আকার চয়ন করুন। এছাড়াও মনে রাখবেন যে ইউনিটি লঞ্চার এবং প্যানেল কিছু স্থান (!) ব্যবহার করে যা উইন্ডোর অবস্থানকে প্রভাবিত করতে পারে।
<x_position>
বর্তমান ভিউপোর্টের বামে উইন্ডোজ স্থাপন করতে নেতিবাচক ব্যবহার করুন
<y_position>
বর্তমান ভিউপোর্টের (গুলি) এর উপরে উইন্ডোজ স্থাপন করতে নেতিবাচক ব্যবহার করুন
একবারে বিভিন্ন ভিউপোর্টে নতুন উইন্ডো খোলার জন্য, আপনি কেবল কমান্ড চেইন করতে পারেন। "লং স্টোরি" উদাহরণটিতে ভিউপোর্ট সেটআপটি দেখে, আমি যদি ভিউপোর্ট 1 এ থাকি, আমি কমান্ডটি দিয়ে ভিউপোর্ট 1, 2, 3 এবং 4 এ জেডিট উইন্ডো খুলতে পারি:
setwindow gedit 100 100 200 200&&setwindow gedit 1780 100 200 200&&setwindow gedit 3460 100 200 200&&setwindow gedit 5140 100 200 200
এই পান্ডুলিপি
#!/usr/bin/env python3
import subprocess
import time
import sys
app = sys.argv[1]
get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8")
ws1 = get("wmctrl -lp"); t = 0
subprocess.Popen(["/bin/bash", "-c", app])
# 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:
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,"+sys.argv[2]+","+sys.argv[3]+","+sys.argv[4]+","+sys.argv[5]
for cmd in [cmd1, cmd2, cmd3]:
subprocess.call(["/bin/bash", "-c", cmd])
break
time.sleep(0.5)
t = t+1
সম্পাদনা: অলস সংস্করণ
যদি আপনি কেবল স্থানাঙ্ক এবং আকার সন্নিবেশ করতে পছন্দ করেন তবে কেবল আপনি বর্তমান ভিউপোর্টে একটি উইন্ডো খুলবেন এবং লক্ষ্যবস্তু ভিউপোর্টটিকে একটি আর্গুমেন্ট হিসাবে (কোনও কিছু গণনা না করে) দেবেন, তবে নীচের সংস্করণটি ব্যবহার করুন ...
আপনি যদি স্ক্রিপ্টের প্রথম সংস্করণের মতো সেট আপ করেন তবে আপনি এটি কমান্ড দিয়ে চালাতে পারেন:
setwindow <application> <x_position> <y_position> <horizontal_size> <vertical_size> <targeted_viewport>
একটি উদাহরণ: ভিউপোর্টে আকার , আকারে অবস্থিত একটি Google-Chrome
উইন্ডো খুলতে :20, 20
300x300
5
setwindow google-chrome 20 20 300 300 5
স্ক্রিপ্টের প্রথম সংস্করণটির মতো সেটআপটি বেশ একইরকম।
মনে রাখবেন যে এই স্ক্রিপ্টটি কেবলমাত্র সঠিকভাবে কাজ করে যদি সংজ্ঞায়িত উইন্ডো (অবস্থান / আকার) লক্ষ্যযুক্ত ভিউপোর্টের মধ্যে পুরোপুরি ফিট করে।
এই পান্ডুলিপি:
#!/usr/bin/env python3
import subprocess
import time
import sys
app = sys.argv[1]
target_vp = int(sys.argv[6])
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
res = get_res()
def current(set_vp):
# get the current viewport
vp_data = subprocess.check_output(
["wmctrl", "-d"]
).decode("utf-8").split()
dt = [int(n) for n in vp_data[3].split("x")]
cols = int(dt[0]/res[0])
rows = int(dt[1]/res[1])
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
curr_col = int(curr_vpdata[0]/res[0])
curr_row = int(curr_vpdata[1]/res[1])
curr_vp = curr_col+curr_row*cols+1
# calculate the vector to the origin from the current viewport (in resolution units)
vec_curr = vector(curr_vp, cols)
# calculate the vector to the origin from the targeted viewport
vec_set = vector(set_vp, cols)
# calculate the vector between current and targeted viewport
vec_relative = [vec_set[0] - vec_curr[0],
vec_set[1] - vec_curr[1]]
# calculate needed correction (absolute)
relative = [vec_relative[0]*res[0],
vec_relative[1]*res[1]]
return relative
def vector(vp, cols):
rem = vp%cols
vec_x = rem-1 if rem != 0 else cols-1
vec_y = int((vp-1)/cols)
return [vec_x, vec_y]
res = get_res() # nieuw
get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8")
ws1 = get("wmctrl -lp"); t = 0
# check for additional arguments to run the application
try:
subprocess.Popen(["/bin/bash", "-c", app+" "+sys.argv[7]])
except IndexError:
subprocess.Popen(["/bin/bash", "-c", app])
# 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:
w_id = procs[0][0][1]
cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
# calculate the correction, related to the current workspace, marge for launcher and panel
pos_x = int(sys.argv[2]); pos_y = int(sys.argv[3]); x_marge = 65; y_marge = 35
pos_x = pos_x if pos_x > x_marge else x_marge; pos_y = pos_y if pos_y > y_marge else y_marge
x_relative = pos_x+current(target_vp)[0]
y_relative = pos_y+current(target_vp)[1]
# correct possible inaccurately set width / height
x_size = res[0]; y_size = res[1]
set_width = int(sys.argv[4]); set_height = int(sys.argv[5])
width = set_width if set_width+x_marge+pos_x < x_size else x_size - pos_x - x_marge
height = set_height if set_height+y_marge+pos_y < y_size else y_size - pos_y - y_marge
cmd3 = "wmctrl -ir "+w_id+" -e 0,"+str(x_relative)+","+str(y_relative)+","+str(width)+","+str(height)
for cmd in [cmd1, cmd2, cmd3]:
subprocess.call(["/bin/bash", "-c", cmd])
break
time.sleep(0.5)
t = t+1
আর্গুমেন্ট সহ অ্যাপ্লিকেশন উইন্ডো খোলার জন্য
কাজটি শেষ করতে আপনার প্রশ্নের পুরোপুরি উত্তর দেওয়া:
আপনি যদি স্ক্রিপ্টটি যেমন চালান তবে:
setwindow google-chrome 20 20 300 300 5
এটি লক্ষ্যযুক্ত ডেস্কটপে একটি ডিফল্ট উইন্ডো খুলবে ।
তবে স্ক্রিপ্টের সর্বশেষতম সংস্করণ সহ, আপনি অ্যাপ্লিকেশন উইন্ডোটি খোলার জন্য একটি অতিরিক্ত যুক্তি যুক্ত করতে পারেন , উদাহরণস্বরূপ :url
setwindow <application> <x_position> <y_position> <horizontal_size> <vertical_size> <targeted_viewport> <(optional)_argument>
উদাহরণ:
setwindow google-chrome 0 0 600 600 3 "--new-window http://askubuntu.com"
যদি (অতিরিক্ত) আর্গুমেন্টে স্পেস থাকে, উদ্ধৃতি ব্যবহার করুন। উপরের উদাহরণটি google-chrome
ভিউপোর্ট 3 এ উইন্ডোটি খুলবে এবং এটি খুলবে url
http://askubuntu.com
।
আপনি এক কমান্ডে বিভিন্ন ওয়ার্কস্পেসে একাধিক উইন্ডোজ / url খোলার জন্য কমান্ডগুলি শৃঙ্খলাবদ্ধ করতে পারেন, যেমন:
setwindow google-chrome 0 0 600 600 8 "--new-window http://askubuntu.com"&&setwindow google-chrome 0 0 600 600 7 "--new-window www.google.com"
wmctrl
, যা স্ক্রিপ্ট বা টার্মিনালের মাধ্যমে উইন্ডো নিয়ন্ত্রণ করার জন্য একটি সফ্টওয়্যারের মতো। তবে উইন্ডোটি পুনঃসূচনা করার ক্ষেত্রে, এটি কিছুটা চ্যালেঞ্জের কিছু হতে পারে