Gravité

/* gravity.c */

/* fenetre avec gravite Sud */

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

GC      gc; 
Display *display; 
int     screen; 
Window  wina, winb, root; 
unsigned long white_pixel, black_pixel;  
XSetWindowAttributes attrib;
unsigned long mask_attrib;
 
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); 
  wina = XCreateSimpleWindow (display, root,  
			     0, 0, 200, 80, 5, black_pixel, white_pixel); 
  XSelectInput (display, wina, ButtonPressMask); 
  XStoreName (display, wina, "gravity_S"); 
  XMapWindow (display, wina); 
  winb = XCreateSimpleWindow (display, root,  
			     0, 0, 200, 80, 5, black_pixel, white_pixel); 
  XSelectInput (display, winb, ButtonPressMask); 
  XStoreName (display, winb, "gravity_NW"); 
  XMapWindow (display, winb); 
  attrib.bit_gravity = SouthGravity;
  mask_attrib = CWBitGravity;
  XChangeWindowAttributes(display, wina, mask_attrib, &attrib); 
  attrib.bit_gravity = NorthWestGravity;
  XChangeWindowAttributes(display, winb, mask_attrib, &attrib); 

  for (;;) { 
    XEvent ev; 
    XNextEvent (display, &ev); 
    switch (ev.type) { 
    case ButtonPress : 
      if (ev.xbutton.window==wina) {
	XClearWindow (display, wina);
	XDrawString (display, wina, gc, 10, 10, "Gravite Sud", 11);
      }
      if (ev.xbutton.window==winb) {
	XClearWindow (display, winb);
	XDrawString (display, winb, gc, 10, 10, "Gravite N-W", 11);
      }
      break;
    default : 
      break;            
    } 
  } 

}

Exécution:

Cliquez dans chacune des 2 fenêtres pour ré-initialiser le texte affiché. Modifiez (agrandir/réduire) la taille des fenêtres par différents côtés. Comparez la différence de gravité.

Fonctionnement de ce programme:

La gravité des fenêtres (xterm, emacs, ...) est généralement Nord-Ouest, c'est à dire en haut à gauche. Le contenu de la fenêtre est invariant relativement à ce coin, quelque soit la modification de géométrie de cette dernière.
bit_gravity détermine de quel coté le contenu des fenêtres ne bouge pas lors d'une modification de taille de cette fenêtre : NorthGravity NorthEastGravity ... CenterGravity ...
CWBitGravity le masque nécessaire au changement d'attribut.

Exercice gravity2.c :

Votre programme devra écrire "ici", dans sa fenêtre, à l'endroit de chaque cliquage, et devra modifier la gravité de sa fenêtre selon la lettre tapée : n(ord), e, s, w.

 

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