home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / FALCON / CPX / CONFIG.LC / CONFIG.C next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  15.7 KB  |  690 lines

  1. /* ======================================================================
  2.  * FILE: CONFIG.C
  3.  * ======================================================================
  4.  * DATE: October 1, 1992  - Re-created from scratch
  5.  *     January 14, 1993 - Handle new 3D format
  6.  */
  7.  
  8.  
  9. /* INCLUDE FILES
  10.  * ======================================================================
  11.  */
  12. #include <alt\gemskel.h>
  13. #include <string.h>
  14. #include <tos.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18.  
  19. #include "country.h"
  20. #include "config.h"
  21. #include "config.rsh"
  22. #include "xstructs.h"
  23. #include "cpxdata.h"
  24.  
  25.     
  26. /* DEFINES
  27.  * ======================================================================
  28.  */
  29. #define TIME_DELAY    200L
  30.  
  31.  
  32.  
  33. /* PROTOTYPES
  34.  * ======================================================================
  35.  */
  36. CPXINFO     *cpx_init( XCPB *Xcpb );
  37. BOOLEAN  cpx_call( GRECT *rect );
  38.  
  39. void     open_vwork( void );
  40. void     close_vwork( void );
  41. void     XSelect( OBJECT *tree, int button );
  42. void     XDeselect( OBJECT *tree, int button );
  43. void     SetBlock( CPXNODE *curptr );
  44. void     myitoa(unsigned int inword, char *numbuf);
  45. void     XObjcDraw( OBJECT *tree, int obj );
  46.  
  47. void     Do3D( void );
  48. void     MakeActivator( int obj );
  49. void     MakeIndicator( int obj );
  50. void     MakeOffsets( int obj );
  51. void     MakeIndex( int obj );
  52. void     MakeTed( int obj );
  53.  
  54.  
  55. /* EXTERNALS
  56.  * ======================================================================
  57.  */
  58.  
  59.  
  60. /* GLOBALS
  61.  * ======================================================================
  62.  */
  63. XCPB    *xcpb;            /* XControl Parameter Block   */
  64. CPXINFO cpxinfo;        /* CPX Information Structure  */
  65.  
  66. OBJECT  *tree;            /* Global tree variable...    */
  67. OBJECT  *ad_tree;
  68.  
  69.  
  70. /* VDI arrays */
  71. int    contrl[12], intin[128], intout[128], ptsin[128], ptsout[128],
  72.     work_in[12], work_out[57];
  73. int     pxyarray[10];        /* input point array */
  74. int    vhandle=-1;        /* virtual workstation handle */
  75. int    hcnt=0;            /* handle count */
  76. int     numcol;
  77. int     currez;
  78.  
  79. /* AES variables */
  80. int    gl_apid, gl_hchar, gl_wchar, gl_hbox, gl_wbox;
  81. GRECT    desk;
  82. int     AES_Version;
  83.  
  84. char    TempString[50];
  85. CPXNODE *cur_ptr;
  86. CPXNODE *head_ptr;
  87. CPXNODE *tptr;
  88. char    TColorString[3];
  89. char    IColorString[3];
  90. MFORM    mouse;
  91.  
  92. /* FUNCTIONS
  93.  * ======================================================================
  94.  */
  95.     
  96.  
  97. /* cpx_init()
  98.  * ======================================================================
  99.  * cpx_init() is where a CPX is first initialized.
  100.  * There are TWO parts.
  101.  *
  102.  * PART ONE: cpx_init() is called when the CPX is first 'booted'. This is
  103.  *         where the CPX should read in its defaults and then set the
  104.  *         hardware based on those defaults.  
  105.  *
  106.  * PART TWO: The other time cpx_init() is called is when the CPX is being
  107.  *         executed.  This is where the resource is fixed up and current
  108.  *         cpx variables are updated from the hardware.  In addition,
  109.  *         this is where the CPXINFO structure should be filled out.
  110.  *
  111.  * IN:  XCPB    *Xcpb:    Pointer to the XControl Parameter Block
  112.  * OUT: CPXINFO  *ptr:    Pointer to the CP Information Structure
  113.  */            
  114. CPXINFO
  115. *cpx_init( XCPB *Xcpb )
  116. {
  117.  
  118.     appl_init();
  119.  
  120.     xcpb = Xcpb;
  121.  
  122.     currez = Getrez();                /* find current resolution */
  123.     open_vwork();
  124.     close_vwork();
  125.     numcol = work_out[13];            /* size of CLUT */
  126.     
  127.     if( xcpb->booting )
  128.     {
  129.         head_ptr = cur_ptr = (*xcpb->Get_Head_Node)();
  130.     do
  131.     {
  132.          if(( cur_ptr ) && ( cur_ptr->vacant ) )
  133.          {
  134.            cur_ptr->cpxhead.flags &= 0x7FFF;
  135.            if( cur_ptr->cpxhead.flags & 0x0004 )
  136.           cur_ptr->cpxhead.flags |= 0x8000;
  137.          }
  138.          cur_ptr = cur_ptr->next;
  139.     }while(( cur_ptr ) && ( cur_ptr->vacant ) );
  140.  
  141.         return( ( CPXINFO *)TRUE );  
  142.     }
  143.     else
  144.     {    
  145.       appl_init();
  146.       AES_Version = _AESglobal[0];
  147.  
  148.       if( !xcpb->SkipRshFix )
  149.       {
  150.            (*xcpb->rsh_fix)( NUM_OBS, NUM_FRSTR, NUM_FRIMG, NUM_TREE,
  151.                             rs_object, rs_tedinfo, rs_strings, rs_iconblk,
  152.                             rs_bitblk, rs_frstr, rs_frimg, rs_trindex,
  153.                             rs_imdope );
  154.       }
  155.  
  156.       ad_tree   = (OBJECT *)rs_trindex[ CONFIG ];
  157.  
  158.       /* Initialize the CPXINFO structure */           
  159.       cpxinfo.cpx_call   = cpx_call;
  160.       cpxinfo.cpx_draw   = NULL;
  161.       cpxinfo.cpx_wmove  = NULL;
  162.       cpxinfo.cpx_timer  = NULL;
  163.       cpxinfo.cpx_key    = NULL;
  164.       cpxinfo.cpx_button = NULL;
  165.       cpxinfo.cpx_m1      = NULL;
  166.       cpxinfo.cpx_m2     = NULL;
  167.       cpxinfo.cpx_hook   = NULL;
  168.       cpxinfo.cpx_close  = NULL;
  169.  
  170.       /* Convert to 3D if possible - ONLY if AES 0x0330 or Greater!
  171.        * AND if # of pens is greater than LWHITE
  172.        */
  173.       if( !xcpb->SkipRshFix )
  174.       {
  175.         if(( AES_Version >= 0x0330 )
  176.       && ( numcol > LWHITE ) )
  177.         {
  178.        Do3D();
  179.     }
  180.       }
  181.  
  182.  
  183.       /* Return the pointer to the CPXINFO structure to XCONTROL */
  184.       return( &cpxinfo );
  185.     }
  186. }
  187.  
  188.  
  189.  
  190.  
  191. /* cpx_call()
  192.  * ======================================================================
  193.  * Called ONLY when the CPX is being executed. Note that it is CPX_INIT()
  194.  * that returned the ptr to cpx_call().
  195.  * CPX_CALL() is the entry point to displaying and manipulating the
  196.  * dialog box.
  197.  *
  198.  * IN: GRECT *rect:    Ptr to a GRECT that describes the current work
  199.  *            area of the XControl window.
  200.  *
  201.  * OUT:
  202.  *   FALSE:     The CPX has exited and no more messages are
  203.  *        needed.  XControl will either return to its
  204.  *        main menu or close its windows.
  205.  *        This is used by XForm_do() type CPXs.
  206.  *
  207.  *   TRUE:    The CPX requests that XCONTROL continue to
  208.  *        send AES messages.  This is used by Call-type CPXs.
  209.  */
  210. BOOLEAN
  211. cpx_call( GRECT *rect )
  212. {
  213.      int     button;
  214.      int     quit = 0;
  215.      WORD    msg[8];
  216.      int     num;
  217.      MRETS   mk;
  218.      unsigned int temp;
  219.  
  220.      ActiveTree( ad_tree );
  221.  
  222.      ObX( ROOT ) = rect->g_x;
  223.      ObY( ROOT ) = rect->g_y;
  224.  
  225.      head_ptr = cur_ptr = (*xcpb->Get_Head_Node)();
  226.      SetBlock( cur_ptr );
  227.  
  228.      ObjcDraw( tree, ROOT, MAX_DEPTH, NULL );
  229.      
  230.      do
  231.      {
  232.     button = (*xcpb->Xform_do)( tree, 0, msg );
  233.  
  234.     if(( button != -1 ) && ( button & 0x8000 ) )
  235.        button &= 0x7fff;
  236.  
  237.          switch( button )
  238.          {
  239.  
  240.         
  241.             case OK:      strcpy( cur_ptr->cpxhead.title_txt, TempString );
  242.                   cur_ptr->cpxhead.i_color = IconColor( ICON );
  243.                   cur_ptr->cpxhead.t_color = TedColor( TEXT );
  244.  
  245.        case CANCEL:  quit = TRUE;
  246.                          Deselect( button );
  247.                          break;
  248.  
  249.  
  250.        case SAVE:    /* save current values */
  251.             if ((*xcpb->XGen_Alert)(SAVE_DEFAULTS) == TRUE)
  252.             {
  253.                 strcpy( cur_ptr->cpxhead.title_txt, TempString );
  254.                      cur_ptr->cpxhead.i_color = IconColor( ICON );
  255.                      cur_ptr->cpxhead.t_color = TedColor( TEXT );
  256.  
  257.                 temp = cur_ptr->cpxhead.flags;
  258.                 cur_ptr->cpxhead.flags &= 0x7FFB;
  259.                 temp &= 0x7FFF;
  260.  
  261.                 if( IsSelected( YES1 ) )
  262.                 {
  263.                 cur_ptr->cpxhead.flags |= 0x0004;
  264.                 temp |= 0x8000;
  265.                 }
  266.                 (*xcpb->Save_Header)( cur_ptr );
  267.                 cur_ptr->cpxhead.flags = temp;
  268.             }
  269.             XDeselect( tree, button );
  270.                break;
  271.  
  272.        case LEFT:   do
  273.             {
  274.               tptr = head_ptr;
  275.               if( tptr != cur_ptr )
  276.               {     
  277.                 while( tptr && ( tptr->next->vacant ) && 
  278.                  ( tptr->next != cur_ptr ))
  279.                     tptr = tptr->next;
  280.  
  281.                 if( tptr && ( tptr->next->vacant ) && 
  282.                    ( tptr->next == cur_ptr ))
  283.                 {
  284.                    if( !IsSelected( LEFT ) )
  285.                   XSelect( tree, LEFT );
  286.                    cur_ptr = tptr;
  287.                    SetBlock( cur_ptr );
  288.                    ObjcDraw( tree, BASE, MAX_DEPTH, NULL );
  289.                    XObjcDraw( tree, TEXTNUM );
  290.                    XObjcDraw( tree, ICONNUM );
  291.                    XObjcDraw( tree, YES1 );
  292.                    XObjcDraw( tree, NO1 );
  293.                 }
  294.               }
  295.               Graf_mkstate( &mk );
  296.  
  297.                   if( mk.buttons )
  298.                    EvntTimer( TIME_DELAY );
  299.             }while( mk.buttons );
  300.  
  301.             if( IsSelected( LEFT ) )
  302.                XDeselect( tree, LEFT );
  303.             break;
  304.  
  305.        case RIGHT:
  306.             do
  307.             {
  308.               if(( cur_ptr->next ) && ( cur_ptr->next->vacant ))
  309.               {
  310.                  if( !IsSelected( RIGHT ) )
  311.                     XSelect( tree, RIGHT );
  312.                  cur_ptr = cur_ptr->next;
  313.                  SetBlock( cur_ptr );
  314.                  ObjcDraw( tree, BASE, MAX_DEPTH, NULL );
  315.                  XObjcDraw( tree, TEXTNUM );
  316.                  XObjcDraw( tree, ICONNUM );
  317.                  XObjcDraw( tree, YES1 );
  318.                  XObjcDraw( tree, NO1 );
  319.               }
  320.                 Graf_mkstate( &mk );
  321.                   if( mk.buttons )
  322.                  EvntTimer( TIME_DELAY );
  323.             }while( mk.buttons );
  324.  
  325.             if( IsSelected( RIGHT ) )
  326.                XDeselect( tree, RIGHT );
  327.             break;
  328.  
  329.  
  330.        case TEXTLFT: do
  331.              {
  332.                num = TedCText( TEXT );
  333.                if( num > 0 )
  334.                {
  335.                  if( !IsSelected( TEXTLFT ) )
  336.                 XSelect( tree, TEXTLFT );
  337.                  num--;
  338.                  TedCText( TEXT ) = num;
  339.                  myitoa( num, &TColorString[0] );
  340.                  TedText( TEXTNUM ) = TColorString;
  341.                  XObjcDraw( tree, TEXTNUM );
  342.                  ObjcDraw( tree, TEXT, MAX_DEPTH, NULL );
  343.                }
  344.                Graf_mkstate( &mk );
  345.                    if( mk.buttons )
  346.                  EvntTimer( TIME_DELAY );
  347.              }while( mk.buttons );
  348.             
  349.              if( IsSelected( TEXTLFT ) )
  350.                 XDeselect( tree, TEXTLFT );
  351.              break;
  352.  
  353.  
  354.        case TEXTRT:  do
  355.              {
  356.                num = TedCText( TEXT );
  357.                if( num < 15 )
  358.                {
  359.                  if( !IsSelected( TEXTRT ) )
  360.                 XSelect( tree, TEXTRT );
  361.                  num++;
  362.                  TedCText( TEXT ) = num;
  363.                  myitoa( num, &TColorString[0] );
  364.                  TedText( TEXTNUM ) = TColorString;
  365.                  XObjcDraw( tree, TEXTNUM );
  366.                  ObjcDraw( tree, TEXT, MAX_DEPTH, NULL );
  367.                }
  368.                Graf_mkstate( &mk );
  369.                    if( mk.buttons )
  370.                  EvntTimer( TIME_DELAY );
  371.              }while( mk.buttons );
  372.  
  373.              if( IsSelected( TEXTRT ) )
  374.                XDeselect( tree, TEXTRT );
  375.              break;
  376.  
  377.        case ICONLFT: do
  378.              {
  379.                num = IconFColor( ICON );
  380.                if( num > 0 )
  381.                {
  382.                  if( !IsSelected( ICONLFT ) )
  383.                 XSelect( tree, ICONLFT );
  384.                  num--;
  385.                  IconFColor( ICON ) = num;
  386.                  myitoa( num, &IColorString[0] );
  387.                  TedText( ICONNUM ) = IColorString;
  388.                  XObjcDraw( tree, ICONNUM );
  389.                  ObjcDraw( tree, ICON, MAX_DEPTH, NULL );
  390.                }
  391.                Graf_mkstate( &mk );
  392.                    if( mk.buttons )
  393.                     EvntTimer( TIME_DELAY );
  394.              }while( mk.buttons );
  395.  
  396.              if( IsSelected( ICONLFT ) )
  397.                XDeselect( tree, ICONLFT );
  398.              break;
  399.  
  400.        case ICONRT:  do
  401.              {
  402.                num = IconFColor( ICON );
  403.                if( num < 15 )
  404.                {
  405.                  if( !IsSelected( ICONRT ) )
  406.                 XSelect( tree, ICONRT );
  407.                  num++;
  408.                  IconFColor( ICON ) = num;
  409.                  myitoa( num, &IColorString[0] );
  410.                  TedText( ICONNUM ) = IColorString;
  411.                  XObjcDraw( tree, ICONNUM );
  412.                  ObjcDraw( tree, ICON, MAX_DEPTH, NULL );
  413.                }
  414.                Graf_mkstate( &mk );
  415.                    if( mk.buttons )
  416.                  EvntTimer( TIME_DELAY );
  417.              }while( mk.buttons );
  418.             
  419.              if( IsSelected( ICONRT ) )
  420.                 XDeselect( tree, ICONRT );
  421.              break;
  422.  
  423.             default:    if( button == -1 )
  424.                  {
  425.                     switch( msg[0] )
  426.                     {
  427.                       case WM_REDRAW: /* redraw the cpx */
  428.                                    break;
  429.                                    
  430.                       case AC_CLOSE:  /* treated like a cancel */
  431.                       case WM_CLOSED: quit = TRUE;     /* treated like an OK */
  432.                          break;
  433.                          
  434.                  case CT_KEY:
  435.                               break;             
  436.                       default:
  437.                               break;
  438.                     }
  439.                  }
  440.                  break;
  441.          }
  442.      }while( !quit);
  443.      return( FALSE );
  444. }
  445.  
  446.  
  447.  
  448. /*
  449.  * Open virtual workstation
  450.  */
  451. void
  452. open_vwork(void)
  453. {
  454.   int i;
  455.   
  456.   if (hcnt == 0) {
  457.       for (i = 1; i < 10;)
  458.         work_in[i++] = 1;
  459.       work_in[0] = currez + 2;
  460.       work_in[10] = 2;
  461.       vhandle = xcpb->handle;
  462.       v_opnvwk(work_in, &vhandle, work_out);
  463.   }
  464.   hcnt++;
  465. }
  466.  
  467.  
  468. /*
  469.  * Close virtual workstation
  470.  */
  471. void
  472. close_vwork(void)
  473. {
  474.     hcnt--;
  475.     if( !hcnt )
  476.     {
  477.      v_clsvwk(vhandle);
  478.     vhandle = -1;
  479.     }
  480. }
  481.  
  482.  
  483.  
  484. /*    
  485.  * Convert binary number to ascii value
  486.  */
  487. void
  488. myitoa(unsigned int inword, char *numbuf)            
  489. {    
  490.     unsigned int temp1, value;
  491.     register int i, j;
  492.     char tmpbuf[10];
  493.     register char *ascbuf;
  494.     
  495.     ascbuf = numbuf;
  496.     i = 0;                /* if the value is non zero  */
  497.  
  498.     if (!inword)    
  499.     *ascbuf++ = '0';
  500.     else {
  501.     value = inword;
  502.     while(value) {
  503.         temp1 = value % 10;        /*  find the remainder    */
  504.         temp1 += 0x0030;        /*  convert to ASCII    */
  505.         tmpbuf[i++] = temp1;    /*  buffer is reverse    */
  506.         value = value / 10;
  507.     }
  508.  
  509.     for (j = i-1; j >= 0; j--)     /* reverse it back    */
  510.         *ascbuf++ = tmpbuf[j];
  511.     }
  512.  
  513.     *ascbuf = 0;            /* end of string mark    */
  514.     return;
  515. }
  516.  
  517.  
  518. void
  519. XDeselect( OBJECT *tree, int button )
  520. {
  521.    GRECT rect;
  522.  
  523.    Deselect( button );
  524.    rect = ObRect( button );
  525.    objc_offset( tree, button, &rect.g_x, &rect.g_y );
  526.    rect.g_x -= 2;
  527.    rect.g_y -= 2;
  528.    rect.g_w += 4;
  529.    rect.g_h += 4;
  530.    ObjcDraw( tree, button, MAX_DEPTH, &rect );
  531. }
  532.  
  533. void
  534. XSelect( OBJECT *tree, int button )
  535. {
  536.    GRECT rect;
  537.  
  538.    Select( button );
  539.    rect = ObRect( button );
  540.    objc_offset( tree, button, &rect.g_x, &rect.g_y );
  541.    rect.g_x -= 2;
  542.    rect.g_y -= 2;
  543.    rect.g_w += 4;
  544.    rect.g_h += 4;
  545.    ObjcDraw( tree, button, MAX_DEPTH, &rect );
  546. }
  547.  
  548.  
  549.  
  550. void
  551. SetBlock( CPXNODE *curptr )
  552. {
  553.      unsigned int  num;
  554.  
  555.      strcpy( TempString, curptr->cpxhead.title_txt );
  556.      TedText( TEXT )   = TempString;
  557.      TedColor( TEXT )  = curptr->cpxhead.t_color;
  558.      IconWidth(ICON )  = 32;
  559.      IconHeight( ICON )= 24;
  560.      IconData( ICON )  = curptr->cpxhead.sm_icon;
  561.      IconText( ICON )  = curptr->cpxhead.i_text;
  562.      IconColor( ICON ) = curptr->cpxhead.i_color;
  563.     
  564.  
  565.      num = TedCText( TEXT );
  566.      myitoa( num, &TColorString[0] );
  567.      TedText( TEXTNUM ) = TColorString;
  568.  
  569.      num = IconFColor( ICON );
  570.      myitoa( num, &IColorString[0] );
  571.      TedText( ICONNUM ) = IColorString;
  572.  
  573.      Deselect( YES1 );
  574.      Deselect( NO1 );    
  575.      if( curptr->cpxhead.flags & 0x8000 )
  576.        Select( YES1 );
  577.      else
  578.        Select( NO1 );
  579. }
  580.  
  581.  
  582. void
  583. XObjcDraw( OBJECT *tree, int obj )
  584. {
  585.    GRECT rect;
  586.  
  587.    rect = ObRect( obj );
  588.    objc_offset( tree, obj, &rect.g_x, &rect.g_y );
  589.    rect.g_x -= 2;
  590.    rect.g_y -= 2;
  591.    rect.g_w += 4;
  592.    rect.g_h += 4;
  593.    ObjcDraw( tree, obj, MAX_DEPTH, &rect );
  594. }
  595.  
  596.  
  597.  
  598. void
  599. Do3D( void )
  600. {
  601.          ActiveTree( ad_tree );
  602.        MakeActivator( SAVE );
  603.        MakeActivator( OK );
  604.        MakeActivator( CANCEL );
  605.  
  606.        MakeOffsets( SAVE );
  607.        MakeOffsets( OK );
  608.        MakeOffsets( CANCEL );
  609.  
  610.        MakeActivator( LEFT );
  611.        MakeIndex( LEFT );
  612.  
  613.        MakeActivator( RIGHT );
  614.        MakeIndex( RIGHT );
  615.  
  616.        MakeOffsets( LEFT );
  617.        MakeOffsets( RIGHT );
  618.  
  619.        MakeActivator( TEXTNUM );
  620.        MakeTed( TEXTNUM );
  621.  
  622.        MakeActivator( TEXTLFT );
  623.        MakeIndex( TEXTLFT );
  624.  
  625.        MakeActivator( TEXTRT );
  626.        MakeIndex( TEXTRT );
  627.  
  628.        MakeActivator( ICONNUM );
  629.        MakeTed( ICONNUM );
  630.  
  631.        MakeActivator( ICONLFT );
  632.        MakeIndex( ICONLFT );
  633.  
  634.        MakeActivator( ICONRT );
  635.        MakeIndex( ICONRT );
  636.  
  637.        MakeIndicator( YES1 );
  638.        MakeIndicator( NO1 );
  639.  
  640.        MakeOffsets( TEXTLFT );
  641.        MakeOffsets( TEXTRT );
  642.        MakeOffsets( TEXTNUM );
  643.        MakeOffsets( ICONLFT );
  644.        MakeOffsets( ICONRT );
  645.        MakeOffsets( ICONNUM );
  646. }
  647.  
  648.  
  649.  
  650. void
  651. MakeActivator( int obj )
  652. {
  653.    ObFlags( obj ) |= IS3DOBJ;
  654.    ObFlags( obj ) |= IS3DACT;
  655. }
  656.  
  657.  
  658. void
  659. MakeIndicator( int obj )
  660. {
  661.   ObFlags( obj ) |= IS3DOBJ;
  662.   ObFlags( obj ) &= ~IS3DACT;
  663. }
  664.  
  665.  
  666. void
  667. MakeOffsets( int obj )
  668. {
  669.    ObX( obj ) += 2;
  670.    ObY( obj ) += 2;
  671.    ObW( obj ) -= 4;
  672.    ObH( obj ) -= 4;
  673. }
  674.  
  675.  
  676.  
  677. void
  678. MakeIndex( int obj )
  679. {
  680.   ObIndex( obj ) = (VOID*)(( (LONG)ObIndex( obj ) & 0xffffff70L ) | LWHITE | 0x70L );
  681. }
  682.  
  683.  
  684.  
  685. void
  686. MakeTed( int obj )
  687. {
  688.   TedColor( obj ) = ( TedColor( obj ) & 0xFF70 ) | LWHITE | 0x70;
  689. }
  690.