/* geometri.c */ /* geometrie d'une fenetre */ #include <stdio.h> #include <X11/Xlib.h> #include <X11/Xutil.h> GC gc; Display *display; int screen; Window win, subwin, root, rac; unsigned long white_pixel, black_pixel; int x, y, larg, haut, bord, prof; 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, 300, 5, black_pixel, white_pixel); XSelectInput (display, win, ExposureMask | ButtonPressMask); XStoreName (display, win, "geometri"); XMapWindow (display, win); subwin = XCreateSimpleWindow (display, win, 50, 30, 100, 30, 2, black_pixel, white_pixel); XSelectInput (display, subwin, ExposureMask | ButtonPressMask); 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) { XMoveWindow (display, subwin, ev.xbutton.x, ev.xbutton.y); XSetWindowBorderWidth(display, subwin, 2 ); } if (ev.xbutton.window == subwin) switch (ev.xbutton.button) { case Button1 : XGetGeometry(display, subwin, &rac, &x, &y, &larg, &haut, &bord, &prof); XResizeWindow(display, subwin, larg + 5, haut + 5); break; case Button2 : XGetGeometry(display, subwin, &rac, &x, &y, &larg, &haut, &bord, &prof); XSetWindowBorderWidth(display, subwin, bord + 2 ); break; case Button3 : XGetGeometry(display, subwin, &rac, &x, &y, &larg, &haut, &bord, &prof); XResizeWindow(display, subwin, larg - 5, haut - 5); break; } break; default : break; } } }
Cliquez dans la sous-fenêtre avec les 3 boutons. Avec une souris à 2 boutons, le 2ème s'obtient par enfoncement des 2 autres. Et cliquez dans la fenêtre mère.
XGetGeometry, requête à sémaphore couteuse en temps, récupère la géométrie actuelle d'une fenêtre. XMoveWindow repositionne la sous-fenêtre dans sa fenêtre parente.
XResizeWindow redimensionne la hauteur et largeur d'une sous-fenêtre.
XSetWindowBorderWidthredimensionne l'épaisseur de bordure d'une sous-fenêtre.
Button1, Button2, Button3 sont les différents boutons d'une souris.
De plus, le Window Manager vous permet de modifier la géométrie de certaines fenêtres. La fenêtre modifiée en est avertie par l'événement ConfigureNotify.
L'utilisateur pourra, grace au WM, modifier votre fenêtre. A chaque modification de hauteur, de largeur, ou de positionnement (x,y) dans le bureau, vous afficherez ces modifications dans la fenêtre. Utilisez pour ce faire l'événement de type ConfigureNotify.
programme suivant | index général | fonctions de la XLib | événements | types dans XLib |