Làm cách nào tôi có thể tự động thêm không gian làm việc, chỉ khi tôi cần chúng?


16

Giả sử tôi đang sử dụng 4 không gian làm việc và tôi tình cờ cần nhiều hơn, đó là một quy trình tự động hoặc, nếu không thể, một cách dễ dàng để thêm nhiều không gian làm việc (thay vì cài đặt Ubuntu tweak, v.v.).



@JacobVlijm imgur.com/LaDYwGb được nâng cấp và chấp nhận, cảm ơn vì câu trả lời thực sự hay
kernel_panic

Liên quan: Bài đăng cũ này đã hỏi về "Làm thế nào để có nhiều Không gian làm việc được tạo / xóa tự động?" với hai câu trả lời khác nhau. Sau đó, một lần nữa, các câu trả lời cũ có thể ít hài lòng hơn khi so sánh với các câu trả lời mới hơn ở đây.
Clearkimura

Câu trả lời:


14

Tự động đặt số lượng không gian làm việc; thêm và xóa cột và hàng, tùy thuộc vào nhu cầu của bạn

Bên dưới một phiên bản của tập lệnh backround (sẽ) sẽ tự động thêm các không gian làm việc nếu bạn đã nhập cột hoặc hàng cuối cùng của ma trận không gian làm việc.

Đây là cách nó hoạt động:

  1. Nếu bạn đến cột hoặc hàng cuối cùng, các khung nhìn bổ sung sẽ được thêm vào:

    nhập mô tả hình ảnh ở đây

  2. Nếu không gian làm việc của bạn không được sử dụng trong 5-10 giây không có cửa sổ trên đó, không gian làm việc bổ sung sẽ bị xóa lại. Tuy nhiên, bạn sẽ luôn giữ thêm một hàng bên dưới và thêm một cột bên phải của chế độ xem hiện tại của bạn:

    nhập mô tả hình ảnh ở đây

Kịch bản:

#!/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)

Cách sử dụng

  1. Sao chép tập lệnh bên dưới vào một tập tin trống, lưu nó dưới dạng add_space.py
  2. Trong phần đầu của tập lệnh, chỉnh sửa các dòng nếu bạn thích các cài đặt khác (số lượng không gian làm việc tối đa, ma trận mặc định, ví dụ 2x2):

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. Kiểm tra- chạy nó bằng lệnh:

    python3 /path/to/add_space.py
    
  4. Nếu tất cả đều hoạt động tốt, hãy thêm nó vào các ứng dụng khởi động của bạn: Dash> Ứng dụng khởi động> Thêm lệnh:

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

Ghi chú

Như mọi khi, tập lệnh cực kỳ "thiếu nước" và không thêm bất kỳ tải đáng chú ý nào vào bộ xử lý của bạn.

Giải trình

Câu chuyện dưới đây là một chút phức tạp và chủ yếu là một lời giải thích về khái niệmthủ tục , chứ không phải là mã hóa. Chỉ đọc nếu bạn quan tâm.

Cách tính các không gian làm việc cần thiết (các cột ví dụ)

Đầu ra của wmctrl -dhình như:

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

Trong đầu ra, VP: 1680,1050cung cấp cho chúng tôi thông tin về vị trí của chúng tôi trên không gian làm việc kéo dài (ma trận của tất cả các khung nhìn). Thông tin này chỉ hữu ích nếu chúng ta cũng có độ phân giải của màn hình, ví dụ như 1680có thể là chiều rộng của hai (không chắc, nhưng vẫn) hoặc một lần màn hình.
May mắn thay, chúng ta có thể phân tích độ phân giải của màn hình từ lệnh xrandr.

Sau đó, nếu chúng ta biết kích thước x của màn hình 1680và chúng tôi hiện đang bật VP: 1680,1050, chúng tôi biết rằng chúng tôi đang ở cột thứ hai trong ma trận của không gian làm việc. Vì chúng tôi cũng biết kích thước của ma trận tổng ( DG: 3360x2100cũng từ đầu ra của wmctrl -d), chúng tôi biết ma trận hiện tại bao gồm hai cột (3360/1680) và chúng tôi đang ở "cuối cùng".

nhập mô tả hình ảnh ở đây

Tập lệnh sau đó sẽ gửi một lệnh để thêm một cột vào ma trận bằng lệnh:

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

Đây là nguyên tắc.

Cách tính các không gian làm việc cần loại bỏ (các cột ví dụ)

Cứ sau 10 giây, tập lệnh sẽ chạy lệnh liệt kê tất cả các cửa sổ đang mở, với lệnh:

wmctrl -lG

Điều này cũng cung cấp cho chúng tôi thông tin về vị trí của cửa sổ, trông giống như:

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

Trong đầu ra, 3425là vị trí x của cửa sổ. Con số này tuy nhiên liên quan đến không gian làm việc hiện tại (bên trái). Để biết vị trí tuyệt đối của cửa sổ (x-khôn ngoan) trong ma trận không gian làm việc, chúng ta phải thêm số đầu tiên của thông tin chế độ xem hiện tại (ví dụ: VP: 1680,1050từ đầu ra của wmctrl -d).
Tuy nhiên, vì lý do đơn giản, giả sử chúng ta đang ở chế độ xem 1,1(khung nhìn topleft), vì vậy vị trí tương đối của cửa sổ bằng với vị trí tuyệt đối của nó.

Vì độ phân giải của màn hình là 1680, chúng tôi biết cửa sổ nằm trên cột 3425/1680, được làm tròn lên, vì mọi thứ ở giữa 3360 and 5040nằm trên cùng một cột trong ma trận (từ 3 đến 4 lần độ phân giải). Để tính toán chính xác, chúng tôi sử dụng math.ceil()( python)

Vì tập lệnh cũng thực hành quy tắc để luôn có thêm một không gian làm việc ở bên phải / bên dưới, nên chúng ta cần đặt số lượng cột thành giá trị cao nhất là:

  • các hiện cột không gian làm việc + 1
  • các cuối cùng cột với một cửa sổ trên nó
  • số lượng cột mặc định, như được đặt trong phần đầu của tập lệnh

Và kịch bản cũng vậy :)

Các hàng được quản lý theo cùng một quy trình.


1
Ồ, câu trả lời tuyệt vời, đã được nâng cấp =)
AB

@AB Cảm ơn! :) Đây là loại công việc tôi thích làm :)
Jacob Vlijm

2
@kernel_panic Wow, cảm ơn :) Tôi thực sự đang nghĩ đến việc biến nó thành một ppa, như thế này: hợp nhất cả ba thành một ứng dụng "workspace_tools" nơi chúng có thể được đặt làm tùy chọn hoặc đại loại như thế :).
Jacob Vlijm

1
@JacobVlijm Tôi sẽ xóa câu trả lời cũ từ đây vì lý do ngắn gọn: nó sẽ vẫn hiển thị trong lịch sử chỉnh sửa cho những ai quan tâm ...
Fabby

1
Bạn được chào đón ... Bạn nên ghé qua phòng chat và độc hại thường xuyên hơn! : P
Fabby

6

Về mặt kỹ thuật, không có phím tắt để thay đổi kích thước không gian làm việc, nhưng bạn có thể sử dụng tập lệnh đơn giản dưới đây và liên kết nó với một phím tắt.

  1. Lấy đoạn mã dưới đây, lưu nó trong .local/share/applicationsthư mục hoặc bất cứ nơi nào bạn thích.
  2. Hãy chắc chắn rằng tập lệnh được thực thi với chmod 755 /path/to/script
  3. Liên kết nó với một phím tắt trong Cài đặt hệ thống -> Bàn phím -> Phím tắt -> Phím tắt tùy chỉnh

Ví dụ: tôi có thiết lập này:

nhập mô tả hình ảnh ở đây

Kịch bản bị ràng buộc ShiftCtrlAltI. Nhưng CtrlAltIcó thể làm việc quá. Tôi cung cấp đầy đủ đường dẫn đến kịch bản, đó là

/home/xieerqi/resize-workspaces.sh

Và đây là cách nó sẽ trông như thế nào:

nhập mô tả hình ảnh ở đây

Kịch bản

#!/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]}

Rất đơn giản để sử dụng, rất đơn giản để thiết lập

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.