web-dev-qa-db-fra.com

Double moniteur placement placement

J'ai deux moniteurs. J'ai plusieurs espaces de travail. Je souhaite que mon lanceur ("emplacement du lanceur" dans les paramètres> écrans) soit présent sur mes deux moniteurs dans le même espace de travail, mais que je ne dispose que d'un seul lanceur (sur le moniteur principal) dans l'autre. C'est parce que je veux étendre Tweetdeck sur les deux moniteurs et que le lanceur s'interpose. Est-ce possible?

Espace de travail 1 (bon):

Image 1

Espace de travail 2 (pas bon):

Image 2

Espace de travail 2 (bon):

Image 3

5
Colin

Comment est défini le placement du lanceur?

Le placement du lanceur est défini par quelques éléments:

  1. La valeur définie dans /org/compiz/profiles/unity/plugins/unityshell/num-launchers. Vous pouvez le lire par la commande:

    dconf read /org/compiz/profiles/unity/plugins/unityshell/num-launchers
    

    qui générera soit 1 (lanceur sur un écran), soit 0 (lanceur sur tous les écrans).

    Pour définir le lanceur visible sur tous les écrans peut être effectué à l'aide de la commande:

    dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers 0
    
  2. Si la valeur est 1 (visible sur un seul écran), nous pouvons définir sur quel écran apparaît le programme de lancement en définissant l'écran ciblé. comme écran primaire , avec une commande xrandr:

    xrandr --output <screen_name> --primary
    

Ce sont exactement les commandes que le (s) script (s) ci-dessous utilise (s).

Script1; régler manuellement le lanceur sur seulement à gauche ou sur les deux écrans (avec un raccourci clavier)

Selon l'argument avec lequel vous exécutez le script, le lanceur doit s'afficher sur tous les écrans à l'aide de la commande:

dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers 0

ou sur un seul:

dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers 1

Dans ce dernier cas, l’écran de gauche est également défini comme écran principal.

Le scénario

#!/usr/bin/env python3
import subprocess
import sys

key = "dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers "

arg = sys.argv[1]

if arg == "left":
    # the launcher is set to show on all screens
    subprocess.Popen(["/bin/bash", "-c", key+"1"])
Elif arg == "all":
    # the launcher is set to show only on the left screen
    subprocess.Popen(["/bin/bash", "-c", key+"0"])
    # make sure the left screen is the primary one
    scr_data = subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()
    left = [l.split()[0] for l in scr_data if "+0+0" in l][0]
    subprocess.Popen(["xrandr", "--output", left, "--primary"])

Comment utiliser

  • Copiez le script dans un fichier vide, enregistrez-le sous le nom launcher_pos.py
  • Testez le script avec les deux commandes (depuis une fenêtre de terminal):

    python3 /path/to/launcher_pos.py left
    

    et

    python3 /path/to/launcher_pos.py all
    
  • si tout fonctionne correctement, ajoutez les commandes à deux combinaisons de touches de raccourci: choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez les deux commandes aux raccourcis disponibles.

Le script 2; version automatique

Le script ci-dessous garde automatiquement la trace de l’espace de travail actuel (quel que soit le nombre d’espaces de travail que vous avez et dans quelle configuration).

Ce script est exécuté avec les espaces de travail où vous souhaitez que le programme de lancement ne s'affiche que sur la gauche en tant qu'argument. Un exemple:

Si vous exécutez le script avec la commande:

python3 /path/to/launcher_pos.py 2 3

Le résultat est:

enter image description here

Le scénario

import subprocess
import sys
import time

wspace = sys.argv[1:]
key = "dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers "

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

res = get_res()

def get_dt():
    # get the 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])
    return str(curr_col+curr_row*cols)

def set_launcher(arg):
    if arg == "left":
        # the launcher is set to show on all screens
        subprocess.Popen(["/bin/bash", "-c", key+"1"])
    Elif arg == "all":
        # the launcher is set to show only on the left screen
        subprocess.Popen(["/bin/bash", "-c", key+"0"])
        # make sure the left screen is the primary one
        scr_data = subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()
        left = [l.split()[0] for l in scr_data if "+0+0" in l][0]
        subprocess.Popen(["xrandr", "--output", left, "--primary"])

curr_ws1 = get_dt()

while True:
    time.sleep(1)
    curr_ws2 = get_dt()
    if curr_ws2 != curr_ws1:
        if curr_ws2 in wspace:
            arg = "left"
        else:
            arg = "all"
        set_launcher(arg)
    curr_ws1 = curr_ws2

Comment utiliser

  1. Le script a besoin de wmctrl

    Sudo apt-get install wmctrl
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom launcher_pos.py

  3. Testez-le avec la commande:

    python3 /path/to/launcher_pos.py 1 3
    

    Sur les espaces de travail 1 et 3, le lanceur ne devrait maintenant apparaître que sur la gauche

  4. Si tout fonctionne correctement, ajoutez-le à vos applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

    /bin/bash -c "sleep 15 && python3 /path/to/launcher_pos.py 1 3"
    

    (Si les espaces de travail 1 et 3 sont ceux pour lesquels vous ne voulez que le lanceur à gauche)

5
Jacob Vlijm