Journal Réglage du contraste sur ordinateur portable

Posté par  . Licence CC By‑SA.
Étiquettes :
25
20
avr.
2020

Bonjour à tous,

L'affichage de mon ordinateur portable étant un peu fadasse, je cherchais à en améliorer le contraste. Mais il n'y a aucun bouton matériel pour cela (comme sur les écrans externes), ni aucun utilitaire dédié dans les outils de configuration de ma distribution (Linux Mint / Mate).

Peut-être ai-je mal cherché, mais je n'ai rien trouvé non plus dans les dépôts. En revanche, il existe plusieurs méthodes en ligne de commande, dont la plus simple semble être la commande xgamma.

Comme c'est un peu laborieux d'ouvrir le terminal à chaque fois, j'ai fait le script suivant :

#!/bin/bash
while true;do
    g0=`xgamma 2>/dev/stdout | cut -f 10 -d ' '`
    g0=`awk "BEGIN {printf \"%.0f\n\",-10.0/1.8*$g0+19.0/1.8}"`
    g=`zenity --scale --value=$g0 --min-value=0 --max-value=10 --text="Contraste" --title="Affichage"`
    if (($?==1));then exit;fi
    g=`awk "BEGIN {printf \"%.1f\n\",-0.18*$g+1.9}"`
    xgamma -gamma $g
done

Ce script, bien que court, contient plusieurs concepts intéressants :

  • zenity, qui ajoute à un code bash des composants graphiques. Ici on ajoute un curseur (--scale)
  • la redirection d'erreur : la commande xgamma utilisée seule renvoie la valeur actuelle de gamma de l'affichage, mais sur la sortie d'erreur. De ce fait, on ne peut pas la récupérer dans une variable ou la traiter avec cut. Il faut donc la rediriger vers la sortie standard avec 2>/dev/stdout
  • le code de retour d'une commande : le curseur créé avec zenity a un bouton valider, qui renvoie la valeur du curseur, et la commande annuler, qui ne renvoie rien de visible. Mais on peut récupérer l'état de sortie du programme avec la variable $? qui vaut 0 avec le bouton valider, et 1 avec le bouton annuler (on aurait peut-être aussi pu tester si $g était vide)
  • awk, qui permet de faire en même temps du calcul avec des flottants et une sortie formatée (printf)

Et après, il est possible de rendre le script exécutable, et de créer un bouton contraste dans le tableau de bord pour l'appeler…

Titre de l'image

  • # Utilisable ailleurs ?

    Posté par  (site web personnel, Mastodon) . Évalué à 3.

    Merci pour le script.

    C'est une question naïve, mais est-ce que cela pourrait fonctionner avec d'autres distributions et d'autres environnements de bureau ? Il me semble que oui. Mais bon.

    « Tak ne veut pas quʼon pense à lui, il veut quʼon pense », Terry Pratchett, Déraillé.

    • [^] # Re: Utilisable ailleurs ?

      Posté par  . Évalué à 5.

      Oui, ça utilise xgamma qui est plus ou moins standard. Attention, ça ne marchera qu'avec Xorg mais pas avec Wayland.

      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

      • [^] # Re: Utilisable ailleurs ?

        Posté par  (Mastodon) . Évalué à 3.

        Oui, ça utilise xgamma qui est plus ou moins standard.

        Et de mon coté, j'ai trouvé celui-ci qui doit être aussi plus ou moins standard (cf Xkcd)

        https://packages.debian.org/buster/brightnessctl

        • [^] # Re: Utilisable ailleurs ?

          Posté par  . Évalué à 1.

          Intéressant mais méfiance avec les utilitaires que Debian propose.

          zram-tools par exemple qui est apparu dans buster n'est plus maintenu depuis plusieurs années, il est complètement buggé et est très loin de fournir toutes les options du module inclus dans le noyau.

    • [^] # Re: Utilisable ailleurs ?

      Posté par  . Évalué à 4.

      Oui, les fonctions appelées par le script sont indépendantes de Linux Mint ou d'Ubuntu. Zenity est basé sur GTK.

      Je précise que le script ne règle que le contraste. La luminosité (brightness) est gérée par les boutons dédiés du clavier, qui sont reconnus par Linux Mint.

      • [^] # Re: Utilisable ailleurs ?

        Posté par  . Évalué à 2.

        Méfie toi quand même de awk, selon les distributions (Ubuntu et Fedora dans mon cas) on peut se retrouver avec mawk ou gawk.

        Et elles ne sont bien sûr pas 100% compatible.

        Les vrais naviguent en -42

  • # brigthness master

    Posté par  (Mastodon) . Évalué à 5. Dernière modification le 20 avril 2020 à 18:10.

    Sur KDE il n'y a pas non plus de contrôle pour cela, sauf pour les LVDS (et assimilés, les écrans de portables). Dommage :-(

    Il y a brigthness master disponible, qui fait le taf en graphique, pratique pour les écrans vga/HDMI/DP .. Cependant cela casse le réglage automatique de la colorimétrie selon l'heure (maintenant intégré par défaut, mais avant, en ajout, c'était pareil)

    brigthness master

    • [^] # Re: brigthness master

      Posté par  (site web personnel) . Évalué à 4.

      Si je comprends bien, et d'après l'animation, brigthness master n'ajuste pas le contraste mais la luminosité et la température de couleur. Rien à voir donc.

      « Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. »

  • # En Perl/Tk, avec ajustement du contraste en temps réel

    Posté par  (site web personnel) . Évalué à 10. Dernière modification le 21 avril 2020 à 03:54.

    Bonjour,

    L’idée est bonne, mais utiliser des outils moins limités que bash permet d’obtenir un ajustement du contraste en temps réel.

    La complexité légèrement plus importante de la création de l’interface graphique est compensée par le fait qu’on n’en est pas réduit à appeler des programmes externes avec deux niveaux de quotes pour faire de simples calculs.

    #!/usr/bin/perl -w
    use strict;
    
    # Modification basique du contraste de l’affichage sous X.org
    
    # Vous pouvez utiliser ce programme au choix selon les termes
    # de la GNU General Public License version 2 ou ultérieure
    # ou de la Perl Artistic License.
    
    use Tk;
    use POSIX qw(log10);
    
    # Le paramètre gamma semble plutôt exponentiel, donc on utilisera une échelle
    # logarithmique. Le logarithme décimal n’est probablement pas l’idéal, mais il
    # est pratique.
    # Arbitrairement, l’échelle choisie ira de 0.1 à 10, affichée de -100 pour 10⁻¹
    # à 100 pour 10¹.
    
    # Récupération des valeurs de contraste actuelles (trois valeurs décimales
    # précédées par des caractères qui ne sont pas des chiffres).
    `xgamma 2>&1` =~ /^\D+(\d+\.\d+)\D+(\d+\.\d+)\D+(\d+\.\d+)\D*$/
      or die "Impossible de lire le contraste actuel avec xgamma\n";
    
    # On initialise le contraste avec la moyenne des contrastes rouge, vert et bleu.
    # C’est un pis aller, mais apparemment, xgamma ne prend pas en compte les
    # valeurs différenciées au niveau de xrandr qu’a pu apporter par exemple
    # Redshift, donc n’interfère pas avec celui-ci.
    # Idéalement, il faudrait utiliser xrandr et permettre de modifier les trois ou
    # conserver la proportionnalité.
    my $contraste = log10(($1 + $2 + $3) / 3) * 100;
    
    # Changement du contraste
    sub chng_contraste {
       system 'xgamma', '-gamma', 10 ** ($contraste / 100);
       # Note : on laisse les valeurs s’afficher sur la sortie d’erreur, mais est-ce
       # plus gênant qu’utile ?
    }
    
    # Interface graphique
    my $fen  = MainWindow -> new('-title' => 'Affichage');
    my $etiq = $fen -> Label ('-text' => 'Contraste') -> pack();
    my $ech  = $fen -> Scale ('-orient' => 'horizontal', '-length' => 300,
                              '-from' => -100, '-to' => 100, '-resolution' => 1,
                              '-variable' => \$contraste, '-command' => \&chng_contraste)
                             -> pack();
    my $bout = $fen -> Button('-text' => 'Fermer', '-command' => sub { exit 0; })
                             -> pack();
    
    MainLoop;

    Prendre une bonne disposition : beop.free.fr

    • [^] # Re: En Perl/Tk, avec ajustement du contraste en temps réel

      Posté par  . Évalué à 7.

      Merci pour ce script, vraiment très chouette. Ton code fait tout le nécessaire, y compris l'interface graphique, de façon compacte.

      Je ne sais pas programmer en Perl mais le code est parfaitement compréhensible. Je crois que je vais m'y mettre !

      • [^] # Re: En Perl/Tk, avec ajustement du contraste en temps réel

        Posté par  (site web personnel) . Évalué à 3.

        Ton code fait tout le nécessaire, y compris l'interface graphique, de façon compacte.

        Ça n’est pas complètement étranger à mes choix techniques.

        Je ne sais pas programmer en Perl mais le code est parfaitement compréhensible. Je crois que je vais m'y mettre !

        Bonne nouvelle. :‐)

        Je pourrais utiliser ce script comme prétexte à présenter quelques notions de Perl dans un commentaire ou un journal, si ça intéresse quelques personnes.

        Pour ma part, je viens de me mettre à Tk (pour ce script).

        Je pourrais d’autre part ajouter le support de la luminosité avec xbacklight, à moins que quelqu’un n’ait envie de le faire à titre d’exercice.

        Prendre une bonne disposition : beop.free.fr

    • [^] # Re: En Perl/Tk, avec ajustement du contraste en temps réel

      Posté par  . Évalué à 1.

      J'ai essayé le script, ça marche bien mais le rendu des polices est un peu bizarre (compactes et pixellisées). C'est un truc qui peut se régler ?

      • [^] # Que font les polices ?

        Posté par  (site web personnel) . Évalué à 1.

        Pour moi, ce sont des polices grasses et pas tellement grandes (pas petites non plus, mais j’ai un écran avec une résolution relativement modeste). Ce n’est pas très étonnant considérant l’époque à laquelle a été développé Tk. Si elles font le même nombre de pixels sur un écran HiDPI, je comprendrais que ce ne soit pas formidable sur celui-ci.

        Il y a peut-être moyen de changer cela… pour peu qu’on maîtrise suffisamment Tk.

        Par contre, elles bénéficient du rendu sous-pixel, comme les autres applications (si on agrandit, elles présentent un bord un peu plus bleu d’un côté et un peu plus rouge de l’autre, caractéristique du rendu sous-pixel), elles ne sont donc absolument pas pixelisées.

        Je comprendrais qu’elles semblent petites sur ton écran si c’est par exemple un Full HD en 14″, mais c’est bizarre qu’elles apparaissent pixelisées si ce n’est pas le cas pour d’autres applications… Peut-être une question de polices installées. Si celles demandées par Tk ne sont pas disponibles, il est possible qu’il se rabatte sur des polices bitmap ou moins adaptées.

        Ou alors si tu as une résolution importante et que tes autres applications utilisent de grosses polices, tu n’as peut-être pas activé le rendu sous-pixel et l’anticrénelage (pour ma part, je l’ai réglé au maximum).

        Prendre une bonne disposition : beop.free.fr

      • [^] # Gamma…

        Posté par  (site web personnel) . Évalué à 1.

        Concernant le fonctionnement du script, ce qui me chiffonne plutôt, c’est que le gamma fonctionne de façon contre‐intuitive par rapport à ce qu’on attend d’un contraste, bien que les valeurs affichées par xgamma confirment que le script fait ce qu’on attend de lui.

        C’est à dire que si on compense le changement de luminosité en modifiant le rétro‐éclairage, on se retrouve avec des couleurs plus délavées en poussant le gamma et plus contrastées en le diminuant… L’inverse de ce qu’on attend !

        En laissant le fonctionnement ainsi, je pense qu’il vaut mieux changer le terme « Contraste » par « Gamma »…

        Prendre une bonne disposition : beop.free.fr

      • [^] # Changer la fonte à la volée

        Posté par  (site web personnel) . Évalué à 1. Dernière modification le 22 avril 2020 à 10:58.

        J'ai essayé le script, ça marche bien mais le rendu des polices est un peu bizarre (compactes et pixellisées). C'est un truc qui peut se régler ?

        Une manière rapide de changer la fonte est de passer au script une option de fonte. Tk la traite.
        Par exemple : gamma.pl -font 'Sans 18' (Sans étant sur la plupart des distributions un alias sur la police sans empattement par défaut).

        Prendre une bonne disposition : beop.free.fr

  • # et sinon via le hardware ?

    Posté par  (site web personnel) . Évalué à 4.

    Verifiez qd meme que votre ecran n'est pas pilotable en Hardware via I2C et Ddcontrol.

    C'est assez facile en fait:

    https://mastodon.social/@rzr/103488065007339524

    Je voulais ensuite y accoller un ambiant light sensor pour ajuster la luminosité

    gpg:0x467094BC

  • # Intéressant et à creuser

    Posté par  . Évalué à 0.

    Merci pour ce retour étayé.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.