Estoy tratando de obtener la ventana X en una determinada ubicación en la pantalla. Cuando le pedí a las personas una función para hacer esto, me dijeron que simplemente llamarías a XQueryTree recursivamente.¿Qué pasa con mi código X11?
Este es el fragmento de código que, de alguna manera, creo que está mal. Cuando lo depuro, parece funcionar perfectamente. El único problema es que la salida que da parece un poco extraña. Cuando hago XQueryTree en la ventana raíz, obtengo cientos de niños, cuando solo tengo cinco o menos abiertos. Además, parece pensar que hay una ventana de nivel superior en algún lugar donde simplemente no hay una, y la devuelve como resultado. No importa cómo mueva mis ventanas reales, XQueryTree parece indicar que hay otra ventana en la parte superior de mis ventanas (que no cubre toda la pantalla). Cuando miro dónde dice que está la ventana, está en algún lugar arbitrario apuntar en mi escritorio
Si esto es de alguna ayuda: La pantalla es de XOpenDisplay (NULL), y la ventana raíz que originalmente le paso es XDefaultRootWindow (pantalla). Estoy ejecutando GNOME bajo Debian con metacity.
point getwindowatloc(Display * display, Window root, jint x, jint y) {
Window returnedroot;
Window returnedparent;
Window * children;
unsigned int numchildren;
XQueryTree(display,root,&returnedroot,&returnedparent,&children, &numchildren);
XWindowAttributes w;
int i;
for(i=numchildren-1; i>=0; i--) {
XGetWindowAttributes(display,children[i],&w);
if(x>=w.x && x<=w.x+w.width && y>=w.y && y <= w.y+w.height) {
point result={w.x,w.y};
XFree(children);
return result;
} else {
point result=getwindowatloc(display,children[i],x-w.x,y-w.y);
if(result.x!=INT_MAX) {
result.x+=w.x;
result.y+=w.y;
XFree(children);
return result;
}
}
}
if(children) {
XFree(children);
}
return notfound;
}
¡Gracias!
EDITAR: Para cualquiera que esté buscando información similar: terminé buscando en la fuente de xwininfo. La función clave es Find_Client en dsimple.c, que de alguna manera ignora a los administradores de ventanas para obtener la ventana que realmente está buscando. Si desea examinar las subventanas, este es un código que agregué a Select_Window en dsimple.c, que buscará recursivamente dentro de las subventanas, utilizando XTranslateCoordinates.
Window child;
do {
XTranslateCoordinates(dpy,target_temp,target_win,x,y,&x,&y,&child);
target_temp=target_win;
target_win=child;
} while(target_win);
return target_temp;
¡No puedo creer que alguien realmente esté haciendo una pregunta de xlib aquí! He usado xlib pero no lo suficiente para ayudar a solucionar tu problema :( – hhafez
Sería mejor que publicaras tu solución como respuesta, en lugar de publicar una pregunta. –