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:
-
Se você chegar na última coluna ou linha, serão adicionadas viewports adicionais:
-
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
- Copie o script abaixo em um arquivo vazio, salve-o como
add_space.py
-
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
-
Teste - execute-o pelo comando:
python3 /path/to/add_space.py
-
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.