Aout 1997
En effet, la librairie X11 est difficile, compliquée, peu documentée.Il faut avoir écrit au moins 100 lignes avant de pouvoir ouvrir une fenêtre et y dessiner quelque-chose.
De plus, bien que très puissante par ses primitives graphiques et son aspect réseau, Il est à déplorer l’inexistence de librairie IHM (Interface Homme Machine) gratuite standardisé aussi souple que MOTIF. Les Widgets Xt et Athena n’offrent que bien peu de possibilité par rapport au besoin des utilisateurs.
Le devellopeur se voit contraint de créer lui même ces propres objets graphiques. Pourtant il existe un environnement de développement qui pourrait répondre a ce besoin:
Or pour les gens habitués au C et C++, le langage TCL parait difficile à maîtriser et n’est pas très indiqué pour des gros programmes. Il est pourtant dommage de se priver de la puissance graphique de TK qui est d’après mon experience personnelle l’une des librairies graphiques les plus puissantes parmi celles qui existent sous X. Je la trouve plus souple et plus facile que debugger pour ces raisons:
A l’origine TCL est un langage auquel on peut ajouter des instructions pour faire un langage proprietaire répondant a vos besoins. Mais cette ajout est peut aisé, et entraine le stockage de gros programme ( programme C + librairie TCL+TK ). Il y a pourtant un autre moyen de combiner des programmes C ou C++ avec du TK. En effet, on peut faire communiquer du C avec l’interpreteur TCL-TK(wish) grace à des tubes UNIX.
Pour cela notre programme C doit créer un programme fils et créer deux tubes entre eux deux comme l’indique le schéma ci-dessous ( mécanisme habituel sous UNIX) .
Pour arriver a une telle configuration sous UNIX, il faut que le processus n1 cree un fils ( grace a fork ), identique a lui-meme (sauf son PID).
Puis l’espace accordé au processus n2 (code , pile, tas ) est remplacé par un autre programme (ici wish).
Le numero du processus est conserve, ainsi que les tables systemes rattache au processus ( table des fichiers ...). Pour que ces deux processus communiquent, on utilise la technique des tubes (pipe). Ainsi un simple printf du processus n1 pourra etre lu sur l'entree standards du processus n2. Pour les gens qui ne sont pas habitue a la programmation sous UNIX, je leur conseille d'aller jeter un coup d'oeil sur le jean marie Rifflet et l'excellent LINUX 2.O API systeme.
De toute facon, dans la suite du document une fonction en C mettra en lumiere implementation On peut noter que les tubes peuvent s'appliquer a d'autres descripteurs que l'entree sortie standart, c'est uniquement pour des commodites de programmation que j'ai utilise cette configuration.
Par traditions les 3 premiers ‚l‚ments de cette table sont les descripteurs entr‚e sortie du processus
Or on peut modifier cette table grace aux instructions dup ou dup2, procedant ainsi a une redirection(creation du tube grace a pipe). Sous UNIX chaque processus possede une table de fichier pointant vers les fichier qu'il utilise.
Voici schematiquement la configuration systeme du mecanisme du pipe entre processus n1 et processus n2:
voici un exemple tres simple, montrant bien , je crois, les possibilites du couplage Tcl-Tk et C. Le fichier C fait au alentour de 150 lignes, ce qui pas mal pour un programme tournant sous X11.
Tout d'abord examinons la reproduction d'un processus :)
void SetUpTwoWayPipe ( const char *cmd )
Cette fonction nous amene a la configuration precedente entre notre programme et un programme cmd
SetUpTwoWayPipe("wish"); ici wish comme vous pouvez le constater
voici l'implementation :clicker pour avoir la fonction
Cet élément graphique est trés puissant:
On peut afficher :
Sortie Postscript, scale ...
A chaque fois que l’on ajoute un élément ( voir les possibilité ci-dessus), celui-ci s’ajoute dans une liste interne; on associe ainsi un numéro a un élément visuel;
cette association permet par la suite d’associer une action a un élément ( grace a bind ).
L’inconvénient est que les préformances se voit ainsi diminue , En effet impossible de faire des animations de type sprite.
Wish peut etre considerer comme un serveur des commandes Tcl-Tk, on envoit une comande par le tube, wish les execute, et il peut vous renvoyer une chaine de caracteres, que votre programme C lira via le tube. Voici les commandes envoyes par le programme C a wish:
canvas .c -width 300 -height 300
pack .c
button .b -text quit -command exit
pack .b
....
.c create bitmap X Y -bitmap @nomdelabitmap
.c bind NUMEROBITMAP <1> "puts NUMEROBITMAP
flush stdout "
.....
(Faite tres attention a ce flush qui est fondemantale pour le bon deroulement du mecanisme.) Ce qui nous donne ceci
Wish envoit soit 255 si on appuie sur restart ou le numero du bitmap.
Au debut, on a un tableau rempli de la maniere suivante coder en C :
1 | 2 | |
3 | 4 | 5 |
6 | 7 | 8 |
.c move NUMEROBITMAP XDEPLACEMENT YDEPLACEMENT
Dans la boucle lisant les retours de wish,si on lit 255 alors on "restart", sinon on test le deplacement. Et voila le tour est joue. On peut faire de meme avec les autres langages comme pascal ( peut etre ), caml ( sur ), lisp ,ada ...