Cómo lidiar con OpenGL y pantalla completa en OS X

9

Realizo la mayor parte de mi desarrollo en OS X y para mi proyecto de juego actual este es mi entorno objetivo. Sin embargo, cuando juego juegos, juego en Windows. Como jugador de Windows, estoy acostumbrado a que Alt + Tab cambie del juego a la última aplicación que estaba abierta.

En OS XI actualmente no puedo encontrar un juego que lo soporte ni tampoco puedo encontrar una manera de hacerlo posible. Mi proyecto actual se basa en SDL 1.3 y puedo ver que cmd + tab es una secuencia que se envía directamente a mi aplicación y no es interceptada por el sistema operativo.

Ahora, mi primer intento fue ocultar la ventana de representación en cmd + pestaña que ciertamente funciona, pero tiene la desventaja de que una ventana OpenGL oculta en SDL no se puede restaurar cuando el usuario vuelve a la aplicación. En primer lugar, no hay ningún evento activado para eso o no puedo encontrarlo, en segundo lugar, el problema central es que cuando la ventana de la aplicación está oculta, mi juego sigue siendo la aplicación activa, solo que la ventana desapareció.

Eso es increíblemente molesto.

¿Alguna idea de cómo aproximar el comportamiento de Windows / Linux para alt + tab?

Armin Ronacher
fuente

Respuestas:

2

El problema es que está capturando la pantalla, como se describe en la documentación de Apple aquí: https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html

Esto significa que TODOS los comandos del teclado son interceptados por su aplicación. Hay ventajas en este enfoque, dependiendo de su aplicación.

Los documentos de Apple dicen, en la parte inferior:

Nota: No es necesario capturar una pantalla para hacer un dibujo a pantalla completa. Otro enfoque es crear y dibujar en una ventana sin bordes el tamaño de la pantalla. Este enfoque le permite utilizar todas las funciones del sistema de ventanas. También funciona bien con el resto del sistema operativo, y reduce la complejidad del manejo de la pantalla (por ejemplo, no tiene que preocuparse por las pantallas reflejadas). Con este enfoque, puede recibir alertas de error que podrían perderse con una pantalla capturada. También puede usar Command-Tab para cambiar las aplicaciones con este enfoque. En sistemas con hardware gráfico moderno, el rendimiento del dibujo en una ventana de pantalla completa es casi tan rápido como el contexto de un dibujo de pantalla completa.

Lo que debe hacer es hacer que su vista OpenGL sea de pantalla completa sin capturar la pantalla. Así es como cocos2d maneja actualmente las aplicaciones OS X a pantalla completa. Puede buscar el código para cocos2d Mac aquí: https://github.com/cocos2d/cocos2d-iphone/tree/master-v2/cocos2d/Platforms/Mac

Mire específicamente en CCDirectorMac.m y CCGLView.m para su implementación.

Si determina que desea limitar selectivamente algunas de las funciones, como el cambio de proceso, sin limitar todas las características del sistema de ventanas, puede consultar la Nota técnica del modo Kiosk de Apple: http://developer.apple.com /library/mac/#technotes/KioskMode/Introduction/Introduction.html

Arcilla
fuente
1

Mi experiencia con esto en Mac es que normalmente hay un acceso directo para salir del modo de pantalla completa al modo de ventana (generalmente CMD + M o CMD + Retorno). Una vez que haya cambiado al modo de ventana, podrá acceder a todas sus aplicaciones de manera normal. El modo ventana también permite al usuario monitorear su juego entre todas sus otras aplicaciones. Así que supongo que podrías implementar este tipo de funcionalidad en tu juego.

James Bedford
fuente