On Thu, 2002-06-06 at 09:14, Mike McCormack wrote: > > You'd better use cvs diff -u (you can add diff -u to your ~/.cvsrc so as > not to forget). > > You should just submit the changelog entries like this: > Well, here it is with these mods then. I removed the stuff from the ChangeLog file. Everything quoted below still holds. > ChangeLog: > Added RunFileDlg with MRU list (based on the template found in > Win98 shell32.dll) > > Looks like good work though! > > Mike > > Nix N. Nix wrote: > > I implemented RunFileDlg from dlls/shell32/dialogs.c, together with the > > MRU list that Windoze has. I placed the MRU list stuff in the same > > registry key as in Windoze. I had to add a dependency. The > > "&Browse..." button requires commdlg. I didn't know how to do this in > > the Makefile, so I used LoadLibraryEx. > > > > Well, here it is (diff is against CVS from around Wed Jun 5 16:00:00 > > EDT 2002) Thanks for the help.
Index: dlls/shell32/dialogs.c =================================================================== RCS file: /home/wine/wine/dlls/shell32/dialogs.c,v retrieving revision 1.5 diff -u -r1.5 dialogs.c --- dlls/shell32/dialogs.c 31 May 2002 23:25:52 -0000 1.5 +++ dlls/shell32/dialogs.c 6 Jun 2002 15:15:11 -0000 @@ -21,6 +21,8 @@ #include <string.h> #include <stdio.h> #include "winerror.h" +#include "winreg.h" +#include "commdlg.h" #include "wine/debug.h" #include "shellapi.h" @@ -28,7 +30,21 @@ #include "shell32_main.h" #include "undocshell.h" +typedef struct + { + HWND hwndOwner ; + HICON hIcon ; + LPCSTR lpstrDirectory ; + LPCSTR lpstrTitle ; + LPCSTR lpstrDescription ; + UINT uFlags ; + } RUNFILEDLGPARAMS ; + +typedef BOOL (*LPFNOFN) (OPENFILENAMEA *) ; + WINE_DEFAULT_DEBUG_CHANNEL(shell); +BOOL CALLBACK RunDlgProc (HWND, UINT, WPARAM, LPARAM) ; +void FillList (HWND, char *) ; /************************************************************************* @@ -60,9 +76,286 @@ LPCSTR lpstrDescription, UINT uFlags) { - FIXME("(0x%04x 0x%04x %s %s %s 0x%08x):stub.\n", - hwndOwner, hIcon, lpstrDirectory, lpstrTitle, lpstrDescription, uFlags); + + RUNFILEDLGPARAMS rfdp = {hwndOwner, hIcon, lpstrDirectory, lpstrTitle, lpstrDescription, uFlags} ; + HRSRC hRes; + LPVOID template; + TRACE("\n"); + + if(!(hRes = FindResourceA(shell32_hInstance, "SHELL_RUN_DLG", RT_DIALOGA))) + { + MessageBoxA (hwndOwner, "Couldn't find dialog.", "Nix", MB_OK) ; + return; + } + if(!(template = (LPVOID)LoadResource(shell32_hInstance, hRes))) + { + MessageBoxA (hwndOwner, "Couldn't load dialog.", "Nix", MB_OK) ; + return; + } + + DialogBoxIndirectParamA(GetWindowLongA( hwndOwner, GWL_HINSTANCE ), + template, hwndOwner, RunDlgProc, (LPARAM)&rfdp); + } + +/* Dialog procedure for RunFileDlg */ +BOOL CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) + { + int ic ; + char *psz, szMsg[256] ; + static RUNFILEDLGPARAMS *prfdp = NULL ; + + switch (message) + { + case WM_INITDIALOG : + prfdp = (RUNFILEDLGPARAMS *)lParam ; + SetWindowTextA (hwnd, prfdp->lpstrTitle) ; + SetClassLongA (hwnd, GCL_HICON, prfdp->hIcon) ; + SendMessageA (GetDlgItem (hwnd, 12297), STM_SETICON, (WPARAM)LoadIconA ((HINSTANCE)NULL, IDI_WINLOGOA), 0) ; + FillList (GetDlgItem (hwnd, 12298), NULL) ; + SetFocus (GetDlgItem (hwnd, 12298)) ; + break ; + + case WM_COMMAND : + { + STARTUPINFOA si ; + PROCESS_INFORMATION pi ; + + si.cb = sizeof (STARTUPINFOA) ; + si.lpReserved = NULL ; + si.lpDesktop = NULL ; + si.lpTitle = NULL ; + si.dwX = 0 ; + si.dwY = 0 ; + si.dwXSize = 0 ; + si.dwYSize = 0 ; + si.dwXCountChars = 0 ; + si.dwYCountChars = 0 ; + si.dwFillAttribute = 0 ; + si.dwFlags = 0 ; + si.cbReserved2 = 0 ; + si.lpReserved2 = NULL ; + + switch (LOWORD (wParam)) + { + case IDOK : + { + HWND htxt = (HWND)NULL ; + if ((ic = GetWindowTextLengthA (htxt = GetDlgItem (hwnd, 12298)))) + { + psz = malloc (ic + 2) ; + GetWindowTextA (htxt, psz, ic + 1) ; + + if (!CreateProcessA (NULL, psz, NULL, NULL, TRUE, + NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) + { + char *pszSysMsg = NULL ; + FormatMessageA ( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError (), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)&pszSysMsg, 0, NULL + ) ; + sprintf (szMsg, "Error: %s", pszSysMsg) ; + LocalFree ((HLOCAL)pszSysMsg) ; + MessageBoxA (hwnd, szMsg, "Nix", MB_OK | MB_ICONEXCLAMATION) ; + + free (psz) ; + SendMessageA (htxt, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + break ; + } + FillList (htxt, psz) ; + free (psz) ; + EndDialog (hwnd, 0) ; + } + } + + case IDCANCEL : + EndDialog (hwnd, 0) ; + break ; + + case 12288 : + { + HMODULE hComdlg = (HMODULE)NULL ; + LPFNOFN ofnProc = NULL ; + static char szFName[1024] = "", szFileTitle[256] = "", szInitDir[768] = "" ; + static OPENFILENAMEA ofn = + { + sizeof (OPENFILENAMEA), + (HWND)NULL, + (HINSTANCE)NULL, + "Executable Files\0*.exe\0All Files\0*.*\0\0\0\0", + (LPSTR)NULL, + 0, + 0, + szFName, + 1023, + szFileTitle, + 255, + (LPCSTR)szInitDir, + "Browse", + OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, + 0, + 0, + (LPCSTR)NULL, + 0, + (LPOFNHOOKPROC)NULL, + (LPCSTR)NULL + } ; + + ofn.hwndOwner = hwnd ; + + if ((HMODULE)NULL == (hComdlg = LoadLibraryExA ("comdlg32", (HANDLE)NULL, 0))) + { + MessageBoxA (hwnd, "Unable to display dialog box (LoadLibraryEx) !", "Nix", MB_OK | MB_ICONEXCLAMATION) ; + break ; + } + + if ((LPFNOFN)NULL == (ofnProc = (LPFNOFN)GetProcAddress (hComdlg, "GetOpenFileNameA"))) + { + MessageBoxA (hwnd, "Unable to display dialog box (GetProcAddress) !", "Nix", MB_OK | MB_ICONEXCLAMATION) ; + break ; + } + + ofnProc (&ofn) ; + + SetFocus (GetDlgItem (hwnd, IDOK)) ; + SetWindowTextA (GetDlgItem (hwnd, 12298), szFName) ; + SendMessageA (GetDlgItem (hwnd, 12298), CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + SetFocus (GetDlgItem (hwnd, IDOK)) ; + + FreeLibrary (hComdlg) ; + + break ; + } + } + break ; + } + } + + /* This should be DefDlgProcA, but that doesn't work */ + return DefWindowProcA (hwnd, message, wParam, lParam) ; + } + +/* This grabs the MRU list from the registry and fills the combo for the "Run" dialog above */ +void FillList (HWND hCb, char *pszLatest) + { + HKEY hkey ; +/* char szDbgMsg[256] = "" ; */ + char *pszList = NULL, *pszCmd = NULL, cMatch = 0, cMax = 0x60, szIndex[2] = "-" ; + DWORD icList = 0, icCmd = 0 ; + int Nix ; + + SendMessageA (hCb, CB_RESETCONTENT, 0, 0) ; + + if (ERROR_SUCCESS != RegCreateKeyExA ( + HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU", + 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL)) + MessageBoxA (hCb, "Unable to open registry key !", "Nix", MB_OK) ; + + if (ERROR_SUCCESS != RegQueryValueExA (hkey, "MRUList", NULL, NULL, NULL, &icList)) + MessageBoxA (hCb, "Unable to grab size for MRUList !", "Nix", MB_OK) ; + if (icList > 0) + { + pszList = malloc (icList) ; + if (ERROR_SUCCESS != RegQueryValueExA (hkey, "MRUList", NULL, NULL, pszList, &icList)) + MessageBoxA (hCb, "Unable to grab MRUList !", "Nix", MB_OK) ; + } + else + { + pszList = malloc (icList = 1) ; + pszList[0] = 0 ; + } + + for (Nix = 0 ; Nix < icList - 1 ; Nix++) + { + if (pszList[Nix] > cMax) + cMax = pszList[Nix] ; + + szIndex[0] = pszList[Nix] ; + + if (ERROR_SUCCESS != RegQueryValueExA (hkey, szIndex, NULL, NULL, NULL, &icCmd)) + MessageBoxA (hCb, "Unable to grab size of index", "Nix", MB_OK) ; + pszCmd = realloc (pszCmd, icCmd) ; + if (ERROR_SUCCESS != RegQueryValueExA (hkey, szIndex, NULL, NULL, pszCmd, &icCmd)) + MessageBoxA (hCb, "Unable to grab index", "Nix", MB_OK) ; + + if (NULL != pszLatest) + { + if (!strcasecmp (pszCmd, pszLatest)) + { + /* + sprintf (szDbgMsg, "Found existing (%d).\n", Nix) ; + MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ; + */ + SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszCmd) ; + SetWindowTextA (hCb, pszCmd) ; + SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + + cMatch = pszList[Nix] ; + memmove (&pszList[1], pszList, Nix) ; + pszList[0] = cMatch ; + continue ; + } + } + + if (26 != icList - 1 || icList - 2 != Nix || cMatch || NULL == pszLatest) + { + /* + sprintf (szDbgMsg, "Happily appending (%d).\n", Nix) ; + MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ; + */ + SendMessageA (hCb, CB_ADDSTRING, 0, (LPARAM)pszCmd) ; + if (!Nix) + { + SetWindowTextA (hCb, pszCmd) ; + SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + } + + } + else + { + /* + sprintf (szDbgMsg, "Doing loop thing.\n") ; + MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ; + */ + SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszLatest) ; + SetWindowTextA (hCb, pszLatest) ; + SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + + cMatch = pszList[Nix] ; + memmove (&pszList[1], pszList, Nix) ; + pszList[0] = cMatch ; + szIndex[0] = cMatch ; + RegSetValueExA (hkey, szIndex, 0, REG_SZ, pszLatest, strlen (pszLatest) + 1) ; + } + } + + if (!cMatch && NULL != pszLatest) + { + /* + sprintf (szDbgMsg, "Simply inserting (increasing list).\n") ; + MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ; + */ + SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszLatest) ; + SetWindowTextA (hCb, pszLatest) ; + SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + + cMatch = ++cMax ; + pszList = realloc (pszList, ++icList) ; + memmove (&pszList[1], pszList, icList - 1) ; + pszList[0] = cMatch ; + szIndex[0] = cMatch ; + RegSetValueExA (hkey, szIndex, 0, REG_SZ, pszLatest, strlen (pszLatest) + 1) ; + } + + RegSetValueExA (hkey, "MRUList", 0, REG_SZ, pszList, strlen (pszList) + 1) ; + + free (pszCmd) ; + free (pszList) ; + } /************************************************************************* * ExitWindowsDialog [SHELL32.60] Index: dlls/shell32/shell32_En.rc =================================================================== RCS file: /home/wine/wine/dlls/shell32/shell32_En.rc,v retrieving revision 1.6 diff -u -r1.6 shell32_En.rc --- dlls/shell32/shell32_En.rc 1 Jun 2002 02:55:50 -0000 1.6 +++ dlls/shell32/shell32_En.rc 6 Jun 2002 15:15:11 -0000 @@ -30,6 +30,20 @@ LTEXT "Wine was brought to you by:", 98, 8, 55, 137, 10 } +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "Helv" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + /* columns in the shellview */ STRINGTABLE LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL BEGIN