Release 970914

Thu Sep 11 18:24:56 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [objects/dc.c]
	In DC_SetupGCForPatBlt, replace R2_NOT by GXxor with (black xor white).

Tue Sep  9 23:04:02 1997  U. Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>

	* [memory/virtual.c] 
	Do not write debugging info unconditionally to stderr.

	* [files/profile.c]
	Call PROFILE_GetSection in PROFILE_GetString for key_name "" too.

	* [misc/crtdll.c]
	Many new functions.

	* [include/windows.h] [windows/winpos.c]
	ClientToScreen16 doesn't have a return value.

Sun Sep  7 10:06:39 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [misc/main.c] [AUTHORS]
	Update the list of contributors. Please let me know if I forgot
	someone.

	* [if1632/*.spec] [if1632/builtin.c] [tools/build.c]
	Ordinal base for Win32 DLLs is now computed automatically from the
	lowest ordinal found.

	* [include/wintypes.h]
	WINAPI is now defined as attribute((stdcall)). This will require
	gcc to compile.

	* [if1632/thunk.c]
	Removed Win32 thunks (no longer needed with stdcall).

	* [if1632/crtdll.spec] [misc/crtdll.c]
	Make sure we only reference cdecl functions in the spec file.

	* [objects/dc.c]
	Use CapNotLast drawing style for 1-pixel wide lines.

	* [tools/build.c]
	Added 'double' argument type.
	Added 'varargs' function type for Win32.
	Made CallTo16_xxx functions stdcall.

Fri Sep  5 14:50:49 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [tools/build.c] [windows/win.c] [windows/event.c] [windows/message.c]
	More fixes to get message exchange closer to the original.

	* [misc/spy.c]
	Message logs now contain window names.

	* [loader/resource.c] [loader/ne_resource.c] [loader/task.c]
	  [objects/cursoricon.c] [windows/user.c]
	Added some obscure features to fix memory leaks.

Fri Sep  5 00:46:28 1997  Jan Willamowius <jan@janhh.shnet.org>

	* [if1632/kernel32.spec] [win32/newfns.c]
	Added stub for UTRegister() and UTUnRegister().

Thu Sep  4 12:03:12 1997  Frans van Dorsselaer <dorssel@rulhmpc49.LeidenUniv.nl>
	* [controls/edit.c]
	Allow ASCII codes > 127 in WM_CHAR.

Mon Sep  1 17:23:24 1997  Dimitrie O. Paun  <dimi@mail.cs.toronto.edu>

	* [controls/widgets.c]
	In InitCommonControls, remember the name of the class
	because lpszClassName was made to point to a local array
	Added the ProgressBar to the list of implemented controls.
	Call InitCommonControls from WIDGETS_Init to register all
	implemented Common Controls.
	
	* [include/commctrl.h]
	Added misc decl for the Progress Bar.

	* [controls/progress.c] [include/progress.h]
	First attempt at implementiong the Progress Bar class.

	* [objects/brush.h]
	Implementation for GetSysColorBrush[16|32]

	* [controls/status.c]
	Use DrawEdge to draw the borders and fill the background

	* [controls/uitools.c]
	Added DrawDiagEdge32 and DrawRectEdge32

	* [graphics/painting.c]
	Implement DrawEdge[16|32]
	Started DrawFrameControl32

Mon Sep  1 10:07:09 1997  Lawson Whitney <lawson_whitney@juno.com>

	* [misc/comm.c] [include/windows.h]
	SetCommEventMask returns a SEGPTR.

Sun Aug 31 23:28:32 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [loader/pe_image.c][loader/module.c][include/pe_image.h]
	  [include/module.h]
	Cleaned up the whole Win32 library mess (a bit).

	* [debugger/stabs.c]
	If 'wine' has no absolute path and isn't found, check $PATH too.

	* [misc/ole2nls.c]
	Some fixes.

	* [misc/ver.c]
	Added support for PE style version resources.

	* [memory/string.c]
	Check for NULL pointers to _lstr* functions, just as Windows95 does.

	* [multimedia/time.c]
	Made list of timers a simple linked list.

	* [loader/resource.c]
	Netscape 3 seems to pass NEGATIVE resource Ids (in an
	unsigned int, yes). Don't know why, fixed it anyway.

	* [objects/bitmap.c]
	LoadImageW added.

	* [include/win.h][windows/win.c]
	Change wIDmenu from UINT16 to UINT32 and changed the
	SetWindow(Long|Word) accordingly.

Thu Aug 28 19:30:08 1997  Morten Welinder  <terra@diku.dk>

	* [include/windows.h]
	Add a few more colors defined for Win95.
	Add a few more brush styles.

	* [windows/syscolor.c]
 	Add error checks for SYSCOLOR_SetColor, SYSCOLOR_Init,
	GetSysColor16, GetSysColor32.  Add support for above colors.

Sun Aug 24 16:22:57 1997  Andrew Taylor <andrew@riscan.com>

	* [multimedia/mmsystem.c]
	Changed mmioDescend to use mmio functions for file I/O, neccessary
	for memory files.
diff --git a/controls/progress.c b/controls/progress.c
new file mode 100644
index 0000000..c0311e2
--- /dev/null
+++ b/controls/progress.c
@@ -0,0 +1,208 @@
+/*		
+ * Progress control
+ *
+ * Copyright 1997 Dimitrie O. Paun
+ *
+ * TODO:
+ *   - I do not know what to to on WM_[SG]ET_FONT
+ * Problems:
+ *   - I think I do not compute correctly the numer of leds to be drawn
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "windows.h"
+#include "syscolor.h"
+#include "sysmetrics.h"
+#include "progress.h"
+#include "graphics.h"
+#include "heap.h"
+#include "win.h"
+#include "stddebug.h"
+#include "debug.h"
+
+/* Control configuration constants */
+
+#define LED_WIDTH  8
+#define LED_GAP    2
+
+/* Work constants */
+
+#define UNKNOWN_PARAM(msg, wParam, lParam) dprintf_progress(stddeb, \
+        "Progress Ctrl: Unknown parameter(s) for message " #msg     \
+	"(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam); 
+
+#define PROGRESS_GetInfoPtr(wndPtr) ((PROGRESS_INFO *)wndPtr->wExtra)
+
+
+/***********************************************************************
+ *           PROGRESS_Paint
+ * Draw the arrows. The background need not be erased.
+ * If dc!=0, it draws on it
+ */
+static void PROGRESS_Paint(WND *wndPtr, HDC32 dc)
+{
+  PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr);
+  HBRUSH32 ledBrush;
+  int rightBar, rightMost;
+  PAINTSTRUCT32 ps;
+  RECT32 rect;
+  HDC32 hdc;
+
+  dprintf_progress(stddeb, "Progress Bar: paint pos=%d min=%d, max=%d\n",
+		   infoPtr->CurVal, infoPtr->MinVal, infoPtr->MaxVal);
+
+  /* get a dc */
+  hdc = dc==0 ? BeginPaint32(wndPtr->hwndSelf, &ps) : dc;
+
+  /* get the required brush */
+  ledBrush = GetSysColorBrush32(COLOR_HIGHLIGHT);
+
+  /* get rect for the bar, adjusted for the border */
+  GetClientRect32(wndPtr->hwndSelf, &rect);
+
+  /* draw the border */
+  DrawEdge32(hdc, &rect, BDR_SUNKENOUTER, BF_RECT|BF_ADJUST|BF_MIDDLE);
+  rect.left++; rect.right--; rect.top++; rect.bottom--;
+  rightMost = rect.right;
+
+  /* compute extent of progress bar */
+  rightBar = rect.left + 
+    MulDiv32(infoPtr->CurVal-infoPtr->MinVal,
+	     rect.right - rect.left,
+	     infoPtr->MaxVal-infoPtr->MinVal);
+
+  /* now draw the bar */
+  while(rect.left < rightBar) { 
+    rect.right = rect.left+LED_WIDTH;
+    FillRect32(hdc, &rect, ledBrush);
+    rect.left  = rect.right+LED_GAP;
+  }
+
+  /* clean-up */  
+  if(!dc)
+    EndPaint32(wndPtr->hwndSelf, &ps);
+}
+
+/***********************************************************************
+ *           PROGRESS_CoercePos
+ * Makes sure the current position (CUrVal) is within bounds.
+ */
+static void PROGRESS_CoercePos(WND *wndPtr)
+{
+  PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr); 
+
+  if(infoPtr->CurVal < infoPtr->MinVal)
+    infoPtr->CurVal = infoPtr->MinVal;
+  if(infoPtr->CurVal > infoPtr->MaxVal)
+    infoPtr->CurVal = infoPtr->MaxVal;
+}
+
+/***********************************************************************
+ *           ProgressWindowProc
+ */
+LRESULT WINAPI ProgressWindowProc(HWND32 hwnd, UINT32 message, 
+                                  WPARAM32 wParam, LPARAM lParam)
+{
+  WND *wndPtr = WIN_FindWndPtr(hwnd);
+  PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr); 
+  UINT32 temp;
+
+  switch(message)
+    {
+    case WM_CREATE:
+      /* initialize the info struct */
+      infoPtr->MinVal=0; 
+      infoPtr->MaxVal=100;
+      infoPtr->CurVal=0; 
+      infoPtr->Step=10;
+      dprintf_updown(stddeb, "Progress Ctrl creation, hwnd=%04x\n", hwnd);
+      break;
+    
+    case WM_DESTROY:
+      dprintf_updown(stddeb, "Progress Ctrl destruction, hwnd=%04x\n", hwnd);
+      break;
+
+    case WM_ERASEBKGND:
+      /* pretend to erase it here, but we will do it in the paint
+	 function to avoid flicker */
+      return 1;
+	
+    case WM_GETFONT:
+      /* FIXME: What do we need to do? */
+      break;
+
+    case WM_SETFONT:
+      /* FIXME: What do we need to do? */
+      break;
+
+    case WM_PAINT:
+      PROGRESS_Paint(wndPtr, wParam);
+      break;
+    
+    case PBM_DELTAPOS:
+      if(lParam)
+	UNKNOWN_PARAM(PBM_DELTAPOS, wParam, lParam);
+      temp = infoPtr->CurVal;
+      if(wParam != 0){
+	infoPtr->CurVal += (UINT16)wParam;
+	PROGRESS_CoercePos(wndPtr);
+	PROGRESS_Paint(wndPtr, 0);
+      }
+      return temp;
+
+    case PBM_SETPOS:
+      if (lParam)
+	UNKNOWN_PARAM(PBM_SETPOS, wParam, lParam);
+      temp = infoPtr->CurVal;
+      if(temp != wParam){
+	infoPtr->CurVal = (UINT16)wParam;
+	PROGRESS_CoercePos(wndPtr);
+	PROGRESS_Paint(wndPtr, 0);
+      }
+      return temp;          
+      
+    case PBM_SETRANGE:
+      if (wParam)
+	UNKNOWN_PARAM(PBM_SETRANGE, wParam, lParam);
+      temp = MAKELONG(infoPtr->MinVal, infoPtr->MaxVal);
+      if(temp != lParam){
+	infoPtr->MinVal = LOWORD(lParam); 
+	infoPtr->MaxVal = HIWORD(lParam);
+	if(infoPtr->MaxVal <= infoPtr->MinVal)
+	  infoPtr->MaxVal = infoPtr->MinVal+1;
+	PROGRESS_CoercePos(wndPtr);
+	PROGRESS_Paint(wndPtr, 0);
+      }
+      return temp;
+
+    case PBM_SETSTEP:
+      if (lParam)
+	UNKNOWN_PARAM(PBM_SETSTEP, wParam, lParam);
+      temp = infoPtr->Step;   
+      infoPtr->Step = (UINT16)wParam;   
+      return temp;
+
+    case PBM_STEPIT:
+      if (wParam || lParam)
+	UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam);
+      temp = infoPtr->CurVal;   
+      infoPtr->CurVal += infoPtr->Step;
+      if(infoPtr->CurVal > infoPtr->MaxVal)
+	infoPtr->CurVal = infoPtr->MinVal;
+      if(temp != infoPtr->CurVal)
+	PROGRESS_Paint(wndPtr, 0);
+      return temp;
+    
+    default: 
+      if (message >= WM_USER) 
+	fprintf( stderr, "Progress Ctrl: unknown msg %04x wp=%04x lp=%08lx\n", 
+		 message, wParam, lParam );
+      return DefWindowProc32A( hwnd, message, wParam, lParam ); 
+    } 
+
+    return 0;
+}
+
+
+