मैं पूर्व-परिभाषित विंडो आकार और स्थिति के साथ एक आवेदन कैसे शुरू कर सकता हूं?


22

मैं सोच रहा हूं कि क्या इसके बजाय टर्मिनल कमांड का उपयोग करके एकता में Ctrl-Alt-Keypad शॉर्टकट के प्रभाव को प्राप्त करने का कोई तरीका है? मैं एक कमांड चाहता हूं जो स्क्रीन के आधे आकार के लिए एक गुई विंडो सेट करता है, या तो बाएं या दाएं संरेखित।

पृष्ठभूमि के अनुसार, मैं एक स्क्रिप्ट लिख रहा हूं जो लॉग इन करने के बाद चलती है। यह जिनेटी का उपयोग यह पूछने के लिए करती है कि मैं अपना विकास परिवेश (GVim और IPython अगल-बगल) खोलना चाहता हूं या नहीं। मैं का उपयोग करके इन कार्यक्रमों के लिए दो समान आकार की खिड़कियों को प्राप्त करने के प्रयास कर रहे हैं set lines= columns=में मेरी .gvimrcऔर c.IPythonWidget.width =और c.IPythonWidget.height =मेरे में ipython_qtconsole_config.py। हालांकि, इस दृष्टिकोण से जुड़ी समस्याएं हैं।


मैंने अपने उत्तर को अपडेट किया क्योंकि यह विषय को विवरण में पर्याप्त नहीं बताता है, आप अपडेट की जांच करना चाहते हैं
कोस

जवाबों:


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

    यहाँ छवि विवरण दर्ज करें

  • Inkscape को कॉल करने के लिए, इसकी विंडो को स्क्रीन के बाईं / ऊपरी तिमाही में रखें:

    <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. यदि हां, तो यह आपके तर्कों के अनुसार आकार और स्थिति निर्धारित करता है। मामले में एक आवेदन appr के भीतर "शो" नहीं करता है। 15 सेकंड, स्क्रिप्ट मानता है कि एप्लिकेशन त्रुटि के कारण नहीं चलेगा। इसके बाद स्क्रिप्ट नई विंडो की असीम प्रतीक्षा करने से रोकती है।

छोटी सी बात

एकता में, जब आप (पुनः) स्थिति और (पुनः) wmctrlया तो एक खिड़की को आकार देते हैं या xdotool, खिड़की हमेशा आपकी स्क्रीन की सीमाओं के लिए एक छोटे से मर्ज को रखेगी, जब तक कि आप इसे 100% पर सेट न करें। आप ऊपर की छवि (3) में देख सकते हैं; हालांकि inkscapeविंडो को xस्थिति 0 पर रखा गया था , फिर भी आप यूनिटी लॉन्चर और inkscapeविंडो के बीच मामूली अंतर देख सकते हैं।


प्रिय जैकब, यह एक शानदार स्क्रिप्ट है! एक प्रश्न: मैं एक खुली खिड़की के आयाम को बाद में स्क्रिप्ट के साथ कैसे उपयोग कर सकता हूं?
ओरसिचो

Hi @orschiro मुझे एक मीटिंग के लिए दौड़ना है ... कुछ घंटों में वापस आ जाएगा :)
याकूब Vlijm

1
Hi @orschiro, यह मानते हुए कि आपने wmctrlस्थापित किया है, कमांड: wmctrl -lG | grep <windowname>आपको एक आउटपुट दिखाएगा जैसे 0x03600e4f 0 723 197 1114 563 jacob-System-Product-Name dimkeyboard.sh (~/Bureaublad) - gedit:। इस आउटपुट में, 3rd से 6th कॉलम आयाम, x, y, चौड़ाई, चौड़ाई, ऊंचाई दिखाते हैं।
जैकब व्लिजम

बहुत सराहना की जैकब! मुझे लगता है कि मैंने किया सेटअप सही लेकिन संबंधित विंडो अब पूर्ण-स्क्रीन में खुलती है। कोई विचार?
ओरसिचो

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])</ pre> <edit> यह उस कोड को प्रारूपित करने से इंकार करता है। </ edit>
रॉन थॉम्पसन

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अधिक के लिए एक नज़र है ।


मैंने उसके लिए एक स्क्रिप्ट लिखी है। मैं एकता का उपयोग नहीं करता, इसलिए मैं गारंटी नहीं दे सकता कि यह इसके साथ काम करेगा, लेकिन मुझे कोई कारण नहीं दिखता है। यह जरूरत है 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>

* <कीपैड_की_वायु> = नीचे की सूची में कीपैड की वैल्यू

GUI प्रोग्राम चलाने के लिए और इसकी Xविंडो में कीस्ट्रोक भेजें (जो इस स्थिति में xdotoolकमांड निष्पादन के समय सक्रिय विंडो है ) आप चला सकते हैं:

<command> && window="$(xdotool getactivewindow)" xdotool key --delay <delay> --window "$window" <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, टर्मिनल के अंदर अपने मूल्य को आउटपुट करने के लिए कुंजी को चला और मारा जा सकता है ।


क्या हमारे संपादन में कुछ गड़बड़ है?
टिम

@ नहीं नहीं, कम से कम अंतिम पंक्ति को हटाने का नहीं, जो मैं मानता हूं कि यह बहुत ही बेकार है, लेकिन एक कमांड के भीतर क्या भिन्न हो सकता है मेरी राय में बेहतर स्वरूपित किया गया है यदि कोण कोष्ठक में संलग्न किया गया है, जो भाषा सिद्धांत में मानक संकेतन है एक वाक्यात्मक श्रेणी (आपके संपादन का जिक्र करते हुए) और मुझे लगता है कि एक कमांड नाम यह बेहतर स्वरूपित है यदि बैकटिक्स में संलग्न है, तो तुरंत इस तरह से पहचाना जाए (एबी के संपादन का उल्लेख करते हुए); ध्यान दें कि यह सब मेरे सिर के ऊपर से नहीं है, मुझे पहले से संदेह था और मैंने मेटा पर यह पूछा
kos

हाँ, यह अब जैसा है ठीक है :) <> मानक है, और मैं किसी भी कमांड के आसपास `` के लिए जाता हूँ :)
टिम

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 बाएँ या दाएँ या अधिकतम है; और window_name लक्ष्य विंडो का नाम (या यह नाम का एक अंश) है।

उदाहरण के लिए:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.