C. Recanati
Option C avancé, avec X-Window
Licence 3, 2008-2009

TPn°1 : Création de fenêtres

Compilation sous Linux : gcc –g –o exo exo.c –lX11 
ou: make X=exo (avec un fichier makefile comme indiqué à la fin)

Exercice 1 (programme creation.c)
Créez une fenêtre avec XCreateSimpleWindow et une deuxième, fille de la première, de la même couleur, mais avec un bord d’une autre couleur et une certaine épaisseur. Affichez les deux fenêtres, puis déplacez la fille dans la mère avec XMoveWindow sur chaque entrée de caractère sur l’entrée standard (c’est-à-dire tapé dans la fenêtre d’où l’on aura lancé le programme). Quittez le programme en cas de lecture d’un caractère ‘Q’. 

Exercice2 (programme OverrideRedirect.c)
1) Créez une fenêtre avec XCreateWindow, en position (0,0) avec un bord d’épaisseur d’une certaine épaisseur (eg. 10). Affichez-la sur l’écran. Que constatez-vous ? 
2) Mettre son attribut override_redirect à True et comparez le résultat avec l’exécution précédente. Conclusion ?

Exercice 1 
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#define 	LARGEUR	300	
#define 	HAUTEUR	400	

char*				nom_de_station = NULL; 
unsigned long	blanc, noir;
Display*		dpy;
Window			root;
int					screen;

int main (int argc, char ** argv) ;
{
		Window 			Fenetre,
									sous_fenetre;
		char 					lu;		/* caractere  entre pour quitter*/
				
	/*
	 * Regarder si on a un argument au programme,
	 *  si oui vérifier l’option et modifier  nom_de_station
	 */
		if (argc == 3 && !strcmp (argv [1], "-d"))
				nom_de_station = argv [2];

	/*
	 * Connexion au serveur et initialisation des variables globales
	 */
		dpy = XOpenDisplay (nom_de_station);
	
		if (dpy == NULL) {
				printf ("%s: Impossible d'ouvrir %s\n", argv[0], 
														XDisplayName(nom_de_station));
				return (EXIT_FAILURE);
		}
		screen 		= 	DefaultScreen (dpy);		
		root 			= 	RootWindow (dpy, screen);
		blanc 			= 	WhitePixel (dpy, screen);
		noir 			= 	BlackPixel (dpy, screen);
	/*
	 * Creation de la fenetre principale 
	 */	
		Fenetre 	= XCreateSimpleWindow (dpy, root, 100, 100,
												LARGEUR, HAUTEUR, 5, blanc, noir);
	/*
	 * Creer la sous-fenetre 
	 */
		sous_fenetre	 = …
	/*
	 * Demander l’affichage des fenetres a l’ecran :
	 * (tjs les sous-fenetres d’abord, puis la fenetre)
	 */
		XMapSubwindows (dpy, Fenetre);
		XMapWindow (dpy, Fenetre);

	/*
	* Envoyer ces requetes au serveur
	* et attendre l’affichage 
	*/
		XFlush (dpy);		/* envoie les requetes au serveur */
		lu = getchar();		/* attendre que les fenêtres soient affichées 
											pour entrer ce caractère ...*/
	/*
	 * Deplacer la sous-fenetre
	 */
		while ( (lu = getchar()) != ‘Q’) {
				XMoveWindow(…) ;
		};
		return EXIT_SUCCESS;
}

Exercice 2:
… comme le programme précédent …..
#include <X11/Xutil.h>
…
main (argc, argv) char **argv;
{
		Window 				Fenetre,
										sous_fenetre;
		XSetWindowAttributes  xsw;
	…
	/*
	 * Creer la fenetre avec XCreateWindow et donner une valeur 
	 * pour override_redirect  et les couleurs du bord et du fond
	 */
		xsw.background_pixel 		= 	noir ;
		xsw.border_pixel 				= 	blanc ;
		xsw.override_redirect 			= 	True;
	    xsw.event_mask					=  ButtonPressMask ;
		Fenetre = XCreateWindow (dpy, root, 100, 100, 
											LARGEUR, HAUTEUR, 10,
							CopyFromParent, InputOutput,	CopyFromParent, 
							CWBackPixel | CWBorderPixel | CW etc...,	 &xsw);
	/*
	 * Afficher la fenêtre puis
	 * entrer dans la boucle infinie de traitement des événements
	 */
		XMapWindow (dpy, Fenetre);
		for ( ; ;  ) {
				XEvent	ev ;

				ev = XNextEvent(dpy, &ev) ;
				if (ev.type  == ButtonPress)
						exit (0) ;
		}
	
}

----------------
Makefile générique :
		LIB=/usr/X11R6/lib
		INCLUDE=/usr/X11R6/include
$X :  $X.c
	gcc –g –o  $X   $X.c  –lX11  -L$(LIB) –I$(INCLUDE)