2009-07-07 27 views
6

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; 
+1

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

+0

Cevap yazarken, cevabınızı yanıt olarak göndermeniz daha iyi olurdu. –

cevap

3

Kodunuz hakkı (ben bunu test etmedim) arar ve açıkladığınız sonuçları hiç de garip görünmüyor. Metacity (ve diğer X pencere yöneticileri), pencere başlığını, kenarlıklarını ve diğer süslemelerini göstermek için uygulamanın sahip olduğu pencerelerin yakınında ve yakınında çok sayıda pencere oluşturacaktır.

Testinizi TVM gibi daha basit bir pencere yöneticisi ile çalıştırmayı deneyin (hatta hiç yok). TVM mevcut pencere yöneticilerinden çok daha az pencere oluşturmalıdır. Bu, işleri daha kolay anlatabilmelidir. Bununla birlikte, genellikle, pencere yöneticisine karşı savaşmak kötü bir fikirdir. Probleminizi, xlib'i doğrudan kullanmaktan daha üst düzeyde çözemez misiniz?

+0

Fikir, insan olarak çalışacak bir şey yazmak istediğimdi. xlib için yazmış olsaydım, sadece kullandım pencere yöneticisi için çalışmak yerine birçok sisteme taşınabilir olurdum. Daha sonra başka bir pencere yöneticisi ile kullanmayı deneyeceğim. –

3

Yapmak istediğiniz şey, root penceresinin _NET_CLIENT_LIST özelliğini sorgulamak olduğunu düşünüyorum. Bu, pencere yöneticisi tarafından oluşturulan "sanal" pencerelerinin tümü hariç tüm istemci pencereleri için bir Pencere Kimliği listesi oluşturacaktır. Çoğu pencere yöneticisi görünüşte _NET_CLIENT_LIST'u desteklemektedir, ancak verilen herhangi bir özelliğin desteklenip desteklenmediğini de sorgulayabilirsiniz.

+0

Teşekkür ederim ama İşe yarayan başka bir şey buldum.Çalışma yapmak için xwininfo'dan bir fuction kullanıyorum.Gerçekten önerdiğin şeyi yapabilirim, emin değilim.Yardım için teşekkürler .. –

+0

Cool, bir geçici çözüm bulduğuna sevindim. :) – rob