I'm writing a framework for OS X that may be used by applications with or without a connection to the OS X WindowServer (i.e. both GUI apps and command-line apps run via, e.g. an ssh session). One class in the framework is for tracking files in the user's home folder across netework and mobile home directories (on OS X, users can have their home directory served via AFP from a server--a "network home directory"--or have the same home folder syncrhonized for offline access--a "mobile home directory").
因为我需要跨文件系统跟踪文件,所以我们选择使用相对路径,而不是OS X别名(或10.6 NSURL书签).当找不到文件时,我需要询问用户输入以重新定位该文件(例如Alias Manager如何提示用户重新连接损坏的别名).如果应用程序已经(或可以建立)与WindowServer的连接,这就像使用一样简单NSOpenPanel.但是,当应用程序无法建立与WindowServer的连接时,我需要使用另一种方法来获取用户输入.
那么,如何在famework代码中告诉使用哪种方法?有没有办法以编程方式确定WindowServer连接是否可用(或可能)?
我认识到一种替代架构,其中框架客户端提供回调机制以提示用户将允许调用应用程序提供输入收集策略.我想让调用应用程序尽可能简单,所以我的第一选择是将这些细节封装在框架中,如果可以的话.
有一个名为SECURITYSESSIONIDloginwindow.app设置的环境变量,并将get传递给用户的应用程序.如果您通过ssh登录,则不会设置该变量.它可以作为与窗口服务器通信的句柄.
问题:此变量的存在并不意味着此用户当前控制窗口管理器(想想快速用户切换).
CGSessionCopyCurrentDictionary在ApplicationServices框架中调用了一个看起来很有希望的函数:
返回值:窗口服务器会话字典,如果调用者未在Quartz GUI会话中运行或窗口服务器已禁用,则返回 NULL.您应该在完成字典使用后释放字典.有关此字典中键值对的信息,请参阅"窗口服务器会话属性".
| 归档时间: |
|
| 查看次数: |
748 次 |
| 最近记录: |