Ubuntu 15.04 (beta 2) - Macbook pro 11.1 (retina fin 2013) 13" Changer la luminosité de l’écran

, par Matthieu Marcillaud

Quelque soit les portables que j’ai croisé, cela a toujours été une douce galère pour faire fonctionner certaines touches multimédia du clavier correctement. Dans le cas présent, je suis passé de Ubuntu 14.04 LTS à Ubuntu 14.10 (quelques minutes) puis Ubuntu 15.04 (Vivid Vervet) ( Beta 2). Tout à presque merveilleusement bien fonctionné, comme à chaque migration. Et comme à chaque migration, il y a quelques détails qui ne fonctionnent pas, ici, un particulièrement : le changement de luminosité de l’écran.

Tester toutes les solutions existantes en vain

En pareille situation, ici deux petites touches du clavier qui n’ont pas l’effet escompté, on part à la chasse aux solutions sur les forums et sites tel que askubuntu, launchpad ou stackoverflow…

Toutes les propositions que j’ai essayé ont échoué, notamment diverses modifications sur l’exécution par GRUB ou encore des ajouts dans /usr/share/X11/xorg.conf.d. Et j’en ai fait beaucoup d’essais ! Il semble que pour certains qui ont des Macbook Pro 15 pouces avec 2 cartes graphiques, certaines solutions fonctionnent ; mais pas dans mon cas donc, en tout cas à ce jour.

Partir du constat

Cet ordinateur dispose d’une carte graphique intégrée Intel (architecture Haswell), a priori nommée Iris Graphics (HD4000).

Le constat, c’est que… ça fonctionne presque. Si on appuie sur les touches de luminosité, Ubuntu affiche la notification de changement de luminosité, avec sa barre de "volume" qui augmente ou diminue ; mais cela n’a pas d’effet réel sur l’écran.

D’autre part, en regardant /sys/class/backlight on a 2 interfaces acpi_video0 et intel_backlight. Aucune des deux n’est modifiée lors de l’appui des touches de luminosité. Par contre, si l’on modifie l’une des 2 interfaces avec nos petites mains, aussitôt l’écran change sa luminosité.

sudo su
cd /sys/class/backlight
 
# sur acpi_video0
cd acpi_video0
cat max_brightness
# > 100
cat actual_brightness
# > 100
echo 50 > brightness
# l'écran passe à la moitié de sa luminosité
cat actual_brightness
# > 50
 
# sur intel_backlight
cd ../intel_backlight
cat max_brightness
# > 1388
cat actual_brightness
# > 691    
# Note : changer acpi_video0 a modifié aussi intel_backlight 
echo 100 > brightness
# l'écran passe en faible luminosité
cat actual_brightness
# > 100
 
# retour sur acpi_video
cd ..
cat acpi_video/actual_brightness
# > 50    Note : changer intel_backlight n'a pas modifié acpi_video0

On voit qu’envoyer des valeurs à l’interface acpi change correctement la luminosité de l’écran, que ce soit avec acpi_video0 ou avec intel_backlight. On peut donc imaginer un système d’écoute des appuis des boutons de luminosité, qui envoie une valeur sur l’une des interfaces.

Je n’ai pas trouvé en fouinant d’autres moyens autres que d’utiliser des écoutes d’événements dans /etc/acpi, donc allons y.

Écouter les touches avec ACPI

Dans /etc/acpi, on peut ajouter des fichiers qui écoutent les événements ACPI et exécutent des scripts en fonction. Il y en a déjà quelques uns. On va ajouter les nôtres.

Je précise que cela fonctionne ici car un appuie des touches de luminosité déclenche bien un événement ; dans le cas contraire, il faudrait trouver une autre solution ! On peut voir cela en exécutant : acpi_listen. Ici, un appui + puis - de luminosité donne :

video/brightnessup BRTUP 00000086 00000000 K
video/brightnessdown BRTDN 00000087 00000000 K

Ajoutons 2 écouteurs dans /etc/acpi/events/my-keyboard-backlight-up et /etc/acpi/events/my-keyboard-backlight-down, qu’on peut copier à partir de fichiers existants dans /etc/acpi/events. Cela donne :

my-keyboard-backlight-up

event=video/brightnessup
action=/etc/acpi/my-keyboard-backlight.sh up

my-keyboard-backlight-down

event=video/brightnessdown
action=/etc/acpi/my-keyboard-backlight.sh down

Reste à créer le script dans /etc/acpi/my-keyboard-backlight.sh.

Le curseur de notification sur Ubuntu a environ 20 pas. On va découper du coup aussi en 20 pas nos valeurs possibles. Cependant, j’en profite pour mettre plus de pas sur le côté de réglages en faible luminosité que sur la forte luminosité, car c’est ce qui me gênait avec la précédente version. J’ai choisi environ f(y) =  x²/4 pour une échelle de 0 à 100 (y) et des pas de 0 à 20 (x).

#!/bin/sh

KEYS_DIR=/sys/class/backlight/acpi_video0

test -d $KEYS_DIR || exit 0

MIN=0
MAX=$(cat $KEYS_DIR/max_brightness)
VAL=$(cat $KEYS_DIR/brightness)

# notre echelle est pour max ~ 100 avec ~ 20 pas
# avec des petits pas pour le coté sombre, et des plus grands pour la lumière.
# valeur   ~= ( position ^ 2) / 4
# position ~=  racine carree de ( 4 x valeur)

# trouver la position actuelle
POS=0
if [ $VAL -gt 0 ]; then
	POS=$(echo "e(l(4*$VAL)/2)" | bc -l)
	# forcer en integer
	POS=${POS%.*}
fi

#echo "MAX = " $MAX " | VAL = " $VAL " | POS = " $POS

if [ "$1" = down ]; then
	POS=$((POS-1))
else
	POS=$((POS+1))
fi

VAL=$(((POS * POS)/4 + 1))

if [ "$POS" -lt 1 ]; then
	VAL=0
fi

if [ "$VAL" -lt $MIN ]; then
        VAL=$MIN
elif [ "$VAL" -gt $MAX ]; then
        VAL=$MAX
fi

#echo "*POS = " $POS " | *VAL = " $VAL

echo $VAL > $KEYS_DIR/brightness

Il n’y a plus qu’à relancer de démon acpi :

service acpid restart
# ou
/etc/init.d/acpid restart

Et se réjouir

Les boutons sont fonctionnels. Seul l’appui long d’un bouton ne diminue pas la luminosité entièrement (contrairement à ce que montre la notification dans ubuntu), car 1 seul événement acpi est envoyé. Donc, pour baisser la luminosité rapidement, il faut cliquer plusieurs fois rapidement !

Coup de pouce

Pour me maintenir en éveil et en pleine forme physique et mentale, vous pouvez me faire le cadeau d'un jus de fruit pressé.

En plus de m'hydrater, de m'offrir une alimentation saine crudivore et frugivore, cela peut aussi me motiver à produire d'autres documentations ou peut-être à prendre des vacances ! :)

Vous pouvez également me « Flattrer » si vous utilisez le service en ligne très malin Flattr de microdonations qui permet d'allouer un budget mensuel à des créateurs de contenu. Votre budget est partagé chaque mois entre toutes les personnes que vous avez flattées ce mois là.