สมมติว่าฉันใช้พื้นที่ทำงาน 4 แห่งและฉันต้องการเพิ่มอีกโดยบังเอิญมีกระบวนการอัตโนมัติหรือหากเป็นไปไม่ได้วิธีง่ายๆในการเพิ่มพื้นที่ทำงานเพิ่มเติมโดยไม่ได้ตั้งใจ (แทนที่จะติดตั้งUbuntu tweak
ฯลฯ ฯลฯ )
สมมติว่าฉันใช้พื้นที่ทำงาน 4 แห่งและฉันต้องการเพิ่มอีกโดยบังเอิญมีกระบวนการอัตโนมัติหรือหากเป็นไปไม่ได้วิธีง่ายๆในการเพิ่มพื้นที่ทำงานเพิ่มเติมโดยไม่ได้ตั้งใจ (แทนที่จะติดตั้งUbuntu tweak
ฯลฯ ฯลฯ )
คำตอบ:
ด้านล่างเวอร์ชันของสคริปต์ backround (the) ที่จะเพิ่มพื้นที่ทำงานโดยอัตโนมัติหากคุณป้อนคอลัมน์หรือแถวสุดท้ายของเวิร์กสเปซ - เมทริกซ์
นี่คือวิธีการทำงาน:
หากคุณมาถึงที่คอลัมน์หรือแถวสุดท้ายวิวพอร์ตเพิ่มเติมจะถูกเพิ่ม:
หากพื้นที่ทำงานของคุณไม่ได้ใช้งานเป็นเวลา 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
หากใช้งานได้ดีให้เพิ่มลงในแอปพลิเคชันเริ่มต้นของคุณ: Dash> แอปพลิเคชันเริ่มต้น> เพิ่มคำสั่ง:
/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
ถ้าเรารู้ขนาด x ของหน้าจอ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 ของหน้าต่าง รูปนี้สัมพันธ์กับเวิร์กสเปซปัจจุบัน (ด้านซ้าย) หากต้องการทราบตำแหน่งที่แน่นอนของหน้าต่าง (x-wise) ในเวิร์กสเปซ - เมทริกซ์เราต้องเพิ่มหมายเลขแรกของข้อมูลวิวพอร์ตปัจจุบัน (เช่นVP: 1680,1050
จากผลลัพธ์ของwmctrl -d
)
อย่างไรก็ตามด้วยเหตุผลด้านความเรียบง่ายสมมติว่าเราอยู่ในวิวพอร์ต1,1
(วิวพอร์ต topleft) ดังนั้นตำแหน่งสัมพัทธ์ของหน้าต่างเท่ากับตำแหน่งที่แน่นอน
เนื่องจากความละเอียดของหน้าจอคือ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]}
ใช้งานง่ายตั้งค่าได้ง่ายมาก