      subroutine deroule(ctitre,ltitre,ntitre,ictitre,ifont8
     &                  ,xb,yb,c,l,icol,n,irc,isens,ifont,iopt)
      include 'Parametres.f'
      real*4 xb(2),yb(2)
      character*32 c(*),ctitre(*)
      integer l(*),icol(*),ltitre(*),ictitre(*)
c
      ib3d = 1
      idirlum = 0
      icboul = 1
      call gslss(ifont)
      icolhi = 1
      angle = 0.
      ix0 = origine_x + facteur_en_x*xb(1)
      ilarg = facteur_en_x*abs(xb(2)-xb(1)) + 1
c tables de couleur
      if (iopt.eq.1) then
        idy = -facteur_en_y*abs(yb(2)-yb(1))*.55
      else
        idy = -facteur_en_y*abs(yb(2)-yb(1))*.75
      endif
      ihaut = (n+ntitre)*idy + 1
      if (isens.gt.0) then
        iy0 = origine_y + facteur_en_y*yb(1)
      elseif(isens.lt.0) then
        iy0 = origine_y + facteur_en_y*yb(2) - ihaut
      else
        iy0 = origine_y + facteur_en_y*(yb(2)+yb(1))*.5 - ihaut/2
      endif
      iy0 = max(0,iy0)
      if (iy0+ihaut.gt.display_characteristics(2))
     &     iy0 = display_characteristics(2)-ihaut
      idy2 = idy/2
      ilarg2 = ilarg/2 - 2
      call x11garderect(ix0,iy0,ilarg,ihaut)
      ilarg = ilarg-1
      ihaut = ihaut-1
      call x11loadcolor(8)
      call x11facette2(ix0,iy0,ilarg,ihaut)
      if (iopt.eq.2) then
        call x11etoudessin(1)
        call x11loadcolor(1)
        call x11thick(2)
        iyyy = origine_y + facteur_en_y*(yb(2)+yb(1))*.5
        call x11linsrn(ix0+(6*ilarg)/5,iyyy,ix0+ilarg,iyyy)
        call x11thick(iepais_ligne)
        call x11etoudessin(0)
      endif
      if (ntitre.gt.0) then
        call gslss(ifont8)
        iy00 = iy0 + idy2
        ix00 = ix0 + ilarg/2
        ipos = 5
        do i=1,ntitre
          call x11loadcolor(ictitre(i))
          call x11txtsrnrot3(ctitre(i)(1:ltitre(i))//char(0),ltitre(i)
     &                      ,ix00,iy00,8,angle,ipos,-1)
          iy00 = iy00+idy
        enddo
        call gslss(ifont)        
        call x11loadcolor(icolhi)
        iybid = iy0+ntitre*idy
        call x11linsrn(ix0,iybid,ix0+ilarg,iybid)
      else
        call x11loadcolor(icolhi)
      endif
      call x11linsrn(ix0,iy0,ix0+ilarg,iy0)
      call x11linsrn(ix0+ilarg,iy0,ix0+ilarg,iy0+ihaut)
      call x11linsrn(ix0+ilarg,iy0+ihaut,ix0,iy0+ihaut)
      call x11linsrn(ix0,iy0+ihaut,ix0,iy0)
      iy0 = iy0 + ntitre*idy
      iy00 = iy0 + idy2
c tables de couleur
      if (iopt.eq.1) then
        ix00 = ix0 + ilarg/5
        ipos = 6
        ixt0 = ix0 + ilarg/4
        idx = ilarg/10
        nctab = 6
c ici pour changer le nombre tables dans le menu (nbtabs2*2)
c et aussi dans tabcol...
        nbtabs2 = 18
        iptt0 = 232-nbtabs2*nctab-1
      else
        ix00 = ix0 + ilarg/2
        ipos = 5
      endif
      imark = 0
      idyb = idy-1
      rbb = .4*abs(yb(2)-yb(1))
      xbb = xb(2) - rbb*1.3
      do i=1,n
        call x11loadcolor(icol(i))
        call x11txtsrnrot3(c(i)(1:l(i))//char(0),l(i)
     &                    ,ix00,iy00,8,angle,ipos,-1)
c tables de couleur
        if (iopt.eq.1) then
          itt = (i+1)/2
          iptt = iptt0+itt*nctab
          do k=1,nctab
            call x11loadcolor(iptt+k)
            if (mod(i,2).eq.1) then
              ixxx = ixt0+(k-1)*idx
            else
              ixxx = ixt0+(nctab-k)*idx
            endif
            call x11facette2(ixxx,iy00-idy2+2,idx,idyb-2)
          enddo
        endif
        if (irc.eq.i) then
          ybb = (iy00-origine_y)/facteur_en_y
          call boule3d(xbb,ybb,rbb,icboul,ib3d,idirlum)
        endif
        iy00 = iy00+idy
      enddo
      call viderbuff2()
      iy00 = iy0 + idy2
      ix0b = ix0 + ilarg/2 -ilarg2
      ilargb = 2*ilarg2+1
 10   call getxycx11b(iev,ixposcurs,iyposcurs
     &               ,ixposcurs_root,iyposcurs_root)
      if (iev.eq.0) then
        imarknew = 1+(iyposcurs-iy00)/idy
        imarknew = min(n+1,max(0,imarknew))
        if (imarknew.ne.imark) then
          if (imark.ge.1.and.imark.le.n) then
            iy = iy00 + idy*(imark-1)
            call x11loadcolor(8)
            call x11facette2(ix0b,iy-idy2+1,ilargb,idyb)
            call x11loadcolor(icol(imark))
            call x11txtsrnrot3(c(imark)(1:l(imark))//char(0),l(imark)
     &                        ,ix00,iy,8,angle,ipos,-1)
c table de couleurs
            if (iopt.eq.1) then
              itt = (imark+1)/2
              iptt = iptt0+itt*nctab
              do k=1,nctab
                call x11loadcolor(iptt+k)
                if (mod(imark,2).eq.1) then
                  ixxx = ixt0+(k-1)*idx
                else
                  ixxx = ixt0+(nctab-k)*idx
                endif
                call x11facette2(ixxx,iy-idy2+2,idx,idyb-2)
              enddo
            endif
            if (irc.eq.imark)
     &           call boule3d(xbb,ybb,rbb,icboul,ib3d,idirlum)
          endif
          imark = imarknew
          if (imark.ge.1.and.imark.le.n) then
            iy = iy00 + idy*(imark-1)
            call x11loadcolor(icolhi)
            call x11facette2(ix0b,iy-idy2+1,ilargb,idyb)
            call x11loadcolor(5)
            call x11txtsrnrot3(c(imark)(1:l(imark))//char(0),l(imark)
     &                        ,ix00,iy,icolhi,angle,ipos,-1)
c tables de couleur
            if (iopt.eq.1) then
              itt = (imark+1)/2
              iptt = iptt0+itt*nctab
              do k=1,nctab
                call x11loadcolor(iptt+k)
                if (mod(imark,2).eq.1) then
                  ixxx = ixt0+(k-1)*idx
                else
                  ixxx = ixt0+(nctab-k)*idx
                endif
                call x11facette2(ixxx,iy-idy2+2,idx,idyb-2)
              enddo
            endif
            if (irc.eq.imark)
     &           call boule3d(xbb,ybb,rbb,icboul,ib3d,idirlum)
          endif
          call viderbuff2()
        endif
        goto 10
      elseif(iev.lt.251.or.iev.gt.253) then
        goto 10
      endif
c
      ilarg = ilarg+1
      ihaut = ihaut+1
      if (imark.ge.1.and.imark.le.n) then
        iy = iy00 + idy*(imark-1)
        ttt = .04
        do i=1,4
          call x11loadcolor(8)
          call x11facette2(ix0b,iy-idy2+1,ilargb,idyb)
          if (irc.eq.imark)
     &         call boule3d(xbb,ybb,rbb,icboul,ib3d,idirlum)
          call x11loadcolor(icol(imark))
          call x11txtsrnrot3(c(imark)(1:l(imark))//char(0),l(imark)
     &                      ,ix00,iy,8,angle,ipos,-1)
c tables de couleur
          if (iopt.eq.1) then
            itt = (imark+1)/2
            iptt = iptt0+itt*nctab
            do k=1,nctab
              call x11loadcolor(iptt+k)
              if (mod(imark,2).eq.1) then
                ixxx = ixt0+(k-1)*idx
              else
                ixxx = ixt0+(nctab-k)*idx
              endif
              call x11facette2(ixxx,iy-idy2+2,idx,idyb-2)
            enddo
          endif
          call viderbuff2()
          call perddutemps(ttt)
          call x11loadcolor(icolhi)
          call x11facette2(ix0b,iy-idy2,ilargb,idy)
          if (irc.eq.imark)
     &         call boule3d(xbb,ybb,rbb,icboul,ib3d,idirlum)
          call x11loadcolor(5)
          call x11txtsrnrot3(c(imark)(1:l(imark))//char(0),l(imark)
     &                      ,ix00,iy,icolhi,angle,ipos,-1)
c tables de couleur
          if (iopt.eq.1) then
            itt = (imark+1)/2
            iptt = iptt0+itt*nctab
            do k=1,nctab
              call x11loadcolor(iptt+k)
              if (mod(imark,2).eq.1) then
                ixxx = ixt0+(k-1)*idx
              else
                ixxx = ixt0+(nctab-k)*idx
              endif
              call x11facette2(ixxx,iy-idy2+2,idx,idyb-2)
            enddo
          endif
          call viderbuff2()
          call perddutemps(ttt)
        enddo
        ttt = ttt*4.
        call perddutemps(ttt)
      endif
      if (iopt.eq.2) then
        call x11etoudessin(1)
        call x11loadcolor(1)
        call x11thick(2)
        iyyy = origine_y + facteur_en_y*(yb(2)+yb(1))*.5
        call x11linsrn(IX0+(6*ilarg)/5,iyyy,ix0+ilarg,iyyy)
        call x11thick(iepais_ligne)
        call x11etoudessin(0)
      endif
      iy0 = iy0 - ntitre*idy
      call x11metrect(ix0,iy0,ilarg,ihaut)
      call x11loadcolor(icoul_courante)
      call viderbuff2()
      irc = imark
      end
c-----------------------------------------------------------------------
Cfj      subroutine derouletest(x0,y0,xlarg,yhaut)
Cfj      INCLUDE 'Parametres.f'
Cfj      IX0 = origine_x + facteur_en_x*X0
Cfj      IY0 = origine_y + facteur_en_y*Y0
Cfj      ilarg = facteur_en_x*Xlarg
Cfj      ihaut = -facteur_en_y*yhaut
Cfj      print*,ix0,iy0,ilarg,ihaut,xlarg,yhaut
Cfj      call x11garderect(ix0,iy0,ilarg,ihaut)
Cfj      call x11loadcolor(2)
Cfj      call x11facette2(IX0,iy0,ilarg,ihaut)
Cfj      call x11loadcolor(icoul_courante)
Cfj 10   call getxycx11b(iev,ixposcurs,iyposcurs
Cfj     &         ,ixposcurs_root,iyposcurs_root)
Cfj      if (iev.lt.251.or.iev.gt.253) goto 10
Cfj      call x11metrect(ix0,iy0,ilarg,ihaut)
Cfj      end
c-----------------------------------------------------------------------
      subroutine choixacocher(ctitre,ltitre,ntitre,ictitre,ifont8
     &                       ,xb,yb,c,l,icol,n,iok,isens,ifont,iexcl)
      include 'Parametres.f'
      real*4 xb(2),yb(2)
      character*32 c(*),ctitre(*)
      integer l(*),icol(*),ltitre(*),ictitre(*),iok(*),iexcl(*)
c
c iexcl(i) = 0 : choix de i independant des autres questions
c iexcl(i) = 1000*i1 + i2 : choix unique dans l'intervalle i1,i2
c                           (un seul iok non nul)
c
      ib3d = 1
      idirlum = 0
      icboul = 1
      call gslss(ifont)
      icolhi = 3
      angle = 0.
      ix0 = nint(origine_x + facteur_en_x*xb(1))
      ilarg = nint(facteur_en_x*abs(xb(2)-xb(1))) + 1
      idy = nint(-facteur_en_y*abs(yb(2)-yb(1))*0.75)
      ihaut = (n+1+ntitre)*idy + 1
      if (isens.gt.0) then
        iy0 = nint(origine_y + facteur_en_y*yb(1))
      elseif(isens.lt.0) then
        iy0 = nint(origine_y + facteur_en_y*yb(2)) - ihaut
      else
        iy0 = nint(origine_y + facteur_en_y*(yb(2)+yb(1))*.5) - ihaut/2
      endif
      iy0 = max(0,iy0)
      if (iy0+ihaut.gt.display_characteristics(2))
     &     iy0 = display_characteristics(2)-ihaut
      idy2 = idy/2
      ilarg2 = ilarg/2 - 2
      call x11garderect(ix0,iy0,ilarg,ihaut)
      ilarg = ilarg-1
      ihaut = ihaut-1
      call x11loadcolor(8)
      call x11facette2(ix0,iy0,ilarg,ihaut)
      if (ntitre.gt.0) then
        call gslss(ifont8)
        iy00 = iy0 + idy2
        ix00 = ix0 + ilarg/2
        ipos = 5
        do i=1,ntitre
          call x11loadcolor(ictitre(i))
          call x11txtsrnrot3(ctitre(i)(1:ltitre(i))//char(0),ltitre(i)
     &                      ,ix00,iy00,8,angle,ipos,-1)
          iy00 = iy00+idy
        enddo
        call gslss(ifont)        
        call x11loadcolor(icolhi)
        iybid = iy0+ntitre*idy
        call x11linsrn(ix0,iybid,ix0+ilarg,iybid)
      else
        call x11loadcolor(icolhi)
      endif
      call x11linsrn(ix0,iy0,ix0+ilarg,iy0)
      call x11linsrn(ix0+ilarg,iy0,ix0+ilarg,iy0+ihaut)
      call x11linsrn(ix0+ilarg,iy0+ihaut,ix0,iy0+ihaut)
      call x11linsrn(ix0,iy0+ihaut,ix0,iy0)
      iy0 = iy0 + ntitre*idy
      ix00 = ix0 + ilarg/2
      ipos = 5
      imark = 0
      rbb = .4*abs(yb(2)-yb(1))
      xbb = xb(2) - rbb*1.3
      iy00 = iy0 + idy/2
      do i=1,n
        call x11loadcolor(icol(i))
        call x11txtsrnrot3(c(i)(1:l(i))//char(0),l(i)
     &                    ,ix00,iy00,8,angle,ipos,-1)
        iy00 = iy00+idy
      enddo
      call afficheletat(iok,n,xbb,ybb,rbb,iy0,idy,icboul,ib3d,idirlum)
      call x11loadcolor(icolhi)
      ipos = 5
      ix00 = ix0 + ilarg/2
      iybid = iy0 + n*idy
      call x11linsrn(ix0,iybid,ix0+ilarg,iybid)
      call x11txtsrnrot3('OK'//char(0),2,ix00,iy00,8,angle,ipos,-1)
      call viderbuff2()
c
      iy00 = iy0 + idy2
 10   call getxycx11e(iev,ixposcurs,iyposcurs
     &               ,ixposcurs_root,iyposcurs_root)
      if (iev.ge.251.and.iev.le.253) then
        imark = 1+(iyposcurs-iy00+idy/2)/idy
        imark = min(n+2,max(0,imark))
        if (imark.ge.1.and.imark.le.n) then
          if (iexcl(imark).eq.0) then
            iy = iy00 + idy*(imark-1)
            ybb = (real(iy)-origine_y)/facteur_en_y
            if (iok(imark).eq.0) then
              iok(imark) = 1
              call boule3d(xbb,ybb,rbb,icboul,ib3d,idirlum)
            else
              iok(imark) = 0
              call effaceboule(xbb,ybb,rbb,8,0)
            endif
          else
            i1 = iexcl(imark)/1000
            i2 = mod(iexcl(imark),1000)
            if (iok(imark).eq.0) then
              do i=i1,i2
                iy = iy00 + idy*(i-1)
                ybb = (real(iy)-origine_y)/facteur_en_y
                iok(i) = 0
                call effaceboule(xbb,ybb,rbb,8,0)
              enddo
              iy = iy00 + idy*(imark-1)
              ybb = (real(iy)-origine_y)/facteur_en_y
              iok(imark) = 1
              call boule3d(xbb,ybb,rbb,icboul,ib3d,idirlum)
            elseif(i2.lt.imark.or.i1.gt.imark) then
              iy = iy00 + idy*(imark-1)
              ybb = (real(iy)-origine_y)/facteur_en_y
              iok(imark) = 0
              call effaceboule(xbb,ybb,rbb,8,0)
            endif
          endif
          call viderbuff2()
          goto 10
        endif
      else
        goto 10
      endif
c
      ilarg = ilarg+1
      ihaut = ihaut+1
      iy0 = iy0 - ntitre*idy
      call x11metrect(ix0,iy0,ilarg,ihaut)
      call x11loadcolor(icoul_courante)
      call viderbuff2()
      end
c-----------------------------------------------------------------------
      subroutine afficheletat(iok,n,xbb,ybb,rbb,iy0,idy,icboul,ib3d
     &                       ,idirlum)
      include 'Parametres.f'
      integer iok(*)
c
      iy00 = iy0 + idy/2
      do i=1,n
        ybb = (real(iy00)-origine_y)/facteur_en_y
        if (iok(i).eq.1) then
          call boule3d(xbb,ybb,rbb,icboul,ib3d,idirlum)
        else
          call effaceboule(xbb,ybb,rbb,8,0)
        endif
        iy00 = iy00+idy
      enddo
      end
c-----------------------------------------------------------------------
      subroutine affichelaboule(iok,ix,iy,ir,icboul)
c
      if (iok.eq.0) then
        call ieffaceboule(ix,iy,ir,8,0)
      else
        call iboule3d(ix,iy,ir,icboul)
      endif
      end
