Abstraction Concrète : Module Clavier


Les fonctions d'entrées de la bibliothèque io (read_line, read_int, read_float, input_char, input_line, input, really_input, input_byte, input_binary_int, input_value), peuvent être exploitées pour le contrôle des entrées réalisées au clavier. Toutefois, il est parfois utile de définir des fonctions auxiliaires de contrôle d'entrées au clavier afin, par exemple, de permettre la capture des touches frappées et d'assurer simultanément la gestion personnalisée de l'affichage.

Pour commencer, on propose de définir un nouveau type somme : le type touche. On examine, ensuite, la définition du clavier pour construire la fonction get_key qui attend une touche ou une combinaison de touches frappée au clavier et retourne la valeur correspondante du type touche après filtrage. Le module d'interface exporte le type touche et la fonction get_key.

La définition de la fonction get_key, fait appel à la fonction wait_next_event et à l'événement Key_pressed, tous deux pré définis dans la bibliothèque graphique "graphics". Le rôle de la fonction wait_next_event consiste à examiner les événements précisés dans une liste d'événements, du type event list, fournie en argument. Dans cet exemple, la liste d'événements mentionne uniquement l'événement Key_pressed déclenché lorsqu'une touche ou une combinaison de touches est frappée. La fonction wait_next_event retourne un enregistrement du type status contenant le champ key : char avec la valeur du caractère correspondant à l'entrée faite au clavier.

Deux définitions de clavier sont présentées. La première définition correspond aux versions Caml-Light 0.5 pour DOS/PC386, Caml-Light 0.6 pour DOS/PC386 ou Caml-Light 0.7 pour DOS, et la deuxième définition correspond aux versions Caml-Light 0.5 pour DOS/PC86 ou Caml-Light 0.5 pour DOS/PC86.

Le module d’interface est commun aux deux définitions de clavier qui sont étudiées.

Type touche

type touche =
NULL | ORIGINE | ENTREE | ESC | TAB | MAJ_TAB | RETOUR | FIN | SUPPR | ESPACE | CHIFFRE of int | LETTRE of char | SYMBOLE of char | FLECHE of direction | PAGE of direction | FONCTION of int | CTRL of touche

and direction = HAUT | BAS | GAUCHE | DROITE ;;

Clavier : 1ère définition

Pour les versions Caml suivantes :
Constructeur Type associé Valeur associée Codes des touches
TAB . . Code 9
ESC . . Code 27
ESPACE . . Code 32
ENTREE . . Code 13
RETOUR . . Code 8
SUPPR . . Code 339
FIN . . Code 335
MAJ_TAB . . Code 271
ORIGINE . . Code 327
CHIFFRE int 0 à 9 Caractères `0` à `9`
FLECHE direction HAUT Code 328
FLECHE direction BAS Code 336
PAGE direction HAUT Code 329
PAGE direction BAS Code 337
FLECHE direction GAUCHE Code 331
FLECHE direction DROITE Code 333
FONCTION int 1 à 10 Code 315 à 324
CTRL touche ORIGINE Code 375
CTRL touche FIN Code 373
CTRL touche FLECHE GAUCHE Code 371
CTRL touche FLECHE DROITE Code 372
CTRL touche PAGE HAUT Code 388
CTRL touche PAGE BAS Code 374
LETTRE char lettre_capturée lettre_capturée
SYMBOLE char symbole capturé symbole capturé
NULL . lettre_capturée autres touches

get_key()

let get_key () = 
    let e = wait_next_event [Key_pressed] in
  match int_of_char(e.key) with
    271 -> MAJ_TAB
  | 327 -> ORIGINE
  | 335 -> FIN
  | 328 -> FLECHE HAUT
  | 336 -> FLECHE BAS
  | 331 -> FLECHE GAUCHE
  | 333 -> FLECHE DROITE
  | 329 -> PAGE HAUT
  | 337 -> PAGE BAS
  | 375 -> CTRL ORIGINE
  | 373 -> CTRL FIN
  | 371 -> CTRL (FLECHE GAUCHE)
  | 372 -> CTRL (FLECHE DROITE)
  | 388 -> CTRL (PAGE HAUT)
  | 374 -> CTRL (PAGE BAS)
  | 339 -> SUPPR
  | 32 -> ESPACE
  | 27 -> ESC
  | 13 -> ENTREE
  |  9 -> TAB
  |  8 -> RETOUR
  | n  -> 
    if ((n>314) & (n<325)) then FONCTION (n-314)
    else begin match e.key with
    `0`..`9` -> CHIFFRE (int_of_char e.key)
  | (`A`..`Z`|`a`..`z`|`é`|`è`|`ê`|`à`|`â`|`ô`|`û`|
     `ù`|`î`|`ë`|`ï`|`µ`|`ç`)
	     -> LETTRE e.key
  | (`+`|`-`|`*`|`/`|`&`|`"`|`'`|`(`|`(`|`<`|`_`|`)`|
     `#`|`{`|`[`|`|`|`\249`|`@`|`]`|`}`|`²`|`\245`|
     `$`|`^`|`~`|`,`|`\207`|`;`|`:`|`!`|`.`|`?`|`%`|
     `£` |`=`|`>`|`°`|`\\`|`\`` )
	     -> SYMBOLE e.key
  |_ -> NULL
  end ;;

Clavier : 2ème définition

Pour les versions Caml suivantes :
Constructeur Type associé Valeur associée Codes des touches
TAB . . Code 9
ESC . . Code 27
ESPACE . . Code 32
ENTREE . . Code 13
RETOUR . . Code 8
SUPPR . . Code 0; 83
FIN . . Code 0; 79
MAJ_TAB . . Code 0; 15
ORIGINE . . Code 0; 71
CHIFFRE int 0 à 9 Caractères `0` à `9`
FLECHE direction HAUT Code 0; 72
FLECHE direction BAS Code 0; 80
PAGE direction HAUT Code 0; 73
PAGE direction BAS Code 0; 81
FLECHE direction GAUCHE Code 0; 75
FLECHE direction DROITE Code 0; 77
FONCTION int 1 à 10 Code 0; 58 à 69
FONCTION int 11 à 12 Code 0; 133 à 134
CTRL touche ORIGINE Code 0; 119
CTRL touche FIN Code 0; 117
CTRL touche FLECHE GAUCHE Code 0; 115
CTRL touche FLECHE DROITE Code 0; 116
CTRL touche PAGE HAUT Code 0; 132
CTRL touche PAGE BAS Code 0; 118
LETTRE char lettre_capturée lettre_capturée
SYMBOLE char symbole capturé symbole capturé
NULL . lettre_capturée autres touches

get_key()

let get_key () =
    let e = wait_next_event [Key_pressed] in
  match int_of_char(e.key) with
    0   ->
      ( let e=wait_next_event [Key_pressed] in
      match int_of_char(e.key) with
         15 -> MAJ_TAB
       | 71 -> ORIGINE
       | 79 -> FIN
       | 73 -> PAGE HAUT
       | 81 -> PAGE BAS
       | 72 -> FLECHE HAUT
       | 80 -> FLECHE BAS
       | 75 -> FLECHE GAUCHE
       | 77 -> FLECHE DROITE
       | 119 -> CTRL ORIGINE
       | 117 -> CTRL FIN
       | 115 -> CTRL (FLECHE GAUCHE)
       | 116 -> CTRL (FLECHE DROITE)
       | 132 -> CTRL (PAGE HAUT)
       | 118 -> CTRL (PAGE BAS)
       | 83 -> SUPPR
       | 133 -> FONCTION (11)
       | 134 -> FONCTION (12)
       | n  -> if ((n>58) & (n<69)) then FONCTION (n-58) else NULL
      )
  | 32 -> ESPACE
  | 27 -> ESC
  | 13 -> ENTREE
  |  9 -> TAB
  |  8 -> RETOUR
  | _ -> (match e.key with

    `0`..`9` -> CHIFFRE (int_of_char e.key)
  | (`A`..`Z`|`a`..`z`|`é`|`è`|`ê`|`à`|`â`|`ô`|`û`|
     `ù`|`î`|`ë`|`ï`|`µ`|`ç`)
	     -> LETTRE e.key
  | (`+`|`-`|`*`|`/`|`&`|`"`|`'`|`(`|`(`|`<`|`_`|`)`|
     `#`|`{`|`[`|`|`|`\249`|`@`|`]`|`}`|`²`|`\245`|
     `$`|`^`|`~`|`,`|`\207`|`;`|`:`|`!`|`.`|`?`|`%`|
     `£` |`=`|`>`|`°`|`\\`|`\`` )
	     -> SYMBOLE e.key
  |_ -> NULL   )
 ;;