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