2009-09-08 7 views
5

OS X WindowServer (예 : ssh 세션을 통해 실행되는 GUI 응용 프로그램과 명령 줄 응용 프로그램)에 연결되거나 연결되지 않은 응용 프로그램에서 사용할 수있는 OS X 용 프레임 워크를 작성 중입니다. 프레임 워크의 한 클래스는 네트워크 및 모바일 홈 디렉토리 (예 : OS X에서 사용자는 서버의 AFP를 통해 홈 디렉토리 ("네트워크 홈 디렉토리")를 통해 서비스받을 수 있음)를 통해 사용자의 홈 폴더에있는 파일을 추적하는 것입니다. 오프라인 액세스를 위해 동기화 된 동일한 홈 폴더 - "모바일 홈 디렉토리").WindowServer를 사용할 수 있는지 확인 하시겠습니까?

파일 시스템간에 파일을 추적해야하기 때문에 OS X 별칭 (또는 10.6 NSURL 책갈피)보다는 상대 경로를 사용하도록 선택했습니다. 파일을 찾을 수 없으면 별칭 관리자가 사용자에게 깨진 별칭을 다시 연결하라는 메시지를 표시하는 방법과 같이 해당 파일의 위치를 ​​변경하기위한 입력을 사용자에게 요청해야합니다. 응용 프로그램이 WindowServer에 연결되어 있거나 만들 수있는 경우에는 NSOpenPanel을 사용하는 것처럼 간단합니다. 그러나 응용 프로그램이 WindowServer에 연결할 수 없으면 다른 방법을 사용하여 사용자 입력을 얻어야합니다.

그래서 famework 코드에서 사용할 방법을 어떻게 알 수 있습니까? WindowServer 연결을 사용할 수 있는지 (또는 가능한지) 프로그래밍 방식으로 결정하는 방법이 있습니까?

프레임 워크 클라이언트가 사용자에게 묻는 콜백 메커니즘을 제공하는 대체 아키텍처가 호출 응용 프로그램에서 입력 수집 전략을 제공 할 수 있음을 알고 있습니다. 그러나 호출 응용 프로그램을 최대한 간단하게 만들고 싶습니다. 따라서 가능한 한 프레임 워크에 이러한 세부 정보를 캡슐화하는 것이 가장 좋습니다.

답변

7

loginwindow.app에 의해 설정되고 사용자의 응용 프로그램에 get이 전달되는 SECURITYSESSIONID이라는 환경 변수가 있습니다. ssh를 통해 로그인하면 변수가 설정되지 않습니다. 그것은 윈도우 서버와 대화하기위한 종류의 핸들 역할을합니다.

문제점 :이 변수가 존재한다고해서 현재 사용자가 창 관리자를 제어하고있는 것은 아닙니다 (빠른 사용자 전환이라고 생각 함). 호출자가 석영 GUI 세션이나 창 내에서 실행되지 않는 경우 윈도우 서버 세션 사전 또는 NULL :

반환 값 :

는 유망 보이는 ApplicationServices 프레임 워크 CGSessionCopyCurrentDictionary라는 기능이있다 서버가 사용 중지되었습니다. 사전 사용을 마쳤 으면 사전을 릴리스해야합니다. 이 사전의 키 - 값 쌍에 대한 자세한 내용은 "Window Server 세션 등록 정보"를 참조하십시오.

+2

윈도우 서버를 사용할 수없는 경우 CGWindowServerCFMachPort도이 경우 동일한 정보 (이 경우 NULL을 반환 함)를 제공합니다. 포인터 주셔서 감사합니다! –

+1

세션이 현재인지 확인하는 것을 잊지 마십시오 (사용자가 윈도우 서버를 제어합니다 : 빠른 스위치 전환이 없음) –

+1

현재 세션이 없어도'CGWindowServerCFMachPort' 라이온이 성공하므로 좋지 않습니다. 'CGSessionCopyCurrentDictionary'는 조금 더 신뢰할 만하지만 터미널에서 SSH를 말할 수는 없습니다. 왜냐하면 두 가지 모두 현재 전체 세션 정보를 제공하기 때문에 'SSH_CONNECTION'이 유일한 방법입니다. –

관련 문제