web-dev-qa-db-fra.com

Déplacez les fenêtres entre les écrans en mode double écran

J'ai un ordinateur portable et un moniteur de 27 pouces. Qt tourne sur un moniteur et Pycharm sur l'autre. Y at-il un moyen de faire une combinaison de touches pour échanger toutes les fenêtres entre les deux écrans. La raison en est que je veux programmer uniquement sur grand écran. J'ai déjà 4 espaces de travail et tous sont déjà utilisés.

La sortie de xrandr:

Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 32767 x 32767
eDP1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 344mm x 193mm
   1920x1080      60.2*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
HDMI1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 597mm x 336mm
   1920x1080      60.0*+   50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1600x1200      60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1366x768       59.8  
   1152x864       75.0  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
7
Mehdi

1. Script pour échanger toutes les fenêtres de l'écran 1 -> écran 2 et vice versa

Le script suppose que les écrans ont la même résolution verticale et que l’écran de gauche est le principal. Le script recherche les résolutions horizontales des deux écrans.

Comment mettre en place

Le script nécessite que wmctrl soit installé:

Sudo apt-get install wmctrl
  1. Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom swap_windows (sans extension) dans ~/.bin. Créez le répertoire s'il n'existe pas déjà et rendez le script exécutable .
  2. Si vous venez de créer le répertoire ~/bin (il n’existait pas encore), déconnectez-vous/ouvrez ou exécutez-le dans un terminal: source ~/.profile.
  3. test lance le script avec la commande:

    swap_windows
    
  4. Si tout fonctionne comme prévu, ajoutez une touche de raccourci; choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande

Le scénario

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

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shiftright(xr_output):
    lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def get_shiftleft(xr_output):
    lines = [l for l in xr_output.splitlines() if  "+0" in l and not "+0+0" in l][0].split()
    return -int([it for it in lines if "x" in it][0].split("x")[0])

def swap_windows():
    xr_output = get("xrandr")
    shift_r = get_shiftright(xr_output)
    shift_l = get_shiftleft(xr_output)
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    for w in w_data:
        props = get("xprop -id "+w[0])
        if any(["_TYPE_NORMAL" in props, "TYPE_DIALOG" in props]):    
            if 0 < int(w[2]) < shift_r:
                shift = shift_r
            Elif shift_r-shift_l > int(w[2]) >= shift_r:
                shift = -shift_r
            else:
                shift = 0
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])     
swap_windows()



2. Script pour déplacer (toutes) les fenêtres d'un moniteur à l'autre

Le script ci-dessous déplace les fenêtres dans une configuration à double moniteur d'un écran à l'autre, soit:

  • de gauche à droite moniteur ->

    ou

  • de droite à gauche moniteur <-

En fonction de l'argument avec lequel vous l'exécutez (left ou right)

Le script (encore) suppose que les écrans ont la même résolution verticale et que l’écran de gauche est le principal. Le script recherche les résolutions horizontales des deux écrans.

Comment mettre en place

Le script nécessite que wmctrl soit installé:

Sudo apt-get install wmctrl
  1. Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom shift_windows (sans extension) dans ~/.bin. Créez le répertoire s'il n'existe pas déjà et rendez le script exécutable .
  2. Si vous venez de créer le répertoire ~/bin (il n’existait pas encore), déconnectez-vous/ouvrez ou exécutez-le dans un terminal: source ~/.profile.
  3. test lance le script avec les commandes

    shift_windows right
    

    et: shift_windows left

    Dans le premier cas, les fenêtres de votre écran gauche doivent passer à l'écran de droite et, dans le deuxième cas, à l'inverse.

  4. Si tout fonctionne comme prévu, ajoutez le script à deux combinaisons de raccourcis: choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez les commandes comme expliqué ci-dessus.

Le scénario

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

vec = sys.argv[1]

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shiftright(xr_output):
    lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def get_shiftleft(xr_output):
    lines = [l for l in xr_output.splitlines() if  "+0" in l and not "+0+0" in l][0].split()
    return -int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows():
    xr_output = get("xrandr")
    shift_r = get_shiftright(xr_output)
    shift_l = get_shiftleft(xr_output)
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    for w in w_data:
        props = get("xprop -id "+w[0])
        if vec == "right":
            check = (0 < int(w[2]) < shift_r, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = shift_r
        if vec == "left":
            check = (shift_r-shift_l > int(w[2]) >= shift_r , "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = -shift_r
        if check == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])
shift_windows()




3. Déplacer une seule fenêtre d'un écran à un autre

Bien que ce ne soit pas littéralement votre question, avec seulement quelques lignes de plus, vous pouvez déplacer toutes les fenêtres d’un écran à l’autre, mais aussi une seule ( le plus en avant) avec une combinaison de touches.

Avec le script ci-dessous, vous pouvez déplacer toutes les fenêtres avec la commande:

shift_windows right

ou déplacez une seule fenêtre avec la commande:

shift_windows right s

La configuration est à peu près la même que celle du script ci-dessus (n'oubliez pas d'installer wmctrl)

Le scénario

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

vec = sys.argv[1]
try:
    n = sys.argv[2]
except IndexError:
    n = "a"

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shiftright(xr_output):
    lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def get_shiftleft(xr_output):
    lines = [l for l in xr_output.splitlines() if  "+0" in l and not "+0+0" in l][0].split()
    return -int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows():
    xr_output = get("xrandr")
    shift_r = get_shiftright(xr_output)
    shift_l = get_shiftleft(xr_output)
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    if n == "s":
        frontmost = [l for l in get("xprop -root").splitlines() if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
        frontmost = frontmost[:2]+"0"+frontmost[2:]
        w_data = [l for l in w_data if frontmost in l]
    for w in w_data:
        props = get("xprop -id "+w[0])
        if vec == "right":
            check = (0 < int(w[2]) < shift_r, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = shift_r
        if vec == "left":
            check = (shift_r-shift_l > int(w[2]) >= shift_r , "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = -shift_r
        if check == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])
shift_windows()
5
Jacob Vlijm