2009-09-08 30 views
5

Tôi đang viết một khung cho OS X có thể được sử dụng bởi các ứng dụng có hoặc không có kết nối với OS X WindowServer (tức là cả ứng dụng GUI và ứng dụng dòng lệnh chạy qua, ví dụ: phiên ssh). Một lớp trong khung làm việc là để theo dõi các tệp trong thư mục nhà của người dùng qua mạng và thư mục nhà di động (trên OS X, người dùng có thể có thư mục chính được phục vụ qua AFP từ máy chủ - "thư mục mạng mạng" - hoặc có cùng một thư mục chính được đồng bộ hóa để truy cập ngoại tuyến - một "thư mục nhà di động").Xác định xem WindowServer có khả dụng không?

Vì tôi cần theo dõi tệp trên hệ thống tệp, chúng tôi đã chọn sử dụng đường dẫn tương đối, thay vì bí danh OS X (hoặc dấu trang 10.6 NSURL). Khi không thể tìm thấy tệp, tôi cần yêu cầu người dùng nhập liệu để di chuyển tệp đó (như cách Trình quản lý Bí danh nhắc người dùng kết nối lại bí danh bị hỏng). Nếu ứng dụng có (hoặc có thể thực hiện) một kết nối đến WindowServer, điều này cũng đơn giản như sử dụng một NSOpenPanel. Tuy nhiên, khi ứng dụng không thể thực hiện kết nối với WindowServer, tôi cần sử dụng một phương thức thay thế để có được đầu vào của người dùng.

Vì vậy, làm cách nào tôi có thể cho biết phương pháp nào để sử dụng từ bên trong mã của hệ điều hành? Có cách nào để lập trình xác định xem kết nối WindowServer có khả dụng hay không?

Tôi nhận ra rằng một kiến ​​trúc thay thế, trong đó máy khách khung cung cấp cơ chế gọi lại để nhắc người dùng cho phép ứng dụng gọi điện được cung cấp chiến lược thu thập dữ liệu đầu vào. Tuy nhiên, tôi muốn làm mọi thứ càng đơn giản càng tốt cho ứng dụng gọi điện, vì vậy lựa chọn đầu tiên của tôi là đóng gói những chi tiết này trong khung nếu tôi có thể.

Trả lời

7

Có biến môi trường có tên SECURITYSESSIONID được đặt bởi loginwindow.app và get được chuyển đến ứng dụng của người dùng. Biến không được đặt nếu bạn đăng nhập qua ssh. Nó phục vụ như một loại xử lý để nói chuyện với máy chủ cửa sổ.

Sự cố: Sự tồn tại của biến này không có nghĩa là người dùng này hiện đang kiểm soát trình quản lý cửa sổ (nghĩ chuyển đổi người dùng nhanh).

Có một chức năng gọi là CGSessionCopyCurrentDictionary trong khuôn khổ ApplicationServices trông đầy hứa hẹn:

Return Value: Một máy chủ cửa sổ từ điển phiên, hoặc NULL nếu người gọi không được chạy trong một phiên Quartz GUI hoặc cửa sổ máy chủ bị tắt. Bạn nên phát hành từ điển khi bạn sử dụng xong nó. Để biết thông tin về cặp khóa-giá trị trong từ điển này, hãy xem "Thuộc tính phiên máy chủ cửa sổ".

+2

Dường như CGWindowServerCFMachPort cũng có thể cung cấp thông tin tương tự trong trường hợp này (nó cũng trả về NULL) khi không có máy chủ cửa sổ. Cảm ơn bạn cho con trỏ! –

+1

Đừng quên kiểm tra xem phiên có phải là hiện tại hay không (người dùng điều khiển máy chủ cửa sổ: không chuyển đổi nhanh) –

+1

Vì Lion 'CGWindowServerCFMachPort' sẽ thành công ngay cả khi không có phiên hiện tại nên không tốt. 'CGSessionCopyCurrentDictionary' là một chút đáng tin cậy hơn nhưng bạn vẫn không thể nói ssh từ Terminal vì cả hai sẽ cung cấp thông tin phiên đầy đủ để' SSH_CONNECTION' là cách duy nhất để nói. –

Các vấn đề liên quan