blob: bfbbc89e7b1eb5e8973b9f73af34b4caabec5a7e [file] [log] [blame]
Alexandre Julliard02ed4c21996-03-02 19:34:10 +00001/*
2 * Program Manager
3 *
4 * Copyright 1996 Ulrich Schmid
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
Jonathan Ernst360a3f92006-05-18 14:49:52 +020018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000019 */
20
Mike McCormack7d665672006-01-16 20:41:34 +010021#define WIN32_LEAN_AND_MEAN
22
Niels Kristian Bech Jensen52be93c2000-03-19 21:49:49 +000023#include <string.h>
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000024#include "windows.h"
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000025#include "progman.h"
26
27/***********************************************************************
28 *
29 * PROGRAM_ProgramWndProc
30 */
31
François Gouget9a36a2f2001-01-05 03:43:40 +000032static LRESULT CALLBACK PROGRAM_ProgramWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000033{
34 switch (msg)
35 {
36 case WM_NCLBUTTONDOWN:
37 {
Mike McCormackbda34ac2006-06-04 00:28:48 +090038 HLOCAL hProgram = (HLOCAL) GetWindowLongPtr(hWnd, 0);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000039 PROGRAM *program = LocalLock(hProgram);
Eric Williams95105902000-10-19 20:40:49 +000040 PROGGROUP *group = LocalLock(program->hGroup);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000041 group->hActiveProgram = hProgram;
42 EnableMenuItem(Globals.hFileMenu, PM_MOVE , MF_ENABLED);
43 EnableMenuItem(Globals.hFileMenu, PM_COPY , MF_ENABLED);
44 break;
45 }
46 case WM_NCLBUTTONDBLCLK:
47 {
Mike McCormackbda34ac2006-06-04 00:28:48 +090048 PROGRAM_ExecuteProgram((HLOCAL) GetWindowLongPtr(hWnd, 0));
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000049 return(0);
50 }
51
Alexandre Julliard1e9ac791996-06-06 18:38:27 +000052 case WM_PAINTICON:
53 case WM_NCPAINT:
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000054 {
55 PROGRAM *program;
56 PAINTSTRUCT ps;
57 HDC hdc;
58 hdc = BeginPaint(hWnd,&ps);
Mike McCormackbda34ac2006-06-04 00:28:48 +090059 program = LocalLock((HLOCAL) GetWindowLongPtr(hWnd, 0));
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000060 if (program->hIcon)
61 DrawIcon(hdc, 0, 0, program->hIcon);
62 EndPaint(hWnd,&ps);
63 break;
64 }
65 }
66 return(DefWindowProc(hWnd, msg, wParam, lParam));
67}
68
69/***********************************************************************
70 *
71 * PROGRAM_RegisterProgramWinClass
72 */
73
Stefan Huehner51a7ca32007-03-10 22:00:47 +010074ATOM PROGRAM_RegisterProgramWinClass(void)
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000075{
76 WNDCLASS class;
77
78 class.style = CS_HREDRAW | CS_VREDRAW;
79 class.lpfnWndProc = PROGRAM_ProgramWndProc;
80 class.cbClsExtra = 0;
Mike McCormackbda34ac2006-06-04 00:28:48 +090081 class.cbWndExtra = sizeof(LONG_PTR);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +000082 class.hInstance = Globals.hInstance;
83 class.hIcon = 0;
84 class.hCursor = LoadCursor (0, IDC_ARROW);
85 class.hbrBackground = GetStockObject (WHITE_BRUSH);
86 class.lpszMenuName = 0;
87 class.lpszClassName = STRING_PROGRAM_WIN_CLASS_NAME;
88
89 return RegisterClass(&class);
90}
91
92/***********************************************************************
93 *
94 * PROGRAM_NewProgram
95 */
96
97VOID PROGRAM_NewProgram(HLOCAL hGroup)
98{
99 INT nCmdShow = SW_SHOWNORMAL;
100 INT nHotKey = 0;
101 INT nIconIndex = 0;
102 CHAR szName[MAX_PATHNAME_LEN] = "";
103 CHAR szCmdLine[MAX_PATHNAME_LEN] = "";
104 CHAR szIconFile[MAX_PATHNAME_LEN] = "";
105 CHAR szWorkDir[MAX_PATHNAME_LEN] = "";
106 HICON hIcon = 0;
107
108 if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile,
109 &hIcon, &nIconIndex, &nHotKey,
110 &nCmdShow, MAX_PATHNAME_LEN))
111 return;
112
Alexandre Julliard8bb7fb92001-01-20 02:48:30 +0000113 if (!hIcon) hIcon = LoadIcon(0, IDI_WINLOGO);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000114
115
116 if (!PROGRAM_AddProgram(hGroup, hIcon, szName, 0, 0, szCmdLine, szIconFile,
117 nIconIndex, szWorkDir, nHotKey, nCmdShow))
118 return;
119
120 GRPFILE_WriteGroupFile(hGroup);
121}
122
123/***********************************************************************
124 *
125 * PROGRAM_ModifyProgram
126 */
127
128VOID PROGRAM_ModifyProgram(HLOCAL hProgram)
129{
130 PROGRAM *program = LocalLock(hProgram);
131 CHAR szName[MAX_PATHNAME_LEN];
132 CHAR szCmdLine[MAX_PATHNAME_LEN];
133 CHAR szIconFile[MAX_PATHNAME_LEN];
134 CHAR szWorkDir[MAX_PATHNAME_LEN];
135
136 lstrcpyn(szName, LocalLock(program->hName), MAX_PATHNAME_LEN);
137 lstrcpyn(szCmdLine, LocalLock(program->hCmdLine), MAX_PATHNAME_LEN);
138 lstrcpyn(szIconFile, LocalLock(program->hIconFile), MAX_PATHNAME_LEN);
139 lstrcpyn(szWorkDir, LocalLock(program->hWorkDir), MAX_PATHNAME_LEN);
140
141 if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile,
142 &program->hIcon, &program->nIconIndex,
143 &program->nHotKey, &program->nCmdShow,
144 MAX_PATHNAME_LEN))
145 return;
146
147 MAIN_ReplaceString(&program->hName, szName);
148 MAIN_ReplaceString(&program->hCmdLine, szCmdLine);
149 MAIN_ReplaceString(&program->hIconFile, szIconFile);
150 MAIN_ReplaceString(&program->hWorkDir, szWorkDir);
151
152 SetWindowText(program->hWnd, szName);
153 UpdateWindow(program->hWnd);
154
155 GRPFILE_WriteGroupFile(program->hGroup);
156
157 return;
158}
159
160/***********************************************************************
161 *
162 * PROGRAM_AddProgram
163 */
164
165HLOCAL PROGRAM_AddProgram(HLOCAL hGroup, HICON hIcon, LPCSTR lpszName,
166 INT x, INT y, LPCSTR lpszCmdLine,
167 LPCSTR lpszIconFile, INT nIconIndex,
168 LPCSTR lpszWorkDir, INT nHotKey, INT nCmdShow)
169{
Eric Williams95105902000-10-19 20:40:49 +0000170 PROGGROUP *group = LocalLock(hGroup);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000171 PROGRAM *program;
172 HLOCAL hPrior, *p;
173 HLOCAL hProgram = LocalAlloc(LMEM_FIXED, sizeof(PROGRAM));
174 HLOCAL hName = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszName));
175 HLOCAL hCmdLine = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszCmdLine));
176 HLOCAL hIconFile = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszIconFile));
177 HLOCAL hWorkDir = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszWorkDir));
178 if (!hProgram || !hName || !hCmdLine || !hIconFile || !hWorkDir)
179 {
Alexandre Julliardc981d0b1996-03-31 16:40:13 +0000180 MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000181 if (hProgram) LocalFree(hProgram);
182 if (hName) LocalFree(hName);
183 if (hCmdLine) LocalFree(hCmdLine);
184 if (hIconFile) LocalFree(hIconFile);
185 if (hWorkDir) LocalFree(hWorkDir);
186 return(0);
187 }
Francois Gouget56045a52000-07-23 19:33:42 +0000188 memcpy(LocalLock(hName), lpszName, 1 + lstrlen(lpszName));
189 memcpy(LocalLock(hCmdLine), lpszCmdLine, 1 + lstrlen(lpszCmdLine));
190 memcpy(LocalLock(hIconFile), lpszIconFile, 1 + lstrlen(lpszIconFile));
191 memcpy(LocalLock(hWorkDir), lpszWorkDir, 1 + lstrlen(lpszWorkDir));
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000192
193 group->hActiveProgram = hProgram;
194
195 hPrior = 0;
196 p = &group->hPrograms;
197 while (*p)
198 {
199 hPrior = *p;
200 p = &((PROGRAM*)LocalLock(hPrior))->hNext;
201 }
202 *p = hProgram;
203
204 program = LocalLock(hProgram);
205 program->hGroup = hGroup;
206 program->hPrior = hPrior;
207 program->hNext = 0;
208 program->hName = hName;
209 program->hCmdLine = hCmdLine;
210 program->hIconFile = hIconFile;
211 program->nIconIndex = nIconIndex;
212 program->hWorkDir = hWorkDir;
213 program->hIcon = hIcon;
214 program->nCmdShow = nCmdShow;
215 program->nHotKey = nHotKey;
216
217 program->hWnd =
Eric Pouech69a4eed2005-04-18 09:50:45 +0000218 CreateWindow (STRING_PROGRAM_WIN_CLASS_NAME, lpszName,
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000219 WS_CHILD | WS_CAPTION,
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000220 x, y, CW_USEDEFAULT, CW_USEDEFAULT,
221 group->hWnd, 0, Globals.hInstance, 0);
222
Mike McCormackbda34ac2006-06-04 00:28:48 +0900223 SetWindowLongPtr(program->hWnd, 0, (LONG_PTR) hProgram);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000224
225 ShowWindow (program->hWnd, SW_SHOWMINIMIZED);
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000226 SetWindowPos (program->hWnd, 0, x, y, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000227 UpdateWindow (program->hWnd);
228
229 return hProgram;
230}
231
232/***********************************************************************
233 *
234 * PROGRAM_CopyMoveProgram
235 */
236
237VOID PROGRAM_CopyMoveProgram(HLOCAL hProgram, BOOL bMove)
238{
239 PROGRAM *program = LocalLock(hProgram);
Eric Williams95105902000-10-19 20:40:49 +0000240 PROGGROUP *fromgroup = LocalLock(program->hGroup);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000241 HLOCAL hGroup = DIALOG_CopyMove(LocalLock(program->hName),
242 LocalLock(fromgroup->hName), bMove);
243 if (!hGroup) return;
244
245 /* FIXME shouldn't be necessary */
Eric Williams95105902000-10-19 20:40:49 +0000246 OpenIcon(((PROGGROUP*)LocalLock(hGroup))->hWnd);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000247
248 if (!PROGRAM_AddProgram(hGroup,
249#if 0
250 CopyIcon(program->hIcon),
251#else
252 program->hIcon,
253#endif
254 LocalLock(program->hName),
255 program->x, program->y,
256 LocalLock(program->hCmdLine),
257 LocalLock(program->hIconFile),
258 program->nIconIndex,
259 LocalLock(program->hWorkDir),
260 program->nHotKey, program->nCmdShow)) return;
261 GRPFILE_WriteGroupFile(hGroup);
262
263 if (bMove) PROGRAM_DeleteProgram(hProgram, TRUE);
264}
265
266/***********************************************************************
267 *
268 * PROGRAM_ExecuteProgram
269 */
270
271VOID PROGRAM_ExecuteProgram(HLOCAL hProgram)
272{
273 PROGRAM *program = LocalLock(hProgram);
274 LPSTR lpszCmdLine = LocalLock(program->hCmdLine);
275 LPSTR lpszWorkDir = LocalLock(program->hWorkDir);
276
Alexandre Julliard3051b641996-07-05 17:14:13 +0000277 /* FIXME set working directory */
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000278 lpszWorkDir = lpszWorkDir;
279
280 WinExec(lpszCmdLine, program->nCmdShow);
281 if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd);
282}
283
284/***********************************************************************
285 *
286 * PROGRAM_DeleteProgram
287 */
288
289VOID PROGRAM_DeleteProgram(HLOCAL hProgram, BOOL bUpdateGrpFile)
290{
291 PROGRAM *program = LocalLock(hProgram);
Eric Williams95105902000-10-19 20:40:49 +0000292 PROGGROUP *group = LocalLock(program->hGroup);
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000293
294 group->hActiveProgram = 0;
295
296 if (program->hPrior)
297 ((PROGRAM*)LocalLock(program->hPrior))->hNext = program->hNext;
298 else
Eric Williams95105902000-10-19 20:40:49 +0000299 ((PROGGROUP*)LocalLock(program->hGroup))->hPrograms = program->hNext;
Vincent Béron9a624912002-05-31 23:06:46 +0000300
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000301 if (program->hNext)
302 ((PROGRAM*)LocalLock(program->hNext))->hPrior = program->hPrior;
303
304 if (bUpdateGrpFile)
305 GRPFILE_WriteGroupFile(program->hGroup);
306
307 DestroyWindow(program->hWnd);
308#if 0
309 if (program->hIcon)
310 DestroyIcon(program->hIcon);
311#endif
312 LocalFree(program->hName);
313 LocalFree(program->hCmdLine);
314 LocalFree(program->hIconFile);
315 LocalFree(program->hWorkDir);
316 LocalFree(hProgram);
317}
318
319/***********************************************************************
320 *
321 * PROGRAM_FirstProgram
322 */
323
324HLOCAL PROGRAM_FirstProgram(HLOCAL hGroup)
325{
Eric Williams95105902000-10-19 20:40:49 +0000326 PROGGROUP *group;
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000327 if (!hGroup) return(0);
328 group = LocalLock(hGroup);
329 return(group->hPrograms);
330}
331
332/***********************************************************************
333 *
334 * PROGRAM_NextProgram
335 */
336
337HLOCAL PROGRAM_NextProgram(HLOCAL hProgram)
338{
339 PROGRAM *program;
340 if (!hProgram) return(0);
341 program = LocalLock(hProgram);
342 return(program->hNext);
343}
344
345/***********************************************************************
346 *
347 * PROGRAM_ActiveProgram
348 */
349
350HLOCAL PROGRAM_ActiveProgram(HLOCAL hGroup)
351{
Eric Williams95105902000-10-19 20:40:49 +0000352 PROGGROUP *group;
Alexandre Julliard02ed4c21996-03-02 19:34:10 +0000353 if (!hGroup) return(0);
354 group = LocalLock(hGroup);
355 if (IsIconic(group->hWnd)) return(0);
356
357 return(group->hActiveProgram);
358}
359
360/***********************************************************************
361 *
362 * PROGRAM_ProgramName
363 */
364
365LPCSTR PROGRAM_ProgramName(HLOCAL hProgram)
366{
367 PROGRAM *program;
368 if (!hProgram) return(0);
369 program = LocalLock(hProgram);
370 return(LocalLock(program->hName));
371}
372
373/* Local Variables: */
374/* c-file-style: "GNU" */
375/* End: */