home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / graphics / utility / mandlbx1 / window.c < prev   
Encoding:
C/C++ Source or Header  |  1985-11-19  |  16.5 KB  |  600 lines

  1. /* window.c
  2.  *   Main loop manages GEM windows, AES, mouse, menues, and drawing process.
  3.  */
  4. #include <obdefs.h>
  5. #include <define.h>
  6. #include <gemdefs.h>
  7. #include <vdibind.h>
  8. #include <osbind.h>
  9. #include <stdio.h>
  10. #include <debug.h>
  11. #include "\t\mandlbox.h"
  12.  
  13. /*#define WI_KIND        (SIZER|MOVER|FULLER| CLOSER|NAME|VSLIDE)*/
  14. #define WI_KIND        (CLOSER|NAME|VSLIDE)
  15.  
  16. #define MIN_WIDTH  (2*gl_wbox)
  17. #define MIN_HEIGHT (3*gl_hbox)
  18. int gl_hchar, gl_wchar, gl_wbox, gl_hbox;    /* system sizes */
  19.  
  20. int    ps_handle;    /* physical screen (workstation) handle */
  21. int    vs_handle;    /* virtual screen (workstation) handle */
  22. int    wi_handle;    /* window handle */
  23. int    old_res;    /* initial resolution of screen */
  24.  
  25. int    xdesk,ydesk,hdesk,wdesk;    /* size of whole desktop */
  26. int    xwork,ywork,hwork,wwork;    /* size of current working window */
  27. int    xold,yold,hold,wold;        /* size of screen before FULL cmd */
  28.  
  29. int    msgbuff[8];    /* event message buffer */
  30. int    keycode;    /* keycode returned by event-keyboard */
  31. int    mx,my;        /* mouse x and y pos. */
  32. int    butdown;    /* button state tested for, UP/DOWN */
  33. int    ret;        /* dummy return variable */
  34. int    clut_rotate;    /* mode */
  35.  
  36. /******* shared memory with draw.c: */
  37. double    Vx0, Vy0, Vxw, Vyw;    /* Size of viewed area, in real numbers */
  38. int Niter;            /* max number of iterations */
  39. int box_invisible;
  40.  
  41. /******* shared memory with stitch.c: */
  42. int no_check = 1;
  43.  
  44. int    contrl[12], intin[128], ptsin[128], intout[128];
  45. int    ptsout[128];    /* storage wasted for idiotic bindings */
  46.  
  47. char str[128];
  48.  
  49. GRECT work_clip;
  50. int draw_state;
  51. char *p_menu;
  52.  
  53. #define c(x) 1000*(2*(x)+1)/16
  54. int desks_clut[16][3], mandel_clut[16][3] = 
  55. {    {c(7),c(7),c(7)},    /* white */
  56.     {c(0),c(0),c(0)},    /* black */
  57.     {c(7),c(1),c(1)},    /* red */
  58.     {c(7),c(4),c(0)},
  59.     {c(7),c(6),c(0)},
  60.     {c(7),c(7),c(0)},    /* yellow */
  61.     {c(6),c(7),c(0)},
  62.     {c(0),c(7),c(0)},    /* green */
  63.     {c(0),c(7),c(5)},
  64.     {c(0),c(7),c(6)},    /* blue */
  65.     {c(0),c(6),c(7)},
  66.     {c(2),c(3),c(7)},
  67.     {c(4),c(0),c(7)},
  68.     {c(6),c(0),c(7)},    /* violet */
  69.     {c(7),c(0),c(6)},
  70.     {c(7),c(0),c(4)}
  71. };
  72.  
  73. struct places
  74. {    double x, y, dx, dy;
  75.     int menue_number;
  76.     int iter_ct;
  77.     char name[20];
  78. } places[] = 
  79.     {{.651350,-.176159, .000929, .000636, MGOLUM,  1024, "Golum"},
  80.      {.166765,-.807549, .018935, .012964, MRIPPLE, 1024, "Ripple"},
  81.      {.054566,-.755330, .002208, .001512, MPINWH,  1024, "Pinwheels"},
  82.      {.127512,-.781265, .011749, .008044, MSWIRLS, 1024, "Swirls"},
  83.      {.656728,-.174796, .004559, .003122, M3ON4,   1024, "3 on 4"},
  84.      {.650663,-.176422, .001890, .001249, MTURTLE, 1024, "Turtle"},
  85.      {-1.0,  -1.85,    2.0,     2.4,      MBUDDAH,  256, "Buddah"}};
  86.  
  87. struct
  88. {    char active, on_crt;
  89.     int hidden;
  90.     int want_active;
  91.     char new0, new1;
  92.     int x0,y0, x1,y1;
  93.     int xyarray[10];
  94. }  rbox = {0, 1, FALSE, 0};
  95.  
  96. char *fs_get();
  97.  
  98. main()
  99. {    int event, mouse_buttons, mmoving, fulled;
  100.     int x0, y0, xw, yw, i, j;
  101.     int *p_val;
  102. /*    if ((old_res=Getrez()) != 0)    /* won't work with AES */
  103. /*        Setscreen(-1, -1, 0);    /* make low resolution */
  104.     appl_init();
  105.     open_vwork();
  106.      open_window();
  107.     open_rsc();
  108.     Niter = 256;    /* inz count till black */
  109.     inz_dialog();
  110.  
  111.     graf_mouse(ARROW,0x0L);
  112.     fulled=FALSE;
  113.     butdown=TRUE;
  114.     box_invisible = 1;
  115.  
  116.     dr_iRastWindow(xwork, ywork, wwork, hwork);
  117.     dr_iProgCoords(-1.0,-1.85, 2.0,2.4);
  118.     dr_Vreset();
  119.     do 
  120.     {    if (draw_state==0 || mmoving)
  121.         {    event = evnt_multi(
  122.                 MU_MESAG| MU_BUTTON| MU_KEYBD | MU_TIMER,
  123.                 1,1,butdown,
  124.                 0,0,0,0,0,  0,0,0,0,0,
  125.                 msgbuff,100,0,    /* 100 ms timer*/
  126.                 &mx,&my,&mouse_buttons,&ret,&keycode,&ret);
  127.         }else
  128.         {    event = evnt_multi(MU_MESAG| MU_BUTTON| MU_KEYBD| MU_M1,
  129.                 1,1,butdown,
  130.                 1,0,0,0,0,     /* (always true event) */
  131.                 0,0,0,0,0,  msgbuff,0,0,
  132.                 &mx,&my,&mouse_buttons,&ret,&keycode,&ret);
  133.         }
  134.         if (event & MU_MESAG) switch (msgbuff[0])
  135.         {   case WM_REDRAW:    /* set clip and draw_mode */
  136.             start_redraw(1, msgbuff[4],msgbuff[5],msgbuff[6],
  137.                 msgbuff[7]);        /*!!!*/
  138.             break;
  139.             case WM_NEWTOP:  /* unsure of what this does, so boobytrap*/
  140.             case WM_TOPPED:
  141.             wind_set(wi_handle,WF_TOP,0,0,0,0);
  142.             break;
  143.             case WM_SIZED:
  144.             case WM_MOVED:
  145.             if (msgbuff[6]<MIN_WIDTH) msgbuff[6] = MIN_WIDTH;
  146.             if (msgbuff[7]<MIN_HEIGHT) msgbuff[7] = MIN_HEIGHT;
  147.             wind_set(wi_handle,WF_CURRXYWH,
  148.                 msgbuff[4],msgbuff[5],msgbuff[6],msgbuff[7]);
  149.             wind_get(wi_handle,WF_WORKXYWH,&xwork,&ywork,&wwork,&hwork);
  150.             dr_iRastWind(xwork,ywork, wwork,hwork);
  151.             start_redraw(-1, xwork, ywork, wwork, hwork);
  152.             break;
  153.             case WM_FULLED:
  154.             if(fulled == 0)        /* to full: */
  155.             {    wind_calc(WC_BORDER,WI_KIND,xwork,ywork,wwork,
  156.                     hwork, &xold,&yold,&wold,&hold);
  157.                 wind_calc(WC_WORK,WI_KIND,xdesk,ydesk,wdesk,
  158.                     hdesk,&xwork,&ywork,&wwork,&hwork);
  159.                 wind_set(wi_handle,WF_CURRXYWH,xdesk,ydesk,
  160.                     wdesk,hdesk);
  161.             }else            /* to un-full: */
  162.             {    wind_calc(WC_WORK,WI_KIND,xold,yold,wold,hold,
  163.                     &xwork,&ywork,&wwork,&hwork);
  164.                 wind_set(wi_handle,WF_CURRXYWH,xold,yold,
  165.                     wold,hold);
  166.             }
  167.             fulled ^= TRUE;
  168.             dr_iRasterWindow(xwork, ywork, wwork, hwork);
  169.             start_redraw(-1, xwork, ywork, wwork, hwork);
  170.             break;
  171.             case MN_SELECTED:
  172.             switch (msgbuff[4])
  173.             {   
  174.                 case MSAVEAS:
  175.                 write_scr(fs_get("man"));
  176.                 break;
  177.                 case MOPEN:
  178.                 read_scr(fs_get("man"));
  179.                 draw_state = 0;
  180.                 break;
  181.                 case MCROTATE:
  182.                 clut_rotate = 1-clut_rotate;
  183.                 break;
  184.                 case MQUIT:
  185.                 goto quit;
  186.  
  187.                 case MBUDDAH:   case MRIPPLE:   case MPINWH:
  188.                 case MSWIRLS:   case M3ON4:        case MTURTLE:
  189.                 case MGOLUM:
  190.  
  191.                 for (i=0;places[i].menue_number!=msgbuff[4];i++)
  192.                     if(places[i].menue_number ==0) break;
  193.                 dr_iProgCoords(places[i].x,  places[i].y,
  194.                          places[i].dx, places[i].dy);
  195.                 start_redraw(1, xwork, ywork, wwork, hwork);
  196.                 dr_Vreset();
  197.                 Niter = places[i].iter_ct;
  198.                 break;
  199.                 case MZOUT4:
  200.                 dr_zoom(xwork-wwork*3/2, ywork-hwork*3/2,
  201.                       xwork+wwork*5/2, ywork+hwork*5/2);
  202.                 start_redraw(1, -1, 0, 0, 0);
  203.                 break;
  204.                 case MZNUMBER:
  205.                 zoom_numerically();
  206.                 break;
  207.                 case MQPAINT:    /* patch-up area */
  208.                 printf("\nmqpaint\n");
  209.                 while (1 + (mouse_buttons & 3))
  210.                 {    fprintf(stderr,"*******");
  211.                     dr_area(mx, my, 3);
  212.                     dr_putBuf( 7*7 );
  213.                     fprintf(stderr,"!!!!!!!!\n");
  214.                     event = evnt_multi(MU_MESAG| MU_BUTTON| 
  215.                         MU_KEYBD| MU_M1,
  216.                         1,1,butdown,
  217.                         1,0,0,0,0, /* always true */
  218.                         0,0,0,0,0,  msgbuff,0,0,
  219.                         &mx,&my,&mouse_buttons,&ret,
  220.                         &keycode,&ret);
  221.                 }
  222.                 case ABOUTMAN:
  223.                 disp_dialog(AUTHOR, 0);
  224.                 break;
  225.                 case MUNZOOM:
  226.                 if (dr_Vpop())
  227.                     start_redraw(1, -1,0,0,0,0);
  228.                 break;
  229.                 case CBOXES:
  230.                 box_invisible = 1-box_invisible;
  231.                 break;
  232.                 case MAITER:
  233.                 set_iteration();
  234.                 break;
  235.                 case MSAVENXT:
  236.                 case MPLAYMOV:
  237.                 case MZHELP:
  238.                 case MZROTATE:
  239.                 case MAZ2:
  240.                 default:
  241.                 form_alert(0,"[1][Detour:|Function Under \
  242. Construction!|Try again next Rev.|(Remember, it's Freeware)][Acknowlege]");
  243.                 break;
  244.             }
  245.             menu_tnormal(p_menu, msgbuff[3], TRUE);
  246.             break;            
  247.         }
  248.         if (event & MU_KEYBD) 
  249.         {    keycode &= 0xff;
  250.             switch (keycode)
  251.             {   case 'D': debug_print = 1-debug_print; break;
  252.                 case 'C': no_check = 1-no_check; break;
  253.         }    }
  254.  
  255.         if ((event & MU_BUTTON) /*&&(wi_handle == top_window) ???*/)
  256.             butdown ^= 1;
  257.         if (draw_state == 0) mouse_buttons = butdown ^ 1;
  258.         if (mouse_moving(mx, my, mouse_buttons))
  259.             mmoving = 10;
  260.         if (mmoving)
  261.         {    draw_on_screen();    /* make boxes visible */
  262.             view_screen();
  263.             mmoving--;
  264.         }else
  265.             more_redraw();        
  266.  
  267.         if (clut_rotate)
  268.             rotate_clut(vs_handle,mandel_clut);
  269.     } while(!((event & MU_MESAG) && (msgbuff[0] == WM_CLOSED)));
  270. quit:
  271.     menu_bar(p_menu, FALSE);
  272.     load_clut(vs_handle, desks_clut, (long)0);
  273.     wind_close(wi_handle);
  274.     graf_shrinkbox(xwork+wwork/2,ywork+hwork/2,gl_wbox,gl_hbox,xwork,ywork,wwork,hwork);
  275.     wind_delete(wi_handle);
  276.     v_clsvwk(vs_handle);
  277.     appl_exit();
  278. /*    if (old_res != 0)        /*won't work with AES 
  279. /*        Setscreen(-1, -1, old_res);    /* restore resolution */
  280. }
  281.  
  282. zoom_numerically()
  283. {    struct object *p_object;
  284.  
  285.     if (rsrc_gaddr(R_TREE, NUMERIC, &p_object)==0) 
  286.         panic ("AES/rsrc_gaddr() error",0L,0L);
  287.  
  288.     fill_dialog_field(Vx0, "%f", p_object+VALX);
  289.     fill_dialog_field(Vy0, "%f", p_object+VALY);
  290.     fill_dialog_field(Vxw, "%f", p_object+VALDX);
  291.     fill_dialog_field(Vyw, "%f", p_object+VALDY);
  292.  
  293.     if (disp_dialog(NUMERIC, VALY) == NUMOK)
  294.     {    dr_Vpush();
  295.         get_dialog_field(p_object+VALX, "Imag. Corner", "%f%s", &Vx0);
  296.         get_dialog_field(p_object+VALY, "Real Corner", "%f%s", &Vy0);
  297.         get_dialog_field(p_object+VALDX, "Imag. Width", "%f%s", &Vxw);
  298.         get_dialog_field(p_object+VALDY, "Real Width", "%f%s", &Vyw);
  299.  
  300.         dr_iProgCoords(Vx0, Vy0,  Vxw, Vyw);
  301.         start_redraw(1, -1,0,0,0,0);
  302. }    }
  303.  
  304. set_iteration()
  305. {    struct object *p_object;
  306.     float i;
  307.  
  308.     if (rsrc_gaddr(R_TREE, ITERATN, &p_object)==0) 
  309.         panic ("AES/rsrc_gaddr() error",0L,0L);
  310.     fill_dialog_field((long)Niter, "%ld", p_object+NITER);
  311.     if (disp_dialog(ITERATN, NITER) == DRAWHERE)
  312.         get_dialog_field(p_object+NITER, "Iteration Max", "%d%s",
  313.                  &Niter);
  314. }
  315.  
  316. fill_dialog_field(val, fmt, p_object)
  317. struct object *p_object;
  318. char *fmt;
  319. long val;    /* 32-bits of stuff for sprintf, interpreted in type fmt */
  320. {    char *edit_string;
  321.     edit_string = (struct text_edinfo *) (p_object->ob_spec) -> te_ptext;
  322.     sprintf(edit_string, fmt, val);
  323. }
  324.  
  325. get_dialog_field(p_window, w_name, fmt, val)
  326. struct object *p_window;
  327. char *w_name, *fmt;
  328. char *val;    /* untyped pointer, actually */
  329. {    char *edit_string, alert_string[128], sc_str[128];
  330.     edit_string = (struct text_edinfo *) (p_window->ob_spec) -> te_ptext;
  331.     sc_str[0] = 0;
  332.     sscanf(edit_string, fmt, val, sc_str);
  333.     if (sc_str[0]!=0)
  334.     {    if (strlen(edit_string) > 30) edit_string[30] = 0;
  335.         sprintf(alert_string, 
  336.             "[1][Cannot figure out how | %s | can be put into %s.\
  337. ][Got It?]", edit_string, w_name);
  338.         form_alert(0, alert_string);
  339. }    }
  340.  
  341. long *save_screen;
  342. int Nsave_screen;
  343.  
  344. disp_dialog(tree_index, start_edit)
  345. int tree_index, start_edit;
  346. {    struct object *p_object;
  347.     int x0, y0, xw, yw;
  348.     int exit_obj;
  349.  
  350.     if (rsrc_gaddr(R_TREE, tree_index, &p_object)==0) 
  351.         panic ("AES/rsrc_gaddr() error",0L,0L);
  352.     form_center(p_object, &x0, &y0, &xw, &yw); 
  353.     form_dial(FMD_START, x0, y0, xw, yw);
  354.  
  355.     draw_on_screen();    /* don't save mouse */
  356.     rast_save(x0, y0, xw, yw, save_screen, Nsave_screen);
  357.     view_screen();
  358.  
  359.     objc_draw(p_object, 0, 2, x0, y0, xw, yw);
  360.     exit_obj = form_do(p_object, start_edit);
  361.  
  362.     objc_change(p_object, exit_obj, 0, x0,y0,xw,yw, 0,1);
  363.     draw_on_screen();    /* unsave with mouse gone */
  364.     rast_restore();
  365.     view_screen();
  366.  
  367.     form_dial(FMD_FINISH,  x0, y0, xw, yw);
  368.     return (exit_obj);
  369. }
  370.  
  371. int ind[] = {NUMERIC, AUTHOR, ITERATN, -1};
  372. inz_dialog()        /* reserve a buffer to hide the screen under
  373.             /* dialog boxes listed in ind[]*/
  374. {    struct object *p_object;
  375.     int x0, y0, xw, yw, obj, size;
  376.     char *pointer;
  377.             /* find size of biggest dialog box: */
  378.     for (Nsave_screen=0, obj=0; ind[obj]>=0;)
  379.     {    if (rsrc_gaddr(R_TREE, ind[obj++], &p_object)==0) 
  380.             panic ("AES/rsrc_gaddr() error",0L,0L);
  381.         form_center(p_object, &x0, &y0, &xw, &yw); 
  382.         size = rastSize(x0, y0,  xw, yw);
  383.         Nsave_screen = (size>Nsave_screen)? size: Nsave_screen;
  384.     }
  385.     pointer = Malloc((long) (Nsave_screen));
  386.     if (pointer == 0)
  387.         panic("inz_dialog: Malloc out of memory\n", 0L, 0L);
  388.     save_screen = (long *) pointer;    
  389. }
  390.  
  391. start_redraw(ds, xc, yc, wc, hc)
  392. int ds, xc, yc, wc, hc;
  393. {    int i;
  394.     if (ds == 1)
  395.     {    draw_state = 1;
  396.         rbox.want_active = 0;
  397.     }
  398.     clip_current();
  399.     if (xc >=0)
  400.     {    work_clip.g_x=xc;
  401.         work_clip.g_y=yc;
  402.         work_clip.g_w=wc;
  403.         work_clip.g_h=hc;
  404. }    }
  405.  
  406. GRECT t1;        /*current working rectangle*/
  407.  
  408. more_redraw()
  409. {    int i, flag;
  410.  
  411.     flag = WF_NEXTXYWH;
  412.     switch (draw_state)
  413.     {   case 0:
  414.         draw_on_screen();    /* make boxes visible */
  415.         view_screen();
  416.         return;
  417.         case 1:
  418.         flag = WF_FIRSTXYWH;
  419.         case 2:    
  420.         wind_get(wi_handle, flag, &t1.g_x,&t1.g_y,&t1.g_w,&t1.g_h);
  421.         if (t1.g_w==0 || t1.g_h==0)
  422.         {    draw_state = 0;
  423.             return;
  424.         }
  425.         if (draw_state == 2)
  426.             panic("must currently be top window only\n", 0L, 0L);
  427.         if (!rc_intersect(&work_clip,&t1)) return;
  428.         draw_state = 3;
  429.         clip_current();
  430.         dr_sBox();    /*???t1.g_x,t1.g_y,t1.g_w,t1.g_h);*/
  431.         default:    
  432.         if (i=dr_compute())
  433.             dr_putBuf(i);
  434.         else    draw_state = 2;
  435. }    }    
  436.  
  437.  
  438. int    last_button, last_x, last_y; /* mouse on previous scan*/
  439.  
  440. mouse_moving(mx, my, mouse_buttons)
  441. int mx, my, mouse_buttons;
  442. {    int moving;
  443.     mouse_buttons &= 1;
  444.     if (mouse_buttons && last_button==0)
  445.     {    if (!rbox_redraw(mx,my)) /*down of left button*/
  446.         {    rbox_set(0, mx, my);
  447.             rbox_set(1, mx, my);
  448.             rbox.want_active=1;
  449.     }    }
  450.     if (last_button)
  451.         rbox_set(1, mx, my);    /*drag of left button*/
  452.     moving = (mx!=last_x || my!=last_y);
  453.     last_x = mx; last_y = my;
  454.     last_button = mouse_buttons;
  455.     return (moving);
  456. }
  457.  
  458. rbox_redraw(x,y)
  459. int x,y;
  460. {    if ( (x > rbox.xyarray[0]) ^ (x > rbox.xyarray[4]) &&
  461.          (y > rbox.xyarray[1]) ^ (y > rbox.xyarray[5]) )
  462.     {    dr_zoom(rbox.xyarray[0],rbox.xyarray[1], 
  463.               rbox.xyarray[4],rbox.xyarray[5]);
  464.         start_redraw(1, xwork,ywork,wwork,hwork);
  465. /*        rbox.want_active = 0;/**/
  466.         return (1);
  467.     }
  468.     else return (0);
  469. }
  470. rbox_set(index, x, y)
  471. int index, x, y;
  472. {    int dx, dy;
  473.     double f1, f2;
  474.     if (index==0)
  475.     {    rbox.x0=x; rbox.y0=y; rbox.new0=1;
  476.     }else
  477.     {    if ((dx=x-rbox.x0) && (dy=y-rbox.y0))    /* keep ratio correct */
  478.         {    f1 = (double)dy/(double)dx;
  479.             f2 = (double)hwork/(double)( (1-2*(f1<0))*wwork);
  480.             if (f1<f2)
  481.                 y = rbox.y0 + (int)((double) dx * f2);
  482.             else
  483.                 x = rbox.x0 +  (int)((double)dy / f2);
  484.         }else
  485.         {    x = rbox.x0;
  486.             y = rbox.y0;
  487.         }
  488.         rbox.x1=x; rbox.y1=y; rbox.new1=1;
  489. }    }
  490.  
  491. draw_on_screen()
  492. {    if (rbox.on_crt==0) return;
  493.     rbox.on_crt = 0;
  494.     wind_update(TRUE);        /*lock window THIS HANGS*/
  495.     if(rbox.hidden==FALSE) graf_mouse(M_OFF,0x0L);
  496.     if (rbox.active) exor_box();    /*take off box*/
  497.     rbox.hidden=TRUE;
  498. }    
  499. view_screen()
  500. {    if (rbox.on_crt) return;
  501.     if (rbox.new0)
  502.     {    rbox.xyarray[0] = rbox.xyarray[6] = rbox.xyarray[8] = rbox.x0;
  503.         rbox.xyarray[1] = rbox.xyarray[3] = rbox.xyarray[9] = rbox.y0;
  504.         rbox.new0=0;
  505.     }
  506.     if (rbox.new1)
  507.     {    rbox.xyarray[2] = rbox.xyarray[4] = rbox.x1;
  508.         rbox.xyarray[5] = rbox.xyarray[7] = rbox.y1;
  509.         rbox.new1=0;
  510.     }
  511.     if (rbox.active = rbox.want_active) exor_box();    /*draw box*/
  512.  
  513.     if(rbox.hidden==TRUE) graf_mouse(M_ON,0x0L);
  514.     wind_update(FALSE);        /*unlock window*/
  515.     rbox.hidden=FALSE;
  516.     rbox.on_crt = 1;
  517. }    
  518.  
  519. exor_box()
  520. {    clip_current();
  521.     vswr_mode(wi_handle, 3);    /* XOR */
  522.     vsl_color(wi_handle, 8);    /* 180 deg around spectrum*/
  523.     v_pline(wi_handle, 5, rbox.xyarray);
  524. }
  525.  
  526. clip_current()
  527. {    set_clip(xwork, ywork, wwork, hwork);
  528. }
  529. clip_full()
  530. {    set_clip(xdesk, ydesk, wdesk, hdesk);
  531. }
  532.  
  533. set_clip(x,y,w,h)
  534. int x,y,w,h;
  535. {    int clip[4];
  536.     clip[0]=x;
  537.     clip[1]=y;
  538.     clip[2]=x+w;
  539.     clip[3]=y+h;
  540.     vs_clip(wi_handle,1,clip);
  541.     dr_clip(x,y,w,h);
  542. }
  543.  
  544.  
  545. char *fs_get(type)
  546. char *type;
  547. {    char path[128], sel[128], *p1, *p2;
  548.     int buttons;
  549.     for (p1="*.dir", p2=path; *p2++ = *p1++; );
  550.     sel[0] = 0;
  551.     if (fsel_input(path, sel, &buttons) == 0)
  552.         panic("fsel_input error (returned 0)");
  553.     if (buttons == 0)
  554.         printf("buttons==0!\n");
  555.     fprintf(stderr, "fi() = |%s|%s|\n", path, sel);
  556.     return ("xxx.man");
  557. }
  558.  
  559. open_vwork()
  560. {    int i;
  561.     int work_in[11];    /* Input to GSX parameter array */
  562.     int work_out[57];    /* Output from GSX parameter array */
  563.  
  564.     ps_handle=graf_handle(&gl_wchar,&gl_hchar,&gl_wbox,&gl_hbox);
  565.     for(i=0;i<10;work_in[i++]=1);
  566.     work_in[10]=2;
  567.     vs_handle=ps_handle;
  568.     v_opnvwk(work_in,&vs_handle,work_out);
  569.     if (vs_handle == 0)
  570.         panic("v_opnvwk couldn't open window",0L,0L);
  571.     load_clut(vs_handle, mandel_clut, desks_clut);
  572. }
  573.  
  574. open_window()
  575. {    wind_get(0/*whole screen*/,WF_WORKXYWH, &xdesk, &ydesk, &wdesk, &hdesk);
  576.     wi_handle=wind_create(WI_KIND,xdesk,ydesk,wdesk,hdesk);
  577.     wind_set(wi_handle, WF_NAME,"Mandlbox",0,0);
  578.     graf_growbox(xdesk+wdesk/2,ydesk+hdesk/2,gl_wbox,gl_hbox,xdesk,ydesk,wdesk,hdesk);
  579.     wind_open(wi_handle,xdesk,ydesk,wdesk,hdesk);
  580.     wind_get(wi_handle,WF_WORKXYWH,&xwork,&ywork,&wwork,&hwork);
  581.     if (wdesk>500 && 2 != form_alert(1,"[3][16 Colors Required.|\
  582. Set Preferences to Low|Resolution and Restart.][okay|ignore warning]")) exit();
  583. }
  584.  
  585. char myname[] = "mandlbox.rsc";
  586. open_rsc()
  587. {    if (rsrc_load(myname)==0) panic("File %s missing!",myname,0L);
  588.     if (rsrc_gaddr(R_TREE, MENUE, &p_menu)==0)
  589.         panic ("AES/rsrc_gaddr() error",0L,0L);
  590.     if (menu_bar(p_menu, TRUE)==0) panic ("AES/menu_bar() error",0L,0L);
  591. }
  592. panic(str,v,w)
  593. char *str, *v, *w;
  594. {    long i;
  595.     fprintf(stderr,"\n\n\n***** ERROR: *****\n");
  596.     fprintf(stderr,str,v,w);
  597.     for (i=0; i<200000; i++);
  598.     exit();
  599. }
  600.