Le Clavier

/* clavier.c */

/* affiche la frappe clavier a l'endroit de la souris et quitte si touche q */

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/keysym.h> 

GC      gc; 
Display *display; 
int     screen; 
Window  win, root; 
unsigned long white_pixel, black_pixel; 
int nbre;
char chaine[20];
KeySym touche;
 
main() {  
  if ((display = XOpenDisplay ("")) == NULL) { 
    fprintf (stderr, "Can't open Display\n"); 
    exit (1); 
  } 
  gc = DefaultGC (display, screen); 
  screen = DefaultScreen (display); 
  root = RootWindow (display, screen); 
  white_pixel = WhitePixel (display, screen); 
  black_pixel = BlackPixel (display, screen); 
  win = XCreateSimpleWindow (display, root,  
			     0, 0, 100, 90, 2, black_pixel, white_pixel); 
  XSelectInput (display, win, ExposureMask | KeyPressMask); 
  XStoreName (display, win, "clavier"); 
  XMapWindow (display, win); 
  
  for (;;) { 
    XEvent ev; 
    XNextEvent (display, &ev); 
    switch (ev.type) { 
    case Expose :
      XDrawString (display, win, gc, 10, 30, "Hello !", 7);      
      break; 
    case KeyPress :
      nbre = XLookupString(&ev, chaine, 20, &touche, 0);
      chaine[nbre] = 0;
      if (touche==XK_space)
	exit(0);
      else XDrawString(display, win, gc, ev.xkey.x, ev.xkey.y,
		       chaine, nbre);
    default : 
      break;            
    } 
  } 
}

Exécution :

Essayer la frappe en changeant le pointeur-souris.

Fonctionnement de ce programme:

Lorsqu'une touche du clavier est frappée, l'événement KeyPress est envoyé (dans la fenêtre foyer des entrées-clavier et ayant sélectionné l'événement). En général, les W.M. attribue le focus à la fenêtre qui contient le pointeur-souris. Içi, on décode la touche à l'aide de XLookupString puis si c'est l'"espace" le programme termine, sinon sa valeur ascii est dessinée à l'endroit où se trouvait le pointeur souris au moment de la frappe.

Le clavier numérote ses touches (exemple touche a) selon les spécifications du constructeurs. Ce numéro est le keycode, entier de 8 à 255.
Ce keycode + les touches modifiers enfoncés (exemple shift_L) donne un keysym (exemple XK_A). Les keysyms forme un code symbolique standard X défini dans /usr/X11R6/include/X11/Xkeysymdef.h .
Les modifiers sont Shift, Lock, Control, Meta. Un mapping associe keycodes + modifiers aux keysyms. Le changement de Map provoque un événement MappingNotify.
X-Window n'est pas restreint à l'ASCII, mais on peut obtenir la traduction Ascii d'un Keysym (exemple "A").
Le keysym de l'espace est XK_space.

Exercice litecrit.c :

Affiche à partir du dernier endroit cliqué, les lettres frappées à la suite les unes des autres de gauche à droite en évitant les chevauchements. La fonte utilisée par défaut est fixe du genre 8x13 ou 8x14 ou .... Faites des essais !

programme suivant index général fonctions de la XLib événements types dans XLib