Como posso adicionar áreas de trabalho automaticamente somente se eu precisar delas?

16

Suponha que eu esteja usando 4 espaços de trabalho e, por acaso, precise de mais, existe um processo automatizado ou, se impossível, uma maneira fácil de adicionar incidentemente mais espaços de trabalho (em vez de instalar Ubuntu tweak etc. etc.).

    
por kernel_panic 19.09.2015 / 20:02

2 respostas

14

Definir automaticamente o número de espaços de trabalho; adicione e remova colunas e linhas, dependendo de suas necessidades

Abaixo de uma versão de um script (backround) que adicionará automaticamente espaços de trabalho se você inseriu a última coluna ou linha de sua matriz de espaço de trabalho.

É assim que funciona:

  1. Se você chegar na última coluna ou linha, serão adicionadas viewports adicionais:

  2. Se os espaços de trabalho não forem usados por 5-10 segundos, e não haverá janelas, as áreas de trabalho adicionais serão removidas novamente. No entanto, você sempre manterá uma linha extra abaixo e uma coluna extra à direita da janela atual:

O script:

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

Como usar

  1. Copie o script abaixo em um arquivo vazio, salve-o como add_space.py
  2. Na seção principal do script, edite as linhas se desejar outras configurações (número máximo de espaços de trabalho, matriz padrão, por exemplo, 2x2):

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. Teste - execute-o pelo comando:

    python3 /path/to/add_space.py
    
  4. Se tudo funcionar bem, adicione-o aos seus aplicativos de inicialização: Dash & gt; Aplicativos de inicialização & gt; Adicione o comando:

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

Nota

Como sempre, o script é extremamente "com pouco suco" e não adiciona nenhuma carga perceptível ao processador.

Explicação

A história abaixo é um pouco complicada e principalmente uma explicação sobre o conceito e o procedimento , em vez da codificação. Só leia se você estiver interessado.

Como calcular os espaços de trabalho necessários (colunas de exemplo)

A saída de wmctrl -d se parece com:

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

Na saída, VP: 1680,1050 nos fornece informações sobre onde estamos no espaço de trabalho de abrangência (a matriz de todas as viewports). Esta informação é útil apenas se também tivermos a resolução da tela, desde, por exemplo, 1680 poderia ser a largura de dois (improvável, mas ainda assim) ou uma vez a tela.
Felizmente, podemos analisar a resolução da tela a partir do comando xrandr .

Então, se soubermos que o tamanho x da tela é 1680 e atualmente estamos em VP: 1680,1050 , sabemos que estamos na segunda coluna na matriz da área de trabalho. Como também sabemos o tamanho da matriz total ( DG: 3360x2100 , também da saída de wmctrl -d ), sabemos que a matriz atual inclui duas colunas (3360/1680) e estamos na "última".

O script enviará uma instrução para adicionar uma coluna à matriz pelo comando:

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

Este é o princípio.

Como calcular as áreas de trabalho a serem removidas (colunas de exemplo)

Uma vez por 10 segundos, o script executa o comando para listar todas as janelas abertas no momento, com o comando:

wmctrl -lG

Isso nos dá informações sobre a posição da janela também, como:

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

Na saída, 3425 é a posição x da janela. No entanto, esta figura é relativa à área de trabalho atual (lado esquerdo). Para saber a posição absoluta da janela (x-wise) na matriz da área de trabalho, temos que adicionar o primeiro número das informações da janela de exibição atual (por exemplo, VP: 1680,1050 , da saída de wmctrl -d ).
Vamos, no entanto, por razões de simplicidade, assumir que estamos na viewport 1,1 (topleft viewport), então a posição relativa da janela é igual a sua posição absoluta.

Como a resolução da tela é 1680 , sabemos que a janela está na coluna 3425/1680 , arredondada, pois tudo entre 3360 and 5040 está na mesma coluna da matriz (entre 3 e 4 vezes a resolução). Para o cálculo correto, usamos math.ceil() ( python )

Como o script também pratica a regra para ter sempre um espaço de trabalho extra à direita / abaixo, precisamos definir o número de colunas para o valor o mais alto de:

  • a coluna da área de trabalho atual + 1
  • a coluna última com uma janela nela
  • o número padrão de colunas, conforme definido no cabeçalho do script

E assim o script faz:)

As linhas são gerenciadas exatamente no mesmo procedimento.

    
por Jacob Vlijm 19.09.2015 / 22:50
5

Tecnicamente, não existe um atalho para redimensionar espaços de trabalho, mas você pode usar o script simples abaixo e vinculá-lo a um atalho.

  1. Pegue o script abaixo, salve-o na pasta .local/share/applications ou onde preferir.
  2. Verifique se o script foi criado com chmod 755 /path/to/script
  3. Vincule-o a um atalho em Configurações do sistema - & gt; Teclado - & gt; Atalhos - & gt; Atalhos personalizados

Por exemplo, eu tenho esta configuração:

O script está limitado a Deslocar Ctrl Alt I . Mas Ctrl Alt I também pode funcionar. Eu dou o caminho completo para o script, que é

/home/xieerqi/resize-workspaces.sh

E aqui está como deve ser:

Script

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

Muito simples de usar, muito simples de configurar

    
por Sergiy Kolodyazhnyy 20.09.2015 / 00:31