मान लें कि मैं 4 कार्यस्थानों का उपयोग कर रहा हूं और मुझे आकस्मिक रूप से अधिक आवश्यकता है, क्या एक स्वचालित प्रक्रिया है या, यदि असंभव है, तो संयोग से अधिक कार्यक्षेत्र (स्थापित करने Ubuntu tweak
आदि के बजाय ) को जोड़ने का एक आसान तरीका है )।
मान लें कि मैं 4 कार्यस्थानों का उपयोग कर रहा हूं और मुझे आकस्मिक रूप से अधिक आवश्यकता है, क्या एक स्वचालित प्रक्रिया है या, यदि असंभव है, तो संयोग से अधिक कार्यक्षेत्र (स्थापित करने Ubuntu tweak
आदि के बजाय ) को जोड़ने का एक आसान तरीका है )।
जवाबों:
यदि आप अपने कार्यक्षेत्र-मैट्रिक्स के अंतिम कॉलम या पंक्ति में प्रवेश करते हैं तो स्वचालित रूप से वर्कस्पेस जोड़ देगा (a) बैकग्राउंड स्क्रिप्ट के एक संस्करण के नीचे।
यह इस तरह काम करता है:
यदि आप अंतिम कॉलम या पंक्ति पर पहुंचते हैं, तो अतिरिक्त व्यूपोर्ट जोड़े जाते हैं:
यदि आपके कार्यस्थान 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)
add_space.py
स्क्रिप्ट के मुख्य भाग में, यदि आप अन्य सेटिंग्स (कार्यस्थानों की अधिकतम संख्या, डिफ़ॉल्ट मैट्रिक्स जैसे 2x2) पसंद करते हैं, तो लाइनें संपादित करें:
# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10
टेस्ट- कमांड द्वारा इसे चलाएं:
python3 /path/to/add_space.py
यदि सब ठीक काम करता है, तो इसे अपने स्टार्टअप एप्लिकेशन में जोड़ें: डैश> स्टार्टअप एप्लिकेशन> कमांड जोड़ें:
/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
)
चूंकि स्क्रिप्ट भी नियम का अभ्यास करते हैं हमेशा सही पर एक अतिरिक्त कार्यक्षेत्र के लिए / नीचे, हम करने के लिए स्तंभों की संख्या निर्धारित करने की आवश्यकता उच्चतम के मूल्य:
और इसलिए स्क्रिप्ट करता है :)
पंक्तियों को उसी प्रक्रिया में प्रबंधित किया जाता है।
तकनीकी रूप से, कार्यस्थानों को आकार देने के लिए कोई शॉर्टकट नहीं है, लेकिन आप सरल स्क्रिप्ट का उपयोग कर सकते हैं और इसे शॉर्टकट में बाँध सकते हैं।
.local/share/applications
फ़ोल्डर में, या जहाँ भी आप चाहें , सेव करें ।chmod 755 /path/to/script
उदाहरण के लिए, मेरे पास यह सेटअप है:
स्क्रिप्ट के लिए बाध्य है 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]}
उपयोग करने के लिए बहुत सरल है, स्थापित करने के लिए बहुत सरल है