home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 20 / dos_txl / source / windows.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-02-18  |  10.3 KB  |  478 lines

  1. /* WINDOWS.C */
  2. /* (c) 1991 Elmar Warken */
  3.  
  4. #include <stdlib.h>
  5. #include <dos.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <conio.h>
  9. #include "interp.h"
  10. #include "macros.c"
  11. #include "windows.h"
  12.  
  13. /* Benötigte Globalvariablen */
  14. extern    PRGZEILE    *FirstLine;        /* erste Interpreterzeile */
  15. extern    PRGZEILE    *ActLine;        /* aktuelle interpretierte Zeile */
  16. extern    char        *LinePos;        /* Zeilenposition der aktuellen Zeile*/
  17. extern    int        Steuer;                /* der aufrufenden Routine wird mit-    */
  18. extern    TOKBEF        TokBefDesc[];
  19.                                     /* geteilt, um was es sich handelt.         */
  20. extern    char    ScanBuffer[ZEILENLAENGE]; /* Ergebnisbuffer des Scanners */
  21.  
  22. struct windowdata *FirstWindow;
  23. int WindowCounter;
  24.  
  25. char far *SCRSEG=(char far*)0xB8000000;
  26.  
  27. /*** Von Makros verwendeter Zeiger in den Bildschirmspeicher ***/
  28. char far *SCRPTR;
  29.  
  30. void InitWindowSystem()
  31. {
  32.   FirstWindow=NULL;
  33.   WindowCounter=0;
  34. }
  35.  
  36. char *SaveBGround(int x1,int y1,int x2,int y2)
  37. {
  38.   char *Save,*SavePos;
  39.   int i,breite=x2-x1+1;
  40.   unsigned scr;
  41.  
  42.   SavePos=Save=malloc( breite*(y2-y1+1)*2 );
  43.   if (!SavePos)
  44.   {  
  45.     perror(" Speicherplatz voll. "); abort();
  46.   }
  47.  
  48.   scr=(y1-1)*160+(x1-1)*2;
  49.   for (i=y1; i<=y2; i++, SavePos+=breite*2, scr+=160) 
  50.     movedata(0xB800, scr, FP_SEG(SavePos), FP_OFF(SavePos), (x2-x1+1)*2 );
  51.   return(Save);
  52. }
  53.  
  54. void RestoreBGround(int x1,int y1,int x2,int y2, char *BG)
  55. {
  56.   char *SavePos;
  57.   int i,breite=x2-x1+1;
  58.   unsigned scr;
  59.  
  60.   SavePos=BG;
  61.  
  62.   scr=(y1-1)*160+(x1-1)*2;
  63.   for (i=y1; i<=y2; i++, SavePos+=breite*2, scr+=160) 
  64.     movedata( FP_SEG(SavePos),FP_OFF(SavePos), 0xB800, scr, (x2-x1+1)*2 );
  65. }
  66.  
  67. void WriteFirstWin(int x, int y,char a, char *string)
  68. {
  69.   if (FirstWindow==NULL) return;
  70.   SET_POS(FirstWindow->x1+x-1,FirstWindow->y1+y-1);
  71.   WR_STR(string,a);
  72.  
  73. void ClearFirstWin()
  74. {
  75.   int i;
  76.  
  77.   for (i=FirstWindow->y1; i<=FirstWindow->y2; i++)
  78.   { 
  79.     SET_POS(FirstWindow->x1,i); 
  80.     CLEAR_LINE(FirstWindow->Breite,FirstWindow->BackCol);   
  81.   }
  82. }
  83.  
  84. void FrameFirstWin()
  85. {
  86.   UChar col,i;
  87.  
  88.   col=FirstWindow->FrameCol;
  89.  
  90.   SET_POS(FirstWindow->x1,FirstWindow->y1);  WR_SCR('╔',col);
  91.   for (i=1; i<=FirstWindow->Breite-2;i++) WR_SCR('═',col);
  92.   WR_SCR('╗',col);
  93.  
  94.   SET_POS(FirstWindow->x1,FirstWindow->y2);  WR_SCR('╚',col);
  95.   for (i=1; i<=FirstWindow->Breite-2;i++) WR_SCR('═',col);
  96.   WR_SCR('╝',col);
  97.  
  98.   for (i=1; i<=FirstWindow->Hoehe-2; i++)
  99.   {
  100.     SET_POS(FirstWindow->x1,FirstWindow->y1+i); WR_SCR('║',col); /*** OPT! **/
  101.     SET_POS(FirstWindow->x2,FirstWindow->y1+i); WR_SCR('║',col);
  102.   }
  103. }
  104.  
  105. void TopBottomFirstWin(char *top,char *bottom)
  106. {
  107.   FirstWindow->TopL=top;
  108.   FirstWindow->BottomL=bottom;
  109.  
  110.   SET_POS(FirstWindow->x1+2,FirstWindow->y1);
  111.   WR_STR(top,FirstWindow->TopCol);
  112.   SET_POS(FirstWindow->x1+2,FirstWindow->y2);
  113.   WR_STR(bottom,FirstWindow->BottomCol);
  114. }
  115.  
  116. int OpenWindow(char nx1,char ny1,char nx2,char ny2,
  117.            UChar c1,UChar c2,UChar c3,UChar c4)
  118. {
  119.   struct windowdata *Win;
  120.  
  121.   MAX(nx2,80);  /** Bereichsüberprüfung und eventuelle Korrektur **/
  122.   MIN(nx2,1);
  123.   MAX(nx1,nx2);
  124.   MIN(nx1,1);
  125.   MAX(ny2,25);   MIN(ny2,1);
  126.   MAX(ny1,ny2);  MIN(ny1,1);
  127.  
  128.   Win=malloc(sizeof(*Win));
  129.   Win->handle=++WindowCounter;
  130.   Win->x1=nx1; Win->x2=nx2; Win->y1=ny1; Win->y2=ny2;
  131.   Win->FrameCol=c1; Win->BackCol=c2; Win->TopCol=c3; Win->BottomCol=c4;
  132.   Win->BottomL=Win->TopL=NULL; Win->FrameType=1;
  133.   Win->BackGround=SaveBGround(nx1,ny1,nx2,ny2);
  134.   Win->NextWindow=FirstWindow;
  135.   Win->Breite=nx2-nx1+1;
  136.   Win->Hoehe=ny2-ny1+1;
  137.   Win->HelpSave=NULL;
  138.   FirstWindow=Win;
  139.  
  140.   ClearFirstWin();
  141.   FrameFirstWin();
  142.   return(WindowCounter);
  143. }
  144.  
  145. void CloseFirstWindow()
  146. {
  147.   struct windowdata *Win;
  148.  
  149.   if (!WindowCounter) return;
  150.  
  151.   Win=FirstWindow;
  152.   RestoreBGround(Win->x1,Win->y1,Win->x2,Win->y2,Win->BackGround);
  153.   free(Win->BackGround);
  154.   FirstWindow=FirstWindow->NextWindow;
  155.   WindowCounter--;
  156.  
  157.   free(Win);
  158. }
  159.  
  160. void HideWindow(struct windowdata *Win)
  161. {
  162.   Win->HelpSave=SaveBGround(Win->x1,Win->y1,Win->x2,Win->y2);
  163.   RestoreBGround(Win->x1,Win->y1,Win->x2,Win->y2,Win->BackGround);
  164.   free(Win->BackGround);
  165. }
  166.  
  167. void ShowHiddenWindow(struct windowdata *Win)
  168. {
  169.   if (Win->HelpSave) /*** nur möglich, wenn HideFirstWindow */
  170.              /*** aufgerufen wurde ***/
  171.   {
  172.     Win->BackGround=SaveBGround(Win->x1,Win->y1,Win->x2,Win->y2);
  173.     RestoreBGround(Win->x1,Win->y1,Win->x2,Win->y2,Win->HelpSave);
  174.     free(Win->HelpSave);
  175.     Win->HelpSave=NULL;
  176.   }
  177. }
  178.  
  179. void NewKoorWindow(char nx1,char ny1,char nx2,char ny2)
  180. {
  181.   HideWindow(FirstWindow);
  182.  
  183.   MAX(nx2,80);  /** Bereichsüberprüfung und eventuelle Korrektur **/
  184.   MIN(nx2,1);
  185.   MAX(nx1,nx2);  MIN(nx1,1);
  186.   MAX(ny2,25);   MIN(ny2,1);
  187.   MAX(ny1,ny2);  MIN(ny1,1);
  188.  
  189.   FirstWindow->x1=nx1;
  190.   FirstWindow->y1=ny1;
  191.   FirstWindow->x2=nx2;
  192.   FirstWindow->y2=ny2;
  193.   FirstWindow->Breite=nx2-nx1+1;
  194.   FirstWindow->Hoehe=ny2-ny1+1;
  195.  
  196.   FirstWindow->BackGround=
  197.     SaveBGround(FirstWindow->x1,FirstWindow->y1,
  198.         FirstWindow->x2,FirstWindow->y2);
  199.  
  200.   free(FirstWindow->HelpSave);
  201.   FirstWindow->HelpSave=NULL;
  202.   ClearFirstWin();
  203.   FrameFirstWin();
  204. }
  205.  
  206. void ResizeWindow(int relx,int rely)
  207. {
  208.   NewKoorWindow(FirstWindow->x1,FirstWindow->y1,
  209.         FirstWindow->x2+relx,FirstWindow->y2+rely);
  210. }
  211.  
  212. void MoveWindow(int relx,int rely)
  213. {
  214.   NewKoorWindow(FirstWindow->x1+relx,FirstWindow->y1+rely,
  215.         FirstWindow->x2+relx,FirstWindow->y2+rely);
  216. }
  217.  
  218. struct windowdata *GetFirstWindow
  219.      (int number, struct windowdata *Win, struct windowdata *Prev)
  220.  
  221. /**** nur als Hilfsprozedur für NewfirstWindow ****/
  222.  
  223. {
  224.   struct windowdata *ret;
  225.  
  226.   if ((Win->handle != number) && Win->NextWindow)
  227.   {
  228.     HideWindow(Win);
  229.     ret=GetFirstWindow(number,Win->NextWindow,Win);
  230.     ShowHiddenWindow(Win);
  231.     return(ret);
  232.   }
  233.   else if (Win->handle==number)
  234.   {
  235.     HideWindow(Win);
  236.     if (Prev) Prev->NextWindow=Win->NextWindow;
  237.     return(Win);
  238.   }
  239.   else return(NULL);
  240. }
  241.  
  242. void NewFirstWindow(int number)
  243. {
  244.   struct windowdata *Win;
  245.  
  246.   if (FirstWindow->handle != number) 
  247.     if ((Win=GetFirstWindow(number,FirstWindow,NULL))!=NULL)
  248.     {
  249.       ShowHiddenWindow(Win);
  250.       Win->NextWindow=FirstWindow;
  251.       FirstWindow=Win;
  252.     }
  253. }
  254.  
  255. int cwindow(void)    
  256. {
  257.   long x1,y1,x2,y2,c1,c2,c3,c4;
  258.   char *error=" Parameterfehler bei OpenWindow! ";
  259.   char VarName[50];
  260.  
  261.   if ( GetIntegerParam(&x1) && GetIntegerParam(&y1) &&
  262.        GetIntegerParam(&x2) && GetIntegerParam(&y2) &&
  263.        GetIntegerParam(&c1) && GetIntegerParam(&c2) &&
  264.        GetIntegerParam(&c3) && GetIntegerParam(&c4)
  265.      ) OpenWindow(x1,y1,x2,y2,c1,c2,c3,c4);
  266.   else { serror(error); return(FALSE); }
  267.  
  268.   Scan();
  269.   if (Steuer==ALPHA)
  270.   {
  271.     strcpy(VarName,ScanBuffer);
  272.     SetVarInt(VarName,WindowCounter);
  273.   }
  274.   return(OK);
  275. }
  276.  
  277. int cclosewindow(void)    
  278. {
  279.   CloseFirstWindow();
  280.  
  281.   return(OK);
  282. }
  283.  
  284. void WR_STRMAX(char *str,unsigned char a,char max)  
  285. {    
  286.   int i,ii; 
  287.   char *ptr=(str);
  288.  
  289.   i=0;
  290.   while (*ptr!=0 && i++<max)       
  291.   { 
  292.     WR_SCR(*ptr,(a)); 
  293.     ptr++; 
  294.   } 
  295.   for (ii=i; ii<max; ii++)
  296.     WR_SCR(' ',a);     
  297. }
  298.  
  299. void WinReadStr(char *frage, char *ergebnis, int laenge)
  300. {
  301.   int breite,x1;
  302.   breite=laenge;
  303.  
  304.   if (strlen(frage)>breite) breite=strlen(frage);
  305.   x1=40-breite/2-1;
  306.   OpenWindow(x1,10,x1+breite+1,13, 22,24,26,28);
  307.   SET_POS(x1+1,11);
  308.   WR_STR(frage, 30);
  309.   gotoxy(x1+1,12);
  310.   gets(ergebnis);
  311.  
  312.   CloseFirstWindow();
  313. }
  314.  
  315. void Message(char *str)
  316. {
  317.   int breite,x1;
  318.   char c;
  319.  
  320.   breite=30;
  321.   if (strlen(str)>breite) breite=strlen(str);
  322.   x1=40-breite/2-1;
  323.   OpenWindow(x1,10,x1+breite+1,13, 22,24,26,28);
  324.   SET_POS(x1+1,11);
  325.   WR_STR(str, 30);
  326.   SET_POS(x1+1,12);
  327.   WR_STR(" Taste drücken für weiter... ",30);
  328.   c=getch();
  329.  
  330.   CloseFirstWindow();
  331. }
  332.  
  333. int cwindowfirst(void)
  334. {
  335.   long nummer;
  336.   if (GetIntegerParam(&nummer))
  337.     NewFirstWindow(nummer);
  338.   else { serror(" Fensternummer erwartet! "); return(FALSE); }
  339.  
  340.   return(OK);
  341. }
  342.  
  343. /* WinReadStr <frage> <lese-string> <laenge> */
  344. int cWinReadStr(void)
  345. {
  346.   long len;
  347.   char frage[80],*strp,varname[VNLAENGE],antwort[78];
  348.  
  349.   if ( GetStringParam(&strp) && strcpy(frage,strp) &&
  350.        GetStrVarParam(&strp) && strcpy(varname,ScanBuffer) &&
  351.        GetIntegerParam(&len) )
  352.   {
  353.     MAX(len,78);
  354.     WinReadStr(frage,antwort,len);
  355.     SetVarStr(varname,antwort);
  356.     return(OK);
  357.   }
  358.   else 
  359.   {
  360.     serror(" Falscher Parameter in WinReadStr. ");
  361.     return(FALSE);      
  362.   }     
  363. }
  364.  
  365. /* WinMessage <message> */
  366. int cWinMessage(void)
  367. {
  368.   long len;
  369.   char msg[80],*strp;
  370.  
  371.   if ( GetStringParam(&strp) && strcpy(msg,strp))
  372.   {
  373.     Message(msg);
  374.     return(OK);
  375.   }
  376.   else 
  377.   {
  378.     serror(" Falscher Parameter in WinMessage. ");
  379.     return(FALSE);      
  380.   }     
  381. }
  382.  
  383. /* MoveWin  <relx> <rely> */
  384. int cMoveWin(void)
  385. {
  386.   long x,y;
  387.  
  388.   if ( GetIntegerParam(&x) && GetIntegerParam(&y) )
  389.   {
  390.     MoveWindow(x,y);
  391.     return(OK);
  392.   }
  393.   else 
  394.   {
  395.     serror(" Falscher Parameter in MoveWin. ");
  396.     return(FALSE);      
  397.   }     
  398. }
  399.  
  400. /* ResizeWin  <relx> <rely> */
  401. int cResizeWin(void)
  402. {
  403.   long x,y;
  404.  
  405.   if ( GetIntegerParam(&x) && GetIntegerParam(&y) )
  406.   {
  407.     ResizeWindow(x,y);
  408.     return(OK);
  409.   }
  410.   else 
  411.   {
  412.     serror(" Falscher Parameter in ResizeWin. ");
  413.     return(FALSE);      
  414.   }     
  415. }
  416.  
  417. /* NewWinKoor  <relx> <rely> */
  418. int cNewWinKoor(void)
  419. {
  420.   long x1,y1,x2,y2;
  421.  
  422.   if ( GetIntegerParam(&x1) && GetIntegerParam(&y1) &&
  423.        GetIntegerParam(&x2) && GetIntegerParam(&y2) )    
  424.   {
  425.     NewKoorWindow(x1,y1,x2,y2);
  426.     return(OK);
  427.   }
  428.   else 
  429.   {
  430.     serror(" Falscher Parameter in NewWinKoor. ");
  431.     return(FALSE);      
  432.   }     
  433. }
  434.  
  435. int csetcursor(void)    
  436. {
  437.   long x,y;
  438.  
  439.  
  440.   if (GetIntegerParam(&x) && GetIntegerParam(&y))
  441.   {
  442.     if (FirstWindow!=NULL)
  443.       gotoxy(FirstWindow->x1+x,FirstWindow->y1+y);
  444.     else gotoxy(x,y);
  445.   } 
  446.   else  { 
  447.     serror(" Parameterfehler in SetCursor! "); 
  448.     return(FALSE); 
  449.   }
  450.  
  451.   return(OK);
  452. }
  453.  
  454. int cWinWrite(void)
  455. {
  456.   long x,y,a;
  457.   int x1,y1;
  458.   char *str;
  459.  
  460.   if (GetIntegerParam(&x) && GetIntegerParam(&y) &&
  461.       GetIntegerParam(&a) && GetStringParam(&str) )
  462.   {
  463.     if (FirstWindow!=NULL)
  464.     {
  465.       x1=FirstWindow->x1;
  466.       y1=FirstWindow->y1;
  467.     } else { x1=y1=0; }
  468.     SET_POS(x1+x,y1+y);
  469.     WR_STR(str,a);
  470.   } 
  471.   else  { 
  472.     serror(" Parameterfehler in WinWrite! "); 
  473.     return(FALSE); 
  474.   }
  475.  
  476.   return(OK);
  477. }