Le focus du clavier

/* focus.c */

/* changement de focus */

#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

GC      gc; 
Display *display; 
int     screen; 
Window  win, subwin[2], root; 
unsigned long white_pixel, black_pixel;
int f, pos[2] = {1,1} ;  
 
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, 200, 400, 5, black_pixel, white_pixel); 
  XSelectInput (display, win, ExposureMask | KeyPressMask); 
  XStoreName (display, win, "focus"); 
  for (f=0; f<2; ++f) {
    subwin[f] = XCreateSimpleWindow (display, win,  10+f*90, 10, 80, 350, 2, 
				     black_pixel, white_pixel); 
    XSelectInput (display, subwin[f], ExposureMask | KeyPressMask );
  }
  XMapSubwindows (display, win); 
  XMapWindow (display, win); 
 
  for (;;) { 
    XEvent ev; 
    char buf[40];
    char c;
    KeySym symkey;

    XNextEvent (display, &ev); 
    switch (ev.type) { 
    case Expose : 
      if (ev.xexpose.window == subwin[0]) 
	XDrawString (display, subwin[0], gc, 5, 10, "fenetre 0", 9); 
      else if (ev.xexpose.window == subwin[1]) 
	XDrawString (display, subwin[1], gc, 5, 10, "fenetre 1", 9); 
      break; 
    case KeyPress :
      for (f=0; f<2; ++f) 
	if (ev.xkey.window == subwin[f]) 
	  if (XLookupString(&ev, &c, 1, &symkey, 0)!=0) {
	    XDrawString (display, subwin[f], gc, 5, 10*(++pos[f]), &c, 1); 
	    if ((c == '0') || (c == '1'))
	      XSetInputFocus(display, subwin[c & 0xf], RevertToParent,
			     CurrentTime);
	  }
      break;  
    default :
      break;
    } 
  } 
} 

Exécution:

Tapez sur des touches. Le focus est donné à l'une ou l'autre des 2 sous-fenêtres numérotées 0 et 1 en tapant sur les touches 0 respectivement 1.

Fonctionnement de ce programme :

La fenêtre qui recoit les entrées du clavier est celle qui a le focus du clavier. L'attribution du focus peut se faire de 3 façons :
- Le WM attribue le focus soit à la fenêtre précédemment cliquée soit à la fenêtre située sous le pointeur de souris.
- la requête XSetInputFocus attribue le focus du clavier à telle fenêtre.
- Si la fenêtre focus devient invisible, le focus sera attribuée à sa parente ou à la fenêtre root.

Une fenêtre qui a sélectionné FocusChangeMask est averti des changements de focus par l'événement de type XFocusChangeEvent : FocusIn, FocusOut sont les event.type.

 

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