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