2010-04-20 31 views

Respuesta

5

Para activar otra ventana, lo que hay que hacer en la capa de protocolo Xlib es enviar un mensaje _NET_ACTIVE_WINDOW como se describe en la especificación EWMH http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html

Esto podría hacerse con el pitón-xlib (presumiblemente) o con gdk_window_focus() en una GdkWindow extranjera usando GDK a través de pygtk

_NET_ACTIVE_WINDOW es superior a XRaiseWindow() y ha estado en todos los WM importantes durante muchos años.

Debe evitar XSetInputFocus(), lo que causará problemas (especialmente si obtiene la marca de tiempo incorrecta). El problema es que WM no puede interceptar el SetInputFocus() por lo que causa condiciones de carrera raras e incoherencias de UI.

Realmente solo _NET_ACTIVE_WINDOW funciona correctamente, razón por la cual fue inventado, porque los hacks anteriores eran malos.

Hay una biblioteca llamada libwnck que te permitirá activar Windows (entre otras cosas) pero lamentablemente agrega bastante sobrecarga porque siempre rastrea todas las ventanas abiertas desde cualquier aplicación, incluso si no tienes que hacer ese. Sin embargo, si desea rastrear ventanas desde otras aplicaciones de todos modos, entonces libwnck tiene una función para activar esas ventanas que hace lo correcto y sería una buena opción.

El enfoque estrictamente correcto es comprobar si hay compatibilidad con EWMH _NET_ACTIVE_WINDOW (los documentos EWMH explican cómo hacerlo) y recurrir a XRaiseWindow si la WM no tiene _NET_ACTIVE_WINDOW. Sin embargo, dado que cualquier WM en el que se ha trabajado activamente en los últimos años tiene EWMH, muchas personas son flojas con respecto a la alternativa de las WM heredadas.

4

Debe llamar python-xlib y llamar al .circulate(Xlib.X.RaiseLowest) en el objeto ventana (que se puede identificar de muchas, muchas maneras diferentes; no puede adivinar cuál es el adecuado para usted a partir de la cantidad cero de información sobre él en su Q ;-). Para obtener un buen ejemplo del uso de python-xlib, consulte el administrador de ventanas tinywm: después de la versión C, el autor proporciona una versión de Python que necesita aproximadamente 30 líneas no en blanco, sin comentarios (para un administrador de ventanas utilizable, si es pequeño) ...! -).

4

Puede echar un vistazo a the python ewmh package. Documentation contiene ejemplos, pero aquí es cómo puede lograr lo que quiere:

from ewmh import EWMH 
import random 
ewmh = EWMH() 

# get every displayed windows 
wins = ewmh.getClientList() 

# let's active one window randomly 
ewmh.setActiveWindow(random.choice(wins)) 

# flush requests - that's actually do the real job 
ewmh.display.flush() 
Cuestiones relacionadas