home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine 1996 / ARCHIVE_96.iso / discs / mag_discs / volume_2 / issue_06 / wimp_te / LOADINGSRC < prev    next >
Text File  |  1989-01-27  |  3KB  |  164 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <arthur.h>
  5.  
  6. #define BLOCK_SIZE 0x200
  7. #define IND_SIZE 0x100
  8. #define INDEX_SIZE 100
  9.  
  10. int block[BLOCK_SIZE];
  11. int indirect[IND_SIZE];
  12.  
  13. int *iptr;
  14. int *iend;
  15. int *blockend;
  16.  
  17. int main()
  18. {
  19.    void Open_Template(char *);
  20.    void Load_Template(char*);
  21.    void Close_Template(void);
  22.  
  23.    univ_block ub;
  24.    error err;
  25.  
  26.    system("rmload $.Resources.Modules.FormEd");
  27.    system("Set Font$Prefix $.Resources.Fonts");
  28.  
  29.    mode(12);
  30.    w_initialise(&err);
  31.    system("Print !Palette");
  32.    system("Pointer 1");
  33.  
  34.    Open_Template("!Templates");
  35.    Load_Template("Q");
  36.    Close_Template();
  37.  
  38.    create_menu((menu_block *) block, 500, 500, &err);
  39.  
  40.    while (1)
  41.    {
  42.       switch(poll_wimp(0, &ub, &err))
  43.       {
  44.       case 2 : open_wind(&ub.w, &err); break;
  45.       case 3 : close_wind(ub.w.wind_handle, &err); break;
  46.       case 6 : if ((ub.a[3] == -1) && (ub.a[2] == 2))
  47.                   create_menu((menu_block *) block, mouseX(), mouseY(),&err);
  48.                break;
  49.       default : break;
  50.       }
  51.    }
  52.  
  53.    return 0;
  54. }
  55.  
  56. void Load_Template(name)
  57. char *name;
  58. {
  59.    void Load_Temp(char *, int *, int *);
  60.  
  61.    int type;
  62.  
  63.    iptr = indirect;
  64.    iend = iptr + IND_SIZE;
  65.  
  66.    blockend = block;
  67.    Load_Temp(name, block, &type);
  68. }
  69.  
  70. void Load_Temp(tname, b, type)
  71. char *tname;
  72. int  *b, *type;
  73. {
  74.    void Get_Identifier(int, char *);
  75.  
  76.    reg_set reg;
  77.    char name[12];
  78.    int *x, t;
  79.  
  80.    reg.r[1] = (int) b;
  81.    reg.r[2] = (int) iptr;
  82.    reg.r[3] = (int) iend;
  83.    reg.r[4] = -1;
  84.    reg.r[5] = (int) tname;
  85.    reg.r[6] = 0;
  86.    reg = swi(0x80f02, ®);
  87.  
  88.    *type = reg.r[0];
  89.    iptr = (int *) reg.r[2];
  90.  
  91.    if (*type == 1)
  92.       return;             /* window so finish here */
  93.  
  94.    blockend ++;                        /* skip one word */
  95.    do {
  96.       blockend += 6;                   /* goto next item */
  97.    } while((*blockend & LAST_ITEM) == 0);
  98.    blockend += 6;
  99.  
  100.    x = b + 1;
  101.    do {
  102.       x += 6;
  103.       if (*(x+1) > -1)
  104.       {
  105.          Get_Identifier(*(x+1), name);
  106.          *(x+1) = (int) blockend;
  107.          t = 0;
  108.          Load_Temp(name, blockend, &t);
  109.          if (t == 1)
  110.          {
  111.             error e;
  112. /* next line generates a non-serious 'implicit case of pointer to none equal
  113.   pointer' error but it doesn't actually affect the operation of the routine */
  114.             *(x+1) = create_wind(blockend, &e);
  115.          }
  116.       }
  117.    } while ((*x & LAST_ITEM) == 0);
  118. }
  119.  
  120. void Get_Identifier(pos, name)
  121. int pos;
  122. char *name;
  123. {
  124.    reg_set reg;
  125.    error *err;
  126.  
  127.    reg.r[1] = pos;
  128.    err = swix(0x80f03, ®);
  129.    if (err != NULL)
  130.    {
  131.       printf("Error : %s\n",err->errmess);
  132.       exit(0);
  133.    }
  134.    strncpy(name, (char *) reg.r[1], 12);
  135. }
  136.  
  137. void Open_Template(filename)
  138. char *filename;
  139. {
  140.    reg_set reg;
  141.    error *err;
  142.  
  143.    reg.r[1] = (int) filename;
  144.    err = swix(0x80f00, ®);
  145.    if (err != NULL)
  146.    {
  147.       printf("Error : %d %s\n",err->errnum,err->errmess);
  148.       exit(0);
  149.    }
  150. }
  151.  
  152. void Close_Template(void)
  153. {
  154.    reg_set reg;
  155.    error *err;
  156.  
  157.    err = swix(0x80f01, ®);
  158.    if (err != NULL)
  159.    {
  160.       printf("Error : %s\n",err->errmess);
  161.       exit(0);
  162.    }
  163. }
  164.