2009-06-18 14 views
11

Me gustaría saber cómo puedo preguntarle a X11 qué ventanas tienen foco. Y si por alguna razón mi propia aplicación (que puede ser visible o no) obtuvo el foco, quiero permitir que las ventanas anteriores se vuelvan a enfocar.¿Cómo saber qué ventana tiene foco y cómo cambiarla?

Por ejemplo, mi aplicación se está ejecutando con muchos otros (por ejemplo, Firefox, gvim, Nautilus, ...)

Supongamos que en un principio Firefox tiene el foco y que el usuario hizo clic en mi aplicación que ahora tiene el foco . Quiero que mi aplicación vuelva a centrarse en Firefox.

¿Alguien sabe cómo lograr esto? Las recomendaciones de libros serían muy buenas.

Muchas gracias.

Respuesta

6

Utilice este XQueryTree para buscar la ventana actualmente activa o superior.

Aquí es una función, cuando se le da una pantalla, se encuentra la ventana activa en ese momento:

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); 
} 

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

he encontrado la fuente:

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

Buena suerte

+1

Aiden, muchas gracias. Este código me ayudará. Lo he intentado e informa qué ventana está debajo del puntero del mouse, incluso si esta ventana no tiene foco. Quiero saber la ventana que realmente tiene foco. ¿Hay alguna manera en que mi aplicación se registre como oyente para estar informado al respecto? ¿O hay una función que puede proporcionar esta información sin la necesidad de usar la posición del mouse? Gracias de nuevo. –

+0

@Marcio - Bien puede valer la pena revisar el archivo de origen xprop.c del paquete xprop con respecto a qué funciones en libx11 usa para obtener esa información :) –

+0

Vi xprop.c ans xsnoop.c. Creo que podré adaptar ese código para usar con XSetInputFocus y obtener el comportamiento que quiero. Atentamente. –

15

Tome una mirada en el valor de la ventana raíz que es fijado por la mayoría de los gestores de ventanas modernas:

xprop -root _NET_ACTIVE_WINDOW 

Este valor puede, por supuesto, ser obtenida mediante llamadas de biblioteca Xlib.

9

Probablemente desee la llamada XGetInputFocus.

Window focused; 
int revert_to; 

XGetInputFocus(dpy, &focused, &revert_to); 

En este fragmento, focused será la ventana con el foco de entrada actual, hacer que los eventos de teclado y presionar un botón del ratón.

Esto funcionará incluso si el administrador de ventanas no establece la propiedad en la ventana raíz, como lo especifica EWMH. Algunos administradores de ventanas, como dwm y mi 9wm, no configuran esto.

+2

También preguntó "cómo cambiarlo", 'XSetInputFocus' puede hacer eso, por ejemplo:' XSetInputFocus (display, window_to_focus, RevertToNone, CurrentTime); ' –

Cuestiones relacionadas