ฉันจะเพิ่มพื้นที่ทำงานได้โดยอัตโนมัติเฉพาะเมื่อต้องการหรือไม่


16

สมมติว่าฉันใช้พื้นที่ทำงาน 4 แห่งและฉันต้องการเพิ่มอีกโดยบังเอิญมีกระบวนการอัตโนมัติหรือหากเป็นไปไม่ได้วิธีง่ายๆในการเพิ่มพื้นที่ทำงานเพิ่มเติมโดยไม่ได้ตั้งใจ (แทนที่จะติดตั้งUbuntu tweakฯลฯ ฯลฯ )



@JacobVlijm imgur.com/LaDYwGb ได้ รับการสนับสนุนและยอมรับขอบคุณสำหรับคำตอบที่ดีจริงๆ
kernel_panic

ที่เกี่ยวข้อง: โพสต์เก่านี้ได้ถามเมื่อ "วิธีการสร้าง / ลบพื้นที่ทำงานโดยอัตโนมัติ?" ด้วยสองคำตอบที่ต่างกัน จากนั้นอีกครั้งคำตอบที่เก่ากว่ามีความพึงพอใจน้อยกว่าเมื่อเปรียบเทียบกับคำตอบที่ใหม่กว่าที่นี่
clearkimura

คำตอบ:


14

ตั้งค่าจำนวนพื้นที่ทำงานโดยอัตโนมัติ เพิ่มและลบคอลัมน์และแถวขึ้นอยู่กับความต้องการของคุณ

ด้านล่างเวอร์ชันของสคริปต์ backround (the) ที่จะเพิ่มพื้นที่ทำงานโดยอัตโนมัติหากคุณป้อนคอลัมน์หรือแถวสุดท้ายของเวิร์กสเปซ - เมทริกซ์

นี่คือวิธีการทำงาน:

  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. หากใช้งานได้ดีให้เพิ่มลงในแอปพลิเคชันเริ่มต้นของคุณ: 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)

เนื่องจากสคริปต์ยังใช้กฎเพื่อให้มีพื้นที่ทำงานเพิ่มเติมอยู่ด้านขวา / ล่างเสมอเราจึงต้องกำหนดจำนวนคอลัมน์เป็นค่าสูงสุด :

  • ปัจจุบันพื้นที่ทำงานคอลัมน์ + 1
  • สุดท้ายคอลัมน์ที่มีหน้าต่างในนั้น
  • จำนวนคอลัมน์เริ่มต้นตามที่กำหนดไว้ในส่วนหัวของสคริปต์

และสคริปต์ก็ทำเช่นนั้น :)

แถวได้รับการจัดการในขั้นตอนเดียวกันทั้งหมด


1
ว้าวคำตอบที่ดี upvoted แล้ว =)
AB

@AB ขอบคุณ! :) นี่คือสิ่งที่ฉันชอบทำ :)
Jacob Vlijm

2
@kernel_panic ว้าวขอบคุณ :) จริง ๆ แล้วฉันคิดว่าจะทำให้เป็น ppa เช่นนี้: askubuntu.com/a/608295/72216 และอันนี้: askubuntu.com/a/560734/72216 ในที่สุด (ในอนาคต) การรวมทั้งสามอย่างนี้เข้าไว้ในแอพพลิเคชั่น "workspace_tools" ซึ่งพวกมันสามารถตั้งค่าเป็นตัวเลือกหรืออะไรทำนองนั้น :)
Jacob Vlijm

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]}

ใช้งานง่ายตั้งค่าได้ง่ายมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.