À propos de wmctrl
Avec wmctrl
(non installé par défaut), nous pouvons obtenir des informations sur les fenêtres, leur identifiant, leur géométrie, le pid auquel elles appartiennent, etc. Nous pouvons également déplacer ou redimensionner des fenêtres avec plusieurs commandes. Cependant, à certains égards, son comportement ne semble pas logique. Ma question concerne le déplacement des fenêtres par wmctrl
:
Obtenir des informations
Lorsque j'exécute la commande:
wmctrl -lG
Je reçois (ao) les informations suivantes sur la fenêtre dans l'image (s) ci-dessous:
0x04200085 0 746 443 468 205 jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
Dans la colonne 3-5, les informations de géométrie nous indiquent les coordonnées x / y et la largeur / hauteur.
Déplacer / redimensionner la fenêtre
Lorsque je mets ces coordonnées dans la wmctrl
commande pour déplacer / redimensionner une fenêtre, cela ne devrait rien faire, car les coordonnées sont inchangées:
wmctrl -ir 0x04200085 -e 0,746,443,468,205
Déviation
Cependant, les images ci-dessous montrent que la fenêtre est déplacée vers le bas (28 pixels pour être précis). J'ai supposé que la raison était que la commande de wmctrl
déplacement de la fenêtre était calculée avec la zone de travail (écran moins la hauteur du panneau), tandis que la wmctrl -lG
commande était calculée avec la taille totale de l'écran . Ensuite, 4px reste inexpliqué cependant (le panneau a une hauteur de 24px).
Bien que l'écart puisse très bien être compensé dans les scripts, le fait que je ne comprends pas la cause n'est pas satisfaisant, donc la question est:
Quelle est exactement la cause de cet écart?
Le déplacement d'une fenêtre avec les coordonnées exactes dans la sortie de wmctrl -lG
ne doit pas déplacer la fenêtre, mais
la source
Réponses:
Ce qui se passe, c'est que wmctrl retourne la géométrie de la fenêtre à l'intérieur des décorations (c'est-à-dire sans inclure la barre de titre et les bordures) mais utilise la plus grande position de la fenêtre pour le déplacement.
(Certaines lignes de sortie de commande ont été supprimées:
xdotool
peuvent ne pas être installées)La commande suivante demande la fenêtre d'intérêt et retourne la fenêtre parent qui inclut toutes les décorations et varie en fonction du thème de la fenêtre utilisée.
Comme vous pouvez le voir, c'est une fenêtre différente; la position X commence 2 pixels à gauche (702-2) et la largeur totale est plus grande de 4 pixels (900 + 2 + 2) car la bordure droite est également de 2 pixels. Y est plus élevé (au-dessus de la bordure supérieure, le cas échéant, et de la barre de titre); la hauteur est plus grande à cause de tout cela, plus la bordure inférieure.
wmctrl déplace la fenêtre parent à la position [X, Y] souhaitée de la fenêtre enfant; la largeur et la hauteur sont appliquées correctement à l'enfant, comme indiqué dans la section «avant et après» ci-dessous.
Modifier: informations supplémentaires.
Géométrie du bureau, fenêtre et zone de travail
https://github.com/jordansissel/xdotool
Re: Astuce @Sneetsher dans les commentaires
la source
xdotool selectwindow
est25166060
, mais quelle est la marche à suivre0x18000ec
? J'ai essayé la conversion de l'hexadécimal, mais cela ne semble pas être le cas.xdotool getwindowgeometry 0x18000ec
renvoie l'ID de fenêtre décimale de 25166060 (parent). Je viens de saisir la valeur hexadécimale de 0x18000ec pour montrer que ce n'était pas 0x04000040 (l'enfant). Soit dit en passant, je viens de relancer tout le test avec des chiffres plus faciles dans l'espoir que vous ne regardiez pas. Voir la révision d'édition précédente si vous étiez au milieu de quelque chose.xprop
semble montrer un rembourrage de décoration:_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6
et_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6
. Il peut être utile de vérifier.xdotool selectwindow
commande se comporte différemment sous KDE et Unity? La sortie de laxdotool selectwindow
commande se réfère exactement à la même fenêtre (-id) et (donc)xdotool getwindowgeometry
sort les mêmes données quewmctrl -lG
. Laxprop
commande cependant, comme suggéré par des spectacles @Sneetsher_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
, ce qui est exactement ce que je mesuré manuellement, et prouve l'essence de votre réponse est correcte, et il est la réponse parfaite à ma question. Je suis impressionné par votre minutie. Merci!J'ai eu le même problème et j'ai pu trouver une solution de contournement.
Situation
Ma situation est basée sur Mate 16.04 avec Compiz installé (qui active le gestionnaire de fenêtres gtk)
J'utilise un script connecté à des raccourcis clavier pour placer des fenêtres sur des endroits prédéfinis. Ce script échoue si je n'utilise pas l'option maximisée.
Une analyse
Le problème pourrait être activé et désactivé en activant et des décorations de fenêtre dans les paramètres (compiz).
solution de contournement
Les décorations de fenêtre peuvent être activées et désactivées en utilisant python pour une fenêtre spécifique (en utilisant les raccourcis clavier, il est pratique d'utiliser la fenêtre active).
Vous pouvez ensuite désactiver les décorations de fenêtres, déplacer la fenêtre et activer les décorations de fenêtres.
la source