Xfree86 Video
Introduction
Xfree86 Video est en fait du X Org...
Cette librairie va permettre de travailler sur les moniteurs que le serveur X Window gère. Vous pourrez récupérer des informations ou les modifier.
Utilisez Xfree86 Video implique que vous ayez une connaissance minimale de X Window qui sont :
- Savoir compiler avec les librairies X Window
- Savoir connecter/déconnecter au serveur X Window
- Savoir que X Window peut gérer plusieurs écrans (screen) situés n'importe où .
Si vous connaissez tout cela, vous pouvez continuer la lecture...
L'include suivant sera nécessaire pour toutes les fonctions:
#include <X11/extensions/xf86vmode.h>
Le paramétre de la librairie à utiliser avec gcc est -lXxf86vm
Il faut donc avoir installé les paquets libxxf86-vm-devel et libxxf86vm1
Version actuellement installée
Voici une fonction qui retourne le n° de version de XF86 vidéo installé
Bool XF86VidModeQueryVersion(
Display *disp,
int *vidModeMajorVersion,
int *vidModeMinorVersion);
En entrée :
dpy : Identifiant du display utilisé pour votre connexion avec Xwindow.
En sortie :
vidModeMajorVersion correspondant à la version majeure
vidModeMinorVersion correspondant à la partie mineure de la version
Mode écran reconnu
La fonction qui suit donne la liste des modes écrans reconnus
XF86VidModeGetAllModeLines(Display *disp,int *modeNum, XF86VidModeModeInfo
***modes)
En entrée :
dpy : Identifiant du display utilisé pour votre connexion avec Xwindow.
screen : N° d’écran utilisé
En sortie :
modeNum : Nombre de modes acceptés
modes : Tableau contenant la liste des modes acceptés avec des informations
sur leur résolution.
Le premier
élément du tableau (modes[0]) correspond à la résolution
actuellement utilisée
modes[i]->hdisplay ou modes[i]->vdisplay indiquant réciproquement
la résolution horizontale et verticale.
(Avec i une valeur pouvant varier entre 0 et la valeur retournée dans
modeNum – 1)
Vous
n’aurez pas à allouer un espace mémoire en précisant
que modes pointerait dessus. C’est en effet X Window qui va s’en
charger. Par contre, vous devrez libérer cette espace mémoire
lorsque vous n’en aurez plus besoin. Pour cela, il faudra passer par la
fonction XFree (adresse). Dans votre cas, il faudra donc faire XFree (modes)
;
Changer de résolution écran
Maintenant que vous avez pu récupérer la liste des résolutions disponibles, il serait bien de pouvoir les utiliser ! La fonction XF86VidModeSwitchToMode() va vous permettre de changer de résolution.
Bool XF86VidModeSwitchToMode(
Display *disp,
int screen,
XF86VidModeModeInfo *mode);
En entrée:
disp : Identifiant du display utilisé pour votre connexion avec Xwindow.
screen : N° d’écran utilisé
mode qui correspond à un des éléments du tableau chargé avec XF86VidModeGetAllModeLines(dpy, screen, &modeNum, &modes)
Le viewport
Le viewport est la surface utilisée pour dessiner les fenêtres. Ce viewport peut être plus important que la résolution graphique.
Si vous modifiez la résolution écran, vous verrez que l'affichage ne se repositionne pas en haut à gauche du viewport. Il faudra donc éventuellement le positionner.
En effet, si vous vous créez une fenêtre pour le fullscreen, vous risqueriez de ne pas la voir ou alors partiellement !
Il y a deux fonctions pour le viewport:
- Une qui va vous permettre de récupérer sa position
Bool XF86VidModeGetViewPort(
Display *display,
int screen,
int *x_return,
int *y_return);
En entrée:
disp : Identifiant du display utilisé pour votre connexion avec Xwindow.
screen : N° d’écran utilisé
En sortie:
x_return et y_return qui correspndent au position actuelle du viewport
- Une qui va vous permettre de la positionner:
Bool XF86VidModeSetViewPort(
Display *display,
int screen,
int x,
int y);
En entrée:
disp : Identifiant du display utilisé pour votre connexion avec Xwindow.
screen : N° d’écran utilisé
x et y qui correspndent à la nouvelle position du viewport
Vous noterez
l'absence de fonction permettant de modifier la largeur et la hauteur du viewport.
Information sur le moniteur
Bool XF86VidModeGetMonitor(
Display *disp,
int screen,
XF86VidModeMonitor *monitor);
En entrée:
disp : Identifiant du display utilisé pour votre connexion avec Xwindow.
screen : N° d’écran utilisé
En sortie:
Monitor qui est une structure contenant les informations du moniteur:
typedef struct {
char* vendor; /* Nom du constructeur */
char* model; /* Nom du modèle */
float EMPTY; /* Inutilisé */
unsigned char nhsync; /* Nombre de valeurs possibles pour la synchronisation
horizontale */
XF86VidModeSyncRange* hsync;/* Liste des valeurs synchronisations Horizontales
*/
unsigned char nvsync; /* Nombre de valeurs possibles pour la synchronisation
verticale */
XF86VidModeSyncRange* vsync;/* Liste des valeurs synchronisations Verticales
*/
} XF86VidModeMonitor;
Les valeurs hsync et vsync sont eux même dans des structures:
typedef struct {
float hi; /* Valeur haute */
float lo; /* Valeur basse */
} XF86VidModeSyncRange;
Exemple
Voici un exemple récapitulant l'ensemble des fonctions indiquées ici:
Les autres fonctions:
(que je n'ai pas regardé...)
F86VidModeGetDotClocks(
Display *display,
int screen,
int *flags return,
int *number of clocks return,
int *max dot clock return,
int **clocks return);
XF86VidModeGetGamma(
Display *display,
int screen,
XF86VidModeGamma *Gamma);
XF86VidModeSetGamma(
Display *display,
int screen,
XF86VidModeGamma *Gamma);
XF86VidModeGetGammaRamp(
Display *display,
int screen,
int size,
unsigned short *red array,
unsigned short *green array,
unsigned short *blue array);
XF86VidModeSetGammaRamp(
Display *display,
int screen,
int size,
unsigned short *red array,
unsigned short *green array,
unsigned short *blue array);
XF86VidModeGetGammaRampSize(
Display *display,
int screen,
int *size);
Bool XF86VidModeLockModeSwitch(
Display *display,
int screen,
int lock);
Bool XF86VidModeDeleteModeLine(
Display *display,
int screen,
XF86VidModeModeInfo *modeline);
Bool XF86VidModeModModeLine(
Display *display,
int screen,
XF86VidModeModeLine *modeline);
Status XF86VidModeValidateModeLine(
Display *display,
int screen,
XF86VidModeModeLine *modeline);
Bool XF86VidModeSetClientVersion(
Display *display);
Bool XF86VidModeQueryExtension(
Display *display,
int *event_base_return,
int *error_base_return);