home *** CD-ROM | disk | FTP | other *** search
- /* WINDOWS.C */
- /* (c) 1991 Elmar Warken */
-
- #include <stdlib.h>
- #include <dos.h>
- #include <stdio.h>
- #include <string.h>
- #include <conio.h>
- #include "interp.h"
- #include "macros.c"
- #include "windows.h"
-
- /* Benötigte Globalvariablen */
- extern PRGZEILE *FirstLine; /* erste Interpreterzeile */
- extern PRGZEILE *ActLine; /* aktuelle interpretierte Zeile */
- extern char *LinePos; /* Zeilenposition der aktuellen Zeile*/
- extern int Steuer; /* der aufrufenden Routine wird mit- */
- extern TOKBEF TokBefDesc[];
- /* geteilt, um was es sich handelt. */
- extern char ScanBuffer[ZEILENLAENGE]; /* Ergebnisbuffer des Scanners */
-
- struct windowdata *FirstWindow;
- int WindowCounter;
-
- char far *SCRSEG=(char far*)0xB8000000;
-
- /*** Von Makros verwendeter Zeiger in den Bildschirmspeicher ***/
- char far *SCRPTR;
-
- void InitWindowSystem()
- {
- FirstWindow=NULL;
- WindowCounter=0;
- }
-
- char *SaveBGround(int x1,int y1,int x2,int y2)
- {
- char *Save,*SavePos;
- int i,breite=x2-x1+1;
- unsigned scr;
-
- SavePos=Save=malloc( breite*(y2-y1+1)*2 );
- if (!SavePos)
- {
- perror(" Speicherplatz voll. "); abort();
- }
-
- scr=(y1-1)*160+(x1-1)*2;
- for (i=y1; i<=y2; i++, SavePos+=breite*2, scr+=160)
- movedata(0xB800, scr, FP_SEG(SavePos), FP_OFF(SavePos), (x2-x1+1)*2 );
- return(Save);
- }
-
- void RestoreBGround(int x1,int y1,int x2,int y2, char *BG)
- {
- char *SavePos;
- int i,breite=x2-x1+1;
- unsigned scr;
-
- SavePos=BG;
-
- scr=(y1-1)*160+(x1-1)*2;
- for (i=y1; i<=y2; i++, SavePos+=breite*2, scr+=160)
- movedata( FP_SEG(SavePos),FP_OFF(SavePos), 0xB800, scr, (x2-x1+1)*2 );
- }
-
- void WriteFirstWin(int x, int y,char a, char *string)
- {
- if (FirstWindow==NULL) return;
- SET_POS(FirstWindow->x1+x-1,FirstWindow->y1+y-1);
- WR_STR(string,a);
- }
-
- void ClearFirstWin()
- {
- int i;
-
- for (i=FirstWindow->y1; i<=FirstWindow->y2; i++)
- {
- SET_POS(FirstWindow->x1,i);
- CLEAR_LINE(FirstWindow->Breite,FirstWindow->BackCol);
- }
- }
-
- void FrameFirstWin()
- {
- UChar col,i;
-
- col=FirstWindow->FrameCol;
-
- SET_POS(FirstWindow->x1,FirstWindow->y1); WR_SCR('╔',col);
- for (i=1; i<=FirstWindow->Breite-2;i++) WR_SCR('═',col);
- WR_SCR('╗',col);
-
- SET_POS(FirstWindow->x1,FirstWindow->y2); WR_SCR('╚',col);
- for (i=1; i<=FirstWindow->Breite-2;i++) WR_SCR('═',col);
- WR_SCR('╝',col);
-
- for (i=1; i<=FirstWindow->Hoehe-2; i++)
- {
- SET_POS(FirstWindow->x1,FirstWindow->y1+i); WR_SCR('║',col); /*** OPT! **/
- SET_POS(FirstWindow->x2,FirstWindow->y1+i); WR_SCR('║',col);
- }
- }
-
- void TopBottomFirstWin(char *top,char *bottom)
- {
- FirstWindow->TopL=top;
- FirstWindow->BottomL=bottom;
-
- SET_POS(FirstWindow->x1+2,FirstWindow->y1);
- WR_STR(top,FirstWindow->TopCol);
- SET_POS(FirstWindow->x1+2,FirstWindow->y2);
- WR_STR(bottom,FirstWindow->BottomCol);
- }
-
- int OpenWindow(char nx1,char ny1,char nx2,char ny2,
- UChar c1,UChar c2,UChar c3,UChar c4)
- {
- struct windowdata *Win;
-
- MAX(nx2,80); /** Bereichsüberprüfung und eventuelle Korrektur **/
- MIN(nx2,1);
- MAX(nx1,nx2);
- MIN(nx1,1);
- MAX(ny2,25); MIN(ny2,1);
- MAX(ny1,ny2); MIN(ny1,1);
-
- Win=malloc(sizeof(*Win));
- Win->handle=++WindowCounter;
- Win->x1=nx1; Win->x2=nx2; Win->y1=ny1; Win->y2=ny2;
- Win->FrameCol=c1; Win->BackCol=c2; Win->TopCol=c3; Win->BottomCol=c4;
- Win->BottomL=Win->TopL=NULL; Win->FrameType=1;
- Win->BackGround=SaveBGround(nx1,ny1,nx2,ny2);
- Win->NextWindow=FirstWindow;
- Win->Breite=nx2-nx1+1;
- Win->Hoehe=ny2-ny1+1;
- Win->HelpSave=NULL;
- FirstWindow=Win;
-
- ClearFirstWin();
- FrameFirstWin();
- return(WindowCounter);
- }
-
- void CloseFirstWindow()
- {
- struct windowdata *Win;
-
- if (!WindowCounter) return;
-
- Win=FirstWindow;
- RestoreBGround(Win->x1,Win->y1,Win->x2,Win->y2,Win->BackGround);
- free(Win->BackGround);
- FirstWindow=FirstWindow->NextWindow;
- WindowCounter--;
-
- free(Win);
- }
-
- void HideWindow(struct windowdata *Win)
- {
- Win->HelpSave=SaveBGround(Win->x1,Win->y1,Win->x2,Win->y2);
- RestoreBGround(Win->x1,Win->y1,Win->x2,Win->y2,Win->BackGround);
- free(Win->BackGround);
- }
-
- void ShowHiddenWindow(struct windowdata *Win)
- {
- if (Win->HelpSave) /*** nur möglich, wenn HideFirstWindow */
- /*** aufgerufen wurde ***/
- {
- Win->BackGround=SaveBGround(Win->x1,Win->y1,Win->x2,Win->y2);
- RestoreBGround(Win->x1,Win->y1,Win->x2,Win->y2,Win->HelpSave);
- free(Win->HelpSave);
- Win->HelpSave=NULL;
- }
- }
-
- void NewKoorWindow(char nx1,char ny1,char nx2,char ny2)
- {
- HideWindow(FirstWindow);
-
- MAX(nx2,80); /** Bereichsüberprüfung und eventuelle Korrektur **/
- MIN(nx2,1);
- MAX(nx1,nx2); MIN(nx1,1);
- MAX(ny2,25); MIN(ny2,1);
- MAX(ny1,ny2); MIN(ny1,1);
-
- FirstWindow->x1=nx1;
- FirstWindow->y1=ny1;
- FirstWindow->x2=nx2;
- FirstWindow->y2=ny2;
- FirstWindow->Breite=nx2-nx1+1;
- FirstWindow->Hoehe=ny2-ny1+1;
-
- FirstWindow->BackGround=
- SaveBGround(FirstWindow->x1,FirstWindow->y1,
- FirstWindow->x2,FirstWindow->y2);
-
- free(FirstWindow->HelpSave);
- FirstWindow->HelpSave=NULL;
- ClearFirstWin();
- FrameFirstWin();
- }
-
- void ResizeWindow(int relx,int rely)
- {
- NewKoorWindow(FirstWindow->x1,FirstWindow->y1,
- FirstWindow->x2+relx,FirstWindow->y2+rely);
- }
-
- void MoveWindow(int relx,int rely)
- {
- NewKoorWindow(FirstWindow->x1+relx,FirstWindow->y1+rely,
- FirstWindow->x2+relx,FirstWindow->y2+rely);
- }
-
- struct windowdata *GetFirstWindow
- (int number, struct windowdata *Win, struct windowdata *Prev)
-
- /**** nur als Hilfsprozedur für NewfirstWindow ****/
-
- {
- struct windowdata *ret;
-
- if ((Win->handle != number) && Win->NextWindow)
- {
- HideWindow(Win);
- ret=GetFirstWindow(number,Win->NextWindow,Win);
- ShowHiddenWindow(Win);
- return(ret);
- }
- else if (Win->handle==number)
- {
- HideWindow(Win);
- if (Prev) Prev->NextWindow=Win->NextWindow;
- return(Win);
- }
- else return(NULL);
- }
-
- void NewFirstWindow(int number)
- {
- struct windowdata *Win;
-
- if (FirstWindow->handle != number)
- if ((Win=GetFirstWindow(number,FirstWindow,NULL))!=NULL)
- {
- ShowHiddenWindow(Win);
- Win->NextWindow=FirstWindow;
- FirstWindow=Win;
- }
- }
-
- int cwindow(void)
- {
- long x1,y1,x2,y2,c1,c2,c3,c4;
- char *error=" Parameterfehler bei OpenWindow! ";
- char VarName[50];
-
- if ( GetIntegerParam(&x1) && GetIntegerParam(&y1) &&
- GetIntegerParam(&x2) && GetIntegerParam(&y2) &&
- GetIntegerParam(&c1) && GetIntegerParam(&c2) &&
- GetIntegerParam(&c3) && GetIntegerParam(&c4)
- ) OpenWindow(x1,y1,x2,y2,c1,c2,c3,c4);
- else { serror(error); return(FALSE); }
-
- Scan();
- if (Steuer==ALPHA)
- {
- strcpy(VarName,ScanBuffer);
- SetVarInt(VarName,WindowCounter);
- }
- return(OK);
- }
-
- int cclosewindow(void)
- {
- CloseFirstWindow();
-
- return(OK);
- }
-
- void WR_STRMAX(char *str,unsigned char a,char max)
- {
- int i,ii;
- char *ptr=(str);
-
- i=0;
- while (*ptr!=0 && i++<max)
- {
- WR_SCR(*ptr,(a));
- ptr++;
- }
- for (ii=i; ii<max; ii++)
- WR_SCR(' ',a);
- }
-
- void WinReadStr(char *frage, char *ergebnis, int laenge)
- {
- int breite,x1;
- breite=laenge;
-
- if (strlen(frage)>breite) breite=strlen(frage);
- x1=40-breite/2-1;
- OpenWindow(x1,10,x1+breite+1,13, 22,24,26,28);
- SET_POS(x1+1,11);
- WR_STR(frage, 30);
- gotoxy(x1+1,12);
- gets(ergebnis);
-
- CloseFirstWindow();
- }
-
- void Message(char *str)
- {
- int breite,x1;
- char c;
-
- breite=30;
- if (strlen(str)>breite) breite=strlen(str);
- x1=40-breite/2-1;
- OpenWindow(x1,10,x1+breite+1,13, 22,24,26,28);
- SET_POS(x1+1,11);
- WR_STR(str, 30);
- SET_POS(x1+1,12);
- WR_STR(" Taste drücken für weiter... ",30);
- c=getch();
-
- CloseFirstWindow();
- }
-
- int cwindowfirst(void)
- {
- long nummer;
- if (GetIntegerParam(&nummer))
- NewFirstWindow(nummer);
- else { serror(" Fensternummer erwartet! "); return(FALSE); }
-
- return(OK);
- }
-
- /* WinReadStr <frage> <lese-string> <laenge> */
- int cWinReadStr(void)
- {
- long len;
- char frage[80],*strp,varname[VNLAENGE],antwort[78];
-
- if ( GetStringParam(&strp) && strcpy(frage,strp) &&
- GetStrVarParam(&strp) && strcpy(varname,ScanBuffer) &&
- GetIntegerParam(&len) )
- {
- MAX(len,78);
- WinReadStr(frage,antwort,len);
- SetVarStr(varname,antwort);
- return(OK);
- }
- else
- {
- serror(" Falscher Parameter in WinReadStr. ");
- return(FALSE);
- }
- }
-
- /* WinMessage <message> */
- int cWinMessage(void)
- {
- long len;
- char msg[80],*strp;
-
- if ( GetStringParam(&strp) && strcpy(msg,strp))
- {
- Message(msg);
- return(OK);
- }
- else
- {
- serror(" Falscher Parameter in WinMessage. ");
- return(FALSE);
- }
- }
-
- /* MoveWin <relx> <rely> */
- int cMoveWin(void)
- {
- long x,y;
-
- if ( GetIntegerParam(&x) && GetIntegerParam(&y) )
- {
- MoveWindow(x,y);
- return(OK);
- }
- else
- {
- serror(" Falscher Parameter in MoveWin. ");
- return(FALSE);
- }
- }
-
- /* ResizeWin <relx> <rely> */
- int cResizeWin(void)
- {
- long x,y;
-
- if ( GetIntegerParam(&x) && GetIntegerParam(&y) )
- {
- ResizeWindow(x,y);
- return(OK);
- }
- else
- {
- serror(" Falscher Parameter in ResizeWin. ");
- return(FALSE);
- }
- }
-
- /* NewWinKoor <relx> <rely> */
- int cNewWinKoor(void)
- {
- long x1,y1,x2,y2;
-
- if ( GetIntegerParam(&x1) && GetIntegerParam(&y1) &&
- GetIntegerParam(&x2) && GetIntegerParam(&y2) )
- {
- NewKoorWindow(x1,y1,x2,y2);
- return(OK);
- }
- else
- {
- serror(" Falscher Parameter in NewWinKoor. ");
- return(FALSE);
- }
- }
-
- int csetcursor(void)
- {
- long x,y;
-
-
- if (GetIntegerParam(&x) && GetIntegerParam(&y))
- {
- if (FirstWindow!=NULL)
- gotoxy(FirstWindow->x1+x,FirstWindow->y1+y);
- else gotoxy(x,y);
- }
- else {
- serror(" Parameterfehler in SetCursor! ");
- return(FALSE);
- }
-
- return(OK);
- }
-
- int cWinWrite(void)
- {
- long x,y,a;
- int x1,y1;
- char *str;
-
- if (GetIntegerParam(&x) && GetIntegerParam(&y) &&
- GetIntegerParam(&a) && GetStringParam(&str) )
- {
- if (FirstWindow!=NULL)
- {
- x1=FirstWindow->x1;
- y1=FirstWindow->y1;
- } else { x1=y1=0; }
- SET_POS(x1+x,y1+y);
- WR_STR(str,a);
- }
- else {
- serror(" Parameterfehler in WinWrite! ");
- return(FALSE);
- }
-
- return(OK);
- }