All of this just to remove one call to CallWindowProc16. There has got to be a better way to do this as we are going to end up with a lot of duplicated code for Win16 support. This thing needs a total rewrite.
Changelog:
More splitting of the Win16/32 internal filedlgproc Window Procedures and Dialog Init.
Make a few internal function static and share a few others.
Index: filedlg.h =================================================================== RCS file: /home/wine/wine/dlls/commdlg/filedlg.h,v retrieving revision 1.1 diff -u -r1.1 filedlg.h --- filedlg.h 16 Jun 2003 01:19:16 -0000 1.1 +++ filedlg.h 19 Jun 2003 15:11:40 -0000 @@ -58,10 +58,9 @@ * Do not Export to other applications or dlls */ -BOOL FILEDLG_CallWindowProc(LFSPRIVATE lfs, UINT wMsg, WPARAM wParam, - LPARAM lParam); -LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam); +LPWSTR FILEDLG_GetFileType(LPWSTR cfptr, LPWSTR fptr, WORD index); void FILEDLG_MapDrawItemStruct(LPDRAWITEMSTRUCT16 lpdis16, LPDRAWITEMSTRUCT lpdis); +BOOL FILEDLG_ScanDir(HWND hWnd, LPWSTR newPath); LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam, int savedlg, LPDRAWITEMSTRUCT lpdis); LRESULT FILEDLG_WMCommand(HWND hWnd, LPARAM lParam, UINT notification, *****CVS exited normally with code 1***** cvs diff -u filedlg.c Index: filedlg.c =================================================================== RCS file: /home/wine/wine/dlls/commdlg/filedlg.c,v retrieving revision 1.63 diff -u -r1.63 filedlg.c --- filedlg.c 16 Jun 2003 01:19:16 -0000 1.63 +++ filedlg.c 19 Jun 2003 15:11:49 -0000 @@ -257,15 +257,9 @@ * * Call the appropriate hook */ -BOOL FILEDLG_CallWindowProc(LFSPRIVATE lfs, UINT wMsg, WPARAM wParam, +static BOOL FILEDLG_CallWindowProc(LFSPRIVATE lfs, UINT wMsg, WPARAM wParam, LPARAM lParam) { - if (lfs->ofn16) - { - return (BOOL16) CallWindowProc16( - (WNDPROC16)lfs->ofn16->lpfnHook, HWND_16(lfs->hwnd), - (UINT16)wMsg, (WPARAM16)wParam, lParam); - } if (lfs->ofnA) { return (BOOL) CallWindowProcA( @@ -286,7 +280,7 @@ /*********************************************************************** * FILEDLG_ScanDir [internal] */ -static BOOL FILEDLG_ScanDir(HWND hWnd, LPWSTR newPath) +BOOL FILEDLG_ScanDir(HWND hWnd, LPWSTR newPath) { WCHAR buffer[BUFFILE]; HWND hdlg, hdlgDir; @@ -338,7 +332,7 @@ * FILEDLG_GetFileType [internal] */ -static LPWSTR FILEDLG_GetFileType(LPWSTR cfptr, LPWSTR fptr, WORD index) +LPWSTR FILEDLG_GetFileType(LPWSTR cfptr, LPWSTR fptr, WORD index) { int n, i; i = 0; @@ -482,7 +476,7 @@ * FILEDLG_WMInitDialog [internal] */ -LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) +static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) { int i, n; WCHAR tmpstr[BUFFILE]; Index: filedlg16.c =================================================================== RCS file: /home/wine/wine/dlls/commdlg/filedlg16.c,v retrieving revision 1.1 diff -u -r1.1 filedlg16.c --- filedlg16.c 16 Jun 2003 01:19:16 -0000 1.1 +++ filedlg16.c 19 Jun 2003 15:11:57 -0000 @@ -40,6 +40,139 @@ #include "filedlg.h" /*********************************************************************** + * FILEDLG_CallWindowProc16 [internal] + * + * Call the appropriate hook + */ +static BOOL FILEDLG_CallWindowProc16(LFSPRIVATE lfs, UINT wMsg, WPARAM wParam, + LPARAM lParam) +{ + if (lfs->ofn16) + { + return (BOOL16) CallWindowProc16( + (WNDPROC16)lfs->ofn16->lpfnHook, HWND_16(lfs->hwnd), + (UINT16)wMsg, (WPARAM16)wParam, lParam); + } + return FALSE; +} + +/*********************************************************************** + * FILEDLG_WMInitDialog16 [internal] + * The is a duplicate of the 32bit FILEDLG_WMInitDialog function + * The only differnce is that it calls FILEDLG_CallWindowProc16 + * for a 16 bit Window Proc. + */ + +static LONG FILEDLG_WMInitDialog16(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + int i, n; + WCHAR tmpstr[BUFFILE]; + LPWSTR pstr, old_pstr; + LPOPENFILENAMEW ofn; + LFSPRIVATE lfs = (LFSPRIVATE) lParam; + + if (!lfs) return FALSE; + SetPropA(hWnd, OFN_PROP, (HANDLE)lfs); + lfs->hwnd = hWnd; + ofn = lfs->ofnW; + + TRACE("flags=%lx initialdir=%s\n", ofn->Flags, debugstr_w(ofn->lpstrInitialDir)); + + SetWindowTextW( hWnd, ofn->lpstrTitle ); + /* read custom filter information */ + if (ofn->lpstrCustomFilter) + { + pstr = ofn->lpstrCustomFilter; + n = 0; + TRACE("lpstrCustomFilter = %p\n", pstr); + while(*pstr) + { + old_pstr = pstr; + i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, + (LPARAM)(ofn->lpstrCustomFilter) + n ); + n += lstrlenW(pstr) + 1; + pstr += lstrlenW(pstr) + 1; + TRACE("add str=%s associated to %s\n", + debugstr_w(old_pstr), debugstr_w(pstr)); + SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); + n += lstrlenW(pstr) + 1; + pstr += lstrlenW(pstr) + 1; + } + } + /* read filter information */ + if (ofn->lpstrFilter) { + pstr = (LPWSTR) ofn->lpstrFilter; + n = 0; + while(*pstr) { + old_pstr = pstr; + i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, + (LPARAM)(ofn->lpstrFilter + n) ); + n += lstrlenW(pstr) + 1; + pstr += lstrlenW(pstr) + 1; + TRACE("add str=%s associated to %s\n", + debugstr_w(old_pstr), debugstr_w(pstr)); + SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); + n += lstrlenW(pstr) + 1; + pstr += lstrlenW(pstr) + 1; + } + } + /* set default filter */ + if (ofn->nFilterIndex == 0 && ofn->lpstrCustomFilter == NULL) + ofn->nFilterIndex = 1; + SendDlgItemMessageW(hWnd, cmb1, CB_SETCURSEL, ofn->nFilterIndex - 1, 0); + lstrcpynW(tmpstr, FILEDLG_GetFileType(ofn->lpstrCustomFilter, + (LPWSTR)ofn->lpstrFilter, ofn->nFilterIndex - 1),BUFFILE); + TRACE("nFilterIndex = %ld, SetText of edt1 to %s\n", + ofn->nFilterIndex, debugstr_w(tmpstr)); + SetDlgItemTextW( hWnd, edt1, tmpstr ); + /* get drive list */ + *tmpstr = 0; + DlgDirListComboBoxW(hWnd, tmpstr, cmb2, 0, DDL_DRIVES | DDL_EXCLUSIVE); + /* read initial directory */ + /* FIXME: Note that this is now very version-specific (See MSDN description of + * the OPENFILENAME structure). For example under 2000/XP any path in the + * lpstrFile overrides the lpstrInitialDir, but not under 95/98/ME + */ + if (ofn->lpstrInitialDir != NULL) + { + int len; + lstrcpynW(tmpstr, ofn->lpstrInitialDir, 511); + len = lstrlenW(tmpstr); + if (len > 0 && tmpstr[len-1] != '\\' && tmpstr[len-1] != ':') { + tmpstr[len]='\\'; + tmpstr[len+1]='\0'; + } + } + else + *tmpstr = 0; + if (!FILEDLG_ScanDir(hWnd, tmpstr)) { + *tmpstr = 0; + if (!FILEDLG_ScanDir(hWnd, tmpstr)) + WARN("Couldn't read initial directory %s!\n", debugstr_w(tmpstr)); + } + /* select current drive in combo 2, omit missing drives */ + { + char dir[MAX_PATH]; + char str[4] = "a:\\"; + GetCurrentDirectoryA( sizeof(dir), dir ); + for(i = 0, n = -1; i < 26; i++) + { + str[0] = 'a' + i; + if (GetDriveTypeA(str) > DRIVE_NO_ROOT_DIR) n++; + if (toupper(str[0]) == toupper(dir[0])) break; + } + } + SendDlgItemMessageW(hWnd, cmb2, CB_SETCURSEL, n, 0); + if (!(ofn->Flags & OFN_SHOWHELP)) + ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE); + if (ofn->Flags & OFN_HIDEREADONLY) + ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE); + if (lfs->hook) + return (BOOL) FILEDLG_CallWindowProc16(lfs, WM_INITDIALOG, wParam, lfs->lParam); + return TRUE; +} + +/*********************************************************************** * FILEDLG_WMMeasureItem16 [internal] */ static LONG FILEDLG_WMMeasureItem16(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) @@ -66,14 +199,14 @@ TRACE("msg=%x wparam=%x lParam=%lx\n", wMsg, wParam, lParam); if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook) { - LRESULT lRet = (BOOL16)FILEDLG_CallWindowProc(lfs, wMsg, wParam, lParam); + LRESULT lRet = (BOOL16)FILEDLG_CallWindowProc16(lfs, wMsg, wParam, lParam); if (lRet) return lRet; /* else continue message processing */ } switch (wMsg) { case WM_INITDIALOG: - return FILEDLG_WMInitDialog(hWnd, wParam, lParam); + return FILEDLG_WMInitDialog16(hWnd, wParam, lParam); case WM_MEASUREITEM: return FILEDLG_WMMeasureItem16(hWnd16, wParam, lParam); @@ -116,13 +249,13 @@ if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook) { LRESULT lRet; - lRet = (BOOL16)FILEDLG_CallWindowProc(lfs, wMsg, wParam, lParam); + lRet = (BOOL16)FILEDLG_CallWindowProc16(lfs, wMsg, wParam, lParam); if (lRet) return lRet; /* else continue message processing */ } switch (wMsg) { case WM_INITDIALOG: - return FILEDLG_WMInitDialog(hWnd, wParam, lParam); + return FILEDLG_WMInitDialog16(hWnd, wParam, lParam); case WM_MEASUREITEM: return FILEDLG_WMMeasureItem16(hWnd16, wParam, lParam);