ReactOS 0.4.15-dev-7961-gdcf9eb0
program.c
Go to the documentation of this file.
1/*
2 * Program Manager
3 *
4 * Copyright 1996 Ulrich Schmid
5 *
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
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21/*
22 * PROJECT: ReactOS Program Manager
23 * COPYRIGHT: GPL - See COPYING in the top level directory
24 * FILE: base/shell/progman/program.c
25 * PURPOSE: Program items helper functions
26 * PROGRAMMERS: Ulrich Schmid
27 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
28 */
29
30#include "progman.h"
31
32#if 0
33
34static LRESULT CALLBACK PROGRAM_ProgramWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
35{
36 switch (msg)
37 {
39 {
40 HLOCAL hProgram = (HLOCAL) GetWindowLongPtrW(hWnd, 0);
41 PROGRAM *program = LocalLock(hProgram);
42 PROGGROUP *group = LocalLock(program->hGroup);
43 group->hActiveProgram = hProgram;
46 break;
47 }
49 {
51 return(0);
52 }
53
54 case WM_PAINTICON:
55 case WM_NCPAINT:
56 {
58 PAINTSTRUCT ps;
59 HDC hdc;
60 hdc = BeginPaint(hWnd,&ps);
62 if (program->hIcon)
63 DrawIcon(hdc, 0, 0, program->hIcon);
64 EndPaint(hWnd,&ps);
65 break;
66 }
67 }
69}
70
71#endif
72
73
74
75/***********************************************************************
76 *
77 * PROGRAM_NewProgram
78 */
79
81{
83 INT nIconIndex = 0;
84 INT nHotKey = 0;
85 INT nCmdShow = SW_SHOWNORMAL;
86 BOOL bNewVDM = FALSE;
88 WCHAR szCmdLine[MAX_PATHNAME_LEN] = L"";
89 WCHAR szIconFile[MAX_PATHNAME_LEN] = L"";
90 WCHAR szWorkDir[MAX_PATHNAME_LEN] = L"";
91
92 if (!DIALOG_ProgramAttributes(szTitle, szCmdLine, szWorkDir, szIconFile,
93 &hIcon, &nIconIndex, &nHotKey, &nCmdShow, &bNewVDM,
95 {
96 return;
97 }
98
99 if (!hIcon)
101
102 if (!PROGRAM_AddProgram(hGroup, hIcon, szTitle, -1, -1, szCmdLine, szIconFile,
103 nIconIndex, szWorkDir, nHotKey, nCmdShow, bNewVDM))
104 {
105 return;
106 }
107
109}
110
111/***********************************************************************
112 *
113 * PROGRAM_ModifyProgram
114 */
115
117{
118 LVITEMW lvItem;
120 WCHAR szWorkDir[MAX_PATHNAME_LEN];
121 WCHAR szCmdLine[MAX_PATHNAME_LEN];
122 WCHAR szIconFile[MAX_PATHNAME_LEN];
123
124 lstrcpynW(szName , hProgram->hName , ARRAYSIZE(szName));
125 lstrcpynW(szCmdLine , hProgram->hCmdLine , ARRAYSIZE(szCmdLine));
126 lstrcpynW(szIconFile, hProgram->hIconFile, ARRAYSIZE(szIconFile));
127 lstrcpynW(szWorkDir , hProgram->hWorkDir , ARRAYSIZE(szWorkDir));
128
129 if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile,
130 &hProgram->hIcon, &hProgram->nIconIndex,
131 &hProgram->nHotKey, &hProgram->nCmdShow,
132 &hProgram->bNewVDM, MAX_PATHNAME_LEN))
133 {
134 return;
135 }
136
137 MAIN_ReplaceString(&hProgram->hName , szName);
138 MAIN_ReplaceString(&hProgram->hCmdLine , szCmdLine);
139 MAIN_ReplaceString(&hProgram->hIconFile, szIconFile);
140 MAIN_ReplaceString(&hProgram->hWorkDir , szWorkDir);
141
142 ZeroMemory(&lvItem, sizeof(lvItem));
143 lvItem.mask = LVIF_TEXT;
144 lvItem.iSubItem = 0;
145 lvItem.pszText = szName;
146 SendMessageW(hProgram->hGroup->hListView, LVM_SETITEMTEXTW, hProgram->iItem, (LPARAM)&lvItem);
147
149}
150
151/***********************************************************************
152 *
153 * PROGRAM_AddProgram
154 */
155
156PROGRAM*
158 INT x, INT y, LPCWSTR lpszCmdLine, LPCWSTR lpszIconFile, INT nIconIndex,
159 LPCWSTR lpszWorkDir, INT nHotKey, INT nCmdShow, BOOL bNewVDM)
160{
161 PROGRAM* hProgram;
162 PROGRAM* hPrior;
163 PROGRAM** p;
164 LPWSTR hCmdLine;
165 LPWSTR hIconFile;
166 LPWSTR hName;
167 LPWSTR hWorkDir;
168 LVITEMW lvItem;
169 INT iItem;
170
171 hProgram = Alloc(HEAP_ZERO_MEMORY, sizeof(*hProgram));
172 hName = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszName) + 1) * sizeof(WCHAR));
173 hCmdLine = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszCmdLine) + 1) * sizeof(WCHAR));
174 hIconFile = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszIconFile) + 1) * sizeof(WCHAR));
175 hWorkDir = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszWorkDir) + 1) * sizeof(WCHAR));
176 if (!hProgram || !hName || !hCmdLine || !hIconFile || !hWorkDir)
177 {
179 if (hProgram) Free(hProgram);
180 if (hName) Free(hName);
181 if (hCmdLine) Free(hCmdLine);
182 if (hIconFile) Free(hIconFile);
183 if (hWorkDir) Free(hWorkDir);
184 return NULL;
185 }
186 memcpy(hName , lpszName , (wcslen(lpszName) + 1) * sizeof(WCHAR));
187 memcpy(hCmdLine , lpszCmdLine , (wcslen(lpszCmdLine) + 1) * sizeof(WCHAR));
188 memcpy(hIconFile, lpszIconFile, (wcslen(lpszIconFile) + 1) * sizeof(WCHAR));
189 memcpy(hWorkDir , lpszWorkDir , (wcslen(lpszWorkDir) + 1) * sizeof(WCHAR));
190
191 hGroup->hActiveProgram = hProgram;
192
193 hPrior = NULL;
194 for (p = &hGroup->hPrograms; *p; p = &hPrior->hNext)
195 hPrior = *p;
196 *p = hProgram;
197
198 hProgram->hGroup = hGroup;
199 hProgram->hPrior = hPrior;
200 hProgram->hNext = NULL;
201 hProgram->hName = hName;
202 hProgram->hCmdLine = hCmdLine;
203 hProgram->hIconFile = hIconFile;
204 hProgram->nIconIndex = nIconIndex;
205 hProgram->hWorkDir = hWorkDir;
206 hProgram->hIcon = hIcon;
207 hProgram->nCmdShow = nCmdShow;
208 hProgram->nHotKey = nHotKey;
209 hProgram->bNewVDM = bNewVDM;
210 hProgram->TagsSize = 0;
211 hProgram->Tags = NULL;
212
213 ZeroMemory(&lvItem, sizeof(lvItem));
214 lvItem.mask = LVIF_PARAM | LVIF_IMAGE | LVIF_TEXT;
215 lvItem.pszText = (LPWSTR)lpszName;
216 lvItem.lParam = (LPARAM)hProgram;
217 lvItem.iImage = ImageList_ReplaceIcon(hGroup->hListLarge, -1, hIcon);
219
220 lvItem.iItem = SendMessageA(hGroup->hListView, LVM_GETITEMCOUNT, 0, 0);
221 iItem = SendMessageW(hGroup->hListView, LVM_INSERTITEMW, 0, (LPARAM)&lvItem);
222 hProgram->iItem = iItem;
223 if (x != -1 && y != -1)
225
226 return hProgram;
227}
228
229
230
231/***********************************************************************
232 *
233 * PROGRAM_CopyMoveProgram
234 */
235
237{
238 PROGGROUP* hGroup;
239
240 hGroup = DIALOG_CopyMove(hProgram, bMove);
241 if (!hGroup)
242 return;
243
244 /* FIXME: shouldn't be necessary */
245 OpenIcon(hGroup->hWnd);
246
247 if (!PROGRAM_AddProgram(hGroup,
248 hProgram->hIcon,
249 hProgram->hName,
250 hProgram->x,
251 hProgram->y,
252 hProgram->hCmdLine,
253 hProgram->hIconFile,
254 hProgram->nIconIndex,
255 hProgram->hWorkDir,
256 hProgram->nHotKey,
257 hProgram->nCmdShow,
258 hProgram->bNewVDM))
259 {
260 return;
261 }
262
264
265 if (bMove)
266 PROGRAM_DeleteProgram(hProgram, TRUE);
267}
268
269/***********************************************************************
270 *
271 * PROGRAM_ExecuteProgram
272 */
273
275{
276 // TODO: Use a (private?) shell API with which one can use hProgram->bNewVDM
277
278 ShellExecuteW(NULL, NULL, hProgram->hCmdLine, NULL, hProgram->hWorkDir, hProgram->nCmdShow);
279
280 if (Globals.bMinOnRun)
282}
283
284/***********************************************************************
285 *
286 * PROGRAM_DeleteProgram
287 */
288
289VOID PROGRAM_DeleteProgram(PROGRAM* hProgram, BOOL bUpdateGrpFile)
290{
292
293 group = hProgram->hGroup;
294 if (hProgram->hGroup->hActiveProgram == hProgram)
296
297 SendMessageA(group->hListView, LVM_DELETEITEM, hProgram->iItem, 0);
298
299 if (hProgram->hPrior)
300 hProgram->hPrior->hNext = hProgram->hNext;
301 else
302 hProgram->hGroup->hPrograms = hProgram->hNext;
303
304 if (hProgram->hNext)
305 hProgram->hNext->hPrior = hProgram->hPrior;
306
307 if (bUpdateGrpFile)
309
310#if 0
311 DestroyWindow(program->hWnd);
312 if (program->hIcon)
313 DestroyIcon(program->hIcon);
314#endif
315
316 if (hProgram->Tags)
317 Free(hProgram->Tags);
318 Free(hProgram->hName);
319 Free(hProgram->hCmdLine);
320 Free(hProgram->hIconFile);
321 Free(hProgram->hWorkDir);
322 Free(hProgram);
323}
324
325
326/***********************************************************************
327 *
328 * PROGRAM_ActiveProgram
329 */
330
332{
333 if (!hGroup) return NULL;
334 if (IsIconic(hGroup->hWnd)) return NULL;
335 return hGroup->hActiveProgram;
336}
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define IDS_ERROR
Definition: resource.h:18
#define IDS_OUT_OF_MEMORY
Definition: resource.h:5
BOOL DIALOG_ProgramAttributes(LPWSTR lpszTitle, LPWSTR lpszCmdLine, LPWSTR lpszWorkDir, LPWSTR lpszIconFile, HICON *lphIcon, INT *lpnIconIndex, INT *lpnHotKey, INT *lpnCmdShow, BOOL *lpbNewVDM, INT nSize)
Definition: dialog.c:864
PROGGROUP * DIALOG_CopyMove(PROGRAM *hProgram, BOOL bMove)
Definition: dialog.c:343
INT MAIN_MessageBoxIDS(UINT ids_text, UINT ids_title, WORD type)
Definition: main.c:1159
VOID MAIN_ReplaceString(LPWSTR *string, LPWSTR replace)
Definition: main.c:1192
PVOID Alloc(IN DWORD dwFlags, IN SIZE_T dwBytes)
Definition: main.c:63
#define PM_COPY
Definition: resource.h:80
#define PM_MOVE
Definition: resource.h:79
CLIPBOARD_GLOBALS Globals
Definition: clipbrd.c:13
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
INT WINAPI ImageList_ReplaceIcon(HIMAGELIST himl, INT nIndex, HICON hIcon)
Definition: imagelist.c:2779
#define CALLBACK
Definition: compat.h:35
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrcpynW
Definition: compat.h:738
unsigned int BOOL
Definition: ntddk_ex.h:94
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint program
Definition: glext.h:6723
GLboolean GLuint group
Definition: glext.h:11120
GLfloat GLfloat p
Definition: glext.h:8902
BOOL GRPFILE_WriteGroupFile(PROGGROUP *hGroup)
Definition: grpfile.c:358
LPVOID NTAPI LocalLock(HLOCAL hMem)
Definition: heapmem.c:1616
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
TCHAR szTitle[MAX_LOADSTRING]
Definition: magnifier.c:35
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:92
static HICON
Definition: imagelist.c:84
HICON hIcon
Definition: msconfig.c:44
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
static const WCHAR szName[]
Definition: powrprof.c:45
#define MAX_PATHNAME_LEN
Definition: progman.h:54
VOID PROGRAM_CopyMoveProgram(PROGRAM *hProgram, BOOL bMove)
Definition: program.c:236
VOID PROGRAM_ModifyProgram(PROGRAM *hProgram)
Definition: program.c:116
VOID PROGRAM_DeleteProgram(PROGRAM *hProgram, BOOL bUpdateGrpFile)
Definition: program.c:289
PROGRAM * PROGRAM_AddProgram(PROGGROUP *hGroup, HICON hIcon, LPCWSTR lpszName, INT x, INT y, LPCWSTR lpszCmdLine, LPCWSTR lpszIconFile, INT nIconIndex, LPCWSTR lpszWorkDir, INT nHotKey, INT nCmdShow, BOOL bNewVDM)
Definition: program.c:157
PROGRAM * PROGRAM_ActiveProgram(PROGGROUP *hGroup)
Definition: program.c:331
VOID PROGRAM_ExecuteProgram(PROGRAM *hProgram)
Definition: program.c:274
VOID PROGRAM_NewProgram(PROGGROUP *hGroup)
Definition: program.c:80
#define LVM_SETITEMTEXTW
Definition: commctrl.h:2687
#define LVM_GETITEMCOUNT
Definition: commctrl.h:2306
#define LVM_SETITEMPOSITION
Definition: commctrl.h:2480
#define LVIF_PARAM
Definition: commctrl.h:2311
#define LVIF_TEXT
Definition: commctrl.h:2309
#define LVM_DELETEITEM
Definition: commctrl.h:2410
#define LVIF_IMAGE
Definition: commctrl.h:2310
#define LVM_INSERTITEMW
Definition: commctrl.h:2404
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2402
PROGRAM * hPrograms
Definition: progman.h:139
PROGRAM * hActiveProgram
Definition: progman.h:140
HIMAGELIST hListLarge
Definition: progman.h:119
HWND hWnd
Definition: progman.h:116
HWND hListView
Definition: progman.h:118
INT nCmdShow
Definition: progman.h:98
LPWSTR hName
Definition: progman.h:93
LPWSTR hCmdLine
Definition: progman.h:94
INT nHotKey
Definition: progman.h:97
PROGRAM * hPrior
Definition: progman.h:84
BOOL bNewVDM
Definition: progman.h:99
PROGRAM * hNext
Definition: progman.h:85
LPWSTR hWorkDir
Definition: progman.h:96
HICON hIcon
Definition: progman.h:92
SIZE_T TagsSize
Definition: progman.h:101
PVOID Tags
Definition: progman.h:102
INT y
Definition: progman.h:90
INT nIconIndex
Definition: progman.h:91
INT x
Definition: progman.h:89
LPWSTR hIconFile
Definition: progman.h:95
PROGGROUP * hGroup
Definition: progman.h:83
INT iItem
Definition: progman.h:88
LPWSTR pszText
Definition: commctrl.h:2365
int iSubItem
Definition: commctrl.h:2362
UINT mask
Definition: commctrl.h:2360
LPARAM lParam
Definition: commctrl.h:2368
int iImage
Definition: commctrl.h:2367
int32_t INT
Definition: typedefs.h:58
#define ZeroMemory
Definition: winbase.h:1712
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
HANDLE HLOCAL
Definition: windef.h:244
#define SW_SHOWNORMAL
Definition: winuser.h:770
#define GetWindowLongPtrW
Definition: winuser.h:4829
#define MAKELPARAM(l, h)
Definition: winuser.h:4008
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI DrawIcon(_In_ HDC, _In_ int, _In_ int, _In_ HICON)
Definition: cursoricon.c:2018
BOOL WINAPI OpenIcon(_In_ HWND)
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define IDI_WINLOGO
Definition: winuser.h:709
#define WM_NCLBUTTONDBLCLK
Definition: winuser.h:1694
BOOL WINAPI IsIconic(_In_ HWND)
#define MF_ENABLED
Definition: winuser.h:128
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
#define MB_OK
Definition: winuser.h:790
BOOL WINAPI CloseWindow(_In_ HWND)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
BOOL WINAPI DestroyWindow(_In_ HWND)
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2075
#define WM_NCLBUTTONDOWN
Definition: winuser.h:1692
#define WM_PAINTICON
Definition: winuser.h:1641
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_NCPAINT
Definition: winuser.h:1687
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2053
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION Free
Definition: exfuncs.h:815
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185