/********************************************************************/
/* Funktionsprototypen fr Funktionen, die die Kommunikation mit
   GEMINI bzw. Venus vereinfachen
   
   (c) 1990 by Stephan Gerle
   
   E-Mail: Maus Net: Stephan Gerle @ DO
   
   Stand: 25.10.1990
   
   Smtliche Funktionen liefern bei Fehlfunktion einen Wert ungleich
   0 zurck. Es sei denn, sie liefern normalerweise einen Pointer
   zurck. Dann liefern die Funktionen den Nullpointer.
   
   Siehe auch VAPROTO.H.
   
   Achtung: 5er Tabs
*/

#ifndef __VAFUNC_H
#define __VAFUNC_H

#include <vaproto.h>



/*** Globale Variablen fr die Library fr das AV-Protokoll **********/



/* Timeout fr AV-Funktionen in Millisekungen. Steht defaultmig
   auf 700 msec. */
   
extern int	AVTimeout;

/* AVName ist ein Pointer auf einen String, in dem der Name der
   Hauptapplikation steht, die das AV-Protokoll beherrscht.
   Diese Variable wird durch AVActive gesetzt. Der String ist ein
   Leerstring, wenn das Hauptprogramm das AV-Protokoll nicht versteht.*/
   
extern char	AVName[];


/*** Funktionen fr die Protokolluntersttzung ***********************/


/* AVInit mu einmal beim Start des Acc's aufgerufen werden. Damit
   wird die Applikationsid, der Name des Acc (wie bei appl_find benutzt;
   also 8 des Programmnamens eventuell mit Leerzeichen aufgefllt) sowie
   die vom Acc untersttzten Funktionen als Bitvektor den Funktionen
   fr das AV-Protokoll bergeben.
   Die Funktion msgfunc sollte alle GEM-Messages zur Behandlung von Fenstern
   verarbeiten. Der Rckgabewert ist reserviert fr sptere Anwendungen und
   mu in dieser Version den Wert 0 haben.
   Insbesondere WM_REDRAW sollte durch diese Message behandelt
   werden. Diese Funktion wird aufgerufen, wenn whrend des Wartens auf eine
   Antwort von der Hauptapplikation eine nicht vorgesehene Message auftaucht.
   Dieser Parameter kann auch NULL sein, falls eine solche Funktion nicht
   aufgerufen werden soll.
   Diese Routine sollte direkt vor Eintritt in die Messageloop
   aufgerufen werden. */

void	AVInit(int myapid,char *myname,int myprotostatus,int (*msgfunc)(int *msg));


/* Ermittelt, ob Gemini oder Venus bzw. irgendein Hauptprogramm,
   welches das AV-Protokoll versteht, aktiv ist.
   Wenn nein, so wird 0 zurckgeliefert, sonst der Bitvektor,
   der sonst in Word 3 bei der message VA_PROTOSTATUS
   zurckgeliefert wird.
   Falls der Protokollstatus noch nicht ermittelt werden konnte, so
   wird eine entsprechende Message an das Hauptprogramm geschickt. */
   
int	AVActive(void);


/* Sorgt dafr, das der AV-Protokoll-Status neu ermittelt wird. Diese
   Funktion wird bei einem AC_CLOSE durch AVProcessMsg() automatisch
   aufgerufen. */
   
void	AVGetNewProtoStatus(void);


/* Sendet Statusinformationen an die Hauptapplikation. */
   
int	AVSendStatus(char *status);


/* Fragt bei der Hauptapplikation den fr das Acc gespeicherten Status
   nach.
   Als Antwort kommt von der Hauptapplikation die Meldung VA_SETSTATUS.
   Erfolgt die Antwort innerhalb des Timeout Limits, so liefert
   AVReceiveStatus eine Pointer auf den String zurck.
   Ansonsten mu die Meldung VA_SETSTATUS in der Messageloop behandelt
   werden. In msg[3/4] ist ein Pointer auf einen String, der den
   Status enthlt. */

char	*AVReceiveStatus(void);


/* AVProcessMsg muss fr jede empfangene Message aufgerufen werden.
   AVProcessMsg liefert einen Wert ungleich 0, falls sich der
   Protokollstatus gendert hat. */
   
int	AVProcessMsg(int *msg);



/*** Programmspezifische Funktionen *********************************/



/* Emittelt den fr Verzeichnisfenster eingestellten Font und die
   Fonthhe */

int	AVAskFileFont(int *fontid,int *fontheight);


/* Dasselbe wie AVAskFileFont, nur fr das Console-Fenster */

int	AVAskConsoleFont(int *fontid,int *fontheight);


/* Liefert einen Pointer auf einen String, in dem die Namen der
   selektierten Objekte (getrennt durch ' ') stehen.
   Bei Fehler wird NULL zurckgeliefert */
   
char	*AVAskSelectedObjects(void);


/* Sagt Gemini, da das Console-Fenster geffnet werden soll. */

int	AVOpenConsole(void);


/* Sagt der Hauptapplikation, das ein Fenster mit dem Verzeichnis
   pfad und der Maske mask geffnet werden soll. */
   
int	AVOpenWindow(char *pfad,char *mask);


/* Startet mittels Venus bzw. Gemini ein Programm. In pfad steht
   der komplette Pfad und der Programmname. cmdline enthlt
   die Kommandozeile fr das zu startende Programm. */
   
int	AVStartProgram(char *pfad,char *cmdline);


/* Sagt der Hauptapplikation, da das Accessorie ein Fenster geffnet hat. */

int	AVAccOpenedWindow(int winhandle);


/* Sagt der Hauptapplikation, da das Accessorie ein Fenster geschlossen hat.
   (ist nur bei nicht durch AC_CLOSE bedingtem Schlieen notwendig) */
   
int	AVAccClosedWindow(int winhandle);


/* Schickt der Hauptapplikation einen Tastaturevent. Ist dann anzuwenden,
   wenn ein ACC ein Fenster offen hat, und einen Tastendruck bekommt,
   den es selber nicht verwendet. */

int	AVSendKeyEvent(int state,int key);


/*** Zur Anwendung ***************************************************/

#ifdef __DO_NOT_DEFINE

/* Hier ein minimales Skelett fr die Verwendung der AV-Funktionen. */

int	HandleGEMMessage(int *msg)
{
	switch (msg[0])
	{
		case	WM_FULLED:	...
		case	WM_SIZED:		...
		case	WM_MOVED:		...
		case	WM_REDRAW:	...
		case	WM_TOPPED:	...
		case	WM_ARROWED:	...
		case WM_VSLID:		...
		case WM_HSLID:		...
	}
	return 0;	/* Rckgabewert reserviert fr sptere Anwendung. In dieser
			   Version 0 zurckgeben. */
}

void	HandleMessage(int *msg)
{
	int	FontId,FontPointsHeight;
	char	*status;
	
	if (AVProcessMsg(msg))
	{
		/* Protokollstatus hat sich gendert */

		AVAskFileFont(&FontId,&FontPointsHeight);
		status = AVReceiveStatus();
		...
	}
	switch (msg[0])
	{
		case	VA_SETSTATUS:
					/* msg[3] und msg[4] enthalten Pointer auf
					   String mit Status (kann auch NULL sein) */
					...
					break;
		case	VA_START:
					/* msg[3] und msg[4] enthalten Pointer auf
					   Kommandozeile */
					...
					break;
		case	VA_DRAGACCWIND:
					/* msg[6] und msg[7] enthalten Pointer auf
					   String mit Liste der auf das Fenster gezogenen
					   Objekte. */
					...
					break;
		...
		default:		HandleGEMMessage(msg);
					break;

	}
}

void	HandleKey(int ks,int kb)
{
	switch (kb)
	{
		...
		default:	AVSendKeyEvent(ks,kb);
				break;
	}
}

void	EventLoop(void)
{
	int	event,msg[8],kb,ks;
	
	do
	{
		event = evnt_multi(MU_MESAG|MU_KEYBD...,...,msg,...,ks,kb,...);
		if (event&MU_MESAG)
			HandleMessage(msg);
		if (event&MU_KEYBD)
			HandleKey(ks,kb);
		...
	} while (!QuitFlg);
}

/* Die AV-Protokollfunktionen mssen durch den Aufruf von AVInit()
   initialisiert werden. Dieser Aufruf sollte direkt vor Eintritt
   in die Eventloop auftauchen. */

int	gl_apid;

void	main(void)
{
	if ((gl_apid = appl_init())>=0)
	{
		...
		AVInit(gl_apid,"ACCNAME ",1|2,HandleGEMMessage);
		EventLoop();
		...
	}
}
#endif
#endif