VOID MAIN_ReplaceString(HLOCAL *handle, LPSTR replace) { HLOCAL newhandle = LocalAlloc(LMEM_FIXED, strlen(replace) + 1); if (newhandle) { LPSTR newstring = LocalLock(newhandle); lstrcpy(newstring, replace); LocalFree(*handle); *handle = newhandle; } else MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); }
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DIALOG_EXECUTE_DlgProc */ static INT_PTR CALLBACK DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { 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))) SetDlgItemText(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]; GetDlgItemText(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; } } return FALSE; }
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, *prior; MDICREATESTRUCT cs; INT seqnum; HLOCAL hPrior, *p; HLOCAL hGroup = LocalAlloc(LMEM_FIXED, sizeof(PROGGROUP)); HLOCAL hName = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszName)); HLOCAL hGrpFile = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszGrpFile)); if (!hGroup || !hName || !hGrpFile) { MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); if (hGroup) LocalFree(hGroup); if (hName) LocalFree(hName); if (hGrpFile) LocalFree(hGrpFile); return(0); } memcpy(LocalLock(hName), lpszName, 1 + lstrlen(lpszName)); memcpy(LocalLock(hGrpFile), lpszGrpFile, 1 + lstrlen(lpszGrpFile)); Globals.hActiveGroup = hGroup; seqnum = 1; hPrior = 0; p = &Globals.hGroups; while (*p) { hPrior = *p; prior = LocalLock(hPrior); p = &prior->hNext; if (prior->seqnum >= seqnum) seqnum = prior->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 = lpszName; cs.hOwner = 0; cs.x = x; cs.y = y; cs.cx = width; cs.cy = height; cs.style = 0; cs.lParam = 0; group->hWnd = (HWND)SendMessage(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&cs); SetWindowLongPtr(group->hWnd, 0, (LONG_PTR) hGroup); #if 1 if (!bSuppressShowWindow) /* FIXME shouldn't be necessary */ #endif { ShowWindow (group->hWnd, nCmdShow); UpdateWindow (group->hWnd); } return(hGroup); }
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) { PROGGROUP *group = LocalLock(hGroup); PROGRAM *program; HLOCAL hPrior, *p; HLOCAL hProgram = LocalAlloc(LMEM_FIXED, sizeof(PROGRAM)); HLOCAL hName = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszName)); HLOCAL hCmdLine = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszCmdLine)); HLOCAL hIconFile = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszIconFile)); HLOCAL hWorkDir = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszWorkDir)); 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); } memcpy(LocalLock(hName), lpszName, 1 + lstrlen(lpszName)); memcpy(LocalLock(hCmdLine), lpszCmdLine, 1 + lstrlen(lpszCmdLine)); memcpy(LocalLock(hIconFile), lpszIconFile, 1 + lstrlen(lpszIconFile)); memcpy(LocalLock(hWorkDir), lpszWorkDir, 1 + lstrlen(lpszWorkDir)); 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 = CreateWindow (STRING_PROGRAM_WIN_CLASS_NAME, lpszName, WS_CHILD | WS_CAPTION, x, y, CW_USEDEFAULT, CW_USEDEFAULT, group->hWnd, 0, Globals.hInstance, 0); SetWindowLongPtr(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; }
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DIALOG_SYMBOL_DlgProc */ static INT_PTR CALLBACK DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: SetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile); SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_SETITEMHEIGHT, 0, (LPARAM) 32); SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)*Symbol.lphIcon); SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)Globals.hDefaultIcon); SendDlgItemMessage(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))) SetDlgItemText(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 = SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_GETCURSEL, 0, 0); GetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile, Symbol.nSize); *Symbol.lphIcon = (HICON)SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_GETITEMDATA, (WPARAM) nCurSel, 0); #if 0 *Symbol.lphIcon = CopyIcon(*Symbol.lphIcon); #endif EndDialog(hDlg, IDOK); return TRUE; } case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; } } return FALSE; }
static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { HLOCAL hActiveGroup = GROUP_ActiveGroup(); HLOCAL hActiveProgram = PROGRAM_ActiveProgram(hActiveGroup); HWND hActiveGroupWnd = GROUP_GroupWnd(hActiveGroup); switch(wParam) { /* Menu File */ case PM_NEW: switch (DIALOG_New((hActiveGroupWnd && !IsIconic(hActiveGroupWnd)) ? PM_NEW_PROGRAM : PM_NEW_GROUP)) { case PM_NEW_PROGRAM: if (hActiveGroup) PROGRAM_NewProgram(hActiveGroup); break; case PM_NEW_GROUP: GROUP_NewGroup(); break; } 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, PROGRAM_ProgramName(hActiveProgram))) PROGRAM_DeleteProgram(hActiveProgram, TRUE); } else if (hActiveGroup) { if (DIALOG_Delete(IDS_DELETE_GROUP_s, GROUP_GroupName(hActiveGroup))) 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: 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)); WritePrivateProfileString("Settings", "AutoArrange", Globals.bAutoArrange ? "1" : "0", Globals.lpszIniFile); WritePrivateProfileString(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)); WritePrivateProfileString("Settings", "MinOnRun", Globals.bMinOnRun ? "1" : "0", Globals.lpszIniFile); WritePrivateProfileString(NULL,NULL,NULL,Globals.lpszIniFile); /* flush it */ break; case PM_SAVE_SETTINGS: Globals.bSaveSettings = !Globals.bSaveSettings; CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS, MF_BYCOMMAND | (Globals.bSaveSettings ? MF_CHECKED : MF_UNCHECKED)); WritePrivateProfileString("Settings", "SaveSettings", Globals.bSaveSettings ? "1" : "0", Globals.lpszIniFile); WritePrivateProfileString(NULL,NULL,NULL,Globals.lpszIniFile); /* flush it */ break; /* Menu Windows */ case PM_ARRANGE: if (hActiveGroupWnd && !IsIconic(hActiveGroupWnd)) ArrangeIconicWindows(hActiveGroupWnd); else SendMessage(Globals.hMDIWnd, WM_MDIICONARRANGE, 0, 0); break; /* Menu Help */ case PM_CONTENTS: if (!WinHelp(Globals.hMainWnd, "progman.hlp", HELP_INDEX, 0)) MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK); break; case PM_HELPONHELP: if (!WinHelp(Globals.hMainWnd, "progman.hlp", HELP_HELPONHELP, 0)) MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK); break; case PM_TUTORIAL: WinExec("wintutor.exe", SW_SHOWNORMAL); break; case PM_LICENSE: WineLicense(Globals.hMainWnd, Globals.lpszLanguage); break; case PM_NO_WARRANTY: WineWarranty(Globals.hMainWnd, Globals.lpszLanguage); break; case PM_ABOUT_WINE: ShellAbout(hWnd, "WINE", "Program Manager", 0); break; default: if (wParam >= PM_FIRST_LANGUAGE && wParam <= PM_LAST_LANGUAGE) STRING_SelectLanguageByNumber(wParam - PM_FIRST_LANGUAGE); else MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); break; } }
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* 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.x, &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 { 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; } 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)); Globals.hActiveGroup = hGroup; seqnum = 1; hPrior = NULL; for (p = &Globals.hGroups; *p; p = &hPrior->hNext) { hPrior = *p; if (hPrior->seqnum >= seqnum) seqnum = hPrior->seqnum + 1; } *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 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 */ #endif UpdateWindow(hGroup->hWnd); return hGroup; }