/* bouts.c - 24/01/2006 - Edouard.Thiel@lif.univ-mrs.fr USAGE : - placer bouts dans un script sh pour générer une fenêtre avec un TITRE, des MESSAGE, des BOUTON, des sauts ALALIGNE et un BOUTON "Quit". - La chaîne qui suit le nom d'un bouton est mémorisée par bouts (dans un ClientData) et exécutée quand on le presse. EXEMPLE : bouts << EOF TITRE "Titre de la fenêtre" MESSAGE "Répertoire :" BOUTON "pwd" pwd BOUTON "ls -l" ls -l ALALIGNE MESSAGE "Recherche :" BOUTON "Find index.html" find .. -name "index.html" -print ALALIGNE MESSAGE "Fichier :" SAISIEF "nom du fichier" ALALIGNE MESSAGE "Editeur :" SAISIE "nedit " ALALIGNE BOUTON "Edition" #1 "#0" & BOUTON "Quit" EOF */ #include #define LG 256 #define max_saisie 9 He_node *saisie[max_saisie]; int nb_saisie = 0; void nouvelle_saisie (He_node *hn) { if (nb_saisie >= max_saisie) return; saisie[nb_saisie++] = hn; } char *val_saisie (int n) { if (n < 0 || n >= nb_saisie) return ""; return HeGetTextValue (saisie[n]); } void button_proc (He_node *item) { char *nom = HeGetButtonLabel (item); char *ordre = HeGetClientData (item); if (!strcmp(nom, "Quit")) HeQuit(0); else { int i; char buf[1000]; buf[0] = '\0'; for (i = 0; ordre[i] != '\0'; i++) { if (ordre[i] == '#' && ordre[i+1] >= '0' && ordre[i+1] <= '9') { strcat (buf, val_saisie(ordre[i+1]-'0')); i++; } else sprintf (buf, "%s%c", buf, ordre[i]); } system (buf); } } void enleve_blancs (char *s) { int i; for (i = strlen(s)-1; i >= 0; i--) { if (s[i] == ' ') s[i] = '\0'; else break; } } int main (int argc, char *argv[]) { He_node *princ, *panel, *item; char ligne[LG], s1[LG], s2[LG]; int motd; HeInit (&argc, &argv); princ = HeCreateFrame (); HeSetFrameLabel (princ, "Bouts"); panel = HeCreatePanel (princ); HeSetWidth (panel, HeGetWidth (princ)); HeSetHeight (panel, 200); while ( fgets(ligne , LG , stdin ) != NULL ) { if (sscanf (ligne, "%s \"%[^\"]\"%n", s1, s2, &motd) <= 0) continue; if (!strcmp (s1, "ALALIGNE")) { HeSetPanelLayout (panel, HE_LINE_FEED); } else if (!strcmp (s1, "TITRE")) { HeSetFrameLabel (princ, s2); } else if (!strcmp (s1, "BOUTON")) { item = HeCreateButton (panel); HeSetButtonLabel (item, s2); HeSetClientData (item, strdup(ligne+motd)); HeSetButtonNotifyProc (item, button_proc); } else if (!strcmp (s1, "MESSAGE")) { item = HeCreateMessage (panel); HeSetMessageLabel (item, s2); HeSetMessageBold (item, TRUE); } else if (!strcmp (s1, "SAISIE")) { item = HeCreateText (panel); nouvelle_saisie (item); HeSetTextVisibleLen (item, strlen(s2)+1); enleve_blancs (s2); HeSetTextValue (item, s2); } else if (!strcmp (s1, "SAISIEF")) { item = HeCreateText (panel); nouvelle_saisie (item); HeSetTextVisibleLen (item, strlen(s2)+1); enleve_blancs (s2); HeSetTextValue (item, s2); HeSetTextCompletion (item, TRUE); } else printf ("Erreur dans la ligne\n %s\n", ligne); } HeFit (panel); HeFit (princ); return HeMainLoop (princ); }