Précédent   Forum des professionnels en informatique > Systèmes > Linux
Linux Forum d'entraide sur le système Linux. Avant de poster -> Tutoriels Linux, F.A.Q Linux
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/08/2011, 16h23   #1
Expert Confirmé
 
Emmanuel Deloget
Inscription : septembre 2007
Messages : 1 542
Détails du profil
Informations personnelles :
Nom : Emmanuel Deloget
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2007
Messages : 1 542
Points : 2 905
Points : 2 905
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 !
__________________
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.
Emmanuel Deloget est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/08/2011, 05h03   #2
Membre Expert
 
Étudiant
Inscription : août 2004
Messages : 500
Détails du profil
Informations personnelles :
Âge : 22

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2004
Messages : 500
Points : 1 017
Points : 1 017
Envoyer un message via MSN à Senaku-seishin
Un exemple sera plus parlant que un long discours :
Code :
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 :
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...
__________________
Avoir un regard neutre sur notre vie dénuée de sens, c'est la voir tel un ignorant
Senaku-seishin est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 26/08/2011, 11h06   #3
Expert Confirmé
 
Emmanuel Deloget
Inscription : septembre 2007
Messages : 1 542
Détails du profil
Informations personnelles :
Nom : Emmanuel Deloget
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2007
Messages : 1 542
Points : 2 905
Points : 2 905
Citation:
Envoyé par Senaku-seishin Voir le message
Un exemple sera plus parlant que un long discours :
Code :
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 :
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 :
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 :
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
__________________
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.
Emmanuel Deloget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 13h53   #4
Membre Expert
 
Étudiant
Inscription : août 2004
Messages : 500
Détails du profil
Informations personnelles :
Âge : 22

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2004
Messages : 500
Points : 1 017
Points : 1 017
Envoyer un message via MSN à Senaku-seishin
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).
__________________
Avoir un regard neutre sur notre vie dénuée de sens, c'est la voir tel un ignorant
Senaku-seishin est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/08/2011, 14h15   #5
Expert Confirmé
 
Emmanuel Deloget
Inscription : septembre 2007
Messages : 1 542
Détails du profil
Informations personnelles :
Nom : Emmanuel Deloget
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2007
Messages : 1 542
Points : 2 905
Points : 2 905
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
__________________
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.
Emmanuel Deloget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 10h42   #6
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 950
Points : 4 950
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.
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h55.


 
 
 
 
Partenaires

Hébergement Web