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