Diferentes resoluções de tela para cada espaço de trabalho?

4

Estou usando o i3-wm no meu laptop ubuntu. Meu tamanho de tela é de 3200x1800. O que é ótimo para algo, mas horrível para outras coisas. (Netflix vs gvim).

Gostaria de alterar a resolução de um dos meus espaços de trabalho ou vários. Mas eu não tenho idéia se isso é possível ... posso usar o compton para fazer isso ou talvez outro programa?

    
por Fetts Vett 18.02.2015 / 21:23

1 resposta

2

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

  1. O script precisa de wmctrl :

    sudo apt-get install wmctrl
    
  2. copie o script abaixo em um arquivo vazio, salve-o como screen_res.py

  3. Teste-o por um tempo em uma janela de terminal pelo comando:

    python3 screen_res.py
    
  4. 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)
    
por Jacob Vlijm 19.02.2015 / 10:16