Accaparation du clavier : grab

/* grab2.c */

/* accaparation (grab) du clavier */

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#define LARG 6 /* largeur de caractere + 1 */

GC      gc; 
Display *display; 
int     screen, presse=0; 
Window  win, root; 
unsigned long white_pixel, black_pixel;
int nbre, pos=0;
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, 300, 50, 5, black_pixel, white_pixel); 
  XSelectInput (display, win, KeyPressMask | ButtonPressMask); 
  XStoreName (display, win, "grab2"); 
  XMapWindow (display, win); 
 
  for (;;) { 
    XEvent ev;
    XNextEvent (display, &ev);
    switch (ev.type) {
    case ButtonPress  : 
      break ;
    case KeyPress : 
      nbre = XLookupString(&ev, chaine, 20, &touche, 0);
      chaine[nbre] = 0;
      if (nbre == 1) {
	if (chaine[0] == 'G') {
	  XGrabKeyboard (display, win, True, GrabModeAsync, 
			 GrabModeAsync, CurrentTime);
	  XClearWindow (display, win);
	  XDrawString(display, win, gc, 10, 20, 
		      "cette fenetre accapare le clavier", 33);
	  pos=0;
	} else if (chaine[0] == 'U') {
	  XUngrabKeyboard (display, CurrentTime);
	  XClearWindow (display, win);
	  XDrawString(display, win, gc, 10, 20, 
		      "cette fenetre n'accapare plus le clavier", 40);  
	  pos=0;
	} else 
	  XDrawString(display, win, gc, (pos++)*LARG+10, 35, 
		      chaine, nbre);
      }
    default :
      break;
    } 
  } 
} 
 

Execution :

Cliquez dans la fenêtre "grab2" et tapez des lettres. Cliquez dans la fenêtre Xterm et tapez des lettres. Tapez la lettre G, puis refaite les manipulations précédentes. Tapez la lettre G, puis refaite les manipulations précédentes.

Fonctionnement de ce programme :

Accaparation, Monopolisation, saisie, Grab du clavier par une fenêtre :
- Par défaut, la fenêtre recevant les événements KeyPress est celle qui a le focus.
- Néanmois la requête XGrabKeyboard (...) définit aussi la fenêtre qui accapare le clavier. XUngrabKeyboard annule cette monopolisation.

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