2011-06-17 32 views
5

Actualmente estoy tratando de habilitar alt-tabbing en mi ventana de Xlib OpenGL a pantalla completa, pero estoy teniendo algunas dificultades. He intentado XUnmapWindow(..), que funciona, pero la resolución no se reinicia (a menos que deba hacerlo manualmente?) Y mi ventana Xlib no aparece como una ventana minimizada (es decir, no puedo volver a tabular de nuevo en la ventana , aunque la aplicación todavía parece ejecutarse en segundo plano).minimizar pantalla completa OpenGL Window

Lo siguiente que probé fue cambiar mi ventana de pantalla completa a modo ventana (es decir, volver a crear la ventana otra vez en modo ventana), pero obviamente, prefiero no tener que hacer eso.

Estoy escuchando FocusOut y FocusIn eventos, y parece que se llama al FocusOut cuando alt-tab, pero no estoy seguro de cómo hacer que mi aplicación se minimice correctamente. Si no hago nada en mi código cuando se llama a un evento FocusOut, mi aplicación no hace nada (es decir, no puedo minimizar la ventana).

¡Cualquier ayuda sería apreciada!

Editar: Desafortunadamente, no he podido obtener X Windows para minimizar correctamente una ventana de pantalla completa. Por lo tanto, para evitar este problema, he decidido destroy() la ventana de pantalla completa y luego create() una nueva ventana en modo ventana. Parece que funciona bien.

+0

Esta información es un poco antigua, pero parece que XIconifyWindow no funciona cuando la ventana X está en modo de pantalla completa. Aquí está el enlace: http://www.rdesktop.org/archive/2001/msg00981.html. Menciona algunas soluciones alternativas, que probablemente probaré en algún momento. – Jarrett

+0

¡Gracias a @VJo y @datenwolf por su ayuda! – Jarrett

+0

¿qué estás usando? gnome o kde? –

Respuesta

4

XUnmapWindow() elimina por completo la ventana de la pantalla. Minimizar una ventana pasa a través de EMWH Estado ICCCM, para que el administrador de ventanas sepa, que la ventana todavía está allí en alguna forma. Y como ya asumió que es responsable de restablecer la resolución de pantalla. Esto es por cierto el mismo en Windows.

EDIT:

minimizar una ventana en Xlib se hace con XIconifyWindow, que se encargará de establecer las propiedades ICCCM correctas, y unmaps la ventana. Ambos deben hacerse para interactuar correctamente con el WM. Sin embargo, X11 solo define los métodos, no la política, por lo que al eliminar una ventana de pantalla completa, también es responsable de restablecer la resolución de la pantalla, como ya escribí anteriormente.

En una nota al margen: sugiero que no cambie la resolución en absoluto, sino que, si está disponible, renderice en un objeto framebuffer del tamaño objetivo y asigne el resultado final a la pantalla nativa completa tamaño. Si combinas esto con superposiciones nativas de texto de resolución/HUD (supongo que esto es para un juego o similar), obtienes una calidad percibida mucho más alta y guardas el cambio de resolución. Incluso puede combinar esto con tomar una captura de pantalla del escritorio y gradualmente desaparecer a su contenido.

EDIT 2 para referencia : XIconifyWindow es sólo una función de ayuda/conveniencia, su código fuente es

/* 
* This function instructs the window manager to change this window from 
* NormalState to IconicState. 
*/ 
Status XIconifyWindow(Display *dpy, Window w, int screen) 
{ 
    XClientMessageEvent ev; 
    Atom prop; 

    prop = XInternAtom(dpy, "WM_CHANGE_STATE", False); 
    if(prop == None) 
    return False; 

    ev.type = ClientMessage; 
    ev.window = w; 
    ev.message_type = prop; 
    ev.format = 32; 
    ev.data.l[0] = IconicState; 
    return XSendEvent(dpy, RootWindow(dpy, screen), False, 
      SubstructureRedirectMask|SubstructureNotifyMask, 
      (XEvent *)&ev); 
} 
+0

Hola @datenwolf, gracias por la información. ¿Sabes cómo codificar esto? :) Tengo un gran problema tratando de hacer que esto funcione. La solución de @VJo a continuación, desafortunadamente, no funciona, y estoy teniendo grandes dificultades para encontrar ejemplos en la red. Agradecería cualquier ayuda que pueda brindar. – Jarrett

+0

hey @datenwolf, me temo que ibas a decir 'XIconifyWindow', ya que lo he intentado sin éxito. Llamo a 'XIconifyWindow (display_, window_, screen _);' donde manejo el evento 'FocusOut' (que he confirmado que se llama IS cuando alt-tab en pantalla completa). Lo intenté en dos computadoras (una con Ubuntu 10.04 y otra con Linux Mint 10) sin resultado. – Jarrett

+0

@Jarret: ¿Puedo preguntar qué gestor de ventanas está usando? – datenwolf

1

Usted puede tratar de hacerlo de esta manera:

XEvent xev; 
Atom wm_state  = XInternAtom(dpy, "_NET_WM_STATE", False); 
Atom wm_hide_win = XInternAtom(dpy, "_NET_WM_STATE_HIDDEN", False); 

memset(&xev, 0, sizeof(xev)); 
xev.type = ClientMessage; 
xev.xclient.window = win; 
xev.xclient.message_type = wm_state; 
xev.xclient.format = 32; 
xev.xclient.data.l[0] = _NET_WM_STATE_ADD; 
xev.xclient.data.l[1] = wm_hide_win; 

XSendEvent(dpy, DefaultRootWindow(dpy), False, SubstructureNotifyMask, &xev); 

EDITAR

Si tiene acceso a la API de gnome, puede usar wnck_window_minimize(), o echar un vistazo a la fuente de esa función.

+0

Hola @VJo, gracias por la respuesta. Ingresé su código donde manejo el evento 'FocusOut', pero desafortunadamente, no pasa nada. También probé la variante donde usas 'xev.xclient.data.l [0] = _NET_WM_STATE_ADD; xev.xclient.data.l [1] = WM_STATE_MAXIMIZED_VERT; xev.xclient.data.l [2] = WM_STATE_MAXIMIZED_HORZ; 'sin efecto. ¿Hay algo que deba hacer para permitir que se procesen estos eventos? – Jarrett

+0

La iconografía de la ventana se hace un poco diferente, mira el fragmento del código fuente que extraje http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/Iconify.c – datenwolf

+0

hmm..Preferiría evitar usando el código específico de Gnome si puedo. – Jarrett