2010-10-11 24 views
3

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 tandis que la hauteur et la largeur sont toujours retournaient 1.Xlib: XGetWindowAttributes renvoie toujours 1x1?

#include <X11/Xlib.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    Display *display; 
    Window focus; 
    XWindowAttributes attr; 
    int revert; 

    display = XOpenDisplay(NULL); 
    XGetInputFocus(display, &focus, &revert); 
    XGetWindowAttributes(display, focus, &attr); 
    printf("[0x%x] %d x %d\n", (unsigned)focus, attr.width, attr.height); 

    return 0; 
} 

est-ce pas la fenêtre « réel », mais le composant actuellement actif (comme une zone de texte ou un bouton?) Et pourquoi aurait-il la taille de 1x1 de toute façon alors? Si c'est le cas, comment puis-je obtenir la fenêtre principale de l'application contenant ce contrôle? Moyens ... un peu la fenêtre de niveau supérieur, la fenêtre la plus haute sauf la fenêtre racine. PS: Je ne sais pas si c'est vraiment important; J'utilise Ubuntu 10.04 32 et 64 bits.

Répondre

9

Vous avez raison - vous voyez une fenêtre enfant. Les applications GTK, en particulier, créent une fenêtre enfant sous la fenêtre "real", qui est toujours 1x1, et qui obtient toujours le focus lorsque l'application a le focus. Si vous exécutez votre programme en utilisant le terminal GNOME, vous verrez toujours une application GTK avec le focus (le terminal).

Si vous exécutez votre programme de telle manière qu'un programme non-GTK ait le focus, alors cela ne se produit pas, mais vous pourriez toujours trouver une fenêtre enfant avec le focus au lieu du top- fenêtre de niveau. (Une façon de le faire est d'exécuter sleep avant votre programme comme celui-ci: sleep 4; ./my_program - cela vous donne une chance de changer la mise au point.)

Pour trouver la fenêtre de niveau supérieur, je pense que XQueryTree va aider - elle renvoie la fenêtre parent.

Cela a fonctionné pour moi:

#include <X11/Xlib.h> 
#include <stdio.h> 
#include <stdlib.h> 

/* 
Returns the parent window of "window" (i.e. 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; 
    XWindowAttributes attr; 
    int revert; 

    display = XOpenDisplay(NULL); 
    XGetInputFocus(display, &focus, &revert); 
    toplevel_parent_of_focus = get_toplevel_parent(display, focus); 
    XGetWindowAttributes(display, toplevel_parent_of_focus, &attr); 
    printf("[0x%x] %d x %d\n", (unsigned)toplevel_parent_of_focus, 
     attr.width, attr.height); 

    return 0; 
} 
+0

accepter: merci Doug. fonctionne comme un charme! :) Cordialement – Atmocreations