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: */