Rafraichissement de zones exposées

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

 

Exécution:

Masquez et re-exposez partiellement ou totalement la fenêtre B avec la fenêtre A.

Fonctionnement de ce programme :

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.

exercice copy.c :

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