home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / gnu / gmlibs23 / outline_ < prev    next >
Encoding:
Text File  |  1993-07-30  |  4.8 KB  |  236 lines

  1. /* apskel.c from atari */
  2.  
  3. #include <gemfast.h>
  4. #include <aesbind.h>
  5. #include <vdibind.h>
  6. #include <osbind.h>
  7.  
  8. #define TRUE  1
  9. #define FALSE 0
  10.  
  11. #define WI_KIND        (SIZER|MOVER|FULLER|CLOSER|NAME)
  12. #define NO_WINDOW (-1)
  13. #define MIN_WIDTH  (2*gl_wbox)
  14. #define MIN_HEIGHT (3*gl_hbox)
  15.  
  16.  
  17. int    gl_hchar;
  18. int    gl_wchar;
  19. int    gl_wbox;
  20. int    gl_hbox;    /* system sizes */
  21.  
  22. int     phys_handle;    /* physical workstation handle */
  23. int     handle;        /* virtual workstation handle */
  24. int    wi_handle;    /* window handle */
  25. int    top_window;    /* handle of topped window */
  26.  
  27. int    xdesk,ydesk,hdesk,wdesk;
  28. int    xold,yold,hold,wold;
  29. int    xwork,ywork,hwork,wwork;    /* desktop and work areas */
  30.  
  31. int    msgbuff[8];    /* event message buffer */
  32. int    keycode;    /* keycode returned by event-keyboard */
  33. int    mx,my;        /* mouse x and y pos. */
  34. int    butdown;    /* button state tested for, UP/DOWN */
  35. int    ret;        /* dummy return variable */
  36.  
  37. int    hidden;        /* current state of cursor */
  38.  
  39. int    fulled;        /* current state of window */
  40.  
  41. /*  utils */
  42.  
  43. void hide_mouse(void)
  44. {
  45.     if(! hidden){
  46.         graf_mouse(M_OFF, 0x0L);
  47.         hidden=TRUE;
  48.     }
  49. }
  50.  
  51. void show_mouse(void)
  52. {
  53.     if(hidden){
  54.         graf_mouse(M_ON, 0x0L);
  55.         hidden=FALSE;
  56.     }
  57. }
  58.  
  59. /* open virtual workstation */
  60. void open_vwork()
  61. {
  62.     int work_in[11];    /* Input to GSX parameter array */
  63.     int work_out[57];    /* Output from GSX parameter array */
  64.     register int i;
  65.  
  66.     for(i=0; i < 10; work_in[i++] = 1);
  67.     work_in[10]=2;
  68.     handle=phys_handle;
  69.     v_opnvwk(work_in, &handle, work_out);
  70. }
  71.  
  72. /* set clipping rectangle */
  73. void set_clip(x,y,w,h)
  74. int x,y,w,h;
  75. {
  76.     int clip[4];
  77.  
  78.     clip[0] = x;
  79.     clip[1] = y;
  80.     clip[2] = clip[0]+w;
  81.     clip[3] = clip[1]+h;
  82.     vs_clip(handle, 1, clip);
  83. }
  84.  
  85. /* open window */
  86. void open_window(win_name)
  87. register char *win_name;
  88. {
  89.     wi_handle = wind_create(WI_KIND, xdesk, ydesk, wdesk, hdesk);
  90.     wind_set(wi_handle, WF_NAME, win_name,0,0);
  91.     graf_growbox(xdesk+wdesk/2, ydesk+hdesk/2, gl_wbox ,gl_hbox,
  92.              xdesk, ydesk, wdesk, hdesk);
  93.     wind_open(wi_handle, xdesk, ydesk, wdesk, hdesk);
  94.     wind_get(wi_handle, WF_WORKXYWH, &xwork, &ywork, &wwork, &hwork);
  95. }
  96.  
  97. /* Draw Window    */
  98. void draw_window()
  99. {
  100.     int temp[4];
  101.  
  102.     /* clear window */
  103.     vsf_color(handle, 0);
  104.     temp[0] = xwork;
  105.     temp[1] = ywork;
  106.     temp[2] = temp[0]+wwork-1;
  107.     temp[3] = temp[1]+hwork-1;
  108.  
  109.     v_bar(handle, temp);        /* blank the interior */
  110.     vsf_color(handle,1);
  111.  
  112.     /* do whatever else */
  113. }
  114.  
  115. /* find and redraw all clipping rectangles */
  116. void do_redraw(xc, yc, wc, hc)
  117. int xc, yc, wc, hc;
  118. {
  119. GRECT t1,t2;
  120.  
  121.     hide_mouse();
  122.     wind_update(TRUE);
  123.     t2.g_x = xc;
  124.     t2.g_y = yc;
  125.     t2.g_w = wc;
  126.     t2.g_h = hc;
  127.     wind_get(wi_handle ,WF_FIRSTXYWH, &t1.g_x, &t1.g_y, &t1.g_w, &t1.g_h);
  128.     while (t1.g_w && t1.g_h)
  129.     {
  130.         if (rc_intersect(&t2, &t1))
  131.         {
  132.             set_clip(t1.g_x,t1.g_y,t1.g_w,t1.g_h);
  133.             draw_window();
  134.           }
  135.           wind_get(wi_handle, WF_NEXTXYWH, &t1.g_x, &t1.g_y, &t1.g_w,
  136.             &t1.g_h);
  137.     }
  138.     wind_update(FALSE);
  139.     show_mouse();
  140. }
  141.  
  142. /* event dispatcher */
  143. void multi()
  144. {
  145.     int event;
  146.  
  147.       do {
  148.     event = evnt_multi(MU_MESAG | MU_BUTTON | MU_KEYBD,
  149.             1,1,butdown,
  150.             0,0,0,0,0,
  151.             0,0,0,0,0,
  152.             msgbuff,0L,&mx,&my,&ret,&ret,&keycode,&ret);
  153.  
  154.     wind_update(TRUE);
  155.  
  156.     if (event & MU_MESAG)
  157.       switch (msgbuff[0]) {
  158.  
  159.       case WM_REDRAW:
  160.         do_redraw(msgbuff[4], msgbuff[5], msgbuff[6], msgbuff[7]);
  161.         break;
  162.  
  163.       case WM_NEWTOP:
  164.       case WM_TOPPED:
  165.         wind_set(wi_handle, WF_TOP, 0, 0, 0, 0);
  166.         break;
  167.  
  168.       case WM_SIZED:
  169.       case WM_MOVED:
  170.         if(msgbuff[6]< MIN_WIDTH)
  171.         msgbuff[6] = MIN_WIDTH;
  172.         if(msgbuff[7]<MIN_HEIGHT)
  173.         msgbuff[7] = MIN_HEIGHT;
  174.         wind_set(wi_handle, WF_CURRXYWH, msgbuff[4], msgbuff[5],
  175.              msgbuff[6], msgbuff[7]);
  176.         wind_get(wi_handle, WF_WORKXYWH, &xwork, &ywork, &wwork, &hwork);
  177.         break;
  178.  
  179.       case WM_FULLED:
  180.         if(fulled)
  181.         {
  182.         wind_calc(WC_WORK, WI_KIND, xold, yold, wold, hold,
  183.               &xwork, &ywork, &wwork, &hwork);
  184.         wind_set(wi_handle, WF_CURRXYWH, xold, yold, wold, hold);
  185.         }
  186.         else
  187.         {
  188.         wind_calc(WC_BORDER, WI_KIND, xwork, ywork, wwork, hwork,
  189.                 &xold, &yold, &wold, &hold);
  190.         wind_calc(WC_WORK, WI_KIND, xdesk, ydesk, wdesk, hdesk,
  191.                 &xwork, &ywork, &wwork, &hwork);
  192.         wind_set(wi_handle, WF_CURRXYWH, xdesk, ydesk, wdesk, hdesk);
  193.         }
  194.         fulled ^= TRUE;
  195.         break;
  196.  
  197.       } /* switch (msgbuff[0]) */
  198.  
  199.     if ((event & MU_BUTTON) && (wi_handle == top_window))
  200.       if(butdown)
  201.          butdown = FALSE;
  202.       else
  203.          butdown = TRUE;
  204.  
  205.     if(event & MU_KEYBD)
  206.         do_redraw(xwork,ywork,wwork,hwork);
  207.     
  208.       wind_update(FALSE);
  209.  
  210.       } while(!((event & MU_MESAG) && (msgbuff[0] == WM_CLOSED)));
  211.  
  212.       wind_close(wi_handle);
  213.       graf_shrinkbox( xwork+wwork/2, ywork+hwork/2, gl_wbox, gl_hbox, 
  214.               xwork, ywork, wwork, hwork);
  215.       wind_delete(wi_handle);
  216.       v_clsvwk(handle);
  217.       appl_exit();
  218.  
  219. }
  220.  
  221. void main()
  222. {
  223.     appl_init();
  224.     phys_handle = graf_handle(&gl_wchar, &gl_hchar, &gl_wbox, &gl_hbox);
  225.     wind_get(0, WF_WORKXYWH, &xdesk, &ydesk, &wdesk, &hdesk);
  226.     open_vwork();
  227.         open_window("Trial");
  228.     graf_mouse(ARROW, 0x0L);
  229.  
  230.     hidden = FALSE;
  231.     fulled = FALSE;
  232.     butdown = TRUE;
  233.  
  234.     multi();
  235. }
  236.