Le petit script qui suit automatise la plupart du travail. Faites très attention au ScanType (type de balayage) et aux deux lignes Polarity (polarité): le script ne les positionne pas et, si vous avez la paresse de ne pas les corriger, les risques d'endommager votre moniteur augmentent en flèche.
Remarquez que je ne sais pas si le drapeau "Doublescan" (balayage double) a une signification quelconque dans XInside: si vous tentez de convertir un mode de double balayage de faible résolution FAITES ATTENTION, vous pouvez assez facilement casser votre moniteur puisque le taux de rafraîchissement que vous obtenez sera doublé (en fait mon 400x300 à 72Hz est devenu un 400x300 à 144Hz!).
#!/bin/sh
##########################################################################
# XF2XInside
#
# Ce script convertit les lignes de mode vidéo du format XF86Config au
# format XInside pour remplir les besoins du fichier etc/Xtimings.
#
# C'est une bidouille vite programmée, n'en attendez pas des vérifications
# d'erreurs fines (et ne parlons pas de l'interface utilisateur).
#
# Si vous l'appelez sans argument, il devrait vous dire quoi faire.
#
# (juillet 1996, hcz@tazlwurm.bb.bawue.de)
#
# Au fait: Les nouveaux modes créés comme expliqués dans ce HOWTO
# fonctionnent, mais n'apparaissent pas dans le menu de Xsetup. Quelqu'un
# sait-il pourquoi ?
#
##########################################################################
#----------------------------------------------- On y va:
# Modifiez ceci si votre fichier de lignes de modes vidéo est ailleurs:
XF=/usr/X11/lib/X11/XF86Config
if [ $# -ne 1 ] ; then
echo "utilisation: ${0##*/} <mode>"
echo " exemple: ${0##*/} 1024x764"
echo -e " rôle: convertit une entrée de ligne de mode vidéo de $XF au\nformat XInside (stdout, ou la sortie standard)"
exit 1
fi
egrep -i "^[\t ]*modeline.+\"$1\"" /usr/X11/lib/X11/XF86Config |
gawk '
NF < 11 { print "! mauvaise ligne:\n! " $0 "\n!"; next }
{
print "//", $0 ":"
name = $2
DOT_CLK = $3;
A = $4;
B = $5;
C = $6;
D = $7;
a = $8;
b = $9;
c = $10;
d = $11;
VerFrequency = 1000000 / ((D / DOT_CLK) * d)
print "[MODE_PRÉAJUSTÉ]"
printf " NomDuModePréajusté = \"%dx%d @ %.0dHz\";\n", A, a, VerFrequency
print " HorPixel\t\t= " A ";"
print " VerPixel\t\t= " a ";"
print " PixelWidthRatio\t= 4;\n PixelHeightRatio\t= 3;"
print " HorFrequency\t\t= " DOT_CLK / D * 1000 ";\t// kHz"
print " VerFrequency\t\t= " VerFrequency ";\t// Hz"
print " ScanType\t\t= NONINTERLACED;\t\t// *VÉRIFIEZ*"
print " HorSyncPolarity\t= NEGATIVE;\t\t\t// *VÉRIFIEZ*"
print " VerSyncPolarity\t= NEGATIVE;\t\t\t// *VÉRIFIEZ*"
print " CharacterWidth\t= 8;"
print " PixelClock\t\t= " DOT_CLK ";"
HorTotalTime = D / DOT_CLK
print " HorTotalTime\t\t= " HorTotalTime ";"
print " HorAddrTime \t\t= " A / DOT_CLK ";"
print " HorBlankStart\t\t= " A / DOT_CLK ";"
print " HorBlankTime\t\t= " D / DOT_CLK - A / DOT_CLK ";"
print " HorSyncStart\t\t= " B / DOT_CLK ";"
print " HorSyncTime\t\t= " C / DOT_CLK - B / DOT_CLK ";"
VerTotalTime = ( HorTotalTime * d ) / 1000
print " VerTotalTime\t\t= " VerTotalTime ";"
print " VerAddrTime\t\t= " ( HorTotalTime * a ) / 1000 ";"
VerBlankStart = ( HorTotalTime * a ) / 1000
print " VerBlankStart\t\t= " VerBlankStart ";"
print " VerBlankTime\t\t= " VerTotalTime - VerBlankStart ";"
print " VerSyncStart\t\t= " ( HorTotalTime * b ) / 1000 ";"
print " VerSyncTime\t\t= " ( HorTotalTime * ( c - b ) ) / 1000
print ""
}'