Release 940405

Tue Apr  5 14:36:59 1994  Bob Amstadt  (bob@pooh)

	* [include/mdi.h] [windows/mdi.c]
	Use WM_PARENTNOTIFY messages to activate children.
	Generate WM_CHILDACTIVATE messages.
	Beginnings handler for maxmized child window.
	Clean up when children are destroyed.

	* [windows/message.c] [windows/nonclient.c] [windows/winpos.c]
	Removed code add 94/03/26.

Apr 4, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [control/menu.c]
	Make mouse menu navigation working again. :-))
	(be carefull, clicking outside menus (ie.: clientrect) 
	not resolved yet)

	* [windows/nonclient.c]  [controls/scroll.c]
	Bugs fix in NCTrackScrollBars().

	* [misc/dos_fs.c]
	Bug fix in 'ToDos()' in conversion for '/',
		(example: '/window/' was translated to 'WINDOWs').

	* [miscemu/int21.c]
	Function ChangeDir() extract possible drive before DOS_ChangeDir().

	* [loader/library.c]  [loader/wine.c]
	Playing around moving function GetProcAddress() and put some code in.

Mon Apr  4 21:39:07 1994  Alexandre Julliard (julliard@lamisun.epfl.ch)

	* [misc/main.c]
	Better explanation of command-line options.

	* [objects/dib.c]
	Implemented SetDIBitsToDevice().

	* [windows/dc.c]
	Bug fix in SetDCState().

	* [windows/event.c]
	Removed WS_DISABLED handling (now done in message.c).

	* [windows/message.c]
	Added sending a WM_PARENTNOTIFY message in MSG_TranslateMouseMsg().
	Use WindowFromPoint() to find the window for mouse events, taking
	into account disabled windows.

	* [windows/painting.c]
	Bug fix in BeginPaint() to allow calling it at other times than
	on WM_PAINT (Solitaire needs it...)

	* [windows/win.c]
	Implemented FindWindow().
	Rewritten EnableWindow() to behave more like Windows.

	* [windows/winpos.c]
	Rewritten WindowFromPoint() to also search child windows.

Mon Apr  4 17:36:32 1994  Erik Bos (erik@trashcan.hacktic.nl)

	* [include/int21.h] -> [msdos.h]
	renamed.

	* [miscemu/int10.h] [miscemu/int25.h] [miscemu/int26.h] 
	new, added for int 10, 25 and 26.

	* [miscemu/ioports.c]
	new, added to allow win apps to use ioports.

	* [loader/signal.c]
	Added support for in, inb, out, outb instructions.

Sun Mar 27 13:40:25 1994  Bob Amstadt  (bob@pooh)

	* controls/menu.c (InsertMenu): Changed to use FindMenuItem().

Sat Mar 26 21:23:55 1994  Bob Amstadt  (bob@pooh)

	* [windows/mdi.c]
	Window list properly updated.

	* [windows/message.c]
	Call WINPOS_ChildActivate() when mouse pressed.

	* [windows/nonclient.c]
	Use WINPOS_IsAnActiveWindow() instead of GetActiveWindow() in
	NC_HandleNCPaint().

	* [windows/winpos.c]
	Created functions WINPOS_IsAnActiveWindow() and WINPOS_ActivateChild()

Thu Mar 24 14:49:17 1994  Bob Amstadt  (bob@pooh)

	* controls/menu.c (DeleteMenu): Changed to use FindMenuItem
	(DeleteMenu): Many bug fixes.

	* [controls/menu.c]
	Created function FindMenuItem().

Thu Mar 24 14:17:24 1994  Bob Amstadt  (bob@pooh)

	* [windows/win.c]
	Removed incorrect MDI handling code from CreateWindowEx().

	* [controls/menu.c]
	MF_STRING items needed to allocate a private copy of string.

	* [controls/menu.c]
	Fixed buggy calls to GlobalFree().

	* [memory/global.c]
	Eliminated some redundant code with function call.

Wed Mar 23 1994 Pentti Moilanen (pentti.moilanen@ntc.nokia.com)

	* [windows/timer.c]
	timer list pointers looped in InsertTimer

Tue Mar 29 13:32:08 MET DST 1994  julliard@di.epfl.ch (Alexandre Julliard)

	* [misc/cursor.c]
	A few changes for desktop window support.

	* [misc/main.c]
	Added -depth option.

	* [misc/rect.c]
	Yet another bug fix in SubtractRect().

	* [objects/bitmap.c]
	Changes to use only one depth (specified with -depth)
	for color bitmaps.

	* [objects/brush.c]
	Added support for dithered solid brushes.

	* [objects/color.c]
	Use the same 20 system colors as in Windows.
	System palette initialisation now done in COLOR_InitPalette().
	Added support for a color mapping table to map logical color
	indexes to X colormap entries.
	Implemented GetNearestColor() and RealizeDefaultPalette().

	* [objects/dib.c]
	Added support for color mapping table.

	* [objects/dither.c]  (New file)
	Implemented solid color dithering.

	* [objects/palette.c]
	Implemented GetSystemPaletteEntries() and SelectPalette().

	* [windows/class.c]
	Make a copy of the menu name in RegisterClass().

	* [windows/dc.c]
	Fixed device caps when using a desktop window.
	Added support for the color mapping table in DCs.

	* [windows/event.c]
	Added ConfigureNotify handler on desktop window.

	* [windows/message.c]
	Removed call to XTranslateCoordinates() on every mouse motion
	New function MSG_Synchronize() to synchronize with the X server.

	* [windows/syscolor.c]
	Rewritten SYSCOLOR_Init() to read the system colors from WIN.INI.

	* [windows/winpos.c]
	Added synchronization on window mapping. Solves the double redraw
	problem when starting Solitaire.

Mar 27, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [control/menu.c]	* [windows/defwnd.c]
	Make keyboard navigation working with menubar,
	but temporarely inserted a bug in menubar mouse handling ... :-((
	(it will be fix next week !)

	* [windows/defwnd.c]
	Connect VK_MENU to menubar navigation.

	* [loader/library.c]
	GetModuleHandle() return 'fictive 0xF000+ handles' for built-in DLLs.

Sun Mar 20 22:32:13 1994 Erik Bos (erik@trashcan.hacktic.nl)

	* [misc/main.c]
	Added Copy(). Added a check for `-h' to show usage.

	* [misc/dos_fs.c]
	Fixed bug in FindFile(), to load directories as dlls.

	* [misc/dos_fs.c]
	Fixed ToUnix() and ToDos() again, as my previous patch
	didn't make it.

	* [misc/dos_fs.c] [miscemu/int21.c]
	Bug fixes, should be able to handle all winfile and progman int21
	requests now except for a few small things.

Tue Mar 29 06:25:54 1994  crw@harris.mlb.semi.harris.com (Carl Williams)

	* [memory/heap.c]
	Implemented GetFreeSystemResources().

Mon Mar 21 17:32:25 1994  Bob Amstadt  (bob@pooh)

	* controls/menu.c (GetSubMenu): Function did not return correct value

	* [windows/mdi.c]
	Beginnings of menu handling.

Thu Mar 10 11:32:06 1994  Stefan (SAM) Muenzel  (muenzel@tat.physik.uni-tuebingen.de)

	* [objects/font.c]
	if font.width equals zero use asterix instead.

Mon Mar 21 17:23:37 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)

	* [objects/bitmap.c]
	Rewritten bitmap code to use exclusively X pixmaps; *much* faster.

	* [objects/brush.c]
	Some changes with pattern brushes because of the new bitmap code.

	* [objects/color.c]
	Added function COLOR_ToPhysical for better color mapping.

	* [objects/dib.c]
	Heavily optimized SetDIBits().

	* [windows/dc.c]
	Opimized SetDCState() and DC_SetupGC*() functions.
	Added stub for CreateIC().

Mar 20, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [misc/message.c]
	Call SetFocus() after closing box to give back focus to previous owner.

	* [misc/files.c]
	Small bug fix in GetTempFilename() : replace a '\' to '\\'.

	* [control/scroll.c]
	Calls to BitBlt() replace by StretchBlt().

	* [control/menu.c]
	Call SetFocus() to previous owner after closing Popups.	
	Fill stub DeleteMenu().

	* [control/listbox.c]
	* [control/combo.c]
	Use SetFocus() in WM_LBUTTONDOWN.
	Close ComboBox List upon WM_KILLFOCUS.
	Early development of WM_MEASUREITEM mecanism.

	* [windows/defwnd.c]
	Early development of WM_MEASUREITEM mecanism.

Tue Mar 22 10:44:57 1994  Miguel de Icaza  (miguel@xochitl)

	* [misc/atom.c]
	Fixed sintaxis problem when building the library.

Tue Mar 15 13:11:56 1994  Bob Amstadt  (bob@pooh)

	* [include/windows.h]
	Added message types and structures for MDI

	* [include/mdi.h]
	Created internal structures for handling MDI

	* [windows/mdi.c]
	Began creating MDI support

Thu Mar 10 16:51:46 1994  Bob Amstadt  (bob@pooh)

	* [loader/wine.c] [include/wine.h]
	Added new field to "struct w_files" to hold the "name table"
	resource for Windows 3.0 programs

	* [loader/resource.c]
	Added code to handle programs with a "name table" resource.
	LoadResourceByName() modified to check for the existence of
	this resource.

Mon Mar 14 22:31:42 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)

	* [objects/color.c]
	Added installing the private colormap on the desktop window.

	* [windows/event.c]
	Cleaned up focus event handling (see focus.c).
	Use GetFocus() to direct key events to the correct window.

	* [windows/focus.c]
	Rewritten SetFocus() to:
	- only set X focus on top-level windows
	- send WM_SETFOCUS and WM_KILLFOCUS messages (was done in event.c)
	- prevent setting focus to disabled windows
	- install private colormap so -privatemap option works again

	* [windows/message.c] [windows/timer.c]
	Changed timer management to no longer use PostMessage(), but
	to generate timer messages on the fly. Also fixed a related bug
	in GetMessage() which could cause busy-waiting.

	* [windows/win.c]
	Only select focus events on top-level windows.

	* [windows/winpos.c]
	Added some sanity checks for desktop window.

Fri Mar  4 20:42:01 1994  Erik Bos (erik@trashcan.hacktic.nl)

	* [misc/dos_fs.c]
	bug fixes in ToUnix(), WinIniFileName(), GetUnixFileName(). 
	Support for tilde symbol added for rootdirectories in [drives]
	section of wine's configfile.

	* [misc/file.c]
	hread(), hwrite() added.

	* [misc/main.c]
	hmemcpy() added.

	* [if1632/stress.spec] [include/stress.h] [misc/stress.c]
	Added STRESS.DLL, an useless dll used to stress a windows system.

	* [*/*]
	Added missing #includes, fixed prototypes for prototype checking.

	* [include/prototypes.h]

	Added prototypes for loader/*c, if1632/*c.

Tue Mar  8 09:54:34 1994  Bob Amstadt  (bob@pooh)

	* [Configure]
	Added reminder to set WINEPATH, if it is not set.

	* [Imakefile]
	Removed #elif's

	* [controls/button.c]
	Added BN_CLICKED notification for owner-draw buttons.

	* [if1632/kernel.spec] [memory/heap.c]
	Changed Local* functions to WIN16_Local* to prevent unconcious use
	of these functions.

	* [if1632/relay.c]
	Push old Stack16Frame on stack before setting.

	* [include/atom.h] [misc/atom.c] [include/heap.h] [memory/local.c]
	Added multiple local heap handling in Atom* functions.

	* [include/regfunc.h] [miscemu/int21.c]
	Rewrote DOS3Call() use context frame that is already on the stack.

	* [misc/profile.c]
	Fixed to allow leading ";" to mark comments.

	* [misc/spy.c]
	Fixed bugs and added support for "include" and "exclude" filters.

	* [misc/user.c]
	Rearranged calls in InitApp().

	* [misc/font.c]
	Fixed font handling to create system fonts, if they are used.

	* [windows/dc.c]
	If text drawn on window with no font specified, then default the
	font to the system font.

Mon Mar  7 20:32:09 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)

	* [controls/desktop.c]
	Added handling of WM_NCCREATE and WM_ERASEBKGND functions.
	Implemented SetDeskPattern().

	* [misc/main.c]
	Added -desktop option to get a large desktop window with
	everything inside it.
	Added -name option.

	* [misc/rect.c]
	Bug fix in SubtractRect().

	* [objects/*.c]
	Replaced the DefaultRootWindow() macro by the rootWindow variable.

	* [windows/event.c] [windows/message.c]
	  [windows/nonclient.c] [windows/win.c]
	A few changes to accomodate the new desktop window.

 Tue Mar  8 11:13:03 1994  Miguel de Icaza  (miguel@xochitl.nuclecu.unam.mx)
 
 	* [toolkit/arch.c] --New file-- 
 	Routines for converting little endian data structures to
 	big-endian data structures, currently only BITMAP structures are 
 	converted.
 
 	* [misc/atom.c]
 	When used as part of the WineLib, the code is much simpler.
 	Doesn't depend on alignement.
 
 	* [loader/wine.c]
 	Ifdefed Emulator dependent code if compiling WineLib.
 
 	* [loader/resource.c]
 	Moved misc/resource.c to loader/resource.c.
 
 	* [loader/dump.c,ldt.c,ldtlib.c,library,c,selector.c,signal.c]
 	Ifdefed whole code if compiling WINELIB.
 
 	* [include/winsock.h]
 	Added compilation define to allow compilation on SunOS.
 
 	* [include/wine.h]
 	Removed load_typeinfo and load_nameinfo prototypes, they belong
 	to neexe.h
 
 	* [include/neexe.h]
 	Added load_typeinfo and load_nameinfo prototypes.
 
 	* [include/arch.h]
 	Fixed some bugs in the conversion routines.
 	Added macros for Bitmap loading.

Tue Mar  8 12:52:05 1994  crw@maniac.mlb.semi.harris.com (Carl Williams)
 	
	* [if1632/kernel.spec] [memory/global.c]
	Implemented GetFreeSpace()

	* [if1632/user.spec] [loader/resource.c]
	Implemented CreateIcon()
diff --git a/windows/dc.c b/windows/dc.c
index 4224b3a..58dd531 100644
--- a/windows/dc.c
+++ b/windows/dc.c
@@ -7,16 +7,17 @@
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
 #include <stdlib.h>
-
+#include <string.h>
 #include "gdi.h"
-
-extern HBITMAP BITMAP_hbitmapMemDC;
+#include "bitmap.h"
 
 static DeviceCaps * displayDevCaps = NULL;
 
 extern const WIN_DC_INFO DCVAL_defaultValues;
 
-extern void CLIPPING_SetDeviceClipping( DC * dc );  /* in objects/clipping.c */
+extern void CLIPPING_SetDeviceClipping( DC * dc );     /* objects/clipping.c */
+extern WORD COLOR_ToPhysical( DC *dc, COLORREF color );/* objects/color.c */
+extern void COLOR_SetMapping( DC *dc, HANDLE, WORD );  /* objects/color.c */
 
 
   /* ROP code to GC function conversion */
@@ -50,11 +51,11 @@
 {
     caps->version       = 0x300; 
     caps->technology    = DT_RASDISPLAY;
-    caps->horzSize      = WidthMMOfScreen( XT_screen );
-    caps->vertSize      = HeightMMOfScreen( XT_screen );
-    caps->horzRes       = WidthOfScreen( XT_screen );
-    caps->vertRes       = HeightOfScreen( XT_screen );
-    caps->bitsPixel     = DefaultDepthOfScreen( XT_screen );
+    caps->horzSize      = WidthMMOfScreen(screen) * screenWidth / WidthOfScreen(screen);
+    caps->vertSize      = HeightMMOfScreen(screen) * screenHeight / HeightOfScreen(screen);
+    caps->horzRes       = screenWidth;
+    caps->vertRes       = screenHeight;
+    caps->bitsPixel     = screenDepth;
     caps->planes        = 1;
     caps->numBrushes    = 0;
     caps->numPens       = 0;
@@ -81,26 +82,26 @@
     caps->aspectXY      = 51;
     caps->logPixelsX    = (int)(caps->horzRes * 25.4 / caps->horzSize);
     caps->logPixelsY    = (int)(caps->vertRes * 25.4 / caps->vertSize);
-    caps->sizePalette   = DefaultVisual( XT_display, DefaultScreen(XT_display) )->map_entries;
+    caps->sizePalette   = DefaultVisual(display,DefaultScreen(display))->map_entries;
     caps->numReserved   = 0;
     caps->colorRes      = 0;
 }
 
 
 /***********************************************************************
- *           DC_SetDeviceInfo
+ *           DC_InitDC
  *
- * Set device-specific info from device-independent info.
+ * Setup device-specific DC values for a newly created DC.
  */
-void DC_SetDeviceInfo( HDC hdc, DC * dc )
+static void DC_InitDC( HDC hdc )
 {
+    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    RealizeDefaultPalette( hdc );
     SetTextColor( hdc, dc->w.textColor );
     SetBkColor( hdc, dc->w.backgroundColor );
-    SetROP2( hdc, dc->w.ROPmode );
     SelectObject( hdc, dc->w.hPen );
     SelectObject( hdc, dc->w.hBrush );
     SelectObject( hdc, dc->w.hFont );
-    
     XSetGraphicsExposures( XT_display, dc->u.x.gc, False );
     CLIPPING_SetDeviceClipping( dc );
 }
@@ -114,6 +115,9 @@
  */
 int DC_SetupGCForBrush( DC * dc )
 {
+    XGCValues val;
+    unsigned long mask = 0;
+
     if (dc->u.x.brush.style == BS_NULL) return 0;
     if (dc->u.x.brush.pixel == -1)
     {
@@ -121,26 +125,34 @@
 	 * We need to swap foreground and background because
 	 * Windows does it the wrong way...
 	 */
-	XSetForeground( XT_display, dc->u.x.gc, dc->w.backgroundPixel );
-	XSetBackground( XT_display, dc->u.x.gc, dc->w.textPixel );
+	val.foreground = dc->w.backgroundPixel;
+	val.background = dc->w.textPixel;
     }
     else
     {
-	XSetForeground( XT_display, dc->u.x.gc, dc->u.x.brush.pixel );
-	XSetBackground( XT_display, dc->u.x.gc, dc->w.backgroundPixel );
+	val.foreground = dc->u.x.brush.pixel;
+	val.background = dc->w.backgroundPixel;
     }
-
-    if (dc->u.x.brush.fillStyle != FillStippled)
-	XSetFillStyle( XT_display, dc->u.x.gc, dc->u.x.brush.fillStyle );
-    else
-	XSetFillStyle( XT_display, dc->u.x.gc,
-		       (dc->w.backgroundMode == OPAQUE) ? 
-		          FillOpaqueStippled : FillStippled );
-    XSetTSOrigin( XT_display, dc->u.x.gc, dc->w.DCOrgX + dc->w.brushOrgX,
-		  dc->w.DCOrgY + dc->w.brushOrgY );
-    XSetFunction( XT_display, dc->u.x.gc, DC_XROPfunction[dc->w.ROPmode-1] );
-    XSetFillRule( XT_display, dc->u.x.gc, 
-		 (dc->w.polyFillMode == WINDING) ? WindingRule : EvenOddRule );
+    val.function = DC_XROPfunction[dc->w.ROPmode-1];
+    val.fill_style = dc->u.x.brush.fillStyle;
+    if (val.fill_style == FillStippled)
+    {
+	if (dc->w.backgroundMode==OPAQUE) val.fill_style = FillOpaqueStippled;
+	val.stipple = dc->u.x.brush.pixmap;
+	mask = GCStipple;
+    }
+    else if (val.fill_style == FillTiled)
+    {
+	val.tile = dc->u.x.brush.pixmap;
+	mask = GCTile;
+    }
+    val.ts_x_origin = dc->w.DCOrgX + dc->w.brushOrgX;
+    val.ts_y_origin = dc->w.DCOrgY + dc->w.brushOrgY;
+    val.fill_rule = (dc->w.polyFillMode==WINDING) ? WindingRule : EvenOddRule;
+    XChangeGC( display, dc->u.x.gc, 
+	       GCFunction | GCForeground | GCBackground | GCFillStyle |
+	       GCFillRule | GCTileStipXOrigin | GCTileStipYOrigin | mask,
+	       &val );
     return 1;
 }
 
@@ -153,23 +165,27 @@
  */
 int DC_SetupGCForPen( DC * dc )
 {
+    XGCValues val;
+
     if (dc->u.x.pen.style == PS_NULL) return 0;
-    XSetForeground( XT_display, dc->u.x.gc, dc->u.x.pen.pixel );
-    XSetBackground( XT_display, dc->u.x.gc, dc->w.backgroundPixel );
-    XSetFillStyle( XT_display, dc->u.x.gc, FillSolid );
-    if ((dc->u.x.pen.style == PS_SOLID) ||
-	(dc->u.x.pen.style == PS_INSIDEFRAME))
+    val.function   = DC_XROPfunction[dc->w.ROPmode-1];
+    val.foreground = dc->u.x.pen.pixel;
+    val.background = dc->w.backgroundPixel;
+    val.fill_style = FillSolid;
+    if ((dc->u.x.pen.style!=PS_SOLID) && (dc->u.x.pen.style!=PS_INSIDEFRAME))
     {
-	XSetLineAttributes( XT_display, dc->u.x.gc, dc->u.x.pen.width, 
-			    LineSolid, CapRound, JoinBevel );    
+	XSetDashes( display, dc->u.x.gc, 0,
+		    dc->u.x.pen.dashes, dc->u.x.pen.dash_len );
+	val.line_style = (dc->w.backgroundMode == OPAQUE) ?
+	                      LineDoubleDash : LineOnOffDash;
     }
-    else
-    {
-    	XSetLineAttributes( XT_display, dc->u.x.gc, dc->u.x.pen.width, 
-	     (dc->w.backgroundMode == OPAQUE) ? LineDoubleDash : LineOnOffDash,
-	     CapRound, JoinBevel );
-    }
-    XSetFunction( XT_display, dc->u.x.gc, DC_XROPfunction[dc->w.ROPmode-1] );
+    else val.line_style = LineSolid;
+    val.line_width = dc->u.x.pen.width;
+    val.cap_style  = CapRound;
+    val.join_style = JoinBevel;
+    XChangeGC( display, dc->u.x.gc, 
+	       GCFunction | GCForeground | GCBackground | GCLineWidth |
+	       GCLineStyle | GCCapStyle | GCJoinStyle | GCFillStyle, &val );
     return 1;    
 }
 
@@ -182,12 +198,20 @@
  */
 int DC_SetupGCForText( DC * dc )
 {
-    XSetForeground( XT_display, dc->u.x.gc, dc->w.textPixel );
-    XSetBackground( XT_display, dc->u.x.gc, dc->w.backgroundPixel );
-    XSetFillStyle( XT_display, dc->u.x.gc, FillSolid );
-    XSetFunction( XT_display, dc->u.x.gc, DC_XROPfunction[dc->w.ROPmode-1] );
-    if (!dc->u.x.font.fstruct) return 0;
-    XSetFont( XT_display, dc->u.x.gc, dc->u.x.font.fstruct->fid );
+    XGCValues val;
+
+    if (!dc->u.x.font.fstruct)
+    {
+	FONT_SelectObject(dc, STOCK_SYSTEM_FIXED_FONT, NULL);
+    }
+    val.function   = DC_XROPfunction[dc->w.ROPmode-1];
+    val.foreground = dc->w.textPixel;
+    val.background = dc->w.backgroundPixel;
+    val.fill_style = FillSolid;
+    val.font       = dc->u.x.font.fstruct->fid;
+    XChangeGC( display, dc->u.x.gc, 
+	       GCFunction | GCForeground | GCBackground | GCFillStyle |
+	       GCFont, &val );
     return 1;
 }
 
@@ -223,6 +247,7 @@
 	CombineRgn( newdc->w.hVisRgn, dc->w.hVisRgn, 0, RGN_COPY );	
     }
     newdc->w.hGCClipRgn = 0;
+    COLOR_SetMapping( newdc, dc->u.x.pal.hMapping, dc->u.x.pal.mappingSize );
     return handle;
 }
 
@@ -243,10 +268,16 @@
     if (dc->w.hClipRgn)	DeleteObject( dc->w.hClipRgn );
     if (dc->w.hVisRgn) DeleteObject( dc->w.hVisRgn );
     if (dc->w.hGCClipRgn) DeleteObject( dc->w.hGCClipRgn );
+
     memcpy( &dc->w, &dcs->w, sizeof(dc->w) );
+    memcpy( &dc->u.x.pen, &dcs->u.x.pen, sizeof(dc->u.x.pen) );
     dc->w.hClipRgn = dc->w.hVisRgn = dc->w.hGCClipRgn = 0;
     dc->w.flags &= ~DC_SAVED;
-    DC_SetDeviceInfo( hdc, dc );
+
+    SelectObject( hdc, dcs->w.hBrush );
+    SelectObject( hdc, dcs->w.hFont );
+    COLOR_SetMapping( dc, dcs->u.x.pal.hMapping, dcs->u.x.pal.mappingSize );
+
     SelectClipRgn( hdc, dcs->w.hClipRgn );
     SelectVisRgn( hdc, dcs->w.hVisRgn );
 }
@@ -284,14 +315,14 @@
 #endif    
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return FALSE;
     if (level == -1) level = dc->saveLevel;
-    if ((level < 1) || (level > dc->saveLevel))	return FALSE;
+    if ((level < 1) || (level > (short)dc->saveLevel)) return FALSE;
     
-    while (dc->saveLevel >= level)
+    while ((short)dc->saveLevel >= level)
     {
 	HDC hdcs = dc->header.hNext;
 	if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC ))) return FALSE;
 	dc->header.hNext = dcs->header.hNext;
-	if (--dc->saveLevel < level) SetDCState( hdc, hdcs );
+	if ((short)--dc->saveLevel < level) SetDCState( hdc, hdcs );
 	DeleteDC( hdcs );
     }
     return TRUE;
@@ -324,22 +355,31 @@
     memcpy( &dc->w, &DCVAL_defaultValues, sizeof(DCVAL_defaultValues) );
     memset( &dc->u.x, 0, sizeof(dc->u.x) );
 
-    dc->u.x.drawable   = DefaultRootWindow( XT_display );
-    dc->u.x.gc         = XCreateGC( XT_display, dc->u.x.drawable, 0, NULL );
+    dc->u.x.drawable   = rootWindow;
+    dc->u.x.gc         = XCreateGC( display, dc->u.x.drawable, 0, NULL );
     dc->w.flags        = 0;
     dc->w.devCaps      = displayDevCaps;
-    dc->w.planes       = displayDevCaps->planes;
     dc->w.bitsPerPixel = displayDevCaps->bitsPixel;
     dc->w.DCSizeX      = displayDevCaps->horzRes;
     dc->w.DCSizeY      = displayDevCaps->vertRes;
 
-    DC_SetDeviceInfo( handle, dc );
+    DC_InitDC( handle );
 
     return handle;
 }
 
 
 /***********************************************************************
+ *           CreateIC    (GDI.153)
+ */
+HDC CreateIC( LPSTR driver, LPSTR device, LPSTR output, LPSTR initData )
+{
+      /* Nothing special yet for ICs */
+    return CreateDC( driver, device, output, initData );
+}
+
+
+/***********************************************************************
  *           CreateCompatibleDC    (GDI.52)
  */
 HDC CreateCompatibleDC( HDC hdc )
@@ -359,20 +399,17 @@
     memcpy( &dc->w, &DCVAL_defaultValues, sizeof(DCVAL_defaultValues) );
     memset( &dc->u.x, 0, sizeof(dc->u.x) );
 
-    dc->u.x.drawable   = XCreatePixmap( XT_display,
-				        DefaultRootWindow( XT_display ),
-				        1, 1, 1 );
-    dc->u.x.gc         = XCreateGC( XT_display, dc->u.x.drawable, 0, NULL );
+    dc->u.x.drawable   = XCreatePixmap( display, rootWindow, 1, 1, 1 );
+    dc->u.x.gc         = XCreateGC( display, dc->u.x.drawable, 0, NULL );
     dc->w.flags        = DC_MEMORY;
-    dc->w.planes       = 1;
     dc->w.bitsPerPixel = 1;
     dc->w.devCaps      = displayDevCaps;
     dc->w.DCSizeX      = 1;
     dc->w.DCSizeY      = 1;
 
     SelectObject( handle, BITMAP_hbitmapMemDC );
-    DC_SetDeviceInfo( handle, dc );
-    
+    DC_InitDC( handle );
+
     return handle;
 }
 
@@ -404,9 +441,7 @@
 	SelectObject( hdc, STOCK_BLACK_PEN );
 	SelectObject( hdc, STOCK_WHITE_BRUSH );
 	SelectObject( hdc, STOCK_SYSTEM_FONT );
-	
-	XFreeGC( XT_display, dc->u.x.gc );
-	if (dc->w.flags & DC_MEMORY) BITMAP_UnselectBitmap( dc );
+	XFreeGC( display, dc->u.x.gc );
     }
     
     if (dc->w.hClipRgn) DeleteObject( dc->w.hClipRgn );
@@ -446,8 +481,7 @@
 
     oldColor = dc->w.backgroundColor;
     dc->w.backgroundColor = color;
-    dc->w.backgroundPixel = GetNearestPaletteIndex( dc->w.hPalette, color );
-    XSetBackground( XT_display, dc->u.x.gc, dc->w.backgroundPixel );
+    dc->w.backgroundPixel = COLOR_ToPhysical( dc, color );
     return oldColor;
 }
 
@@ -463,8 +497,7 @@
 
     oldColor = dc->w.textColor;
     dc->w.textColor = color;
-    dc->w.textPixel = GetNearestPaletteIndex( dc->w.hPalette, color );
-    XSetForeground( XT_display, dc->u.x.gc, dc->w.textPixel );
+    dc->w.textPixel = COLOR_ToPhysical( dc, color );
     return oldColor;
 }