home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 3 / CD_Magazyn_EXEC_nr_3.iso / Internet / Strony_WWW / Opus4.x / DOpus414JRsrc.lha / DirectoryOpus4 / Program / main8.c < prev    next >
C/C++ Source or Header  |  2000-01-30  |  26KB  |  749 lines

  1. /*
  2.  
  3. Directory Opus 4
  4. Original GPL release version 4.12
  5. Copyright 1993-2000 Jonathan Potter
  6.  
  7. This program is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU General Public License
  9. as published by the Free Software Foundation; either version 2
  10. of the License, or (at your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20.  
  21. All users of Directory Opus 4 (including versions distributed
  22. under the GPL) are entitled to upgrade to the latest version of
  23. Directory Opus version 5 at a reduced price. Please see
  24. http://www.gpsoft.com.au for more information.
  25.  
  26. The release of Directory Opus 4 under the GPL in NO WAY affects
  27. the existing commercial status of Directory Opus 5.
  28.  
  29. */
  30.  
  31. #include "dopus.h"
  32.  
  33. checkexec(name)
  34. char *name;
  35. {
  36.     int file,check;
  37.  
  38.     if (!(file=Open(name,MODE_OLDFILE))) return(0);
  39.     Read(file,(char *)&check,4);
  40.     Close(file);
  41.     return((check==0x3f3));
  42. }
  43.  
  44. void newcli()
  45. {
  46.     char buf[200];
  47.  
  48.     lsprintf(buf,"%s \"%s\"",config->outputcmd,config->output);
  49.     if (!(Execute(buf,0,nil_file_handle))) doerror(IoErr());
  50.     else {
  51.         WBenchToFront();
  52.         okay();
  53.     }
  54. }
  55.  
  56. void getprot(protect,buffer)
  57. int protect;
  58. char *buffer;
  59. {
  60.     int a;
  61.     char *key=globstring[STR_PROTBIT_HSPA];
  62.  
  63.     strcpy(buffer,globstring[STR_PROTBIT_RWED]);
  64.     for (a=7;a>=0;a--)
  65.         if (protect&(1<<a)) buffer[7-a]=key[7-a];
  66. }
  67.  
  68. getprotval(buf)
  69. char *buf;
  70. {
  71.     int a,b,c,prot=15;
  72.  
  73.     a=strlen(buf);
  74.     for (b=0;b<a;b++) {
  75.         buf[b]=LToLower(buf[b]);
  76.         for (c=0;c<8;c++) {
  77.             if (buf[b]==globstring[STR_PROTBIT_ALLBITS][7-c]) {
  78.                 if (c<4) prot&=~(1<<c);
  79.                 else prot|=(1<<c);
  80.                 break;
  81.             }
  82.         }
  83.     }
  84.     return(prot);
  85. }
  86.  
  87. checkexistreplace(sourcename,destname,date,allabort,all)
  88. char *sourcename,*destname;
  89. struct DateStamp *date;
  90. int allabort,all;
  91. {
  92.     char buf[400],datebuf1[40],datebuf2[40];
  93.     int a,suc_dfib;
  94.     struct DateStamp ds;
  95.     struct FileInfoBlock __aligned d_fib;
  96.     struct FileInfoBlock __aligned s_fib;
  97.  
  98.     if (!(lockandexamine(sourcename,&s_fib))) return(1);
  99.     suc_dfib=lockandexamine(destname,&d_fib);
  100.  
  101.     if (suc_dfib && d_fib.fib_DirEntryType>0) {
  102.         if (s_fib.fib_DirEntryType<0) {
  103.             doerror(ERROR_OBJECT_EXISTS);
  104.             return(0);
  105.         }
  106.         return(1);
  107.     }
  108.  
  109.     if (config->existflags&REPLACE_ALWAYS) return(1);
  110.     if (config->existflags&REPLACE_NEVER) {
  111.         doerror(ERROR_OBJECT_EXISTS);
  112.         return(0);
  113.     }
  114.     if (config->existflags&REPLACE_OLDER) {
  115.         if (!date) {
  116.             DateStamp(&ds);
  117.             date=&ds;
  118.         }
  119.         if (suc_dfib) {
  120.             if (CompareDate(date,&(d_fib.fib_Date))>0) return(1);
  121.             doerror(ERROR_OBJECT_EXISTS);
  122.         }
  123.         return(0);
  124.     }
  125.     if (config->existflags&REPLACE_ASK) {
  126.         doerror(ERROR_OBJECT_EXISTS);
  127.         if (sourcename==destname || !suc_dfib) {
  128.             lsprintf(buf,globstring[STR_FILE_EXISTS_REPLACE],BaseName(destname));
  129.         }
  130.         else {
  131.             seedate(&s_fib.fib_Date,datebuf1,0);
  132.             seedate(&d_fib.fib_Date,datebuf2,0);
  133.             lsprintf(buf,globstring[STR_OLD_NEW_FILE_REPLACE],BaseName(destname),
  134.                 s_fib.fib_Size,datebuf1,d_fib.fib_Size,datebuf2);
  135.         }
  136.         a=simplerequest(buf,globstring[STR_REPLACE],globstring[STR_SKIP],
  137.             globstring[(allabort?(all?STR_ALL:STR_ABORT):STR_TRY_AGAIN)],
  138.             (all?globstring[STR_ABORT]:NULL),NULL);
  139.         return(a);
  140.     }
  141. }
  142.  
  143. lockandexamine(name,fib)
  144. char *name;
  145. struct FileInfoBlock *fib;
  146. {
  147.     BPTR lock;
  148.  
  149.     fib->fib_OwnerUID=fib->fib_OwnerGID=0;
  150.     if (!(lock=Lock(name,ACCESS_READ))) return(0);
  151.     Examine(lock,fib);
  152.     UnLock(lock);
  153.     return(1);
  154. }
  155.  
  156. void layoutcenter(off)
  157. int off;
  158. {
  159.     int a,max;
  160.     int tiny_extra;
  161.  
  162.     removewindowgadgets(Window);
  163.  
  164.     scrdata_diskname_width[0]=scrdata_diskname_width[1]=(scrdata_width/2)-4;
  165.     scrdata_dispwin_width[0]=scrdata_dispwin_width[1]=(scrdata_width-24-config->sliderwidth*2)/2;
  166.     scrdata_dirwin_center=((scrdata_width/2)-2)+scrdata_xoffset;
  167.  
  168.     max=(scrdata_dirwin_center-((config->sliderwidth*2)+(scrdata_font_xsize*10)))/scrdata_font_xsize;
  169.     if (off>max) off=max;
  170.     else if (off<-max) off=-max;
  171.  
  172.     scrdata_diskname_width[0]+=scrdata_font_xsize*off;
  173.     scrdata_diskname_width[1]-=scrdata_font_xsize*off;
  174.     scrdata_dispwin_width[0]+=scrdata_font_xsize*off;
  175.     scrdata_dispwin_width[1]-=scrdata_font_xsize*off;
  176.  
  177.     scrdata_dispwin_center=scrdata_xoffset+scrdata_diskname_width[0]+4;
  178.  
  179.     for (a=0;a<2;a++) {
  180.         vert_propgad[a].Width=config->sliderwidth;
  181.         vert_propgad[a].Height=scrdata_prop_height;
  182.     }
  183.  
  184.     if (config->slider_pos&1) {
  185.         vert_propgad[0].LeftEdge=scrdata_dispwin_center-config->sliderwidth-4;
  186.         scrdata_dispwin_left[0]=scrdata_xoffset;
  187.     }
  188.     else {
  189.         vert_propgad[0].LeftEdge=scrdata_xoffset+4;
  190.         scrdata_dispwin_left[0]=vert_propgad[0].LeftEdge+vert_propgad[0].Width+4;
  191.     }
  192.  
  193.     if (config->slider_pos&2) {
  194.         scrdata_dispwin_left[1]=scrdata_dispwin_center;
  195.         vert_propgad[1].LeftEdge=scrdata_dispwin_left[1]+scrdata_dispwin_width[1]+8;
  196.         tiny_extra=config->sliderwidth+8;
  197.     }
  198.     else {
  199.         vert_propgad[1].LeftEdge=scrdata_dispwin_center+4;
  200.         scrdata_dispwin_left[1]=vert_propgad[1].LeftEdge+vert_propgad[0].Width+4;
  201.         tiny_extra=0;
  202.     }
  203.  
  204.     scrdata_dispwin_xpos[0]=scrdata_dispwin_left[0];
  205.     scrdata_dispwin_xpos[1]=scrdata_dispwin_left[1];
  206.  
  207.     scrdata_diskname_xpos[0]=scrdata_xoffset;
  208.     scrdata_diskname_xpos[1]=scrdata_xoffset+scrdata_diskname_width[0]+4;
  209.  
  210.     for (a=0;a<2;a++) {
  211.         scrdata_dispwin_nchars[a]=scrdata_dispwin_width[a]/scrdata_font_xsize;
  212.         if ((scrdata_dispwin_nchars[a]*scrdata_font_xsize)>scrdata_dispwin_width[a]-2)
  213.             --scrdata_dispwin_nchars[a];
  214.         scrdata_dirwin_width[a]=scrdata_dispwin_nchars[a]*scrdata_font_xsize;
  215.         scrdata_dirwin_xpos[a]=scrdata_dispwin_xpos[a]+2+((scrdata_dispwin_width[a]-scrdata_dirwin_width[a])/2);
  216.     }
  217.  
  218.     for (a=0;a<2;a++) {
  219.         screen_gadgets[SCRGAD_MOVEUP1+a].TopEdge=scrdata_dispwin_ypos-1;
  220.         screen_gadgets[SCRGAD_MOVEDOWN1+a].TopEdge=
  221.             scrdata_dispwin_ypos+
  222.             scrdata_prop_height+
  223.             config->arrowsize[0]+4;
  224.  
  225.         switch (config->arrowpos[0]) {
  226.             case ARROWS_INSIDE:
  227.                 screen_gadgets[SCRGAD_MOVEUP1+a].TopEdge=
  228.                     scrdata_dispwin_ypos+
  229.                     scrdata_prop_height+3;
  230.                 vert_propgad[a].TopEdge=scrdata_dispwin_ypos+1;
  231.                 break;
  232.             case ARROWS_OUTSIDE:
  233.                 screen_gadgets[SCRGAD_MOVEDOWN1+a].TopEdge=scrdata_dispwin_ypos+config->arrowsize[0];
  234.                 vert_propgad[a].TopEdge=scrdata_dispwin_ypos+((config->arrowsize[0]*2)+3);
  235.                 break;
  236.             case ARROWS_EACHSIDE:
  237.                 vert_propgad[a].TopEdge=scrdata_dispwin_ypos+config->arrowsize[0]+2;
  238.                 break;
  239.         }
  240.     }
  241.  
  242.     for (a=0;a<2;a++) {
  243.         path_strgadget[a].TopEdge=scrdata_dirwin_bottom+30+config->sliderheight;
  244.         path_strgadget[a].Width=scrdata_dispwin_width[a]-((config->arrowsize[2]*2)+20);
  245.         path_strgadget[a].Height=scrdata_string_height;
  246.  
  247.         horiz_propgad[a].TopEdge=scrdata_dirwin_bottom+26;
  248.         horiz_propgad[a].Width=scrdata_dispwin_width[a]-((config->arrowsize[1]*2)+20);
  249.         horiz_propgad[a].Height=config->sliderheight;
  250.  
  251.         screen_gadgets[SCRGAD_TINYBUFFERLIST+a].TopEdge=scrdata_dirwin_bottom+24;
  252.         screen_gadgets[SCRGAD_TINYBUFFERLIST+a].Height=config->sliderheight+4;
  253.         screen_gadgets[SCRGAD_TINYSELECT+a].TopEdge=scrdata_dirwin_bottom+28+config->sliderheight;
  254.         screen_gadgets[SCRGAD_TINYSELECT+a].Height=scrdata_string_height+4;
  255.         screen_gadgets[SCRGAD_MOVEUP1+a].LeftEdge=
  256.             screen_gadgets[SCRGAD_MOVEDOWN1+a].LeftEdge=vert_propgad[a].LeftEdge-4;
  257.         screen_gadgets[SCRGAD_LEFTPARENT+a].Height=scrdata_dispwin_height;
  258.         screen_gadgets[SCRGAD_LEFTPARENT+a].TopEdge=scrdata_dispwin_ypos;
  259.     }
  260.  
  261.     switch (config->arrowpos[1]) {
  262.         case ARROWS_INSIDE:
  263.             horiz_propgad[0].LeftEdge=scrdata_xoffset+4;
  264.             screen_gadgets[SCRGAD_MOVELEFT1].LeftEdge=
  265.                 horiz_propgad[0].LeftEdge+horiz_propgad[0].Width+4;
  266.             screen_gadgets[SCRGAD_MOVERIGHT1].LeftEdge=
  267.                 horiz_propgad[0].LeftEdge+horiz_propgad[0].Width+config->arrowsize[1]+12;
  268.  
  269.             screen_gadgets[SCRGAD_MOVELEFT2].LeftEdge=
  270.                 scrdata_dispwin_xpos[1]+tiny_extra;
  271.             screen_gadgets[SCRGAD_MOVERIGHT2].LeftEdge=
  272.                 screen_gadgets[SCRGAD_MOVELEFT2].LeftEdge+config->arrowsize[1]+8;
  273.             horiz_propgad[1].LeftEdge=
  274.                 screen_gadgets[SCRGAD_MOVERIGHT2].LeftEdge+config->arrowsize[1]+12;
  275.             break;
  276.  
  277.         case ARROWS_OUTSIDE:
  278.             screen_gadgets[SCRGAD_MOVELEFT1].LeftEdge=scrdata_xoffset;
  279.             screen_gadgets[SCRGAD_MOVERIGHT1].LeftEdge=scrdata_xoffset+config->arrowsize[1]+8;
  280.             horiz_propgad[0].LeftEdge=scrdata_xoffset+(config->arrowsize[1]*2)+20;
  281.  
  282.             horiz_propgad[1].LeftEdge=
  283.                 scrdata_dispwin_xpos[1]+4+tiny_extra;
  284.             screen_gadgets[SCRGAD_MOVELEFT2].LeftEdge=
  285.                 horiz_propgad[1].LeftEdge+horiz_propgad[1].Width+4;
  286.             screen_gadgets[SCRGAD_MOVERIGHT2].LeftEdge=
  287.                 screen_gadgets[SCRGAD_MOVELEFT2].LeftEdge+
  288.                 config->arrowsize[1]+8;
  289.             break;
  290.  
  291.         case ARROWS_EACHSIDE:
  292.             screen_gadgets[SCRGAD_MOVELEFT1].LeftEdge=scrdata_xoffset;
  293.             horiz_propgad[0].LeftEdge=scrdata_xoffset+config->arrowsize[1]+12;
  294.             screen_gadgets[SCRGAD_MOVERIGHT1].LeftEdge=
  295.                 scrdata_xoffset+
  296.                 horiz_propgad[0].Width+config->arrowsize[1]+16;
  297.  
  298.             screen_gadgets[SCRGAD_MOVELEFT2].LeftEdge=
  299.                 scrdata_dispwin_xpos[1]+tiny_extra;
  300.             horiz_propgad[1].LeftEdge=
  301.                 screen_gadgets[SCRGAD_MOVELEFT2].LeftEdge+config->arrowsize[1]+12;
  302.             screen_gadgets[SCRGAD_MOVERIGHT2].LeftEdge=
  303.                 horiz_propgad[1].LeftEdge+horiz_propgad[1].Width+4;
  304.             break;
  305.     }
  306.  
  307.     switch (config->arrowpos[2]) {
  308.         case ARROWS_INSIDE:
  309.             path_strgadget[0].LeftEdge=scrdata_xoffset+4;
  310.             screen_gadgets[SCRGAD_BUFFERLEFT1].LeftEdge=
  311.                 path_strgadget[0].LeftEdge+path_strgadget[0].Width+4;
  312.             screen_gadgets[SCRGAD_BUFFERRIGHT1].LeftEdge=
  313.                 path_strgadget[0].LeftEdge+path_strgadget[0].Width+config->arrowsize[2]+12;
  314.  
  315.             screen_gadgets[SCRGAD_BUFFERLEFT2].LeftEdge=
  316.                 scrdata_dispwin_xpos[1]+tiny_extra;
  317.             screen_gadgets[SCRGAD_BUFFERRIGHT2].LeftEdge=
  318.                 screen_gadgets[SCRGAD_BUFFERLEFT2].LeftEdge+config->arrowsize[2]+8;
  319.             path_strgadget[1].LeftEdge=
  320.                 screen_gadgets[SCRGAD_BUFFERRIGHT2].LeftEdge+config->arrowsize[2]+12;
  321.             break;
  322.  
  323.         case ARROWS_OUTSIDE:
  324.             screen_gadgets[SCRGAD_BUFFERLEFT1].LeftEdge=scrdata_xoffset;
  325.             screen_gadgets[SCRGAD_BUFFERRIGHT1].LeftEdge=scrdata_xoffset+config->arrowsize[2]+8;
  326.             path_strgadget[0].LeftEdge=scrdata_xoffset+(config->arrowsize[2]*2)+20;
  327.  
  328.             path_strgadget[1].LeftEdge=scrdata_dispwin_xpos[1]+4+tiny_extra;
  329.             screen_gadgets[SCRGAD_BUFFERLEFT2].LeftEdge=
  330.                 path_strgadget[1].LeftEdge+path_strgadget[1].Width+4;
  331.             screen_gadgets[SCRGAD_BUFFERRIGHT2].LeftEdge=
  332.                 screen_gadgets[SCRGAD_BUFFERLEFT2].LeftEdge+
  333.                 config->arrowsize[2]+8;
  334.             break;
  335.  
  336.         case ARROWS_EACHSIDE:
  337.             screen_gadgets[SCRGAD_BUFFERLEFT1].LeftEdge=scrdata_xoffset;
  338.             path_strgadget[0].LeftEdge=scrdata_xoffset+config->arrowsize[2]+12;
  339.             screen_gadgets[SCRGAD_BUFFERRIGHT1].LeftEdge=
  340.                 scrdata_xoffset+path_strgadget[0].Width+config->arrowsize[2]+16;
  341.  
  342.             screen_gadgets[SCRGAD_BUFFERLEFT2].LeftEdge=
  343.                 scrdata_dispwin_xpos[1]+tiny_extra;
  344.             path_strgadget[1].LeftEdge=
  345.                 screen_gadgets[SCRGAD_BUFFERLEFT2].LeftEdge+config->arrowsize[2]+12;
  346.             screen_gadgets[SCRGAD_BUFFERRIGHT2].LeftEdge=
  347.                 path_strgadget[1].LeftEdge+path_strgadget[1].Width+4;
  348.             break;
  349.     }
  350.  
  351.     for (a=0;a<4;a++) {
  352.         screen_gadgets[SCRGAD_BUFFERLEFT1+a].TopEdge=scrdata_dirwin_bottom+28+config->sliderheight;
  353.         screen_gadgets[SCRGAD_BUFFERLEFT1+a].Height=scrdata_string_height+4;
  354.         screen_gadgets[SCRGAD_MOVELEFT1+a].TopEdge=scrdata_dirwin_bottom+24;
  355.         screen_gadgets[SCRGAD_MOVELEFT1+a].Height=config->sliderheight+4;
  356.         screen_gadgets[SCRGAD_MOVEUP1+a].Width=
  357.             screen_gadgets[SCRGAD_TINYBUFFERLIST+a].Width=config->sliderwidth+8;
  358.     }
  359.  
  360.     screen_gadgets[SCRGAD_MOVEUP1].Height=config->arrowsize[0]+1;
  361.     screen_gadgets[SCRGAD_MOVEDOWN1].Height=config->arrowsize[0]+1;
  362.     screen_gadgets[SCRGAD_MOVEUP2].Height=config->arrowsize[0]+1;
  363.     screen_gadgets[SCRGAD_MOVEDOWN2].Height=config->arrowsize[0]+1;
  364.  
  365.     screen_gadgets[SCRGAD_MOVELEFT1].Width=config->arrowsize[1]+8;
  366.     screen_gadgets[SCRGAD_MOVERIGHT1].Width=config->arrowsize[1]+8;
  367.     screen_gadgets[SCRGAD_MOVELEFT2].Width=config->arrowsize[1]+8;
  368.     screen_gadgets[SCRGAD_MOVERIGHT2].Width=config->arrowsize[1]+8;
  369.  
  370.     screen_gadgets[SCRGAD_BUFFERLEFT1].Width=config->arrowsize[2]+8;
  371.     screen_gadgets[SCRGAD_BUFFERRIGHT1].Width=config->arrowsize[2]+8;
  372.     screen_gadgets[SCRGAD_BUFFERLEFT2].Width=config->arrowsize[2]+8;
  373.     screen_gadgets[SCRGAD_BUFFERRIGHT2].Width=config->arrowsize[2]+8;
  374.  
  375.     screen_gadgets[SCRGAD_TINYBUFFERLIST].LeftEdge=
  376.         screen_gadgets[SCRGAD_TINYSELECT].LeftEdge=
  377.         scrdata_dispwin_center-config->sliderwidth-8;
  378.     screen_gadgets[SCRGAD_TINYRESELECT].LeftEdge=
  379.         screen_gadgets[SCRGAD_TINYAREXX].LeftEdge=
  380.         scrdata_dispwin_center;
  381.  
  382.     screen_gadgets[SCRGAD_LEFTPARENT].LeftEdge=0;
  383.     screen_gadgets[SCRGAD_RIGHTPARENT].LeftEdge=scrdata_xoffset+(scrdata_width-2);
  384.  
  385.     for (a=SCRGAD_TINYBUFFERLIST;a<=SCRGAD_BUFFERRIGHT2;a++) {
  386.         screen_gadgets[a].GadgetRender=NULL;
  387.         screen_gadgets[a].SelectRender=NULL;
  388.     }
  389. }
  390.  
  391. void fix_rmb_gadgets()
  392. {
  393.     int a;
  394.  
  395.     mainrmbgads[0].x=scrdata_gadget_offset;
  396.     mainrmbgads[0].y=scrdata_gadget_ypos-1;
  397.     mainrmbgads[0].w=scrdata_drive_width;
  398.     mainrmbgads[0].h=scr_gadget_rows*scrdata_gadget_height;
  399.  
  400.     if (drive_bank_unsel_border) {
  401.         mainrmbgads[0].flags|=RGF_ALTBORD;
  402.         mainrmbgads[0].high_bord[0]=drive_bank_unsel_border;
  403.         mainrmbgads[0].high_bord[1]=drive_bank_sel_border;
  404.     }
  405.     else mainrmbgads[0].flags&=~RGF_ALTBORD;
  406.  
  407.     for (a=0;a<4;a++)
  408.         makermbgad(&mainrmbgads[a+1],&screen_gadgets[SCRGAD_TINYBUFFERLIST+a],1);
  409.     for (a=0;a<2;a++)
  410.         makermbgad(&mainrmbgads[a+5],&screen_gadgets[SCRGAD_LEFTPARENT+a],0);
  411. }
  412.  
  413. void dosizedirwindows(size)
  414. int size;
  415. {
  416.     ULONG class;
  417.     USHORT code;
  418.     int x,ox,fail=0,max;
  419.  
  420.     max=(scrdata_dirwin_center-((config->sliderwidth*2)+(scrdata_font_xsize*10)))/scrdata_font_xsize;
  421.     if (size!=65536) {
  422.         if (size>max) size=max;
  423.         else if (size<-max) size=-max;
  424.         ox=size; fail=-1;
  425.     }
  426.     else {
  427.         if ((scrdata_width-24-config->sliderwidth*2)<scrdata_font_xsize*24) return;
  428.  
  429.         SetDrMd(main_rp,COMPLEMENT);
  430.         sizedirwindow_gfx((ox=config->windowdelta));
  431.         Window->Flags|=WFLG_REPORTMOUSE;
  432.  
  433.         FOREVER {
  434.             while (getintuimsg()) {
  435.                 if (IMsg->MouseX<scrdata_dirwin_center) {
  436.                     x=(IMsg->MouseX-(scrdata_dirwin_center+4))/scrdata_font_xsize;
  437.                 }
  438.                 else {
  439.                     x=(IMsg->MouseX-scrdata_dirwin_center)/scrdata_font_xsize;
  440.                 }
  441.  
  442.                 if (x>max) x=max;
  443.                 else if (x<-max) x=-max;
  444.                 class=IMsg->Class; code=IMsg->Code;
  445.                 ReplyMsg((struct Message *)IMsg);
  446.                 if (class==IDCMP_MOUSEBUTTONS) {
  447.                     if (code==MENUDOWN) {
  448.                         fail=1;
  449.                         break;
  450.                     }
  451.                     if (code==SELECTUP) {
  452.                         fail=-1;
  453.                         break;
  454.                     }
  455.                 }
  456.                 else if (class==IDCMP_MOUSEMOVE) {
  457.                     if (x!=ox) {
  458.                         sizedirwindow_gfx(ox);
  459.                         sizedirwindow_gfx((ox=x));
  460.                     }
  461.                 }
  462.                 else if (class==IDCMP_RAWKEY) {
  463.                     if (code==0x45) {
  464.                         fail=-1;
  465.                         sizedirwindow_gfx(ox);
  466.                         sizedirwindow_gfx((ox=0));
  467.                         break;
  468.                     }
  469.                 }
  470.             }
  471.             if (fail) break;
  472.             Wait(1<<Window->UserPort->mp_SigBit);
  473.         }
  474.         sizedirwindow_gfx(ox);
  475.         SetDrMd(main_rp,JAM2);
  476.         Window->Flags&=~WFLG_REPORTMOUSE;
  477.     }
  478.     if (fail==-1 && ox!=config->windowdelta && !status_iconified) {
  479.         busy();
  480.         layoutcenter((config->windowdelta=ox));
  481.         fix_rmb_gadgets();
  482.         SetAPen(main_rp,screen_pens[0].pen);
  483.         rectfill(main_rp,
  484.             scrdata_dispwin_center-config->sliderwidth-7,
  485.             scrdata_dispwin_ypos-1,
  486.             (config->sliderwidth*2)+13,
  487.             scrdata_dispwin_height+2);
  488.         RectFill(main_rp,
  489.             scrdata_xoffset,
  490.             horiz_propgad[0].TopEdge-2,
  491.             scrdata_xoffset+scrdata_width-1,
  492.             path_strgadget[0].TopEdge+path_strgadget[0].Height+1);
  493.         setupdisplay(0);
  494.         for (x=0;x<2;x++) RefreshStrGad(&path_strgadget[x],Window);
  495.         okay();
  496.         unbusy();
  497.     }
  498. }
  499.  
  500. void sizedirwindow_gfx(dx)
  501. int dx;
  502. {
  503.     int x;
  504.  
  505.     x=scrdata_dirwin_center+(dx*scrdata_font_xsize);
  506.     rectfill(main_rp,x,scrdata_dispwin_ypos,4,scrdata_dispwin_height);
  507. }
  508.  
  509. void fix_requester(req,title)
  510. struct RequesterBase *req;
  511. char *title;
  512. {
  513.     req->rb_fg=screen_pens[config->requestfg].pen;
  514.     req->rb_bg=screen_pens[config->requestbg].pen;
  515.     req->rb_shine=screen_pens[config->gadgettopcol].pen;
  516.     req->rb_shadow=screen_pens[config->gadgetbotcol].pen;
  517.     req->rb_font=scr_font[FONT_REQUEST];
  518.     req->rb_screen=Window->WScreen;
  519.     req->rb_extend=&requester_stringex;
  520.     fix_stringex(&requester_stringex);
  521.     if (config->generalscreenflags&SCR_GENERAL_REQDRAG) {
  522.         req->rb_title=title;
  523.         req->rb_flags=RBF_BORDERS|RBF_STRINGS;
  524.     }
  525.     else {
  526.         req->rb_title=NULL;
  527.         req->rb_flags=RBF_STRINGS;
  528.     }
  529.     req->rb_string_table=globstring;
  530.     if (status_publicscreen) {
  531.         req->rb_window=Window;
  532.         req->rb_flags|=RBF_WINDOWCENTER;
  533.     }
  534.     else req->rb_flags&=~RBF_WINDOWCENTER;
  535. }
  536.  
  537. void fix_stringex(extend)
  538. struct StringExtend *extend;
  539. {
  540.     extend->Font=scr_font[FONT_REQUEST];
  541.     extend->Pens[0]=screen_pens[config->stringfgcol].pen;
  542.     extend->Pens[1]=screen_pens[config->stringbgcol].pen;
  543.     extend->ActivePens[0]=screen_pens[config->stringselfgcol].pen;
  544.     extend->ActivePens[1]=screen_pens[config->stringselbgcol].pen;
  545. }
  546.  
  547. struct Gadget *addreqgadgets(reqbase,gadgets,mask,count)
  548. struct RequesterBase *reqbase;
  549. struct TagItem **gadgets;
  550. int mask,*count;
  551. {
  552.     int gad;
  553.     struct Gadget *gadget=NULL,*newgadget,*firstgadget;
  554.  
  555.     for (gad=0;;gad++) {
  556.         if (!gadgets[gad]) break;
  557.         if (gad>31 || !(mask&(1<<gad))) {
  558.             if (!(newgadget=(struct Gadget *)
  559.                 AddRequesterObject(reqbase,gadgets[gad]))) return(NULL);
  560.             if (gadget) gadget->NextGadget=newgadget;
  561.             else firstgadget=newgadget;
  562.             gadget=newgadget;
  563.             if (count) ++*count;
  564.         }
  565.     }
  566.     AddGadgets(reqbase->rb_window,firstgadget,NULL,gad,reqbase->rb_shine,reqbase->rb_shadow,1);
  567.     return(firstgadget);
  568. }
  569.  
  570. void set_reqobject(object,tagmatch,data)
  571. struct TagItem *object;
  572. ULONG tagmatch,data;
  573. {
  574.     int tag;
  575.  
  576.     for (tag=0;;tag++) {
  577.         if (object[tag].ti_Tag==TAG_END) break;
  578.         if (object[tag].ti_Tag==tagmatch) {
  579.             object[tag].ti_Data=data;
  580.             break;
  581.         }
  582.     }
  583. }
  584.  
  585. void FadeRGB32(screen,cmap,count,dir,fadetime)
  586. struct Screen *screen;
  587. ULONG *cmap;
  588. int count,dir,fadetime;
  589. {
  590.     if (system_version2<OSVER_39) {
  591.         UWORD *cmap4;
  592.         int a,b;
  593.  
  594.         if (cmap4=AllocMem(count*sizeof(UWORD),MEMF_CLEAR)) {
  595.             for (a=0,b=0;a<count;a++) {
  596.                 cmap4[a]=(cmap[b++]>>20)&0x0f00;
  597.                 cmap4[a]|=(cmap[b++]>>24)&0x0ff0;
  598.                 cmap4[a]|=(cmap[b++]>>28)&0x0fff;
  599.             }
  600.             FadeRGB4(screen,cmap4,count,dir,fadetime);
  601.             FreeMem(cmap4,count*sizeof(UWORD));
  602.         }
  603.         else if (dir>0) load_palette(screen,cmap);
  604.         else load_palette(screen,(ULONG *)nullpalette);
  605.     }
  606.     else {
  607.         ULONG *tempmap;
  608.         int i,j,s,t,n,mod,val,orval,maxval;
  609.         struct timerequest treq;
  610.         struct MsgPort *fade_port=NULL;
  611.         struct DisplayInfo dinfo;
  612.  
  613.         if (!(tempmap=AllocMem(((count*3)+2)*sizeof(ULONG),MEMF_CLEAR)) ||
  614.             fadetime<1 ||
  615.             !(fade_port=LCreatePort(NULL,0)) ||
  616.             !(GetDisplayInfoData(NULL,
  617.                 (char *)&dinfo,sizeof(struct DisplayInfo),
  618.                 DTAG_DISP,GetVPModeID(&screen->ViewPort))) ||
  619.             (OpenDevice(TIMERNAME,UNIT_VBLANK,&treq.tr_node,0))) {
  620.             if (tempmap) {
  621.                 CopyMem((char *)cmap,(char *)&tempmap[1],count*3*sizeof(ULONG));
  622.                 tempmap[0]=count<<16;
  623.                 LoadRGB32(&screen->ViewPort,tempmap);
  624.             }
  625.             else load_palette(screen,cmap);
  626.         }
  627.         else {
  628.             maxval=1<<dinfo.RedBits;
  629.             if (dinfo.RedBits<4) i=1;
  630.             else i=maxval>>4;
  631.  
  632.             tempmap[0]=count<<16;
  633.  
  634.             if (dir==1) {
  635.                 s=maxval-1; t=-1; n=-i;
  636.                 LoadRGB32(&screen->ViewPort,tempmap);
  637.             }
  638.             else {
  639.                 s=1; t=maxval; n=i;
  640.             }
  641.             mod=32-dinfo.RedBits;
  642.             orval=(1<<mod)-1;
  643.  
  644.             treq.tr_node.io_Message.mn_ReplyPort=fade_port;
  645.             treq.tr_node.io_Command=TR_ADDREQUEST;
  646.             treq.tr_node.io_Flags=0;
  647.     
  648.             for (i=s;i+=n;) {
  649.                 if (dir==1) {
  650.                     if (i<=t) break;
  651.                 }
  652.                 else {
  653.                     if (i>=t) break;
  654.                 }
  655.                 for (j=0;j<count*3;j++) {
  656.                     val=(cmap[j]>>mod)-i;
  657.                     if (val<0) val=0;
  658.                     else if (val>=maxval) val=maxval-1;
  659.                     tempmap[j+1]=(val<<mod)|orval;
  660.                 }
  661.  
  662.                 treq.tr_time.tv_secs=0;
  663.                 treq.tr_time.tv_micro=fadetime*22000;
  664.                 SendIO(&treq.tr_node);
  665.                 WaitBOVP(&screen->ViewPort);
  666.                 LoadRGB32(&screen->ViewPort,tempmap);
  667.                 WaitIO(&treq.tr_node);
  668.             }
  669.             if (dir>0) CopyMem((char *)cmap,(char *)&tempmap[1],count*3*sizeof(ULONG));
  670.             else for (j=0;j<count*3;j++) tempmap[j+1]=0;
  671.             LoadRGB32(&screen->ViewPort,tempmap);
  672.             CloseDevice(&treq.tr_node);
  673.         }
  674.         if (fade_port) LDeletePort(fade_port);
  675.         if (tempmap) FreeMem(tempmap,((count*3)+2)*sizeof(ULONG));
  676.     }
  677. }
  678.  
  679. void FadeRGB4(screen,cmap,count,dir,fadetime)
  680. struct Screen *screen;
  681. UWORD *cmap;
  682. int count,dir,fadetime;
  683. {
  684.     UWORD *tempmap=NULL;
  685.     char red,green,blue;
  686.     int i,j,s,t,n;
  687.     struct timerequest treq;
  688.     struct MsgPort *fade_port=NULL;
  689.  
  690.     if (dir==1) {
  691.         s=15; t=-1; n=-1;
  692.     }
  693.     else {
  694.         s=1; t=16; n=1;
  695.     }
  696.  
  697.     if (fadetime<1 ||
  698.         !(tempmap=AllocMem(count*sizeof(UWORD),MEMF_CLEAR)) ||
  699.         !(fade_port=LCreatePort(NULL,0)) ||
  700.         (OpenDevice(TIMERNAME,UNIT_VBLANK,&treq.tr_node,0))) {
  701.         LoadRGB4(&screen->ViewPort,cmap,count);
  702.     }
  703.     else {
  704.         treq.tr_node.io_Message.mn_ReplyPort=fade_port;
  705.         treq.tr_node.io_Command=TR_ADDREQUEST;
  706.         treq.tr_node.io_Flags=0;
  707.  
  708.         if (dir==1) LoadRGB4(&screen->ViewPort,tempmap,count);
  709.         for (i=s;i!=t;i+=n) {
  710.             for (j=0;j<count;j++) {
  711.                 red=((cmap[j]>>8)&0xf)-i;
  712.                 green=((cmap[j]>>4)&0xf)-i;
  713.                 blue=(cmap[j]&0xf)-i;
  714.                 if (red<0) red=0; if (green<0) green=0; if (blue<0) blue=0;
  715.                 tempmap[j]=(UWORD)red<<8|(UWORD)green<<4|(UWORD)blue;
  716.             }
  717.             treq.tr_time.tv_secs=0;
  718.             treq.tr_time.tv_micro=fadetime*20000;
  719.             SendIO(&treq.tr_node);
  720.             WaitBOVP(&screen->ViewPort);
  721.             LoadRGB4(&screen->ViewPort,tempmap,count);
  722.             WaitIO(&treq.tr_node);
  723.         }
  724.         CloseDevice(&treq.tr_node);
  725.     }
  726.     if (fade_port) LDeletePort(fade_port);
  727.     if (tempmap) FreeMem(tempmap,count*sizeof(UWORD));
  728. }
  729.  
  730. void removewindowgadgets(window)
  731. struct Window *window;
  732. {
  733.     if (window && window->FirstGadget) {
  734.         struct Gadget *gad;
  735.  
  736.         FOREVER {
  737.             gad=window->FirstGadget;
  738.             while (gad) {
  739.                 if (!(gad->GadgetType>YP_SYSGADGET)) {
  740.                     RemoveGList(window,gad,1);
  741.                     break;
  742.                 }
  743.                 gad=gad->NextGadget;
  744.             }
  745.             if (!gad) break;
  746.         }
  747.     }
  748. }
  749.