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.

Image non trouvée ! 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)

Image non trouvée ! 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

Image non trouvée !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:

Image non trouvée !

 

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);