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 >
Wrap
Text File
|
1989-01-27
|
3KB
|
164 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arthur.h>
#define BLOCK_SIZE 0x200
#define IND_SIZE 0x100
#define INDEX_SIZE 100
int block[BLOCK_SIZE];
int indirect[IND_SIZE];
int *iptr;
int *iend;
int *blockend;
int main()
{
void Open_Template(char *);
void Load_Template(char*);
void Close_Template(void);
univ_block ub;
error err;
system("rmload $.Resources.Modules.FormEd");
system("Set Font$Prefix $.Resources.Fonts");
mode(12);
w_initialise(&err);
system("Print !Palette");
system("Pointer 1");
Open_Template("!Templates");
Load_Template("Q");
Close_Template();
create_menu((menu_block *) block, 500, 500, &err);
while (1)
{
switch(poll_wimp(0, &ub, &err))
{
case 2 : open_wind(&ub.w, &err); break;
case 3 : close_wind(ub.w.wind_handle, &err); break;
case 6 : if ((ub.a[3] == -1) && (ub.a[2] == 2))
create_menu((menu_block *) block, mouseX(), mouseY(),&err);
break;
default : break;
}
}
return 0;
}
void Load_Template(name)
char *name;
{
void Load_Temp(char *, int *, int *);
int type;
iptr = indirect;
iend = iptr + IND_SIZE;
blockend = block;
Load_Temp(name, block, &type);
}
void Load_Temp(tname, b, type)
char *tname;
int *b, *type;
{
void Get_Identifier(int, char *);
reg_set reg;
char name[12];
int *x, t;
reg.r[1] = (int) b;
reg.r[2] = (int) iptr;
reg.r[3] = (int) iend;
reg.r[4] = -1;
reg.r[5] = (int) tname;
reg.r[6] = 0;
reg = swi(0x80f02, ®);
*type = reg.r[0];
iptr = (int *) reg.r[2];
if (*type == 1)
return; /* window so finish here */
blockend ++; /* skip one word */
do {
blockend += 6; /* goto next item */
} while((*blockend & LAST_ITEM) == 0);
blockend += 6;
x = b + 1;
do {
x += 6;
if (*(x+1) > -1)
{
Get_Identifier(*(x+1), name);
*(x+1) = (int) blockend;
t = 0;
Load_Temp(name, blockend, &t);
if (t == 1)
{
error e;
/* next line generates a non-serious 'implicit case of pointer to none equal
pointer' error but it doesn't actually affect the operation of the routine */
*(x+1) = create_wind(blockend, &e);
}
}
} while ((*x & LAST_ITEM) == 0);
}
void Get_Identifier(pos, name)
int pos;
char *name;
{
reg_set reg;
error *err;
reg.r[1] = pos;
err = swix(0x80f03, ®);
if (err != NULL)
{
printf("Error : %s\n",err->errmess);
exit(0);
}
strncpy(name, (char *) reg.r[1], 12);
}
void Open_Template(filename)
char *filename;
{
reg_set reg;
error *err;
reg.r[1] = (int) filename;
err = swix(0x80f00, ®);
if (err != NULL)
{
printf("Error : %d %s\n",err->errnum,err->errmess);
exit(0);
}
}
void Close_Template(void)
{
reg_set reg;
error *err;
err = swix(0x80f01, ®);
if (err != NULL)
{
printf("Error : %s\n",err->errmess);
exit(0);
}
}