#include <stdlib.h>

#define	INCL_WIN
#define	INCL_GPI
#include <os2.h>

int		SizeX;
int		SizeY;
HWND		FrameHandle;
HWND		WinHandle;
HMQ		hMessageQueue;
HAB		AnchorBlock;


static int	Random( int high )
{
    return( ( (double)rand() / 32767 ) * high );
}

static void NewColor( HPS ps )
{
    GpiSetColor( ps, Random( 15 ) + 1 );
}

static void DrawEllipse()
{
    POINTL	ptl;
    HPS		ps;
    static int	Odd = 0;
    int		parm1,parm2;

    ps = WinGetPS( WinHandle );
    ptl.x = Random( SizeX );
    ptl.y = Random( SizeY );
    GpiMove( ps, &ptl );
    ptl.x = Random( SizeX );
    ptl.y = Random( SizeY );
    parm1 = Random( 50 );
    parm2 = Random( 50 );
    if( Random( 10 ) >= 5 ) {
	NewColor( ps );
	GpiBox( ps, DRO_FILL, &ptl, 0, 0 );
	NewColor( ps );
	GpiBox( ps, DRO_OUTLINE, &ptl, 0, 0 );
    } else {
	NewColor( ps );
	GpiBox( ps, DRO_FILL, &ptl, parm1, parm2 );
	NewColor( ps );
	GpiBox( ps, DRO_OUTLINE, &ptl, parm1, parm2 );
    }
    Odd++;
    Odd &= 1;
    WinReleasePS( ps );
}

MRESULT	EXPENTRY MainDriver( HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2 )
{
    HPS		ps;
    RECTL	rcl;

    switch( msg ) {
    case WM_CREATE:
	WinHandle = hwnd;
	WinStartTimer( AnchorBlock, WinHandle, 1, 150 ) ;
	break;
    case WM_TIMER:
        DrawEllipse();
	return( 0 );
    case WM_SIZE:
	SizeX = SHORT1FROMMP( mp2 );
	SizeY = SHORT2FROMMP( mp2 );
	return( 0 );
    case WM_PAINT:
        ps = WinBeginPaint( WinHandle, NULL, NULL );
	WinQueryWindowRect( WinHandle, &rcl );
	WinFillRect( ps, &rcl, CLR_WHITE );
	WinEndPaint( ps );
	return( 0 );
    }
    return( WinDefWindowProc( WinHandle, msg, mp1, mp2 ) );
}

int	main()
{
    ULONG	style;
    QMSG	qmsg;

    AnchorBlock = WinInitialize( 0 );
    if( AnchorBlock == 0 ) return( 0 );
    hMessageQueue = WinCreateMsgQueue( AnchorBlock, 0 );
    if( hMessageQueue == 0 ) return( 0 );
    if( !WinRegisterClass( AnchorBlock, (PSZ)"WATCOM", (PFNWP)MainDriver,
                           CS_SIZEREDRAW, 0 ) ) {
	return( 0 );
    }
    style = FCF_TITLEBAR | FCF_SYSMENU | FCF_SIZEBORDER | FCF_MINMAX |
	    FCF_SHELLPOSITION | FCF_TASKLIST;
    FrameHandle = WinCreateStdWindow( HWND_DESKTOP, WS_VISIBLE, &style,
				      (PSZ)"WATCOM", (PSZ)"", 0, NULL, 0,
				      &WinHandle );
    if( FrameHandle == 0 ) return( 0 );

    while( WinGetMsg( AnchorBlock, &qmsg, NULL, 0, 0 ) ) {
	WinDispatchMsg( AnchorBlock, &qmsg );
    }

    WinDestroyWindow( FrameHandle );
    WinDestroyMsgQueue( hMessageQueue );
    WinTerminate( AnchorBlock );

    return( 1 );
}
