home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / xfedor.zip / XFree86 / src / xfedor / popup.c < prev    next >
C/C++ Source or Header  |  1999-03-02  |  2KB  |  95 lines

  1. /* Copyright 1989 GROUPE BULL -- See licence conditions in file COPYRIGHT */
  2. #include <stdio.h>
  3. #include     "couche.h"    /* CURS */
  4.  
  5. extern int root ;
  6.  
  7. int MenuCreat(char *[]) ;
  8. int MenuPop() ;
  9.  
  10. #define POPBODY 16        /* Hack */
  11. #define BAR 10
  12.  
  13. /*----------------------MENUCREAT----------------------------*/
  14. int MenuCreat (choix)
  15.     char * choix[] ;
  16. /* cree la fenetre et les zones calculees a partir du tableau de chaines */
  17. /* rend l'id de la fenetre */
  18. {
  19.  
  20.     int maxl=0 ;
  21.     int idm,    /* id de la fenetre du menu */
  22.         i,j ;    /* compteur sur le tableau choix */
  23.  
  24.         /* on calcule maxl = largeur max des choix[]  */
  25.  
  26.     for (i=0; choix[i] ; i++) 
  27.         maxl = Max(w_strwidth(choix[i]),maxl) ;
  28.     
  29.     idm = w_ouvrir(root,0, 0, maxl+10, (i)*POPBODY + BAR, "",CURS1,    
  30.             LeaveWindow|EnterZone|ButtonReleased|LeaveZone,WMOFF) ;
  31.  
  32.     for (j=0 ; j<i; j++) 
  33.         w_crzon(idm,0,(j)*POPBODY+BAR,maxl+10,(j+1)*POPBODY+BAR,CURS1);
  34.  
  35.     w_crzon(idm,0,0,maxl+10,BAR,CURS1);
  36.     return idm ;
  37. }
  38.  
  39.  
  40. /*-----------------------------MENU_POP---------------------*/
  41. int MenuPop (idm,choix)
  42.     int idm ;
  43.     char * choix[] ;
  44. /* idm est un id fenetre W */
  45. /* choix est le tableau de chaines a afficher */
  46.          
  47. {    int x,y,i ;
  48.     myEvent evt ;
  49.     static int Largmenu ;  /* calculee par MenuPop une fois */
  50.  
  51.  
  52.     w_pop(idm) ;   /* montre la fenetre et place la souris dedans
  53.               gere les depassements hors ecran */
  54.  
  55.     Largmenu = w_largeur(idm) ; /* utilise par Inverser() */
  56.  
  57.       /* on affiche les choix */
  58.     for (i=0 ; choix[i] ; i++) 
  59.         w_centrer (idm,choix[i],0,(i)*POPBODY+BAR,
  60.                Largmenu,(i+1)*POPBODY-3+BAR);
  61.  
  62.     w_gris(idm,0,0,Largmenu,BAR-1);
  63.  
  64.      do {
  65.     w_getevent (&evt) ;          /* on attend de rentrer dans le menu */
  66.      } while (evt.window != idm) ;  /* sur car on met la souris dedans */
  67.  
  68.      do {
  69.     w_getevent (&evt) ;    /* attente sur le process 
  70.                    evt.pzone est l'origine de la zone
  71.                    ou bien {0,0} */
  72.     if (evt.window != idm) continue ;
  73.     switch(evt.type) {
  74.     case EnterZone :
  75.     case LeaveZone :
  76.         if (evt.yz != 0)
  77.           w_inv(idm,2,evt.yz +2,Largmenu -2, evt.yz + POPBODY -2);
  78.                                /* allume ou eteint */
  79.       break ;
  80.     case ButtonReleased :
  81.       w_cacher(idm);
  82.       if (evt.yz != 0) return ((evt.yz - BAR) / POPBODY) ;
  83.         else return -1 ;
  84.     case LeaveWindow :
  85.       w_cacher(idm);
  86.       return -1 ;
  87.     }
  88.       } while (1) ;
  89. /* rends le choix (0..n) ou -1 */
  90. }
  91.  
  92.  
  93.  
  94.        
  95.