Suite de la configuration X sous FreeBSD, on va expliciter le fichier de configuration.

Maintenant qu'on a un X qui marche (sinon voir ici), on va essayer de comprendre sa configuration, et ça nous servira de base pour gérer plusieurs écrans.

Il faut dire en aparté qu'à part Webmin (j'en parle ici), je n'utilise presque aucun utilitaire de configuration système, je me tape les fichiers de config à la main sous vi (c'est un vim, je crois, sous FreeBSD). C'est un peu comme pour le HTML, j'ai l'impression que j'ai une plus grande maîtrise sur le code (c'est sûrement qu'une impression). Donc dans ce papier, on va faire les choses à la dure, au vi. Utilisez ee ou un éditeur similaire, pas un outil de forcené comme vi, dans la vie réelle. Moi l'habitude du vi me vient de mes cours à la fac, où on me disait que seul vi était un outil de base de tout Unix et assimilés. Mais bon, je crois que c'est plus vraiment le cas de nos jours... Puis il y a un utilitaire bien fait pour X (par X.org), en mode graphique, tout en menus (assez) joli qui modifie le xorg.conf tout seul comme un grand, xorgcfg. Mais ça fait pas de mal de comprendre, pour pouvoir bidouiller le fichier si jamais X se plante...

On va partir d'un fichier auto-configuré. Le fichier xorg.conf est séparé en sections :

ServerLayout

Cette section décrit la configuration de l'affichage. C'est un agrégat des autres sections décrites dans le fichier. Il indique quels périphériques utiliser pour l'affichage (carte(s), écran(s)), et quels dispositifs de pointage utiliser (souris, clavier(s)). Voici ce que me donne l'auto-configuration :

Section "ServerLayout"
	Identifier     "X.org Configured"
	Screen      0  "Screen0" 0 0
	InputDevice    "Mouse0" "CorePointer"
	InputDevice    "Keyboard0" "CoreKeyboard"
EndSection
  • Identifier est juste le nom que vous donnez à cette configuration. Là, Xorg me l'a rempli tout seul, mais j'aurais tout aussi bien pu mettre un truc du genre "Mon écran de bombe de balle". Aucune incidence sur le fichier de configuration (à part si vous mettez des guillemets dans la chaîne, ce qui ferait des erreurs). Il doit être unique.
  • Screen permet d'indiquer les écrans en service. Un écran est défini dans une section Screen, qui décrit un ensemble carte et écran (physique). Voir plus bas. L'écran décrit ici est le numéro 0, donc le premier écran, il reprend la définition de "Screen0", et il affiche le bureau à partir des coordonnées 0 0, en abscisses et ordonnées. En résumé, c'est le premier (et seul) affichage, et il affiche le bureau à partir du haut gauche (les abscisses sont inversées, elles croissent vers le bas de l'affichage).
  • Les InputDevice décrivent le clavier et la souris à utiliser, en indiquant leur définition. La mention "CorePointer" et "CoreKeyboard" indiquent que ces périphériques sont les périphériques principaux, si jamais il y avait plus d'un seul clavier ou plus d'une seule souris sur le système (pensez aux tablettes graphiques, par exemple).

Files, Modules

Ces sections décrivent les extensions à charger et les chemins d'accès aux bibliothèques. Ne changez pas ces déclarations si vous ne savez pas ce qu'elles signifient, ou sur quoi elles ont effet. Les réglages par défaut sont adéquats pour la plupart des usages.

InputDevice

C'est là qu'on définit les périphériques de saisie, souris, claviers, tablettes graphiques, tablette à numériser, etc. Voyons un exemple de souris et un exemple de clavier :

Section "InputDevice"
	Identifier  "Mouse0"
	Driver      "mouse"
	Option	    "Protocol" "auto"
	Option	    "Device" "/dev/sysmouse"
	Option 	"Buttons" "5"
	Option	"ZAxisMapping"  "4 5"
EndSection
  • Identifier est un nom pour cette définition de périphérique. On peut y mettre n'importe quoi, mais nommer les périphériques en rapport avec leur nature aide à la relecture du fichier. 🙂
  • Driver indique quel pilote utiliser pour ce périphérique. Généralement, "mouse" est le mieux indiqué pour une souris, à part si vous avez un driver particulier fourni par le fabricant (mais il y a des chances que ce ne soit pas une souris 🙂.
  • Nous avons ensuite des déclarations Option, qui permettent de préciser le comportement du périphérique.
    • "Protocol" indique le "driver" à utiliser. "auto" est le choix le plus judicieux de nos jours, à moins que vous n'ayez une souris série (et qui a une souris série sur une machine récente de nos jours ?). Pour une souris USB, "auto" est une obligation.
    • "Device" indique le nom du périphérique dans /dev. /dev/sysmouse est un périphérique virtuel vers le périphérique réel, /dev/ums0, pour une souris USB, par exemple.
    • Les options "buttons" et ZAxisMapping ne sont pas créés par défaut par Xorg. Ils permettent d'indiquer le nombre de "boutons" de la souris, et de définir le défilement de la roulette. Chacune des directions de la souris est considéré comme un bouton, donc sur une souris deux boutons et une roulette cliquable, on a 5 "boutons" en tout. ZAxisMapping indique quels boutons seront utilisés pour le défilement, ici la roulette haut et bas, "4 5". Si on met "1 2", les boutons gauche et droits feront défiler le texte dans les fenêtres ! Tout est possible. 🙂
Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "keyboard"
	Option	    "XkbRules" "xorg"
	Option	    "XkbModel" "pc105"
	Option	    "XkbLayout" "fr"
EndSection

Le clavier ne diffère pas beaucoup de la souris. Identifier est toujours un nom (presque) quelconque, et son Driver est "keyboard". Les options sont un peu différentes, toutefois.

  • "XkbRules" indique le comportement du clavier. "xorg" est le comportement "standard" du clavier. Paraît qu'on peut le mettre "à la Emacs", mais vu que j'aime pas Emacs, je ne sais pas comment. 😉 Bon, en 30 s de recherche manuelle (même pas par Google, la honte), je ne trouve pas de docs là-dessus. Je verrai si j'ai le temps. 😉
  • "XkbModel" indique le type de clavier que vous avez. C'est plus important qu'on ne croit, car il y a de subtiles différences entre claviers du monde, en nombre de touches. Mais bon, les claviers modernes européens (français ?) comportent 105 touches, donc j'utilise "pc105". Et "XkbLayout" indique ce qu'on a comme sérigraphie dessus, pour que ça corresponde. 🙂 Se reporter à xorgcfg pour les layouts.

Monitor

Une des sections essentielles de xorg.xonf, car elle décrit l'écran physique.

Section "Monitor"
	#DisplaySize	  300   230	# mm
 ### Uncomment if you don't want to default to DDC:
#	HorizSync    842150464.0 - 0.0
#	VertRefresh  809972032.0 - 0.0
	Identifier   "Monitor0"
	VendorName   "VSC"
	ModelName    "VE510s"
	HorizSync    30.0 - 62.0
	VertRefresh	50.0 - 75.0
	Option	    "DPMS"
EndSection

Si votre écran est compatible DCC, la carte graphique obtiendra automatiquement les fréquences optimales d'affichage. Mais comme on peut le voir, des fois, ça donne des résultats curieux... 🙂

  • DisplaySize, paramètre complètement optionnel, précise la taille physique de l'écran, en millimètres. Je ne sais pas bien à quoi ça peut servir ?
  • HorizSync, spécifie les fréquences de balayage horizontaux de l'écran. La détection DCC donne des chiffres fantaisistes, et sur cet écran LCD, la carte envoyait une fréquence non supportée... J'ai donc dû trouver les spécifications sur le net, et j'ai mis la valeur moi-même : 30.0 - 62.0, fréquence en Hz.
  • VertRefresh, pareil que HorizSync, la détection donne n'importe quoi, j'ai mis les valeurs constructeur à la place : 50.0 - 75.0, toujours en Hz. Attention, X prend pour argent comptant les fréquences manuelles spécifiées, si l'écran ne les supporte pas, il peut être abîmé par la manœuvre !
  • VendorName et ModelName sont obtenus par DCC, et sont optionnels. Ce sont la marque et le modèle de l'écran. Là, j'ai un Viewsonic VE510s.
  • Enfin, "DPMS" indique que l'écran supporte les modes d'économie d'énergie, qu'il peut passer en veille et tout.

Device

Ici on décrit la carte graphique, ses capacités, son emplacement, tout ça.

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz"
        ### [arg]: arg optional
        #Option     "NoAccel"            	# [<bool>]
        #Option     "SWcursor"           	# [<bool>]
        #Option     "ColorKey"           	# <i>
        #Option     "CacheLines"         	# <i>
        #Option     "Dac6Bit"            	# [<bool>]
        #Option     "DRI"                	# [<bool>]
        #Option     "NoDDC"              	# [<bool>]
        #Option     "ShowCache"          	# [<bool>]
        #Option     "XvMCSurfaces"       	# <i>
        #Option     "PageFlip"           	# [<bool>]
	Identifier  "Card0"
	Driver      "i810"
	VendorName  "Intel Corp."
	BoardName   "82865G Integrated Graphics Device"
	BusID       "PCI:0:2:0"
EndSection

La détection marche plutôt bien, sur les X récents, et Xorg donne une liste exhaustive des options du driver de la carte. Les Intel Extreme Graphics sont pauvres en options... 🙂

  • Identifier, un nom. 🙂
  • Driver, le pilote le plus adapté pour la carte. Là, j'ai un Intel Extreme Graphics 2 sur un chipset Intel 865G, qui est pris en charge par le driver "i810".
  • VendorName et BoardName, c'est comme les VendorName et ModelName de la section Monitor, c'est pour la frime. 😉
  • BusID précise l'emplacement de la carte. C'est un triplet de nombres. Ici "0:2:0", c'est le bus AGP (0), 3e emplacement (2), premier périphérique (0) (je suis pas complètement certain de cette explication, mais ça me semble avoir du sens). C'est le paramètre le plus important de Device.

Screen

Ici on décrit l'affichage, en tant que couple Monitor/Device, et on spécifie les modes d'affichage disponibles.

Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	Monitor    "Monitor0"
	SubSection "Display"
		Viewport   0 0
		Depth     1
	EndSubSection
	SubSection "Display"
		Viewport   0 0
		Depth     4
	EndSubSection
	SubSection "Display"
		Viewport   0 0
		Depth     8
	EndSubSection
	SubSection "Display"
		Viewport   0 0
		Depth     15
	EndSubSection
	SubSection "Display"
		Viewport   0 0
		Depth     16
	EndSubSection
	SubSection "Display"
		Viewport   0 0
		Depth     24
		Modes	"800x600" "1024x768"
	EndSubSection
EndSection
  • Identifier, pareil, un nom.
  • Device et Monitor, la carte et l'écran à utiliser pour cet affichage. Une seule carte et un seul écran par affichage. Pour un double affichage à partir de la même carte, il y a une autre astuce (voir Multi-écrans).
  • Chaque SubSection "Display" contient la définition d'un mode d'affichage.
    • Viewport indique à partir d'où afficher le bureau par défaut. 0 0 commence en haut à gauche. En mettant d'autres coordonnées, on peut afficher seulement une portion de l'écran (ou afficher le milieu du bureau par défaut ? A vrai dire j'ai jamais essayé).
    • Depth indique la profondeur de couleurs à utiliser pour l'affichage. Il va de 1 à 32, d'habitude (peut-être plus pour des cartes de graphistes professionnels). Il y a une SubSection "Display" par profondeur de couleur.
    • Modes permet de définir les résolutions supportées par l'affichage dans cette profondeur de couleurs. En l'absence de cette valeur, les modes sont déduits du DCC. On peut forcer une certaine résolution en ne précisant que celle-ci. Par exemple, si je veux forcer l'affichage en 1024x768 en couleurs 24 bits, alors que le DCC préconise 1152x864, je mettrai 
      	SubSection "Display"
      		Viewport   0 0
      		Depth     24
      		Modes "1024x768"
      	EndSubSection
      

Voilà, j'espère que ça vous a plu et que ça vous a appris, parce que ça m'a pris un près de 2 heures à rédiger tout ça. 🙂 (quoi, autant de temps pour ÇA ?! 😉)