Xlib: XGetWindowAtsortingbutes renvoie toujours 1×1?

Je voudrais avoir la largeur et la hauteur de la fenêtre actuellement focalisée. La sélection de la fenêtre fonctionne comme un charme, alors que la hauteur et la largeur sont toujours renvoyées 1.

#include  #include  int main(int argc, char *argv[]) { Display *display; Window focus; XWindowAtsortingbutes attr; int revert; display = XOpenDisplay(NULL); XGetInputFocus(display, &focus, &revert); XGetWindowAtsortingbutes(display, focus, &attr); printf("[0x%x] %dx %d\n", (unsigned)focus, attr.width, attr.height); return 0; } 

N’est-ce pas la “vraie” fenêtre mais le composant actuellement actif (comme une zone de texte ou un bouton?) Et pourquoi aurait-il alors la taille de 1×1? Si tel est le cas, comment puis-je obtenir la fenêtre principale de l’application contenant ce contrôle? Signifie … un peu la fenêtre de niveau supérieur, la fenêtre la plus haute, à l’exception de la fenêtre racine.

PS: Je ne sais pas si c’est vraiment important. J’utilise Ubuntu 10.04 32 et 64 bits.

Vous avez raison – vous voyez une fenêtre enfant. Les applications GTK, en particulier, créent une fenêtre enfant sous la fenêtre “réelle”, toujours égale à 1×1, qui obtient toujours le focus lorsque l’application a le focus. Si vous exécutez simplement votre programme à l’aide du terminal GNOME, vous verrez toujours une application GTK avec le focus (le terminal).

Si vous exécutez votre programme de manière à ce qu’un programme non-GTK ait le focus, ce n’est pas le cas, mais vous pouvez toujours trouver une fenêtre enfant avec le focus au lieu de la fenêtre de niveau supérieur. (Une des façons de le faire est de lancer sleep avant votre programme comme ceci: sleep 4; ./my_program – cela vous donne une chance de changer de focus.)

Pour trouver la fenêtre de niveau supérieur, je pense que XQueryTree aidera: il renvoie la fenêtre parente.

Cela a fonctionné pour moi:

 #include  #include  #include  /* Returns the parent window of "window" (ie the ancestor of window that is a direct child of the root, or window itself if it is a direct child). If window is the root window, returns window. */ Window get_toplevel_parent(Display * display, Window window) { Window parent; Window root; Window * children; unsigned int num_children; while (1) { if (0 == XQueryTree(display, window, &root, &parent, &children, &num_children)) { fprintf(stderr, "XQueryTree error\n"); abort(); //change to whatever error handling you prefer } if (children) { //must test for null XFree(children); } if (window == root || parent == root) { return window; } else { window = parent; } } } int main(int argc, char *argv[]) { Display *display; Window focus, toplevel_parent_of_focus; XWindowAtsortingbutes attr; int revert; display = XOpenDisplay(NULL); XGetInputFocus(display, &focus, &revert); toplevel_parent_of_focus = get_toplevel_parent(display, focus); XGetWindowAtsortingbutes(display, toplevel_parent_of_focus, &attr); printf("[0x%x] %dx %d\n", (unsigned)toplevel_parent_of_focus, attr.width, attr.height); return 0; }