Transformation de coordonnées
Sous X Window, vous pouvez créer des descendants de fenêtres.
Vous pouvez avoir besoin dans certains cas de traduire des coordonnées pour un point dans une fenêtre en coordonnées dans une autre fenêtre.
Pour cela, vous utiliserez la fonction XTranslateCoordinates
Bool XTranslateCoordinates(Display *display, Window src_w, dest_w, int src_x, int src_y, int *dest_x_return, int *dest_y_return, Window *child_return);
En entrée:
display ...
src_w : Handle de la fenêtre à partir de laquelle les coordonnées d'un point sont issues.
dest_w : Handle de la fenêtre dans laquelle vous voulez récupérer les coordonnées.
src_x, src_y : coordonnées d'un point d'origine
dest_x_return, dest_y_return : variables qui recevront les coordonnées converties
child_return : handle d'une fenêtre fille dans laquelle se trouve aussi le point par rapport au handle de la fenêtre destination.
En sortie:
La fonction retourne true si tout est ok, et dest_x_return, dest_y_return recoivent les coordonnées converties par rapport à la fenêtre destination.
child_return reçoit le handle d'une fenêtre fille à dest_w si les coordonnées sont contenues dans cette fenêtre fille, sinon, la valeur sera positionnée à None.
Si la fontion retourne false, à priori, vous demandez de convertir des coordonnées de deux fenêtres qui ne se trouvent pas dans le même écran !
XTranslateCoordinates pouvant générer BadWindow en erreur si
les handles sont invalides.
Cette fonction pourra être utilisée par exemple pour convertir la position de la souris dans une fenêtre en position dans l'écran en indiquant la root window. A moins que vous n'utilisiez l'évènement qui le fait déjà !
Voici un exemple:
Je reprends les bases du code qui m'affiche les coordonnées de la souris à chaque fois que celle-ci bouge.
L'évènement me retourne donc les coordonnées relatives à la fenêtre et celles par rapport à la root window. J'ai ajouté le code utilisant XTranslateCoordinates en indiquant les coordonnées dans la fenêtre et en demandant à les convertir dans la fenêtre root. Normalement, elles devraient être identiques avec celles retournées par l'évènement !