123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- /*
- * Program Manager
- *
- * Copyright 1996 Ulrich Schmid
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
- #define WIN32_LEAN_AND_MEAN
- #include <string.h>
- #include "windows.h"
- #include "progman.h"
- /***********************************************************************
- *
- * PROGRAM_ProgramWndProc
- */
- static LRESULT CALLBACK PROGRAM_ProgramWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch (msg)
- {
- case WM_NCLBUTTONDOWN:
- {
- HLOCAL hProgram = (HLOCAL) GetWindowLongPtrW(hWnd, 0);
- PROGRAM *program = LocalLock(hProgram);
- PROGGROUP *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) GetWindowLongPtrW(hWnd, 0));
- return(0);
- }
- case WM_PAINTICON:
- case WM_NCPAINT:
- {
- PROGRAM *program;
- PAINTSTRUCT ps;
- HDC hdc;
- hdc = BeginPaint(hWnd,&ps);
- program = LocalLock((HLOCAL) GetWindowLongPtrW(hWnd, 0));
- if (program->hIcon)
- DrawIcon(hdc, 0, 0, program->hIcon);
- EndPaint(hWnd,&ps);
- break;
- }
- }
- return DefWindowProcW(hWnd, msg, wParam, lParam);
- }
- /***********************************************************************
- *
- * PROGRAM_RegisterProgramWinClass
- */
- ATOM PROGRAM_RegisterProgramWinClass(void)
- {
- WNDCLASSW class;
- class.style = CS_HREDRAW | CS_VREDRAW;
- class.lpfnWndProc = PROGRAM_ProgramWndProc;
- class.cbClsExtra = 0;
- class.cbWndExtra = sizeof(LONG_PTR);
- class.hInstance = Globals.hInstance;
- class.hIcon = 0;
- class.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW);
- class.hbrBackground = GetStockObject (WHITE_BRUSH);
- class.lpszMenuName = 0;
- class.lpszClassName = STRING_PROGRAM_WIN_CLASS_NAME;
- return RegisterClassW(&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 = LoadIconW(0, (LPWSTR)IDI_WINLOGO);
- 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];
- lstrcpynA(szName, LocalLock(program->hName), MAX_PATHNAME_LEN);
- lstrcpynA(szCmdLine, LocalLock(program->hCmdLine), MAX_PATHNAME_LEN);
- lstrcpynA(szIconFile, LocalLock(program->hIconFile), MAX_PATHNAME_LEN);
- lstrcpynA(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);
- SetWindowTextA(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)
- {
- PROGGROUP *group = LocalLock(hGroup);
- PROGRAM *program;
- HLOCAL hPrior, *p;
- HLOCAL hProgram = LocalAlloc(LMEM_FIXED, sizeof(PROGRAM));
- HLOCAL hName = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszName));
- HLOCAL hCmdLine = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszCmdLine));
- HLOCAL hIconFile = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszIconFile));
- HLOCAL hWorkDir = LocalAlloc(LMEM_FIXED, 1 + strlen(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);
- }
- memcpy(LocalLock(hName), lpszName, 1 + strlen(lpszName));
- memcpy(LocalLock(hCmdLine), lpszCmdLine, 1 + strlen(lpszCmdLine));
- memcpy(LocalLock(hIconFile), lpszIconFile, 1 + strlen(lpszIconFile));
- memcpy(LocalLock(hWorkDir), lpszWorkDir, 1 + strlen(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 =
- CreateWindowW(STRING_PROGRAM_WIN_CLASS_NAME, NULL,
- WS_CHILD | WS_CAPTION,
- x, y, CW_USEDEFAULT, CW_USEDEFAULT,
- group->hWnd, 0, Globals.hInstance, 0);
- SetWindowTextA(program->hWnd, lpszName);
- SetWindowLongPtrW(program->hWnd, 0, (LONG_PTR) 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);
- PROGGROUP *fromgroup = LocalLock(program->hGroup);
- HLOCAL hGroup = DIALOG_CopyMove(LocalLock(program->hName),
- LocalLock(fromgroup->hName), bMove);
- if (!hGroup) return;
- /* FIXME shouldn't be necessary */
- OpenIcon(((PROGGROUP*)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);
- /* FIXME set working directory from program->hWorkDir */
- WinExec(lpszCmdLine, program->nCmdShow);
- if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd);
- }
- /***********************************************************************
- *
- * PROGRAM_DeleteProgram
- */
- VOID PROGRAM_DeleteProgram(HLOCAL hProgram, BOOL bUpdateGrpFile)
- {
- PROGRAM *program = LocalLock(hProgram);
- PROGGROUP *group = LocalLock(program->hGroup);
- group->hActiveProgram = 0;
- if (program->hPrior)
- ((PROGRAM*)LocalLock(program->hPrior))->hNext = program->hNext;
- else
- ((PROGGROUP*)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)
- {
- PROGGROUP *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)
- {
- PROGGROUP *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));
- }
|