web-dev-qa-db-fra.com

Quelle est la cause de la déviation dans la commande de déplacement de la fenêtre wmctrl

À 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 aussi déplacer ou redimensionner fenêtres avec plusieurs commandes. Cependant, à certains égards, son comportement ne semble pas logique. Ma question concerne en mouvement windows by wmctrl:

Obtenir des informations

Quand je lance la commande:

wmctrl -lG

Je reçois (a.o.) les informations suivantes sur la fenêtre dans la ou les images 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éplacement/redimensionnement de la fenêtre

Lorsque je mets ces coordonnées dans la commande wmctrl pour déplacer/redimensionner une fenêtre, il ne doit rien faire car les coordonnées ne sont pas modifié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 (28px pour être précis). J'ai supposé que la raison en était que la commande wmctrldéplacement de la fenêtre était calculée à l'aide de la zone zone de travail (écran moins la hauteur du panneau), tandis que la commande wmctrl -lG était calculée. avec le 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 n'en comprenne pas la cause n'est pas satisfaisant. La question est donc:

Quelle est exactement la cause de cette déviation?


Le déplacement d'une fenêtre avec les coordonnées exactes dans la sortie de wmctrl -lG ne devrait pas déplacer la fenêtre, mais c'est le cas

enter image description here

enter image description here

10
Jacob Vlijm

Ce qui se passe, c’est que wmctrl renvoie la géométrie de la fenêtre à l’intérieur des décorations (c’est-à-dire sans la barre de titre et les bordures) mais utilise la position de fenêtre la plus grande pour le déplacement.

(Certaines lignes de sortie de commande supprimées: xdotool risque de ne pas être installé)

$ 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 qui vous intéresse et renvoie la fenêtre parente 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 constater, la fenêtre est différente. la position X commence à 2px à gauche (702-2) et la largeur totale est plus grande de 4px (900 + 2 + 2) car le bord droit est également à 2px. 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 parente à la position [X, Y] souhaitée de la fenêtre parente; La largeur et la hauteur sont correctement appliquées à l'enfant, comme indiqué dans "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

Edit: informations supplémentaires.

Géométrie de bureau, fenêtre d'affichage et 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
15
Daxx

J'ai eu le même problème et pouvais trouver une solution de contournement.


Situation

Ma situation est basée sur Mate 16.04 avec Compiz installé (ce qui active le gestionnaire de fenêtres gtk)

J'utilise un script connecté à des raccourcis clavier pour placer des fenêtres sur des emplacements 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 en décorant les fenêtres dans les paramètres (Compiz).


Workaround

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 des liaisons de clé, 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()

Ensuite, vous pouvez désactiver les décorations de fenêtre, déplacer la fenêtre et activer les décorations de fenêtre.

0