#include "util_121.h"
#include "cCrossCallProcedureTable_121.h"
#include "cTCP_121.h"


/*	Global data with external references: */
extern CrossCallInfo gCci;									/* The global cross call information struct. */
extern int gClipboardCount;									/* Keeps track of changes of clipboard. */
extern CrossCallProcedureTable gCrossCallProcedureTable;	                                /* The cross call procedure table. */
extern GtkTooltips *gTooltip; 	                                                                /* The tooltip control. */

#if defined(mingw32_TARGET_OS)
extern char *gAppName;										/* The application name. */
extern HINSTANCE ghInst;									/* The handle to the instance of the OS thread. */
extern HWND ghMainWindow;									/* The handle to the main HWND of the OS thread. */
extern HACCEL gAcceleratorTable;							/* Refers to the accelerator table of the active frame. */
extern BOOL gAcceleratorTableIsUpToDate;					/* Flag: TRUE iff accelerator table corresponds with active frame. */
extern HWND ghActiveFrameWindow;							/* The currently active frame window (MDI/SDI). */
extern HWND ghActiveClientWindow;							/* The currently active client window (MDI). */
extern HWND gActiveDialog;									/* The currently active dialogue. */
extern HWND ghwndLastModalDialog;							/* Keeps track of last modal dialog. */
extern HFONT gDlogFont;										/* The handle to the logical FONT that is used in dialogs. */
extern HFONT gControlFont;									/* The handle to the logical FONT that is used in all controls. */
extern HWND ghTCPWindow;									/* The handle to the TCP HWND of the OS thread. */


/*	Menu(item)IDs are not allowed to exceed OSMenuIDEnd.
	This is because window ids start at (OSMenuIDEnd+5), and need to be distinct from menu ids
	in case of MDI processes.
	The global gMenuItemID (initially 0) is incremented by NextMenuItemID each time a new
	menu(item)ID is required.
	This implementation does not reuse freed ids and is therefore not adequate!!
*/
#define OSMenuIDEnd		10000
extern UINT NextMenuItemID (void);
#endif


/*	GetModifiers returns the modifiers that are currently pressed.
*/
extern int GetModifiers (void);

/*	Translate virtual key codes to the codes shared with Clean.
	If the keycode could not be translated, zero is returned.
*/
extern int CheckVirtualKeyCode (int keycode);


extern void HandleCleanRequest( CrossCallInfo *pcci );
extern OS WinStartOsThread (OS);
extern OS WinKillOsThread (OS);
extern void WinKickOsThread (int,int,int,int,int,int,int,OS,int*,int*,int*,
                int*,int*,int*,int*,OS*);
extern void KickCleanThread( CrossCallInfo *pcci );

extern void SendMessageToClean( int mess, int p1,int p2,int p3, int p4,int p5,int p6 );

/*	Shorthands for SendMessageToClean: */
#define SendMessage0ToClean(mess)                    SendMessageToClean((mess), 0,0,0,0,0,0)
#define SendMessage1ToClean(mess, p1)                SendMessageToClean((mess), (int)(p1),0,0,0,0,0)
#define SendMessage2ToClean(mess, p1,p2)             SendMessageToClean((mess), (int)(p1),(int)(p2),0,0,0,0)
#define SendMessage3ToClean(mess, p1,p2,p3)          SendMessageToClean((mess), (int)(p1),(int)(p2),(int)(p3),0,0,0)
#define SendMessage4ToClean(mess, p1,p2,p3,p4)       SendMessageToClean((mess), (int)(p1),(int)(p2),(int)(p3),(int)(p4),0,0)
#define SendMessage5ToClean(mess, p1,p2,p3,p4,p5)    SendMessageToClean((mess), (int)(p1),(int)(p2),(int)(p3),(int)(p4),(int)(p5),0)
#define SendMessage6ToClean(mess, p1,p2,p3,p4,p5,p6) SendMessageToClean((mess), (int)(p1),(int)(p2),(int)(p3),(int)(p4),(int)(p5),(int)(p6))

/*	Prototypes of convenience functions that fill CrossCallInfo struct. */
extern CrossCallInfo *MakeReturn0Cci (CrossCallInfo * pcci);
extern CrossCallInfo *MakeReturn1Cci (CrossCallInfo * pcci, int v);
extern CrossCallInfo *MakeReturn2Cci (CrossCallInfo * pcci, int v1, int v2);
extern CrossCallInfo *MakeReturn3Cci (CrossCallInfo * pcci, int v1, int v2, int v3);
extern CrossCallInfo *MakeReturn4Cci (CrossCallInfo * pcci, int v1, int v2, int v3, int v4);
extern CrossCallInfo *MakeReturn5Cci (CrossCallInfo * pcci, int v1, int v2, int v3, int v4, int v5);
extern CrossCallInfo *MakeReturn6Cci (CrossCallInfo * pcci, int v1, int v2, int v3, int v4, int v5, int v6);

extern BOOL IsReturnCci( CrossCallInfo *pcci );

extern void WinInitOs (gboolean*, OS*);
extern gboolean WinCloseOs (OS os);
extern char* WinGetAppPath (void);
extern CLEAN_STRING WinGetModulePath (void);
extern void WinFileModifiedDate (CLEAN_STRING name, gboolean* exists, int *yy,                         int *mm, int *dd, int *h, int *m, int *s);
extern gboolean WinFileExists (CLEAN_STRING);

extern void WinCallProcess(char*,char*,char*,char*,char*,char*,OS,Bool*,int*,OS*);
extern void WinLaunchApp(CLEAN_STRING,BOOL,OS,Bool*,OS*);
extern void WinLaunchApp2(CLEAN_STRING,CLEAN_STRING,BOOL,OS,Bool*,OS*);
