X Penceresini ekranda belirli bir konuma getirmeye çalışıyorum. İnsanların bunu yapması için bir işlev istediğimde, XQueryTree'yi yinelemeli olarak çağıracağınızı söylediler.X11 kodumdaki sorun nedir?
Bu, bir şekilde yanlış olduğunu düşündüğüm kod parçacığıdır. Hata ayıkladığımda, mükemmel çalışıyor gibi görünüyor. Tek sorun, verdiği verimin biraz garip gelmesi. Kök pencerede XQueryTree yaptığımda, yalnızca 5 tane açık olduğumda yüzlerce çocuğum olsun. Ayrıca, sadece birinin olmadığı bir yerde üst düzey bir pencere olduğunu düşünür ve sonuç olarak döndürür. Pencerelerimin etrafını nasıl değiştirdiğim önemli değil, XQueryTree penceremin üstündekinumaralı pencerenin (tüm ekranı kaplamıyor) başka bir pencere olduğunu belirtiyor gibi görünüyor. Pencerenin nerede olduğunu söylediğim yere baktığımda, bu biraz keyfi. masaüstümde işaret et.
Eğer bu herhangi bir yardımcı olursa: Ekran XOpenDisplay (NULL) 'den ve orijinal olarak ilettiğim kök pencere XDefaultRootWindow (display)' dir. Metacity ile debian altında gnome koşuyorum.
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;
}
DÜZENLEME: Benzer bilgi arayan herkes için: xwininfo kaynağına baktım. Anahtar işlevi dsimple.c dosyasındaki Find_Client'dir, bu da aslında pencere yöneticisini gerçekten aradığınız pencereyi görmezden gelir. Alt pencerelere bakmak istiyorsanız, bu, XTranslateCoordinates kullanarak, alt pencerelerin içinde yinelemeli olarak görünecek olan dsimple.c dosyasında Select_Window öğesine eklediğim bazı kodlardır.
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;
Birinin gerçekten bir xlib sorusu sorduğuna inanamıyorum! Xlib kullanıyorum ama sorununuzu ayıklamaya yardımcı olmak için yeterli değil :( – hhafez
Cevap yazarken, cevabınızı yanıt olarak göndermeniz daha iyi olurdu. –