As this is *recovered* code from what I had in my local trunk before my HDD crash that occurred last month, this is almost pure code without most of the comments (this especially concerns the MAIN_LoadSettings function).
The 10% code that is not restored yet concerns the reader/writer code for program group files, and it will be committed separately later. This (missing) code is the core of progman; without it progrman does nothing interesting apart from displaying its main window (and its utility dialogs).
svn path=/trunk/; revision=71317
progman.h)
add_executable(progman ${SOURCE} progman.rc)
-set_module_type(progman win32gui)
-add_importlibs(progman advapi32 user32 gdi32 comdlg32 shell32 msvcrt kernel32)
+set_module_type(progman win32gui UNICODE)
+add_importlibs(progman advapi32 user32 gdi32 comctl32 comdlg32 shell32 msvcrt kernel32)
add_pch(progman progman.h SOURCE)
add_cd_file(TARGET progman DESTINATION reactos/system32 FOR all)
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+/*
+ * PROJECT: ReactOS Program Manager
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * FILE: base/shell/progman/dialog.c
+ * PURPOSE: ProgMan dialog boxes
+ * PROGRAMMERS: Ulrich Schmid
+ * Sylvain Petreolle
+ * Andriy Palamarchuk
+ * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
+ */
+
#include "progman.h"
+#include <strsafe.h>
#include <commdlg.h>
/***********************************************************************
*
- * DIALOG_Browse
+ * DIALOG_AddFilterItem and DIALOG_BrowseXXX
*/
-static BOOL DIALOG_Browse(HWND hDlg, LPCSTR lpszzFilter,
- LPSTR lpstrFile, INT nMaxFile)
-
+static
+VOID
+DIALOG_AddFilterItem(LPWSTR* p, UINT ids, LPCWSTR filter)
{
- OPENFILENAMEA openfilename;
+ LoadStringW(Globals.hInstance, ids, *p, MAX_STRING_LEN);
+ *p += wcslen(*p) + 1;
+ lstrcpyW(*p, filter);
+ *p += wcslen(*p) + 1;
+ **p = '\0';
+}
- CHAR szDir[MAX_PATH];
- CHAR szDefaultExt[] = "exe";
+static
+BOOL
+DIALOG_Browse(HWND hWnd, LPCWSTR lpszzFilter, LPWSTR lpstrFile, INT nMaxFile)
+{
+ OPENFILENAMEW openfilename;
+ WCHAR szDir[MAX_PATH];
ZeroMemory(&openfilename, sizeof(openfilename));
- GetCurrentDirectoryA(sizeof(szDir), szDir);
+ GetCurrentDirectoryW(ARRAYSIZE(szDir), szDir);
openfilename.lStructSize = sizeof(openfilename);
- openfilename.hwndOwner = Globals.hMainWnd;
+ openfilename.hwndOwner = hWnd;
openfilename.hInstance = Globals.hInstance;
openfilename.lpstrFilter = lpszzFilter;
openfilename.lpstrFile = lpstrFile;
openfilename.nMaxFile = nMaxFile;
openfilename.lpstrInitialDir = szDir;
openfilename.Flags = 0;
- openfilename.lpstrDefExt = szDefaultExt;
- openfilename.lpstrCustomFilter = 0;
+ openfilename.lpstrDefExt = L"exe";
+ openfilename.lpstrCustomFilter = NULL;
openfilename.nMaxCustFilter = 0;
openfilename.nFilterIndex = 0;
- openfilename.lpstrFileTitle = 0;
+ openfilename.lpstrFileTitle = NULL;
openfilename.nMaxFileTitle = 0;
- openfilename.lpstrInitialDir = 0;
- openfilename.lpstrTitle = 0;
+ openfilename.lpstrTitle = NULL;
openfilename.nFileOffset = 0;
openfilename.nFileExtension = 0;
openfilename.lCustData = 0;
- openfilename.lpfnHook = 0;
- openfilename.lpTemplateName = 0;
+ openfilename.lpfnHook = NULL;
+ openfilename.lpTemplateName = NULL;
- return GetOpenFileNameA(&openfilename);
+ return GetOpenFileNameW(&openfilename);
}
-/***********************************************************************
- *
- * DIALOG_AddFilterItem
- */
-
-static VOID DIALOG_AddFilterItem(LPSTR *p, UINT ids, LPCSTR filter)
+static
+BOOL
+DIALOG_BrowsePrograms(HWND hWnd, LPWSTR lpszFile, INT nMaxFile)
{
- LoadStringA(Globals.hInstance, ids, *p, MAX_STRING_LEN);
- *p += strlen(*p) + 1;
- lstrcpyA(*p, filter);
- *p += strlen(*p) + 1;
- **p = '\0';
-}
+ WCHAR szzFilter[2 * MAX_STRING_LEN + 100];
+ LPWSTR p = szzFilter;
-/***********************************************************************
- *
- * DIALOG_BrowsePrograms
- */
+ DIALOG_AddFilterItem(&p, IDS_PROGRAMS , L"*.exe;*.pif;*.com;*.bat;*.cmd");
+ DIALOG_AddFilterItem(&p, IDS_ALL_FILES, L"*.*");
-static BOOL DIALOG_BrowsePrograms(HWND hDlg, LPSTR lpszFile, INT nMaxFile)
+ return DIALOG_Browse(hWnd, szzFilter, lpszFile, nMaxFile);
+}
+
+static
+BOOL
+DIALOG_BrowseSymbols(HWND hWnd, LPWSTR lpszFile, INT nMaxFile)
{
- CHAR szzFilter[2 * MAX_STRING_LEN + 100];
- LPSTR p = szzFilter;
+ WCHAR szzFilter[5 * MAX_STRING_LEN + 100];
+ LPWSTR p = szzFilter;
- DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe;*.pif;*.com;*.bat");
- DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*");
+ DIALOG_AddFilterItem(&p, IDS_SYMBOL_FILES, L"*.ico;*.exe;*.dll");
+ DIALOG_AddFilterItem(&p, IDS_PROGRAMS, L"*.exe");
+ DIALOG_AddFilterItem(&p, IDS_LIBRARIES_DLL, L"*.dll");
+ DIALOG_AddFilterItem(&p, IDS_SYMBOLS_ICO, L"*.ico");
+ DIALOG_AddFilterItem(&p, IDS_ALL_FILES, L"*.*");
- return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile));
+ return DIALOG_Browse(hWnd, szzFilter, lpszFile, nMaxFile);
}
+
+
/***********************************************************************
*
- * DIALOG_BrowseSymbols
+ * DIALOG_New
*/
-static BOOL DIALOG_BrowseSymbols(HWND hDlg, LPSTR lpszFile, INT nMaxFile)
+LPCWSTR GroupFormatToFormatName(GROUPFORMAT Format)
{
- CHAR szzFilter[5 * MAX_STRING_LEN + 100];
- LPSTR p = szzFilter;
-
- DIALOG_AddFilterItem(&p, IDS_SYMBOL_FILES, "*.ico;*.exe;*.dll");
- DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe");
- DIALOG_AddFilterItem(&p, IDS_LIBRARIES_DLL, "*.dll");
- DIALOG_AddFilterItem(&p, IDS_SYMBOLS_ICO, "*.ico");
- DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*");
-
- return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile));
+ static const LPCWSTR FormatNames[] =
+ {
+ L"Windows 3.1",
+ L"NT Ansi",
+ L"NT Unicode"
+ };
+
+ if (Format > NT_Unicode)
+ return NULL;
+ else
+ return FormatNames[Format];
}
-static struct
+typedef struct _NEW_ITEM_CONTEXT
{
- INT nDefault;
-} New;
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * DIALOG_NEW_DlgProc
- */
-static INT_PTR CALLBACK DIALOG_NEW_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+ INT nDefault;
+ INT nResult;
+} NEW_ITEM_CONTEXT, *PNEW_ITEM_CONTEXT;
+
+static
+INT_PTR
+CALLBACK
+DIALOG_NEW_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (msg)
+ PNEW_ITEM_CONTEXT pNewItem;
+ GROUPFORMAT format;
+ INT iItem;
+
+ pNewItem = (PNEW_ITEM_CONTEXT)GetWindowLongPtrW(hDlg, 8);
+
+ switch (uMsg)
{
- case WM_INITDIALOG:
- CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, New.nDefault);
- break;
-
- case WM_COMMAND:
- switch (wParam)
- {
- case PM_NEW_GROUP:
- case PM_NEW_PROGRAM:
- CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, wParam);
- return TRUE;
-
- case IDOK:
- EndDialog(hDlg, IsDlgButtonChecked(hDlg, PM_NEW_GROUP) ?
- PM_NEW_GROUP : PM_NEW_PROGRAM);
- return TRUE;
-
- case IDCANCEL:
- EndDialog(hDlg, IDCANCEL);
- return TRUE;
- }
+ case WM_INITDIALOG:
+ {
+ pNewItem = (PNEW_ITEM_CONTEXT)lParam;
+ SetWindowLongPtrW(hDlg, 8, lParam);
+
+ for (format = Win_311; format <= NT_Unicode; ++format)
+ {
+ iItem = SendDlgItemMessageW(hDlg, PM_FORMAT, CB_INSERTSTRING, 0, (LPARAM)GroupFormatToFormatName(format));
+ if (iItem != CB_ERR && iItem != CB_ERRSPACE)
+ SendDlgItemMessageW(hDlg, PM_FORMAT, CB_SETITEMDATA, iItem, format);
+ }
+
+ SendDlgItemMessageW(hDlg, PM_FORMAT, CB_SETCURSEL, 0, 0);
+ CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, pNewItem->nDefault);
+ CheckRadioButton(hDlg, PM_PERSONAL_GROUP, PM_COMMON_GROUP, PM_PERSONAL_GROUP);
+
+ EnableDlgItem(hDlg, PM_NEW_PROGRAM, GROUP_ActiveGroup() != NULL);
+
+ SendMessageW(hDlg, WM_COMMAND, pNewItem->nDefault, 0);
+ break;
+ }
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case PM_NEW_GROUP:
+ {
+ CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, wParam);
+ EnableDlgItem(hDlg, PM_COMMON_GROUP , TRUE);
+ EnableDlgItem(hDlg, PM_PERSONAL_GROUP, TRUE);
+ EnableDlgItem(hDlg, PM_FORMAT_TXT, TRUE);
+ EnableDlgItem(hDlg, PM_FORMAT , TRUE);
+ return TRUE;
+ }
+
+ case PM_NEW_PROGRAM:
+ {
+ CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, wParam);
+ EnableDlgItem(hDlg, PM_COMMON_GROUP , FALSE);
+ EnableDlgItem(hDlg, PM_PERSONAL_GROUP, FALSE);
+ EnableDlgItem(hDlg, PM_FORMAT_TXT, FALSE);
+ EnableDlgItem(hDlg, PM_FORMAT , FALSE);
+ return TRUE;
+ }
+
+ case IDHELP:
+ MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
+ return TRUE;
+
+ case IDOK:
+ {
+ iItem = SendDlgItemMessageW(hDlg, PM_FORMAT, CB_GETCURSEL, 0, 0);
+
+ format = SendDlgItemMessageW(hDlg, PM_FORMAT, CB_GETITEMDATA, iItem, 0);
+ format = min(max(format, Win_311), NT_Unicode);
+
+ pNewItem->nResult = !!IsDlgButtonChecked(hDlg, PM_NEW_GROUP);
+ pNewItem->nResult |= (!!IsDlgButtonChecked(hDlg, PM_COMMON_GROUP) << 1);
+ pNewItem->nResult |= (format << 2);
+
+ EndDialog(hDlg, IDOK);
+ return TRUE;
+ }
+
+ case IDCANCEL:
+ EndDialog(hDlg, IDCANCEL);
+ return TRUE;
+ }
+ return FALSE;
}
- return FALSE;
+
+ return FALSE;
}
-/***********************************************************************
- *
- * DIALOG_New
- */
-INT DIALOG_New(INT nDefault)
+BOOL DIALOG_New(INT nDefault, PINT pnResult)
{
- New.nDefault = nDefault;
- return DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_NEW), Globals.hMainWnd, DIALOG_NEW_DlgProc);
-}
+ INT_PTR ret;
+ NEW_ITEM_CONTEXT NewItem;
+ *pnResult = 0;
-static struct
-{
- LPCSTR lpszProgramName, lpszFromGroupName;
- HLOCAL hToGroup;
-} CopyMove;
+ NewItem.nDefault = nDefault;
+ NewItem.nResult = 0;
+ ret = DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_NEW), Globals.hMainWnd, DIALOG_NEW_DlgProc, (LPARAM)&NewItem);
+ if (ret == IDOK)
+ *pnResult = NewItem.nResult;
+
+ return (ret == IDOK);
+}
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+/***********************************************************************
*
- * DIALOG_COPY_MOVE_DlgProc
+ * DIALOG_CopyMove
*/
-static INT_PTR CALLBACK DIALOG_COPY_MOVE_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+
+typedef struct _COPY_MOVE_CONTEXT
{
- HLOCAL hGroup;
+ PROGRAM* Program;
+ PROGGROUP* hToGroup;
+ BOOL bMove;
+} COPY_MOVE_CONTEXT, *PCOPY_MOVE_CONTEXT;
+
+static
+INT_PTR
+CALLBACK
+DIALOG_COPY_MOVE_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ PROGGROUP* hGrpItem;
+ PROGGROUP* hGroup;
+
+ PCOPY_MOVE_CONTEXT pCopyMove;
+ INT iItem;
- switch (msg)
+ WCHAR text[MAX_STRING_LEN];
+
+ pCopyMove = (PCOPY_MOVE_CONTEXT)GetWindowLongPtrW(hDlg, 8);
+
+ switch (uMsg)
{
- case WM_INITDIALOG:
- /* List all group names */
- for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup))
- SendDlgItemMessageA(hDlg, PM_TO_GROUP, CB_ADDSTRING, 0, (LPARAM)GROUP_GroupName(hGroup));
-
- SetDlgItemTextA(hDlg, PM_PROGRAM, CopyMove.lpszProgramName);
- SetDlgItemTextA(hDlg, PM_FROM_GROUP, CopyMove.lpszFromGroupName);
- break;
-
- case WM_COMMAND:
- switch (wParam)
- {
- case IDOK:
- {
- /* Get selected group */
- INT nCurSel = SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_GETCURSEL, 0, 0);
- INT nLen = SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_GETLBTEXTLEN, nCurSel, 0);
- HLOCAL hBuffer = LocalAlloc(LMEM_FIXED, nLen + 1);
- LPSTR buffer = LocalLock(hBuffer);
-
- SendDlgItemMessageA(hDlg, PM_TO_GROUP, CB_GETLBTEXT, nCurSel, (LPARAM)buffer);
- for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup))
- if (!lstrcmpA(buffer, GROUP_GroupName(hGroup))) break;
- LocalFree(hBuffer);
-
- CopyMove.hToGroup = hGroup;
- EndDialog(hDlg, IDOK);
- return TRUE;
- }
-
- case IDCANCEL:
- EndDialog(hDlg, IDCANCEL);
- return TRUE;
- }
+ case WM_INITDIALOG:
+ {
+ pCopyMove = (PCOPY_MOVE_CONTEXT)lParam;
+ SetWindowLongPtrW(hDlg, 8, lParam);
+
+ if (pCopyMove->bMove)
+ {
+ LoadStringW(Globals.hInstance, IDS_MOVE_PROGRAM_1, text, ARRAYSIZE(text));
+ SetWindowTextW(hDlg, text);
+ LoadStringW(Globals.hInstance, IDS_MOVE_PROGRAM_2, text, ARRAYSIZE(text));
+ SetDlgItemTextW(hDlg, PM_COPY_MOVE_TXT, text);
+ }
+
+ /* List all the group names but the source group, in case we are doing a move */
+ for (hGroup = Globals.hGroups; hGroup; hGroup = hGroup->hNext)
+ {
+ if (!pCopyMove->bMove || hGroup != pCopyMove->Program->hGroup)
+ {
+ iItem = SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_ADDSTRING, 0, (LPARAM)hGroup->hName);
+ if (iItem != CB_ERR && iItem != CB_ERRSPACE)
+ SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_SETITEMDATA, iItem, (LPARAM)hGroup);
+ }
+ }
+ SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_SETCURSEL, 0, 0);
+ SetDlgItemTextW(hDlg, PM_PROGRAM , pCopyMove->Program->hName);
+ SetDlgItemTextW(hDlg, PM_FROM_GROUP, pCopyMove->Program->hGroup->hName);
+ break;
+ }
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDHELP:
+ MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
+ return TRUE;
+
+ case IDOK:
+ {
+ /* Get the selected group */
+ iItem = SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_GETCURSEL, 0, 0);
+ hGrpItem = (PROGGROUP *)SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_GETITEMDATA, iItem, 0);
+ /* Check that it is indeed in the group list */
+ for (hGroup = Globals.hGroups; hGroup && hGroup != hGrpItem; hGroup = hGroup->hNext)
+ ;
+ if (pCopyMove->bMove)
+ {
+ if (hGrpItem == pCopyMove->Program->hGroup)
+ hGrpItem = NULL;
+ }
+ pCopyMove->hToGroup = hGrpItem;
+ EndDialog(hDlg, IDOK);
+ return TRUE;
+ }
+
+ case IDCANCEL:
+ EndDialog(hDlg, IDCANCEL);
+ return TRUE;
+ }
+ return FALSE;
}
- return FALSE;
+
+ return FALSE;
}
-/***********************************************************************
- *
- * DIALOG_CopyMove
- */
-HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszFromGroupName,
- BOOL bMove)
+PROGGROUP* DIALOG_CopyMove(PROGRAM* hProgram, BOOL bMove)
{
- INT ret;
+ COPY_MOVE_CONTEXT CopyMove;
+ INT_PTR ret;
- CopyMove.lpszProgramName = lpszProgramName;
- CopyMove.lpszFromGroupName = lpszFromGroupName;
- CopyMove.hToGroup = 0;
+ CopyMove.bMove = bMove;
+ CopyMove.Program = hProgram;
+ CopyMove.hToGroup = NULL;
+ ret = DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_COPY_MOVE), Globals.hMainWnd, DIALOG_COPY_MOVE_DlgProc, (LPARAM)&CopyMove);
- ret = DialogBoxW(Globals.hInstance,
- bMove ? MAKEINTRESOURCEW(IDD_MOVE) : MAKEINTRESOURCEW(IDD_COPY),
- Globals.hMainWnd, DIALOG_COPY_MOVE_DlgProc);
- return((ret == IDOK) ? CopyMove.hToGroup : 0);
+ return (ret == IDOK ? CopyMove.hToGroup : NULL);
}
/***********************************************************************
* DIALOG_Delete
*/
-BOOL DIALOG_Delete(UINT ids_text_s, LPCSTR lpszName)
+BOOL DIALOG_Delete(UINT ids_text_s, LPCWSTR lpszName)
{
- return (IDYES == MAIN_MessageBoxIDS_s(ids_text_s, lpszName, IDS_DELETE,
- MB_YESNO | MB_DEFBUTTON2));
+ return (MAIN_MessageBoxIDS_s(ids_text_s, lpszName, IDS_DELETE, MB_YESNO | MB_DEFBUTTON2) == IDYES);
}
-static struct
+/* Adapted from dll/win32/shell32/dialogs/dialogs.cpp!EnableOkButtonFromEditContents */
+BOOL ValidateEditContents(HWND hDlg, INT nIDEditItem)
{
- LPSTR lpszTitle, lpszGrpFile;
- INT nSize;
-} GroupAttributes;
+ BOOL Enable = FALSE;
+ LPWSTR psz;
+ INT Length, n;
+ HWND Edit;
+
+ Edit = GetDlgItem(hDlg, nIDEditItem);
+ Length = GetWindowTextLengthW(Edit);
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ if (Length <= 0)
+ return FALSE;
+
+ psz = Alloc(0, (Length + 1) * sizeof(WCHAR));
+ if (psz)
+ {
+ GetWindowTextW(Edit, psz, Length + 1);
+ for (n = 0; n < Length && !Enable; ++n)
+ Enable = (psz[n] != ' ');
+ Free(psz);
+ }
+ else
+ {
+ Enable = TRUE;
+ }
+
+ return Enable;
+}
+
+
+/***********************************************************************
*
- * DIALOG_GROUP_DlgProc
+ * DIALOG_GroupAttributes
*/
-static INT_PTR CALLBACK DIALOG_GROUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+
+typedef struct _GROUP_ATTRIBUTES_CONTEXT
+{
+ GROUPFORMAT format;
+ LPWSTR lpszTitle;
+ LPWSTR lpszGrpFile;
+ INT nSize;
+} GROUP_ATTRIBUTES_CONTEXT, *PGROUP_ATTRIBUTES_CONTEXT;
+
+static
+INT_PTR
+CALLBACK
+DIALOG_GROUP_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (msg)
+ PGROUP_ATTRIBUTES_CONTEXT pGroupAttributes;
+
+ pGroupAttributes = (PGROUP_ATTRIBUTES_CONTEXT)GetWindowLongPtrW(hDlg, 8);
+
+ switch (uMsg)
{
- case WM_INITDIALOG:
- SetDlgItemTextA(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle);
- SetDlgItemTextA(hDlg, PM_FILE, GroupAttributes.lpszGrpFile);
- break;
-
- case WM_COMMAND:
- switch (wParam)
- {
- case IDOK:
- GetDlgItemTextA(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle, GroupAttributes.nSize);
- GetDlgItemTextA(hDlg, PM_FILE, GroupAttributes.lpszGrpFile, GroupAttributes.nSize);
- EndDialog(hDlg, IDOK);
- return TRUE;
-
- case IDCANCEL:
- EndDialog(hDlg, IDCANCEL);
- return TRUE;
- }
+ case WM_INITDIALOG:
+ {
+ DWORD evMask;
+
+ pGroupAttributes = (PGROUP_ATTRIBUTES_CONTEXT)lParam;
+ SetWindowLongPtrW(hDlg, 8, lParam);
+
+ /* Configure Richedit control for sending notification changes */
+ evMask = SendDlgItemMessageW(hDlg, PM_DESCRIPTION, EM_GETEVENTMASK, 0, 0) | ENM_CHANGE;
+ SendDlgItemMessageW(hDlg, PM_DESCRIPTION, EM_SETEVENTMASK, 0, (LPARAM)evMask);
+
+ SetDlgItemTextW(hDlg, PM_DESCRIPTION, pGroupAttributes->lpszTitle);
+
+ if (pGroupAttributes->format != Win_311)
+ {
+ EnableDlgItem(hDlg, PM_FILE, FALSE);
+ }
+ else
+ {
+ EnableDlgItem(hDlg, PM_FILE, TRUE);
+ SetDlgItemTextW(hDlg, PM_FILE, pGroupAttributes->lpszGrpFile);
+ }
+
+ EnableDlgItem(hDlg, IDOK, ValidateEditContents(hDlg, PM_DESCRIPTION));
+ break;
+ }
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDHELP:
+ MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
+ return TRUE;
+
+ case PM_DESCRIPTION:
+ {
+ if (HIWORD(wParam) == EN_CHANGE)
+ EnableDlgItem(hDlg, IDOK, ValidateEditContents(hDlg, PM_DESCRIPTION));
+ return FALSE;
+ }
+
+ case IDOK:
+ {
+ GetDlgItemTextW(hDlg, PM_DESCRIPTION, pGroupAttributes->lpszTitle, pGroupAttributes->nSize);
+ if (pGroupAttributes->format)
+ *pGroupAttributes->lpszGrpFile = '\0';
+ else
+ GetDlgItemTextW(hDlg, PM_FILE, pGroupAttributes->lpszGrpFile, pGroupAttributes->nSize);
+ EndDialog(hDlg, IDOK);
+ return TRUE;
+ }
+
+ case IDCANCEL:
+ EndDialog(hDlg, IDCANCEL);
+ return TRUE;
+ }
+ return FALSE;
}
- return FALSE;
+
+ return FALSE;
}
+BOOL DIALOG_GroupAttributes(GROUPFORMAT format, LPWSTR lpszTitle, LPWSTR lpszGrpFile, INT nSize)
+{
+ INT_PTR ret;
+ GROUP_ATTRIBUTES_CONTEXT GroupAttributes;
+
+ GroupAttributes.format = format;
+ GroupAttributes.nSize = nSize;
+ GroupAttributes.lpszTitle = lpszTitle;
+ GroupAttributes.lpszGrpFile = lpszGrpFile;
+
+ ret = DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_GROUP), Globals.hMainWnd, DIALOG_GROUP_DlgProc, (LPARAM)&GroupAttributes);
+
+ return (ret == IDOK);
+}
+
+
/***********************************************************************
*
- * DIALOG_GroupAttributes
+ * DIALOG_Symbol
*/
-BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszGrpFile, INT nSize)
+
+/* Adapted from dll/win32/shell32/dialogs/dialogs.cpp!EnumPickIconResourceProc */
+static
+BOOL
+CALLBACK
+EnumPickIconResourceProc(HMODULE hModule, LPCWSTR lpszType, LPWSTR lpszName, LONG_PTR lParam)
{
- INT ret;
+ HICON hIcon;
+ HWND hDlgCtrl = (HWND)lParam;
+ WCHAR szName[100];
- GroupAttributes.nSize = nSize;
- GroupAttributes.lpszTitle = lpszTitle;
- GroupAttributes.lpszGrpFile = lpszGrpFile;
+ if (IS_INTRESOURCE(lpszName))
+ wcscpy(szName, lpszName);
+ else
+ swprintf(szName, L"%u", lpszName);
- ret = DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_GROUP), Globals.hMainWnd, DIALOG_GROUP_DlgProc);
- return(ret == IDOK);
+ hIcon = (HICON)LoadImageW(hModule, lpszName, IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
+ if (hIcon == NULL)
+ return TRUE;
+
+ SendMessageW(hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)hIcon);
+ return TRUE;
}
+static
+VOID
+DestroyIconList(HWND hDlgCtrl)
+{
+ HICON hIcon;
+ INT index;
+ INT count;
+
+ count = SendMessageA(hDlgCtrl, LB_GETCOUNT, 0, 0);
+ if (count == LB_ERR)
+ return;
+
+ for (index = 0; index < count; ++index)
+ {
+ hIcon = (HICON)SendMessageA(hDlgCtrl, LB_GETITEMDATA, index, 0);
+ DestroyIcon(hIcon);
+ }
+}
+
+typedef struct _PICK_ICON_CONTEXT
+{
+ HMODULE hLibrary;
+ HWND hDlgCtrl;
+ WCHAR szName[MAX_PATH]; // LPWSTR lpszIconFile; // INT nSize;
+ INT Index;
+ HICON hIcon;
+} PICK_ICON_CONTEXT, *PPICK_ICON_CONTEXT;
+
+#if 0
static struct
{
INT *lpnIconIndex;
} Symbol;
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * DIALOG_SYMBOL_DlgProc
- */
-static INT_PTR CALLBACK DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- switch (msg)
- {
- case WM_INITDIALOG:
- SetDlgItemTextA(hDlg, PM_ICON_FILE, Symbol.lpszIconFile);
- SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_SETITEMHEIGHT, 0, (LPARAM) 32);
- SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)*Symbol.lphIcon);
- SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)Globals.hDefaultIcon);
- SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_SETCURSEL, 0, 0);
- return TRUE;
-
- case WM_MEASUREITEM:
- {
- PMEASUREITEMSTRUCT measure = (PMEASUREITEMSTRUCT) lParam;
- measure->itemWidth = 32;
- measure->itemHeight = 32;
- return TRUE;
- }
-
- case WM_DRAWITEM:
- {
- PDRAWITEMSTRUCT dis = (PDRAWITEMSTRUCT) lParam;
- DrawIcon(dis->hDC, dis->rcItem.left, dis->rcItem.top, (HICON)dis->itemData);
- return TRUE;
- }
-
- case WM_COMMAND:
- switch (wParam)
- {
- case PM_BROWSE:
- {
- CHAR filename[MAX_PATHNAME_LEN];
- filename[0] = 0;
- if (DIALOG_BrowseSymbols(hDlg, filename, sizeof(filename)))
- SetDlgItemTextA(hDlg, PM_ICON_FILE, filename);
- return TRUE;
- }
-
- case PM_HELP:
- MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
- return TRUE;
-
- case IDOK:
- {
- INT nCurSel = SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_GETCURSEL, 0, 0);
-
- GetDlgItemTextA(hDlg, PM_ICON_FILE, Symbol.lpszIconFile, Symbol.nSize);
-
- *Symbol.lphIcon = (HICON)SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST,
- CB_GETITEMDATA,
- (WPARAM) nCurSel, 0);
-#if 0
- *Symbol.lphIcon = CopyIcon(*Symbol.lphIcon);
#endif
- EndDialog(hDlg, IDOK);
- return TRUE;
- }
+static
+INT_PTR
+CALLBACK
+DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ WCHAR filename[MAX_PATHNAME_LEN];
+ PPICK_ICON_CONTEXT pIconContext;
+
+ pIconContext = (PPICK_ICON_CONTEXT)GetWindowLongPtrW(hDlg, 8);
- case IDCANCEL:
- EndDialog(hDlg, IDCANCEL);
- return TRUE;
- }
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ pIconContext = (PPICK_ICON_CONTEXT)lParam;
+ SetWindowLongPtrW(hDlg, 8, lParam);
+
+ pIconContext->hDlgCtrl = GetDlgItem(hDlg, PM_SYMBOL_LIST);
+ SetDlgItemTextW(hDlg, PM_ICON_FILE, pIconContext->szName);
+ SendMessageA(pIconContext->hDlgCtrl, LB_SETITEMHEIGHT, 0, 32);
+
+ pIconContext->hLibrary = LoadLibraryExW(pIconContext->szName, NULL, LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE);
+ if (pIconContext->hLibrary)
+ {
+ EnumResourceNamesW(pIconContext->hLibrary,
+ (LPCWSTR)RT_ICON, // RT_GROUP_ICON
+ EnumPickIconResourceProc,
+ (LONG_PTR)pIconContext->hDlgCtrl);
+ FreeLibrary(pIconContext->hLibrary);
+ pIconContext->hLibrary = NULL;
+ }
+ SendMessageA(pIconContext->hDlgCtrl, LB_SETCURSEL, pIconContext->Index, 0);
+ return TRUE;
+ }
+
+ case WM_MEASUREITEM:
+ {
+ PMEASUREITEMSTRUCT measure = (PMEASUREITEMSTRUCT)lParam;
+ measure->itemWidth = 32;
+ measure->itemHeight = 32;
+ return TRUE;
+ }
+
+ case WM_DRAWITEM:
+ {
+ PDRAWITEMSTRUCT dis = (PDRAWITEMSTRUCT)lParam;
+
+ if (dis->itemState & ODS_SELECTED)
+ FillRect(dis->hDC, &dis->rcItem, (HBRUSH)(COLOR_HIGHLIGHT + 1));
+ else
+ FillRect(dis->hDC, &dis->rcItem, (HBRUSH)(COLOR_WINDOW + 1));
+
+ DrawIcon(dis->hDC, dis->rcItem.left, dis->rcItem.top, (HICON)dis->itemData);
+ return TRUE;
+ }
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case PM_BROWSE:
+ {
+ filename[0] = '\0';
+ if (!DIALOG_BrowseSymbols(hDlg, filename, ARRAYSIZE(filename)))
+ return TRUE;
+
+ if (_wcsnicmp(pIconContext->szName, filename, ARRAYSIZE(pIconContext->szName)) == 0)
+ return TRUE;
+
+ SetDlgItemTextW(hDlg, PM_ICON_FILE, filename);
+ DestroyIconList(pIconContext->hDlgCtrl);
+ pIconContext->hLibrary = LoadLibraryExW(filename, NULL, LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE);
+ if (pIconContext->hLibrary)
+ {
+ EnumResourceNamesW(pIconContext->hLibrary,
+ (LPCWSTR)RT_ICON, // RT_GROUP_ICON
+ EnumPickIconResourceProc,
+ (LONG_PTR)pIconContext->hDlgCtrl);
+ FreeLibrary(pIconContext->hLibrary);
+ pIconContext->hLibrary = NULL;
+ }
+ SendMessageA(pIconContext->hDlgCtrl, LB_SETCURSEL, 0, 0);
+ return TRUE;
+ }
+
+ case IDHELP:
+ MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
+ return TRUE;
+
+ case IDOK:
+ {
+ INT nCurSel = SendMessageW(pIconContext->hDlgCtrl, LB_GETCURSEL, 0, 0);
+ GetDlgItemTextW(hDlg, PM_ICON_FILE, pIconContext->szName, ARRAYSIZE(pIconContext->szName));
+ pIconContext->hIcon = (HICON)SendMessageA(pIconContext->hDlgCtrl, LB_GETITEMDATA, nCurSel, 0);
+ pIconContext->hIcon = CopyIcon(pIconContext->hIcon);
+ DestroyIconList(pIconContext->hDlgCtrl);
+ EndDialog(hDlg, IDOK);
+ return TRUE;
+ }
+
+ case IDCANCEL:
+ DestroyIconList(pIconContext->hDlgCtrl);
+ EndDialog(hDlg, IDCANCEL);
+ return TRUE;
+ }
+ return FALSE;
}
- return FALSE;
+
+ return FALSE;
}
-/***********************************************************************
- *
- * DIALOG_Symbol
- */
-static VOID DIALOG_Symbol(HICON *lphIcon, LPSTR lpszIconFile,
- INT *lpnIconIndex, INT nSize)
+static
+VOID
+DIALOG_Symbol(HWND hWnd, HICON *lphIcon, LPWSTR lpszIconFile, INT *lpnIconIndex, INT nSize)
{
- Symbol.nSize = nSize;
- Symbol.lpszIconFile = lpszIconFile;
- Symbol.lphIcon = lphIcon;
- Symbol.lpnIconIndex = lpnIconIndex;
+ PICK_ICON_CONTEXT IconContext;
+
+ IconContext.Index = *lpnIconIndex;
+ StringCchCopyNW(IconContext.szName, ARRAYSIZE(IconContext.szName), lpszIconFile, nSize);
+
+ if (DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_SYMBOL), hWnd, DIALOG_SYMBOL_DlgProc, (LPARAM)&IconContext) != IDOK)
+ return;
- DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_SYMBOL), Globals.hMainWnd, DIALOG_SYMBOL_DlgProc);
+ StringCchCopyNW(lpszIconFile, nSize, IconContext.szName, ARRAYSIZE(IconContext.szName));
+ *lpnIconIndex = IconContext.Index;
+ *lphIcon = IconContext.hIcon;
}
-static struct
-{
- LPSTR lpszTitle, lpszCmdLine, lpszWorkDir, lpszIconFile, lpszTmpIconFile;
- INT nSize;
- INT *lpnCmdShow;
- INT *lpnHotKey;
- HWND hSelGroupWnd;
- HICON *lphIcon, hTmpIcon;
- INT *lpnIconIndex, nTmpIconIndex;
-} ProgramAttributes;
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+/***********************************************************************
*
- * DIALOG_PROGRAM_DlgProc
+ * DIALOG_ProgramAttributes
*/
-static INT_PTR CALLBACK DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+
+typedef struct _PROGRAM_ATTRIBUTES_CONTEXT
{
- CHAR buffer[MAX_STRING_LEN];
- switch (msg)
+ LPWSTR lpszTitle;
+ LPWSTR lpszCmdLine;
+ LPWSTR lpszWorkDir;
+ LPWSTR lpszIconFile;
+ LPWSTR lpszTmpIconFile;
+ INT nSize;
+ INT* lpnCmdShow;
+ INT* lpnHotKey;
+ // HWND hSelGroupWnd;
+ BOOL* lpbNewVDM; // unused!
+ HICON* lphIcon;
+ HICON hTmpIcon;
+ INT* lpnIconIndex;
+ INT nTmpIconIndex;
+ BOOL bCheckBinaryType;
+} PROGRAM_ATTRIBUTES_CONTEXT, *PPROGRAM_ATTRIBUTES_CONTEXT;
+
+static
+INT_PTR
+CALLBACK
+DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ BOOL bEnable;
+ WCHAR filename[MAX_PATHNAME_LEN];
+ DWORD evMask;
+ DWORD dwBinaryType;
+ PPROGRAM_ATTRIBUTES_CONTEXT pProgramAttributes;
+
+ pProgramAttributes = (PPROGRAM_ATTRIBUTES_CONTEXT)GetWindowLongPtrW(hDlg, 8);
+
+ switch (uMsg)
{
- case WM_INITDIALOG:
- SetDlgItemTextA(hDlg, PM_DESCRIPTION, ProgramAttributes.lpszTitle);
- SetDlgItemTextA(hDlg, PM_COMMAND_LINE, ProgramAttributes.lpszCmdLine);
- SetDlgItemTextA(hDlg, PM_DIRECTORY, ProgramAttributes.lpszWorkDir);
- if (!*ProgramAttributes.lpnHotKey)
- {
- LoadStringA(Globals.hInstance, IDS_NO_HOT_KEY, buffer, sizeof(buffer));
- SetDlgItemTextA(hDlg, PM_HOT_KEY, buffer);
- }
-
- CheckDlgButton(hDlg, PM_SYMBOL,
- (*ProgramAttributes.lpnCmdShow == SW_SHOWMINIMIZED));
- SendDlgItemMessageA(hDlg, PM_ICON, STM_SETICON, (WPARAM)ProgramAttributes.hTmpIcon, 0);
- break;
-
- case WM_COMMAND:
- switch (wParam)
- {
- case PM_SYMBOL:
- CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
- return TRUE;
-
- case PM_BROWSE:
- {
- CHAR filename[MAX_PATHNAME_LEN];
- filename[0] = 0;
- if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename)))
- SetDlgItemTextA(hDlg, PM_COMMAND_LINE, filename);
- return TRUE;
- }
-
- case PM_OTHER_SYMBOL:
- {
- DIALOG_Symbol(&ProgramAttributes.hTmpIcon,
- ProgramAttributes.lpszTmpIconFile,
- &ProgramAttributes.nTmpIconIndex,
- MAX_PATHNAME_LEN);
-
- SendDlgItemMessageA(hDlg, PM_ICON, STM_SETICON, (WPARAM)ProgramAttributes.hTmpIcon, 0);
- return TRUE;
- }
-
- case IDOK:
- GetDlgItemTextA(hDlg, PM_DESCRIPTION,
- ProgramAttributes.lpszTitle,
- ProgramAttributes.nSize);
- GetDlgItemTextA(hDlg, PM_COMMAND_LINE,
- ProgramAttributes.lpszCmdLine,
- ProgramAttributes.nSize);
- GetDlgItemTextA(hDlg, PM_DIRECTORY,
- ProgramAttributes.lpszWorkDir,
- ProgramAttributes.nSize);
-
- if (ProgramAttributes.hTmpIcon)
- {
+ case WM_INITDIALOG:
+ {
+ pProgramAttributes = (PPROGRAM_ATTRIBUTES_CONTEXT)lParam;
+ SetWindowLongPtrW(hDlg, 8, lParam);
+
+ evMask = SendDlgItemMessageW(hDlg, PM_COMMAND_LINE, EM_GETEVENTMASK, 0, 0) | ENM_CHANGE;
+ SendDlgItemMessageW(hDlg, PM_COMMAND_LINE, EM_SETEVENTMASK, 0, evMask);
+
+ SetDlgItemTextW(hDlg, PM_DESCRIPTION , pProgramAttributes->lpszTitle);
+ SetDlgItemTextW(hDlg, PM_COMMAND_LINE, pProgramAttributes->lpszCmdLine);
+ SetDlgItemTextW(hDlg, PM_DIRECTORY , pProgramAttributes->lpszWorkDir);
+
+ /* 0x0F 0x06 */
+ SendDlgItemMessageW(hDlg, PM_HOT_KEY, HKM_SETRULES, HKCOMB_C | HKCOMB_A | HKCOMB_S | HKCOMB_NONE, HOTKEYF_CONTROL | HOTKEYF_ALT);
+ SendDlgItemMessageW(hDlg, PM_HOT_KEY, HKM_SETHOTKEY, *pProgramAttributes->lpnHotKey, 0);
+
+ bEnable = ValidateEditContents(hDlg, PM_COMMAND_LINE);
+ EnableWindow(GetDlgItem(hDlg, IDOK), bEnable);
+ EnableWindow(GetDlgItem(hDlg, PM_OTHER_SYMBOL), bEnable);
+
+ CheckDlgButton(hDlg, PM_SYMBOL, *pProgramAttributes->lpnCmdShow == SW_SHOWMINNOACTIVE);
+
+ if (pProgramAttributes->bCheckBinaryType &&
+ (!GetBinaryTypeW(pProgramAttributes->lpszCmdLine, &dwBinaryType) || dwBinaryType != SCS_WOW_BINARY) )
+ {
+ EnableWindow(GetDlgItem(hDlg, PM_NEW_VDM), FALSE);
+ CheckDlgButton(hDlg, PM_NEW_VDM, BST_CHECKED);
+ }
+ else
+ {
+ EnableWindow(GetDlgItem(hDlg, PM_NEW_VDM), TRUE);
+ CheckDlgButton(hDlg, PM_NEW_VDM, *pProgramAttributes->lpbNewVDM);
+ }
+ SendDlgItemMessageW(hDlg, PM_ICON, STM_SETICON, (WPARAM)pProgramAttributes->hTmpIcon, 0);
+ break;
+ }
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case PM_NEW_VDM:
+ CheckDlgButton(hDlg, PM_NEW_VDM, !IsDlgButtonChecked(hDlg, PM_NEW_VDM));
+ return TRUE;
+
+ case PM_BROWSE:
+ {
+ filename[0] = '\0';
+ if (DIALOG_BrowsePrograms(hDlg, filename, ARRAYSIZE(filename)))
+ {
+ SetDlgItemTextW(hDlg, PM_COMMAND_LINE, filename);
+ if (pProgramAttributes->bCheckBinaryType &&
+ (!GetBinaryTypeW(filename, &dwBinaryType) || dwBinaryType != SCS_WOW_BINARY))
+ {
+ EnableWindow(GetDlgItem(hDlg, PM_NEW_VDM), FALSE);
+ CheckDlgButton(hDlg, PM_NEW_VDM, BST_CHECKED);
+ }
+ else
+ {
+ EnableWindow(GetDlgItem(hDlg, PM_NEW_VDM), TRUE);
+ CheckDlgButton(hDlg, PM_NEW_VDM, BST_UNCHECKED);
+ }
+ }
+ return TRUE;
+ }
+
+ case IDHELP:
+ MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
+ return TRUE;
+
+ case PM_SYMBOL:
+ CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
+ return TRUE;
+
+ case PM_OTHER_SYMBOL:
+ {
+ DIALOG_Symbol(hDlg,
+ &pProgramAttributes->hTmpIcon,
+ pProgramAttributes->lpszTmpIconFile,
+ &pProgramAttributes->nTmpIconIndex,
+ MAX_PATHNAME_LEN);
+
+ SendDlgItemMessageW(hDlg, PM_ICON, STM_SETICON, (WPARAM)pProgramAttributes->hTmpIcon, 0);
+ return TRUE;
+ }
+
+ case PM_COMMAND_LINE:
+ {
+ if (HIWORD(wParam) == EN_CHANGE)
+ {
+ bEnable = ValidateEditContents(hDlg, PM_COMMAND_LINE);
+ EnableWindow(GetDlgItem(hDlg, IDOK), bEnable);
+ EnableWindow(GetDlgItem(hDlg, PM_OTHER_SYMBOL), bEnable);
+ }
+ return FALSE;
+ }
+
+ case IDOK:
+ {
+ GetDlgItemTextW(hDlg, PM_DESCRIPTION , pProgramAttributes->lpszTitle , pProgramAttributes->nSize);
+ GetDlgItemTextW(hDlg, PM_COMMAND_LINE, pProgramAttributes->lpszCmdLine, pProgramAttributes->nSize);
+ GetDlgItemTextW(hDlg, PM_DIRECTORY , pProgramAttributes->lpszWorkDir, pProgramAttributes->nSize);
+ if (pProgramAttributes->hTmpIcon)
+ {
#if 0
- if (*ProgramAttributes.lphIcon)
- DestroyIcon(*ProgramAttributes.lphIcon);
+ if (*pProgramAttributes->lphIcon)
+ DestroyIcon(*pProgramAttributes->lphIcon);
#endif
- *ProgramAttributes.lphIcon = ProgramAttributes.hTmpIcon;
- *ProgramAttributes.lpnIconIndex = ProgramAttributes.nTmpIconIndex;
- lstrcpynA(ProgramAttributes.lpszIconFile,
- ProgramAttributes.lpszTmpIconFile,
- ProgramAttributes.nSize);
- }
-
- *ProgramAttributes.lpnCmdShow =
- IsDlgButtonChecked(hDlg, PM_SYMBOL) ?
- SW_SHOWMINIMIZED : SW_SHOWNORMAL;
- EndDialog(hDlg, IDOK);
- return TRUE;
-
- case IDCANCEL:
- EndDialog(hDlg, IDCANCEL);
- return TRUE;
- }
- return FALSE;
+ *pProgramAttributes->lphIcon = pProgramAttributes->hTmpIcon;
+ *pProgramAttributes->lpnIconIndex = pProgramAttributes->nTmpIconIndex;
+ lstrcpynW(pProgramAttributes->lpszIconFile, pProgramAttributes->lpszTmpIconFile, pProgramAttributes->nSize);
+ }
+ *pProgramAttributes->lpnHotKey = SendDlgItemMessageW(hDlg, PM_HOT_KEY, HKM_GETHOTKEY, 0, 0);
+ *pProgramAttributes->lpnCmdShow = IsDlgButtonChecked(hDlg, PM_SYMBOL) ? SW_SHOWMINNOACTIVE : SW_SHOWNORMAL;
+ *pProgramAttributes->lpbNewVDM = IsDlgButtonChecked(hDlg, PM_NEW_VDM);
+ EndDialog(hDlg, IDOK);
+ return TRUE;
+ }
+
+ case IDCANCEL:
+ EndDialog(hDlg, IDCANCEL);
+ return TRUE;
+ }
+ return FALSE;
}
- return FALSE;
+
+ return FALSE;
}
-/***********************************************************************
- *
- * DIALOG_ProgramAttributes
- */
-BOOL DIALOG_ProgramAttributes(LPSTR lpszTitle, LPSTR lpszCmdLine,
- LPSTR lpszWorkDir, LPSTR lpszIconFile,
- HICON *lphIcon, INT *lpnIconIndex,
- INT *lpnHotKey, INT *lpnCmdShow, INT nSize)
+BOOL
+DIALOG_ProgramAttributes(LPWSTR lpszTitle, LPWSTR lpszCmdLine, LPWSTR lpszWorkDir, LPWSTR lpszIconFile,
+ HICON* lphIcon, INT* lpnIconIndex, INT* lpnHotKey, INT* lpnCmdShow, BOOL* lpbNewVDM, INT nSize)
{
- CHAR szTmpIconFile[MAX_PATHNAME_LEN];
- INT ret;
-
- ProgramAttributes.nSize = nSize;
- ProgramAttributes.lpszTitle = lpszTitle;
- ProgramAttributes.lpszCmdLine = lpszCmdLine;
- ProgramAttributes.lpszWorkDir = lpszWorkDir;
- ProgramAttributes.lpszIconFile = lpszIconFile;
- ProgramAttributes.lpnCmdShow = lpnCmdShow;
- ProgramAttributes.lpnHotKey = lpnHotKey;
- ProgramAttributes.lphIcon = lphIcon;
- ProgramAttributes.lpnIconIndex = lpnIconIndex;
+ INT_PTR ret;
+ WCHAR szTmpIconFile[MAX_PATHNAME_LEN];
+ PROGRAM_ATTRIBUTES_CONTEXT ProgramAttributes;
+ DWORD dwSize;
+ DWORD dwType;
+
+ ProgramAttributes.nSize = nSize;
+ ProgramAttributes.lpszTitle = lpszTitle;
+ ProgramAttributes.lpszCmdLine = lpszCmdLine;
+ ProgramAttributes.lpszWorkDir = lpszWorkDir;
+ ProgramAttributes.lpszIconFile = lpszIconFile;
+ ProgramAttributes.lpnCmdShow = lpnCmdShow;
+ ProgramAttributes.lpnHotKey = lpnHotKey;
+ ProgramAttributes.lpbNewVDM = lpbNewVDM;
+ ProgramAttributes.lphIcon = lphIcon;
+ ProgramAttributes.lpnIconIndex = lpnIconIndex;
+
+ dwSize = sizeof(ProgramAttributes.bCheckBinaryType);
+ if (RegQueryValueExW(Globals.hKeyPMSettings,
+ L"CheckBinaryType",
+ 0,
+ &dwType,
+ (LPBYTE)&ProgramAttributes.bCheckBinaryType,
+ &dwSize) != ERROR_SUCCESS
+ || dwType != REG_DWORD)
+ {
+ ProgramAttributes.bCheckBinaryType = TRUE;
+ }
#if 0
- ProgramAttributes.hTmpIcon = 0;
+ ProgramAttributes.hTmpIcon = NULL;
#else
- ProgramAttributes.hTmpIcon = *lphIcon;
+ ProgramAttributes.hTmpIcon = *lphIcon;
#endif
- ProgramAttributes.nTmpIconIndex = *lpnIconIndex;
- ProgramAttributes.lpszTmpIconFile = szTmpIconFile;
- lstrcpynA(ProgramAttributes.lpszTmpIconFile, lpszIconFile, MAX_PATHNAME_LEN);
+ ProgramAttributes.nTmpIconIndex = *lpnIconIndex;
+ ProgramAttributes.lpszTmpIconFile = szTmpIconFile;
+ wcsncpy(szTmpIconFile, lpszIconFile, ARRAYSIZE(szTmpIconFile));
- ret = DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_PROGRAM), Globals.hMainWnd, DIALOG_PROGRAM_DlgProc);
- return(ret == IDOK);
+ ret = DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_PROGRAM), Globals.hMainWnd, DIALOG_PROGRAM_DlgProc, (LPARAM)&ProgramAttributes);
+ return (ret == IDOK);
}
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+/***********************************************************************
*
- * DIALOG_EXECUTE_DlgProc
+ * DIALOG_Execute
*/
-static INT_PTR CALLBACK DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT msg,
- WPARAM wParam, LPARAM lParam)
+
+typedef struct _EXECUTE_CONTEXT
+{
+ HKEY hKeyPMRecentFilesList;
+ DWORD dwMaxFiles;
+ BOOL bCheckBinaryType;
+} EXECUTE_CONTEXT, *PEXECUTE_CONTEXT;
+
+static
+INT_PTR
+CALLBACK
+DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (msg)
+ WCHAR szFile[MAX_PATHNAME_LEN]; // filename
+ DWORD BinaryType;
+ PEXECUTE_CONTEXT pExecuteContext;
+
+ pExecuteContext = (PEXECUTE_CONTEXT)GetWindowLongPtrW(hDlg, 8);
+
+ switch (uMsg)
{
- case WM_COMMAND:
- switch (wParam)
- {
- case PM_SYMBOL:
- CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
- return TRUE;
-
- case PM_BROWSE:
- {
- CHAR filename[MAX_PATHNAME_LEN];
- filename[0] = 0;
- if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename)))
- SetDlgItemTextA(hDlg, PM_COMMAND, filename);
- return TRUE;
- }
-
- case PM_HELP:
- MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
- return TRUE;
-
- case IDOK:
- {
- CHAR cmdline[MAX_PATHNAME_LEN];
- GetDlgItemTextA(hDlg, PM_COMMAND, cmdline, sizeof(cmdline));
-
- WinExec(cmdline, IsDlgButtonChecked(hDlg, PM_SYMBOL) ?
- SW_SHOWMINIMIZED : SW_SHOWNORMAL);
- if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd);
-
- EndDialog(hDlg, IDOK);
- return TRUE;
- }
-
- case IDCANCEL:
- EndDialog(hDlg, IDCANCEL);
- return TRUE;
- }
+ case WM_INITDIALOG:
+ {
+ pExecuteContext = (PEXECUTE_CONTEXT)lParam;
+ SetWindowLongPtrW(hDlg, 8, lParam);
+
+ EnableDlgItem(hDlg, IDOK, ValidateEditContents(hDlg, PM_COMMAND));
+
+ if (pExecuteContext->bCheckBinaryType)
+ {
+ EnableDlgItem(hDlg, PM_NEW_VDM, FALSE);
+ CheckDlgButton(hDlg, PM_NEW_VDM, BST_CHECKED);
+ }
+ else
+ {
+ EnableDlgItem(hDlg, PM_NEW_VDM, TRUE);
+ }
+
+ break;
+ }
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case PM_SYMBOL:
+ CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
+ return TRUE;
+
+ case PM_NEW_VDM:
+ CheckDlgButton(hDlg, PM_NEW_VDM, !IsDlgButtonChecked(hDlg, PM_NEW_VDM));
+ return TRUE;
+
+ case PM_BROWSE:
+ {
+ szFile[0] = '\0';
+ if (DIALOG_BrowsePrograms(hDlg, szFile, ARRAYSIZE(szFile)))
+ {
+ SetWindowTextW(GetDlgItem(hDlg, PM_COMMAND), szFile);
+ SetFocus(GetDlgItem(hDlg, IDOK));
+ if (pExecuteContext->bCheckBinaryType &&
+ (!GetBinaryTypeW(szFile, &BinaryType) || BinaryType != SCS_WOW_BINARY) )
+ {
+ EnableDlgItem(hDlg, PM_NEW_VDM, FALSE);
+ CheckDlgButton(hDlg, PM_NEW_VDM, BST_CHECKED);
+ }
+ else
+ {
+ EnableDlgItem(hDlg, PM_NEW_VDM, TRUE);
+ CheckDlgButton(hDlg, PM_NEW_VDM, BST_UNCHECKED);
+ }
+ }
+ return TRUE;
+ }
+
+ case PM_COMMAND:
+ {
+ if (HIWORD(wParam) == CBN_EDITCHANGE)
+ {
+ EnableDlgItem(hDlg, IDOK, ValidateEditContents(hDlg, PM_COMMAND));
+ }
+ return FALSE;
+ }
+
+ case IDHELP:
+ MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
+ return TRUE;
+
+ case IDOK:
+ {
+ GetDlgItemTextW(hDlg, PM_COMMAND, szFile, ARRAYSIZE(szFile));
+ ShellExecuteW(NULL, NULL, szFile, NULL, NULL, IsDlgButtonChecked(hDlg, PM_SYMBOL) ? SW_SHOWMINNOACTIVE : SW_SHOWNORMAL);
+ if (Globals.bMinOnRun)
+ CloseWindow(Globals.hMainWnd);
+ EndDialog(hDlg, IDOK);
+ return TRUE;
+ }
+
+ case IDCANCEL:
+ EndDialog(hDlg, IDCANCEL);
+ return TRUE;
+ }
+ return FALSE;
}
- return FALSE;
-}
-/***********************************************************************
- *
- * DIALOG_Execute
- */
+ return FALSE;
+}
-VOID DIALOG_Execute(void)
+VOID DIALOG_Execute(VOID)
{
- DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_EXECUTE), Globals.hMainWnd, DIALOG_EXECUTE_DlgProc);
+ EXECUTE_CONTEXT ExecuteContext;
+ LONG lRet;
+ DWORD dwSize;
+ DWORD dwType;
+
+ lRet = RegCreateKeyExW(Globals.hKeyProgMan,
+ L"Recent File List",
+ 0,
+ NULL,
+ 0,
+ KEY_READ | KEY_WRITE,
+ NULL,
+ &ExecuteContext.hKeyPMRecentFilesList,
+ NULL);
+
+ dwSize = sizeof(ExecuteContext.dwMaxFiles);
+ lRet = RegQueryValueExW(ExecuteContext.hKeyPMRecentFilesList,
+ L"Max Files",
+ NULL,
+ &dwType,
+ (LPBYTE)&ExecuteContext.dwMaxFiles,
+ &dwSize);
+ if (lRet != ERROR_SUCCESS || dwType != REG_DWORD)
+ {
+ ExecuteContext.dwMaxFiles = 4;
+ dwSize = sizeof(ExecuteContext.dwMaxFiles);
+ lRet = RegSetValueExW(ExecuteContext.hKeyPMRecentFilesList,
+ L"Max Files",
+ 0,
+ REG_DWORD,
+ (LPBYTE)&ExecuteContext.dwMaxFiles,
+ sizeof(ExecuteContext.dwMaxFiles));
+ }
+
+ dwSize = sizeof(ExecuteContext.bCheckBinaryType);
+ lRet = RegQueryValueExW(Globals.hKeyPMSettings,
+ L"CheckBinaryType",
+ NULL,
+ &dwType,
+ (LPBYTE)&ExecuteContext.bCheckBinaryType,
+ &dwSize);
+ if (lRet != ERROR_SUCCESS || dwType != REG_DWORD)
+ {
+ ExecuteContext.bCheckBinaryType = TRUE;
+ }
+
+ DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_EXECUTE), Globals.hMainWnd, DIALOG_EXECUTE_DlgProc, (LPARAM)&ExecuteContext);
+
+ RegCloseKey(ExecuteContext.hKeyPMRecentFilesList);
}
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+/*
+ * PROJECT: ReactOS Program Manager
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * FILE: base/shell/progman/group.c
+ * PURPOSE: Program group files helper functions
+ * PROGRAMMERS: Ulrich Schmid
+ * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
+ */
+
#include "progman.h"
/***********************************************************************
* GROUP_GroupWndProc
*/
-static LRESULT CALLBACK GROUP_GroupWndProc(HWND hWnd, UINT msg,
- WPARAM wParam, LPARAM lParam)
+static
+LRESULT
+CALLBACK
+GROUP_GroupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (msg)
+ PROGGROUP* group;
+
+ group = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0);
+
+ switch (uMsg)
{
- case WM_SYSCOMMAND:
- if (wParam == SC_CLOSE) wParam = SC_MINIMIZE;
- break;
-
- case WM_CHILDACTIVATE:
- case WM_NCLBUTTONDOWN:
- Globals.hActiveGroup = (HLOCAL)GetWindowLongPtrW(hWnd, 0);
- EnableMenuItem(Globals.hFileMenu, PM_MOVE , MF_GRAYED);
- EnableMenuItem(Globals.hFileMenu, PM_COPY , MF_GRAYED);
- break;
+ case WM_NCCREATE:
+ {
+ LPCREATESTRUCTW pcs = (LPCREATESTRUCTW)lParam;
+ LPMDICREATESTRUCTW pMDIcs = (LPMDICREATESTRUCTW)pcs->lpCreateParams;
+ group = (PROGGROUP*)pMDIcs->lParam;
+ SetWindowLongPtrW(hWnd, 0, (LONG_PTR)group);
+
+ if (group->bIsCommonGroup)
+ {
+ DefMDIChildProcW(hWnd, WM_SETICON, ICON_BIG,
+ (LPARAM)CopyImage(Globals.hCommonGroupIcon,
+ IMAGE_ICON,
+ GetSystemMetrics(SM_CXICON),
+ GetSystemMetrics(SM_CYICON),
+ LR_COPYFROMRESOURCE));
+ DefMDIChildProcW(hWnd, WM_SETICON, ICON_SMALL,
+ (LPARAM)CopyImage(Globals.hCommonGroupIcon,
+ IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON),
+ GetSystemMetrics(SM_CYSMICON),
+ LR_COPYFROMRESOURCE));
+ }
+ else
+ {
+ DefMDIChildProcW(hWnd, WM_SETICON, ICON_BIG,
+ (LPARAM)CopyImage(Globals.hPersonalGroupIcon,
+ IMAGE_ICON,
+ GetSystemMetrics(SM_CXICON),
+ GetSystemMetrics(SM_CYICON),
+ LR_COPYFROMRESOURCE));
+ DefMDIChildProcW(hWnd, WM_SETICON, ICON_SMALL,
+ (LPARAM)CopyImage(Globals.hPersonalGroupIcon,
+ IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON),
+ GetSystemMetrics(SM_CYSMICON),
+ LR_COPYFROMRESOURCE));
+ }
+ break;
+ }
+
+ case WM_NCDESTROY:
+ SetWindowLongPtrW(hWnd, 0, 0);
+ break;
+
+ case WM_CLOSE:
+ SendMessageW(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
+ break;
+
+ case WM_SYSCOMMAND:
+ if (wParam == SC_CLOSE) wParam = SC_MINIMIZE;
+ break;
+
+ case WM_CHILDACTIVATE:
+ case WM_NCLBUTTONDOWN:
+ Globals.hActiveGroup = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0);
+ Globals.hActiveGroup->hActiveProgram = NULL;
+ break;
}
- return DefMDIChildProcW(hWnd, msg, wParam, lParam);
+
+ return DefMDIChildProcW(hWnd, uMsg, wParam, lParam);
}
/***********************************************************************
* GROUP_RegisterGroupWinClass
*/
-ATOM GROUP_RegisterGroupWinClass(void)
+ATOM GROUP_RegisterGroupWinClass(VOID)
{
- WNDCLASSW class;
-
- class.style = CS_HREDRAW | CS_VREDRAW;
- class.lpfnWndProc = GROUP_GroupWndProc;
- class.cbClsExtra = 0;
- class.cbWndExtra = sizeof(LONG_PTR);
- class.hInstance = Globals.hInstance;
- class.hIcon = LoadIconW (0, (LPWSTR)IDI_WINLOGO);
- class.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW);
- class.hbrBackground = GetStockObject (WHITE_BRUSH);
- class.lpszMenuName = 0;
- class.lpszClassName = STRING_GROUP_WIN_CLASS_NAME;
-
- return RegisterClassW(&class);
+ WNDCLASSW wndClass;
+
+ wndClass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
+ wndClass.lpfnWndProc = GROUP_GroupWndProc;
+ wndClass.cbClsExtra = 0;
+ wndClass.cbWndExtra = sizeof(LONG_PTR);
+ wndClass.hInstance = Globals.hInstance;
+ wndClass.hIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_GROUP_ICON));
+ wndClass.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_ARROW));
+ wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
+ wndClass.lpszMenuName = NULL;
+ wndClass.lpszClassName = STRING_GROUP_WIN_CLASS_NAME;
+
+ return RegisterClassW(&wndClass);
}
/***********************************************************************
* GROUP_NewGroup
*/
-VOID GROUP_NewGroup(void)
+VOID GROUP_NewGroup(GROUPFORMAT format, BOOL bIsCommonGroup)
{
- CHAR szName[MAX_PATHNAME_LEN] = "";
- CHAR szFile[MAX_PATHNAME_LEN] = "";
- OFSTRUCT dummy;
-
- if (!DIALOG_GroupAttributes(szName, szFile, MAX_PATHNAME_LEN)) return;
-
- if (OpenFile(szFile, &dummy, OF_EXIST) == HFILE_ERROR)
+ HANDLE hFile;
+ WCHAR szGrpFile[MAX_PATHNAME_LEN] = L"";
+ WCHAR szTitle[MAX_PATHNAME_LEN] = L"";
+
+ // ZeroMemory(szTitle, sizeof(szTitle));
+ // ZeroMemory(szGrpFile, sizeof(szGrpFile));
+
+ if (!DIALOG_GroupAttributes(format, szTitle, szGrpFile, MAX_PATHNAME_LEN))
+ return;
+
+ /*
+ * Just check whether the group file does exist. If it does, close the handle, because GRPFILE_ReadGroupFile will
+ * reopen the file for loading. If it doesn't exist, we create a new one.
+ */
+ hFile = CreateFileW(szGrpFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ /* File doesn't exist */
+ PROGGROUP* hGroup = GROUP_AddGroup(format, bIsCommonGroup, szTitle, szGrpFile,
+ DEF_GROUP_WIN_XPOS, DEF_GROUP_WIN_YPOS,
+ DEF_GROUP_WIN_XPOS + DEF_GROUP_WIN_WIDTH, DEF_GROUP_WIN_YPOS + DEF_GROUP_WIN_HEIGHT,
+ 0, 0, SW_SHOWNORMAL, 0, 0, FALSE, FALSE);
+ if (hGroup)
+ GRPFILE_WriteGroupFile(hGroup);
+ }
+ else
{
- /* File doesn't exist */
- HLOCAL hGroup =
- GROUP_AddGroup(szName, szFile, SW_SHOWNORMAL,
- DEF_GROUP_WIN_XPOS, DEF_GROUP_WIN_YPOS,
- DEF_GROUP_WIN_WIDTH, DEF_GROUP_WIN_HEIGHT, 0, 0,
- FALSE, FALSE, FALSE);
- if (!hGroup) return;
- GRPFILE_WriteGroupFile(hGroup);
+ /* File exist */
+ CloseHandle(hFile);
+ GRPFILE_ReadGroupFile(szGrpFile, bIsCommonGroup);
}
- else /* File exist */
- GRPFILE_ReadGroupFile(szFile);
- /* FIXME Update progman.ini */
+ /* FIXME Update progman.ini */
}
/***********************************************************************
* GROUP_AddGroup
*/
-HLOCAL GROUP_AddGroup(LPCSTR lpszName, LPCSTR lpszGrpFile, INT nCmdShow,
- INT x, INT y, INT width, INT height,
- INT iconx, INT icony,
- BOOL bFileNameModified, BOOL bOverwriteFileOk,
- /* FIXME shouldn't be necessary */
- BOOL bSuppressShowWindow)
+PROGGROUP*
+GROUP_AddGroup(GROUPFORMAT format, BOOL bIsCommonGroup, LPCWSTR lpszName, LPCWSTR lpszGrpFile,
+ INT left, INT top, INT right, INT bottom, INT xMin, INT yMin, INT nCmdShow,
+ WORD cxIcon, WORD cyIcon, BOOL bOverwriteFileOk,
+ /* FIXME shouldn't be necessary */
+ BOOL bSuppressShowWindow)
{
- PROGGROUP *group, *prior;
- MDICREATESTRUCTW cs;
- INT seqnum;
- HLOCAL hPrior, *p;
- HLOCAL hGroup = LocalAlloc(LMEM_FIXED, sizeof(PROGGROUP));
- HLOCAL hName = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszName));
- HLOCAL hGrpFile = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszGrpFile));
- if (!hGroup || !hName || !hGrpFile)
+ PROGGROUP* hGroup;
+ PROGGROUP* hPrior;
+ PROGGROUP** p;
+ LPWSTR hName;
+ LPWSTR hGrpFile;
+ LPCWSTR GroupFileName;
+ INT skip;
+ INT width;
+ INT height;
+ INT seqnum;
+ MDICREATESTRUCTW mcs;
+ WINDOWPLACEMENT WndPl;
+
+ WndPl.length = sizeof(WndPl);
+
+ // FIXME: Use system default position in case we don't place the window at a given (x,y) coordinate.
+
+ if (bIsCommonGroup)
+ {
+ if (swscanf(lpszGrpFile,
+ L"%d %d %d %d %d %d %d %n",
+ &WndPl.rcNormalPosition.left,
+ &WndPl.rcNormalPosition.top,
+ &WndPl.rcNormalPosition.right,
+ &WndPl.rcNormalPosition.bottom,
+ &WndPl.ptMinPosition,
+ &WndPl.ptMinPosition.y,
+ &WndPl.showCmd,
+ &skip) == 7)
+ {
+ WndPl.flags = WPF_SETMINPOSITION;
+ width = WndPl.rcNormalPosition.right - WndPl.rcNormalPosition.left;
+ height = WndPl.rcNormalPosition.bottom - WndPl.rcNormalPosition.top;
+ GroupFileName = &lpszGrpFile[skip];
+ }
+ else
+ {
+#if 0 // FIXME!
+ WndPl.rcNormalPosition.top = CW_USEDEFAULT;
+ WndPl.rcNormalPosition.left = CW_USEDEFAULT;
+ WndPl.rcNormalPosition.right = 0;
+ WndPl.rcNormalPosition.bottom = 0;
+ width = CW_USEDEFAULT;
+ height = CW_USEDEFAULT;
+ WndPl.showCmd = SW_SHOWNORMAL;
+ GroupFileName = lpszGrpFile;
+#else
+ WndPl.flags = WPF_SETMINPOSITION;
+ WndPl.ptMinPosition.x = xMin;
+ WndPl.ptMinPosition.y = yMin;
+ WndPl.rcNormalPosition.left = left;
+ WndPl.rcNormalPosition.top = top;
+ WndPl.rcNormalPosition.right = right;
+ WndPl.rcNormalPosition.bottom = bottom;
+ width = right - left;
+ height = bottom - top;
+ WndPl.showCmd = nCmdShow;
+ GroupFileName = lpszGrpFile;
+#endif
+ }
+ }
+ else
{
- MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
- if (hGroup) LocalFree(hGroup);
- if (hName) LocalFree(hName);
- if (hGrpFile) LocalFree(hGrpFile);
- return(0);
+ WndPl.flags = WPF_SETMINPOSITION;
+ WndPl.ptMinPosition.x = xMin;
+ WndPl.ptMinPosition.y = yMin;
+ WndPl.rcNormalPosition.left = left;
+ WndPl.rcNormalPosition.top = top;
+ WndPl.rcNormalPosition.right = right;
+ WndPl.rcNormalPosition.bottom = bottom;
+ width = right - left;
+ height = bottom - top;
+ WndPl.showCmd = nCmdShow;
+ GroupFileName = lpszGrpFile;
}
- memcpy(LocalLock(hName), lpszName, 1 + strlen(lpszName));
- memcpy(LocalLock(hGrpFile), lpszGrpFile, 1 + strlen(lpszGrpFile));
- Globals.hActiveGroup = hGroup;
+ hGroup = Alloc(HEAP_ZERO_MEMORY, sizeof(*hGroup));
+ hName = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszName) + 1) * sizeof(WCHAR));
+ hGrpFile = Alloc(HEAP_ZERO_MEMORY, (wcslen(GroupFileName) + 1) * sizeof(WCHAR));
+ if (!hGroup || !hName || !hGrpFile)
+ {
+ MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
+ if (hGroup) Free(hGroup);
+ if (hName) Free(hName);
+ if (hGrpFile) Free(hGrpFile);
+ return NULL;
+ }
+ memcpy(hName , lpszName , (wcslen(lpszName) + 1) * sizeof(WCHAR));
+ memcpy(hGrpFile, GroupFileName, (wcslen(GroupFileName) + 1) * sizeof(WCHAR));
- seqnum = 1;
- hPrior = 0;
- p = &Globals.hGroups;
- while (*p)
+ Globals.hActiveGroup = hGroup;
+
+ seqnum = 1;
+ hPrior = NULL;
+ for (p = &Globals.hGroups; *p; p = &hPrior->hNext)
{
- hPrior = *p;
- prior = LocalLock(hPrior);
- p = &prior->hNext;
- if (prior->seqnum >= seqnum)
- seqnum = prior->seqnum + 1;
+ hPrior = *p;
+ if (hPrior->seqnum >= seqnum)
+ seqnum = hPrior->seqnum + 1;
}
- *p = hGroup;
-
- group = LocalLock(hGroup);
- group->hPrior = hPrior;
- group->hNext = 0;
- group->hName = hName;
- group->hGrpFile = hGrpFile;
- group->bFileNameModified = bFileNameModified;
- group->bOverwriteFileOk = bOverwriteFileOk;
- group->seqnum = seqnum;
- group->nCmdShow = nCmdShow;
- group->x = x;
- group->y = y;
- group->width = width;
- group->height = height;
- group->iconx = iconx;
- group->icony = icony;
- group->hPrograms = 0;
- group->hActiveProgram = 0;
-
- cs.szClass = STRING_GROUP_WIN_CLASS_NAME;
- cs.szTitle = NULL;
- cs.hOwner = 0;
- cs.x = x;
- cs.y = y;
- cs.cx = width;
- cs.cy = height;
- cs.style = 0;
- cs.lParam = 0;
-
-#ifdef __REACTOS__
- group->hWnd = (HWND)SendMessageW(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&cs);
-#else
- group->hWnd = (HWND)SendMessageA(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&cs);
+ *p = hGroup;
+
+ hGroup->hPrior = hPrior;
+ hGroup->hNext = NULL;
+ hGroup->format = format;
+ hGroup->bIsCommonGroup = bIsCommonGroup;
+ hGroup->hName = hName;
+ hGroup->hGrpFile = hGrpFile;
+ hGroup->bOverwriteFileOk = bOverwriteFileOk;
+ hGroup->seqnum = seqnum;
+ hGroup->nCmdShow = nCmdShow;
+#if 0
+ hGroup->x = x;
+ hGroup->y = y;
+ hGroup->width = width;
+ hGroup->height = height;
#endif
- SetWindowTextA( group->hWnd, lpszName );
- SetWindowLongPtrW(group->hWnd, 0, (LONG_PTR) hGroup);
+ hGroup->iconx = cxIcon;
+ hGroup->icony = cyIcon;
+ hGroup->hPrograms = NULL;
+ hGroup->hActiveProgram = NULL;
+ hGroup->TagsSize = 0;
+ hGroup->Tags = NULL;
+
+ mcs.szClass = STRING_GROUP_WIN_CLASS_NAME;
+ mcs.szTitle = lpszName;
+ mcs.hOwner = NULL;
+ mcs.x = WndPl.rcNormalPosition.left;
+ mcs.y = WndPl.rcNormalPosition.top;
+ mcs.cx = width;
+ mcs.cy = height;
+ mcs.style = 0;
+ mcs.lParam = (LPARAM)hGroup;
+
+ hGroup->hWnd = (HWND)SendMessageW(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&mcs);
+
+ SetWindowPlacement(hGroup->hWnd, &WndPl);
#if 1
- if (!bSuppressShowWindow) /* FIXME shouldn't be necessary */
+ if (!bSuppressShowWindow) /* FIXME shouldn't be necessary */
#endif
- {
- ShowWindow (group->hWnd, nCmdShow);
- UpdateWindow (group->hWnd);
- }
+ UpdateWindow(hGroup->hWnd);
- return(hGroup);
+ return hGroup;
}
+
+
+
+
/***********************************************************************
*
* GROUP_ModifyGroup
*/
-VOID GROUP_ModifyGroup(HLOCAL hGroup)
+VOID GROUP_ModifyGroup(PROGGROUP* hGroup)
{
- PROGGROUP *group = LocalLock(hGroup);
- CHAR szName[MAX_PATHNAME_LEN];
- CHAR szFile[MAX_PATHNAME_LEN];
- lstrcpynA(szName, LocalLock(group->hName), MAX_PATHNAME_LEN);
- lstrcpynA(szFile, LocalLock(group->hGrpFile), MAX_PATHNAME_LEN);
+ WCHAR Dest[MAX_PATHNAME_LEN]; // szName
+ WCHAR szGrpFile[MAX_PATHNAME_LEN]; // szFile
- if (!DIALOG_GroupAttributes(szName, szFile, MAX_PATHNAME_LEN)) return;
+ wcsncpy(Dest, hGroup->hName, ARRAYSIZE(Dest));
+ wcsncpy(szGrpFile, hGroup->hGrpFile, ARRAYSIZE(szGrpFile));
- if (strcmp(szFile, LocalLock(group->hGrpFile)))
- group->bOverwriteFileOk = FALSE;
+ if (!DIALOG_GroupAttributes(hGroup->format, Dest, szGrpFile, MAX_PATHNAME_LEN))
+ return;
- MAIN_ReplaceString(&group->hName, szName);
- MAIN_ReplaceString(&group->hGrpFile, szFile);
+ if (wcscmp(szGrpFile, hGroup->hGrpFile))
+ hGroup->bOverwriteFileOk = FALSE;
- GRPFILE_WriteGroupFile(hGroup);
+ MAIN_ReplaceString(&hGroup->hName, Dest);
+ MAIN_ReplaceString(&hGroup->hGrpFile, szGrpFile);
- /* FIXME Delete old GrpFile if GrpFile changed */
+ GRPFILE_WriteGroupFile(hGroup);
- /* FIXME Update progman.ini */
+ /* FIXME Delete old GrpFile if GrpFile changed */
- SetWindowTextA(group->hWnd, szName);
-}
-
-/***********************************************************************
- *
- * GROUP_ShowGroupWindow
- */
+ /* FIXME Update progman.ini */
-/* FIXME shouldn't be necessary */
-VOID GROUP_ShowGroupWindow(HLOCAL hGroup)
-{
- PROGGROUP *group = LocalLock(hGroup);
- ShowWindow (group->hWnd, group->nCmdShow);
- UpdateWindow (group->hWnd);
+ SetWindowTextW(hGroup->hWnd, Dest);
}
/***********************************************************************
* GROUP_DeleteGroup
*/
-VOID GROUP_DeleteGroup(HLOCAL hGroup)
+VOID GROUP_DeleteGroup(PROGGROUP* hGroup)
{
- PROGGROUP *group = LocalLock(hGroup);
-
- Globals.hActiveGroup = 0;
-
- if (group->hPrior)
- ((PROGGROUP*)LocalLock(group->hPrior))->hNext = group->hNext;
- else Globals.hGroups = group->hNext;
-
- if (group->hNext)
- ((PROGGROUP*)LocalLock(group->hNext))->hPrior = group->hPrior;
+ if (Globals.hActiveGroup == hGroup)
+ Globals.hActiveGroup = NULL;
- while (group->hPrograms)
- PROGRAM_DeleteProgram(group->hPrograms, FALSE);
+ if (hGroup->hPrior)
+ hGroup->hPrior->hNext = hGroup->hNext;
+ else
+ Globals.hGroups = hGroup->hNext;
- /* FIXME Update progman.ini */
+ if (hGroup->hNext)
+ hGroup->hNext->hPrior = hGroup->hPrior;
- SendMessageW(Globals.hMDIWnd, WM_MDIDESTROY, (WPARAM)group->hWnd, 0);
+ while (hGroup->hPrograms)
+ PROGRAM_DeleteProgram(hGroup->hPrograms, FALSE);
- LocalFree(group->hName);
- LocalFree(group->hGrpFile);
- LocalFree(hGroup);
-}
+ /* FIXME Update progman.ini */
-/***********************************************************************
- *
- * GROUP_FirstGroup
- */
+ SendMessageW(Globals.hMDIWnd, WM_MDIDESTROY, (WPARAM)hGroup->hWnd, 0);
-HLOCAL GROUP_FirstGroup(void)
-{
- return(Globals.hGroups);
+ if (hGroup->Tags)
+ Free(hGroup->Tags);
+ Free(hGroup->hName);
+ Free(hGroup->hGrpFile);
+ Free(hGroup);
}
/***********************************************************************
*
- * GROUP_NextGroup
+ * GROUP_ShowGroupWindow
*/
-HLOCAL GROUP_NextGroup(HLOCAL hGroup)
+/* FIXME shouldn't be necessary */
+VOID GROUP_ShowGroupWindow(PROGGROUP* hGroup)
{
- PROGGROUP *group;
- if (!hGroup) return(0);
- group = LocalLock(hGroup);
- return(group->hNext);
+ ShowWindow(hGroup->hWnd, hGroup->nCmdShow);
+ UpdateWindow(hGroup->hWnd);
}
/***********************************************************************
* GROUP_ActiveGroup
*/
-HLOCAL GROUP_ActiveGroup(void)
-{
- return(Globals.hActiveGroup);
-}
-
-/***********************************************************************
- *
- * GROUP_GroupWnd
- */
-
-HWND GROUP_GroupWnd(HLOCAL hGroup)
-{
- PROGGROUP *group;
- if (!hGroup) return(0);
- group = LocalLock(hGroup);
- return(group->hWnd);
-}
-
-/***********************************************************************
- *
- * GROUP_GroupName
- */
-
-LPCSTR GROUP_GroupName(HLOCAL hGroup)
+PROGGROUP* GROUP_ActiveGroup(VOID)
{
- PROGGROUP *group;
- if (!hGroup) return(0);
- group = LocalLock(hGroup);
- return(LocalLock(group->hName));
+ return Globals.hActiveGroup;
}
#include "progman.h"
+#if 0
#define MALLOCHUNK 1000
#define GET_USHORT(buffer, i)\
static HLOCAL GRPFILE_ScanProgram(LPCSTR, INT, LPCSTR, INT,
LPCSTR, HLOCAL,LPCSTR);
static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group);
+#endif
/***********************************************************************
*
* Change extension `.grp' to `.gr'
*/
+#if 0
static VOID GRPFILE_ModifyFileName(LPSTR lpszNewName, LPCSTR lpszOrigName,
INT nSize, BOOL bModify)
{
if (!lstrcmpiA(lpszNewName + strlen(lpszNewName) - 4, ".grp"))
lpszNewName[strlen(lpszNewName) - 1] = '\0';
}
+#endif
/***********************************************************************
*
* GRPFILE_ReadGroupFile
*/
-HLOCAL GRPFILE_ReadGroupFile(LPCSTR lpszPath)
+DWORD GRPFILE_ReadGroupFile(LPCWSTR lpszPath, BOOL bIsCommonGroup)
{
+#if 0
CHAR szPath_gr[MAX_PATHNAME_LEN];
BOOL bFileNameModified = FALSE;
OFSTRUCT dummy;
LocalFree(hBuffer);
return(hGroup);
+
+#else
+ return ERROR_SUCCESS;
+#endif
}
/***********************************************************************
* GRPFILE_ReadFileToBuffer
*/
+#if 0
static BOOL GRPFILE_ReadFileToBuffer(LPCSTR path, HLOCAL *phBuffer,
INT *piSize)
{
*piSize = size;
return TRUE;
}
+#endif
/***********************************************************************
* GRPFILE_ScanGroup
*/
+#if 0
static HLOCAL GRPFILE_ScanGroup(LPCSTR buffer, INT size,
LPCSTR lpszGrpFile,
BOOL bModifiedFileName)
return hGroup;
}
+#endif
/***********************************************************************
* GRPFILE_ScanProgram
*/
+#if 0
static HLOCAL GRPFILE_ScanProgram(LPCSTR buffer, INT size,
LPCSTR program_ptr, INT seqnum,
LPCSTR extension, HLOCAL hGroup,
if (iconANDbits_ptr + iconANDsize > buffer + size ||
iconXORbits_ptr + iconXORsize > buffer + size) return(0);
-#ifdef __REACTOS__
hIcon = CreateIcon(Globals.hInstance, width, height, planes, bpp, (PBYTE)iconANDbits_ptr, (PBYTE)iconXORbits_ptr);
-#else
- hIcon = CreateIcon( Globals.hInstance, width, height, planes, bpp, iconANDbits_ptr, iconXORbits_ptr );
-#endif
lpszName = buffer + GET_USHORT(program_ptr, 18);
lpszCmdLine = buffer + GET_USHORT(program_ptr, 20);
nIconIndex, lpszWorkDir,
nHotKey, nCmdShow));
}
+#endif
/***********************************************************************
*
* GRPFILE_WriteGroupFile
*/
-BOOL GRPFILE_WriteGroupFile(HLOCAL hGroup)
+BOOL GRPFILE_WriteGroupFile(PROGGROUP* hGroup)
{
+#if 0
CHAR szPath[MAX_PATHNAME_LEN];
PROGGROUP *group = LocalLock(hGroup);
OFSTRUCT dummy;
MAIN_MessageBoxIDS_s(IDS_FILE_WRITE_ERROR_s, szPath, IDS_ERROR, MB_OK);
return(ret);
+
+#else
+ return TRUE;
+#endif
}
+#if 0
+
/***********************************************************************
*
* GRPFILE_CalculateSizes
HLOCAL hProgram;
INT NumProg, Title, Progs, Icons, Extension;
INT CurrProg, CurrIcon, nCmdShow, ptr, seqnum;
-#ifdef __REACTOS__
+
UINT sizeAnd, sizeXor;
-#else
- DWORD sizeAnd, sizeXor;
-#endif
+
BOOL need_extension;
LPCSTR lpszTitle = LocalLock(group->hName);
return TRUE;
}
+
+#endif
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+/*
+ * PROJECT: ReactOS Program Manager
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * FILE: base/shell/progman/main.c
+ * PURPOSE: ProgMan entry point & MDI window
+ * PROGRAMMERS: Ulrich Schmid
+ * Sylvain Petreolle
+ * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
+ */
+
#include "progman.h"
#include <shellapi.h>
+#define WC_MDICLIENTA "MDICLIENT"
+#define WC_MDICLIENTW L"MDICLIENT"
+
+#ifdef UNICODE
+#define WC_MDICLIENT WC_MDICLIENTW
+#else
+#define WC_MDICLIENT WC_MDICLIENTA
+#endif
+
GLOBALS Globals;
-static VOID MAIN_CreateGroups(void);
+static VOID MAIN_LoadGroups(VOID);
static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam);
-static ATOM MAIN_RegisterMainWinClass(void);
-static VOID MAIN_CreateMainWindow(void);
-static VOID MAIN_CreateMDIWindow(void);
-static VOID MAIN_AutoStart(void);
+static ATOM MAIN_RegisterMainWinClass(VOID);
+static VOID MAIN_CreateMainWindow(VOID);
+static VOID MAIN_CreateMDIWindow(VOID);
+static VOID MAIN_AutoStart(VOID);
+
+
+#define BUFFER_SIZE 1024
+
+
+
+/*
+ * Memory management functions
+ */
+PVOID
+Alloc(IN DWORD dwFlags,
+ IN SIZE_T dwBytes)
+{
+ return HeapAlloc(GetProcessHeap(), dwFlags, dwBytes);
+}
+
+BOOL
+Free(IN PVOID lpMem)
+{
+ return HeapFree(GetProcessHeap(), 0, lpMem);
+}
+
+PVOID
+ReAlloc(IN DWORD dwFlags,
+ IN PVOID lpMem,
+ IN SIZE_T dwBytes)
+{
+ return HeapReAlloc(GetProcessHeap(), dwFlags, lpMem, dwBytes);
+}
+
+PVOID
+AppendToBuffer(IN PVOID pBuffer,
+ IN PSIZE_T pdwBufferSize,
+ IN PVOID pData,
+ IN SIZE_T dwDataSize)
+{
+ PVOID pTmp;
+ SIZE_T dwBufferSize;
+
+ dwBufferSize = dwDataSize + *pdwBufferSize;
+
+ if (pBuffer)
+ pTmp = ReAlloc(0, pBuffer, dwBufferSize);
+ else
+ pTmp = Alloc(0, dwBufferSize);
+
+ if (!pTmp)
+ return NULL;
+
+ memcpy((PVOID)((ULONG_PTR)pTmp + *pdwBufferSize), pData, dwDataSize);
+ *pdwBufferSize = dwBufferSize;
+
+ return pTmp;
+}
+
+
+
+/*
+ * Debugging helpers
+ */
+VOID
+PrintStringV(IN LPCWSTR szStr,
+ IN va_list args)
+{
+ WCHAR Buffer[4096];
+
+ _vsnwprintf(Buffer, ARRAYSIZE(Buffer), szStr, args);
+ MessageBoxW(Globals.hMainWnd, Buffer, L"Information", MB_OK);
+}
+
+VOID
+PrintString(IN LPCWSTR szStr, ...)
+{
+ va_list args;
+
+ va_start(args, szStr);
+ PrintStringV(szStr, args);
+ va_end(args);
+}
+
+VOID
+PrintResourceString(IN UINT uID, ...)
+{
+ WCHAR Buffer[4096];
+ va_list args;
+
+ va_start(args, uID);
+ LoadStringW(Globals.hInstance, uID, Buffer, ARRAYSIZE(Buffer));
+ PrintStringV(Buffer, args);
+ va_end(args);
+}
+
+VOID
+PrintWin32Error(IN LPWSTR Message, IN DWORD ErrorCode)
+{
+ LPWSTR lpMsgBuf;
+
+ FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPWSTR)&lpMsgBuf, 0, NULL);
+
+ PrintString(L"%s: %s\n", Message, lpMsgBuf);
+ LocalFree(lpMsgBuf);
+}
+
+int ShowLastWin32Error(VOID)
+{
+ DWORD dwError;
+ LPWSTR lpMsgBuf = NULL;
+ WCHAR Buffer[4096];
+
+ dwError = GetLastError();
+
+ FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPWSTR)&lpMsgBuf, 0, NULL);
+ _snwprintf(Buffer, ARRAYSIZE(Buffer), L"Error %d: %s\n", dwError, lpMsgBuf);
+ LocalFree(lpMsgBuf);
+ return MessageBoxW(Globals.hMainWnd, Buffer, L"Error", MB_OK);
+}
+
+
+
+
+
+
+
+/* Copied and adapted from dll/win32/userenv/environment.c!GetUserAndDomainName */
+static
+BOOL
+GetUserAndDomainName(OUT LPWSTR* UserName,
+ OUT LPWSTR* DomainName)
+{
+ BOOL bRet = TRUE;
+ HANDLE hToken;
+ DWORD cbTokenBuffer = 0;
+ PTOKEN_USER pUserToken;
+
+ LPWSTR lpUserName = NULL;
+ LPWSTR lpDomainName = NULL;
+ DWORD cbUserName = 0;
+ DWORD cbDomainName = 0;
+
+ SID_NAME_USE SidNameUse;
+
+ /* Get the process token */
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
+ return FALSE;
+
+ /* Retrieve token's information */
+ if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &cbTokenBuffer))
+ {
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ CloseHandle(hToken);
+ return FALSE;
+ }
+ }
+
+ pUserToken = Alloc(HEAP_ZERO_MEMORY, cbTokenBuffer);
+ if (!pUserToken)
+ {
+ CloseHandle(hToken);
+ return FALSE;
+ }
+
+ if (!GetTokenInformation(hToken, TokenUser, pUserToken, cbTokenBuffer, &cbTokenBuffer))
+ {
+ Free(pUserToken);
+ CloseHandle(hToken);
+ return FALSE;
+ }
+
+ CloseHandle(hToken);
+
+ /* Retrieve the domain and user name */
+ if (!LookupAccountSidW(NULL,
+ pUserToken->User.Sid,
+ NULL,
+ &cbUserName,
+ NULL,
+ &cbDomainName,
+ &SidNameUse))
+ {
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ bRet = FALSE;
+ goto done;
+ }
+ }
+
+ lpUserName = Alloc(HEAP_ZERO_MEMORY, cbUserName * sizeof(WCHAR));
+ if (lpUserName == NULL)
+ {
+ bRet = FALSE;
+ goto done;
+ }
+
+ lpDomainName = Alloc(HEAP_ZERO_MEMORY, cbDomainName * sizeof(WCHAR));
+ if (lpDomainName == NULL)
+ {
+ bRet = FALSE;
+ goto done;
+ }
+
+ if (!LookupAccountSidW(NULL,
+ pUserToken->User.Sid,
+ lpUserName,
+ &cbUserName,
+ lpDomainName,
+ &cbDomainName,
+ &SidNameUse))
+ {
+ bRet = FALSE;
+ goto done;
+ }
+
+ *UserName = lpUserName;
+ *DomainName = lpDomainName;
+
+done:
+ if (bRet == FALSE)
+ {
+ if (lpUserName != NULL)
+ Free(lpUserName);
+
+ if (lpDomainName != NULL)
+ Free(lpDomainName);
+ }
+
+ Free(pUserToken);
+
+ return bRet;
+}
+
+
+
+
+
+
+static
+VOID
+MAIN_SetMainWindowTitle(VOID)
+{
+ LPWSTR caption;
+ SIZE_T size;
+
+ LPWSTR lpDomainName = NULL;
+ LPWSTR lpUserName = NULL;
+
+ if (GetUserAndDomainName(&lpUserName, &lpDomainName) && lpUserName && lpDomainName)
+ {
+ size = (256 + 3 + wcslen(lpDomainName) + wcslen(lpUserName) + 1) * sizeof(WCHAR);
+ caption = Alloc(HEAP_ZERO_MEMORY, size);
+ if (caption)
+ {
+ swprintf(caption, L"%s - %s\\%s", szTitle, lpDomainName, lpUserName);
+ SetWindowTextW(Globals.hMainWnd, caption);
+ Free(caption);
+ }
+ else
+ {
+ SetWindowTextW(Globals.hMainWnd, szTitle);
+ }
+ }
+ else
+ {
+ SetWindowTextW(Globals.hMainWnd, szTitle);
+ }
+
+ if (lpUserName) Free(lpUserName);
+ if (lpDomainName) Free(lpDomainName);
+}
+
+
+
+
+static
+BOOL
+MAIN_LoadSettings(VOID)
+{
+ LPWSTR lpszTmp;
+ LPWSTR lpszSection;
+ LONG lRet;
+ WCHAR dummy[2];
+ LPWSTR lpszKeyValue;
+ const LPCWSTR lpszIniFile = L"progman.ini";
+ WCHAR szWinDir[MAX_PATH];
+ LPWSTR lpszKey;
+ DWORD Value;
+ HKEY hKey;
+ BOOL bIsIniMigrated;
+ DWORD dwSize;
+ LPWSTR lpszSections;
+ LPWSTR lpszData;
+ DWORD dwRet;
+ DWORD dwType;
+ LPWSTR lpszValue;
+
+ bIsIniMigrated = FALSE;
+ lpszSections = NULL;
+ lpszData = NULL;
+
+ /* Try to create/open the Program Manager user key */
+ if (RegCreateKeyExW(HKEY_CURRENT_USER,
+ L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Program Manager",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_READ | KEY_WRITE,
+ NULL,
+ &Globals.hKeyProgMan,
+ NULL) != ERROR_SUCCESS)
+ {
+ return FALSE;
+ }
+
+ /*
+ * TODO: Add the explanation for the migration...
+ */
+ dwSize = sizeof(Value);
+ lRet = RegQueryValueExW(Globals.hKeyProgMan, L"IniMigrated", NULL, &dwType, (LPBYTE)&Value, &dwSize);
+ if (lRet != ERROR_SUCCESS || dwType != REG_DWORD)
+ Value = 0;
+ bIsIniMigrated = !!Value;
+
+ if (bIsIniMigrated)
+ {
+ /* The migration was already done, just load the settings */
+ goto LoadSettings;
+ }
+
+ /* Perform the migration */
+
+ bIsIniMigrated = TRUE;
+ dwSize = ARRAYSIZE(dummy);
+ SetLastError(0);
+ GetPrivateProfileSectionW(L"Settings", dummy, dwSize, lpszIniFile);
+ if (GetLastError() == ERROR_FILE_NOT_FOUND)
+ goto MigrationDone;
+
+ SetLastError(0);
+ GetPrivateProfileSectionW(L"Groups", dummy, dwSize, lpszIniFile);
+ if (GetLastError() == ERROR_FILE_NOT_FOUND)
+ goto MigrationDone;
+
+ GetWindowsDirectoryW(szWinDir, ARRAYSIZE(szWinDir));
+ // NOTE: GCC complains we cannot use the "\u2022" (UNICODE Code Point) notation for specifying the bullet character,
+ // because it's only available in C++ or in C99. On the contrary MSVC is fine with it.
+ // Instead we use a hex specification for the character: "\x2022".
+ // Note also that the character "\x07" gives also a bullet, but a larger one.
+ PrintString(
+ L"The Program Manager has detected the presence of a legacy settings file PROGMAN.INI in the directory '%s' "
+ L"and is going to migrate its contents into the current-user Program Manager settings registry key:\n"
+ L"HKCU\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Program Manager"
+ L"\n\n"
+ L"\x2022 The migration operation will potentially overwrite all the existing current-user Program Manager settings in the registry by those stored in the PROGMAN.INI file.\n"
+ L"\n"
+ L"\x2022 The migration is done once, so that, at the next launch of the Program Manager, the new migrated settings are directly used.\n"
+ L"\n"
+ L"\x2022 It is possible to trigger later the migration by manually deleting the registry value \"IniMigrated\" under the current-user Program Manager settings registry key (specified above).\n"
+ L"\n"
+ L"Would you like to migrate its contents into the registry?",
+ szWinDir);
+
+ for (dwSize = BUFFER_SIZE; ; dwSize += BUFFER_SIZE)
+ {
+ lpszSections = Alloc(0, dwSize * sizeof(WCHAR));
+ dwRet = GetPrivateProfileSectionNamesW(lpszSections, dwSize, lpszIniFile);
+ if (dwRet < dwSize - 2)
+ break;
+ Free(lpszSections);
+ }
+ lpszSection = lpszSections;
+ while (*lpszSection)
+ {
+ lRet = RegCreateKeyExW(Globals.hKeyProgMan,
+ lpszSection,
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_WRITE,
+ NULL,
+ &hKey,
+ NULL);
+ if (lRet == ERROR_SUCCESS)
+ {
+ for (dwSize = BUFFER_SIZE; ; dwSize += BUFFER_SIZE)
+ {
+ lpszData = Alloc(0, dwSize * sizeof(WCHAR));
+ dwRet = GetPrivateProfileSectionW(lpszSection, lpszData, dwSize, lpszIniFile);
+ if (dwRet < dwSize - 2)
+ break;
+ Free(lpszData);
+ }
+ lpszKeyValue = lpszData;
+ while (*lpszKeyValue)
+ {
+ lpszKey = lpszKeyValue;
+ lpszValue = wcschr(lpszKeyValue, L'=');
+ lpszKeyValue += (wcslen(lpszKeyValue) + 1);
+ if (lpszValue)
+ {
+ *lpszValue = '\0';
+ ++lpszValue;
+ Value = wcstoul(lpszValue, &lpszTmp, 0);
+ if (lpszTmp - lpszValue >= wcslen(lpszValue))
+ {
+ lpszValue = (LPWSTR)&Value;
+ dwSize = sizeof(Value);
+ dwType = REG_DWORD;
+ }
+ else
+ {
+ dwSize = wcslen(lpszValue) * sizeof(WCHAR);
+ dwType = REG_SZ;
+ }
+ }
+ else
+ {
+ dwSize = 0;
+ dwType = REG_DWORD;
+ }
+ lRet = RegSetValueExW(hKey, lpszKey, 0, dwType, (LPBYTE)lpszValue, dwSize);
+ }
+ Free(lpszData);
+ RegCloseKey(hKey);
+ lpszSection += (wcslen(lpszSection) + 1);
+ }
+ }
+ Free(lpszSections);
+
+MigrationDone:
+ Value = TRUE;
+ RegSetValueExW(Globals.hKeyProgMan, L"IniMigrated", 0, REG_DWORD, (LPBYTE)&Value, sizeof(Value));
+
+
+LoadSettings:
+ /* Create the necessary registry keys for the Program Manager and load its settings from the registry */
+
+ lRet = RegCreateKeyExW(Globals.hKeyProgMan,
+ L"Settings",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_READ | KEY_WRITE,
+ NULL,
+ &Globals.hKeyPMSettings,
+ NULL);
+
+ lRet = RegCreateKeyExW(Globals.hKeyProgMan,
+ L"Common Groups",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_READ | KEY_WRITE,
+ NULL,
+ &Globals.hKeyPMCommonGroups,
+ NULL);
+
+ lRet = RegCreateKeyExW(Globals.hKeyProgMan,
+ L"Groups",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_READ | KEY_WRITE,
+ NULL,
+ &Globals.hKeyPMAnsiGroups,
+ NULL);
+
+ lRet = RegCreateKeyExW(Globals.hKeyProgMan,
+ L"UNICODE Groups",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_READ | KEY_WRITE,
+ NULL,
+ &Globals.hKeyPMUnicodeGroups,
+ NULL);
+
+ lRet = RegCreateKeyExW(HKEY_CURRENT_USER,
+ L"Program Groups",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_READ | KEY_WRITE,
+ NULL,
+ &Globals.hKeyAnsiGroups,
+ NULL);
+
+ lRet = RegCreateKeyExW(HKEY_CURRENT_USER,
+ L"UNICODE Program Groups",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_READ | KEY_WRITE,
+ NULL,
+ &Globals.hKeyUnicodeGroups,
+ NULL);
+
+ lRet = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
+ L"SOFTWARE\\Program Groups",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_READ | KEY_WRITE,
+ NULL,
+ &Globals.hKeyCommonGroups,
+ NULL);
+
+ dwSize = sizeof(Globals.bAutoArrange);
+ RegQueryValueExW(Globals.hKeyPMSettings, L"AutoArrange", NULL, &dwType, (LPBYTE)&Globals.bAutoArrange, &dwSize);
+
+ dwSize = sizeof(Globals.bMinOnRun);
+ RegQueryValueExW(Globals.hKeyPMSettings, L"MinOnRun", NULL, &dwType, (LPBYTE)&Globals.bMinOnRun, &dwSize);
+
+ dwSize = sizeof(Globals.bSaveSettings);
+ RegQueryValueExW(Globals.hKeyPMSettings, L"SaveSettings", NULL, &dwType, (LPBYTE)&Globals.bSaveSettings, &dwSize);
+
+ return TRUE;
+}
+
+static
+BOOL
+MAIN_SaveSettings(VOID)
+{
+ WINDOWPLACEMENT WndPl;
+ DWORD dwSize;
+ WCHAR buffer[100];
+
+ WndPl.length = sizeof(WndPl);
+ GetWindowPlacement(Globals.hMainWnd, &WndPl);
+ swprintf(buffer, L"%d %d %d %d %d",
+ WndPl.rcNormalPosition.left,
+ WndPl.rcNormalPosition.top,
+ WndPl.rcNormalPosition.right,
+ WndPl.rcNormalPosition.bottom,
+ WndPl.showCmd);
+
+ dwSize = wcslen(buffer) * sizeof(WCHAR);
+ RegSetValueExW(Globals.hKeyPMSettings, L"Window", 0, REG_SZ, (LPBYTE)buffer, dwSize);
+
+ return TRUE;
+}
-#define BUFFER_SIZE 1000
/***********************************************************************
*
* WinMain
*/
-#ifdef __REACTOS__
-int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
-#else
-int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
-#endif
+INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, INT nCmdShow)
{
- MSG msg;
+ MSG msg;
+ INITCOMMONCONTROLSEX icex;
- Globals.lpszIniFile = "progman.ini";
-#ifndef __REACTOS__
- Globals.lpszIcoFile = "progman.ico";
-#endif
+ /*
+ * Set our shutdown parameters: we want to shutdown the very last,
+ * but before any TaskMgr instance (which has a shutdown level of 1).
+ */
+ SetProcessShutdownParameters(2, 0);
- Globals.hInstance = hInstance;
- Globals.hGroups = 0;
- Globals.hActiveGroup = 0;
-
- /* Read Options from `progman.ini' */
- Globals.bAutoArrange =
- GetPrivateProfileIntA("Settings", "AutoArrange", 0, Globals.lpszIniFile);
- Globals.bMinOnRun =
- GetPrivateProfileIntA("Settings", "MinOnRun", 0, Globals.lpszIniFile);
- Globals.bSaveSettings =
- GetPrivateProfileIntA("Settings", "SaveSettings", 0, Globals.lpszIniFile);
-
- /* Load default icons */
-#ifdef __REACTOS__
- Globals.hMainIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_APPICON));
- Globals.hGroupIcon = Globals.hMainIcon;
- Globals.hDefaultIcon = Globals.hMainIcon;
-#else
- Globals.hMainIcon = ExtractIconA(Globals.hInstance, Globals.lpszIcoFile, 0);
- Globals.hGroupIcon = ExtractIconA(Globals.hInstance, Globals.lpszIcoFile, 0);
- Globals.hDefaultIcon = ExtractIconA(Globals.hInstance, Globals.lpszIcoFile, 0);
-#endif
- if (!Globals.hMainIcon) Globals.hMainIcon = LoadIconW(0, (LPWSTR)DEFAULTICON);
- if (!Globals.hGroupIcon) Globals.hGroupIcon = LoadIconW(0, (LPWSTR)DEFAULTICON);
- if (!Globals.hDefaultIcon) Globals.hDefaultIcon = LoadIconW(0, (LPWSTR)DEFAULTICON);
+ Globals.hInstance = hInstance;
+ Globals.hGroups = NULL;
+ Globals.hActiveGroup = NULL;
- /* Register classes */
- if (!prev)
+ /* Load Program Manager's settings */
+ MAIN_LoadSettings();
+
+ /* Load the default icons */
+ Globals.hPersonalGroupIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_GROUP_PERSONAL_ICON));
+ Globals.hCommonGroupIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_GROUP_COMMON_ICON));
+ Globals.hDefaultIcon = LoadIconW(NULL, MAKEINTRESOURCEW(IDI_WINLOGO));
+
+ // Globals.hMainIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_APPICON));
+
+ /* Initialize the common controls */
+ icex.dwSize = sizeof(icex);
+ icex.dwICC = ICC_HOTKEY_CLASS | ICC_LISTVIEW_CLASSES; // | ICC_STANDARD_CLASSES;
+ InitCommonControlsEx(&icex);
+
+ /* Register the window classes */
+ if (!hPrevInstance) // FIXME: Unused on Win32!
{
- if (!MAIN_RegisterMainWinClass()) return(FALSE);
- if (!GROUP_RegisterGroupWinClass()) return(FALSE);
- if (!PROGRAM_RegisterProgramWinClass()) return(FALSE);
+ if (!MAIN_RegisterMainWinClass()) goto Quit;
+ if (!GROUP_RegisterGroupWinClass()) goto Quit;
}
- /* Create main window */
- MAIN_CreateMainWindow();
- Globals.hAccel = LoadAcceleratorsW(Globals.hInstance, MAKEINTRESOURCEW(IDA_ACCEL));
+ /* Set up the strings, the main window, the accelerators, the menu, and the MDI child window */
+ STRING_LoadStrings();
+ MAIN_CreateMainWindow();
+ Globals.hAccel = LoadAcceleratorsW(Globals.hInstance, MAKEINTRESOURCEW(IDA_ACCEL));
+ STRING_LoadMenus();
+ MAIN_CreateMDIWindow();
- /* Setup menu, stringtable and resourcenames */
- STRING_LoadMenus();
+ /* Load all the groups */
+ // MAIN_CreateGroups();
+ MAIN_LoadGroups();
- MAIN_CreateMDIWindow();
+ /* Load the Startup group: start the initial applications */
+ MAIN_AutoStart();
- /* Initialize groups */
- MAIN_CreateGroups();
+ /* Message loop */
+ while (GetMessageW(&msg, NULL, 0, 0))
+ {
+ if (!TranslateMDISysAccel(Globals.hMDIWnd, &msg) &&
+ !TranslateAcceleratorW(Globals.hMainWnd, Globals.hAccel, &msg))
+ {
+ TranslateMessage(&msg);
+ DispatchMessageW(&msg);
+ }
+ }
- /* Start initial applications */
- MAIN_AutoStart();
+Quit:
- /* Message loop */
- while (GetMessageW (&msg, 0, 0, 0))
- if (!TranslateAcceleratorW(Globals.hMainWnd, Globals.hAccel, &msg))
- {
- TranslateMessage (&msg);
- DispatchMessageW (&msg);
- }
- return 0;
+ /* Save the settings, close the registry keys and quit */
+
+ // MAIN_SaveSettings();
+ RegCloseKey(Globals.hKeyCommonGroups);
+ RegCloseKey(Globals.hKeyUnicodeGroups);
+ RegCloseKey(Globals.hKeyAnsiGroups);
+ RegCloseKey(Globals.hKeyPMUnicodeGroups);
+ RegCloseKey(Globals.hKeyPMAnsiGroups);
+ RegCloseKey(Globals.hKeyPMCommonGroups);
+ RegCloseKey(Globals.hKeyPMSettings);
+ RegCloseKey(Globals.hKeyProgMan);
+
+ return 0;
}
/***********************************************************************
* MAIN_CreateGroups
*/
-static VOID MAIN_CreateGroups(void)
+#if 0
+static VOID MAIN_CreateGroups(VOID)
{
CHAR buffer[BUFFER_SIZE];
CHAR szPath[MAX_PATHNAME_LEN];
}
/* FIXME initialize other groups, not enumerated by `Order' */
}
+#endif
+
+static VOID MAIN_LoadGroups(VOID)
+{
+}
/***********************************************************************
*
* MAIN_AutoStart
*/
-VOID MAIN_AutoStart(void)
+static VOID MAIN_AutoStart(VOID)
{
- CHAR buffer[BUFFER_SIZE];
- HLOCAL hGroup, hProgram;
+ LONG lRet;
+ DWORD dwSize;
+ DWORD dwType;
+
+ PROGGROUP* hGroup;
+ PROGRAM* hProgram;
- GetPrivateProfileStringA("Settings", "AutoStart", "Autostart", buffer,
- sizeof(buffer), Globals.lpszIniFile);
+ WCHAR buffer[BUFFER_SIZE];
- for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup))
- if (!lstrcmpA(buffer, GROUP_GroupName(hGroup)))
- for (hProgram = PROGRAM_FirstProgram(hGroup); hProgram;
- hProgram = PROGRAM_NextProgram(hProgram))
- PROGRAM_ExecuteProgram(hProgram);
+ dwSize = sizeof(buffer);
+ lRet = RegQueryValueExW(Globals.hKeyPMSettings, L"Startup", NULL, &dwType, (LPBYTE)buffer, &dwSize);
+ if (lRet != ERROR_SUCCESS || dwType != REG_SZ)
+ return;
+
+ for (hGroup = Globals.hGroups; hGroup; hGroup = hGroup->hNext)
+ {
+ if (_wcsicmp(buffer, hGroup->hName) == 0)
+ {
+ for (hProgram = hGroup->hPrograms; hProgram; hProgram = hProgram->hNext)
+ PROGRAM_ExecuteProgram(hProgram);
+ }
+ }
}
/***********************************************************************
* MAIN_MainWndProc
*/
-static LRESULT CALLBACK MAIN_MainWndProc(HWND hWnd, UINT msg,
- WPARAM wParam, LPARAM lParam)
+static LRESULT CALLBACK MAIN_MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (msg)
+ switch (uMsg)
{
- case WM_INITMENU:
- CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE,
- MF_BYCOMMAND | (Globals.bAutoArrange ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN,
- MF_BYCOMMAND | (Globals.bMinOnRun ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS,
- MF_BYCOMMAND | (Globals.bSaveSettings ? MF_CHECKED : MF_UNCHECKED));
- break;
-
- case WM_COMMAND:
- if (LOWORD(wParam) < PM_FIRST_CHILD){
- MAIN_MenuCommand(hWnd, LOWORD(wParam), lParam);
- }
- break;
-
- case WM_DESTROY:
- PostQuitMessage (0);
- break;
+ case WM_INITMENU:
+ {
+ PROGGROUP* hActiveGroup = GROUP_ActiveGroup();
+ if (hActiveGroup)
+ {
+ if (PROGRAM_ActiveProgram(hActiveGroup))
+ {
+ EnableMenuItem(Globals.hFileMenu, PM_OPEN, MF_ENABLED);
+ EnableMenuItem(Globals.hFileMenu, PM_MOVE, MF_ENABLED);
+ EnableMenuItem(Globals.hFileMenu, PM_COPY, MF_ENABLED);
+ EnableMenuItem(Globals.hFileMenu, PM_DELETE , MF_ENABLED);
+ EnableMenuItem(Globals.hFileMenu, PM_ATTRIBUTES, MF_ENABLED);
+ }
+ else
+ {
+ if (!hActiveGroup->hWnd || IsIconic(hActiveGroup->hWnd))
+ EnableMenuItem(Globals.hFileMenu, PM_OPEN, MF_ENABLED);
+ else
+ EnableMenuItem(Globals.hFileMenu, PM_OPEN, MF_GRAYED);
+
+ EnableMenuItem(Globals.hFileMenu, PM_MOVE, MF_GRAYED);
+ EnableMenuItem(Globals.hFileMenu, PM_COPY, MF_GRAYED);
+ EnableMenuItem(Globals.hFileMenu, PM_DELETE , MF_ENABLED);
+ EnableMenuItem(Globals.hFileMenu, PM_ATTRIBUTES, MF_ENABLED);
+ }
+ }
+ else
+ {
+ EnableMenuItem(Globals.hFileMenu, PM_OPEN, MF_GRAYED);
+ EnableMenuItem(Globals.hFileMenu, PM_MOVE, MF_GRAYED);
+ EnableMenuItem(Globals.hFileMenu, PM_COPY, MF_GRAYED);
+ EnableMenuItem(Globals.hFileMenu, PM_DELETE , MF_GRAYED);
+ EnableMenuItem(Globals.hFileMenu, PM_ATTRIBUTES, MF_GRAYED);
+ }
+
+ CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE,
+ MF_BYCOMMAND | (Globals.bAutoArrange ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN,
+ MF_BYCOMMAND | (Globals.bMinOnRun ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS,
+ MF_BYCOMMAND | (Globals.bSaveSettings ? MF_CHECKED : MF_UNCHECKED));
+ break;
+ }
+
+ case WM_DESTROY:
+ if (Globals.bSaveSettings)
+ MAIN_SaveSettings();
+ PostQuitMessage(0);
+ break;
+
+ case WM_COMMAND:
+ if (LOWORD(wParam) < PM_FIRST_CHILD)
+ MAIN_MenuCommand(hWnd, LOWORD(wParam), lParam);
+ break;
}
- return DefFrameProcW(hWnd, Globals.hMDIWnd, msg, wParam, lParam);
+
+ return DefFrameProcW(hWnd, Globals.hMDIWnd, uMsg, wParam, lParam);
}
+
/***********************************************************************
*
* MAIN_MenuCommand
static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
+#if 0
HLOCAL hActiveGroup = GROUP_ActiveGroup();
HLOCAL hActiveProgram = PROGRAM_ActiveProgram(hActiveGroup);
HWND hActiveGroupWnd = GROUP_GroupWnd(hActiveGroup);
}
break;
- case PM_OPEN:
- if (hActiveProgram)
- PROGRAM_ExecuteProgram(hActiveProgram);
- else if (hActiveGroupWnd)
- OpenIcon(hActiveGroupWnd);
- break;
-
- case PM_MOVE:
- case PM_COPY:
- if (hActiveProgram)
- PROGRAM_CopyMoveProgram(hActiveProgram, wParam == PM_MOVE);
- break;
case PM_DELETE:
if (hActiveProgram)
}
break;
- case PM_ATTRIBUTES:
- if (hActiveProgram)
- PROGRAM_ModifyProgram(hActiveProgram);
- else if (hActiveGroup)
- GROUP_ModifyGroup(hActiveGroup);
- break;
-
- case PM_EXECUTE:
- DIALOG_Execute();
- break;
- case PM_EXIT:
- PostQuitMessage(0);
- break;
-
- /* Menu Options */
- case PM_AUTO_ARRANGE:
- Globals.bAutoArrange = !Globals.bAutoArrange;
- CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE,
- MF_BYCOMMAND | (Globals.bAutoArrange ?
- MF_CHECKED : MF_UNCHECKED));
- WritePrivateProfileStringA("Settings", "AutoArrange",
- Globals.bAutoArrange ? "1" : "0",
- Globals.lpszIniFile);
- WritePrivateProfileStringA(NULL,NULL,NULL,Globals.lpszIniFile); /* flush it */
- break;
-
- case PM_MIN_ON_RUN:
- Globals.bMinOnRun = !Globals.bMinOnRun;
- CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN,
- MF_BYCOMMAND | (Globals.bMinOnRun ?
- MF_CHECKED : MF_UNCHECKED));
- WritePrivateProfileStringA("Settings", "MinOnRun",
- Globals.bMinOnRun ? "1" : "0",
- Globals.lpszIniFile);
- WritePrivateProfileStringA(NULL,NULL,NULL,Globals.lpszIniFile); /* flush it */
- break;
case PM_SAVE_SETTINGS:
Globals.bSaveSettings = !Globals.bSaveSettings;
WritePrivateProfileStringA(NULL,NULL,NULL,Globals.lpszIniFile); /* flush it */
break;
- /* Menu Windows */
- case PM_OVERLAP:
- SendMessageW(Globals.hMDIWnd, WM_MDICASCADE, 0, 0);
- break;
-
- case PM_SIDE_BY_SIDE:
- SendMessageW(Globals.hMDIWnd, WM_MDITILE, MDITILE_VERTICAL, 0);
- break;
case PM_ARRANGE:
SendMessageW(Globals.hMDIWnd, WM_MDIICONARRANGE, 0, 0);
break;
- /* Menu Help */
- case PM_CONTENTS:
- if (!WinHelpA(Globals.hMainWnd, "progman.hlp", HELP_CONTENTS, 0))
- MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK);
- break;
-
- case PM_ABOUT_WINE:
-#ifdef __REACTOS__
- {
- WCHAR szTitle[MAX_STRING_LEN];
- LoadStringW(Globals.hInstance, IDS_PROGRAM_MANAGER, szTitle, ARRAYSIZE(szTitle));
- ShellAboutW(hWnd, szTitle, NULL, NULL);
- break;
}
-#else
- ShellAboutA(hWnd, "WINE", "Program Manager", 0);
- break;
+
+
+
+
#endif
- default:
- MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
- break;
+ DWORD Value;
+
+ PROGGROUP* hActiveGroup;
+ PROGRAM* hActiveProgram;
+ HWND hActiveGroupWnd;
+
+ hActiveGroup = GROUP_ActiveGroup();
+ hActiveProgram = PROGRAM_ActiveProgram(hActiveGroup);
+ hActiveGroupWnd = (hActiveGroup ? hActiveGroup->hWnd : NULL);
+
+ switch (wParam)
+ {
+ /* Menu File */
+
+ case PM_NEW:
+ {
+ BOOL Success;
+ INT nResult;
+
+ if (!hActiveGroupWnd || IsIconic(hActiveGroupWnd))
+ Success = DIALOG_New(PM_NEW_GROUP, &nResult);
+ else
+ Success = DIALOG_New(PM_NEW_PROGRAM, &nResult);
+ if (!Success)
+ break;
+
+ if (nResult & 1)
+ {
+ GROUPFORMAT format;
+ BOOL bIsCommonGroup;
+
+ format = (nResult & 0xC) >> 2;
+ bIsCommonGroup = (nResult & 2) != 0;
+ GROUP_NewGroup(format, bIsCommonGroup);
+ }
+ else if (hActiveGroup)
+ {
+ PROGRAM_NewProgram(hActiveGroup);
+ }
+
+ break;
+ }
+
+ case PM_OPEN:
+ if (hActiveProgram)
+ PROGRAM_ExecuteProgram(hActiveProgram);
+ else if (hActiveGroupWnd)
+ OpenIcon(hActiveGroupWnd);
+ break;
+
+ case PM_MOVE:
+ case PM_COPY:
+ if (hActiveProgram)
+ PROGRAM_CopyMoveProgram(hActiveProgram, wParam == PM_MOVE);
+ break;
+
+ case PM_DELETE:
+ {
+ if (hActiveProgram)
+ {
+ if (DIALOG_Delete(IDS_DELETE_PROGRAM_s, hActiveProgram->hName))
+ PROGRAM_DeleteProgram(hActiveProgram, TRUE);
+ }
+ else if (hActiveGroup && DIALOG_Delete(IDS_DELETE_GROUP_s, hActiveGroup->hName))
+ {
+ GROUP_DeleteGroup(hActiveGroup);
+ }
+ break;
+ }
+
+ case PM_ATTRIBUTES:
+ if (hActiveProgram)
+ PROGRAM_ModifyProgram(hActiveProgram);
+ else if (hActiveGroup)
+ GROUP_ModifyGroup(hActiveGroup);
+ break;
+
+ case PM_EXECUTE:
+ DIALOG_Execute();
+ break;
+
+ case PM_EXIT:
+ // MAIN_SaveSettings();
+ PostQuitMessage(0);
+ break;
+
+
+ /* Menu Options */
+
+ case PM_AUTO_ARRANGE:
+ Globals.bAutoArrange = !Globals.bAutoArrange;
+ CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE,
+ MF_BYCOMMAND | (Globals.bAutoArrange ? MF_CHECKED : MF_UNCHECKED));
+ Value = Globals.bAutoArrange;
+ RegSetValueExW(Globals.hKeyPMSettings, L"AutoArrange", 0, REG_DWORD, (LPBYTE)&Value, sizeof(Value));
+ break;
+
+ case PM_MIN_ON_RUN:
+ Globals.bMinOnRun = !Globals.bMinOnRun;
+ CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN,
+ MF_BYCOMMAND | (Globals.bMinOnRun ? MF_CHECKED : MF_UNCHECKED));
+ Value = Globals.bMinOnRun;
+ RegSetValueExW(Globals.hKeyPMSettings, L"MinOnRun", 0, REG_DWORD, (LPBYTE)&Value, sizeof(Value));
+ break;
+
+ case PM_SAVE_SETTINGS:
+ Globals.bSaveSettings = !Globals.bSaveSettings;
+ CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS,
+ MF_BYCOMMAND | (Globals.bSaveSettings ? MF_CHECKED : MF_UNCHECKED));
+ Value = Globals.bSaveSettings;
+ RegSetValueExW(Globals.hKeyPMSettings, L"SaveSettings", 0, REG_DWORD, (LPBYTE)&Value, sizeof(Value));
+ break;
+
+ case PM_SAVE_SETTINGS_NOW:
+ MAIN_SaveSettings();
+ break;
+
+
+ /* Menu Windows */
+
+ case PM_OVERLAP:
+ SendMessageW(Globals.hMDIWnd, WM_MDICASCADE, 0, 0);
+ break;
+
+ case PM_SIDE_BY_SIDE:
+ SendMessageW(Globals.hMDIWnd, WM_MDITILE, MDITILE_VERTICAL, 0);
+ break;
+
+ case PM_ARRANGE:
+ if (!hActiveGroupWnd || IsIconic(hActiveGroupWnd))
+ SendMessageW(Globals.hMDIWnd, WM_MDIICONARRANGE, 0, 0);
+ else
+ SendMessageA(hActiveGroup->hListView, LVM_ARRANGE, 0, 0);
+ break;
+
+
+ /* Menu Help */
+
+ case PM_CONTENTS:
+ if (!WinHelpW(Globals.hMainWnd, L"progman.hlp", HELP_CONTENTS, 0))
+ MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK);
+ break;
+
+ case PM_ABOUT:
+ ShellAboutW(hWnd, szTitle, NULL, NULL);
+ break;
+
+ default:
+ MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
+ break;
}
+
}
/***********************************************************************
* MAIN_RegisterMainWinClass
*/
-static ATOM MAIN_RegisterMainWinClass(void)
+static ATOM MAIN_RegisterMainWinClass(VOID)
{
- WNDCLASSW class;
-
- class.style = CS_HREDRAW | CS_VREDRAW;
- class.lpfnWndProc = MAIN_MainWndProc;
- class.cbClsExtra = 0;
- class.cbWndExtra = 0;
- class.hInstance = Globals.hInstance;
- class.hIcon = Globals.hMainIcon;
- class.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW);
- class.hbrBackground = GetStockObject (NULL_BRUSH);
- class.lpszMenuName = 0;
- class.lpszClassName = STRING_MAIN_WIN_CLASS_NAME;
-
- return RegisterClassW(&class);
+ WNDCLASSW wndClass;
+
+ wndClass.style = CS_HREDRAW | CS_VREDRAW;
+ wndClass.lpfnWndProc = MAIN_MainWndProc;
+ wndClass.cbClsExtra = 0;
+ wndClass.cbWndExtra = 0;
+ wndClass.hInstance = Globals.hInstance;
+ wndClass.hIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_APPICON));
+ wndClass.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_ARROW));
+ wndClass.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
+ wndClass.lpszMenuName = NULL;
+ wndClass.lpszClassName = STRING_MAIN_WIN_CLASS_NAME;
+
+ return RegisterClassW(&wndClass);
}
/***********************************************************************
* MAIN_CreateMainWindow
*/
-static VOID MAIN_CreateMainWindow(void)
+static VOID MAIN_CreateMainWindow(VOID)
{
- INT left , top, right, bottom, width, height, show;
- CHAR buffer[100];
-
- Globals.hMDIWnd = 0;
- Globals.hMainMenu = 0;
-
- /* Get the geometry of the main window */
- GetPrivateProfileStringA("Settings", "Window", "", buffer, sizeof(buffer), Globals.lpszIniFile);
- if (5 == sscanf(buffer, "%d %d %d %d %d", &left, &top, &right, &bottom, &show))
- {
- width = right - left;
- height = bottom - top;
- }
- else
- {
- left = top = width = height = CW_USEDEFAULT;
- show = SW_SHOWNORMAL;
- }
-
- /* Create main Window */
- Globals.hMainWnd =
- CreateWindowW(STRING_MAIN_WIN_CLASS_NAME, NULL,
- WS_OVERLAPPEDWINDOW, left, top, width, height,
- 0, 0, Globals.hInstance, 0);
-
- ShowWindow (Globals.hMainWnd, show);
- UpdateWindow (Globals.hMainWnd);
+ INT left, top, right, bottom;
+ INT width, height;
+ INT nCmdShow;
+ WCHAR buffer[100];
+
+ LONG lRet;
+ DWORD dwSize;
+ DWORD dwType;
+
+ Globals.hMDIWnd = NULL;
+ Globals.hMainMenu = NULL;
+
+ /* Get the geometry of the main window */
+ dwSize = sizeof(buffer);
+ lRet = RegQueryValueExW(Globals.hKeyPMSettings, L"Window", NULL, &dwType, (LPBYTE)buffer, &dwSize);
+ if (lRet != ERROR_SUCCESS || dwType != REG_SZ)
+ buffer[0] = '\0';
+
+ if (swscanf(buffer, L"%d %d %d %d %d", &left, &top, &right, &bottom, &nCmdShow) == 5)
+ {
+ width = right - left;
+ height = bottom - top;
+ }
+ else
+ {
+ left = top = width = height = CW_USEDEFAULT;
+ nCmdShow = SW_SHOWNORMAL;
+ }
+
+ /* Create the main window */
+ Globals.hMainWnd =
+ CreateWindowW(STRING_MAIN_WIN_CLASS_NAME,
+ szTitle,
+ WS_OVERLAPPEDWINDOW, // /* | WS_CLIPSIBLINGS | WS_CLIPCHILDREN */
+ left, top, width, height,
+ NULL, NULL,
+ Globals.hInstance,
+ NULL);
+
+ MAIN_SetMainWindowTitle();
+ ShowWindow(Globals.hMainWnd, nCmdShow);
+ UpdateWindow(Globals.hMainWnd);
}
/***********************************************************************
* MAIN_CreateMDIWindow
*/
-static VOID MAIN_CreateMDIWindow(void)
+static VOID MAIN_CreateMDIWindow(VOID)
{
- CLIENTCREATESTRUCT ccs;
- RECT rect;
+ CLIENTCREATESTRUCT ccs;
+ RECT rect;
+
+ /* Get the geometry of the MDI window */
+ GetClientRect(Globals.hMainWnd, &rect);
- /* Get the geometry of the MDI window */
- GetClientRect(Globals.hMainWnd, &rect);
+ ccs.hWindowMenu = Globals.hWindowsMenu;
+ ccs.idFirstChild = PM_FIRST_CHILD;
- ccs.hWindowMenu = Globals.hWindowsMenu;
- ccs.idFirstChild = PM_FIRST_CHILD;
+ /* Create MDI Window */
+ Globals.hMDIWnd =
+ CreateWindowW(WC_MDICLIENT, NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL, // WS_CHILDWINDOW | ...
+ rect.left, rect.top,
+ rect.right - rect.left, rect.bottom - rect.top,
+ Globals.hMainWnd, 0,
+ Globals.hInstance, &ccs);
- /* Create MDI Window */
- Globals.hMDIWnd =
- CreateWindowW(STRING_MDI_WIN_CLASS_NAME, NULL,
- WS_CHILD, rect.left, rect.top,
- rect.right - rect.left, rect.bottom - rect.top,
- Globals.hMainWnd, 0,
- Globals.hInstance, &ccs);
+ /* Reset the background of the MDI client window (default: COLOR_APPWORKSPACE + 1) */
+ SetClassLongPtrW(Globals.hMDIWnd, GCLP_HBRBACKGROUND, (COLOR_WINDOW + 1));
- ShowWindow (Globals.hMDIWnd, SW_SHOW);
- UpdateWindow (Globals.hMDIWnd);
+ ShowWindow(Globals.hMDIWnd, SW_SHOW);
+ UpdateWindow(Globals.hMDIWnd);
}
/**********************************************************************/
*/
INT MAIN_MessageBoxIDS(UINT ids_text, UINT ids_title, WORD type)
{
- CHAR text[MAX_STRING_LEN];
- CHAR title[MAX_STRING_LEN];
+ WCHAR text[MAX_STRING_LEN];
+ WCHAR title[MAX_STRING_LEN];
- LoadStringA(Globals.hInstance, ids_text, text, sizeof(text));
- LoadStringA(Globals.hInstance, ids_title, title, sizeof(title));
+ LoadStringW(Globals.hInstance, ids_text , text , ARRAYSIZE(text));
+ LoadStringW(Globals.hInstance, ids_title, title, ARRAYSIZE(title));
- return(MessageBoxA(Globals.hMainWnd, text, title, type));
+ return MessageBoxW(Globals.hMainWnd, text, title, type);
}
/***********************************************************************
*
* MAIN_MessageBoxIDS_s
*/
-INT MAIN_MessageBoxIDS_s(UINT ids_text, LPCSTR str, UINT ids_title, WORD type)
+INT MAIN_MessageBoxIDS_s(UINT ids_text, LPCWSTR str, UINT ids_title, WORD type)
{
- CHAR text[MAX_STRING_LEN];
- CHAR title[MAX_STRING_LEN];
- CHAR newtext[MAX_STRING_LEN + MAX_PATHNAME_LEN];
+ WCHAR text[MAX_STRING_LEN];
+ WCHAR title[MAX_STRING_LEN];
+ WCHAR newtext[MAX_STRING_LEN + MAX_PATHNAME_LEN];
- LoadStringA(Globals.hInstance, ids_text, text, sizeof(text));
- LoadStringA(Globals.hInstance, ids_title, title, sizeof(title));
- wsprintfA(newtext, text, str);
+ LoadStringW(Globals.hInstance, ids_text , text , ARRAYSIZE(text));
+ LoadStringW(Globals.hInstance, ids_title, title, ARRAYSIZE(title));
+ wsprintfW(newtext, text, str);
- return(MessageBoxA(Globals.hMainWnd, newtext, title, type));
+ return MessageBoxW(Globals.hMainWnd, newtext, title, type);
}
/***********************************************************************
* MAIN_ReplaceString
*/
-VOID MAIN_ReplaceString(HLOCAL *handle, LPSTR replace)
+VOID MAIN_ReplaceString(LPWSTR* string, LPWSTR replace)
{
- HLOCAL newhandle = LocalAlloc(LMEM_FIXED, strlen(replace) + 1);
- if (newhandle)
+ LPWSTR newstring;
+
+ newstring = Alloc(HEAP_ZERO_MEMORY, (wcslen(replace) + 1) * sizeof(WCHAR));
+ if (newstring)
+ {
+ wcscpy(newstring, replace);
+ *string = newstring;
+ }
+ else
{
- LPSTR newstring = LocalLock(newhandle);
- strcpy(newstring, replace);
- LocalFree(*handle);
- *handle = newhandle;
+ MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
}
- else MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
}
--- /dev/null
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource_2.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Anglais (États-Unis) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource_2.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_NEW DIALOGEX 0, 0, 240, 70
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "New Object"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "",IDC_STATIC,5,5,165,44
+ CONTROL "Program &Group",PM_NEW_GROUP,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,10,4,66,11
+ CONTROL "&Personal",PM_PERSONAL_GROUP,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,20,15,44,14
+ CONTROL "&Common",PM_COMMON_GROUP,"Button",BS_AUTORADIOBUTTON,73,15,39,14
+ LTEXT "&Format:",PM_FORMAT_TXT,20,33,35,11
+ COMBOBOX PM_FORMAT,61,31,104,15,CBS_DROPDOWNLIST | WS_TABSTOP
+ CONTROL "Program &Item",PM_NEW_PROGRAM,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,10,52,59,12
+ DEFPUSHBUTTON "OK",IDOK,175,5,60,15
+ PUSHBUTTON "Cancel",IDCANCEL,175,25,60,15
+ PUSHBUTTON "&Help",IDHELP,175,49,60,15
+END
+
+IDD_COPY_MOVE DIALOGEX 0, 0, 250, 65
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Copy Program"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "Copy program:",PM_COPY_MOVE_TXT,5,5,70,10
+ LTEXT "P",PM_PROGRAM,80,5,100,10
+ LTEXT "From group:",IDC_STATIC,5,18,70,10
+ LTEXT "G",PM_FROM_GROUP,80,18,100,10
+ LTEXT "&To group:",IDC_STATIC,5,32,70,10
+ COMBOBOX PM_TO_GROUP,5,46,140,50,CBS_DROPDOWNLIST | WS_TABSTOP
+ DEFPUSHBUTTON "OK",IDOK,185,5,60,15
+ PUSHBUTTON "Cancel",IDCANCEL,185,25,60,15
+ PUSHBUTTON "&Help",IDHELP,185,45,60,15
+END
+
+IDD_GROUP DIALOGEX 0, 0, 250, 65
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Program Group Attributes"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "&Description:",IDC_STATIC,5,16,50,11
+ EDITTEXT PM_DESCRIPTION,60,14,120,15,ES_AUTOHSCROLL
+ LTEXT "&Group file:",IDC_STATIC,5,38,50,11
+ EDITTEXT PM_FILE,60,35,120,15,ES_AUTOHSCROLL
+ DEFPUSHBUTTON "OK",IDOK,185,5,60,15
+ PUSHBUTTON "Cancel",IDCANCEL,185,25,60,15
+ PUSHBUTTON "&Help",IDHELP,185,45,60,15
+END
+
+IDD_PROGRAM DIALOGEX 0, 0, 270, 105
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Program Attributes"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "&Description:",IDC_STATIC,5,11,65,10
+ EDITTEXT PM_DESCRIPTION,75,7,115,15,ES_AUTOHSCROLL
+ LTEXT "&Command line:",IDC_STATIC,5,26,65,10
+ EDITTEXT PM_COMMAND_LINE,75,23,115,15,ES_AUTOHSCROLL
+ LTEXT "&Working directory:",IDC_STATIC,5,41,65,10
+ EDITTEXT PM_DIRECTORY,75,39,115,15,ES_AUTOHSCROLL
+ LTEXT "&Key combination:",IDC_STATIC,5,56,65,10
+ CONTROL "",PM_HOT_KEY,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,75,55,115,15
+ ICON "",PM_ICON,24,72,20,20
+ CHECKBOX "&Run minimized",PM_SYMBOL,75,74,115,10
+ CONTROL "Run in separate &memory space",PM_NEW_VDM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,75,87,115,11
+ DEFPUSHBUTTON "OK",IDOK,195,5,70,15
+ PUSHBUTTON "Cancel",IDCANCEL,195,25,70,15
+ PUSHBUTTON "&Browse...",PM_BROWSE,195,45,70,15
+ PUSHBUTTON "Change &icon...",PM_OTHER_SYMBOL,195,65,70,15
+ PUSHBUTTON "&Help",IDHELP,195,85,70,15
+END
+
+IDD_SYMBOL DIALOGEX 0, 0, 240, 85
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Change Icon"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "&Filename:",IDC_STATIC,5,11,50,10
+ EDITTEXT PM_ICON_FILE,60,9,110,15,ES_AUTOHSCROLL
+ LTEXT "Current &icon:",IDC_STATIC,5,32,50,10
+ DEFPUSHBUTTON "OK",IDOK,175,5,60,15
+ PUSHBUTTON "Cancel",IDCANCEL,175,25,60,15
+ PUSHBUTTON "&Browse...",PM_BROWSE,175,45,60,15
+ PUSHBUTTON "&Help",IDHELP,175,65,60,15
+ LISTBOX PM_SYMBOL_LIST,5,45,165,35,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
+END
+
+IDD_EXECUTE DIALOGEX 0, 0, 200, 85
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Execute Program"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "&Command line:",IDC_STATIC,5,15,125,10
+ COMBOBOX PM_COMMAND,5,26,125,15,CBS_DROPDOWN | CBS_HASSTRINGS | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ CHECKBOX "&Run minimized",PM_SYMBOL,5,46,115,10
+ CONTROL "Run in separate &memory space",PM_NEW_VDM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,59,115,11
+ DEFPUSHBUTTON "OK",IDOK,135,5,60,15
+ PUSHBUTTON "Cancel",IDCANCEL,135,25,60,15
+ PUSHBUTTON "&Browse...",PM_BROWSE,135,45,60,15
+ PUSHBUTTON "&Help",IDHELP,135,65,60,15
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+MAIN_MENU MENU
+BEGIN
+ POPUP "&File"
+ BEGIN
+ MENUITEM "&New...", PM_NEW
+ MENUITEM "O&pen\tEnter", PM_OPEN
+ MENUITEM "&Move...\tF7", PM_MOVE
+ MENUITEM "&Copy...\tF8", PM_COPY
+ MENUITEM "&Delete\tDel", PM_DELETE
+ MENUITEM "&Properties\tAlt+Enter", PM_ATTRIBUTES
+ MENUITEM SEPARATOR
+ MENUITEM "&Execute...", PM_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "E&xit Windows", PM_EXIT
+ END
+ POPUP "&Options"
+ BEGIN
+ MENUITEM "&Arrange automatically", PM_AUTO_ARRANGE
+ MENUITEM "&Minimize on run", PM_MIN_ON_RUN
+ MENUITEM "&Save settings on exit", PM_SAVE_SETTINGS
+ MENUITEM SEPARATOR
+ MENUITEM "Save settings &now", PM_SAVE_SETTINGS_NOW
+ END
+ POPUP "&Windows"
+ BEGIN
+ MENUITEM "&Overlapped\tShift+F5", PM_OVERLAP
+ MENUITEM "&Side by side\tShift+F4", PM_SIDE_BY_SIDE
+ MENUITEM "&Arrange Icons", PM_ARRANGE
+ END
+ POPUP "&Help"
+ BEGIN
+ MENUITEM "&Contents\tF1", PM_CONTENTS
+ MENUITEM "&About Program Manager", PM_ABOUT
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDA_ACCEL ACCELERATORS
+BEGIN
+ VK_RETURN, PM_ATTRIBUTES, VIRTKEY, ALT, NOINVERT
+ VK_F1, PM_CONTENTS, VIRTKEY, NOINVERT
+ VK_F4, PM_SIDE_BY_SIDE, VIRTKEY, SHIFT, NOINVERT
+ VK_F5, PM_OVERLAP, VIRTKEY, SHIFT, NOINVERT
+ VK_F7, PM_MOVE, VIRTKEY, NOINVERT
+ VK_F8, PM_COPY, VIRTKEY, NOINVERT
+ VK_DELETE, PM_DELETE, VIRTKEY, NOINVERT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_NEW, DIALOG
+ BEGIN
+ END
+
+ IDD_COPY_MOVE, DIALOG
+ BEGIN
+ END
+
+ IDD_GROUP, DIALOG
+ BEGIN
+ END
+
+ IDD_PROGRAM, DIALOG
+ BEGIN
+ END
+
+ IDD_SYMBOL, DIALOG
+ BEGIN
+ END
+
+ IDD_EXECUTE, DIALOG
+ BEGIN
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDS_PROGRAM_MANAGER "Program Manager"
+ IDS_ERROR "ERROR"
+ IDS_WARNING "WARNING"
+ IDS_INFO "Information"
+ IDS_DELETE "Delete"
+ IDS_DELETE_GROUP_s "Delete group `%s'?"
+ IDS_DELETE_PROGRAM_s "Delete program `%s'?"
+ IDS_MOVE_PROGRAM_1 "Move Program"
+ IDS_MOVE_PROGRAM_2 "Move program:"
+ IDS_NOT_IMPLEMENTED "Not implemented"
+ IDS_FILE_READ_ERROR_s "Error reading `%s'."
+ IDS_FILE_WRITE_ERROR_s "Error writing `%s'."
+ IDS_GRPFILE_READ_ERROR_s
+ "The group file `%s' cannot be opened.\nShould it be tried further on?"
+ IDS_OUT_OF_MEMORY "Out of memory."
+END
+
+STRINGTABLE
+BEGIN
+ IDS_WINHELP_ERROR "Help not available."
+ IDS_UNKNOWN_FEATURE_s "Unknown feature in %s"
+ IDS_FILE_NOT_OVERWRITTEN_s "File `%s' exists. Not overwritten."
+ IDS_SAVE_GROUP_AS_s "Save group as `%s' to prevent overwriting original files."
+ IDS_ALL_FILES "All files (*.*)"
+ IDS_PROGRAMS "Programs (*.exe)"
+ IDS_LIBRARIES_DLL "Libraries (*.dll)"
+ IDS_SYMBOL_FILES "Icon files (*.ico;*.exe;*.dll)"
+ IDS_SYMBOLS_ICO "Icons (*.ico)"
+END
+
+#endif // Anglais (États-Unis) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+/*
+ * PROJECT: ReactOS Program Manager
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * FILE: base/shell/progman/progman.h
+ * PURPOSE: ProgMan header
+ * PROGRAMMERS: Ulrich Schmid
+ * Sylvain Petreolle
+ * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
+ */
+
#ifndef PROGMAN_H
#define PROGMAN_H
+#pragma once
+
#include <stdio.h>
+#include <stdlib.h>
#define WIN32_NO_STATUS
#include <windef.h>
#include <winbase.h>
+#include <winreg.h>
#include <wingdi.h>
#include <winuser.h>
+#include <shellapi.h>
+
+#include <commctrl.h>
+#include <richedit.h>
+
#define MAX_STRING_LEN 255
#define MAX_PATHNAME_LEN 1024
#define MAX_LANGUAGE_NUMBER (PM_LAST_LANGUAGE - PM_FIRST_LANGUAGE)
/* Fallback icon */
#define DEFAULTICON OIC_WINLOGO
-/* Icon index in MS Windows' progman.exe */
-#define PROGMAN_ICON_INDEX 0
-#define GROUP_ICON_INDEX 6
-#define DEFAULT_ICON_INDEX 7
-
#define DEF_GROUP_WIN_XPOS 100
#define DEF_GROUP_WIN_YPOS 100
#define DEF_GROUP_WIN_WIDTH 300
#define DEF_GROUP_WIN_HEIGHT 200
-typedef struct
+
+/*
+ * windowsx.h extensions
+ */
+#define EnableDlgItem(hDlg, nID, bEnable) \
+ EnableWindow(GetDlgItem((hDlg), (nID)), (bEnable))
+
+
+
+
+
+typedef struct _PROGRAM PROGRAM, *PPROGRAM;
+typedef struct _PROGGROUP PROGGROUP, *PPROGGROUP;
+
+struct _PROGRAM
{
- HLOCAL hGroup;
- HLOCAL hPrior;
- HLOCAL hNext;
- HWND hWnd;
- /**/ /* Numbers are byte indexes in *.grp */
-
- /**/ /* Program entry */
- INT x, y; /* 0 - 3 */
- INT nIconIndex; /* 4 - 5 */
- HICON hIcon;
- /* icon flags ??? */ /* 6 - 7 */
- /* iconANDsize */ /* 8 - 9 */
- /* iconXORsize */ /* 10 - 11 */
- /* pointer to IconInfo */ /* 12 - 13 */
- /* pointer to iconXORbits */ /* 14 - 15 */ /* sometimes iconANDbits ?! */
- /* pointer to iconANDbits */ /* 16 - 17 */ /* sometimes iconXORbits ?! */
- HLOCAL hName; /* 18 - 19 */
- HLOCAL hCmdLine; /* 20 - 21 */
- HLOCAL hIconFile; /* 22 - 23 */
- HLOCAL hWorkDir; /* Extension 0x8101 */
- INT nHotKey; /* Extension 0x8102 */
- /* Modifier: bit 8... */
- INT nCmdShow; /* Extension 0x8103 */
-
- /**/ /* IconInfo */
- /* HotSpot x ??? */ /* 0 - 1 */
- /* HotSpot y ??? */ /* 2 - 3 */
- /* Width */ /* 4 - 5 */
- /* Height */ /* 6 - 7 */
- /* WidthBytes ??? */ /* 8 - 9 */
- /* Planes */ /* 10 - 10 */
- /* BitsPerPixel */ /* 11 - 11 */
-} PROGRAM;
-
-typedef struct
+ PROGGROUP* hGroup;
+ PROGRAM* hPrior;
+ PROGRAM* hNext;
+ HWND hWnd;
+
+ INT iItem;
+ INT x;
+ INT y;
+ INT nIconIndex;
+ HICON hIcon;
+ LPWSTR hName;
+ LPWSTR hCmdLine;
+ LPWSTR hIconFile;
+ LPWSTR hWorkDir; /* Extension 0x8101 */
+ INT nHotKey; /* Extension 0x8102 */
+ INT nCmdShow; /* Extension 0x8103 */
+ BOOL bNewVDM; /* Extension 0x8104 */
+
+ SIZE_T TagsSize;
+ PVOID Tags;
+}; // PROGRAM, *PPROGRAM;
+
+typedef enum _GROUPFORMAT
+{
+ Win_311 = 0x0,
+ NT_Ansi = 0x1, // 0x02
+ NT_Unicode = 0x2, // 0x03
+} GROUPFORMAT;
+
+struct _PROGGROUP
{
- HLOCAL hPrior;
- HLOCAL hNext;
- HWND hWnd;
- HLOCAL hGrpFile;
- HLOCAL hActiveProgram;
- BOOL bFileNameModified;
- BOOL bOverwriteFileOk;
- INT seqnum;
-
- /**/ /* Absolute */
- /* magic `PMCC' */ /* 0 - 3 */
- /* checksum */ /* 4 - 5 */
- /* Extension ptr */ /* 6 - 7 */
- INT nCmdShow; /* 8 - 9 */
- INT x, y; /* 10 - 13 */
- INT width, height; /* 14 - 17 */
- INT iconx, icony; /* 18 - 21 */
- HLOCAL hName; /* 22 - 23 */
- /* unknown */ /* 24 - 31 */
- /* number of programs */ /* 32 - 33 */
- HLOCAL hPrograms; /* 34 ... */
-
- /**/ /* Extensions */
- /* Extension type */ /* 0 - 1 */
- /* Program number */ /* 2 - 3 */
- /* Size of entry */ /* 4 - 5 */
- /* Data */ /* 6 ... */
-
- /* magic `PMCC' */ /* Extension 0x8000 */
- /* End of Extensions */ /* Extension 0xffff */
-} PROGGROUP;
-
-typedef struct
+ PROGGROUP* hPrior;
+ PROGGROUP* hNext;
+ HWND hWnd;
+
+ HWND hListView;
+ HIMAGELIST hListLarge;
+ HIMAGELIST hDragImageList;
+ HICON hOldCursor;
+ POINT ptStart;
+ BOOL bDragging;
+
+ GROUPFORMAT format;
+ BOOL bIsCommonGroup;
+ // BOOL bFileNameModified;
+ BOOL bOverwriteFileOk;
+ LPWSTR hGrpFile;
+ INT seqnum;
+ INT nCmdShow;
+ INT x;
+ INT y;
+ INT width;
+ INT height;
+ INT iconx;
+ INT icony;
+ LPWSTR hName;
+ PROGRAM* hPrograms;
+ PROGRAM* hActiveProgram;
+
+ SIZE_T TagsSize;
+ PVOID Tags;
+}; // PROGGROUP, *PPROGGROUP;
+
+
+typedef struct _GLOBALS
{
- HANDLE hInstance;
- HANDLE hAccel;
- HWND hMainWnd;
- HWND hMDIWnd;
- HICON hMainIcon;
- HICON hGroupIcon;
- HICON hDefaultIcon;
- HMENU hMainMenu;
- HMENU hFileMenu;
- HMENU hOptionMenu;
- HMENU hWindowsMenu;
- HMENU hLanguageMenu;
- LPCSTR lpszIniFile;
-#ifndef __REACTOS__
- LPCSTR lpszIcoFile;
-#endif
- BOOL bAutoArrange;
- BOOL bSaveSettings;
- BOOL bMinOnRun;
- HLOCAL hGroups;
- HLOCAL hActiveGroup;
-} GLOBALS;
+ HINSTANCE hInstance;
+ HACCEL hAccel;
+ HWND hMainWnd;
+ HWND hMDIWnd;
+ //HICON hMainIcon;
+ HICON hGroupIcon;
+ HICON hPersonalGroupIcon;
+ HICON hCommonGroupIcon;
+ HICON hDefaultIcon;
+ HMENU hMainMenu;
+ HMENU hFileMenu;
+ HMENU hOptionMenu;
+ HMENU hWindowsMenu;
+ HMENU hLanguageMenu;
+
+ HKEY hKeyProgMan;
+ HKEY hKeyPMSettings;
+ HKEY hKeyPMCommonGroups;
+ HKEY hKeyPMAnsiGroups;
+ HKEY hKeyPMUnicodeGroups;
+ HKEY hKeyAnsiGroups;
+ HKEY hKeyUnicodeGroups;
+ HKEY hKeyCommonGroups;
+
+ BOOL bAutoArrange;
+ BOOL bSaveSettings;
+ BOOL bMinOnRun;
+ PROGGROUP* hGroups;
+ PROGGROUP* hActiveGroup;
+ // int field_74;
+ // int field_78;
+ // PROGGROUP* field_79;
+} GLOBALS, *PGLOBALS;
extern GLOBALS Globals;
+extern WCHAR szTitle[256];
+
+
+/*
+ * Memory management functions
+ */
+PVOID
+Alloc(IN DWORD dwFlags,
+ IN SIZE_T dwBytes);
+
+BOOL
+Free(IN PVOID lpMem);
+
+PVOID
+ReAlloc(IN DWORD dwFlags,
+ IN PVOID lpMem,
+ IN SIZE_T dwBytes);
+
+PVOID
+AppendToBuffer(IN PVOID pBuffer,
+ IN PSIZE_T pdwBufferSize,
+ IN PVOID pData,
+ IN SIZE_T dwDataSize);
+
INT MAIN_MessageBoxIDS(UINT ids_text, UINT ids_title, WORD type);
-INT MAIN_MessageBoxIDS_s(UINT ids_text_s, LPCSTR str, UINT ids_title, WORD type);
-VOID MAIN_ReplaceString(HLOCAL *handle, LPSTR replacestring);
-
-HLOCAL GRPFILE_ReadGroupFile(const char* path);
-BOOL GRPFILE_WriteGroupFile(HLOCAL hGroup);
-
-ATOM GROUP_RegisterGroupWinClass(void);
-HLOCAL GROUP_AddGroup(LPCSTR lpszName, LPCSTR lpszGrpFile, INT nCmdShow,
- INT x, INT y, INT width, INT height,
- INT iconx, INT icony,
- BOOL bFileNameModified, BOOL bOverwriteFileOk,
- /* FIXME shouldn't be necessary */
- BOOL bSuppressShowWindow);
-VOID GROUP_NewGroup(void);
-VOID GROUP_ModifyGroup(HLOCAL hGroup);
-VOID GROUP_DeleteGroup(HLOCAL hGroup);
+INT MAIN_MessageBoxIDS_s(UINT ids_text, LPCWSTR str, UINT ids_title, WORD type);
+VOID MAIN_ReplaceString(LPWSTR* string, LPWSTR replace);
+
+DWORD GRPFILE_ReadGroupFile(LPCWSTR lpszPath, BOOL bIsCommonGroup);
+BOOL GRPFILE_WriteGroupFile(PROGGROUP* hGroup);
+
+ATOM GROUP_RegisterGroupWinClass(VOID);
+PROGGROUP* GROUP_AddGroup(GROUPFORMAT format, BOOL bIsCommonGroup, LPCWSTR lpszName, LPCWSTR lpszGrpFile,
+ INT left, INT top, INT right, INT bottom, INT xMin, INT yMin, INT nCmdShow,
+ WORD cxIcon, WORD cyIcon, BOOL bOverwriteFileOk,
+ /* FIXME shouldn't be necessary */
+ BOOL bSuppressShowWindow);
+VOID GROUP_NewGroup(GROUPFORMAT format, BOOL bIsCommonGroup);
+VOID GROUP_ModifyGroup(PROGGROUP* hGroup);
+VOID GROUP_DeleteGroup(PROGGROUP* hGroup);
/* FIXME shouldn't be necessary */
-VOID GROUP_ShowGroupWindow(HLOCAL hGroup);
-HLOCAL GROUP_FirstGroup(void);
-HLOCAL GROUP_NextGroup(HLOCAL hGroup);
-HLOCAL GROUP_ActiveGroup(void);
-HWND GROUP_GroupWnd(HLOCAL hGroup);
-LPCSTR GROUP_GroupName(HLOCAL hGroup);
-
-ATOM PROGRAM_RegisterProgramWinClass(void);
-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);
-VOID PROGRAM_NewProgram(HLOCAL hGroup);
-VOID PROGRAM_ModifyProgram(HLOCAL hProgram);
-VOID PROGRAM_CopyMoveProgram(HLOCAL hProgram, BOOL bMove);
-VOID PROGRAM_DeleteProgram(HLOCAL hProgram, BOOL BUpdateGrpFile);
-HLOCAL PROGRAM_FirstProgram(HLOCAL hGroup);
-HLOCAL PROGRAM_NextProgram(HLOCAL hProgram);
-HLOCAL PROGRAM_ActiveProgram(HLOCAL hGroup);
-LPCSTR PROGRAM_ProgramName(HLOCAL hProgram);
-VOID PROGRAM_ExecuteProgram(HLOCAL hLocal);
-
-INT DIALOG_New(INT nDefault);
-HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszGroupName, BOOL bMove);
-BOOL DIALOG_Delete(UINT ids_format_s, LPCSTR lpszName);
-BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszPath, INT nSize);
-BOOL DIALOG_ProgramAttributes(LPSTR lpszTitle, LPSTR lpszCmdLine,
- LPSTR lpszWorkDir, LPSTR lpszIconFile,
- HICON *lphIcon, INT *nIconIndex,
- INT *lpnHotKey, INT *lpnCmdShow, INT nSize);
-VOID DIALOG_Execute(void);
-
-VOID STRING_LoadMenus(VOID);
+VOID GROUP_ShowGroupWindow(PROGGROUP* hGroup);
+PROGGROUP* GROUP_ActiveGroup(VOID);
+
+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);
+VOID PROGRAM_NewProgram(PROGGROUP* hGroup);
+VOID PROGRAM_ModifyProgram(PROGRAM* hProgram);
+VOID PROGRAM_CopyMoveProgram(PROGRAM* hProgram, BOOL bMove);
+VOID PROGRAM_DeleteProgram(PROGRAM* hProgram, BOOL bUpdateGrpFile);
+VOID PROGRAM_ExecuteProgram(PROGRAM* hProgram);
+PROGRAM* PROGRAM_ActiveProgram(PROGGROUP* hGroup);
+
+BOOL DIALOG_New(INT nDefault, PINT pnResult);
+PROGGROUP* DIALOG_CopyMove(PROGRAM* hProgram, BOOL bMove);
+BOOL DIALOG_Delete(UINT ids_text_s, LPCWSTR lpszName);
+BOOL DIALOG_GroupAttributes(GROUPFORMAT format, LPWSTR lpszTitle, LPWSTR lpszGrpFile, INT nSize);
+BOOL DIALOG_ProgramAttributes(LPWSTR lpszTitle, LPWSTR lpszCmdLine, LPWSTR lpszWorkDir, LPWSTR lpszIconFile,
+ HICON* lphIcon, INT* lpnIconIndex, INT* lpnHotKey, INT* lpnCmdShow, BOOL* lpbNewVDM, INT nSize);
+VOID DIALOG_Execute(VOID);
+
+VOID STRING_LoadStrings(VOID);
+VOID STRING_LoadMenus(VOID);
/* Class names */
-extern WCHAR STRING_MAIN_WIN_CLASS_NAME[];
-extern WCHAR STRING_MDI_WIN_CLASS_NAME[];
-extern WCHAR STRING_GROUP_WIN_CLASS_NAME[];
-extern WCHAR STRING_PROGRAM_WIN_CLASS_NAME[];
+#define STRING_MAIN_WIN_CLASS_NAME L"PMMain"
+#define STRING_GROUP_WIN_CLASS_NAME L"PMGroup"
#endif /* PROGMAN_H */
-
-/* Local Variables: */
-/* c-file-style: "GNU" */
-/* End: */
#define REACTOS_STR_ORIGINAL_FILENAME "progman.exe"
#include <reactos/version.rc>
-IDI_APPICON ICON "res/progman.ico"
+IDI_APPICON ICON "res/progman.ico"
+IDI_GROUP_PERSONAL_ICON ICON "res/group_personal.ico"
+IDI_GROUP_COMMON_ICON ICON "res/group_common.ico"
+IDI_ROSLOGO ICON "res/roslogo.ico"
+IDI_GROUP_ICON ICON "res/group.ico"
+IDI_TERMINAL ICON "res/terminal.ico"
-LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
+#include <reactos/manifest_exe.rc>
-MAIN_MENU MENU
-{
- POPUP "&File" {
- MENUITEM "&New...", PM_NEW
- MENUITEM "O&pen\tEnter", PM_OPEN
- MENUITEM "&Move...\tF7", PM_MOVE, GRAYED
- MENUITEM "&Copy...\tF8", PM_COPY, GRAYED
- MENUITEM "&Delete\tDel", PM_DELETE
- MENUITEM "&Properties\tAlt+Enter", PM_ATTRIBUTES
- MENUITEM SEPARATOR
- MENUITEM "&Execute...", PM_EXECUTE
- MENUITEM SEPARATOR
- MENUITEM "E&xit Windows", PM_EXIT
- }
- POPUP "&Options" {
- MENUITEM "&Arrange automatically", PM_AUTO_ARRANGE
- MENUITEM "&Minimize on run", PM_MIN_ON_RUN
- MENUITEM "&Save settings on exit", PM_SAVE_SETTINGS
- }
- POPUP "&Windows" {
- MENUITEM "&Overlapped\tShift+F5", PM_OVERLAP
- MENUITEM "&Side by side\tShift+F4", PM_SIDE_BY_SIDE
- MENUITEM "&Arrange Icons", PM_ARRANGE
- }
-
-POPUP "&Help" {
- MENUITEM "&Contents\tF1", PM_CONTENTS
- MENUITEM "&About Program Manager", PM_ABOUT_WINE
- }
-}
+/* UTF-8 */
+#pragma code_page(65001)
-STRINGTABLE
-{
-IDS_PROGRAM_MANAGER, "Program Manager"
-IDS_ERROR, "ERROR"
-IDS_WARNING, "WARNING"
-IDS_INFO, "Information"
-IDS_DELETE, "Delete"
-IDS_DELETE_GROUP_s, "Delete group `%s'?"
-IDS_DELETE_PROGRAM_s, "Delete program `%s'?"
-IDS_NOT_IMPLEMENTED, "Not implemented"
-IDS_FILE_READ_ERROR_s, "Error reading `%s'."
-IDS_FILE_WRITE_ERROR_s, "Error writing `%s'."
-IDS_GRPFILE_READ_ERROR_s, "\
-The group file `%s' cannot be opened.\n\
-Should it be tried further on?"
-IDS_OUT_OF_MEMORY, "Out of memory."
-IDS_WINHELP_ERROR, "Help not available."
-IDS_UNKNOWN_FEATURE_s, "Unknown feature in %s"
-IDS_FILE_NOT_OVERWRITTEN_s, "File `%s' exists. Not overwritten."
-IDS_SAVE_GROUP_AS_s, "Save group as `%s to prevent overwriting original files."
-IDS_NO_HOT_KEY, "#msgctxt#hotkey#None"
-IDS_ALL_FILES, "All files (*.*)"
-IDS_PROGRAMS, "Programs"
-IDS_LIBRARIES_DLL, "Libraries (*.dll)"
-IDS_SYMBOL_FILES, "Icon files"
-IDS_SYMBOLS_ICO, "Icons (*.ico)"
-}
+#if 0 // Work in progress! See "new_resources.rc"
+
+LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
-IDA_ACCEL ACCELERATORS
-{
-VK_F1, PM_CONTENTS, VIRTKEY
-VK_RETURN, PM_ATTRIBUTES, VIRTKEY, ALT
-}
/* Dialog `New' */
/* Dialog `Move' */
-IDD_MOVE DIALOG 0, 0, 250, 65
+IDD_COPY_MOVE DIALOG 0, 0, 250, 65
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Move Program"
PUSHBUTTON "&Browse...", PM_BROWSE, 135, 45, 60, 15, WS_TABSTOP
PUSHBUTTON "&Help", PM_HELP, 135, 65, 60, 15, WS_TABSTOP
}
+
+#endif
+
+#include "new_resources.rc"
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+/*
+ * PROJECT: ReactOS Program Manager
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * FILE: base/shell/progman/program.c
+ * PURPOSE: Program items helper functions
+ * PROGRAMMERS: Ulrich Schmid
+ * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
+ */
+
#include "progman.h"
-/***********************************************************************
- *
- * PROGRAM_ProgramWndProc
- */
+#if 0
static LRESULT CALLBACK PROGRAM_ProgramWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProcW(hWnd, msg, wParam, lParam);
}
-/***********************************************************************
- *
- * PROGRAM_RegisterProgramWinClass
- */
+#endif
+
-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)
+VOID PROGRAM_NewProgram(PROGGROUP* 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);
+ HICON hIcon = NULL;
+ INT nIconIndex = 0;
+ INT nHotKey = 0;
+ INT nCmdShow = SW_SHOWNORMAL;
+ BOOL bNewVDM = FALSE;
+ WCHAR szTitle[MAX_PATHNAME_LEN] = L"";
+ WCHAR szCmdLine[MAX_PATHNAME_LEN] = L"";
+ WCHAR szIconFile[MAX_PATHNAME_LEN] = L"";
+ WCHAR szWorkDir[MAX_PATHNAME_LEN] = L"";
+
+ if (!DIALOG_ProgramAttributes(szTitle, szCmdLine, szWorkDir, szIconFile,
+ &hIcon, &nIconIndex, &nHotKey, &nCmdShow, &bNewVDM,
+ MAX_PATHNAME_LEN))
+ {
+ return;
+ }
+ if (!hIcon)
+ hIcon = LoadIconW(NULL, MAKEINTRESOURCEW(IDI_WINLOGO));
- if (!PROGRAM_AddProgram(hGroup, hIcon, szName, 0, 0, szCmdLine, szIconFile,
- nIconIndex, szWorkDir, nHotKey, nCmdShow))
- return;
+ if (!PROGRAM_AddProgram(hGroup, hIcon, szTitle, -1, -1, szCmdLine, szIconFile,
+ nIconIndex, szWorkDir, nHotKey, nCmdShow, bNewVDM))
+ {
+ return;
+ }
- GRPFILE_WriteGroupFile(hGroup);
+ GRPFILE_WriteGroupFile(hGroup);
}
/***********************************************************************
* PROGRAM_ModifyProgram
*/
-VOID PROGRAM_ModifyProgram(HLOCAL hProgram)
+VOID PROGRAM_ModifyProgram(PROGRAM* 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;
+ LVITEMW lvItem;
+ WCHAR szName[MAX_PATHNAME_LEN];
+ WCHAR szWorkDir[MAX_PATHNAME_LEN];
+ WCHAR szCmdLine[MAX_PATHNAME_LEN];
+ WCHAR szIconFile[MAX_PATHNAME_LEN];
+
+ lstrcpynW(szName , hProgram->hName , ARRAYSIZE(szName));
+ lstrcpynW(szCmdLine , hProgram->hCmdLine , ARRAYSIZE(szCmdLine));
+ lstrcpynW(szIconFile, hProgram->hIconFile, ARRAYSIZE(szIconFile));
+ lstrcpynW(szWorkDir , hProgram->hWorkDir , ARRAYSIZE(szWorkDir));
+
+ if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile,
+ &hProgram->hIcon, &hProgram->nIconIndex,
+ &hProgram->nHotKey, &hProgram->nCmdShow,
+ &hProgram->bNewVDM, MAX_PATHNAME_LEN))
+ {
+ return;
+ }
+
+ MAIN_ReplaceString(&hProgram->hName , szName);
+ MAIN_ReplaceString(&hProgram->hCmdLine , szCmdLine);
+ MAIN_ReplaceString(&hProgram->hIconFile, szIconFile);
+ MAIN_ReplaceString(&hProgram->hWorkDir , szWorkDir);
+
+ ZeroMemory(&lvItem, sizeof(lvItem));
+ lvItem.mask = LVIF_TEXT;
+ lvItem.iSubItem = 0;
+ lvItem.pszText = szName;
+ SendMessageW(hProgram->hGroup->hListView, LVM_SETITEMTEXTW, hProgram->iItem, (LPARAM)&lvItem);
+
+ GRPFILE_WriteGroupFile(hProgram->hGroup);
}
/***********************************************************************
* 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)
+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)
{
- 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)
+ PROGRAM* hProgram;
+ PROGRAM* hPrior;
+ PROGRAM** p;
+ LPWSTR hCmdLine;
+ LPWSTR hIconFile;
+ LPWSTR hName;
+ LPWSTR hWorkDir;
+ LVITEMW lvItem;
+ INT iItem;
+
+ hProgram = Alloc(HEAP_ZERO_MEMORY, sizeof(*hProgram));
+ hName = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszName) + 1) * sizeof(WCHAR));
+ hCmdLine = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszCmdLine) + 1) * sizeof(WCHAR));
+ hIconFile = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszIconFile) + 1) * sizeof(WCHAR));
+ hWorkDir = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszWorkDir) + 1) * sizeof(WCHAR));
+ 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);
+ MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
+ if (hProgram) Free(hProgram);
+ if (hName) Free(hName);
+ if (hCmdLine) Free(hCmdLine);
+ if (hIconFile) Free(hIconFile);
+ if (hWorkDir) Free(hWorkDir);
+ return NULL;
}
- 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));
+ memcpy(hName , lpszName , (wcslen(lpszName) + 1) * sizeof(WCHAR));
+ memcpy(hCmdLine , lpszCmdLine , (wcslen(lpszCmdLine) + 1) * sizeof(WCHAR));
+ memcpy(hIconFile, lpszIconFile, (wcslen(lpszIconFile) + 1) * sizeof(WCHAR));
+ memcpy(hWorkDir , lpszWorkDir , (wcslen(lpszWorkDir) + 1) * sizeof(WCHAR));
+
+ hGroup->hActiveProgram = hProgram;
+
+ hPrior = NULL;
+ for (p = &hGroup->hPrograms; *p; p = &hPrior->hNext)
+ hPrior = *p;
+ *p = hProgram;
+
+ hProgram->hGroup = hGroup;
+ hProgram->hPrior = hPrior;
+ hProgram->hNext = NULL;
+ hProgram->hName = hName;
+ hProgram->hCmdLine = hCmdLine;
+ hProgram->hIconFile = hIconFile;
+ hProgram->nIconIndex = nIconIndex;
+ hProgram->hWorkDir = hWorkDir;
+ hProgram->hIcon = hIcon;
+ hProgram->nCmdShow = nCmdShow;
+ hProgram->nHotKey = nHotKey;
+ hProgram->bNewVDM = bNewVDM;
+ hProgram->TagsSize = 0;
+ hProgram->Tags = NULL;
+
+ ZeroMemory(&lvItem, sizeof(lvItem));
+ lvItem.mask = LVIF_PARAM | LVIF_IMAGE | LVIF_TEXT;
+ lvItem.pszText = (LPWSTR)lpszName;
+ lvItem.lParam = (LPARAM)hProgram;
+ lvItem.iImage = ImageList_ReplaceIcon(hGroup->hListLarge, -1, hIcon);
+ DestroyIcon(hIcon);
+
+ lvItem.iItem = SendMessageA(hGroup->hListView, LVM_GETITEMCOUNT, 0, 0);
+ iItem = SendMessageW(hGroup->hListView, LVM_INSERTITEMW, 0, (LPARAM)&lvItem);
+ hProgram->iItem = iItem;
+ if (x != -1 && y != -1)
+ SendMessageA(hGroup->hListView, LVM_SETITEMPOSITION, lvItem.iItem, MAKELPARAM(x, y));
+
+ return hProgram;
+}
- 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)
+VOID PROGRAM_CopyMoveProgram(PROGRAM* 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;
+ PROGGROUP* hGroup;
+
+ hGroup = DIALOG_CopyMove(hProgram, bMove);
+ if (!hGroup)
+ return;
+
+ /* FIXME: shouldn't be necessary */
+ OpenIcon(hGroup->hWnd);
+
+ if (!PROGRAM_AddProgram(hGroup,
+ hProgram->hIcon,
+ hProgram->hName,
+ hProgram->x,
+ hProgram->y,
+ hProgram->hCmdLine,
+ hProgram->hIconFile,
+ hProgram->nIconIndex,
+ hProgram->hWorkDir,
+ hProgram->nHotKey,
+ hProgram->nCmdShow,
+ hProgram->bNewVDM))
+ {
+ return;
+ }
- /* FIXME shouldn't be necessary */
- OpenIcon(((PROGGROUP*)LocalLock(hGroup))->hWnd);
+ GRPFILE_WriteGroupFile(hGroup);
- 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);
+ if (bMove)
+ PROGRAM_DeleteProgram(hProgram, TRUE);
}
/***********************************************************************
* PROGRAM_ExecuteProgram
*/
-VOID PROGRAM_ExecuteProgram(HLOCAL hProgram)
+VOID PROGRAM_ExecuteProgram(PROGRAM* hProgram)
{
- PROGRAM *program = LocalLock(hProgram);
- LPSTR lpszCmdLine = LocalLock(program->hCmdLine);
+ // TODO: Use a (private?) shell API with which one can use hProgram->bNewVDM
- /* FIXME set working directory from program->hWorkDir */
+ ShellExecuteW(NULL, NULL, hProgram->hCmdLine, NULL, hProgram->hWorkDir, hProgram->nCmdShow);
- WinExec(lpszCmdLine, program->nCmdShow);
- if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd);
+ if (Globals.bMinOnRun)
+ CloseWindow(Globals.hMainWnd);
}
/***********************************************************************
* PROGRAM_DeleteProgram
*/
-VOID PROGRAM_DeleteProgram(HLOCAL hProgram, BOOL bUpdateGrpFile)
+VOID PROGRAM_DeleteProgram(PROGRAM* hProgram, BOOL bUpdateGrpFile)
{
- PROGRAM *program = LocalLock(hProgram);
- PROGGROUP *group = LocalLock(program->hGroup);
+ PROGGROUP* group;
+
+ group = hProgram->hGroup;
+ if (hProgram->hGroup->hActiveProgram == hProgram)
+ group->hActiveProgram = NULL;
- group->hActiveProgram = 0;
+ SendMessageA(group->hListView, LVM_DELETEITEM, hProgram->iItem, 0);
- if (program->hPrior)
- ((PROGRAM*)LocalLock(program->hPrior))->hNext = program->hNext;
- else
- ((PROGGROUP*)LocalLock(program->hGroup))->hPrograms = program->hNext;
+ if (hProgram->hPrior)
+ hProgram->hPrior->hNext = hProgram->hNext;
+ else
+ hProgram->hGroup->hPrograms = hProgram->hNext;
- if (program->hNext)
- ((PROGRAM*)LocalLock(program->hNext))->hPrior = program->hPrior;
+ if (hProgram->hNext)
+ hProgram->hNext->hPrior = hProgram->hPrior;
- if (bUpdateGrpFile)
- GRPFILE_WriteGroupFile(program->hGroup);
+ if (bUpdateGrpFile)
+ GRPFILE_WriteGroupFile(hProgram->hGroup);
- DestroyWindow(program->hWnd);
#if 0
- if (program->hIcon)
- DestroyIcon(program->hIcon);
+ DestroyWindow(program->hWnd);
+ 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);
+ if (hProgram->Tags)
+ Free(hProgram->Tags);
+ Free(hProgram->hName);
+ Free(hProgram->hCmdLine);
+ Free(hProgram->hIconFile);
+ Free(hProgram->hWorkDir);
+ Free(hProgram);
}
-/***********************************************************************
- *
- * 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_ActiveProgram(PROGGROUP* hGroup)
{
- PROGRAM *program;
- if (!hProgram) return(0);
- program = LocalLock(hProgram);
- return(LocalLock(program->hName));
+ if (!hGroup) return NULL;
+ if (IsIconic(hGroup->hWnd)) return NULL;
+ return hGroup->hActiveProgram;
}
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+/*
+ * PROJECT: ReactOS Program Manager
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * FILE: base/shell/progman/resource.h
+ * PURPOSE: ProgMan resource header
+ * PROGRAMMERS: Ulrich Schmid
+ * Sylvain Petreolle
+ * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
+ */
+
#pragma once
-/* Icon */
-#define IDI_APPICON 1
+#ifndef IDC_STATIC
+#define IDC_STATIC -1
+#endif
-/* Resource names */
-#define IDD_MAIN 1
-#define IDD_NEW 2
-#define IDD_OPEN 3
-#define IDD_MOVE 4
-#define IDD_COPY 5
-#define IDD_DELETE 6
-#define IDD_GROUP 7
-#define IDD_PROGRAM 8
-#define IDD_SYMBOL 9
-#define IDD_EXECUTE 10
+/* Icons */
+#define IDI_APPICON 1
+#define IDI_GROUP_PERSONAL_ICON 8
+#define IDI_GROUP_COMMON_ICON 9
+#define IDI_ROSLOGO 10
+#define IDI_GROUP_ICON 48
+#define IDI_TERMINAL 49
+/* Accelerators */
#define IDA_ACCEL 1
-/* Stringtable index */
+/* String table index */
#define IDS_PROGRAM_MANAGER 0x02
#define IDS_ERROR 0x03
#define IDS_WARNING 0x04
#define IDS_DELETE 0x06
#define IDS_DELETE_GROUP_s 0x07
#define IDS_DELETE_PROGRAM_s 0x08
-#define IDS_NOT_IMPLEMENTED 0x09
-#define IDS_FILE_READ_ERROR_s 0x0a
-#define IDS_FILE_WRITE_ERROR_s 0x0b
-#define IDS_GRPFILE_READ_ERROR_s 0x0c
-#define IDS_OUT_OF_MEMORY 0x0d
-#define IDS_WINHELP_ERROR 0x0e
-#define IDS_UNKNOWN_FEATURE_s 0x0f
-#define IDS_FILE_NOT_OVERWRITTEN_s 0x10
-#define IDS_SAVE_GROUP_AS_s 0x11
-#define IDS_NO_HOT_KEY 0x12
-#define IDS_ALL_FILES 0x13
-#define IDS_PROGRAMS 0x14
-#define IDS_LIBRARIES_DLL 0x15
-#define IDS_SYMBOL_FILES 0x16
-#define IDS_SYMBOLS_ICO 0x17
+#define IDS_MOVE_PROGRAM_1 0x09 // FIXME: rename me!
+#define IDS_MOVE_PROGRAM_2 0x0a // FIXME: rename me!
+#define IDS_NOT_IMPLEMENTED 0x0b
+#define IDS_FILE_READ_ERROR_s 0x0c
+#define IDS_FILE_WRITE_ERROR_s 0x0d
+#define IDS_GRPFILE_READ_ERROR_s 0x0e
+#define IDS_OUT_OF_MEMORY 0x0f
+#define IDS_WINHELP_ERROR 0x10
+#define IDS_UNKNOWN_FEATURE_s 0x11
+#define IDS_FILE_NOT_OVERWRITTEN_s 0x12
+#define IDS_SAVE_GROUP_AS_s 0x13
+#define IDS_ALL_FILES 0x14
+#define IDS_PROGRAMS 0x15
+#define IDS_LIBRARIES_DLL 0x16
+#define IDS_SYMBOL_FILES 0x17
+#define IDS_SYMBOLS_ICO 0x18
/* Menu */
#define PM_AUTO_ARRANGE 0x110
#define PM_MIN_ON_RUN 0x111
-#define PM_SAVE_SETTINGS 0x113
+#define PM_SAVE_SETTINGS 0x112
+#define PM_SAVE_SETTINGS_NOW 0x113
#define PM_OVERLAP 0x120
#define PM_SIDE_BY_SIDE 0x121
*/
#define PM_CONTENTS 0x131
+#define PM_ABOUT 0x142
+
-#define PM_ABOUT_WINE 0x142
+/* Dialogs */
+#define IDD_MAIN 1
+#define IDD_NEW 2
+#define IDD_COPY_MOVE 4
+#define IDD_GROUP 6
+#define IDD_PROGRAM 7
+#define IDD_SYMBOL 8
+#define IDD_EXECUTE 9
/* Dialog `New' */
/* RADIOBUTTON: The next two must be in sequence */
#define PM_NEW_GROUP 0x150
#define PM_NEW_PROGRAM 0x151
-#define PM_NEW_GROUP_TXT 0x152
-#define PM_NEW_PROGRAM_TXT 0x153
+#define PM_PERSONAL_GROUP 1001
+#define PM_COMMON_GROUP 1002
+#define PM_FORMAT_TXT 1003
+#define PM_FORMAT 1004
/* Dialogs `Copy', `Move' */
-
-#define PM_PROGRAM 0x160
-#define PM_FROM_GROUP 0x161
-#define PM_TO_GROUP 0x162
-#define PM_TO_GROUP_TXT 0x163
+#define PM_COPY_MOVE_TXT 0x160
+#define PM_PROGRAM 0x161
+#define PM_FROM_GROUP 0x162
+#define PM_TO_GROUP 0x163
/* Dialogs `Group attributes' */
-
#define PM_DESCRIPTION 0x170
-#define PM_DESCRIPTION_TXT 0x171
#define PM_FILE 0x172
-#define PM_FILE_TXT 0x173
/* Dialogs `Program attributes' */
#define PM_COMMAND_LINE 0x180
-#define PM_COMMAND_LINE_TXT 0x181
#define PM_DIRECTORY 0x182
-#define PM_DIRECTORY_TXT 0x183
#define PM_HOT_KEY 0x184
-#define PM_HOT_KEY_TXT 0x185
#define PM_ICON 0x186
#define PM_OTHER_SYMBOL 0x187
/* Dialog `Symbol' */
-
#define PM_ICON_FILE 0x190
-#define PM_ICON_FILE_TXT 0x191
#define PM_SYMBOL_LIST 0x192
-#define PM_SYMBOL_LIST_TXT 0x193
/* Dialog `Execute' */
-
-#define PM_COMMAND 0x1a0
-#define PM_SYMBOL 0x1a1
-#define PM_BROWSE 0x1a2
-#define PM_HELP 0x1a3
+#define PM_COMMAND 0x1a0 // FIXME: May be merged with PM_COMMAND_LINE ?
+#define PM_SYMBOL 0x1a1 // FIXME: Rename: PM_RUN_MINIMIZED
+#define PM_NEW_VDM 0x1a2
+#define PM_BROWSE 0x1a3
--- /dev/null
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by new_resources.rc
+//
+
+#include <winuser.h>
+
+#define IDHELP 9
+
+
+#ifndef IDC_STATIC
+#define IDC_STATIC -1
+#endif
+
+/* Icons */
+#define IDI_APPICON 1
+#define IDI_GROUP_PERSONAL_ICON 8
+#define IDI_GROUP_COMMON_ICON 9
+#define IDI_ROSLOGO 10
+#define IDI_GROUP_ICON 48
+#define IDI_TERMINAL 49
+
+/* Accelerators */
+#define IDA_ACCEL 1
+
+/* String table index */
+#define IDS_PROGRAM_MANAGER 0x02
+#define IDS_ERROR 0x03
+#define IDS_WARNING 0x04
+#define IDS_INFO 0x05
+#define IDS_DELETE 0x06
+#define IDS_DELETE_GROUP_s 0x07
+#define IDS_DELETE_PROGRAM_s 0x08
+#define IDS_MOVE_PROGRAM_1 0x09 // FIXME: rename me!
+#define IDS_MOVE_PROGRAM_2 0x0a // FIXME: rename me!
+#define IDS_NOT_IMPLEMENTED 0x0b
+#define IDS_FILE_READ_ERROR_s 0x0c
+#define IDS_FILE_WRITE_ERROR_s 0x0d
+#define IDS_GRPFILE_READ_ERROR_s 0x0e
+#define IDS_OUT_OF_MEMORY 0x0f
+#define IDS_WINHELP_ERROR 0x10
+#define IDS_UNKNOWN_FEATURE_s 0x11
+#define IDS_FILE_NOT_OVERWRITTEN_s 0x12
+#define IDS_SAVE_GROUP_AS_s 0x13
+#define IDS_ALL_FILES 0x14
+#define IDS_PROGRAMS 0x15
+#define IDS_LIBRARIES_DLL 0x16
+#define IDS_SYMBOL_FILES 0x17
+#define IDS_SYMBOLS_ICO 0x18
+
+/* Menu */
+
+#define MAIN_MENU 0x109
+#define PM_NEW 0x100
+#define PM_OPEN 0x101
+#define PM_MOVE 0x102
+#define PM_COPY 0x103
+#define PM_DELETE 0x104
+#define PM_ATTRIBUTES 0x105
+#define PM_EXECUTE 0x107
+#define PM_EXIT 0x108
+
+#define PM_AUTO_ARRANGE 0x110
+#define PM_MIN_ON_RUN 0x111
+#define PM_SAVE_SETTINGS 0x112
+#define PM_SAVE_SETTINGS_NOW 0x113
+
+#define PM_OVERLAP 0x120
+#define PM_SIDE_BY_SIDE 0x121
+#define PM_ARRANGE 0x122
+#define PM_FIRST_CHILD 0x3030
+
+/*
+ *#define PM_FIRST_LANGUAGE 0x400
+ *#define PM_LAST_LANGUAGE 0x499
+ */
+
+#define PM_CONTENTS 0x131
+#define PM_ABOUT 0x142
+
+
+/* Dialogs */
+#define IDD_MAIN 1
+#define IDD_NEW 2
+#define IDD_COPY_MOVE 4
+#define IDD_GROUP 6
+#define IDD_PROGRAM 7
+#define IDD_SYMBOL 8
+#define IDD_EXECUTE 9
+
+/* Dialog `New' */
+
+/* RADIOBUTTON: The next two must be in sequence */
+#define PM_NEW_GROUP 0x150
+#define PM_NEW_PROGRAM 0x151
+#define PM_PERSONAL_GROUP 1001
+#define PM_COMMON_GROUP 1002
+#define PM_FORMAT_TXT 1003
+#define PM_FORMAT 1004
+
+/* Dialogs `Copy', `Move' */
+#define PM_COPY_MOVE_TXT 0x160
+#define PM_PROGRAM 0x161
+#define PM_FROM_GROUP 0x162
+#define PM_TO_GROUP 0x163
+
+/* Dialogs `Group attributes' */
+#define PM_DESCRIPTION 0x170
+#define PM_FILE 0x172
+
+/* Dialogs `Program attributes' */
+#define PM_COMMAND_LINE 0x180
+#define PM_DIRECTORY 0x182
+#define PM_HOT_KEY 0x184
+#define PM_ICON 0x186
+#define PM_OTHER_SYMBOL 0x187
+
+/* Dialog `Symbol' */
+#define PM_ICON_FILE 0x190
+#define PM_SYMBOL_LIST 0x192
+
+/* Dialog `Execute' */
+#define PM_COMMAND 0x1a0 // FIXME: May be merged with PM_COMMAND_LINE ?
+#define PM_SYMBOL 0x1a1 // FIXME: Rename: PM_RUN_MINIMIZED
+#define PM_NEW_VDM 0x1a2
+#define PM_BROWSE 0x1a3
+
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 106
+#define _APS_NEXT_COMMAND_VALUE 40002
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+/*
+ * PROJECT: ReactOS Program Manager
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * FILE: base/shell/progman/string.c
+ * PURPOSE: String utility functions
+ * PROGRAMMERS: Ulrich Schmid
+ * Sylvain Petreolle
+ * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
+ */
+
#include "progman.h"
-/* Class names */
+WCHAR szTitle[256]; // MAX_STRING_LEN ?
-WCHAR STRING_MAIN_WIN_CLASS_NAME[] = {'P','M','M','a','i','n',0};
-WCHAR STRING_MDI_WIN_CLASS_NAME[] = {'M','D','I','C','L','I','E','N','T',0};
-WCHAR STRING_GROUP_WIN_CLASS_NAME[] = {'P','M','G','r','o','u','p',0};
-WCHAR STRING_PROGRAM_WIN_CLASS_NAME[] = {'P','M','P','r','o','g','r','a','m',0};
+VOID STRING_LoadStrings(VOID)
+{
+ LoadStringW(Globals.hInstance, IDS_PROGRAM_MANAGER, szTitle, ARRAYSIZE(szTitle));
+}
VOID STRING_LoadMenus(VOID)
{
-#ifdef __REACTOS__
- WCHAR caption[MAX_STRING_LEN];
-#else
- CHAR caption[MAX_STRING_LEN];
-#endif
- HMENU hMainMenu;
-
- /* Set frame caption */
-#ifdef __REACTOS__
- LoadStringW(Globals.hInstance, IDS_PROGRAM_MANAGER, caption, sizeof(caption));
- SetWindowTextW(Globals.hMainWnd, caption);
-#else
- LoadStringA(Globals.hInstance, IDS_PROGRAM_MANAGER, caption, sizeof(caption));
- SetWindowTextA(Globals.hMainWnd, caption);
-#endif
-
- /* Create menu */
- hMainMenu = LoadMenuW(Globals.hInstance, MAKEINTRESOURCEW(MAIN_MENU));
- Globals.hFileMenu = GetSubMenu(hMainMenu, 0);
- Globals.hOptionMenu = GetSubMenu(hMainMenu, 1);
- Globals.hWindowsMenu = GetSubMenu(hMainMenu, 2);
- Globals.hLanguageMenu = GetSubMenu(hMainMenu, 3);
-
- if (Globals.hMDIWnd)
- SendMessageW(Globals.hMDIWnd, WM_MDISETMENU,
- (WPARAM) hMainMenu,
- (LPARAM) Globals.hWindowsMenu);
- else SetMenu(Globals.hMainWnd, hMainMenu);
-
- /* Destroy old menu */
- if (Globals.hMainMenu) DestroyMenu(Globals.hMainMenu);
- Globals.hMainMenu = hMainMenu;
+ HMENU hMainMenu;
+
+ /* Create the menu */
+ hMainMenu = LoadMenuW(Globals.hInstance, MAKEINTRESOURCEW(MAIN_MENU));
+ Globals.hFileMenu = GetSubMenu(hMainMenu, 0);
+ Globals.hOptionMenu = GetSubMenu(hMainMenu, 1);
+ Globals.hWindowsMenu = GetSubMenu(hMainMenu, 2);
+ Globals.hLanguageMenu = GetSubMenu(hMainMenu, 3);
+
+ if (Globals.hMDIWnd)
+ SendMessageW(Globals.hMDIWnd, WM_MDISETMENU, (WPARAM)hMainMenu, (LPARAM)Globals.hWindowsMenu);
+ else
+ SetMenu(Globals.hMainWnd, hMainMenu);
+
+ /* Destroy the old menu */
+ if (Globals.hMainMenu)
+ DestroyMenu(Globals.hMainMenu);
+ Globals.hMainMenu = hMainMenu;
}
reactos/base/applications/winhlp32 # Synced to WineStaging-1.9.4
reactos/base/applications/wordpad # Synced to WineStaging-1.9.4
reactos/base/services/rpcss # Synced to WineStaging-1.9.4
-reactos/base/shell/progman # Synced to WineStaging-1.9.4
+reactos/base/shell/progman # Forked at WineStaging-1.9.4
reactos/base/system/expand # Synced to WineStaging-1.9.4
reactos/base/system/msiexec # Synced to WineStaging-1.9.4
reactos/modules/rosapps/winfile # Autosync