2009-06-18 14 views
11

X11'in hangi pencerelere odaklanacağını nasıl sorabilirim. Ve herhangi bir nedenle kendi uygulama (görünebilir veya görünmüyor olabilir) odağı aldım, eski pencerelerin tekrar odağa girmesini istiyorum. ÖrneğinHangi pencerenin odaklandığı ve nasıl değiştirileceği nasıl bilinir?

, başvurum diğerleri ile çalışıyor (örneğin firefox gvim, Nautilus, ...)

ilk ateş de odak olduğunu varsayalım ve kullanıcı uygulamama tıkladığını şimdi odağı olan . Uygulamamın tekrar firefox'a odaklanmasını istiyorum.

Bunu nasıl başaracağını bilen var mı? Kitap önerileri çok güzel olurdu.

Çok teşekkürler.

cevap

6

Geçerli olarak veya en çok pencereyi bulmak için bu XQueryTree kullanın. Bir ekran verildiğinde İşte

bir fonksiyondur, bu odakta Geçerli pencereyi bulacaksınız:

http://examples.oreilly.com/networksa/tools/xsnoop.c

:

http://tronche.com/gui/x/xlib/window-information/XQueryTree.html

static Window 
GetCurrWindow(d) 
Display *d; 
{ 
Window foo; 
Window win; 
int bar; 

    do{ 
    (void) XQueryPointer(d, DefaultRootWindow(d), &foo, &win, 
     &bar, &bar, &bar, &bar, &bar); 
    } while(win <= 0); 


#ifdef VROOT 
    { 
    int n; 
    Window *wins; 
    XWindowAttributes xwa; 

    (void) fputs("=xwa=", stdout); 

    /* do{ */ 
     XQueryTree(d, win, &foo, &foo, &wins, &n); 
    /* } while(wins <= 0); */ 
    bar=0; 
    while(--n >= 0) { 
     XGetWindowAttributes(d, wins[n], &xwa); 
     if((xwa.width * xwa.height) > bar) { 
     win = wins[n]; 
     bar = xwa.width * xwa.height; 
     } 
     n--; 
    } 
    XFree(wins); 
    } 
#endif 
    return(win); 
} 
Ben kaynağını bulduk İyi Şanslar

Bu değer, elbette, Xlib kütüphane çağrıları kullanılarak elde edilebilir

xprop -root _NET_ACTIVE_WINDOW 

: 10

+1

Aiden, çok teşekkürler. Bu kod bana yardımcı olacak. Denedim ve bu pencere odak olmasa bile fare işaretçisinin altında hangi pencere olduğunu bildiriyor. Gerçekten odaklanmış pencereyi bilmek istiyorum. Uygulamamın kendisinden haberdar olmak için bir dinleyici olarak kendini kaydettirmesinin bir yolu var mı? Ya da fare pozisyonu kullanmadan bu bilgiyi verebilecek bir fonksiyon var mı? Tekrar teşekkürler. –

+0

@Marcio - Bu bilgiyi elde etmek için libx11'de hangi işlevlerin kullanıldığına ilişkin xprop paketinin xprop.c kaynak dosyasını incelemeye değer olabilir :) –

+0

xprop.c ans xsnoop.c'yi gördüm. Ben XSetInputFocus ile kullanmak için bu kodu adapte edebilecek ve istediğim davranışı elde edebileceğime inanıyorum. Saygılarımızla. –

15

en modern pencere yöneticileri tarafından ayarlanır kök penceresinin değerinde bir göz atın.

9

Muhtemelen XGetInputFocus numaralı telefonu arayın. Bu pasajda

Window focused; 
int revert_to; 

XGetInputFocus(dpy, &focused, &revert_to); 

, focused klavye olayları ve fare düğmesini presleri alma, geçerli giriş odaklı pencere olacaktır.

Pencere yöneticisi, EWMH tarafından belirtildiği gibi, kök penceresinde özelliğini ayarlamıyor olsa bile bu işleyecektir. Dwm ve 9wm gibi birkaç pencere yöneticisi bunu ayarlamıyor.

+2

'a hoş geldiniz "Nasıl değiştirilir" diye sordu, "XSetInputFocus" bunu yapabilir, örneğin: XSetInputFocus (display, window_to_focus, RevertToNone, CurrentTime); –

İlgili konular