| /* |
| * 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); |
| } |