blob: aaea4b012c115a08a498025bfe5e0f1de310f684 [file] [log] [blame]
/*
* USER DCE functions
*
* Copyright 1993 Alexandre Julliard
*/
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
#include "dce.h"
#include "class.h"
#include "win.h"
#include "gdi.h"
#include "user.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 = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(DCE) );
if (!handle) return;
dce = (DCE *) USER_HEAP_ADDR( handle );
dce->hdc = CreateDC( "DISPLAY", NULL, NULL, NULL );
if (!dce->hdc)
{
USER_HEAP_FREE( 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 );
}
}
/***********************************************************************
* GetDC (USER.66)
*/
HDC GetDC( HWND hwnd )
{
HANDLE hdce;
HDC hdc = 0;
DCE * dce;
DC * dc;
WND * wndPtr = NULL;
CLASS * classPtr;
if (hwnd)
{
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 0;
if (wndPtr->hdc) hdc = wndPtr->hdc;
else if (classPtr->hdc) hdc = classPtr->hdc;
}
if (!hdc)
{
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
{
dce = (DCE *) USER_HEAP_ADDR( hdce );
if (!dce) return 0;
if (!dce->inUse) break;
}
if (!hdce) return 0;
dce->hwndCurrent = hwnd;
dce->inUse = TRUE;
hdc = dce->hdc;
}
/* Initialize DC */
if (!(dc = (DC *) GDI_GetObjPtr( dce->hdc, DC_MAGIC ))) return 0;
if (wndPtr)
{
dc->u.x.drawable = XtWindow( wndPtr->winWidget );
dc->u.x.widget = wndPtr->winWidget;
if (wndPtr->dwStyle & WS_CLIPCHILDREN)
XSetSubwindowMode( XT_display, dc->u.x.gc, ClipByChildren );
else XSetSubwindowMode( XT_display, dc->u.x.gc, IncludeInferiors);
}
else
{
dc->u.x.drawable = DefaultRootWindow( XT_display );
dc->u.x.widget = 0;
XSetSubwindowMode( XT_display, dc->u.x.gc, IncludeInferiors );
}
#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;
CLASS * classPtr;
#ifdef DEBUG_WIN
printf( "ReleaseDC: %d %d\n", hwnd, hdc );
#endif
if (hwnd)
{
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
if (wndPtr->hdc && (wndPtr->hdc == hdc)) return 1;
if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 0;
if (classPtr->hdc && (classPtr->hdc == hdc)) return 1;
}
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
{
if (!(dce = (DCE *) USER_HEAP_ADDR( hdce ))) return 0;
if (dce->inUse && (dce->hdc == hdc)) break;
}
if (hdce)
{
SetDCState( dce->hdc, defaultDCstate );
dce->inUse = FALSE;
}
return (hdce != 0);
}