Pregunta ¿Determinar si WindowServer está disponible?


Estoy escribiendo un marco para OS X que puede ser utilizado por aplicaciones con o sin conexión a Windows XServer (es decir, tanto las aplicaciones GUI como las aplicaciones de línea de comandos se ejecutan a través de, por ejemplo, una sesión ssh). Una clase en el marco es para rastrear los archivos en la carpeta de inicio del usuario a través de los directorios de inicio de netework y mobile (en OS X, los usuarios pueden recibir su directorio de inicio a través de AFP desde un servidor, un "directorio de inicio de red", o misma carpeta de inicio sincronizada para el acceso sin conexión: un "directorio de inicio móvil").

Como necesito rastrear archivos a través de sistemas de archivos, hemos elegido usar rutas relativas, en lugar de alias de OS X (o el 10.6 NSURL marcadores). Cuando no se puede encontrar un archivo, necesito pedirle al usuario una entrada para reubicar ese archivo (por ejemplo, cómo el Administrador de alias solicita al usuario que vuelva a conectar un alias roto). Si la aplicación tiene (o puede hacer) una conexión al WindowServer, esto es tan simple como usar una NSOpenPanel. Sin embargo, cuando la aplicación no puede establecer una conexión con el WindowServer, necesito usar un método alternativo para obtener la entrada del usuario.

Entonces, ¿cómo puedo decir qué método usar desde el código de famework? ¿Hay una manera de determinar mediante programación si una conexión de WindowServer está disponible (o es posible)?

Reconozco que una arquitectura alternativa, donde el cliente de marco proporciona un mecanismo de devolución de llamada para solicitar al usuario, permitiría que la aplicación que llama proporcione la estrategia de recopilación de entrada. Sin embargo, me gustaría hacer las cosas lo más simples posible para la aplicación de llamada, por lo que mi primera opción sería encapsular estos detalles en el marco si es posible.


5
2017-09-08 16:51


origen


Respuestas:


Hay una variable de entorno llamada SECURITYSESSIONID que se establece mediante loginwindow.app y se pasa a las aplicaciones del usuario. La variable no se establece si inicia sesión a través de ssh. Sirve como una especie de identificador para hablar con el servidor de Windows.

Problema: la existencia de esta variable no significa que este usuario controle actualmente el administrador de ventanas (piense en cambiar rápidamente de usuario).

Hay una función llamada CGSessionCopyCurrentDictionary en el marco ApplicationServices que parece prometedor:

Valor de retorno: Un diccionario de sesión del servidor de Windows o NULL si la persona que llama no se está ejecutando dentro de una sesión de la interfaz gráfica de usuario de Quartz o si el servidor de Windows está deshabilitado. Deberías liberar el diccionario cuando termines de usarlo. Para obtener información sobre los pares clave-valor en este diccionario, consulte "Propiedades de la sesión del servidor de Windows".


7
2017-09-08 17:13