blob: d0019b2b18660942e3c972d080dd045ec97e904e [file] [log] [blame]
/*
* USER DCE functions
*
* Copyright 1993 Alexandre Julliard
*/
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
#include "dce.h"
#include "win.h"
#include "gdi.h"
#define NB_DCE 5 /* Number of DCEs created at startup */
extern Display * XT_display;
extern Screen * XT_screen;
static HANDLE firstDCE = 0;
static HDC defaultDCstate = 0;
/***********************************************************************
* DCE_Init
*/
void DCE_Init()
{
int i;
HANDLE handle;
DCE * dce;
for (i = 0; i < NB_DCE; i++)
{
handle = GlobalAlloc( GMEM_MOVEABLE, sizeof(DCE) );
if (!handle) return;
dce = (DCE *) GlobalLock( handle );
dce->hdc = CreateDC( "DISPLAY", NULL, NULL, NULL );
if (!dce->hdc)
{
GlobalUnlock( handle );
GlobalFree( handle );
return;
}
dce->hwndCurrent = 0;
dce->flags = 0;
dce->inUse = FALSE;
dce->xOrigin = 0;
dce->yOrigin = 0;
dce->hNext = firstDCE;
firstDCE = handle;
if (!defaultDCstate) defaultDCstate = GetDCState( dce->hdc );
GlobalUnlock( handle );
}
}
/***********************************************************************
* GetDC (USER.66)
*/
HDC GetDC( HWND hwnd )
{
HANDLE hdce, next;
HDC hdc;
DCE * dce;
DC * dc;
WND * wndPtr = NULL;
if (hwnd)
{
wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
}
for (hdce = firstDCE; (hdce); hdce = next)
{
dce = (DCE *) GlobalLock( hdce );
if (!dce) return 0;
if (!dce->inUse) break;
next = dce->hNext;
GlobalUnlock( hdce );
}
if (!hdce)
{
if (hwnd) GlobalUnlock( hwnd );
return 0;
}
/* Initialize DC */
dc = (DC *) GDI_GetObjPtr( dce->hdc, DC_MAGIC );
if (!dc)
{
if (hwnd) GlobalUnlock( hwnd );
return 0;
}
if (wndPtr)
{
dc->u.x.drawable = XtWindow( wndPtr->winWidget );
dc->u.x.widget = wndPtr->winWidget;
}
else
{
dc->u.x.drawable = DefaultRootWindow( XT_display );
dc->u.x.widget = 0;
}
SetDCState( dce->hdc, defaultDCstate );
dce->hwndCurrent = hwnd;
dce->inUse = TRUE;
hdc = dce->hdc;
GlobalUnlock( hdce );
if (hwnd) GlobalUnlock( hwnd );
#ifdef DEBUG_WIN
printf( "GetDC(%d): returning %d\n", hwnd, hdc );
#endif
return hdc;
}
/***********************************************************************
* ReleaseDC (USER.68)
*/
int ReleaseDC( HWND hwnd, HDC hdc )
{
HANDLE hdce, next;
DCE * dce;
WND * wndPtr = NULL;
#ifdef DEBUG_WIN
printf( "ReleaseDC: %d %d\n", hwnd, hdc );
#endif
if (hwnd)
{
wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
}
for (hdce = firstDCE; (hdce); hdce = next)
{
dce = (DCE *) GlobalLock( hdce );
if (!dce) return 0;
if (dce->inUse && (dce->hdc == hdc)) break;
next = dce->hNext;
GlobalUnlock( hdce );
}
if (hdce)
{
dce->inUse = FALSE;
GlobalUnlock( hdce );
}
if (hwnd) GlobalUnlock( hwnd );
return (hdce != 0);
}