Quelles sont les causes de l'écart dans la commande de déplacement de la fenêtre wmctrl

13

À 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 wmctrlcommande 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 -lGcommande é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 -lGne doit pas déplacer la fenêtre, mais

entrez la description de l'image ici

entrez la description de l'image ici

Jacob Vlijm
la source
Ma solution "floue" consistait à enregistrer les coordonnées actuelles, à les déplacer, à obtenir les nouvelles coordonnées, à soustraire les coordonnées enregistrées pour obtenir les différences. Appliquez ensuite les différences aux coordonnées d'origine et passez aux coordonnées ajustées. C'est plus facile qu'il n'y paraît.
WinEunuuchs2Unix

Réponses:

18

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: xdotoolpeuvent ne pas être installées)

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x04000040
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

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.

$ xdotool selectwindow
25166060

$ xdotool getwindowgeometry 0x18000ec
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

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.

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

$ wmctrl -ir 0x04000040 -e 0,702,23,900,950   # <----- "MOVE/RESIZE" *****

$ wmctrl -lG
0x04000040  0 704  46   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 702,23 (screen: 0)    <----- Desired [X,Y] applied to parent
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 704,46 (screen: 0)
  Geometry: 900x950               <----- Desired [W,H] applied to child

Modifier: informations supplémentaires.

Géométrie du bureau, fenêtre et zone de travail

$ wmctrl -d    # (KDE)
0  * DG: 1680x1050  VP: 0,0  WA: 0,0 1680x1015  Desktop 1
$ xdotool -v
xdotool version 3.20140217.1

https://github.com/jordansissel/xdotool

Re: Astuce @Sneetsher dans les commentaires

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4
Daxx
la source
Cela ressemble à une excellente réponse! J'examinerai ses détails ce soir.
Jacob Vlijm
pour ma compréhension, la sortie de xdotool selectwindowest 25166060, mais quelle est la marche à suivre 0x18000ec? J'ai essayé la conversion de l'hexadécimal, mais cela ne semble pas être le cas.
Jacob Vlijm
La sortie de xdotool getwindowgeometry 0x18000ecrenvoie 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.
Daxx
2
@JacobVlijm, xpropsemble montrer un rembourrage de décoration: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6et _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Il peut être utile de vérifier.
user.dz
Est-il possible que la xdotool selectwindowcommande se comporte différemment sous KDE et Unity? La sortie de la xdotool selectwindowcommande se réfère exactement à la même fenêtre (-id) et (donc) xdotool getwindowgeometrysort les mêmes données que wmctrl -lG. La xpropcommande 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!
Jacob Vlijm
0

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

#!/usr/bin/python
from gtk.gdk import *
import gtk.gdk
import time
import sys

w = gtk.gdk.get_default_root_window().get_screen().get_active_window()
w.set_decorations(0) #use 1 to turn on decorations
window_process_all_updates()
gtk.gdk.flush()

Vous pouvez ensuite désactiver les décorations de fenêtres, déplacer la fenêtre et activer les décorations de fenêtres.

Sextus Empiricus
la source