4 * Copyright 1996 Ulrich Schmid
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.
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.
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
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 /***********************************************************************
25 * PROGRAM_ProgramWndProc
28 static LRESULT CALLBACK
PROGRAM_ProgramWndProc(HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
32 case WM_NCLBUTTONDOWN
:
34 HLOCAL hProgram
= (HLOCAL
) GetWindowLongPtrW(hWnd
, 0);
35 PROGRAM
*program
= LocalLock(hProgram
);
36 PROGGROUP
*group
= LocalLock(program
->hGroup
);
37 group
->hActiveProgram
= hProgram
;
38 EnableMenuItem(Globals
.hFileMenu
, PM_MOVE
, MF_ENABLED
);
39 EnableMenuItem(Globals
.hFileMenu
, PM_COPY
, MF_ENABLED
);
42 case WM_NCLBUTTONDBLCLK
:
44 PROGRAM_ExecuteProgram((HLOCAL
) GetWindowLongPtrW(hWnd
, 0));
54 hdc
= BeginPaint(hWnd
,&ps
);
55 program
= LocalLock((HLOCAL
) GetWindowLongPtrW(hWnd
, 0));
57 DrawIcon(hdc
, 0, 0, program
->hIcon
);
62 return DefWindowProcW(hWnd
, msg
, wParam
, lParam
);
65 /***********************************************************************
67 * PROGRAM_RegisterProgramWinClass
70 ATOM
PROGRAM_RegisterProgramWinClass(void)
74 class.style
= CS_HREDRAW
| CS_VREDRAW
;
75 class.lpfnWndProc
= PROGRAM_ProgramWndProc
;
77 class.cbWndExtra
= sizeof(LONG_PTR
);
78 class.hInstance
= Globals
.hInstance
;
80 class.hCursor
= LoadCursorW (0, (LPWSTR
)IDC_ARROW
);
81 class.hbrBackground
= GetStockObject (WHITE_BRUSH
);
82 class.lpszMenuName
= 0;
83 class.lpszClassName
= STRING_PROGRAM_WIN_CLASS_NAME
;
85 return RegisterClassW(&class);
88 /***********************************************************************
93 VOID
PROGRAM_NewProgram(HLOCAL hGroup
)
95 INT nCmdShow
= SW_SHOWNORMAL
;
98 CHAR szName
[MAX_PATHNAME_LEN
] = "";
99 CHAR szCmdLine
[MAX_PATHNAME_LEN
] = "";
100 CHAR szIconFile
[MAX_PATHNAME_LEN
] = "";
101 CHAR szWorkDir
[MAX_PATHNAME_LEN
] = "";
104 if (!DIALOG_ProgramAttributes(szName
, szCmdLine
, szWorkDir
, szIconFile
,
105 &hIcon
, &nIconIndex
, &nHotKey
,
106 &nCmdShow
, MAX_PATHNAME_LEN
))
109 if (!hIcon
) hIcon
= LoadIconW(0, (LPWSTR
)IDI_WINLOGO
);
112 if (!PROGRAM_AddProgram(hGroup
, hIcon
, szName
, 0, 0, szCmdLine
, szIconFile
,
113 nIconIndex
, szWorkDir
, nHotKey
, nCmdShow
))
116 GRPFILE_WriteGroupFile(hGroup
);
119 /***********************************************************************
121 * PROGRAM_ModifyProgram
124 VOID
PROGRAM_ModifyProgram(HLOCAL hProgram
)
126 PROGRAM
*program
= LocalLock(hProgram
);
127 CHAR szName
[MAX_PATHNAME_LEN
];
128 CHAR szCmdLine
[MAX_PATHNAME_LEN
];
129 CHAR szIconFile
[MAX_PATHNAME_LEN
];
130 CHAR szWorkDir
[MAX_PATHNAME_LEN
];
132 lstrcpynA(szName
, LocalLock(program
->hName
), MAX_PATHNAME_LEN
);
133 lstrcpynA(szCmdLine
, LocalLock(program
->hCmdLine
), MAX_PATHNAME_LEN
);
134 lstrcpynA(szIconFile
, LocalLock(program
->hIconFile
), MAX_PATHNAME_LEN
);
135 lstrcpynA(szWorkDir
, LocalLock(program
->hWorkDir
), MAX_PATHNAME_LEN
);
137 if (!DIALOG_ProgramAttributes(szName
, szCmdLine
, szWorkDir
, szIconFile
,
138 &program
->hIcon
, &program
->nIconIndex
,
139 &program
->nHotKey
, &program
->nCmdShow
,
143 MAIN_ReplaceString(&program
->hName
, szName
);
144 MAIN_ReplaceString(&program
->hCmdLine
, szCmdLine
);
145 MAIN_ReplaceString(&program
->hIconFile
, szIconFile
);
146 MAIN_ReplaceString(&program
->hWorkDir
, szWorkDir
);
148 SetWindowTextA(program
->hWnd
, szName
);
149 UpdateWindow(program
->hWnd
);
151 GRPFILE_WriteGroupFile(program
->hGroup
);
156 /***********************************************************************
161 HLOCAL
PROGRAM_AddProgram(HLOCAL hGroup
, HICON hIcon
, LPCSTR lpszName
,
162 INT x
, INT y
, LPCSTR lpszCmdLine
,
163 LPCSTR lpszIconFile
, INT nIconIndex
,
164 LPCSTR lpszWorkDir
, INT nHotKey
, INT nCmdShow
)
166 PROGGROUP
*group
= LocalLock(hGroup
);
169 HLOCAL hProgram
= LocalAlloc(LMEM_FIXED
, sizeof(PROGRAM
));
170 HLOCAL hName
= LocalAlloc(LMEM_FIXED
, 1 + strlen(lpszName
));
171 HLOCAL hCmdLine
= LocalAlloc(LMEM_FIXED
, 1 + strlen(lpszCmdLine
));
172 HLOCAL hIconFile
= LocalAlloc(LMEM_FIXED
, 1 + strlen(lpszIconFile
));
173 HLOCAL hWorkDir
= LocalAlloc(LMEM_FIXED
, 1 + strlen(lpszWorkDir
));
174 if (!hProgram
|| !hName
|| !hCmdLine
|| !hIconFile
|| !hWorkDir
)
176 MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY
, IDS_ERROR
, MB_OK
);
177 if (hProgram
) LocalFree(hProgram
);
178 if (hName
) LocalFree(hName
);
179 if (hCmdLine
) LocalFree(hCmdLine
);
180 if (hIconFile
) LocalFree(hIconFile
);
181 if (hWorkDir
) LocalFree(hWorkDir
);
184 memcpy(LocalLock(hName
), lpszName
, 1 + strlen(lpszName
));
185 memcpy(LocalLock(hCmdLine
), lpszCmdLine
, 1 + strlen(lpszCmdLine
));
186 memcpy(LocalLock(hIconFile
), lpszIconFile
, 1 + strlen(lpszIconFile
));
187 memcpy(LocalLock(hWorkDir
), lpszWorkDir
, 1 + strlen(lpszWorkDir
));
189 group
->hActiveProgram
= hProgram
;
192 p
= &group
->hPrograms
;
196 p
= &((PROGRAM
*)LocalLock(hPrior
))->hNext
;
200 program
= LocalLock(hProgram
);
201 program
->hGroup
= hGroup
;
202 program
->hPrior
= hPrior
;
204 program
->hName
= hName
;
205 program
->hCmdLine
= hCmdLine
;
206 program
->hIconFile
= hIconFile
;
207 program
->nIconIndex
= nIconIndex
;
208 program
->hWorkDir
= hWorkDir
;
209 program
->hIcon
= hIcon
;
210 program
->nCmdShow
= nCmdShow
;
211 program
->nHotKey
= nHotKey
;
214 CreateWindowW(STRING_PROGRAM_WIN_CLASS_NAME
, NULL
,
215 WS_CHILD
| WS_CAPTION
,
216 x
, y
, CW_USEDEFAULT
, CW_USEDEFAULT
,
217 group
->hWnd
, 0, Globals
.hInstance
, 0);
219 SetWindowTextA(program
->hWnd
, lpszName
);
220 SetWindowLongPtrW(program
->hWnd
, 0, (LONG_PTR
) hProgram
);
222 ShowWindow (program
->hWnd
, SW_SHOWMINIMIZED
);
223 SetWindowPos (program
->hWnd
, 0, x
, y
, 0, 0, SWP_NOZORDER
| SWP_NOACTIVATE
| SWP_NOSIZE
);
224 UpdateWindow (program
->hWnd
);
229 /***********************************************************************
231 * PROGRAM_CopyMoveProgram
234 VOID
PROGRAM_CopyMoveProgram(HLOCAL hProgram
, BOOL bMove
)
236 PROGRAM
*program
= LocalLock(hProgram
);
237 PROGGROUP
*fromgroup
= LocalLock(program
->hGroup
);
238 HLOCAL hGroup
= DIALOG_CopyMove(LocalLock(program
->hName
),
239 LocalLock(fromgroup
->hName
), bMove
);
242 /* FIXME shouldn't be necessary */
243 OpenIcon(((PROGGROUP
*)LocalLock(hGroup
))->hWnd
);
245 if (!PROGRAM_AddProgram(hGroup
,
247 CopyIcon(program
->hIcon
),
251 LocalLock(program
->hName
),
252 program
->x
, program
->y
,
253 LocalLock(program
->hCmdLine
),
254 LocalLock(program
->hIconFile
),
256 LocalLock(program
->hWorkDir
),
257 program
->nHotKey
, program
->nCmdShow
)) return;
258 GRPFILE_WriteGroupFile(hGroup
);
260 if (bMove
) PROGRAM_DeleteProgram(hProgram
, TRUE
);
263 /***********************************************************************
265 * PROGRAM_ExecuteProgram
268 VOID
PROGRAM_ExecuteProgram(HLOCAL hProgram
)
270 PROGRAM
*program
= LocalLock(hProgram
);
271 LPSTR lpszCmdLine
= LocalLock(program
->hCmdLine
);
273 /* FIXME set working directory from program->hWorkDir */
275 WinExec(lpszCmdLine
, program
->nCmdShow
);
276 if (Globals
.bMinOnRun
) CloseWindow(Globals
.hMainWnd
);
279 /***********************************************************************
281 * PROGRAM_DeleteProgram
284 VOID
PROGRAM_DeleteProgram(HLOCAL hProgram
, BOOL bUpdateGrpFile
)
286 PROGRAM
*program
= LocalLock(hProgram
);
287 PROGGROUP
*group
= LocalLock(program
->hGroup
);
289 group
->hActiveProgram
= 0;
292 ((PROGRAM
*)LocalLock(program
->hPrior
))->hNext
= program
->hNext
;
294 ((PROGGROUP
*)LocalLock(program
->hGroup
))->hPrograms
= program
->hNext
;
297 ((PROGRAM
*)LocalLock(program
->hNext
))->hPrior
= program
->hPrior
;
300 GRPFILE_WriteGroupFile(program
->hGroup
);
302 DestroyWindow(program
->hWnd
);
305 DestroyIcon(program
->hIcon
);
307 LocalFree(program
->hName
);
308 LocalFree(program
->hCmdLine
);
309 LocalFree(program
->hIconFile
);
310 LocalFree(program
->hWorkDir
);
314 /***********************************************************************
316 * PROGRAM_FirstProgram
319 HLOCAL
PROGRAM_FirstProgram(HLOCAL hGroup
)
322 if (!hGroup
) return(0);
323 group
= LocalLock(hGroup
);
324 return(group
->hPrograms
);
327 /***********************************************************************
329 * PROGRAM_NextProgram
332 HLOCAL
PROGRAM_NextProgram(HLOCAL hProgram
)
335 if (!hProgram
) return(0);
336 program
= LocalLock(hProgram
);
337 return(program
->hNext
);
340 /***********************************************************************
342 * PROGRAM_ActiveProgram
345 HLOCAL
PROGRAM_ActiveProgram(HLOCAL hGroup
)
348 if (!hGroup
) return(0);
349 group
= LocalLock(hGroup
);
350 if (IsIconic(group
->hWnd
)) return(0);
352 return(group
->hActiveProgram
);
355 /***********************************************************************
357 * PROGRAM_ProgramName
360 LPCSTR
PROGRAM_ProgramName(HLOCAL hProgram
)
363 if (!hProgram
) return(0);
364 program
= LocalLock(hProgram
);
365 return(LocalLock(program
->hName
));