web-dev-qa-db-fra.com

Différentes résolutions d'écran pour chaque espace de travail?

J'utilise i3-wm sur mon ordinateur portable Ubuntu. Ma taille d'écran est 3200x1800. Ce qui est génial pour quelque chose mais horrible pour d'autres choses. (Netflix vs gvim).

J'aimerais changer la résolution de l'un de mes espaces de travail ou de plusieurs. Mais je ne sais pas si c'est même possible ... puis-je utiliser Compton pour faire ceci ou peut-être un autre programme?

5
Fetts Vett

1. En supposant que vous êtes sur l'unité

Le script ci-dessous devrait modifier votre résolution, en fonction de la fenêtre d'affichage actuelle dans Unity. Je l'ai testé sur plusieurs ordinateurs pendant un moment, et il s'est déroulé sans erreur.

Je suggérerais cependant de le tester aussi pendant un moment et de voir s'il fonctionne sans pause. Les commandes répétées wmctrl peuvent parfois quitter "non nul" par hasard. Si c'est le cas, nous devons créer un try / except.

Remarques

  • Je l'ai testé sur une configuration à un seul moniteur. plusieurs moniteurs auraient probablement besoin d'une autre méthode d'analyse de la sortie de xrandr.
  • Dans l'en-tête du script, vous devez définir la résolution souhaitée pour chacune de vos fenêtres, comme indiqué dans votre commentaire, mais vous pouvez le modifier à tout moment. Utilisez le format:

    resolutions = [[<horizontal>, <vertical], [<horizontal>, <vertical], ......]
    

    comme cela se voit dans le script.

  • Inutile de dire que vous devez utiliser les résolutions prises en charge, comme dans le résultat de xrandr pour votre moniteur.

Comment utiliser

  1. Le script a besoin de wmctrl:

    Sudo apt-get install wmctrl
    
  2. copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom screen_res.py

  3. Testez-le pendant un moment dans une fenêtre de terminal à l'aide de la commande:

    python3 screen_res.py
    
  4. Si tout fonctionne correctement, ajoutez-le à vos applications de démarrage: Dash> Applications de démarrage> Ajouter ...

Le scénario

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

Explication

  • En boucle, le script vérifie d'abord la résolution actuelle de l'écran à l'aide de la commande:

    xrandr
    
  • Par la suite, le script vérifie la taille totale du bureau (toutes les fenêtres) à l'aide de la commande:

    wmctrl -d
    
  • Ensuite, à partir de la résolution i.c.w. la taille totale du bureau, il calcule le nombre de colonnes, qui est égal à la taille totale du bureau, divisé par la résolution horizontale.

  • La sortie dewmctrl -d contient également la position de la fenêtre d'affichage actuelle sur le bureau recouvrant: par exemple: VP: 1680,0.
  • Avec ces informations, nous pouvons déterminer la colonne et la rangée que nous avons et vérifier si la résolution actuellement définie correspond à la résolution telle que nous l'avons définie dans la liste située dans la section d'en-tête du script.
    Sinon, le script donne la commande pour changer la résolution avec la commande:

    xrandr -s <xres>x<yres>
    

2. Version XFCE

  • mis en place comme la version ci-dessus (nécessite également 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)
2
Jacob Vlijm