2012-07-06 18 views
11

Tôi muốn biết cách tôi có thể có được danh sách tất cả các màn hình Xorg trên hệ thống của tôi, cùng với danh sách các màn hình được kết hợp với mỗi màn hình. Tôi đã dành thời gian xem qua tài liệu Xlib, nhưng không thể tìm thấy một chức năng làm những gì tôi muốn. Hãy giả sử rằng tôi không có các phụ thuộc khác ngoài OS OS và X (ví dụ: không có GTK). Nếu những gì tôi yêu cầu là không thể giả định những phụ thuộc tối thiểu, sau đó một giải pháp bằng cách sử dụng các thư viện khác là tốt.Lấy Danh sách tất cả các Màn hình Xorg

Cảm ơn bạn rất nhiều vì đã giúp đỡ!

Trả lời

15

Cách duy nhất tôi biết để có được danh sách các màn hình là kiểm tra thư mục /tmp/.X11-unix.

Khi bạn làm điều đó, bạn có thể sử dụng Xlib để truy vấn từng màn hình để biết thêm thông tin.

mỗi ví dụ:

#include <stdio.h> 
#include <dirent.h> 
#include <string.h> 
#include <X11/Xlib.h> 

int main(void) { 
    DIR* d = opendir("/tmp/.X11-unix"); 

    if (d != NULL) { 
     struct dirent *dr; 
     while ((dr = readdir(d)) != NULL) { 
      if (dr->d_name[0] != 'X') 
       continue; 

      char display_name[64] = ":"; 
      strcat(display_name, dr->d_name + 1); 

      Display *disp = XOpenDisplay(display_name); 
      if (disp != NULL) { 
       int count = XScreenCount(disp); 
       printf("Display %s has %d screens\n", 
        display_name, count); 

       int i; 
       for (i=0; i<count; i++) 
        printf(" %d: %dx%d\n", 
         i, XDisplayWidth(disp, i), XDisplayHeight(disp, i)); 

       XCloseDisplay(disp); 
      } 
     } 
     closedir(d); 
    } 

    return 0; 
} 

Chạy trên mang lại cho tôi kết quả này với màn hình hiện tại của tôi/màn hình:

Display :0 has 1 screens 
0: 3046x1050 
Display :1 has 2 screens 
0: 1366x768 
1: 1680x1050 

Không bao giờ tìm thấy một cách tốt hơn niêm yết X hiển thị khác hơn thế. Tôi rất muốn biết liệu có bất kỳ giải pháp thay thế nào tốt hơn không.

+0

Có vẻ như các ổ cắm hiển thị có thể nằm trong '/ usr/spool/sockets/X11 /' cho hpux và '/ var/tsol/doors/.X11-unix /' đối với một số cấu hình của solaris. Mặc dù, tôi nghĩ rằng đây là đủ hiếm mà bạn chỉ có thể dựa vào '/ tmp/.X11-unix /'. – Azmisov

4

Giống như netcoder viết, vấn đề có hai phần riêng biệt:

  1. kết nối đến máy chủ X

    Quá trình thiết lập một kết nối đến một máy chủ X sử dụng XOpenDisplay(). Kết nối bị rách bằng cách sử dụng XCloseDisplay(). mã netcoders trong chủ đề này là một ví dụ tốt về cách thực hiện nó một cách chính xác.

    Như bộ mã hóa được đề cập, vấn đề là không có cách đáng tin cậy để tìm ra máy chủ X nào mà quy trình có thể kết nối. Mã của anh ta kiểm tra vị trí điển hình nơi các ổ cắm X là, /tmp/.X11-unix/. Cách tiếp cận đó không không hoạt động nếu người dùng được kết nối từ xa, ví dụ: thông qua SSH (với tính năng chuyển tiếp X được bật). Trong trường hợp đó, thực sự chỉ có biến môi trường DISPLAY (và có lẽ một số thuật toán khó khăn. ~/.Xauthority tệp).

    Thật không may, tôi cũng không biết phương pháp nào tốt hơn. Cá nhân tôi thích sử dụng tệp cấu hình cho mỗi người dùng - giả sử ~/.application/displays -, trong đó người dùng có thể liệt kê tên máy chủ mà ứng dụng sẽ cố gắng kết nối ở định dạng giống như biến môi trường DISPLAY, ngoài biến mặc định. Nó không phải là tự động (mã của netcoder), nhưng cách tiếp cận này phù hợp với tôi tốt hơn.

  2. Tìm hiểu về màn hình được cung cấp bởi một máy chủ X

    XScreenCount() sẽ trở lại số lượng màn hình được cung cấp bởi máy chủ X quá trình này hiện đang kết nối tới. Nếu bạn chỉ cần kích thước màn hình, hãy làm theo ví dụ về netcoders. Để biết thêm thông tin chi tiết, hãy sử dụng XScreenOfDisplay(Display,index) để có được các con trỏ Screen; 0 < = index < XScreenCount(Display).

    Trong mã C, các macro ScreenCount()ScreenOfDisplay() thường hiệu quả hơn một chút so với các cuộc gọi hàm thực tế.