#include <X11/Xlib.h>
#include <X11/keysymdef.h>
#include <X11/cursorfont.h>
#include <X11/Xutil.h>
#include <complex>
#define FALSE 0
#define TRUE 1

typedef std::complex<double> dComplex;

typedef struct // ................................................. XVideoData
{
	Display *display;
	Window *win;
	Window root_window;
	XEvent ev;
	XFontStruct **FontInfo;
	Pixmap *backpix;
	Cursor cursor;
	int screen_num;
	int depth;
	int *height;int *width;
	int *static_x;int *static_y;
	int *UsedWin;
	int nWin;
	// ..........................................................................
	int left_alt_pressed;int right_alt_pressed;
	int left_ctrl_pressed;int right_ctrl_pressed;
	int Num_Lock_pressed;
	int left_shift_pressed;int right_shift_pressed;
	int *dx;
	int *dy;
	int *hx;
	int *hy;
	int *qx;
	int *qy;
	int *yOffs;
	int nFonts;
	unsigned long DefForeGround;unsigned long DefBackGround;
	unsigned long ForeGround;unsigned long BackGround;
	int PaintBackground;
	char *display_name;
	char **FontName;
	Colormap colormap;
	GC gc;
	unsigned long black;
	unsigned long brown;
	unsigned long white;
	unsigned long red[4];
	unsigned long green[4];
	unsigned long blue[4];
	unsigned long cyan[4];
	unsigned long yellow[4];
	unsigned long magenta[4];
	unsigned long gray[100];
} XVideoData;

typedef struct // ................................................... XButton
{
	int x1;int x2;int y1;int y2;
	char *txt;
} XButton;

// =============================================================================

double bisection(double x1,double x2,double accuracy,double (*ptfunz)(double x));
void bracket(double *x1,double *x2,double (*ptfunz)(double x));
void brackmin(double *xa,double *xb,double *xc,double *fa,double *fb,double *fc,
							double (*ptfunz)(double x));
void cfft(dComplex *z,int n,int dir);
void CloseXWindow();
void DblPtDnSrt(double *x,int *ind,int nt);
void dblsort(double *arr,int n);
void erwin(double *x,double xMax,double *eigv,int nEigen,int nStep,
					 double EigvStep,double tolerance,
					 void (* derivs)(double *x,double *y,double *dydx));
void fieldcpy(char *dest,char *source,int n);
void fft(double *z,int nn,int isign);
double golden(double ax,double bx,double cx,double (*ptfunz)(double x),double tol,
							double *xmin);
void householder(double **a,double *d,double *e,int n);
void LeapFrog(double *t,double *x,double *dxdt,int nDim,double dt,int mode,
							void (*derivs)(double *t,double *x, double *dxdt,double *d2xdt2,
														 double step));
void MatVectMult(double **a,double *b,double *c,int nDim);;
void PlotPsi(double *psi,int nPoints,int IsEven,double Norm,int yEigv,
						 unsigned long color);
void RungeStep(double *x,double *y,int nVar,double step,int FirstMidLast,
							 void (*derivs)(double *x,double *y, double *dydx));
void RungKutCS(double *x,double *vstart,int nVar,double xMin, double xMax,
							 int nStep,double *xp,double **yp,int DeltaSave,int *nSaved,
							 void (*derivs)(double *x,double *, double *));
void StartXWindow(int width, int height, int x, int y,char *WindowName,int nWin);
double SymmWell(double *par,double *x,double **y,int nPoints,int DeltaSave,
								double xMax,int iEv,double EigvStart,double EigvStep,double tolerance,
								void (* derivs)(double *x,double *y,double *dydx));
void VectDnPtSort(double **vect,int *ind,int n,int nPos);
void VectPtSort(double **vect,int *ind,int n,int nPos);
void verlet(double *t,double *x,double *dxdt,double *d2xdt2,int nDim,double dt,
	    void (*accel)(double *t,double *x, double *dxdt,double *d2xdt2),
	    int mode);
void XButtonSize(char *str,int iFont,int *width,int *height);
void XCloseSubWin(int num);
int XCPrintf(int iWin,int x,int y,int iFont,int FillBack,const char *fmt,...);
int XCTitle(int x,int y,int iFont,unsigned long ColUp,unsigned long ColDn,
						const char *fmt,...);
void XDelSubWin(int iWin);
int XGetAnsw(int x,int y,int iFont,int MaxLen,char *str,int iWin);
void XhScale(int iWin,int iFont,int FillBack,int xsize,int ox,int oy,
						 double firstpoint,double lastpoint,int numsmallticks);
int Xkbhit(int iWin);
int XMenu(int iFont,char *tit,char **ParName,char **value,int nPar,
					int MaxLen,char **comm,int nComm,int x1,int y1);
void XPaintButton(XButton *bt,int iFont,int state,int iWin);
int XPermMenu(int iFont,char *tit,char **ParName,char **value,int nPar,
							int MaxLen,char **comm,int nComm,int x1,int y1,
							int *MouseX,int *MouseY,int mode,int iWin);
int XPrintf(int iWin,int x,int y,int iFont,int FillBack,const char *fmt,...);
int XReadAfter(int iWin);
void XReadButtKey(int iWin,int *RetKey,int *butt,int *x,int *y);
int XReadKey(int iWin);
void XRedraw();
int XSeqPrintf(int iFont,int FillBack,const char *fmt,...);
int XSubWin(int width, int height, int x, int y,char *WindowName);
int XTitle(int x,int y,int iFont,unsigned long ColUp, unsigned long ColDn,
					 const char *fmt,...);
int XUpCPrintf(int iWin,int x,int y,int iFont,int FillBack,const char *fmt,...);
int XUpPrintf(int iWin,int x,int y,int iFont,int FillBack,const char *fmt,...);
void XvScale(int iWin,int iFont,int FillBack,int ysize,int ox,int oy,
						 double firstpoint,double lastpoint,int numsmallticks);
void XWait(int iWin);
int XWarning(int x1,int y1,int iFont,const char *fmt,...);
int XWinPermMenu(int iFont,char *tit,char **ParName,char **value,int nPar,
								 int MaxLen,char **comm,int nComm,int mode);
int XWinPermMenu(int iFont,char *tit,int *ParFont,char **ParName,char **value,
								 int nPar,int MaxLen,char **comm,int nComm,int mode);
