home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
look
/
source
/
menu.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
3KB
|
143 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <mos.h>
#define ERR (-1)
#define FRACOL 15
#define BAKCOL 8
#define CHRCOL 15
int MENU_sub(lx,ly,rx,ry,fra,bak)
int lx,ly,rx,ry,fra,bak;
{
int no,i,y;
int sw,mosx,mosy;
MOS_rdpos(&sw,&mosx,&mosy);
if ( mosx >= lx && mosx <= rx && mosy > ly && mosy < ry ) {
no = (mosy - ly) / 16;
y = ly + no * 16;
} else
no = ERR;
do {
if ( no != ERR )
fbox(lx,y,rx,y+15,fra,bak,4);
do {
MOS_rdpos(&sw,&mosx,&mosy);
if ( mosx >= lx && mosx <= rx &&
mosy > ly && mosy < ry )
i = (mosy - ly) / 16;
else
i = ERR;
} while ( sw != 0 && no == i );
if ( no != ERR )
fbox(lx,y,rx,y+15,fra,bak,4);
if ( (no = i) != ERR )
y = ly + no * 16;
} while ( sw != 0 );
/*****************
if ( no >= 0 ) {
fbox(lx,y,rx,y+15,fra,bak,4);
if ( mosclip(sw,mosx,mosy) == 0 )
no = ERR;
fbox(lx,y,rx,y+15,fra,bak,4);
}
****************/
return no;
}
int MENU_select(menu)
char *menu[];
{
int len,max,no,i;
int sw,mosx,mosy;
int lx,ly,rx,ry,sx,sy;
char *bkvram;
MOS_rdpos(&sw,&mosx,&mosy);
for ( len = max = 0 ; menu[max] != NULL ; max++ ) {
if ( len < strlen(menu[max]) )
len = strlen(menu[max]);
}
sx = len * 8 + 16;
sy = max * 16 + 8;
if ( (lx = mosx - sx / 2) < 0 )
lx = 0;
if ( (rx = lx + sx) >= 1024 ) {
lx = 1023 - sx; rx = 1023;
}
if ( (ly = mosy - 8) < 0 )
ly = 0;
if ( (ry = ly + sy) >= 512 ) {
ly = 511 - sy; ry = 511;
}
lx &= 0xfffe; rx &= 0xfffe;
bkvram = (char *)getvram(lx,ly,rx,ry);
fbox(lx,ly,rx,ry,FRACOL,BAKCOL,0);
for ( i=0 ; i < max ; i++ )
wrtstr(menu[i],lx + 8,ly + 4 + i * 16,0,CHRCOL,BAKCOL);
do {
MOS_rdpos(&sw,&mosx,&mosy);
} while ( sw == 0 &&
mosx >= lx && mosx <= rx &&
mosy >= ly && mosy <= ry );
if ( sw != 0 )
no = MENU_sub(lx + 4,ly + 4,rx - 4,ry - 4,FRACOL,FRACOL);
else
no = ERR;
putvram(bkvram,lx,ly,rx,ry);
free(bkvram);
return no;
}
void MSG_disp(char *str,int col)
{
int i,b,x,y;
int lx,ly,rx,ry,sx;
char *bkvram;
MOS_rdpos(&b,&x,&y);
sx = strlen(str) * 8 + 16;
if ( (lx = x - sx / 2) < 0 )
lx = 0;
if ( (rx = lx + sx) >= 1024 ) {
lx = 1023 - sx; rx = 1023;
}
if ( (ly = y - 8) < 0 )
ly = 0;
if ( (ry = ly + 24) >= 512 ) {
ly = 480 ; ry = 504;
}
lx &= 0xfffe; rx &= 0xfffe;
bkvram = (char *)getvram(lx,ly,rx,ry);
fbox(lx,ly,rx,ry,col,BAKCOL,0);
wrtstr(str,lx + 8,ly + 4,0,col,BAKCOL);
i = 50000;
do {
MOS_rdpos(&b,&x,&y);
i--;
} while ( i > 0 && x >= lx && x <= rx && y >= ly && y <= ry );
putvram(bkvram,lx,ly,rx,ry);
free(bkvram);
}
void DSP_error(char *frm,char *para)
{
char tmp[256];
sprintf(tmp,frm,para);
MSG_disp(tmp,10);
}