IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Détection de moniteurs en C sous X11


Sujet :

Linux

  1. #1
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut Détection de moniteurs en C sous X11
    Bonjour,

    je cherche à découvrir comment on peut trouver le nombre, la résolution et la position (relative à la position du moniteur principal) de chacun des moniteurs actifs branchés à une carte vidéo via un programme en C sous X11.

    Les opérations qui doivent, à priori, être effectuées :

    1/ énumération des display
    2/ via chaque display, énumération des écrans (ScreenCount(dis),...)

    Problème 1) comment énumérer les display ?

    problème 2) dans certains setups multi head, les deux moniteurs sont consolidés en un seul par le driver (c'est le cas pour les cartes nvidia et du système twinview). Il est facile de détecter qu'il y a plus d'un moniteur (ScreenCount(dis) == 1 mais la résolution de 3600x1080 nous dit que ça ne doit pas être tout à fait vrai). Dans l'idéal, j'aimerais trouver un moyen de découvrir automatiquement, et sans stresser, le nombre réel de moniteurs, leur résolution, et bien évidemment, leurs positions (droite du moniteur principale ? gauche du moniteur principal ? dessus ? dessous ? etc).

    Si quelqu'un a une piste, qu'il n'hésite pas !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Recherche du travail
    Inscrit en
    Août 2004
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Recherche du travail

    Informations forums :
    Inscription : Août 2004
    Messages : 561
    Points : 1 320
    Points
    1 320
    Par défaut
    Un exemple sera plus parlant que un long discours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    #include <X11/Xlib.h>
    #include <X11/extensions/Xrandr.h>
     
    int main() {
        int i;
        Display *dpy = XOpenDisplay(NULL);
        int screen = DefaultScreen (dpy);
        Window root = RootWindow (dpy, screen);
        XRRScreenResources *res = XRRGetScreenResourcesCurrent (dpy, root);
     
        for (i = 0; i < res->ncrtc; i++) {
            XRRCrtcInfo *crtc = XRRGetCrtcInfo (dpy, res, res->crtcs[i]);
            printf("Sortie %d : %dx%d+%d+%d\n", i,
                    crtc->width, crtc->height,
                    crtc->x, crtc->y);
        }
     
        XCloseDisplay(dpy);
    }
    Pour compiler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc tx.c -L/usr/X11R6/lib -lX11 -lXrandr -o crtc-info
    PS : Je ne sais pas si enfin Nvidia à intégré Xrandr dans ses drivers...

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Senaku-seishin Voir le message
    Un exemple sera plus parlant que un long discours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdio.h>
    #include <X11/Xlib.h>
    #include <X11/extensions/Xrandr.h>
     
    int main() {
        int i;
        Display *dpy = XOpenDisplay(NULL);
        int screen = DefaultScreen (dpy);
        Window root = RootWindow (dpy, screen);
        XRRScreenResources *res = XRRGetScreenResourcesCurrent (dpy, root);
     
        for (i = 0; i < res->ncrtc; i++) {
            XRRCrtcInfo *crtc = XRRGetCrtcInfo (dpy, res, res->crtcs[i]);
            printf("Sortie %d : %dx%d+%d+%d\n", i,
                    crtc->width, crtc->height,
                    crtc->x, crtc->y);
        }
    }
    Pour compiler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc tx.c -L/usr/X11R6/lib -lX11 -lXrandr -o crtc-info
    Merci !

    Citation Envoyé par Senaku-seishin Voir le message
    PS : Je ne sais pas si enfin Nvidia à intégré Xrandr dans ses drivers...
    Il semblerait que non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $ > ./ctrc-info
    Sortie 0 : 3600x1080+0+0
    $ > xrandr -q
    xrandr: Failed to get size of gamma for output default
    Screen 0: minimum 1920 x 1080, current 3600 x 1080, maximum 3600 x 1080
    default connected 3600x1080+0+0 0mm x 0mm
       3600x1080      50.0*    51.0  
       1920x1080      51.0
    nvidia-settings me sort la liste des moniteurs. Si je fait un strace sur ce programme, j'ai ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    11578 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC, 0) = 6
    11578 connect(6, {sa_family=AF_FILE, path=@"/tmp/.X11-unix/X0"}, 20) = 0
    11578 getpeername(6, {sa_family=AF_FILE, path=@"/tmp/.X11-unix/X0"}, [20]) = 0
    (...)
    11578 writev(6, [{"\213\4\4\0\0\0\1\0\0\0\1\0\4\0\0\0", 16}, {NULL, 0}, {"", 0}], 3) = 16
    11578 poll([{fd=6, events=POLLIN}], 1, -1) = 1 ([{fd=6, revents=POLLIN}])
    11578 read(6, "\1(k\0\1\0\0\0\1\0\0\0\4\0\0\0000\362\260\2\0\0\0\0\220\361\206\2\0\0\0\0LEN\0", 4096) = 36
    11578 poll([{fd=6, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=6, revents=POLLOUT}])
    11578 writev(6, [{"\213\33\4\0\0\0\1\0\0\0\1\0,\1\0\0", 16}, {NULL, 0}, {"", 0}], 3) = 16
    11578 poll([{fd=6, events=POLLIN}], 1, -1) = 1 ([{fd=6, revents=POLLIN}])
    11578 read(6, "\1\362l\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\300(y\2\0\0\0\0", 4096) = 32
    11578 poll([{fd=6, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=6, revents=POLLOUT}])
    11578 writev(6, [{"\213\24\4\0\0\0\1\0\0\0\1\0\1\0\0\0", 16}, {NULL, 0}, {"", 0}], 3) = 16
    11578 poll([{fd=6, events=POLLIN}], 1, -1) = 1 ([{fd=6, revents=POLLIN}])
    11578 read(6, "\1(m\0\266\f\0\0\1\0\0\0\3252\0\0000\362\260\2\0\0\0\0\220\361\206\2\0\0\0\0source=edid :: \"nvidia-auto-select\"  139.000  1920 1980 2028 2050  1080 1090 1100 1130  -HSync -VSync\0source=edid :: \"1920x1080\"  139.000  1920 1980 2028 2050  1080 1090 1100 1130  -HSync -VSync\0source=edid :: \"1920x1080_60\""..., 4096) = 4096
    11578 read(6, "oubleScan +HSync -VSync\0source=xserver :: \"960x600d60\"  77.000  960 984 1000 1040  600 601 604 617  DoubleScan +HSync -VSync\0source=xserver :: \"960x540\"  69.250  960 984 1000 1040  540 541 544 555  DoubleScan +HSync -VSync\0source=xserver :: \"960x540d60\"  6"..., 8952) = 8952
    11578 poll([{fd=6, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=6, revents=POLLOUT}])
    11578 writev(6, [{"\213\4\4\0\0\0\1\0\0\0\4\0\4\0\0\0", 16}, {NULL, 0}, {"", 0}], 3) = 16
    11578 poll([{fd=6, events=POLLIN}], 1, -1) = 1 ([{fd=6, revents=POLLIN}])
    11578 read(6, "\1(n\0\10\0\0\0\1\0\0\0\35\0\0\0000\362\260\2\0\0\0\0\220\361\206\2\0\0\0\0HannStar Display Corp HZ221D\0\0\0\0", 4096) = 64
    11578 poll([{fd=6, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=6, revents=POLLOUT}])
    11578 writev(6, [{"\213\33\4\0\0\0\1\0\0\0\4\0,\1\0\0", 16}, {NULL, 0}, {"", 0}], 3) = 16
    11578 poll([{fd=6, events=POLLIN}], 1, -1) = 1 ([{fd=6, revents=POLLIN}])
    11578 read(6, "\1\362o\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\300(y\2\0\0\0\0", 4096) = 32
    11578 poll([{fd=6, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=6, revents=POLLOUT}])
    11578 writev(6, [{"\213\24\4\0\0\0\1\0\0\0\4\0\1\0\0\0", 16}, {NULL, 0}, {"", 0}], 3) = 16
    11578 poll([{fd=6, events=POLLIN}], 1, -1) = 1 ([{fd=6, revents=POLLIN}])
    11578 read(6, "\1(p\0\231\r\0\0\1\0\0\0b6\0\0000\362\260\2\0\0\0\0\220\361\206\2\0\0\0\0source=xserver, source=edid :: \"nvidia-auto-select\"  146.250  1680 1784 1960 2240  1050 1053 1059 1089  -HSync +VSync\0source=xserver, source=edid :: \"1680x1050\"  146.250  1680 1784 1960 2240  1050 1053 1059 1089  -HSync +VSy"..., 4096) = 4096
    11578 read(6, "4x768_87i\"  44.900  1024 1032 1208 1264  768 768 776 817  Interlace +HSync +VSync\0source=xserver :: \"1024x768_87i_0\"  44.900  1024 1032 1208 1264  768 768 776 817  Interlace +HSync +VSync\0source=xserver :: \"960x720\"  148.500  960 1032 1144 1320  720 720 72"..., 9860) = 9860
    Le fd 6 semble être la socket de communication avec le serveur X, et on retrouve bien l'envoi de requètes (writev), l'attente d'une réponse (poll) et la lecture de la réponse (read). Seulement, il faut que je trouve quelle fonction X (ou d'une extension de X) est appelée

  4. #4
    Membre expérimenté
    Homme Profil pro
    Recherche du travail
    Inscrit en
    Août 2004
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Recherche du travail

    Informations forums :
    Inscription : Août 2004
    Messages : 561
    Points : 1 320
    Points
    1 320
    Par défaut
    Le code source de nvidia-setting est disponible : ftp://download.nvidia.com/XFree86/nvidia-settings/

    En regardant vite fait, Nvidia utilise un système de attribute (un peu comme les propriété de Xlib).

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Senaku-seishin Voir le message
    Le code source de nvidia-setting est disponible : ftp://download.nvidia.com/XFree86/nvidia-settings/

    En regardant vite fait, Nvidia utilise un système de attribute (un peu comme les propriété de Xlib).
    Doh !

    Merci beaucoup !

    Si avec ça je n'y arrive pas, c'est que j'ai des marteaux à la place des doigts

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par Senaku-seishin Voir le message
    PS : Je ne sais pas si enfin Nvidia à intégré Xrandr dans ses drivers...
    randr a des problèmes pour gérer le driver officiel de Nvidia qui ne doit pas être compatible.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection de carte réseau externe sous redhat 5.4
    Par Paula2020 dans le forum RedHat / CentOS / Fedora
    Réponses: 11
    Dernier message: 23/04/2010, 12h19
  2. [RegEx] Détection et remplacement automatique de sous-chaînes
    Par Rolf-IV dans le forum Langage
    Réponses: 2
    Dernier message: 10/09/2009, 17h01
  3. [event.keyCode] Détection de la flèche bas sous Opera
    Par bigben89 dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 26/11/2008, 14h02
  4. problème d'event sous X11/Motif
    Par awalter1 dans le forum Linux
    Réponses: 7
    Dernier message: 08/07/2008, 18h44
  5. Moniteur non reconnu sous debian
    Par Jean_Benoit dans le forum Matériel
    Réponses: 2
    Dernier message: 11/03/2006, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo