home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
whisper
/
source
/
event.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
7KB
|
329 lines
/*
マウス イベント処理ライブラリ
1990.9.11 Make By ken
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <egb.h>
#include <mos.h>
#include <msdos.cf>
#include "graphic.h"
#include "event.h"
#include "coldef.h"
#define TRUE 1
#define FALSE 0
#define ERR (-1)
#define MAX_EVENT 256
void CHK_snd(void);
void CHK_eup(void);
extern char work[];
static int evt_max=0;
static int evt_free=ERR;
static int last_node=ERR;
static EVENT evt_node[MAX_EVENT];
static BLOCK *clip_save=NULL;
int EVT_get_node(void)
{
int no;
if ( (no = evt_free) != ERR )
evt_free = evt_node[evt_free].level;
else if ( evt_max >= MAX_EVENT )
return ERR;
else
no = evt_max++;
return no;
}
void EVT_free_node(int no)
{
evt_node[no].flg = FALSE;
evt_node[no].level = evt_free;
evt_free = no;
if ( no == last_node )
last_node = ERR;
}
void EVT_level_free(int level)
{
int i;
register EVENT *ep;
for ( i = 0 ; i < MAX_EVENT ; i++ ) {
ep = &(evt_node[i]);
if ( ep->flg != FALSE && ep->level == level )
EVT_free_node(i);
}
}
EVENT *EVT_set_node(int x1,int y1,int x2,int y2,
int level,void (*proc)(),int no)
{
int nodo;
register EVENT *ep;
if ( (nodo = EVT_get_node()) == ERR )
return NULL;
ep = &(evt_node[nodo]);
ep->flg = TRUE;
ep->level = level;
ep->now = 0;
ep->no = no;
ep->x1 = x1;
ep->y1 = y1;
ep->x2 = x2;
ep->y2 = y2;
ep->proc = proc;
return ep;
}
int EVT_chk(register EVENT *ep,int x,int y,int sw)
{
int fg;
fg = (x >= ep->x1 && x <= ep->x2 &&
y >= ep->y1 && y <= ep->y2 ) ? TRUE:FALSE;
switch(ep->now) {
case EVT_OFF_MOS:
case EVT_MOVE_MOS:
case EVT_DLSEL_MOS:
case EVT_SELECT_MOS:
ep->now = EVT_NON;
break;
case EVT_NON:
if ( fg != FALSE ) {
ep->now = (sw != 0 ? EVT_CLIP_MOS:EVT_ON_MOS);
(*ep->proc)(ep,x,y,sw);
}
break;
case EVT_ON_MOS:
if ( fg != FALSE ) {
if ( sw != 0 ) {
ep->now = EVT_CLIP_MOS;
(*ep->proc)(ep,x,y,sw);
}
} else {
ep->now = EVT_OFF_MOS;
(*ep->proc)(ep,x,y,sw);
}
break;
case EVT_CLIP_MOS:
if ( fg != FALSE ) {
if ( sw == 0 ) {
ep->now = EVT_SELECT_MOS;
(*ep->proc)(ep,x,y,sw);
}
} else {
ep->now = (sw != 0 ? EVT_DOLACK_MOS : EVT_MOVE_MOS);
(*ep->proc)(ep,x,y,sw);
}
break;
case EVT_DOLACK_MOS:
if ( sw == FALSE )
ep->now = EVT_DLSEL_MOS;
(*ep->proc)(ep,x,y,sw);
break;
case EVT_REP_MOS:
if ( fg != FALSE ) {
if ( sw == 0 ) {
ep->now = EVT_SELECT_MOS;
(*ep->proc)(ep,x,y,sw);
} else
(*ep->proc)(ep,x,y,sw);
} else {
ep->now = (sw != 0 ? EVT_DOLACK_MOS : EVT_MOVE_MOS);
(*ep->proc)(ep,x,y,sw);
}
break;
}
return ep->now;
}
void EVT_loop(int level)
{
int i,x,y,sw;
register EVENT *ep;
CHK_snd();
CHK_eup();
MOS_rdpos(&sw,&x,&y);
if ( last_node != ERR ) {
ep = &evt_node[last_node];
if ( ep->flg != FALSE && ep->level >= level &&
EVT_chk(ep,x,y,sw) != EVT_NON )
return;
}
last_node = ERR;
for ( i = 0 ; i < MAX_EVENT ; i++ ) {
ep = &(evt_node[i]);
if ( ep->flg != FALSE && ep->level >= level &&
EVT_chk(ep,x,y,sw) != EVT_NON ) {
last_node = i;
return;
}
}
}
void EVT_sw(int x1,int y1,char *str,
int chrcol,int boxcol,
int level,void (*proc)(),int no)
{
int x2,y2;
x2 = x1+strlen(str)*8+4;
y2 = y1+11;
DSP_box(x1,y1,x2,y2,COL_LINE,boxcol);
wrtstr(str,
page_ofs,(x1+2)/2 + (y1+2) * 512,
col_cnv[chrcol],col_cnv[boxcol],8);
EVT_set_node(x1,y1,x2,y2,level,proc,no);
}
void EVT_big_sw(int x1,int y1,char *str,
int chrcol,int boxcol,
int level,void (*proc)(),int no)
{
int x2,y2;
x2 = x1+strlen(str)*8+4;
y2 = y1+17;
DSP_box(x1,y1,x2,y2,COL_LINE,boxcol);
wrtstr(str,
page_ofs,(x1+2)/2 + (y1+1) * 512,
col_cnv[chrcol],col_cnv[boxcol],16);
EVT_set_node(x1,y1,x2,y2,level,proc,no);
}
void EVT_clip_on(register EVENT *ep)
{
struct {
char *ptn;
short int sel;
short int x1,y1;
short int x2,y2;
} para;
struct {
short int count;
short int x1,y1,x2,y2,x3,y3;
} connect;
int n;
char *ptn;
n = ((ep->x2 - ep->x1) / 2 + 1) * (ep->y2 - ep->y1 + 1);
if ( (ptn = (char *)malloc(n)) == NULL )
return;
MOS_disp(FALSE);
clip_save = DSP_push_vram(ep->x1,ep->y1,ep->x2,ep->y2);
para.ptn = ptn;
para.sel = getds();
para.x1 = ep->x1;
para.y1 = ep->y1;
para.x2 = ep->x2-1;
para.y2 = ep->y2-1;
EGB_getBlock(work,(char *)¶);
para.ptn = ptn;
para.sel = getds();
para.x1 = ep->x1+1;
para.y1 = ep->y1+1;
para.x2 = ep->x2;
para.y2 = ep->y2;
EGB_putBlock(work,0,(char *)¶);
connect.count = 3;
connect.x1 = ep->x1;
connect.y1 = ep->y2;
connect.x2 = ep->x1;
connect.y2 = ep->y1;
connect.x3 = ep->x2;
connect.y3 = ep->y1;
EGB_color(work,0,0);
EGB_connect(work,(char *)&connect);
MOS_disp(TRUE);
free(ptn);
}
void EVT_clip_off(register EVENT *ep)
{
MOS_disp(FALSE);
DSP_pop_vram(clip_save);
clip_save = NULL;
MOS_disp(TRUE);
/***************************************
struct {
char *ptn;
short int sel;
short int x1,y1;
short int x2,y2;
} para;
struct {
short int count;
short int x1,y1,x2,y2,x3,y3;
} connect;
int n;
char *ptn;
n = ((ep->x2 - ep->x1) / 2 + 1) * (ep->y2 - ep->y1 + 1);
if ( (ptn = (char *)malloc(n)) == NULL )
return;
MOS_disp(FALSE);
para.ptn = ptn;
para.sel = getds();
para.x1 = ep->x1+1;
para.y1 = ep->y1+1;
para.x2 = ep->x2;
para.y2 = ep->y2;
EGB_getBlock(work,(char *)¶);
para.ptn = ptn;
para.sel = getds();
para.x1 = ep->x1;
para.y1 = ep->y1;
para.x2 = ep->x2-1;
para.y2 = ep->y2-1;
EGB_putBlock(work,0,(char *)¶);
connect.count = 3;
connect.x1 = ep->x1;
connect.y1 = ep->y2;
connect.x2 = ep->x2;
connect.y2 = ep->y2;
connect.x3 = ep->x2;
connect.y3 = ep->y1;
EGB_color(work,0,8);
EGB_connect(work,(char *)&connect);
MOS_disp(TRUE);
free(ptn);
**********************************************/
}