2012-07-06 17 views
11

Mi piacerebbe sapere come ottenere un elenco di tutti gli schermi Xorg sul mio sistema, insieme a un elenco di schermate associate a ciascun display. Ho passato un po 'di tempo a esaminare la documentazione di Xlib, ma non sono riuscito a trovare una funzione che faccia ciò che voglio. Supponiamo che non abbia altre dipendenze oltre a un OS e X di reclamo POSIX (ad esempio, nessuna GTK). Se quello che chiedo non è possibile assumendo queste dipendenze minime, allora una soluzione che usa altre librerie va bene.Ottenere l'elenco di tutti i display Xorg

Grazie mille per il vostro aiuto!

risposta

15

L'unico modo che conosco per ottenere un elenco di display è controllare la directory /tmp/.X11-unix.

Una volta fatto, è possibile utilizzare Xlib per interrogare ogni visualizzazione per ulteriori informazioni.

Per esempio:

#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; 
} 

Esecuzione quanto sopra mi dà questa uscita con i miei attuali visualizza/schermi:

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

mai trovato un modo migliore di messa in vendita di X schermi diversi da quello. Mi piacerebbe molto sapere se esiste un'alternativa migliore.

+0

Sembra prese di visualizzazione possono essere in '/ usr/spool/prese/X11 /' per hpux e '/ var/TSOL/porte/.X11-unix /' per alcune configurazioni di solaris. Tuttavia, penso che questi siano abbastanza rari da poter contare solo su '/ tmp/.X11-unix /'. – Azmisov

4

Come netcoder ha scritto, il problema ha due parti distinte:

  1. La connessione al server X

    Il processo stabilisce una connessione ad un server X usando XOpenDisplay(). La connessione viene interrotta utilizzando XCloseDisplay(). il codice netcoders in questa discussione è un buon esempio di come farlo correttamente.

    Come menzionato netcoder, il problema è che non esiste un modo affidabile per scoprire a quale server X può connettersi un processo. Il suo codice controlla la posizione tipica in cui si trovano le prese X, /tmp/.X11-unix/. Questo approccio fa non funziona se l'utente è connesso in remoto, ad esempio tramite SSH (con l'inoltro X abilitato). In questo caso c'è solo la variabile di ambiente DISPLAY (e forse alcuni file di wrestling ~/.Xauthority).

    Sfortunatamente, non conosco nessun metodo migliore. Personalmente preferisco utilizzare un file di configurazione per utente, ad esempio ~/.application/displays, in cui l'utente può elencare i nomi dei server che l'applicazione dovrebbe provare a connettersi nello stesso formato della variabile di ambiente DISPLAY, oltre a quella predefinita. Non è automatico (il codice di netcoder è), ma questo approccio mi sta meglio.

  2. Scoprire sulle schermate forniti da un server X

    XScreenCount() restituisce il numero di schermi forniti dal server X il processo è attualmente collegato. Se hai solo bisogno delle dimensioni dello schermo, segui l'esempio dei netcoder. Per informazioni più dettagliate, utilizzare XScreenOfDisplay(Display,index) per ottenere i puntatori Screen; 0 < = index < XScreenCount(Display).

    In codice C, le macro ScreenCount() e ScreenOfDisplay() sono in genere un po 'più efficienti delle chiamate di funzione effettive.

Problemi correlati