web-dev-qa-db-fra.com

Puis-je déplacer / redimensionner des fenêtres pixel par pixel avec mon clavier?

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?

4
Wilson F

Déplacement/redimensionnement des fenêtres par 1px

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:

enter image description here


Exceptions/limitations

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.
  • La fenêtre à déplacer/redimensionner doit être au moins quelques px à la fois du lanceur Unity et du panneau supérieur.

Comment utiliser

  • 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)

  • Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom 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:

    • Shift+Ctrl+arrow key left
    • Shift+Ctrl+arrow key right
    • Shift+Ctrl+arrow key up
    • Shift+Ctrl+arrow key down

    pour les actions de déplacement.
    Pour les actions de redimensionnement, vous devrez essayer des combinaisons supplémentaires.

Le scénario

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

Remarque

Il y a une petite différence dans la manière dont wmctrlindique la géométrie de la fenêtre et dans la façon dont wmctrldé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.


Explication

Comment ça marche

  1. 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

  2. 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:

    • coordonnée x du coin supérieur gauche de la fenêtre
    • y coordonne
    • largeur de la fenêtre
    • hauteur de la fenêtre
  3. 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.

5
Jacob Vlijm

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 ...

1
Xen2050