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)
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.
Le script nécessite que wmctrl
soit installé:
Sudo apt-get install wmctrl
swap_windows
(sans extension) dans ~/.bin
. Créez le répertoire s'il n'existe pas déjà et rendez le script exécutable .~/bin
(il n’existait pas encore), déconnectez-vous/ouvrez ou exécutez-le dans un terminal: source ~/.profile
.test lance le script avec la commande:
swap_windows
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
#!/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()
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.
Le script nécessite que wmctrl
soit installé:
Sudo apt-get install wmctrl
shift_windows
(sans extension) dans ~/.bin
. Créez le répertoire s'il n'existe pas déjà et rendez le script exécutable .~/bin
(il n’existait pas encore), déconnectez-vous/ouvrez ou exécutez-le dans un terminal: source ~/.profile
.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.
#!/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()
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
)
#!/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()