home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Kyūkyoku!! X68000 Emulator
/
X68000Book.dat
/
mac
/
OLS
/
X68000
/
Ko-Window
/
kow142s.lzh
/
wsrv
/
wsrv.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-07
|
15KB
|
629 lines
#include <stdio.h>
#include <iocslib.h>
#include <microfio.h>
#include <microstr.h>
#include "clip.h"
#include "slider.h"
#include "window.h"
#include "simple.h"
#include "title.h"
#include "scroll.h"
#include "manager.h"
#include "stack.h"
#include "error.h"
#include "screen.h"
#include "readrc.h"
#include "exec.h"
#include "kanji.h"
#include "resource.h"
#include "corfunc.h"
#include "process.h"
#include "id.h"
/* âTü[âoü[é╠è╓Éöé≡ègÆúé╡é╜éΦüAâtâ@âôâNâVâçâôâRü[âïé≡Æ╟ë┴é╡é╜éΦüAâVâXâeâÇé╔
ÄΦé≡ôⁿéΩéΘÉlé¬âfâoâbâOé╖éΘÅΩìçé╔òKùvé╚âTü[âoü[é≡ì∞éΘÄ₧1é╔é╖éΘ 1995 11/20 COR.*/
#define SYSTEM_DEBUG 0
/* é▒éΩé¬ 0 é╛é╞üAâVâXâeâÇé╠âfâoâbâOé≡é╖éΘé╜é▀é╠âïü[â`âôé≡ĵéΦÅ£é¡üBâAâvâè
âPü[âVâçâôé╠âfâoâbâOÄ₧é╔é═òsùp */
#define LIBRARY_OLD_ID 20
#define LIBRARY_NEW_ID 26
#define PROCESS_NOMAL 0
#define PROCESS_INIT 1
#define PROCESS_QUIT 2
typedef enum {
SignalOpen,
SignalKill,
SignalChildKill,
}
SignalCode;
typedef struct {
unsigned char *Entry;
int Status;
int Parent;
unsigned char *PSP;
int Level;
int HeapSize;
unsigned char *Heap;
unsigned char *SignalEntry;
}
ProcessInfo;
int StackTop;
int WindowLines= 64 /*32*/; /*âfâtâHâïâgé≡ëµû╩âTâCâYì┼æσé╔ COR.*/
int WindowColumns= 128 /*96*/;
int KeepLevel= 1;
int InChildFlag= FALSE;
int DebugMode= 0;
int BGmode= FALSE;
int GraphicLock= FALSE;
int BreakMode;
extern unsigned int _PSP;
/* 1993,94,95 COR. */
static unsigned char *Version= "2.24+14.2"
#if X30
" 030ÉΩùp"
#endif
;
static int DefaultVector;
int DefaultErrorEntry; /* 1993 Taka2 */
int DefaultAbortEntry; /* 1995 COR. */
static int NewProcess ;
static ProcessInfo Process[MAXPROCESS];
static unsigned char *EventName[]= {
"EventOpen",
"EventRedraw",
"EventClose",
"EventPop",
"EventPush",
"EventMove",
"EventResize",
"EventIconify",
"EventZoom",
"EventScroll",
"EventMouseSwitch",
"EventMouseMove",
"EventMouseEnter",
"EventMouseOut",
"EventKey",
"EventInterval",
"EventNon",
"EventUser",
"EventGraphic",
};
static unsigned char *SignalName[]= {
"Open",
"Kill",
"ChildKill",
};
extern Sheet *BackPattern;
extern int _SSTA, _SEND, _HEND;
#if SUP
int _HeapSizeX= 1024*64,
_StackSizeX= 1024*64;
#endif
#define DEBUG 0
#if DEBUG
DEBUGPUT(a,b,c,d,e,f,g)
{
char buf[96];
s_format( buf, a, b, c, d, e, f, g );
B_PUTMES( 3, 0, 30, 80, buf );
}
#else
# define DEBUGPUT
#endif
/*
proto wsrv.c > temp
*/
int main( int, unsigned char*[] );
void CommandExec( unsigned char* );
int CallClient( int, int(*)(), WindowClass*, EventInfo* );
int GetRequest( int, int, int* );
void TopLevelExec( void );
unsigned char *WindowGetVersion( void );
void WindowSetSingal( int, int );
int WindowSendSignal( int, int, void* );
ProcessInfo *WindowGetProcessInfo( int );
static int SignalExec( int, unsigned char* );
void ServerQuit( void );
/* wsrvasm.c */
extern void ServerFree();
extern void IntEntry(void), IntEntry000(void), IntEntry030(void);
extern int _CallClient( unsigned char*, int(*)(), WindowClass*, EventInfo* );
extern void EventWaitLoop( void );
/*externint CallFunction( int, int(*)(), int, int, int* );*/
extern int CallFunction( int, int*, int(*)(), int );
/* open.c */
extern WindowClass *WindowOpen( int, int, int, int, int, WindowClass*, int(*)() );
extern SimpleClass *SimpleOpen( int, int, int, int, int, WindowClass*, int(*)() );
extern TitleClass *TitleOpen( int, int, int, int, int, WindowClass*, unsigned char*, int, int(*)() );
extern ScrollClass *ScrollOpen( int, int, int, int, int, WindowClass*, int, int, int, int, int, int(*)() );
extern void SelectResize( WindowClass*, int, int, int, int );
extern void SelectScroll( WindowClass*, int, int );
extern void *WindowSetManagerExec( int, int, void* );
extern HfontCheck();
#include "func.h"
int
main( argc, argv )
int argc;
unsigned char **argv;
{
extern int ScreenMode;
extern char initNameX[];
int i;
int gvclr= FALSE;
#if 0 /* é▒éΩé╞ô»é╢éαé╠é≡ gcc é¬ûäé▀ì₧é±é┼é¡éΩéΘ */
# if X30
if( !B_BPEEK( 0xcbc ) ){
errput( "68000 é┼é═ïNô«é┼é½é▄é╣é±\n" );
EXIT2( 1 );
}
# endif
#endif
*initNameX= '\0';
BGmode= B_LPEEK( (void*)0x1c50 );
/* âIâvâVâçâôé╠Åêù¥ */
for( i= 1 ; i < argc ; i++ ){
if( argv[i][0] == '-' ){
switch( argv[i][1]|0x20 ){
case 'd':
DebugMode= argv[i][2]&7;
break;
case 'f': /* force optiron by COR.*/
TGUSEMD( 1, 0 );
TGUSEMD( 0, 0 );
break;
case 'c':
gvclr= TRUE;
break;
case 'g':
GraphicLock= TRUE;
break;
case 's':
ScreenMode= argv[i][2]&7;
break;
case 'b':
if( argv[i][2] == '0' )
BGmode= FALSE;
break;
case 'i':
s_strcpy( initNameX, argv[i]+2 );
break;
case 'e': /* è┬ï½é╠ì∞ɼ */
{
int *olde= *((int**)_PSP), *newe;
int envsize= _atoiX( argv[i]+2 );
if( (int)olde > 0 && envsize < *olde )
envsize= *olde+1024;
newe= WindowMemoryAlloc( envsize );
/* é╜é╛é╠mallocé╚é╠é┼â}âlü[âWââü[Åëè·ë╗æOé╔î─é±é┼éαéµéó */
if( newe ){
*((int**)_PSP)= newe;
if( (int)olde > 0 ){
s_memcpy_simple( envsize, newe, olde );
}else{
newe[1]= 0;
}
*newe= envsize;
}
}
break;
default:
errput("X68k Window Server Version " );
errput( Version );
errput( "\nusage: wsrv [<switch>] [<prog>..]\n"
" -d<n>\tDebug Mode(1:stack,3:debug,7:trace)\n"
" -s<n>\tScreen Mode\n"
" -b0\tBG-modeï¡ÉºOFFÄwÆΦ\n"
" -c\tGRAPHICëµû╩é≡Å┴ïÄé╡é─é⌐éτïNô«\n"
" -g\tGRAPHICëµû╩é≡ÄgùpÆåé╞é╡é─âìâbâNé╡é─ïNô«\n"
" -f\tGRAPHIC/TEXTÄgùpÆåé┼éαï¡ÉºïNô«\n"
" -i<fn>\tâTü[âoü[É▌ÆΦâtâ@âCâïû╝é≡ù^éªéΘ\n"
" -e<n>\tENVé≡ô╞Ä⌐é╔ì∞ɼé╖éΘ\n"
" --h<n>\tHEAPâTâCâYé≡ÄwÆΦ(KbyteÆPê╩)\n"
);
return 1;
}
}
}
{
int i;
if( TGUSEMD( 1, -1 ) == 2 ){ /* 1991 COR. */
errput( "TEXT" );
goto err_exit;
}else if( (i= TGUSEMD( 0, -1 )) == 1 || i == 2 ){
errput( "GRAPHIC" );
err_exit:
errput( "ëµû╩ÄgùpÆåé┼é╖\n" );
return 1;
}
}
if( gvclr )
G_CLR_ON();
#if 0
if( !HfontCheck( _PSP-16 ) ){
int i= ONTIME()+20;
errput( "hfont é¬ÅφÆôé╡é─éóé▄é╣é±\n" );
for(; ONTIME() < i ;);
}
#endif
#if SYSTEM_DEBUG
/* func.h é╠â`âFâbâN */
for( i= 0 ; i <= FunctionEnd ; i++ ){
#if 0
sprintf( buf, "%x %s %d, %d\n", &FunctionList[i],
FunctionList[i].name, FunctionList[i].funcid, i );
#endif
if( FunctionList[i].funcid != i ){
errput( "è╓ÉöâèâXâgé╠ÆΦï`é╔îδéΦé¬éáéΦé▄é╖\n" );
return( 1 );
}
}
#endif
/* ÆΦÉöé╠Åëè·ë╗ */
WindowError= ServerError;
SendEventExec= CallClient;
StackTop= _SSTA;
#if !X30
if( !B_BPEEK( (void*)0xcbc ) ){ /* 68000 é╠ÅΩìçâpâbâ`éáé─ */
_SetSuper();
DefaultVector= INTVCS( 0x20, (char*)IntEntry000 );
}else
#endif
DefaultVector= INTVCS( 0x20, (char*)IntEntry030 );
DefaultErrorEntry= INTVCS( 0x2E, (char*)ErrorEntry );
Process[0].PSP= (unsigned char*)_PSP;
/* BREAK check KILL */
BreakMode= BREAKCK( -1 );
BREAKCK( 2 );
if( (VERNUM() & 0xffff) >= 0x0300 )
BREAKCK( 0x300 ); /* kill ^p! -- Human v3 only */
/* ÆΦÉöé╠Åëè·ë╗üi WSRV.RC éµéΦ üj */
ReadRC();
ReadInit();
/* âèâ\ü[âXé╠ô╟é▌ì₧é▌ */
ReadResource();
/* âEâCâôâhâEâ}âlü[âWââé╠Åëè·ë╗ */
ManagerInit( WindowLines, WindowColumns );
{ /* 1991 COR. */
extern GotoTopLevel();
/* extern KeyCtrlVect;*/
DefaultAbortEntry= INTVCS( 0xfff2, GotoTopLevel );
/* KeyCtrlVect= INTVCS( 0xff60, INTVCG( 0xff24 ) ); KeyCtrl*/
}/* é▒éΩé═âEâBâôâhâEûêé╠BGâXâîâbâhÉ╪éΦæ╓éªé┼âLü[ôⁿù═é≡âTâ|ü[âgé╡éµéñé╞é╡
é╜Ä₧é╠û╝ÄcüBè╓ÿAâRü[âhé═ getevent.s é╔éáéΘ COR. */
if( DebugMode & DebugWindowOn )
EventStackOpen( 768-320, 512-180, 300, 160 );
/* WSRV.RC é╠ô╟é▌ì₧é▌üiïñùLù╠êµé╓üj */
/* ReadRC(); */
/* ïNô«Ä₧âAâvâèâPü[âVâçâôé╠Ä└ìs */
ReadExec();
for( i= 1 ; i < argc ; i++ ){
if( argv[i][0] != '-' ) /* 1991 COR. */
CommandExec( argv[i] );
}
/* ïNô«âAâvâèâPü[âVâçâôé╠â`âFâbâN */
for( i= 0 ; i < MAXPROCESS ; i++ ){
if( Process[i].Entry && Process[i].Level <= KeepLevel ){
break;
}
}
if( i == MAXPROCESS )
SignalExec( SignalKill, NULL );
else
EventWaitLoop();
/* return 1; é▒é▒é╔é═é▒é╚éó COR. */
}
void
CommandExec( ptr ) /* 1991,1995 COR. */
unsigned char *ptr;
{
unsigned char file[256], *s= file;
int dot= 0;
for(; *ptr > ' ' ;)
if( (*s++= *ptr++) == '.' )
dot= 1;
*s= '\0';
if( !dot )
s_strcpy( s, ".win" );
WindowLoadExec( file, ptr, NULL, NULL );
}
int
CallClient( id, exec, wp, info )
int id;
int (*exec)();
WindowClass *wp;
EventInfo *info;
{
int ret;
if( Process[id].Entry && exec ){
EventStackPush( TypeEvent, id, EventName[info->option], wp );
ret= _CallClient( Process[id].Entry, exec, wp, info );
EventStackPop();
return ret;
}
return FALSE;
}
int /* 1995 COR.*/
GetRequest( id, func, para )
int id, func;
int *para;
{
FunctionAttr *fap;
if( func < 0 || FunctionEnd <= func )
ServerError( "è╓ÉöIDé¬òsÉ│é┼é╖" );
fap= FunctionList+ func;
EventStackPush( TypeRequest, id, fap->name, NULL );
if( fap->function ){ /* âIü[âoü[âwâbâhé╠îyî╕ */
int ret;
if( id <= 0 || MAXPROCESS <= id || Process[id].Entry == NULL ){
char buf[30];
/*s_strnum( id, buf );
ServerError( buf );*/
ServerError( "ProcessIDé¬òsÉ│é┼é╖" );
}
#if SYSTEM_DEBUG
if( (fap->args>>8) != para[0] )
ServerError( "è╓Éöé╠âpâëâüü[â^é¬òsÉ│é┼é╖" );
#endif
/* ret= CallFunction( fap->processflag, fap->function,
id, para[0], para+1 );*/
ret= CallFunction( fap->args, para, fap->function, id );
EventStackPop();
return ret;
}else{
if( func == WindowConnectionOpenID ){
int i;
if( para[1] < LIBRARY_OLD_ID || LIBRARY_NEW_ID < para[1] ){
errput( "WindowServeré╠Versioné¬êßéóé▄é╖\n" );
EXIT2( 1 );
}
for( i= 1 ; i < MAXPROCESS ; i++ ){
if( Process[i].Entry == NULL )
break;
}
if( i == MAXPROCESS ){
errput( "âvâìâZâXé¬æ╜é╖é¼é▄é╖\n" ); /* 1991 COR. */
EXIT2( 1 );
}
Process[i].Entry = (unsigned char*)para[0];
Process[i].Status= PROCESS_INIT;
Process[i].Parent= 0;
Process[i].PSP= (unsigned char*)para[2];
Process[i].Level= para[3];
Process[i].HeapSize= para[4];
Process[i].Heap= (unsigned char*)para[5];
NewProcess= i;
para[2]= (int)( &RootWindow );
para[3]= (int)GetBackPattern();
EventStackPop();
return i;
}
if( id <= 0 || MAXPROCESS <= id || Process[id].Entry == NULL )
ServerError( "ProcessIDé¬òsÉ│é┼é╖" );
{
WindowClass *wp;
EventInfo info;
int ret= TRUE;
switch( func ){
case WindowConnectionCloseID:
info.option= EventClose;
WindowSendEventAll( id, &info );
Process[id].Status= PROCESS_QUIT;
RootEventExec[id]= NULL;
break;
case WindowCloseID:
wp= (WindowClass*)( para[1] );
WindowClose( wp );
break;
case WindowLoadExecID:
NewProcess= 0;
EventStackPush( TypeExec, 0, (unsigned char*)para[1], NULL );
InChildFlag= TRUE;
BREAKCK( BreakMode );
ret= WindowLoadExec( (unsigned char*)para[1],
(unsigned char*)para[2],
(unsigned char*)para[3], (void(*)())para[4] );
BREAKCK( 2 ); /* BREAK KILL */
InChildFlag= FALSE;
EventStackPop();
if( NewProcess > 0 )
Process[NewProcess].Parent= id;
break;
}
EventStackPop();
return ret;
}
}
}
void
TopLevelExec()
{
int i;
for( i= 0 ; i < MAXPROCESS ; i++ ){
switch( Process[i].Status ){
case PROCESS_INIT:
Process[i].Status= PROCESS_NOMAL;
WindowSendSignal( i, SignalOpen, NULL );
break;
case PROCESS_QUIT:
if( Process[i].Parent != 0 )
WindowSendSignal( Process[i].Parent, SignalChildKill,NULL);
if( Process[i].HeapSize )
MFREE( (void*)Process[i].Heap );
MFREE( (void*)Process[i].PSP );
Process[i].Entry= NULL;
Process[i].Parent= (int)NULL;
Process[i].PSP= NULL;
Process[i].SignalEntry= NULL;
{
int j;
for( j= 0 ; j < MAXPROCESS ; j++ ){
if( Process[j].Entry != NULL ){
if( Process[j].Level <= KeepLevel )
break;
}
}
if( j == MAXPROCESS )
SignalExec( SignalKill, NULL );
}
Process[i].Status= PROCESS_NOMAL;
break;
}
}
}
unsigned char *
WindowGetVersion()
{
return Version;
}
void
WindowSetSingal( id, entry )
int id;
int entry;
{
Process[id].SignalEntry= (unsigned char*)entry;
}
int
WindowSendSignal( id, code, buf )
int id;
int code;
void *buf;
{
int ret;
if( id < 0 || MAXPROCESS <= id )
return FALSE;
EventStackPush( TypeSignal, id, SignalName[code], buf );
if( id == 0 ){
ret= SignalExec( code, buf );
}else if( Process[id].Entry && Process[id].SignalEntry ){
ret = _CallClient( Process[id].Entry,
(int(*)())Process[id].SignalEntry,
(WindowClass*)code, buf );
}else
ret= FALSE;
EventStackPop();
return ret;
}
ProcessInfo *
WindowGetProcessInfo( id )
int id ;
{
if( 0 <= id && id < MAXPROCESS )
return Process + id;
return NULL;
}
static int
SignalExec( code, buf )
int code;
unsigned char *buf;
{
int i;
if( code == SignalKill ){
for( i= 1 ; i < MAXPROCESS ; i++ ){
if( Process[i].Entry != NULL )
WindowSendSignal( i, SignalKill, NULL );
}
ManagerQuit();
ServerQuit();
}
return FALSE;
}
void
ServerQuit()
{
int i;
KanjiQuit();
for( i= 1 ; i < MAXPROCESS ; i++ ){
if( Process[i].PSP != NULL ){
if( Process[i].HeapSize )
MFREE( (void*)Process[i].Heap );
MFREE( (void*)Process[i].PSP );
}
}
ScreenQuit();
INTVCS( 0x20, (char*)DefaultVector );
INTVCS( 0x2E, (char*)DefaultErrorEntry );
BREAKCK( BreakMode );
errput( "X68k Window Server Version " );
errput( Version );
errput( "\nCopyright (C) T.Kobayashi 1990, 1991. All rights reserved.\n"
" Modified 1991-1996 by H.Ogasawara\n" );
EXIT2( 0 );
}
void
errput(str)
unsigned char *str;
{
for(; *str ; str++ ){
if( *str == '\n' )
FPUTC( '\r', 2 );
FPUTC( *str, 2 );
}
}
/* :vi:se ts=4 sw=4: */