Sous Windows (depuis au moins XP, probablement avant), si vous utilisez le clavier pour déplacer ou redimensionner une fenêtre, vous pouvez obtenir des emplacements et des tailles très précises - même plus qu'avec une souris - en utilisant la touche Ctrl en combinaison avec la flèche. touches (après avoir appelé la fonctionnalité Move
ou Resize
à partir du menu de la fenêtre [Alt + Espace]) pour déplacer la fenêtre borde un pixel à la fois.
Existe-t-il un moyen de faire la même chose (ou une chose similaire) dans Ubuntu?
En supposant que vous utilisiez Unity, le script ci-dessous déplace ou redimensionne les fenêtres de 1 px. Le script peut être exécuté avec 8 arguments différents. En fonction des options de déplacement/redimensionnement que vous souhaitez utiliser, vous pouvez ajouter les commandes à une combinaison de touches de raccourci. Un aperçu des options et des commandes correspondantes ci-dessous:
Il y a quelques limitations:
gnome-terminal
les fenêtres ne peuvent être redimensionnées que par étapes. En conséquence, augmenter/diminuer la taille de la fenêtre de 1 px ne fonctionne pas avec gnome-terminal
.Installez d’abord wmctrl, qui est nécessaire pour obtenir la géométrie de la fenêtre et pour la déplacer.
Sudo apt-get install wmctrl
Créez un répertoire ~/bin
(donc dans votre répertoire personnel)
move_window
(sans extension).Rendez-le exécutable (cliquez avec le bouton droit sur le fichier> Propriétés> Autorisations (onglet), cochez la case "autoriser l'exécution")
Pour tester, ouvrez une fenêtre de terminal et exécutez ensuite:
move_window l
move_window r
move_window u
move_window d
Puisque la fenêtre du terminal est la plus en avant, elle devrait se déplacer de 1 pixel vers la gauche/la droite/le haut/le bas.
(Comme mentionné, redimensionnement ne fonctionne pas avec gnome-terminal
)
Si cela fonctionne correctement, ajoutez les commandes aux touches de raccourci;
choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez les commandes à quatre combinaisons de touches de raccourci différentes. Cela peut être délicat, car les commandes que vous avez mentionnées sont probablement occupées. Ce qui a fonctionné sur mon système:
pour les actions de déplacement.
Pour les actions de redimensionnement, vous devrez essayer des combinaisons supplémentaires.
#!/usr/bin/env python3
import subprocess
import sys
# calibration
cal = 4
# direction, as argument from user input (l, r, u, d / h+, h-, v+, v-)
direction = sys.argv[1]
# move step size
mv = -1 if direction in ["l", "d", "h-", "v-"] else 1
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command])\
.decode("utf-8")
def execute(command):
subprocess.call(["/bin/bash", "-c", command])
# find the top shift (height of the panel = resolution - working area)
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))[-1]
topshift = int(res) - int(get("wmctrl -d").split()[8].split("x")[-1])+cal
# find frontmost window
def get_windowid():
cmd = "xprop -root"
frontmost = [l for l in get(cmd).splitlines() if\
"ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
return frontmost[:2]+"0"+frontmost[2:]
# get window geometry, create move command
set_w = [w.split()[0:6] for w in get("wmctrl -lG").splitlines()\
if get_windowid() in w][0]
set_w[0] = "wmctrl -ir "+set_w[0]+" -e 0"
set_w.pop(1)
if direction in ["l", "r"]:
set_w[1] = str(int(set_w[1])+mv); set_w[2] = str(int(set_w[2])-topshift)
Elif direction in ["u", "d"]:
set_w[2] = str(int(set_w[2])-topshift-mv)
Elif direction in ["v-", "v+"]:
set_w[2] = str(int(set_w[2])-topshift); set_w[4] = str(int(set_w[4])+mv)
Elif direction in ["h-", "h+"]:
set_w[2] = str(int(set_w[2])-topshift); set_w[3] = str(int(set_w[3])+mv)
execute((",").join(set_w))
Il y a une petite différence dans la manière dont wmctrl
indique la géométrie de la fenêtre et dans la façon dont wmctrl
définit la géométrie de la fenêtre. Dans le premier cas, il calcule à partir de l'écran complet (résolution), dans le second cas, à partir de la zone de travail (??). Même alors, le script devait "étalonner" 4 px verticalement, pour lequel je n’ai trouvé aucune explication satisfaisante. La bonne nouvelle est que sur différents ordinateurs, je n'ai constaté aucune différence dans l'écart.
Si dans votre cas la fenêtre fait des sauts inattendus, laissez un commentaire.
Comment ça marche
La fenêtre la plus à l'avant est levée à l'aide de xprop
:
xprop -root
Quelque part dans la sortie (extensive), il y a une ligne comme:
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x4600a8d
à partir duquel notre identifiant de fenêtre peut être analysé: 0x4600a8d
. Le format étant un peu différent de wmctrl
, il faut ajouter un zéro à la troisième position: 0x04200085
L'identifiant de la fenêtre est utilisé pour rechercher la fenêtre et ses données de géométrie actuelles dans la sortie de wmctrl -lG
. Une fois que nous avons la bonne ligne, les données que nous avons sur la fenêtre se présentent comme suit:
0x04200085 0 322 52 823 998 <computer_name> <window_name>
où les colonnes 2, 3, 4 et 5 sont ensuite:
en manipulant ces figures, nous pouvons déplacer/redimensionner la fenêtre avec la commande:
(exemple pour déplacer la fenêtre de 1 px vers la droite en remplaçant "322" par "323")
wmctrl -ir 0x04200085 -e 0,323,52,823,998
Il y a quelques complications à gérer, mais c'est fondamentalement comment cela fonctionne.
Apparemment, cela ne fonctionne pas non plus dans XFCE. J'ai une idée indirecte qui pourrait fonctionner si ...
Je suggérerais d'essayer les options d'accessibilité pour contrôler la souris avec le clavier, en le configurant pour qu'il se déplace très lentement et l'utiliser pour que la fenêtre se déplace un petit peu à la fois.
Chaque poste de travail semble placer les options d'accessibilité à un endroit différent. Dans XFCE, il se trouve dans le gestionnaire de paramètres général, mais cela ne devrait pas être difficile à trouver dans Unity et autres ...