নির্দিষ্ট ভিউপোর্ট এবং অবস্থানের জন্য কোনও অ্যাপ্লিকেশন উইন্ডো খোলার জন্য কোনও স্ক্রিপ্ট (বা সফ্টওয়্যার) আছে?


8

সুতরাং, ইউনিটিতে আমার 8 টি ভার্চুয়াল ডেস্কটপ রয়েছে (কমিজের সাথে) কারণ আমার একাধিক প্রকল্প রয়েছে যা আমি একই সাথে কাজ করছি।

সমস্যাটি হ'ল, প্রতিবার যখন Chrome পুনরায় বুট করতে বা দুর্ঘটনাক্রমে ক্রোম বন্ধ করতে হবে (যা আমার কাজের জন্য প্রয়োজনীয় উইন্ডোগুলির একটি বড় অংশ গঠন করে) আমাকে নিজেই সেই উইন্ডোজগুলি আবার খুলতে হবে এবং তারপরে সেগুলি সেট আপ করতে হবে (ফাইলগুলি খুলুন, সঠিক দিকে যান) url ইত্যাদি)।

আপনি কীভাবে এমন কোনও স্ক্রিপ্ট লিখতে যাবেন যা আমার জন্য সব করবে? এটি: 1) উইন্ডোজ খুলুন 2) এগুলি সঠিক ভার্চুয়াল স্ক্রিনে সঠিক স্থানাঙ্কে রাখুন

(1) সুস্পষ্ট, গুগল ক্রোমের জন্য আপনি কেবল 'গুগল-ক্রোম' চালান। তবে কীভাবে আপনি এটি সঠিক জায়গায় রাখবেন? (2)

বা এমন কোনও স্ক্রিপ্ট / সফ্টওয়্যার রয়েছে যা ইতিমধ্যে উপস্থিত রয়েছে যা আমার জন্য এটি করবে?


শুরুতে যথাযথ ডেস্কটপগুলিতে আপনার যা প্রয়োজন উইন্ডো রাখার জন্য আমি কোনও স্ক্রিপ্ট সমঝোতার চেষ্টা করতে পারি, আমাকে কয়েক দিন সময় লাগতে পারে, কারণ পরের সপ্তাহে আমার ফাইনাল আসছে। এটি এতে জড়িত থাকবে wmctrl, যা স্ক্রিপ্ট বা টার্মিনালের মাধ্যমে উইন্ডো নিয়ন্ত্রণ করার জন্য একটি সফ্টওয়্যারের মতো। তবে উইন্ডোটি পুনঃসূচনা করার ক্ষেত্রে, এটি কিছুটা চ্যালেঞ্জের কিছু হতে পারে
সের্গি কলডিয়াজহনি

যদিও আপনি specificallyক্য সম্পর্কে বিশেষভাবে জিজ্ঞাসা করেছেন, তবে এটি লক্ষণীয় যে কে-কে-কে একটি (বেশিরভাগ অননুমোদিত) প্রোগ্রাম রয়েছে যা আপনার জন্য এটি করে k এটি কেডিএ প্রোগ্রামগুলির সাথে সবচেয়ে ভাল কাজ করে তবে অন্যান্য প্রোগ্রামগুলির সাথে কিছুটা সাফল্যও রয়েছে।
জো

উত্তর:


14

এটি খুব ভালভাবে করা যেতে পারে তবে আপনার ইউনিটি / ভিউপোর্টগুলি সম্পর্কে কিছুটা বোঝাপড়া দরকার। আমি আশা করি নীচের গল্পটি বোধগম্য, যদি না হয় তবে একটি মন্তব্য করুন 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. স্ক্রিপ্টটি কীভাবে ব্যবহার করবেন

নীচের স্ক্রিপ্টটি আপনার ভার্চুয়াল (স্প্যানিং) ওয়ার্কস্পেসে কোনও অ্যাপ্লিকেশনের নতুন উইন্ডো স্থাপন করতে ব্যবহার করা যেতে পারে।

  1. wmctrlইনস্টল করা আছে তা নিশ্চিত করুন :

    sudo apt-get install wmctrl
    
  2. নীচের স্ক্রিপ্টটি একটি খালি ফাইলে অনুলিপি করুন, এটি setwindow(কোনও প্রসার নেই) হিসাবে এটি সংরক্ষণ করুন ~/bin। ডিরেক্টরিটি উপস্থিত না থাকলে এটি তৈরি করুন। স্ক্রিপ্ট এক্সিকিউটেবল করুন

  3. যদি আপনি সবে তৈরি করেছেন ~/bin, হয় source ~/.profileডিরেক্টরিটি উপলব্ধ করতে কমান্ডটি চালান বা লগ আউট / ইন করুন $PATH
  4. কমান্ড চালানোর পরীক্ষা করুন:

    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, 20300x3005

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"

@ স্নিটকো সুন্দর প্রশ্নের জন্য ধন্যবাদ, এটি করা একটি দুর্দান্ত চ্যালেঞ্জ ছিল :)
জ্যাকব ভিলিজ

আমি লক্ষ্য করেছি যে আমি যখন স্ক্রিপ্টটি ব্যবহার করছি তখন উইন্ডোটির জন্য সামান্য অফসেট রয়েছে। সুতরাং, উদাহরণস্বরূপ, যদি আমি 0 0 স্থানাঙ্কে খুলি, এটি আসলে এটি ডান এবং নীচে থেকে কিছুটা বেশি খুলবে (একটি ~ 10px অফসেট)। ঠিক আছে, তবে সমস্যাটি আসলে দ্বিতীয় স্ক্রিপ্টের সাথে: দ্বিতীয় স্ক্রিপ্টের অফসেটটি আনুভূমিক অক্ষের সাথে অদ্ভুতভাবে বৃহত্তর। আমি মনে করি এটি বাম দিকে প্রায় 50 ডলার x আপনি দেখতে পাচ্ছেন কেন? নেতিবাচক স্থানাঙ্ক স্থাপন সে ক্ষেত্রে সহায়তা করে না।
স্নিটকো

আরেকটি প্রশ্ন: আমি কীভাবে একটি উইন্ডো পূর্ণস্ক্রিন খুলব?
স্নিটকো

একটি আপডেট: দ্বিতীয় স্ক্রিপ্টের ক্ষেত্রে অফসেটটি বামদিকে unityক্য ডকের প্রস্থের সমান বলে মনে হচ্ছে (যদিও এটি লুকিয়ে রয়েছে)।
স্নিটকো

আগ্রহীদের জন্য, আমি ডেস্কটপেন প্রয়োগ করেছি: github.com/snitko/desktopen
snitko

1

এটি উপরে কিছুটা পরিবর্তিত setwindowস্ক্রিপ্টের সাথে @ জ্যাকব ভিলিজিমের দুর্দান্ত উত্তরে প্রসারিত হয়েছে :

#!/usr/bin/env python

import time
import argparse
import subprocess

DEFAULT_WIDTH = '1920'
DEFAULT_HEIGHT = '1080'


def get_window_list():
    window_list = subprocess.check_output(['/bin/bash', '-c', 'wmctrl -l'])
    parsed_list = []
    for line in window_list.splitlines():
        window_info = line.split()
        if window_info[1] != '-1':
            parsed_list.append(window_info[0])
    return parsed_list


def main(params):
    old_list = get_window_list()
    subprocess.Popen(['/bin/bash', '-c', params.command])

    def get_diff(old):
        new_list = get_window_list()
        return list(set(new_list) - set(old))

    diff = get_diff(old_list)
    x = 0
    while not diff:
        if x == 10:
            print 'window not found'
            return
        x += 1
        diff = get_diff(old_list)
        time.sleep(1)
    if len(diff) > 1:
        raise Exception(diff)
    window_id = diff[0]
    command_list = []
    command_list.append('wmctrl -ir %s -t %s' % (window_id, params.desktop))
    command_list.append('wmctrl -ir %s -b remove,maximized_horz,maximized_vert'
        % window_id)
    command_list.append('wmctrl -ir %s -e 0,%s,%s,%s,%s' %
        (window_id, params.x_pos, params.y_pos, params.width, params.height))
    for command in command_list:
        subprocess.call(['/bin/bash', '-c', command])

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('command', type=str)
    parser.add_argument('-d', '--desktop', default='0', type=str)
    parser.add_argument('-x', '--x-pos', default='0', type=str)
    parser.add_argument('-y', '--y-pos', default='0', type=str)
    parser.add_argument('-w', '--width', default=DEFAULT_WIDTH, type=str)
    parser.add_argument('-t', '--height', default=DEFAULT_HEIGHT, type=str)
    args = parser.parse_args()
    main(args)

পরিবর্তনগুলির বর্ণনা:

  1. python3থেকে python(শুধু একটি ব্যক্তিগত পছন্দ)
  2. sys.argvথেকে argparseআরও ভালো কমান্ড লাইন ইন্টারফেসের জন্য
  3. কড়া উইন্ডো আইডি (এবং প্রক্রিয়া আইডি নয়) উইন্ডো পার্সিং
    • কিছু প্রোগ্রাম একাধিক উইন্ডোর জন্য একটি একক প্রক্রিয়া আইডি ব্যবহার করে
  4. while লুপ 0.5 দ্বিতীয় থেকে 1 সম্পূর্ণ দ্বিতীয় ঘুমের সময়
  5. আরও ভার্বোস / পঠনযোগ্য ভেরিয়েবলের নাম এবং পিপ 8 আনুগত্য
  6. xrandrনির্ভরতার পরিবর্তে পর্দার আকারের জন্য গ্লোবাল ধ্রুবক পরিবর্তনশীল

দ্রষ্টব্য: এটি একটি সামান্য উন্নত সংস্করণ যা আমি দেবিয়ান জেসি এলএক্সডিএতে ব্যক্তিগত ব্যবহারের জন্য লিখেছিলাম। আপনার ফলাফল বিভিন্ন হতে পারে।


0

আগ্রহীদের জন্য, আমি ডেস্কটপেন প্রয়োগ করেছি: github.com/snitko/desktopen

এটি আপনাকে খুব বন্ধুত্বপূর্ণ উপায়ে বিভিন্ন ভিউপোর্ট এবং ডিসপ্লেতে উইন্ডো খোলার জন্য একটি স্ক্রিপ্ট লিখতে দেয়।

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