|
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