mxFenster.c


/* mxFenster.c */

#include "mxFenster.h"
#include "mxStrukturen.h"
#include "mxSemaphor.h"
#include "mxSeriell.h"
#include "mxVT.h"
#include "mxEingabePuffer.h"


/* -------------------------------------------------------------------------------------------------------------------- */
/**********************
** Globale Variablen **
**********************/
tFenster       FensterTabelle[cFensterAnzahl];                          /* Tabelle, in der die Daten aller Fenster      */
                                                                        /* verwaltet werden                             */
tFensterNummer EingabeFokus;                                            /* Fenster, in dem aktuell die Eingaben landen  */
tFensterNummer LetztesBenutztesFenster;                                 /* Fenster, in das zuletzt ein Zeichen          */
                                                                        /* geschrieben wurde, also auch die             */
                                                                        /* ScrollRegion und die Cursorposition gesetzt  */
                                                                        /* wurde.                                       */

/* -------------------------------------------------------------------------------------------------------------------- */
/********************
** Hilfsfunktionen **
********************/

void FensterZeilenAnfang( tFensterNummer Fenster )
/*
 * berechnete Cursorposition auf Zeilenanfang
 */
{
  FensterTabelle[Fenster].X = 1;
}

void FensterNaechsteZeile( tFensterNummer Fenster )
/*
 * berechnete Cursorposition auf naechste Zeile
 */
{
  if(FensterTabelle[Fenster].Y < FensterTabelle[Fenster].Hoehe)
  {
    FensterTabelle[Fenster].Y++;
  }
}

void FensterNaechstePosition( tFensterNummer Fenster )
/*
 * berechnete Cursorposition ein Zeichen weiter, ggf. LF ausgeben
 */
{
  FensterTabelle[Fenster].X++;
  if(FensterTabelle[Fenster].X > FensterTabelle[Fenster].Breite)
  {
    FensterZeilenAnfang(Fenster);
    FensterNaechsteZeile(Fenster);
    SchreibSeriell(cLF);
  }
}

void FensterVorigePosition( tFensterNummer Fenster )
/*
 * berechnete Cursorposition ein Zeichen zurueck bis maximal Zeilenanfang
 */
{
  FensterTabelle[Fenster].X--;
  if(FensterTabelle[Fenster].X < 1)
  {
    FensterZeilenAnfang(Fenster);                                       /* zurueck bis maximal Zeilenanfang             */
  }
}

/* -------------------------------------------------------------------------------------------------------------------- */

void FensterAusgabe( tFensterNummer Fenster, char C )
/*
 * Zeichen C in Fenster ausgeben, alle Steuercodes beruecksichtigen
 */
{
  if(LetztesBenutztesFenster != Fenster)                                /* muss Cursor und Scrollbereich gesetzt werden?*/
  {
    LetztesBenutztesFenster = Fenster;
    ScrollRegion(FensterTabelle[Fenster].AnfangY,
    FensterTabelle[Fenster].EndeY);
    Position(FensterTabelle[Fenster].AnfangX + FensterTabelle[Fenster].X - 1,
	     FensterTabelle[Fenster].AnfangY + FensterTabelle[Fenster].Y - 1);
  }
  if((' ' <= C) && (C <= '~'))                                          /* normales Zeichen? [CHR(32)..CHR(126)] */
  {
    SchreibSeriell(C);
    FensterNaechstePosition(Fenster);
  }
  else
  {
    switch(C)                                                           /* neue Position berechnen                      */
    {
    case cBS:                                                           /* 1 Zurueck                                    */
    case cDEL:                                                          /* 1 Zurueck                                    */
      FensterVorigePosition(Fenster);
      SchreibSeriell(C);
      break;
    case cCR:                                                           /* Ruecklauf                                    */
      FensterZeilenAnfang(Fenster);
      SchreibSeriell(C);
      break;
    case cLF:                                                           /* Zeile nach unten                             */
      FensterZeilenAnfang(Fenster);
      FensterNaechsteZeile(Fenster);
      SchreibSeriell(C);
      break;
    case cBEL:                                                          /* Glocke                                       */
      SchreibSeriell(C);
      break;
    default:                                                            /* sonstiges Zeichen                            */
      break;
	}
  }
}

/* -------------------------------------------------------------------------------------------------------------------- */

void FensterEingabe( tFensterNummer Fenster, char *s, int Wieviel )
/*
 * String s (max. Wieviel Zeichen) in Fenster einlesen,
 * inklusive Echo und einfaches Editieren
 */
{
  int  i;
  char c;
  int fertig;

  i = 0;
  fertig = FALSE;
  while (!fertig)
  {
    c = LiesAusPuffer( &FensterTabelle[Fenster].Puffer );
    if ((c == cDEL || c == cBS) && i > 0)                               /*       DEL oder Backspace und nicht vorne?    */
    {
      FensterAusgabe(Fenster,cBS);                                      /*           nein -> letztes Zeichen loeschen   */
      FensterAusgabe(Fenster,' ');
      FensterAusgabe(Fenster,cBS);
      i--;
    }
    else if (c == cLF)                                                  /*       Eingabe fertig?                        */
    {
      FensterAusgabe(Fenster,cLF);                                      /*           Zeilenvorschub,                    */
      FensterAusgabe(Fenster,cCR);                                      /*           zusaetzlich Wagenruecklauf         */
      fertig = TRUE;
    }
    else if (c >= ' ' && c <= '~' && i < Wieviel-1)                     /*       normales Textzeichen und Platz?        */
    {
      s[i++] = c;                                                       /*           ablegen...                         */
      FensterAusgabe(Fenster,c);                                        /*           ...und Echo                        */
    }
    else                                                                /*       irgendwas ist falsch!                  */
    {
      FensterAusgabe(Fenster,cBEL);                                     /*           wir klingeln mal                   */
    }
  }
  s[i] = cNUL;                                                          /*       Eingabe mit NUL abschliessen           */
}

/* -------------------------------------------------------------------------------------------------------------------- */

void MaleFenster(void)
/*
 * Malt Fenster-Begrenzungen auf den Bildschirm.
 * Voraussetzung: FensterTabelle ist ordentlich initialisiert
 */
{
  int i, k;

  Loeschen();                                                           /* Bildschirm loeschen                          */

  for(i=0; i<cFensterAnzahl; i++)                                       /* Fenster malen                                */
  {
    if (FensterTabelle[i].AnfangY > 1)                                  /* ueber dem Fenster noch Platz frei?           */
    {
      Position(FensterTabelle[i].AnfangX,                               /* Cursor auf Zeile ueber dem Fenster           */
	       FensterTabelle[i].AnfangY - 1 );

      Invers();
      for(k=0; k<FensterTabelle[i].Breite; k++) SchreibSeriell(' ');    /* Balken ueber dem Fenster einzeichnen         */
      AttributeReset();
    }

    if (FensterTabelle[i].EndeY < cBildschirmHoehe)                     /* unter dem Fenster noch Platz frei?           */
    {
      Position(FensterTabelle[i].AnfangX,                               /* Cursor auf Zeile ueber dem Fenster           */
	       FensterTabelle[i].EndeY + 1 );

      Invers();
      for(k=0; k<FensterTabelle[i].Breite; k++) SchreibSeriell(' ');    /* Balken unter dem Fenster einzeichnen         */
      AttributeReset();
    }
  }
}

/* -------------------------------------------------------------------------------------------------------------------- */
/*********************
** Dienstfunktionen **
*********************/

/*
 * hier seid Ihr gefordert!
 */



Bei Problemen mit der Seite bitte eine Mail an Marek
Converted with C2HTML V0.669 by Iluvatar
Prozeßdatenverarbeitung