Release 960302

Sat Mar  2 18:19:06 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [controls/scroll.c]
	Fixed SCROLL_THUMB painting fixes from Alex Korobka to store the
 	current tracking window.

	* [files/file.c]
	Fixed two file descriptor leaks in FILE_OpenFile().

	* [if1632/relay32.c] [loader/module.c] [loader/pe_image.c]
	  [tools/build.c]
	Replaced LOADEDFILEINFO structure by OFSTRUCT.

	* [memory/atom.c]
	Reload the pointer to the atom table in ATOM_GetTable() and
 	ATOM_AddAtom() in case the LOCAL_Alloc() calls caused the table to
 	move in linear memory.

Fri Mar  1 11:57:13 1996  Frans van Dorsselaer <dorssel@rulhm1.leidenuniv.nl>

	* [include/callback.h]
	Added support for CallWordBreakProc().

	* [controls/edit.c]
	New caret handling (really efficient / fast).
	Implemented EM_SETWORDBREAKPROC and EM_GETWORDBREAKPROC.
	Fixed EM_SETFONT so it now also creates a proper new caret.

Wed Feb 28 22:03:34 1996  Daniel Schepler  <daniel@frobnitz.wustl.edu>

	* [controls/desktop.c] [misc/main.c] [windows/event.c] [windows/win.c]
	Added WM_DELETE protocol to top-level windows.

	* [controls/scroll.c]
	Fixed a problem which caused slow scrolling to continue	uncontrollably.

	* [misc/exec.c]
	Implemented ExitWindows().

	* [windows/win.c]
	Set top-level owned windows to be transient.

Wed Feb 28 19:13:22 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>

	* [programs/progman/*]
	Added a program manager.

Wed Feb 28 18:38:01 1996  Duncan C Thomson <duncan@spd.eee.strath.ac.uk>

	* [resources/sysres_Eo.c]
	Added support for Esperanto [Eo] language.

Wed Feb 28 00:23:00 1996  Thomas Sandford <t.d.g.sandford@prds-grn.demon.co.uk>

	* [if1632/user32.spec]
	Added EndDialog, GetDlgItem, GetDlgItemInt, SetDlgItemInt,

	* [win32/init.c]
	Added task.h to includes. GetModuleHandleA() - return hInstance
	if called with NULL parameter. Freecell needs this. NOTE this
	may indicate a problem with differentiation between hModule and
	hInstance within Wine.

	* [win32/resource.c]
	FindResource32() and LoadResource32() - Removed #if 0's around
	conversion from hInstance to hModule. See remarks above.

	* [win32/string32.c]
	WIN32_UniLen() - removed stray semicolon.

Tue Feb 27 21:05:18 1996  Jim Peterson <jspeter@birch.ee.vt.edu>
	
	* [windows/caret.c]
	Set blink rate with call to GetProfileInt().

	* [rc/winerc.c]
	In new_style(), made initial flag settings WS_CHILD | WS_VISIBLE
 	instead of 0.  This seems to correspond to Borland's defaults, and
 	the flags can be unset by using the (rather obtuse) "| NOT WS_CHILD"
	or "| NOT WS_VISIBLE" technique in the *.rc file.

	* [win32/time.c]
	In GetLocalTime() and GetSystemTime(), used tv_sec field of result
 	returned by gettimeofday() instead of making second call to
 	time().  This eliminates clock jitter if the seconds change
 	between the two calls (rare, but possible).

	* [include/wintypes.h]
	Added "#define _far" and "#define _pascal".

	* [windows/win.c]
	Added function GetDesktopHwnd().

	* [include/xmalloc.h]
	Removed the '#ifdef HAVE_STDLIB_H' structure, since it seemed to
 	have been removed from 'configure', and was causing redefinition
 	warnings.

Tue Feb 27 19:31:11 1996  Albrecht Kleine <kleine@ak.sax.de>

	* [windows/winpos.c] 
	Added RDW_ALLCHILDREN flag in SetWindowPos (handling SWP_FRAMECHANGED)
	to force a repaint when setting menu bars with different rows.

Sun Feb 25 21:15:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu>

	* [windows/syscolors.c] [controls/scroll.c]
	Fixed DrawFocusRect pen and SCROLL_THUMB painting.
diff --git a/programs/progman/program.c b/programs/progman/program.c
new file mode 100644
index 0000000..adf30ed
--- /dev/null
+++ b/programs/progman/program.c
@@ -0,0 +1,356 @@
+/*
+ * Program Manager
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+#include <windows.h>
+#include "progman.h"
+
+/***********************************************************************
+ *
+ *           PROGRAM_ProgramWndProc
+ */
+
+static LRESULT PROGRAM_ProgramWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+  switch (msg)
+    {
+    case WM_NCLBUTTONDOWN:
+      {
+	HLOCAL  hProgram = (HLOCAL) GetWindowLong(hWnd, 0);
+	PROGRAM *program = LocalLock(hProgram);
+	GROUP   *group   = LocalLock(program->hGroup);
+	group->hActiveProgram = hProgram;
+	EnableMenuItem(Globals.hFileMenu, PM_MOVE , MF_ENABLED);
+	EnableMenuItem(Globals.hFileMenu, PM_COPY , MF_ENABLED);
+	break;
+      }
+    case WM_NCLBUTTONDBLCLK:
+      {
+	PROGRAM_ExecuteProgram((HLOCAL) GetWindowLong(hWnd, 0));
+	return(0);
+      }
+
+    case WM_PAINT:
+      {
+	PROGRAM *program;
+	PAINTSTRUCT      ps;
+	HDC              hdc;
+	hdc     = BeginPaint(hWnd,&ps);
+	program = LocalLock((HLOCAL) GetWindowLong(hWnd, 0));
+	if (program->hIcon)
+	  DrawIcon(hdc, 0, 0, program->hIcon);
+	EndPaint(hWnd,&ps);
+	break;
+      }
+    }
+  return(DefWindowProc(hWnd, msg, wParam, lParam));
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_RegisterProgramWinClass
+ */
+
+ATOM PROGRAM_RegisterProgramWinClass()
+{
+  WNDCLASS class;
+
+  class.style         = CS_HREDRAW | CS_VREDRAW;
+  class.lpfnWndProc   = PROGRAM_ProgramWndProc;
+  class.cbClsExtra    = 0;
+  class.cbWndExtra    = sizeof(LONG);
+  class.hInstance     = Globals.hInstance;
+  class.hIcon         = 0;
+  class.hCursor       = LoadCursor (0, IDC_ARROW);
+  class.hbrBackground = GetStockObject (WHITE_BRUSH);
+  class.lpszMenuName  = 0;
+  class.lpszClassName = STRING_PROGRAM_WIN_CLASS_NAME;
+
+  return RegisterClass(&class);
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_NewProgram
+ */
+
+VOID PROGRAM_NewProgram(HLOCAL hGroup)
+{
+  INT  nCmdShow = SW_SHOWNORMAL;
+  INT  nHotKey = 0;
+  INT  nIconIndex = 0;
+  CHAR szName[MAX_PATHNAME_LEN] = "";
+  CHAR szCmdLine[MAX_PATHNAME_LEN] = "";
+  CHAR szIconFile[MAX_PATHNAME_LEN] = "";
+  CHAR szWorkDir[MAX_PATHNAME_LEN] = "";
+  HICON hIcon = 0;
+
+  if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile,
+				&hIcon, &nIconIndex, &nHotKey,
+				&nCmdShow, MAX_PATHNAME_LEN))
+    return;
+
+  if (!hIcon) hIcon = LoadIcon(0, MAKEINTRESOURCE(OIC_WINEICON));
+
+
+  if (!PROGRAM_AddProgram(hGroup, hIcon, szName, 0, 0, szCmdLine, szIconFile,
+			  nIconIndex, szWorkDir, nHotKey, nCmdShow))
+    return;
+
+  GRPFILE_WriteGroupFile(hGroup);
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_ModifyProgram
+ */
+
+VOID PROGRAM_ModifyProgram(HLOCAL hProgram)
+{
+  PROGRAM *program = LocalLock(hProgram);
+  CHAR szName[MAX_PATHNAME_LEN];
+  CHAR szCmdLine[MAX_PATHNAME_LEN];
+  CHAR szIconFile[MAX_PATHNAME_LEN];
+  CHAR szWorkDir[MAX_PATHNAME_LEN];
+
+  lstrcpyn(szName, LocalLock(program->hName), MAX_PATHNAME_LEN);
+  lstrcpyn(szCmdLine, LocalLock(program->hCmdLine), MAX_PATHNAME_LEN);
+  lstrcpyn(szIconFile, LocalLock(program->hIconFile), MAX_PATHNAME_LEN);
+  lstrcpyn(szWorkDir, LocalLock(program->hWorkDir), MAX_PATHNAME_LEN);
+
+  if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile,
+				&program->hIcon, &program->nIconIndex,
+				&program->nHotKey, &program->nCmdShow,
+				MAX_PATHNAME_LEN))
+    return;
+
+  MAIN_ReplaceString(&program->hName, szName);
+  MAIN_ReplaceString(&program->hCmdLine, szCmdLine);
+  MAIN_ReplaceString(&program->hIconFile, szIconFile);
+  MAIN_ReplaceString(&program->hWorkDir, szWorkDir);
+
+  SetWindowText(program->hWnd, szName);
+  UpdateWindow(program->hWnd);
+
+  GRPFILE_WriteGroupFile(program->hGroup);
+
+  return;
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_AddProgram
+ */
+
+HLOCAL PROGRAM_AddProgram(HLOCAL hGroup, HICON hIcon, LPCSTR lpszName,
+			  INT x, INT y, LPCSTR lpszCmdLine,
+			  LPCSTR lpszIconFile, INT nIconIndex,
+			  LPCSTR lpszWorkDir, INT nHotKey, INT nCmdShow)
+{
+  GROUP *group = LocalLock(hGroup);
+  PROGRAM *program;
+  HLOCAL hPrior, *p;
+  HLOCAL hProgram  = LocalAlloc(LMEM_FIXED, sizeof(PROGRAM));
+  HLOCAL hName     = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszName));
+  HLOCAL hCmdLine  = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszCmdLine));
+  HLOCAL hIconFile = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszIconFile));
+  HLOCAL hWorkDir  = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszWorkDir));
+  if (!hProgram || !hName || !hCmdLine || !hIconFile || !hWorkDir)
+    {
+      MAIN_OutOfMemoryError();
+      if (hProgram)  LocalFree(hProgram);
+      if (hName)     LocalFree(hName);
+      if (hCmdLine)  LocalFree(hCmdLine);
+      if (hIconFile) LocalFree(hIconFile);
+      if (hWorkDir)  LocalFree(hWorkDir);
+      return(0);
+    }
+  hmemcpy(LocalLock(hName),     lpszName,     1 + lstrlen(lpszName));
+  hmemcpy(LocalLock(hCmdLine),  lpszCmdLine,  1 + lstrlen(lpszCmdLine));
+  hmemcpy(LocalLock(hIconFile), lpszIconFile, 1 + lstrlen(lpszIconFile));
+  hmemcpy(LocalLock(hWorkDir),  lpszWorkDir,  1 + lstrlen(lpszWorkDir));
+
+  group->hActiveProgram  = hProgram;
+
+  hPrior = 0;
+  p = &group->hPrograms;
+  while (*p)
+    {
+      hPrior = *p;
+      p = &((PROGRAM*)LocalLock(hPrior))->hNext;
+    }
+  *p = hProgram;
+
+  program = LocalLock(hProgram);
+  program->hGroup     = hGroup;
+  program->hPrior     = hPrior;
+  program->hNext      = 0;
+  program->hName      = hName;
+  program->hCmdLine   = hCmdLine;
+  program->hIconFile  = hIconFile;
+  program->nIconIndex = nIconIndex;
+  program->hWorkDir   = hWorkDir;
+  program->hIcon      = hIcon;
+  program->nCmdShow   = nCmdShow;
+  program->nHotKey    = nHotKey;
+
+  program->hWnd =
+    CreateWindow (STRING_PROGRAM_WIN_CLASS_NAME, (LPSTR)lpszName,
+		  WS_CHILD | WS_OVERLAPPEDWINDOW,
+		  x, y, CW_USEDEFAULT, CW_USEDEFAULT,
+		  group->hWnd, 0, Globals.hInstance, 0);
+
+  SetWindowLong(program->hWnd, 0, (LONG) hProgram);
+
+  ShowWindow (program->hWnd, SW_SHOWMINIMIZED);
+  UpdateWindow (program->hWnd);
+
+  return hProgram;
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_CopyMoveProgram
+ */
+
+VOID PROGRAM_CopyMoveProgram(HLOCAL hProgram, BOOL bMove)
+{
+  PROGRAM *program = LocalLock(hProgram);
+  GROUP   *fromgroup = LocalLock(program->hGroup);
+  HLOCAL hGroup = DIALOG_CopyMove(LocalLock(program->hName),
+				  LocalLock(fromgroup->hName), bMove);
+  if (!hGroup) return;
+
+  /* FIXME shouldn't be necessary */
+  OpenIcon(((GROUP*)LocalLock(hGroup))->hWnd);
+
+  if (!PROGRAM_AddProgram(hGroup,
+#if 0
+			  CopyIcon(program->hIcon),
+#else
+			  program->hIcon,
+#endif
+			  LocalLock(program->hName),
+			  program->x, program->y,
+			  LocalLock(program->hCmdLine),
+			  LocalLock(program->hIconFile),
+			  program->nIconIndex,
+			  LocalLock(program->hWorkDir),
+			  program->nHotKey, program->nCmdShow)) return;
+  GRPFILE_WriteGroupFile(hGroup);
+
+  if (bMove) PROGRAM_DeleteProgram(hProgram, TRUE);
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_ExecuteProgram
+ */
+
+VOID PROGRAM_ExecuteProgram(HLOCAL hProgram)
+{
+  PROGRAM *program = LocalLock(hProgram);
+  LPSTR lpszCmdLine = LocalLock(program->hCmdLine);
+  LPSTR lpszWorkDir = LocalLock(program->hWorkDir);
+
+  /* FIXME set working direktory */
+  lpszWorkDir = lpszWorkDir;
+
+  WinExec(lpszCmdLine, program->nCmdShow);
+  if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd);
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_DeleteProgram
+ */
+
+VOID PROGRAM_DeleteProgram(HLOCAL hProgram, BOOL bUpdateGrpFile)
+{
+  PROGRAM *program = LocalLock(hProgram);
+  GROUP   *group   = LocalLock(program->hGroup);
+
+  group->hActiveProgram = 0;
+
+  if (program->hPrior)
+    ((PROGRAM*)LocalLock(program->hPrior))->hNext = program->hNext;
+  else
+    ((GROUP*)LocalLock(program->hGroup))->hPrograms = program->hNext;
+	
+  if (program->hNext)
+    ((PROGRAM*)LocalLock(program->hNext))->hPrior = program->hPrior;
+
+  if (bUpdateGrpFile)
+    GRPFILE_WriteGroupFile(program->hGroup);
+
+  DestroyWindow(program->hWnd);
+#if 0
+  if (program->hIcon)
+    DestroyIcon(program->hIcon);
+#endif
+  LocalFree(program->hName);
+  LocalFree(program->hCmdLine);
+  LocalFree(program->hIconFile);
+  LocalFree(program->hWorkDir);
+  LocalFree(hProgram);
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_FirstProgram
+ */
+
+HLOCAL PROGRAM_FirstProgram(HLOCAL hGroup)
+{
+  GROUP *group;
+  if (!hGroup) return(0);
+  group = LocalLock(hGroup);
+  return(group->hPrograms);
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_NextProgram
+ */
+
+HLOCAL PROGRAM_NextProgram(HLOCAL hProgram)
+{
+  PROGRAM *program;
+  if (!hProgram) return(0);
+  program = LocalLock(hProgram);
+  return(program->hNext);
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_ActiveProgram
+ */
+
+HLOCAL PROGRAM_ActiveProgram(HLOCAL hGroup)
+{
+  GROUP *group;
+  if (!hGroup) return(0);
+  group = LocalLock(hGroup);
+  if (IsIconic(group->hWnd)) return(0);
+
+  return(group->hActiveProgram);
+}
+
+/***********************************************************************
+ *
+ *           PROGRAM_ProgramName
+ */
+
+LPCSTR PROGRAM_ProgramName(HLOCAL hProgram)
+{
+  PROGRAM *program;
+  if (!hProgram) return(0);
+  program = LocalLock(hProgram);
+  return(LocalLock(program->hName));
+}
+
+/* Local Variables:    */
+/* c-file-style: "GNU" */
+/* End:                */