ReactOS  r76032
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 
34 static LRESULT CALLBACK PROGRAM_ProgramWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
35 {
36  switch (msg)
37  {
38  case WM_NCLBUTTONDOWN:
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  }
48  case WM_NCLBUTTONDBLCLK:
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);
61  program = LocalLock((HLOCAL) GetWindowLongPtrW(hWnd, 0));
62  if (program->hIcon)
63  DrawIcon(hdc, 0, 0, program->hIcon);
64  EndPaint(hWnd,&ps);
65  break;
66  }
67  }
68  return DefWindowProcW(hWnd, msg, wParam, lParam);
69 }
70 
71 #endif
72 
73 
74 
75 /***********************************************************************
76  *
77  * PROGRAM_NewProgram
78  */
79 
81 {
82  HICON hIcon = NULL;
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 
108  GRPFILE_WriteGroupFile(hGroup);
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 
148  GRPFILE_WriteGroupFile(hProgram->hGroup);
149 }
150 
151 /***********************************************************************
152  *
153  * PROGRAM_AddProgram
154  */
155 
156 PROGRAM*
157 PROGRAM_AddProgram(PROGGROUP* hGroup, HICON hIcon, LPCWSTR lpszName,
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);
218  DestroyIcon(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)
224  SendMessageA(hGroup->hListView, LVM_SETITEMPOSITION, lvItem.iItem, MAKELPARAM(x, y));
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 
263  GRPFILE_WriteGroupFile(hGroup);
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 
289 VOID PROGRAM_DeleteProgram(PROGRAM* hProgram, BOOL bUpdateGrpFile)
290 {
291  PROGGROUP* group;
292 
293  group = hProgram->hGroup;
294  if (hProgram->hGroup->hActiveProgram == hProgram)
295  group->hActiveProgram = NULL;
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)
308  GRPFILE_WriteGroupFile(hProgram->hGroup);
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 WM_NCLBUTTONDOWN
Definition: winuser.h:1664
PROGRAM * PROGRAM_ActiveProgram(PROGGROUP *hGroup)
Definition: program.c:331
#define HDC
Definition: msvc.h:22
INT WINAPI ImageList_ReplaceIcon(HIMAGELIST himl, INT nIndex, HICON hIcon)
Definition: imagelist.c:2671
BOOL WINAPI CloseWindow(_In_ HWND)
#define WM_PAINTICON
Definition: winuser.h:1613
int iImage
Definition: commctrl.h:2337
#define TRUE
Definition: types.h:120
VOID PROGRAM_ExecuteProgram(PROGRAM *hProgram)
Definition: program.c:274
PROGRAM * hNext
Definition: progman.h:85
Definition: bidi.c:75
HANDLE HLOCAL
Definition: windef.h:267
SIZE_T TagsSize
Definition: progman.h:101
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2024
LPWSTR hIconFile
Definition: progman.h:95
__wchar_t WCHAR
Definition: xmlstorage.h:180
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define MAKELPARAM(l, h)
Definition: winuser.h:3894
#define PM_MOVE
Definition: resource.h:79
#define CALLBACK
Definition: compat.h:27
HWND hWnd
Definition: settings.c:17
HANDLE HWND
Definition: compat.h:13
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define ARRAYSIZE(array)
Definition: filtermapper.c:28
HWND hWnd
Definition: progman.h:116
#define ZeroMemory
Definition: winbase.h:1621
PVOID Tags
Definition: progman.h:102
#define IDS_OUT_OF_MEMORY
Definition: resource.h:63
#define GetWindowLongPtrW
Definition: winuser.h:4677
#define LVM_DELETEITEM
Definition: commctrl.h:2380
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
BOOL WINAPI IsIconic(_In_ HWND)
BOOL WINAPI DestroyWindow(_In_ HWND)
int32_t INT
Definition: typedefs.h:56
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define lstrcpynW
Definition: compat.h:397
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION Free
Definition: exfuncs.h:656
UINT_PTR WPARAM
Definition: windef.h:230
#define LVIF_TEXT
Definition: commctrl.h:2279
#define WM_NCPAINT
Definition: winuser.h:1659
CLIPBOARD_GLOBALS Globals
Definition: clipbrd.c:13
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
HWND hWnd
Definition: progman.h:86
#define FALSE
Definition: types.h:117
LPWSTR hCmdLine
Definition: progman.h:94
LONG_PTR LPARAM
Definition: windef.h:231
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
int iSubItem
Definition: commctrl.h:2332
LPARAM lParam
Definition: commctrl.h:2338
BOOL GRPFILE_WriteGroupFile(PROGGROUP *hGroup)
Definition: grpfile.c:358
#define LVM_GETITEMCOUNT
Definition: commctrl.h:2276
HDC hdc
Definition: msvc.h:53
smooth NULL
Definition: ftsmooth.c:557
INT iItem
Definition: progman.h:88
#define MAX_PATHNAME_LEN
Definition: progman.h:54
unsigned int BOOL
Definition: ntddk_ex.h:94
LPWSTR hWorkDir
Definition: progman.h:96
#define LVM_SETITEMPOSITION
Definition: commctrl.h:2450
UINT WPARAM wParam
Definition: precomp.h:53
INT nCmdShow
Definition: progman.h:98
BOOL WINAPI OpenIcon(_In_ HWND)
LPWSTR pszText
Definition: commctrl.h:2335
#define MF_ENABLED
Definition: winuser.h:128
#define LVIF_IMAGE
Definition: commctrl.h:2280
#define IDI_WINLOGO
Definition: winuser.h:704
PVOID Alloc(IN DWORD dwFlags, IN SIZE_T dwBytes)
Definition: main.c:63
VOID PROGRAM_NewProgram(PROGGROUP *hGroup)
Definition: program.c:80
TCHAR szTitle[MAX_LOADSTRING]
Definition: magnifier.c:34
UINT mask
Definition: commctrl.h:2330
INT y
Definition: progman.h:90
VOID PROGRAM_DeleteProgram(PROGRAM *hProgram, BOOL bUpdateGrpFile)
Definition: program.c:289
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
INT nHotKey
Definition: progman.h:97
VOID MAIN_ReplaceString(LPWSTR *string, LPWSTR replace)
Definition: main.c:1192
#define LVM_INSERTITEMW
Definition: commctrl.h:2374
#define SW_SHOWNORMAL
Definition: winuser.h:764
BOOL WINAPI DrawIcon(_In_ HDC, _In_ int, _In_ int, _In_ HICON)
Definition: cursoricon.c:1989
PROGRAM * hActiveProgram
Definition: progman.h:140
#define LVM_SETITEMTEXTW
Definition: commctrl.h:2657
GLuint program
Definition: glext.h:6723
HWND hListView
Definition: progman.h:118
HICON hIcon
Definition: msconfig.c:44
LPWSTR hName
Definition: progman.h:93
LPVOID NTAPI LocalLock(HLOCAL hMem)
Definition: heapmem.c:1599
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
UINT WPARAM LPARAM lParam
Definition: precomp.h:53
unsigned int UINT
Definition: ndis.h:50
#define MB_OK
Definition: winuser.h:784
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
GLboolean GLuint group
Definition: glext.h:11120
VOID PROGRAM_CopyMoveProgram(PROGRAM *hProgram, BOOL bMove)
Definition: program.c:236
#define IDS_ERROR
Definition: resource.h:18
PROGGROUP * hGroup
Definition: progman.h:83
static const WCHAR szName[]
Definition: msipriv.h:1212
#define LVIF_PARAM
Definition: commctrl.h:2281
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2230
UINT msg
Definition: msvc.h:92
HIMAGELIST hListLarge
Definition: progman.h:119
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2046
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
#define PM_COPY
Definition: resource.h:80
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
VOID PROGRAM_ModifyProgram(PROGRAM *hProgram)
Definition: program.c:116
HICON hIcon
Definition: progman.h:92
GLfloat GLfloat p
Definition: glext.h:8902
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
LONG_PTR LRESULT
Definition: windef.h:232
INT x
Definition: progman.h:89
INT nIconIndex
Definition: progman.h:91
INT INT y
Definition: msvc.h:62
PROGRAM * hPrograms
Definition: progman.h:139
WCHAR * LPWSTR
Definition: xmlstorage.h:184
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
PROGRAM * hPrior
Definition: progman.h:84
BOOL bNewVDM
Definition: progman.h:99
PROGGROUP * DIALOG_CopyMove(PROGRAM *hProgram, BOOL bMove)
Definition: dialog.c:343
#define LPARAM
Definition: msvc.h:38
#define WM_NCLBUTTONDBLCLK
Definition: winuser.h:1666
INT MAIN_MessageBoxIDS(UINT ids_text, UINT ids_title, WORD type)
Definition: main.c:1159
INT x
Definition: msvc.h:62