필요한 경우에만 작업 공간을 자동으로 추가하려면 어떻게해야합니까?


16

4 개의 작업 공간을 사용하고 있고 더 많은 작업이 필요하다고 가정하고 자동화 된 프로세스가 있거나 불가능한 경우 설치 Ubuntu tweak등 대신 작업 공간을 추가 할 수있는 쉬운 방법이 있습니다 .



@JacobVlijm imgur.com/LaDYwGb 공감 및 수락, 정말 좋은 답변에 감사드립니다
kernel_panic

관련 : 이 오래된 게시물 은 "자동으로 더 많은 작업 공간을 생성 / 제거하는 방법"에 대해 물었습니다. 두 가지 답변이 있습니다. 다시 말하지만, 이전 답변은 새로운 답변과 비교할 때 만족도가 떨어집니다.
clearkimura

답변:


14

작업 공간 수를 자동으로 설정합니다. 필요에 따라 열과 행 추가 및 제거

작업 공간 매트릭스의 마지막 열 또는 행을 입력 한 경우 자동으로 작업 공간을 추가하는 (뒤의) backround 스크립트 버전 아래.

이것이 작동하는 방식입니다.

  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> Startup Applications> 명령 추가 :

    /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너비가 2 배 (아마도 가능하지만 여전히) 일 수 있기 때문입니다.
다행히도 명령에서 화면 해상도를 파싱 할 수 있습니다 xrandr.

그런 다음 화면의 x-size가 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 방향)를 알기 위해서는 현재 뷰포트 정보의 첫 번째 수 (예 : VP: 1680,1050의 출력 wmctrl -d)를 추가해야합니다.
그러나 간단하게하기 위해 뷰포트 1,1(왼쪽 상단 뷰포트) 에 있다고 가정 하므로 창의 상대 위치 는 절대 위치 와 같습니다 .

화면의 해상도가 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.