IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Différencier les flèches et echap


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut Différencier les flèches et echap
    Bonsoir,

    je suis confronté à un problème depuis plusieurs heures...

    j'ai beau tester plein de trucs mais rien à y faire...

    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Touche=" "
     
    while [[ ${Touche} ]]
    do
      IFS= read -r -sn 1 Touche
     
      case "${Touche}" in
        $'\033') echo "033";;
        $'\104') echo "104";;
        $'\103') echo "103";;
        $'\101') echo "101";;
        $'\102') echo "102";;
        $'\133') echo "133";;
        *) echo "et plein dautres trucs..." ;;
      esac
    done
    En sachant qu'en appuyant sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echap : 033
    haut :033 - 133 - 101
    bas : 033 - 133 - 102
    gauche : 033 - 133 - 104
    droite : 033 - 133 - 103
    Comment faire (sans quitter la boucle pour savoir si j'ai appuyer sur echap ?!
    J'ai essayé de passer par des variables, des testes de la la variable Touche...
    mais rien n'y fait...

    Une idée ?!

    Merci !
    Sous Kubuntu 20.04

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Bonjour,

    en testant ton code, je vois que les flèches occupent plus d'un caractère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ IFS='' read -r -sn1
    $ [A
    $ echo "$REPLY" | cat -v
    ^[
    $ IFS='' read -r -sn3
    $ echo "$REPLY" | cat -v
    ^[[A
    je n'ai pas de solution sous le coude.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Tout à fait ils en font 3 à priori :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    showkey -a
    # Haut
    ^[[A     27 0033 0x1b
             91 0133 0x5b
             65 0101 0x41
    # Bas
    ^[[B     27 0033 0x1b                                                                                                                                          
             91 0133 0x5b                                                                                                                                          
             66 0102 0x42
    # Gauche
    ^[[D     27 0033 0x1b
             91 0133 0x5b
             68 0104 0x44
    # Droite
    ^[[C     27 0033 0x1b
             91 0133 0x5b
             67 0103 0x43
    # Echap
    ^[       27 0033 0x1b
    Mince...
    Sous Kubuntu 20.04

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 088
    Points
    43 088
    Par défaut
    L'appui sur les touches de flèches génèrent une séquence CSI appelé aussi code escapes.

    Autres sources :
    https://en.wikipedia.org/wiki/ANSI_e...uence_elements
    http://www.ecma-international.org/pu...s/Ecma-048.htm

    Pour détecter la flèche, il te faut lire un code escape, suivi de plusieurs codes ASCCII (de 2 à 3 - tu as le résultat dans ton post #3). Pour détecter la touche ESC, il faut lire cette touche, et vérifier qu'il n'y a pas d'autres caractères dans le tampon.

    NCurses par exemple gère ça via sa fonction getch remplaçant getchar pour gérer cela.

    Il te faut donc attendre l'appui de ESC, puis attendre par exemple 1s si d'autres touches sont appuyés, et de là soit faire ton traitement pour ESC, soit pour la touche correspondant à la séquence CSI.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour et merci, c'était un petit jeu sympa.
    Je ne pense pas que tous les cas soient gérés mais...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    while  read -r -s -n 1 A
    do
    [ $A ] || { echo on quitte par return ; break ; }
    if ([ $A = $'\033' ] ) ;then
    	read -t 0
    	[ $? -eq 1 ] && { echo echapp ; continue ; }
    	read -r -s -n 1 A
    	[ $A = $'\133' ] || { echo pas une touche qu on cherche ; break ; }
    	read -t 0
    	[ $? -eq 1 ] && { echo pas une touche qu on cherche ; break ; }
    	read -r -s -n 1 A
    	case $A in
    		$'\104') echo gauche;;
    		$'\103') echo droite;;
    		$'\101') echo haut;;
    		$'\102') echo bas;;
    		*)  echo pas une touche qu on cherche ;;
    	esac
    	continue
    else
    	echo on quitte par une touche quelconque
    	break
    fi
    done
    Cordialement.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Merci beaucoup ctac_ !

    J'étais parti sur des successions de tests de variables...

    et ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	read -t 0
    	[ $? -eq 1 ] && { echo echapp ; continue ; }
    m'a permis d'arriver à mes fins !

    Encore merci et merci aux autres personnes ayant répondues
    Sous Kubuntu 20.04

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/02/2020, 19h57
  2. Réponses: 16
    Dernier message: 27/05/2006, 08h40
  3. onKeyPress sur les flèches du clavier
    Par trepidelhia dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 10/01/2006, 18h42
  4. [W3C] Colorier les flêches d'un <option>
    Par Oberown dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 08/10/2004, 21h29
  5. Réponses: 12
    Dernier message: 30/07/2004, 15h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo