আমি কীভাবে একটি পূর্বনির্ধারিত উইন্ডোর আকার এবং অবস্থান সহ একটি অ্যাপ্লিকেশন শুরু করতে পারি?


22

আমি ভাবছি insteadক্যের পরিবর্তে টার্মিনাল কমান্ড ব্যবহার করে ইউনিটির Ctrl-Alt-Keypad শর্টকাটের প্রভাব অর্জন করার কোনও উপায় আছে? আমি একটি কমান্ড চাই যা গি উইন্ডোটিকে স্ক্রিনের অর্ধেক আকারে সেট করে, বাম বা ডানদিকে প্রান্তীকৃত করে।

ব্যাকগ্রাউন্ডের মাধ্যমে, আমি একটি স্ক্রিপ্ট লিখছি যা লগ ইন করার পরে চলে It আমি ব্যবহার করে এই প্রোগ্রামের জন্য দুইটি একই আকারের উইন্ডোজ অর্জন করার চেষ্টা করা হয়েছে set lines= columns=আমার .gvimrcএবং c.IPythonWidget.width =এবং c.IPythonWidget.height =আমার মধ্যে ipython_qtconsole_config.py। তবে এই পদ্ধতির সাথে সম্পর্কিত সমস্যা রয়েছে।


আমি আমার উত্তর আপডেট করেছি কারণ এটি বিষয়টিকে পর্যাপ্ত বিবরণে ব্যাখ্যা করে না, আপনি আপডেটটি পরীক্ষা করতে চাইতে পারেন
kos

উত্তর:


17

আপনি কি মধ্যে চালানো হবে

আপনি যদি প্রথমে কোনও অ্যাপ্লিকেশন কল করতে চান এবং তারপরে, তার উইন্ডোটি একটি নির্দিষ্ট অবস্থান এবং আকারের উপরে রাখুন, অ্যাপ্লিকেশনটি কল করার এবং উইন্ডোটি প্রকৃতপক্ষে উপস্থিত হওয়ার মুহুর্তের মধ্যে সময়টি অনির্দেশ্য। যদি আপনার সিস্টেমটি দখল করা থাকে তবে এটি নিষ্ক্রিয় হওয়ার চেয়ে তা উল্লেখযোগ্যভাবে দীর্ঘ হতে পারে।

উইন্ডোটি প্রদর্শিত হওয়ার পরে (তত্ক্ষণাত) পজিশনিং / আকার পরিবর্তন হয়েছে কিনা তা নিশ্চিত করার জন্য আপনার একটি "স্মার্ট" উপায় প্রয়োজন ।

কোনও অ্যাপ্লিকেশন কল করার জন্য স্ক্রিপ্ট, এটি উপস্থিত হওয়ার জন্য অপেক্ষা করুন এবং স্ক্রিনে এটি অবস্থান করুন

নীচের স্ক্রিপ্টের সাহায্যে আপনি একটি অ্যাপ্লিকেশন কল করতে পারেন এবং অবস্থান এবং আকারটি এটি কমান্ডের সাথে উপস্থিত হওয়া উচিত:

<script> <application> <x-position> <y-position> <h-size> <v-size>

কয়েকটি উদাহরণ:

  • gnome-terminalএর উইন্ডোটি কল এবং পুনরায় আকার দেওয়ার জন্য 50% এ ডানদিকে রেখে দিন:

    <script> gnome-terminal 840 0 50 100

    এখানে চিত্র বর্ণনা লিখুন

  • কল করতে gedit, তার উইন্ডোটি বামদিকে রাখুন এবং কল gnome-terminalকরুন, ডানদিকে রাখুন ( v-sizeউইন্ডোর মধ্যে এটি একটি সামান্য স্থান দেওয়ার জন্য এটির 46% নির্ধারণ করুন ):

    <script> gedit 0 0 46 100&&<script> gnome-terminal 860 0 46 100

    এখানে চিত্র বর্ণনা লিখুন

  • ইনস্কেপকে কল করতে, এর উইন্ডোটি স্ক্রিনের বাম / উপরের কোয়ার্টারে রাখুন:

    <script> inkscape 0 0 50 50

    এখানে চিত্র বর্ণনা লিখুন

স্ক্রিপ্ট এবং এটি কীভাবে ব্যবহার করবেন

  1. উভয় ইনস্টল করুন xdotoolএবং wmctrl। আমি উভয়ই ব্যবহার করেছি যেহেতু পুনরায় আকার wmctrlদেওয়ার ফলে (বিশেষত) কিছু বিচিত্রতা দেখা দিতে পারে Unity

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
  2. নীচের স্ক্রিপ্টটি একটি খালি ফাইলে অনুলিপি করুন, এটিকে setwindow(কোনও এক্সটেনশন নয়) হিসাবে সংরক্ষণ করুন ~/bin; প্রয়োজনে ডিরেক্টরি তৈরি করুন।
  3. স্ক্রিপ্টটি সম্পাদনযোগ্য (!) করুন
  4. আপনি যদি সবে তৈরি করেন তবে ~binচালান:source ~/.profile
  5. কমান্ড (যেমন) দিয়ে স্ক্রিপ্টটি পরীক্ষা করুন

    setwindow gnome-terminal 0 0 50 100

    অন্য কথায়:

    setwindow <application> <horizontal-position> <vertical-position> <horizontal-size (%)> <vertical-size (%)>

যদি সব ঠিকঠাক কাজ করে তবে আপনার প্রয়োজন যেখানেই কমান্ডটি ব্যবহার করুন।

এই পান্ডুলিপি

#!/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])

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 = "xdotool windowsize --sync "+procs[0][0][1]+" "+sys.argv[4]+"% "+sys.argv[5]+"%"
        cmd4 = "xdotool windowmove "+procs[0][0][1]+" "+sys.argv[2]+" "+sys.argv[3]
        for cmd in [cmd1, cmd2, cmd3, cmd4]:   
            subprocess.call(["/bin/bash", "-c", cmd])
        break
    time.sleep(0.5)
    t = t+1

এর মানে কি

লিপিটি যখন ডাকা হয় তখন এটি:

  1. অ্যাপ্লিকেশন শুরু
  2. উইন্ডো তালিকায় নজর রাখে (ব্যবহার করে wmctrl -lp)
  3. যদি একটি নতুন উইন্ডো উপস্থিত হয়, এটি নতুন উইন্ডোটি নামক অ্যাপ্লিকেশনটির সাথে সম্পর্কিত কিনা তা পরীক্ষা করে ( ps -ef wwউইন্ডোটির পিডটিকে অ্যাপ্লিকেশনটির পিডের সাথে তুলনা করে) ব্যবহার করে
  4. যদি তা হয় তবে এটি আপনার যুক্তি অনুসারে আকার এবং অবস্থান নির্ধারণ করে। যদি কোনও অ্যাপ্লিকেশন অ্যাপের মধ্যে "প্রদর্শন" না করে। 15 সেকেন্ড, স্ক্রিপ্ট ধরে নিয়েছে একটি ত্রুটির কারণে অ্যাপ্লিকেশনটি চলবে না। স্ক্রিপ্টটি অনন্তকালীনভাবে নতুন উইন্ডোটির জন্য অপেক্ষা করা রোধ করার জন্য বন্ধ করে দেয়।

গৌণ বিষয়

ইউনিটিতে, আপনি যখন (পুনরায়) অবস্থান এবং (পুনরায়) কোনটির সাহায্যে উইন্ডোটিকে আকার দেন wmctrlবা xdotool, উইন্ডোটি সর্বদা আপনার স্ক্রিনের সীমানায় একটি ছোট ম্যারেজ রাখে, আপনি যদি এটি 100% না করে সেট করেন। আপনি উপরের ছবিতে (3) দেখতে পাচ্ছেন; যখন inkscapeউইন্ডোতে স্থাপন করা হয় xঅবস্থান 0, আপনি কি এখনও ইউনিটি লঞ্চার মধ্যে একটি ছোটখাট কৃত্রিম মাখন দেখতে পারেন inkscapeউইন্ডো।


প্রিয় জ্যাকব, এটি একটি দুর্দান্ত স্ক্রিপ্ট! একটি প্রশ্ন: পরবর্তীকালে স্ক্রিপ্টের সাথে একসাথে ব্যবহার করার জন্য আমি কীভাবে একটি খোলা উইন্ডোটির মাত্রা পেতে পারি?
orschiro

হাই @orschiro আমাকে একটি সভার জন্য দৌড়াতে হবে ... কয়েক ঘন্টা পরে ফিরে আসবে :)
জ্যাকব ভিলিজ এম

1
হাই @orschiro অভিমানী আপনি আছে wmctrlইনস্টল কমান্ড প্রয়োগ করুন: wmctrl -lG | grep <windowname>আপনার মত একটি আউটপুট দেখাবে: 0x03600e4f 0 723 197 1114 563 jacob-System-Product-Name dimkeyboard.sh (~/Bureaublad) - gedit। এই আউটপুটে, তৃতীয় থেকে 6th ষ্ঠ কলামটি মাত্রা, x, y, প্রস্থ, প্রস্থ, উচ্চতা দেখায়।
জ্যাকব ভিলিজ এম

খুব প্রশংসা করেছেন জ্যাকব! আমি মনে করি আমি ঠিকঠাক সেটআপটি করেছি তবে সংশ্লিষ্ট উইন্ডোটি এখন পুরো স্ক্রিনে খোলে। কোন ধারনা?
orschiro

1
আমি এই স্ক্রিপ্টটি পছন্দ করেছি, তবে এটি আমার জন্য কাজ করার জন্য আমাকে প্রথম ব্লকে নিম্নলিখিত পরিবর্তনগুলি করতে হয়েছিল, কারণ আমি অ্যাপ্লিকেশনটিতে পরামিতি যুক্ত করেছি: appAndParams = sys.argv[1] app = appAndParams[0].split(' ', 1)[0] get = lambda x: subprocess.check_output(["/bin/bash", "-c",x]).decode("utf-8") ws1 = get("wmctrl -lp"); t = 0 subprocess.Popen(["/bin/bash", "-c", appAndParams])</ translation> <সম্পাদনা> এটি কোডটি ফর্ম্যাট করতে অস্বীকার করেছে </ </ translation>
রন থম্পসন

3

আপনি যে আসল কমান্ডটি চান তা হ'ল কিছু

wmctrl -r :ACTIVE: -b add,maximized_vert && 
wmctrl -r :ACTIVE: -e 0,0,0,$HALF,-1

এটি বর্তমান উইন্ডোটিকে অর্ধেক পর্দা নিতে ( $HALFআপনার পর্দার মাত্রায় পরিবর্তন করবে) এবং বাম দিকে স্ন্যাপ করবে। ডানদিকে স্ন্যাপ করতে, ব্যবহার করুন

wmctrl -r :ACTIVE: -b add,maximized_vert && 
wmctrl -r :ACTIVE: -e 0,$HALF,0,$HALF,-1 

আপনি wmctrlযে উইন্ডোগুলিতে আগ্রহী সেগুলি ব্যবহার না করে আইডি পেতে আপনি খেলতেও পারেন :ACTIVE:। আমি সেখানে সাহায্য করতে পারি না যেহেতু এটি প্রশ্নযুক্ত উইন্ডোগুলির উপর নির্ভর করে। কটাক্ষপাত আছে man wmctrlআরো অনেক কিছুর জন্য।


আমি এর জন্য একটি স্ক্রিপ্ট লিখেছি। আমি ityক্য ব্যবহার করি না তাই আমি গ্যারান্টি দিতে পারি না যে এটি এর সাথে কাজ করবে, তবে কেন করার কোনও কারণ আমি দেখতে পাচ্ছি না। দরকার wmctrl, xdpyinfoএবং disperইনস্টল করার জন্য:

sudo apt-get install wmctrl x11-utils disper

তারপরে, নীচের স্ক্রিপ্টটিকে সে হিসাবে সংরক্ষণ করুন ~/bin/snap_windows.sh, এটির সাথে এক্সিকিউটেবল করুন chmod a+x ~/bin/snap_windows.shএবং আপনি চালাতে পারেন

snap_windows.sh r

ডানদিকে স্ন্যাপ করতে। lবাম দিকের জন্য ব্যবহার করুন এবং উইন্ডোটি সর্বাধিকতর করতে কোনও আর্গুমেন্ট। নোট করুন যে এটি বর্তমান উইন্ডোতে চলেছে সুতরাং আপনি যদি এটি টার্মিনাল ছাড়া অন্য কোনও কিছুতে চালাতে চান তবে আপনাকে এটিতে একটি শর্টকাট বরাদ্দ করতে হবে।

আপনি যা চেয়েছিলেন তার চেয়ে স্ক্রিপ্টটি কিছুটা জটিল কারণ আমি এটি একক এবং দ্বৈত-মনিটরের উভয় সেটআপে কাজ করার জন্য লিখেছি।

#!/usr/bin/env bash

## If no side has been given, maximize the current window and exit
if [ ! $1 ]
then
    wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz
    exit
fi

## If a side has been given, continue
side=$1;
## How many screens are there?
screens=`disper -l | grep -c display`
## Get screen dimensions
WIDTH=`xdpyinfo | grep 'dimensions:' | cut -f 2 -d ':' | cut -f 1 -d 'x'`;
HALF=$(($WIDTH/2));

## If we are running on one screen, snap to edge of screen
if [ $screens == '1' ]
then
    ## Snap to the left hand side
    if [ $side == 'l' ]
    then
        ## wmctrl format: gravity,posx,posy,width,height
    wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,0,0,$HALF,-1
    ## Snap to the right hand side
    else
    wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,$HALF,0,$HALF,-1 
    fi
## If we are running on two screens, snap to edge of right hand screen
## I use 1600 because I know it is the size of my laptop display
## and that it is not the same as that of my 2nd monitor.
else
    LAPTOP=1600; ## Change this as approrpiate for your setup.
    let "WIDTH-=LAPTOP";
    SCREEN=$LAPTOP;
    HALF=$(($WIDTH/2));
    if [ $side == 'l' ]
    then
        wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,$LAPTOP,0,$HALF,-1
    else
    let "SCREEN += HALF+2";
    wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,$SCREEN,0,$HALF,-1;
    fi
fi

3

আপনি এটি ব্যবহার করে করতে পারেন xdotool

ইনস্টল xdotoolকরতে আপনি চালাতে পারেন:

sudo apt-get update && sudo apt-get install xdotool

তারপরে টার্মিনাল উইন্ডোতে একটি Ctrl+ Alt+ <keypad_key>কীস্ট্রোক প্রেরণ Xকরতে আপনি চালাতে পারেন:

xdotool key Ctrl+Alt+<keypad_key_value>

* <keypad_key_value> = নীচে তালিকায় কিপ্যাড কী এর মান

একটি জিইউআই প্রোগ্রাম চালানোর জন্য এবং এর Xউইন্ডোতে কীস্ট্রোকটি প্রেরণ করতে (যা এই ক্ষেত্রে xdotoolকমান্ড কার্যকর করার সময় সক্রিয় উইন্ডো ) আপনি চালাতে পারেন:

<command> && window="$(xdotool getactivewindow)" xdotool key --delay <delay> --window "$window" <keypad_key_value>

* <কম্যান্ড> = কমান্ড যা আপনি কীস্ট্রোকটি প্রেরণ করতে চান উইন্ডোটি খুলবে; <delay> = কীস্ট্রোক প্রেরণের আগে মিলিসেকেন্ডে অপেক্ষা করার সময়; <keypad_key_value> = নীচে তালিকায় কিপ্যাড কী এর মান

লক্ষ্য করুন যে বেশিরভাগ ক্ষেত্রে আপনাকে যে কমান্ডটি এককভাবে প্রক্রিয়া হিসাবে জারি করা হচ্ছে তা চালানো দরকার ( উদাহরণস্বরূপ উপরের উদাহরণের nohup <command> &পরিবর্তে দৌড় <command>দিয়ে), অন্যথায় কার্যকর xdotoolনা হওয়া পর্যন্ত চালানো হবে না <command>

এছাড়াও আপনাকে কিছুটা বিলম্ব সেট করতে হবে, অন্যথায় লক্ষ্য উইন্ডোটি পুরোপুরি লোড হওয়ার আগে কীস্ট্রোকটি প্রেরণ করা হবে X(প্রায় বিলম্বটি করা 500msউচিত)।

এর জন্য সম্ভাব্য মানগুলি <keypad_key_value>:

  • 0: 90
  • 1: 87
  • 2: 88
  • 3: 89
  • 4: 83
  • 5: 84
  • 6: 85
  • 7: 79
  • 8: 80
  • 9: 81

একটি থাম্ব নিয়ম হিসাবে, Xপরিবেশের মধ্যে কীবোর্ডের যে কোনও কী xevএর মান সন্ধান করতে, টার্মিনালের অভ্যন্তরে তার মান আউটপুট করার জন্য চালানো এবং চাপতে পারে।


আমাদের সম্পাদনায় কিছু ভুল আছে?
টিম

@ টিম না, অন্তত শেষ পংক্তিটি অপসারণ নয়, যা আমি সম্মত করেছিলাম যে এটি একেবারেই অব্যবহারযোগ্য নয়, তবে কোন কমান্ডের মধ্যে যা পরিবর্তিত হতে পারে তা কোষ বন্ধনীতে আবদ্ধ থাকলে আরও ভালভাবে ফর্ম্যাট করা যেতে পারে, যা ভাষা তত্ত্বের উল্লেখ করার জন্য আদর্শ নোটেশন একটি সিনট্যাকটিক বিভাগে (আপনার সম্পাদনার উল্লেখ করে) এবং আমি মনে করি যে কমান্ডের নামটি ব্যাকটিক্সে আবদ্ধ থাকলে তত্ক্ষণাত স্বীকৃত হওয়ার জন্য (এবি এর সম্পাদনা উল্লেখ করে) আরও ভাল ফর্ম্যাট করা হয়েছে; যে বিজ্ঞপ্তি এই সব না আমার মাথার উপরে বন্ধ আছে, আমি আগে সন্দেহ ছিল এবং আমি জিজ্ঞাসা করলাম এই মেটা উপর
কস

হ্যাঁ, এটি এখনকার মতো ঠিক আছে :) <> মানক এবং আমি কোনও আদেশের `` এর জন্য যাই :)
টিম

3

আমি একজন (চালু নামে Worksets আবেদন গড়ছে GitHub এটা এর ফ্রি এবং ওপেন সোর্স - আপনি একটি গ্রাফিকাল ইউজার ইন্টারফেসের মাধ্যমে সহজে এই কাজ করতে দেয় ইউনিটি জন্য)।

tTray মেনু

এটি মূলত এখানে wmctrl এবং xdotool সমাধানের উত্তর হিসাবে তালিকাভুক্ত সমাধানগুলির জন্য একটি মোড়ক, এবং এই জাতীয় সেটআপগুলি দ্রুত তৈরি এবং সংরক্ষণের একটি সহজ উপায় সরবরাহ করে।


1

আমি প্রতিনিধির জ্যাকব Vlijm এর চমৎকার পোস্টের সরাসরি মন্তব্য করতে হবে না, কিন্তু আমি (ব্যবহার করার জন্য প্রয়োজনীয় আর্গুমেন্ট সহ একটি আবেদন শুরু পারমিট স্ক্রিপ্ট পরিবর্তিত setwindowসঙ্গে gedit --new-window)। পরিবর্তন:

if app in p and w[2] in p] for w in ws2]

প্রতি:

if app.split()[0] in p and w[2] in p] for w in ws2]

0

আমি উপর থেকে টেরডনের স্ক্রিপ্টের সাথে প্রায় খেলেছি এবং কিছু নতুন জিনিস যুক্ত করেছি (মনিটরটি নির্বাচন করার এবং প্রতিটি মনিটরের জন্য উচ্চতা নির্ধারণ করার ক্ষমতা)। আমার মনে হয় আরও মনিটর যুক্ত করার ক্ষেত্রে এটি প্রসারণযোগ্য হবে। আশা করি অন্যরাও এটি কাজে লাগবে।

বেসিক সিনট্যাক্স:

prog_name monitor l/r/m window_name (optional)

যেখানে আপনি এই কোডটি সংরক্ষণ করেছেন যেমন নাম_নাম; মনিটর হ'ল মনিটর নম্বর যেমন 1 বা 2; l / r / m বাম বা ডান বা সর্বোচ্চ; এবং উইন্ডো নামটি লক্ষ্য উইন্ডোর নাম (বা এর নামের একটি ভগ্নাংশ)।

উদাহরণ:

setwindow 1 m chrome

বাশ স্ক্রিপ্ট

#!/usr/bin/env bash
set -e
#######################-    Early Definitions    -#######################

snap () {
    wmctrl -r ${WIN} -b toggle,add,maximized_vert && wmctrl -r ${WIN} -e 0,${WINX},0,${WINWIDTH},${WINHEIGHT}
    }

DISPLAYWIDTH=`xdpyinfo | grep 'dimensions:' | cut -f 2 -d ':' | cut -f 1 -d 'x'`;       ## Get screen dimensions
LEFTSCREENWIDTH=1024    ## user set
LEFTSCREENHEIGHT=720    ## user set
RIGHTSCREENHEIGHT=960   ## user set
let "RIGHTSCREENWIDTH=(DISPLAYWIDTH-LEFTSCREENWIDTH)"

#############################-    Logic    -#############################

if [ ! ${3} ]; then
    WIN=":ACTIVE:"
else
    WIN=${3}
fi
case ${1} in
    1)  # monitor one
        LEFT=0
        WINHEIGHT=${LEFTSCREENHEIGHT}
        let "WINWIDTH=LEFTSCREENWIDTH/2"
    ;;
    2)  # monitor two
        let "LEFT=LEFTSCREENWIDTH"
        WINHEIGHT=${RIGHTSCREENHEIGHT}
        let "WINWIDTH=RIGHTSCREENWIDTH/2"
    ;;
    "") # error please select a monitor
        echo "please select a monitor (1 or 2)"
        exit 0
    ;;
esac
case ${2} in
    l|L)
        WINX=${LEFT}
        snap
    ;;
    r|R)
        let "WINX=LEFT+WINWIDTH"
        snap
    ;;
    ""|m|M)
        WINX=${LEFT}
        let "WINWIDTH=WINWIDTH*2"
        snap
    ;;
esac

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