मैं कार्यक्षेत्रों को स्वचालित रूप से कैसे जोड़ सकता हूं, केवल अगर मुझे उनकी आवश्यकता है?


16

मान लें कि मैं 4 कार्यस्थानों का उपयोग कर रहा हूं और मुझे आकस्मिक रूप से अधिक आवश्यकता है, क्या एक स्वचालित प्रक्रिया है या, यदि असंभव है, तो संयोग से अधिक कार्यक्षेत्र (स्थापित करने Ubuntu tweakआदि के बजाय ) को जोड़ने का एक आसान तरीका है )।



@JacobVlijm imgur.com/LaDYwGb अपवोट और एक्सेप्टेड, सच में बहुत अच्छा जवाब देने के लिए धन्यवाद
कर्नेल_पैनीक

संबंधित: इस पुराने पोस्ट ने "स्वचालित रूप से अधिक कार्यस्थान कैसे बनाए / निकाले गए?" दो अलग-अलग उत्तरों के साथ। फिर से, नए उत्तरों की तुलना में पुराने उत्तर कम संतुष्ट होने की संभावना है।
क्लीमकमुरा

जवाबों:


14

स्वचालित रूप से कार्यस्थानों की संख्या निर्धारित करें; अपनी आवश्यकताओं के आधार पर कॉलम और पंक्तियों को जोड़ें और निकालें

यदि आप अपने कार्यक्षेत्र-मैट्रिक्स के अंतिम कॉलम या पंक्ति में प्रवेश करते हैं तो स्वचालित रूप से वर्कस्पेस जोड़ देगा (a) बैकग्राउंड स्क्रिप्ट के एक संस्करण के नीचे।

यह इस तरह काम करता है:

  1. यदि आप अंतिम कॉलम या पंक्ति पर पहुंचते हैं, तो अतिरिक्त व्यूपोर्ट जोड़े जाते हैं:

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

  2. यदि आपके कार्यस्थान 5-10 सेकंड के लिए अप्रयुक्त हैं और उस पर कोई विंडो नहीं है, तो अतिरिक्त कार्यस्थान फिर से हटा दिए जाएंगे। हालाँकि आप हमेशा एक अतिरिक्त पंक्ति नीचे रखेंगे, और आपके वर्तमान व्यूपोर्ट का एक अतिरिक्त स्तंभ दाईं ओर:

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

लिपी:

#!/usr/bin/env python3
import subprocess
import time
import math

# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10

def set_workspaces(size, axis):
    subprocess.Popen([
        "dconf", "write", "/org/compiz/profiles/unity/plugins/core/"+axis,
                str(size)
                ])

def get_res():
    resdata = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    curr = resdata.index("current")
    return (int(resdata[curr+1]), int(resdata[curr+3].replace(",", "")))

def wspace():
    try:
        sp = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
        return ([int(n) for n in sp[3].split("x")],
                [int(n) for n in sp[5].split(",")])

    except subprocess.CalledProcessError:
        pass


def clean_up(curr_col, curr_row):
    try:
        w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
        xpos = max([math.ceil((int(w[2])+span[1][0])/res[0]) for w in w_list])
        min_x = max(xpos, curr_col+1, hsize)
        if xpos >= hsize:
            set_workspaces(min_x, "hsize")
        else:
            set_workspaces(min_x, "hsize")
        ypos = max([math.ceil((int(w[3])+span[1][1])/res[1]) for w in w_list])
        min_y = max(ypos, curr_row+1, vsize)
        if ypos >= vsize:
            set_workspaces(min_y, "vsize")
        else:
            set_workspaces(min_y, "vsize")
    except subprocess.CalledProcessError:
        pass

res = get_res()
t = 0

while True:
    span = wspace()
    if span != None:
        cols = int(span[0][0]/res[0]); rows = int(span[0][1]/res[1])
        currcol = int((span[1][0]+res[0])/res[0])
        if all([currcol == cols, cols*rows < max_ws]):
            set_workspaces(cols+1, "hsize")
        currrow = int((span[1][1]+res[1])/res[1])
        if all([currrow == rows, cols*rows < max_ws]):
            set_workspaces(rows+1, "vsize")
        if t == 10:
            clean_up(currcol, currrow)
            t = 0
        else:
            t = t+1
        time.sleep(1)

कैसे इस्तेमाल करे

  1. नीचे दी गई स्क्रिप्ट को एक खाली फ़ाइल में कॉपी करें, इसे इस रूप में सहेजें add_space.py
  2. स्क्रिप्ट के मुख्य भाग में, यदि आप अन्य सेटिंग्स (कार्यस्थानों की अधिकतम संख्या, डिफ़ॉल्ट मैट्रिक्स जैसे 2x2) पसंद करते हैं, तो लाइनें संपादित करें:

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. टेस्ट- कमांड द्वारा इसे चलाएं:

    python3 /path/to/add_space.py
    
  4. यदि सब ठीक काम करता है, तो इसे अपने स्टार्टअप एप्लिकेशन में जोड़ें: डैश> स्टार्टअप एप्लिकेशन> कमांड जोड़ें:

    /bin/bash -c "sleep 15 &&  python3 /path/to/add_space.py`
    

ध्यान दें

हमेशा की तरह, स्क्रिप्ट बेहद "रस पर कम" है, और आपके प्रोसेसर पर कोई ध्यान देने योग्य भार नहीं जोड़ता है।

व्याख्या

नीचे दी गई कहानी थोड़ी जटिल है और ज्यादातर कोडिंग के बजाय अवधारणा और प्रक्रिया पर एक स्पष्टीकरण है । यदि आपकी रुचि हो तो ही पढ़ें।

आवश्यक कार्यस्थानों की गणना कैसे करें (उदाहरण कॉलम)

wmctrl -dजैसा दिखता है का आउटपुट :

0  * DG: 3360x2100  VP: 1680,1050  WA: 65,24 1615x1026  N/A

आउटपुट में, VP: 1680,1050हमें जानकारी देता है कि हम फैले हुए कार्यक्षेत्र (सभी व्यूपोर्ट का मैट्रिक्स) पर कहां हैं। यह जानकारी केवल तभी उपयोगी होती है जब हमारे पास स्क्रीन का रिज़ॉल्यूशन भी होता है, जैसे 1680कि दो की चौड़ाई हो सकती है (असंभावित, लेकिन फिर भी) या एक बार स्क्रीन।
सौभाग्य से, हम कमांड से स्क्रीन के रिज़ॉल्यूशन को पार्स कर सकते हैं xrandr

फिर अगर हमें पता है कि स्क्रीन का एक्स-आकार है 1680और हम वर्तमान में हैं VP: 1680,1050, तो हम जानते हैं कि हम कार्यक्षेत्र के मैट्रिक्स में दूसरे कॉलम पर हैं । चूंकि हम कुल मैट्रिक्स का आकार भी जानते हैं ( DG: 3360x2100, आउटपुट से भी wmctrl -d), हम जानते हैं कि वर्तमान मैट्रिक्स में दो कॉलम (3360/1680) शामिल हैं, और हम "अंतिम" एक पर हैं।

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

स्क्रिप्ट तब निर्देश द्वारा मैट्रिक्स में एक कॉलम जोड़ने के लिए एक निर्देश भेजेगा:

dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>

यह सिद्धांत है।

हटाने के लिए कार्यस्थानों की गणना कैसे करें (उदाहरण कॉलम)

10 सेकंड के बाद, स्क्रिप्ट कमांड के साथ वर्तमान में खोले गए सभी विंडोज़ को सूचीबद्ध करने के लिए कमांड चलाता है:

wmctrl -lG

यह हमें विंडो की स्थिति के बारे में भी जानकारी देता है, जैसे कि:

0x04604837  0 3425 24   1615 1026 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit

आउटपुट में, 3425विंडो की x- स्थिति है। यह आंकड़ा हालांकि वर्तमान कार्यक्षेत्र (बाईं ओर) के सापेक्ष है । कार्यक्षेत्र-मैट्रिक्स में विंडो (एक्स-वार) की पूर्ण स्थिति को जानने के लिए, हमें वर्तमान व्यूपोर्ट जानकारी (जैसे VP: 1680,1050आउटपुट से wmctrl -d) की पहली संख्या को जोड़ना होगा ।
चलो हालांकि, सादगी के कारणों के लिए, हम मानते हैं कि हम viewport 1,1(topleft viewport) पर हैं, इसलिए विंडो की सापेक्ष स्थिति पूर्ण स्थिति के बराबर है

चूंकि स्क्रीन का रिज़ॉल्यूशन है 1680, हम जानते हैं कि विंडो कॉलम पर है 3425/1680, गोल है, क्योंकि 3360 and 5040मैट्रिक्स में एक ही कॉलम पर (3 से 4 गुना रिज़ॉल्यूशन के बीच) सब कुछ है। उचित गणना के लिए हम उपयोग करते हैं math.ceil()( python)

चूंकि स्क्रिप्ट भी नियम का अभ्यास करते हैं हमेशा सही पर एक अतिरिक्त कार्यक्षेत्र के लिए / नीचे, हम करने के लिए स्तंभों की संख्या निर्धारित करने की आवश्यकता उच्चतम के मूल्य:

  • वर्तमान कार्यक्षेत्र स्तंभ + 1
  • उस पर एक खिड़की के साथ अंतिम कॉलम
  • स्क्रिप्ट के सिर में सेट किए गए कॉलम की डिफ़ॉल्ट संख्या

और इसलिए स्क्रिप्ट करता है :)

पंक्तियों को उसी प्रक्रिया में प्रबंधित किया जाता है।


1
वाह, शानदार जवाब, पहले से ही उखाड़ दिया =)
एबी

@AB धन्यवाद! :) यह मुझे पसंद है सामान की तरह है :)
याकूब Vlijm

2
@kernel_panic वाह, धन्यवाद :) मैं वास्तव में इसे एक ppa बनाने की सोच रहा हूं, जैसे यह एक: askubuntu.com/a/608295/72216, और यह एक: askubuntu.com/a/560734/72216, आखिरकार (भविष्य में) सभी तीनों को एक "वर्कस्पेस_टूल" एप्लिकेशन में मर्ज करना जहां उन्हें विकल्प के रूप में सेट किया जा सकता है या ऐसा कुछ :)।
जैकब वलीजम

1
@JacobVlijm मैं संक्षिप्तता के कारणों के लिए यहां से पुराना उत्तर हटा दूंगा: यह अभी भी उन लोगों के लिए संपादित इतिहास में दिखाई देगा जो रुचि रखते हैं ...
Fabby

1
आपका स्वागत है ... आपको चैट रूम द्वारा ड्रॉप करना चाहिए और अधिक बार विषाक्त करना चाहिए! : P
Fabby

6

तकनीकी रूप से, कार्यस्थानों को आकार देने के लिए कोई शॉर्टकट नहीं है, लेकिन आप सरल स्क्रिप्ट का उपयोग कर सकते हैं और इसे शॉर्टकट में बाँध सकते हैं।

  1. स्क्रिप्ट बलो लें, इसे .local/share/applicationsफ़ोल्डर में, या जहाँ भी आप चाहें , सेव करें ।
  2. सुनिश्चित करें कि स्क्रिप्ट को निष्पादन योग्य बनाया गया है chmod 755 /path/to/script
  3. इसे सिस्टम सेटिंग्स में शॉर्टकट से बांधें -> कीबोर्ड -> शॉर्टकट -> कस्टम शॉर्टकट

उदाहरण के लिए, मेरे पास यह सेटअप है:

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

स्क्रिप्ट के लिए बाध्य है ShiftCtrlAltI। लेकिन CtrlAltIकाम भी कर सकता था। मैं स्क्रिप्ट को पूरा रास्ता देता हूं, जो है

/home/xieerqi/resize-workspaces.sh

और यहां बताया गया है कि यह कैसा होना चाहिए:

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

लिपि

#!/bin/bash
# Author : Serg Kolo
# Date: Sept 19, 2015
# Purpose: simple script to resize 
# unity workspaces
# Written for: http://askubuntu.com/q/676046/295286

HEIGHT=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize)
WIDTH=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize)
NEWSIZE=$(zenity --entry --text="Current desktop set-up $HEIGHT x $WIDTH. Enter new setup in HEIGHTxWIDTH format"  --width=250 | tr 'x' ' ' )

ARRAY=( $NEWSIZE )
[ -z ${ARRAY[1]}  ] && exit
    gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize ${ARRAY[0]}
    gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize ${ARRAY[1]}

उपयोग करने के लिए बहुत सरल है, स्थापित करने के लिए बहुत सरल है

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