/* 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;
}
}
}
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.
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 |