1. Assumindo que você está na Unity
O script abaixo deve alterar sua resolução, dependendo da viewport atual no Unity. Eu testei em vários computadores por um tempo, e correu sem um erro.
No entanto, sugiro testá-lo por um tempo e ver se ele funciona sem uma única pausa; Os comandos wmctrl
repetidos podem, às vezes, sair "diferente de zero" acidentalmente. Em caso afirmativo, precisamos criar um try / except
.
Notas
- Eu testei em uma configuração de monitor único. Vários monitores provavelmente precisariam de outra maneira de analisar a saída de
xrandr
. -
Na cabeça do script, você precisa definir a resolução desejada para cada uma das suas viewports, defini-lo como mencionado em seu comentário, mas você pode alterá-lo a qualquer momento. Use o formato:
resolutions = [[<horizontal>, <vertical], [<horizontal>, <vertical], ......]
como mostra no script.
- Não é preciso dizer que você deve usar resoluções compatíveis, como na saída de
xrandr
do seu monitor.
Como usar
-
O script precisa de
wmctrl
:sudo apt-get install wmctrl
-
copie o script abaixo em um arquivo vazio, salve-o como
screen_res.py
-
Teste-o por um tempo em uma janela de terminal pelo comando:
python3 screen_res.py
-
Se tudo funcionar bem, adicione-o aos seus aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicione ...
O script
#!/usr/bin/env python3
import subprocess
import time
# list of resolution per viewport, for each viewport a separate [hor, vert]
# I pre- entered your viewports. quite some! listing takes more space than the script :)
resolutions = [
[3200, 1800],
[3200, 1800],
[3200, 1800],
[3200, 1800],
[3200, 1800],
[3200, 1800],
[3200, 1800],
[1920, 1080],
[1920, 1080],
[1920, 1080],
]
def get_xr():
return subprocess.check_output(["xrandr"]).decode("utf-8").split()
check = get_xr()
plus = 2 if check[check.index("connected")+1] == "primary" else 1
while True:
# resolution:
xr = get_xr()
res = [int(n) for n in xr[xr.index("connected")+plus].split("+")[0].split("x")]
# get current viewport
vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
dt = [int(n) for n in vp_data[3].split("x")]
cols = int(dt[0]/res[0])
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
curr_col = int(curr_vpdata[0]/res[0])+1; curr_row = int(curr_vpdata[1]/res[1])
curr_vp = curr_col+curr_row*cols
# check and change resolution if needed
if res != resolutions[curr_vp-1]:
new_res = ("x").join([str(n) for n in resolutions[curr_vp-1]])
subprocess.call(["xrandr", "-s", new_res])
time.sleep(1)
Explicação
-
Em um loop, o script primeiro verifica a resolução atual da tela a partir do comando:
xrandr
-
Posteriormente, o script verifica o tamanho total da área de trabalho (todas as viewports) a partir do comando:
wmctrl -d
-
Então, a partir da resolução i.c.w. O tamanho total da área de trabalho calcula o número de colunas, que é igual ao tamanho total da área de trabalho, dividido pela resolução horizontal.
- Também na saída de
wmctrl -d
está a posição da viewport atual na área de trabalho de abrangência: por exemplo,VP: 1680,0
. -
Com essas informações, podemos concluir em qual coluna & amp; linha que estamos, e verifique se a resolução definida atualmente corresponde à resolução como a definimos na lista na seção head do script.
Caso contrário, o script fornece o comando para alterar a resolução com o comando:xrandr -s <xres>x<yres>
2. Versão XFCE
- configurado como a versão acima (também precisa de
wmctrl
)
#!/usr/bin/env python3
import subprocess
import time
# list of resolution per viewport, for each viewport a separate [hor, vert]
# below just an example! set resolutions for your own screen
resolutions = [
[1280, 1024],
[1280, 960],
[1280, 1024],
[1280, 1024],
]
def get_xr():
return subprocess.check_output(["xrandr"]).decode("utf-8").split()
check = get_xr()
plus = 2 if check[check.index("connected")+1] == "primary" else 1
while True:
# resolution:
xr = get_xr()
res = [int(n) for n in xr[xr.index("connected")+plus].split("+")[0].split("x")]
# get current workspace
vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").splitlines()
curr_ws = int([l.split()[0] for l in vp_data if "*" in l][0])
# check and change resolution if needed
if res != resolutions[curr_ws]:
new_res = ("x").join([str(n) for n in resolutions[curr_ws]])
subprocess.call(["xrandr", "-s", new_res])
time.sleep(1)