#include "gdi.h"
#include "winsystem.h"

#define UNIQUE_APP_INSTANCE 0

int init_templates(WindowTemplate& wc); 
int init_windows(GenericWindow& w,WindowTemplate& wc,WindowDriver& d,int nCmdShow);

Cursor cursor;
Icon icon, small_icon(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON));


class WindowMainDriver:public WindowDriver
{
public:
int respond(Window&,WindowMessageData&);
};

void startup_message(const char *message)
{
	message_box(0,message);
}


int PASCAL WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpszCmdLine,
    int nCmdShow )
{

#if(UNIQUE_APP_INSTANCE)

	if(hPrevInstance) return 1;

#endif

	int g=0;

	G_app_instance_data=new AppInstanceData(hInstance,hPrevInstance);


	WindowTemplate wc;

	if (init_templates(wc)) 
        return 1; 

	GenericWindow w;
	WindowMainDriver d;

    if (init_windows(w,wc,d,nCmdShow)) 
        return 1;


	// main thread

	WindowMessageFilter filter(w.get_handle()); 

	while(!GUI_step(filter)){}

	winsystem_thread_cleanup();

	// cleanup

	delete G_app_instance_data;

	return 0;
}


int init_templates(WindowTemplate& wc)
{

	WindowTemplateId wc_id("GenericAppMenu",G_app_instance_data);
	WindowTemplateData wc_data;

	wc_data.cursor=cursor.get_handle();
	wc_data.icon=icon.get_handle();
	wc_data.small_icon=small_icon.get_handle();

	BOOL success = wc.store(wc_data,wc_id); // use defaults

	if(!success) return 1;

	return 0;
}

int init_windows(GenericWindow& w,WindowTemplate& wc,WindowDriver& d,int nCmdShow)
{
	int g=0;

	WindowId parent(G_app_instance_data); // top

	WindowData w_data(wc);

	w_data.area.top=100;
	w_data.area.left=100;
	w_data.area.width=300;
	w_data.area.height=350;

	g=w.create("Generic Application",w_data,parent,d);

	if(g) return 1;

	w.show(nCmdShow);

	w.update();

	return 0;
}


WindowMainDriver::respond(Window& w,WindowMessageData& m)
{
	bool processed=true;

	switch( m.message ) 
	{

		case WM_PAINT:

		{FunctionPaint h(w.get_handle());

			const char *z="Client";
			TextOut( h.dc, 20, 20, z , 6 );
		}

		break;
 
		case WM_DESTROY:

			send_quit_gui_thread(0);
 
		 break;
 

		default:

			processed = false;
	}

	if(processed)
		return 0;

	return 1;
}