/* expose.c */
/* rafraichissement de zone expose */
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
GC gc;
Display *display;
int screen, i, compte=0;
Window win[2], root;
unsigned long white_pixel, black_pixel;
char titre[10] = "expose", ligne[15] = " et taratattaa";
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);
titre[7] = '\0';
for (i=0; i<2; ++i) {
win[i] = XCreateSimpleWindow (display, root, 0, 0, 150, 150, 2,
black_pixel, white_pixel);
titre[6] = (char)('A'+i);
XStoreName (display, win[i], titre);
XSelectInput (display, win[i], ExposureMask | ButtonPressMask);
XMapWindow (display, win[i]);
}
for (;;) {
XEvent ev;
XNextEvent (display, &ev);
switch (ev.type) {
case Expose :
if (ev.xexpose.window == win[0]) {
XDrawString (display, win[0], gc, 10, 10, "source utilisee", 15);
for (i=2; i<10; i=i+1) {
ligne[0] = (char)('0'+i);
XDrawString (display, win[0], gc, 10, i*10, ligne, 15);
}
}
if (ev.xexpose.window == win[1])
if (compte++!=0)
XCopyArea (display, win[0], win[1], gc, 0, 0, ev.xexpose.width,
ev.xexpose.height, ev.xexpose.x, ev.xexpose.y);
break;
default :
break;
}
}
}
Masquez et re-exposez partiellement ou totalement la fenêtre B avec la fenêtre A.
A chaque réception de l'événement expose, qui signale qu'une partie de la fenêtre B est de nouveau visible, les coordonnées de la zone rectangulaire à rafraichir sont récupérées : ev.xexpose.width, ev.xexpose.height, ev.xexpose.x, ev.xexpose.y .
Puis on "rafraichit" ce rectangle en y copiant la partie haute gauche de la fenêtre A avec XCopyAera.
Creez 2 fenêtres de même taille. Le bouton 1 écrit "ici" dans la première et "la" dans la seconde. Le bouton 3 recopie le contenu de la première dans la seconde.
| programme suivant | index général | fonctions de la XLib | événements | types dans XLib |