
Fri Jul 5 16:27:43 1996 Alexandre Julliard <julliard@lrc.epfl.ch> * [controls/desktop.c] Use Windows file I/O routines to load the desktop bitmap. * [files/file.c] Implemented RemoveDirectory* and DeleteFile*. * [include/wine.h] Added SIGCONTEXT typedef to replace #define sigcontext_struct. * [loader/task.c] Fixed initial breakpoint setting for Win32 tasks. * [misc/wsprintf.c] Ignore Unicode formats for wsprintf16(). * [objects/font.c] Implemented Win32 version of GetTextMetrics. * [windows/winproc.c] [windows/win.c] [windows/class.c] [windows/dialog.c] Modified windows procedures to use thunks, to ensure that the procedure can be called directly from the Windows program. * [windows/win.c] Added function WIN_BuildWinArray() to make it easier to enumerate windows. Implemented Win32 version of EnumWindows() and friends. Fri Jul 5 11:56:22 1996 Andreas Kirschbaum <ank@rbg.informatik.th-darmstadt.de> * [controls/button.c] [windows/win.c] Operator precedence fixes. * [controls/edit.c] Implemented ES_PASSWORD, ES_LOWERCASE and ES_UPPERCASE styles. Fixed word wrap with long words. * [debugger/debug.l] New alias "where" for command "backtrace". * [if1632/gdi.spec] Corrected parameter of ExtTextOut. * [loader/module.c] Corrected printing of table of modules. * [misc/spy.c] Removed superfluous \n in message name. * [windows/message.c] Declared MSG_SendMessage as static. Changed parameter of DirectedYield() from queue handle to task handle. Removed warning mesages for argument of printf. * [windows/nonclient.c] Added the flag DT_NOPREFIX when drawing window titles. * [windows/win.c] WIN_WalkWindows now prints the invalid window handle. Added a warning if Get-/SetWindowWord/-Long gets an invalid offset. * [windows/winproc.c] Allows creating dialog windows with NULL as dialog function. Wed Jul 3 09:26:41 1996 Andrew Lewycky <plewycky@oise.utoronto.ca> * [windows/event.c] EVENT_key: Fixes to VK_ code generation for space bar and punctuation. * [files/file.c] GetTempFileName: first character in temporary name is "~". * [memory/heap.c] HEAP_MakeInUseBlockFree now frees the whole subheap if possible. * [objects/text.c] ExtTextOut16(): handle NULL lpRect and ETO_OPAQUE. * [misc/driver.c] Removed some bugs and reformatted. Actually loads drivers now. * [include/callback.h] Added CallDriverProc() and CallWindowsExitProc(). * [loader/module.c] MODULE_CallWEP(): new function. * [misc/lzexpand.c] LZSeek(): return new pointer, not old one. * [misc/ver.c] find_ne_resource(): fixed dependence on LZSeek() bug. GetFileResource(): initialize reslen before using it. * [windows/class.c] SetClassWord(): add missing else. * [objects/font.c] lpFontList is now MAX_FONTS+1. It used to overwrite the array. InitFontList: allocate one huge array of structures. FONT_MatchFont: uppercase the face name. Thu Jun 27 12:41:40 1996 Bruce Milner <bruce@genetics.utah.edu> * [memory/heap.c] Fixed a typo in HeapReAlloc(). Tue Jun 25 22:22:03 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [files/directory.c] [files/drive.c] [if1632/kernel.spec] [if1632/kernel32.spec] [if1632/shell.spec] [include/windows.h] GetTempPath* added GetDriveType* fixed, updated to NewNameStandard. GetCurrentDirectory* fixed (needs to prepend X:\). * [controls/listbox.c] Missing NULL check added. * [if1632/winmm.spec] [loader/builtin.c] winmm.dll (32bit mmsystem equivalent) specs added. * [memory/string.c] [if1632/kernel32.spec] [include/windows.h] Rtl{Move,Zero,Fill}Memory added. * [misc/registry.c] Some NULL ptr dereference bugs fixed. * [multimedia/mcicda.c][multimedia/mcistring.c][multimedia/mmsystem.c] Check for NULL ptr. Fill mciOpenDrv when mixing mciOpen and mciSendString("open .."). Aliasing should work for all MCI devices. * [windows/win.c] Allow passing invalid window handles to CloseWindow(). Tue Jun 25 20:02:15 1996 Jukka Iivonen <iivonen@cc.helsinki.fi> * [files/directory.c] [if1632/kernel32.spec] GetSystemDirectory32A and GetSystemDirectory32W added. * [misc/main.c] [if1632/kernel32.spec] Beep and SetEnvironmentVariable32W added.
359 lines
9.5 KiB
C
359 lines
9.5 KiB
C
/*
|
|
* 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_PAINTICON:
|
|
case WM_NCPAINT:
|
|
{
|
|
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_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
|
|
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_CAPTION,
|
|
x, y, CW_USEDEFAULT, CW_USEDEFAULT,
|
|
group->hWnd, 0, Globals.hInstance, 0);
|
|
|
|
SetWindowLong(program->hWnd, 0, (LONG) hProgram);
|
|
|
|
ShowWindow (program->hWnd, SW_SHOWMINIMIZED);
|
|
SetWindowPos (program->hWnd, 0, x, y, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE);
|
|
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 directory */
|
|
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: */
|