Visibilité des fenêtres : Map

/* map.c */

/* Map et Unmap une sous-fenetre */

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

GC      gc; 
Display *display; 
int     screen; 
Window  win, subwin, root; 
unsigned long white_pixel, black_pixel;  
int aff=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, 300, 100, 5, black_pixel, white_pixel); 
  XSelectInput (display, win, ExposureMask | ButtonPressMask); 
  XStoreName (display, win, "map"); 
  subwin = XCreateSimpleWindow (display, win,  
			    50, 30, 100, 30, 2, black_pixel, white_pixel); 
  XSelectInput (display, subwin, ExposureMask | ButtonPressMask);  
  XMapWindow (display, win);
  XMapWindow (display, subwin);  
 
  for (;;) { 
    XEvent ev; 
    XNextEvent (display, &ev); 
    switch (ev.type) { 
    case Expose : 
      if (ev.xexpose.window == win)
	XDrawString (display, win, gc, 10, 10, "Bienvenue sous win !", 20);    
      if (ev.xexpose.window == subwin)
	XDrawString (display, subwin, gc, 10, 10, "sous subwin", 11);    
      break; 
    case ButtonPress  : 
      if ((ev.xbutton.window == win) & (!aff)) {
	aff = 1;
	XMapWindow (display, subwin);
      } else if (ev.xbutton.window == subwin) {
	aff = 0;
	XUnmapWindow (display, subwin);
      }
      break; 
    default : 
      break;            
    } 
  } 
}

Exécution :

Cliquez dans la sous-fenêtre pour la "dé-map-er", puis dans la fenêtre pour "map-er" la sous-fenêtre.

Fonctionnement de ce programme :

XMapWindow affiche la fenêtre sans modifier son rang dans la pile.
XUnmapWindow retire la fenêtre de l'écran sans modifier son rang dans la pile.
XUnmapSubwindows retire les sous-fenêtres de l'écran sans modifier leur rang dans la pile.
XMapSubwindows affiche toutes les descendantes de la fenêtre en commençant par celle au sommet de la pile. Elles ne peuvent être visibles que si la fenêtre mère le devient.
 
Une fenêtre :
- est crée par XCreateWindow puis
  - affichée par XMapWindow puis
    - decelable, visualisable si toutes ses ancêtres sont affichées puis
      - visible si d'autres fenêtres ne la recouvrent pas totalement
        - totalement visible
        - partiellement visible
      - sinon totalement occultée, recouverte
    - sinon indécelable
  - puis retirée par XUnmapWindow
- enfin détruite par XDestroyWindow.

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