2009-09-08 77 views
5

我正在編寫一個OS X的框架,可以被OS X WindowServer連接或不連接的應用程序使用(即GUI應用程序和命令行應用程序都可以通過例如ssh會話運行)。框架中的一個類是用於跟蹤網絡和移動主目錄中用戶主文件夾中的文件(在OS X上,用戶可以通過AFP從服務器提供主目錄 - 「網絡主目錄」 - 或者用於離線訪問的同一主文件夾同步 - 「移動主目錄」)。確定WindowServer是否可用?

因爲我需要跨文件系統跟蹤文件,所以我們選擇使用相對路徑,而不是OS X別名(或10.6 NSURL書籤)。當找不到文件時,我需要讓用戶輸入來重新定位該文件(例如,別名管理器如何提示用戶重新連接已破壞的別名)。如果應用程序具有(或可以建立)與WindowServer的連接,則這與使用NSOpenPanel一樣簡單。但是,當應用程序無法連接到WindowServer時,我需要使用其他方法來獲取用戶輸入。

那麼,我該如何判斷在famework代碼中使用哪種方法?有沒有一種方法來編程確定WindowServer連接是否可用(或可能)?

我認識到,可替換架構,其中,所述框架客戶端提供回調機制,以提示用戶將讓輸入收集策略通過調用應用程序來提供。但是,我想盡可能簡化調用應用程序,因此,如果可以,我的第一選擇是將這些細節封裝在框架中。

回答

7

有一個名爲SECURITYSESSIONID一個環境變量,由loginwindow.app set和get的傳遞給用戶的應用程序。如果通過ssh登錄,變量不會被設置。它可以作爲與窗口服務器交談的一種手段。

問題:這個變量的存在並不意味着該用戶目前控制的窗口管理器(想快速用戶切換)。

有一個在ApplicationServices框架調用CGSessionCopyCurrentDictionary函數,它看起來很有希望:

返回值:一個窗口服務器會話字典,或NULL如果主叫方是不是一個石英GUI會話或窗口中運行服務器被禁用。你應該在完成使用後釋放字典。有關此字典中的鍵值對的信息,請參閱「窗口服務器會話屬性」。

+2

它看起來像CGWindowServerCFMachPort也可以在這種情況下提供相同的信息(它也返回NULL),當沒有窗口服務器可用。謝謝你的指針! – 2009-09-08 18:00:18

+1

不要忘記檢查,如果會話是當前(用戶控制窗口服務器:是不是快切離) – 2009-09-08 18:06:08

+1

,因爲如果沒有當前會話,它沒有好獅子'CGWindowServerCFMachPort'甚至會取得成功。 'CGSessionCopyCurrentDictionary'有點可靠,但你仍然不能告訴終端的ssh,因爲兩者現在都會提供完整的會話信息,所以'SSH_CONNECTION'是唯一可以告訴的方法。 – 2012-02-17 15:29:01