; MUXLESSW.ACT ; MUX-less MUX-Window routines for ; Action! ; Version 0.0 October 23, 1995 ; By Bill Kendrick, (c) NBS 1995 ; NOTE: ; ----- ; Does not support mouse, keyboard or ; expose events (let alone any ; others). ; 320x192x2 support ONLY. ; Does not draw into unraised windows. ; Windows are snapped to 40-across grid ; and to widths evenly divisible by 8 ; for manipulation speed. ; Only resize gadgets are shown. ; DrawArc doesn't support arc angles ; and currently only draws the ; bounding rectangle. ; Text support is limited to "OS" font ; only, snapped to 40-across grid. MODULE INCLUDE "MUXDEFS.ACT" INCLUDE "FASTRECT.ACT" MODULE ; User compile-time defines DEFINE ERROUTPUT="TRUE";Show ErrOutput DEFINE MAXW="20" ;Max. # of wins DEFINE MAXF="5" ;Max. # of fonts ; Globals DEFINE OS_FONT="1" ; OS_Font # Card Connected=[FALSE] String ErrStr(40) Card Array WE(MAXW),WX(MAXW),WY(MAXW), WW(MAXW),WH(MAXW),WB(MAXW), FE(MAXF) Char Array Titles(800) Card SC=88,Ch=[57344] Window Array WinStack(MAXW) Int WinDepth ; Error grabber (stick in string and ; display if ERROUTPUT is 1) Proc Err(String S) If ERROUTPUT=TRUE Then Put(253) PrintE(S) Fi SCopy(S,ErrStr) Return Proc RemoveFromStack(Window W) Byte A,F F=0 For A=1 To WinDepth Do If WinStack(A)=W Then F=1 Fi If F=1 Then WinStack(A)=WinStack(A+1) Fi Od If F=1 Then WinDepth=WinDepth-1 Fi Return Proc AddToStack(Window W) WinDepth=WinDepth+1 WinStack(WinDepth)=W Return Proc MoveToEndOfStack(Window W) RemoveFromStack(W) AddToStack(W) Return Proc DumpStack() Byte A,Keyy=764 For A=1 To WinDepth Do PrintB(WinStack(WinDepth+1-A)) Put(32) Od Keyy=255 Do Until Keyy<255 Od Keyy=255 Put(155) Return ; Connect and register with the ; "Window Server" Stat Func Connect(String Name, AppType) Byte A If Connected=FALSE Then Graphics(8) SetColor(1,0,0) SetColor(2,0,15) For A=0 To MAXW-1 Do WE(A)=FALSE Od For A=0 To MAXF-1 Do FE(A)=FALSE Od Connected=TRUE FE(OS_FONT)=TRUE WinDepth=0 WinStack(0)=NULL Else Err("Already connected!") Return(FAILURE) Fi Return(SUCCESS) ; Return depth of Server Byte Func GetDepth() If Connected=FALSE Then Err("Not connected!") Return(0) Fi Return(1) ; Return model Stat Func GetModel(String Model,Ver,Date,Manuf) If Connected=FALSE Then Err("Not connected!") SCopy(Model,"NONE") SCopy(Ver,"NONE") SCopy(Date,"NONE") SCopy(Manuf,"NONE") Return(FAILURE) Fi SCopy(Model,"MUXLessW") SCopy(Ver,"0.0") SCopy(Date,"October 23, 1995") SCopy(Manuf,"New Breed Software") Return(SUCCESS) ; Unraise a window Stat Func UnRaiseWin(Window WID) Int X,Y,W,H,B,X2,Y2,YY,A String Name If Connected=FALSE Then Err("No connection!") Return(FAILURE) Fi If WE(WID)=FALSE Then Err("Bad Window") Return(FAILURE) Fi X=WX(WID) Y=WY(WID) W=WW(WID) H=WH(WID) B=WB(WID) X2=X+W+B*2-1 Y2=Y+H+B*2+9 Color=BLACK Plot(X,Y) DrawTo(X2,Y) DrawTo(X2,Y2) DrawTo(X,Y2) DrawTo(X,Y) Color=WHITE For A=1 To B-2 Do Plot(X+A,Y+A) DrawTo(X2-A,Y+A) DrawTo(X2-A,Y2-A) DrawTo(X+A,Y2-A) DrawTo(X+A,Y+A) Od Return(SUCCESS) ; Return pixel height of a font Int Func FontHeight(Font F) If FE(F)=FALSE Then Err("No such font") Return(NULL) Fi Return(8) ; Return pixel width of a character Int Func CharWidth(Font F, Char C) If FE(F)=FALSE Then Err("No such font") Return(NULL) Fi Return(8) ; Draw some text Stat Func DrawString(Window W, Int X,Y String S, Col FC,BC, Font F) Byte A,J,Z,CHV Char C,ROMC Card MEM If WE(W)=FALSE Then Err("Bad window") Return(FAILURE) Fi If FE(F)=FALSE Then Err("No such font") Return(FAILURE) Fi X=X+WX(W)+WB(W) ; 0,0 at win's corner Y=Y+WY(W)+WB(W)+9 X=((X+7) LSH 3) RSH 3 ; even boundary ; Only draw in raised windows :( If WinStack(WinDepth)=W Then For A=1 To S(0) Do C=(S(A)&127) If C>=32 AND C<'a Then ROMC=C-32 ElseIf C<32 Then ROMC=C+32 Else ROMC=C Fi X=X+CharWidth(F,C) If (X>=0 And Y>=0 And X<=319 And Y<=191-8) Then For J=0 To 7 Do MEM=SC+(Y+J)*40+(X RSH 3) CHV=Peek(Ch+ROMC*8+J) ; Determine background If BC=WHITE Then Z=0 ElseIf BC=BLACK Then Z=255-CHV Else Z=Peek(MEM)&(255-CHV) Fi ; Add foreground If FC=WHITE Then Z=Z&(255-CHV) ElseIf FC=BLACK Then Z=Z%CHV Else Z=Z%(Peek(Mem)&CHV) Fi Poke(MEM,Z) Od Fi Od Fi Return(SUCCESS) Stat Func DrawWin(Window WID) Int X,Y,W,H,B,X2,Y2,A String Name(40) If Connected=FALSE Then Err("No connection!") Return(FAILURE) Fi If WE(WID)=FALSE Then Err("Bad Window") Return(FAILURE) Fi X=WX(WID) Y=WY(WID) W=WW(WID) H=WH(WID) B=WB(WID) X2=X+W+B*2-1 Y2=Y+H+B*2+9 FastRect(X,Y,X2+8,Y2) Color=BLACK For A=0 To B-1 Do Plot(X+A,Y+A) DrawTo(X2-A,Y+A) DrawTo(X2-A,Y2-A) DrawTo(X+A,Y2-A) DrawTo(X+A,Y+A) Od Plot(X+B,Y+B+8) DrawTo(X2-B-1,Y+B+8) Color=WHITE Plot(X,Y+9) DrawTo(X+B-1,Y+9) Plot(X,Y2-9) DrawTo(X+B-1,Y2-9) Plot(X2,Y+9) DrawTo(X2-B,Y+9) Plot(X2,Y2-9) DrawTo(X2-B,Y2-9) Plot(X+9,Y) DrawTo(X+9,Y+B-1) Plot(X+9,Y2) DrawTo(X+9,Y2-B) Plot(X2-9,Y) DrawTo(X2-9,Y+B-1) Plot(X2-9,Y2) DrawTo(X2-9,Y2-B) SCopy(Name,Titles+WID*40) If Name(0)>(W-7)/8-2 Then Name(0)=(W-7)/8-2 Fi DrawString(WID,B,-9,Name,BLACK,WHITE,OS_FONT) Return(SUCCESS) ; Raise a window to the top Stat Func RaiseWin(Window WID) If Connected=FALSE Then Err("No connection!") Return(FAILURE) Fi If WE(WID)=FALSE Then Err("Bad Window") Return(FAILURE) Fi If WinStack(WinDepth)<>NULL Then UnRaiseWin(WinStack(WinDepth)) Fi MoveToEndOfStack(WID) DrawWin(WID) Return(SUCCESS) ; Open a window Window Func OpenWin(Int X,Y,W,H,B String Title) Window WID Int A String Name(120) ; Widen to fit exactly 8 bits X=(X RSH 3) LSH 3 W=((((W+B*2) RSH 3)+1) LSH 3)-B*2 If B<3 Then B=3 Fi If Connected=FALSE Then Err("No connection!") Return(NULL) Fi WID=NULL For A=1 To MAXW-2 Do If WE(A)=FALSE Then WID=A WE(WID)=TRUE A=MAXW Fi Od If WID=NULL Then Err("Too many windows!") Return(NULL) Fi WX(WID)=X WY(WID)=Y WW(WID)=W WH(WID)=H WB(WID)=B SCopy(Name,Title) If Name(0)>=40 Then Name(0)=39 Fi SCopy(Titles+WID*40,Name) If WinStack(WinDepth)<>NULL Then UnRaiseWin(WinStack(WinDepth)) Fi AddToStack(WID) DrawWin(WID) Return(WID) ; Close a window Stat Func CloseWin(Window WID) Int X1,Y1,W,H,X2,Y2,B If (Connected=FALSE) Then Err("No connection!") Return(FAILURE) ElseIf WE(WID)=FALSE Then Err("Bad window!") Return(FAILURE) Fi X1=WX(WID) Y1=WY(WID) W=WW(WID) H=WH(WID) B=WB(WID) X2=X1+W+B*2+7 Y2=Y1+H+B*2+9 Color=WHITE FastRect(X1,Y1,X2,Y2) WE(WID)=0 RemoveFromStack(WID) If WinDepth>0 Then DrawWin(WinStack(WinDepth)) Fi Return(SUCCESS) ; Disconnect from the "Window Server" Stat Func Disconnect() Byte A If Connected=FALSE Then Err("Not connected!") Return(FAILURE) Fi For A=1 To WinDepth Do Close(WinStack(A)) Od Connected=FALSE Return(SUCCESS) Return(SUCCESS) ; Draw a line Stat Func DrawLine(Window W, Int X1,Y1,X2,Y2, Col C, LineMode M) If WE(W)=FALSE Then Err("Bad window") Return(FAILURE) Fi If C<>CLEAR Then Color=C Fi X1=X1+WX(W)+WB(W) Y1=Y1+WY(W)+WB(W)+9 X2=X2+WX(W)+WB(W) Y2=Y2+WY(W)+WB(W)+9 If (X1>=0 And Y1>=0 And X1<=319 And Y1<=191) And (X2>=0 And Y2>=0 And X2<=319 And Y2<=191) Then If C<>CLEAR Then ; Only draw in raised windows :( If WinStack(WinDepth)=W Then Plot(X1,Y1) DrawTo(X2,Y2) Fi Fi Else Err("Bad position values") Return(FAILURE) Fi Return(SUCCESS) ; Draw a rectangle Stat Func DrawRect(Window W, Int X,Y, Wi,H, Col OC, LineMode OM, Col FC) Int X2,Y2,YY If WE(W)=FALSE Then Err("Bad window") Return(FAILURE) Fi X=X+WX(W)+WB(W) Y=Y+WY(W)+WB(W)+9 X2=X+Wi Y2=Y+H Color=OC If (X>=0 And Y>=0 And X<=319 And Y<=191) And (X2>=0 And Y2>=0 And X2<=319 And Y2<=191) Then ; Only draw in raised windows :( If WinStack(WinDepth)=W Then Plot(X,Y) DrawTo(X2,Y) DrawTo(X2,Y2) DrawTo(X,Y2) DrawTo(X,Y) If FC<>CLEAR Then Color=FC For YY=Y+1 To Y2-1 Do Plot(X+1,YY) DrawTo(X2-1,YY) Od Fi Fi Else Err("Bad position values") Return(FAILURE) Fi Return(SUCCESS) ; Draw an arc (rect for now :( ) Stat Func DrawArc(Window W, Int X,Y, Wi,H, Col OC, LineMode OM, Col FC) Int X2,Y2,YY If WE(W)=FALSE Then Err("Bad window") Return(FAILURE) Fi X=X+WX(W)+WB(W) Y=Y+WY(W)+WB(W)+9 X2=X+Wi Y2=Y+H Color=OC If (X>=0 And Y>=0 And X<=319 And Y<=191) And (X2>=0 And Y2>=0 And X2<=319 And Y2<=191) Then ; Only draw in raised windows :( If WinStack(WinDepth)=W Then Plot(X,Y) DrawTo(X2,Y) DrawTo(X2,Y2) DrawTo(X,Y2) DrawTo(X,Y) If FC<>CLEAR Then Color=FC For YY=Y+1 To Y2-1 Do Plot(X+1,YY) DrawTo(X2-1,YY) Od Fi Fi Else Err("Bad position values") Return(FAILURE) Fi Return(SUCCESS) Font Func LoadFont(String F) If SCompare(F,"OS")<>0 Then Return(NULL) ; can't load it Fi Return(OS_FONT) ; Don't try to run this ACT! Proc MUXLESSWWrongSource() PrintE("You can't execute MUXW.ACT") Return MODULE