PATCH - Split fontdlg Win16/32 in commdlg
Steven Edwards
Steven_Ed4153 at yahoo.com
Sat May 24 16:25:27 CDT 2003
Hello,
While we are waiting on ole32 win16/32 separation to get commited or
send back for round 2, I figured I would go ahead and start on comdlg32.
Thanks to Dimi for pointing out I needed to not make the internal
functions static. Expect more patches to this next week.
Thanks
Steven
Changelog: Separate Win16 and Win32 font dialog support in comdlg32
-------------- next part --------------
Index: Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/commdlg/Makefile.in,v
retrieving revision 1.28
diff -u -r1.28 Makefile.in
--- Makefile.in 31 Mar 2003 23:58:27 -0000 1.28
+++ Makefile.in 24 May 2003 21:14:58 -0000
@@ -25,6 +25,9 @@
generic.c \
printdlg.c
+C_SRCS16 = \
+ fontdlg16.c \
+
RC_SRCS= rsrc.rc
@MAKE_DLL_RULES@
Index: fontdlg.c
===================================================================
RCS file: /home/wine/wine/dlls/commdlg/fontdlg.c,v
retrieving revision 1.49
diff -u -r1.49 fontdlg.c
--- fontdlg.c 29 Apr 2003 22:52:02 -0000 1.49
+++ fontdlg.c 24 May 2003 21:15:08 -0000
@@ -38,6 +38,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
#include "cdlg.h"
+#include "fontdlg.h"
static HBITMAP hBitmapTT = 0;
@@ -104,43 +105,6 @@
CI(VISCII), CI(TCVN), CI(KOI8), CI(ISO3), CI(ISO4), CI(ISO10), CI(CELTIC), 0, 0, 0, 0, 0, 0, 0, 0, CI(OEM),
};
-static void FONT_LogFont16To32A( const LPLOGFONT16 font16, LPLOGFONTA font32 )
-{
- font32->lfHeight = font16->lfHeight;
- font32->lfWidth = font16->lfWidth;
- font32->lfEscapement = font16->lfEscapement;
- font32->lfOrientation = font16->lfOrientation;
- font32->lfWeight = font16->lfWeight;
- font32->lfItalic = font16->lfItalic;
- font32->lfUnderline = font16->lfUnderline;
- font32->lfStrikeOut = font16->lfStrikeOut;
- font32->lfCharSet = font16->lfCharSet;
- font32->lfOutPrecision = font16->lfOutPrecision;
- font32->lfClipPrecision = font16->lfClipPrecision;
- font32->lfQuality = font16->lfQuality;
- font32->lfPitchAndFamily = font16->lfPitchAndFamily;
- lstrcpynA( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
-}
-
-static void CFn_CHOOSEFONT16to32A(LPCHOOSEFONT16 chf16, LPCHOOSEFONTA chf32a)
-{
- chf32a->lStructSize=sizeof(CHOOSEFONTA);
- chf32a->hwndOwner=HWND_32(chf16->hwndOwner);
- chf32a->hDC=HDC_32(chf16->hDC);
- chf32a->iPointSize=chf16->iPointSize;
- chf32a->Flags=chf16->Flags;
- chf32a->rgbColors=chf16->rgbColors;
- chf32a->lCustData=chf16->lCustData;
- chf32a->lpfnHook=NULL;
- chf32a->lpTemplateName=MapSL(chf16->lpTemplateName);
- chf32a->hInstance=HINSTANCE_32(chf16->hInstance);
- chf32a->lpszStyle=MapSL(chf16->lpszStyle);
- chf32a->nFontType=chf16->nFontType;
- chf32a->nSizeMax=chf16->nSizeMax;
- chf32a->nSizeMin=chf16->nSizeMin;
- FONT_LogFont16To32A(MapSL(chf16->lpLogFont), chf32a->lpLogFont);
-}
-
struct {
int mask;
char *name;
@@ -175,8 +139,8 @@
{0,NULL},
};
-static void
-_dump_cf_flags(DWORD cflags) {
+void _dump_cf_flags(DWORD cflags)
+{
int i;
for (i=0;cfflags[i].name;i++)
@@ -185,131 +149,6 @@
MESSAGE("\n");
}
-
-/***********************************************************************
- * ChooseFont (COMMDLG.15)
- */
-BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16 lpChFont)
-{
- HINSTANCE16 hInst;
- HANDLE16 hDlgTmpl16 = 0, hResource16 = 0;
- HGLOBAL16 hGlobal16 = 0;
- BOOL16 bRet = FALSE;
- LPCVOID template;
- FARPROC16 ptr;
- CHOOSEFONTA cf32a;
- LOGFONTA lf32a;
- LOGFONT16 *font16;
- SEGPTR lpTemplateName;
-
- cf32a.lpLogFont=&lf32a;
- CFn_CHOOSEFONT16to32A(lpChFont, &cf32a);
-
- TRACE("ChooseFont\n");
- if (!lpChFont) return FALSE;
-
- if (TRACE_ON(commdlg))
- _dump_cf_flags(lpChFont->Flags);
-
- if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE)
- {
- if (!(template = LockResource16( lpChFont->hInstance )))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
- return FALSE;
- }
- }
- else if (lpChFont->Flags & CF_ENABLETEMPLATE)
- {
- HANDLE16 hResInfo;
- if (!(hResInfo = FindResource16( lpChFont->hInstance,
- MapSL(lpChFont->lpTemplateName),
- RT_DIALOGA)))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
- return FALSE;
- }
- if (!(hDlgTmpl16 = LoadResource16( lpChFont->hInstance, hResInfo )) ||
- !(template = LockResource16( hDlgTmpl16 )))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
- return FALSE;
- }
- }
- else
- {
- HRSRC hResInfo;
- HGLOBAL hDlgTmpl32;
- LPCVOID template32;
- DWORD size;
- if (!(hResInfo = FindResourceA(COMDLG32_hInstance, "CHOOSE_FONT", RT_DIALOGA)))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
- return FALSE;
- }
- if (!(hDlgTmpl32 = LoadResource(COMDLG32_hInstance, hResInfo)) ||
- !(template32 = LockResource(hDlgTmpl32)))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
- return FALSE;
- }
- size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo);
- hGlobal16 = GlobalAlloc16(0, size);
- if (!hGlobal16)
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
- ERR("alloc failure for %ld bytes\n", size);
- return FALSE;
- }
- template = GlobalLock16(hGlobal16);
- if (!template)
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
- ERR("global lock failure for %x handle\n", hGlobal16);
- GlobalFree16(hGlobal16);
- return FALSE;
- }
- ConvertDialog32To16((LPVOID)template32, size, (LPVOID)template);
- hDlgTmpl16 = hGlobal16;
-
- }
-
- /* lpTemplateName is not used in the dialog */
- lpTemplateName=lpChFont->lpTemplateName;
- lpChFont->lpTemplateName=(SEGPTR)&cf32a;
-
- ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 16);
- hInst = GetWindowLongA(HWND_32(lpChFont->hwndOwner), GWL_HINSTANCE);
- bRet = DialogBoxIndirectParam16(hInst, hDlgTmpl16, lpChFont->hwndOwner,
- (DLGPROC16) ptr, (DWORD)lpChFont);
- if (hResource16) FreeResource16(hDlgTmpl16);
- if (hGlobal16)
- {
- GlobalUnlock16(hGlobal16);
- GlobalFree16(hGlobal16);
- }
- lpChFont->lpTemplateName=lpTemplateName;
-
-
- font16 = MapSL(lpChFont->lpLogFont);
- font16->lfHeight = cf32a.lpLogFont->lfHeight;
- font16->lfWidth = cf32a.lpLogFont->lfWidth;
- font16->lfEscapement = cf32a.lpLogFont->lfEscapement;
- font16->lfOrientation = cf32a.lpLogFont->lfOrientation;
- font16->lfWeight = cf32a.lpLogFont->lfWeight;
- font16->lfItalic = cf32a.lpLogFont->lfItalic;
- font16->lfUnderline = cf32a.lpLogFont->lfUnderline;
- font16->lfStrikeOut = cf32a.lpLogFont->lfStrikeOut;
- font16->lfCharSet = cf32a.lpLogFont->lfCharSet;
- font16->lfOutPrecision = cf32a.lpLogFont->lfOutPrecision;
- font16->lfClipPrecision = cf32a.lpLogFont->lfClipPrecision;
- font16->lfQuality = cf32a.lpLogFont->lfQuality;
- font16->lfPitchAndFamily = cf32a.lpLogFont->lfPitchAndFamily;
- lstrcpynA( font16->lfFaceName, cf32a.lpLogFont->lfFaceName, LF_FACESIZE );
- return bRet;
-}
-
-
/***********************************************************************
* ChooseFontA (COMDLG32.@)
*/
@@ -532,18 +371,6 @@
};
/***********************************************************************
- * CFn_HookCallChk [internal]
- */
-static BOOL CFn_HookCallChk(LPCHOOSEFONT16 lpcf)
-{
- if (lpcf)
- if(lpcf->Flags & CF_ENABLEHOOK)
- if (lpcf->lpfnHook)
- return TRUE;
- return FALSE;
-}
-
-/***********************************************************************
* CFn_HookCallChk32 [internal]
*/
static BOOL CFn_HookCallChk32(LPCHOOSEFONTA lpcf)
@@ -555,18 +382,10 @@
return FALSE;
}
-typedef struct
-{
- HWND hWnd1;
- HWND hWnd2;
- LPCHOOSEFONTA lpcf32a;
- int added;
-} CFn_ENUMSTRUCT, *LPCFn_ENUMSTRUCT;
-
/*************************************************************************
* AddFontFamily [internal]
*/
-static INT AddFontFamily(const LOGFONTA *lplf, UINT nFontType,
+INT AddFontFamily(const LOGFONTA *lplf, UINT nFontType,
LPCHOOSEFONTA lpcf, HWND hwnd, LPCFn_ENUMSTRUCT e)
{
int i;
@@ -608,22 +427,6 @@
return AddFontFamily(lpLogFont, dwFontType, e->lpcf32a, e->hWnd1, e);
}
-/***********************************************************************
- * FontFamilyEnumProc (COMMDLG.19)
- */
-INT16 WINAPI FontFamilyEnumProc16( SEGPTR logfont, SEGPTR metrics,
- UINT16 nFontType, LPARAM lParam )
-{
- HWND hwnd=HWND_32(LOWORD(lParam));
- HWND hDlg=GetParent(hwnd);
- LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
- LOGFONT16 *lplf = MapSL( logfont );
- LOGFONTA lf32a;
- FONT_LogFont16To32A(lplf, &lf32a);
- return AddFontFamily(&lf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
- hwnd,NULL);
-}
-
/*************************************************************************
* SetFontStylesToCombo2 [internal]
*
@@ -708,7 +511,7 @@
/***********************************************************************
* AddFontStyle [internal]
*/
-static INT AddFontStyle(const LOGFONTA *lplf, UINT nFontType,
+INT AddFontStyle(const LOGFONTA *lplf, UINT nFontType,
LPCHOOSEFONTA lpcf, HWND hcmb2, HWND hcmb3, HWND hDlg)
{
int i;
@@ -740,23 +543,6 @@
}
/***********************************************************************
- * FontStyleEnumProc (COMMDLG.18)
- */
-INT16 WINAPI FontStyleEnumProc16( SEGPTR logfont, SEGPTR metrics,
- UINT16 nFontType, LPARAM lParam )
-{
- HWND hcmb2=HWND_32(LOWORD(lParam));
- HWND hcmb3=HWND_32(HIWORD(lParam));
- HWND hDlg=GetParent(hcmb3);
- LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
- LOGFONT16 *lplf = MapSL(logfont);
- LOGFONTA lf32a;
- FONT_LogFont16To32A(lplf, &lf32a);
- return AddFontStyle(&lf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
- hcmb2, hcmb3, hDlg);
-}
-
-/***********************************************************************
* FontStyleEnumProc32 [internal]
*/
static INT WINAPI FontStyleEnumProc( const LOGFONTA *lpFont,
@@ -773,7 +559,7 @@
/***********************************************************************
* CFn_WMInitDialog [internal]
*/
-static LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam,
+LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam,
LPCHOOSEFONTA lpcf)
{
HDC hdc;
@@ -913,7 +699,7 @@
/***********************************************************************
* CFn_WMMeasureItem [internal]
*/
-static LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
+LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
BITMAP bm;
LPMEASUREITEMSTRUCT lpmi=(LPMEASUREITEMSTRUCT)lParam;
@@ -929,7 +715,7 @@
/***********************************************************************
* CFn_WMDrawItem [internal]
*/
-static LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
+LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
HBRUSH hBrush;
char buffer[40];
@@ -1031,7 +817,7 @@
/***********************************************************************
* CFn_WMCommand [internal]
*/
-static LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam,
+LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam,
LPCHOOSEFONTA lpcf)
{
int i,j;
@@ -1175,7 +961,7 @@
return(FALSE);
}
-static LRESULT CFn_WMDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam)
+LRESULT CFn_WMDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
return TRUE;
}
@@ -1227,89 +1013,6 @@
}
return FALSE;
-}
-
-/***********************************************************************
- * FormatCharDlgProc (COMMDLG.16)
- FIXME: 1. some strings are "hardcoded", but it's better load from sysres
- 2. some CF_.. flags are not supported
- 3. some TType extensions
- */
-BOOL16 CALLBACK FormatCharDlgProc16(HWND16 hDlg16, UINT16 message,
- WPARAM16 wParam, LPARAM lParam)
-{
- HWND hDlg = HWND_32(hDlg16);
- LPCHOOSEFONT16 lpcf;
- LPCHOOSEFONTA lpcf32a;
- BOOL16 res=0;
- if (message!=WM_INITDIALOG)
- {
- lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
- if (!lpcf)
- return FALSE;
- if (CFn_HookCallChk(lpcf))
- res=CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,message,wParam,lParam);
- if (res)
- return res;
- }
- else
- {
- lpcf=(LPCHOOSEFONT16)lParam;
- lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
- if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a))
- {
- TRACE("CFn_WMInitDialog returned FALSE\n");
- return FALSE;
- }
- if (CFn_HookCallChk(lpcf))
- return CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,WM_INITDIALOG,wParam,lParam);
- }
- lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
- switch (message)
- {
- case WM_MEASUREITEM:
- {
- MEASUREITEMSTRUCT16* mis16 = MapSL(lParam);
- MEASUREITEMSTRUCT mis;
- mis.CtlType = mis16->CtlType;
- mis.CtlID = mis16->CtlID;
- mis.itemID = mis16->itemID;
- mis.itemWidth = mis16->itemWidth;
- mis.itemHeight = mis16->itemHeight;
- mis.itemData = mis16->itemData;
- res = CFn_WMMeasureItem(hDlg, wParam, (LPARAM)&mis);
- mis16->itemWidth = (UINT16)mis.itemWidth;
- mis16->itemHeight = (UINT16)mis.itemHeight;
- }
- break;
- case WM_DRAWITEM:
- {
- DRAWITEMSTRUCT16* dis16 = MapSL(lParam);
- DRAWITEMSTRUCT dis;
- dis.CtlType = dis16->CtlType;
- dis.CtlID = dis16->CtlID;
- dis.itemID = dis16->itemID;
- dis.itemAction = dis16->itemAction;
- dis.itemState = dis16->itemState;
- dis.hwndItem = HWND_32(dis16->hwndItem);
- dis.hDC = HDC_32(dis16->hDC);
- dis.itemData = dis16->itemData;
- CONV_RECT16TO32( &dis16->rcItem, &dis.rcItem );
- res = CFn_WMDrawItem(hDlg, wParam, (LPARAM)&dis);
- }
- break;
- case WM_COMMAND:
- res=CFn_WMCommand(hDlg, MAKEWPARAM( wParam, HIWORD(lParam) ), LOWORD(lParam), lpcf32a);
- break;
- case WM_DESTROY:
- res=CFn_WMDestroy(hDlg, wParam, lParam);
- break;
- case WM_CHOOSEFONT_GETLOGFONT:
- TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam);
- FIXME("current logfont back to caller\n");
- break;
- }
- return res;
}
/***********************************************************************
--- /dev/null Sat May 24 17:17:35 2003
+++ fontdlg.h Sat May 24 17:15:02 2003
@@ -0,0 +1,54 @@
+/*
+ * COMMDLG - Font Dialog
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * DO NOT EXPORT TO APPLICATIONS -
+ * This file only defines the internal functions that are shared to
+ * implement the Win16 and Win32 font dialog support.
+ *
+ */
+
+#ifndef _WINE_FONTDLG_H
+#define _WINE_FONTDLG_H
+
+#include "commdlg.h"
+
+typedef struct
+{
+ HWND hWnd1;
+ HWND hWnd2;
+ LPCHOOSEFONTA lpcf32a;
+ int added;
+} CFn_ENUMSTRUCT, *LPCFn_ENUMSTRUCT;
+
+INT AddFontFamily(const LOGFONTA *lplf, UINT nFontType, LPCHOOSEFONTA lpcf,
+ HWND hwnd, LPCFn_ENUMSTRUCT e);
+INT AddFontStyle(const LOGFONTA *lplf, UINT nFontType, LPCHOOSEFONTA lpcf,
+ HWND hcmb2, HWND hcmb3, HWND hDlg);
+void _dump_cf_flags(DWORD cflags);
+
+LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam,
+ LPCHOOSEFONTA lpcf);
+LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam);
+LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam);
+LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam,
+ LPCHOOSEFONTA lpcf);
+LRESULT CFn_WMDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam);
+
+#endif /* _WINE_FONTDLG_H */
--- /dev/null Sat May 24 17:17:44 2003
+++ fontdlg16.c Sat May 24 16:59:48 2003
@@ -0,0 +1,329 @@
+/*
+ * COMMDLG - Font Dialog
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "windef.h"
+#include "winnls.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "wine/winbase16.h"
+#include "wine/winuser16.h"
+#include "heap.h"
+#include "commdlg.h"
+#include "dlgs.h"
+#include "wine/debug.h"
+#include "cderr.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
+
+#include "cdlg.h"
+#include "fontdlg.h"
+
+static void FONT_LogFont16To32A( const LPLOGFONT16 font16, LPLOGFONTA font32 )
+{
+ font32->lfHeight = font16->lfHeight;
+ font32->lfWidth = font16->lfWidth;
+ font32->lfEscapement = font16->lfEscapement;
+ font32->lfOrientation = font16->lfOrientation;
+ font32->lfWeight = font16->lfWeight;
+ font32->lfItalic = font16->lfItalic;
+ font32->lfUnderline = font16->lfUnderline;
+ font32->lfStrikeOut = font16->lfStrikeOut;
+ font32->lfCharSet = font16->lfCharSet;
+ font32->lfOutPrecision = font16->lfOutPrecision;
+ font32->lfClipPrecision = font16->lfClipPrecision;
+ font32->lfQuality = font16->lfQuality;
+ font32->lfPitchAndFamily = font16->lfPitchAndFamily;
+ lstrcpynA( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
+};
+
+static void CFn_CHOOSEFONT16to32A(LPCHOOSEFONT16 chf16, LPCHOOSEFONTA chf32a)
+{
+ chf32a->lStructSize=sizeof(CHOOSEFONTA);
+ chf32a->hwndOwner=HWND_32(chf16->hwndOwner);
+ chf32a->hDC=HDC_32(chf16->hDC);
+ chf32a->iPointSize=chf16->iPointSize;
+ chf32a->Flags=chf16->Flags;
+ chf32a->rgbColors=chf16->rgbColors;
+ chf32a->lCustData=chf16->lCustData;
+ chf32a->lpfnHook=NULL;
+ chf32a->lpTemplateName=MapSL(chf16->lpTemplateName);
+ chf32a->hInstance=HINSTANCE_32(chf16->hInstance);
+ chf32a->lpszStyle=MapSL(chf16->lpszStyle);
+ chf32a->nFontType=chf16->nFontType;
+ chf32a->nSizeMax=chf16->nSizeMax;
+ chf32a->nSizeMin=chf16->nSizeMin;
+ FONT_LogFont16To32A(MapSL(chf16->lpLogFont), chf32a->lpLogFont);
+};
+
+/***********************************************************************
+ * CFn_HookCallChk [internal]
+ */
+static BOOL CFn_HookCallChk(LPCHOOSEFONT16 lpcf)
+{
+ if (lpcf)
+ if(lpcf->Flags & CF_ENABLEHOOK)
+ if (lpcf->lpfnHook)
+ return TRUE;
+ return FALSE;
+}
+
+/***********************************************************************
+ * FontFamilyEnumProc (COMMDLG.19)
+ */
+INT16 WINAPI FontFamilyEnumProc16( SEGPTR logfont, SEGPTR metrics,
+ UINT16 nFontType, LPARAM lParam )
+{
+ HWND hwnd=HWND_32(LOWORD(lParam));
+ HWND hDlg=GetParent(hwnd);
+ LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
+ LOGFONT16 *lplf = MapSL( logfont );
+ LOGFONTA lf32a;
+ FONT_LogFont16To32A(lplf, &lf32a);
+ return AddFontFamily(&lf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
+ hwnd,NULL);
+}
+
+/***********************************************************************
+ * FontStyleEnumProc (COMMDLG.18)
+ */
+INT16 WINAPI FontStyleEnumProc16( SEGPTR logfont, SEGPTR metrics,
+ UINT16 nFontType, LPARAM lParam )
+{
+ HWND hcmb2=HWND_32(LOWORD(lParam));
+ HWND hcmb3=HWND_32(HIWORD(lParam));
+ HWND hDlg=GetParent(hcmb3);
+ LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
+ LOGFONT16 *lplf = MapSL(logfont);
+ LOGFONTA lf32a;
+ FONT_LogFont16To32A(lplf, &lf32a);
+ return AddFontStyle(&lf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
+ hcmb2, hcmb3, hDlg);
+}
+
+/***********************************************************************
+ * ChooseFont (COMMDLG.15)
+ */
+BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16 lpChFont)
+{
+ HINSTANCE16 hInst;
+ HANDLE16 hDlgTmpl16 = 0, hResource16 = 0;
+ HGLOBAL16 hGlobal16 = 0;
+ BOOL16 bRet = FALSE;
+ LPCVOID template;
+ FARPROC16 ptr;
+ CHOOSEFONTA cf32a;
+ LOGFONTA lf32a;
+ LOGFONT16 *font16;
+ SEGPTR lpTemplateName;
+
+ cf32a.lpLogFont=&lf32a;
+ CFn_CHOOSEFONT16to32A(lpChFont, &cf32a);
+
+ TRACE("ChooseFont\n");
+ if (!lpChFont) return FALSE;
+
+ if (TRACE_ON(commdlg))
+ _dump_cf_flags(lpChFont->Flags);
+
+ if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE)
+ {
+ if (!(template = LockResource16( lpChFont->hInstance )))
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
+ return FALSE;
+ }
+ }
+ else if (lpChFont->Flags & CF_ENABLETEMPLATE)
+ {
+ HANDLE16 hResInfo;
+ if (!(hResInfo = FindResource16( lpChFont->hInstance,
+ MapSL(lpChFont->lpTemplateName),
+ RT_DIALOGA)))
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
+ return FALSE;
+ }
+ if (!(hDlgTmpl16 = LoadResource16( lpChFont->hInstance, hResInfo )) ||
+ !(template = LockResource16( hDlgTmpl16 )))
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
+ return FALSE;
+ }
+ }
+ else
+ {
+ HRSRC hResInfo;
+ HGLOBAL hDlgTmpl32;
+ LPCVOID template32;
+ DWORD size;
+ if (!(hResInfo = FindResourceA(COMDLG32_hInstance, "CHOOSE_FONT", RT_DIALOGA)))
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
+ return FALSE;
+ }
+ if (!(hDlgTmpl32 = LoadResource(COMDLG32_hInstance, hResInfo)) ||
+ !(template32 = LockResource(hDlgTmpl32)))
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
+ return FALSE;
+ }
+ size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo);
+ hGlobal16 = GlobalAlloc16(0, size);
+ if (!hGlobal16)
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
+ ERR("alloc failure for %ld bytes\n", size);
+ return FALSE;
+ }
+ template = GlobalLock16(hGlobal16);
+ if (!template)
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
+ ERR("global lock failure for %x handle\n", hGlobal16);
+ GlobalFree16(hGlobal16);
+ return FALSE;
+ }
+ ConvertDialog32To16((LPVOID)template32, size, (LPVOID)template);
+ hDlgTmpl16 = hGlobal16;
+
+ }
+
+ /* lpTemplateName is not used in the dialog */
+ lpTemplateName=lpChFont->lpTemplateName;
+ lpChFont->lpTemplateName=(SEGPTR)&cf32a;
+
+ ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 16);
+ hInst = GetWindowLongA(HWND_32(lpChFont->hwndOwner), GWL_HINSTANCE);
+ bRet = DialogBoxIndirectParam16(hInst, hDlgTmpl16, lpChFont->hwndOwner,
+ (DLGPROC16) ptr, (DWORD)lpChFont);
+ if (hResource16) FreeResource16(hDlgTmpl16);
+ if (hGlobal16)
+ {
+ GlobalUnlock16(hGlobal16);
+ GlobalFree16(hGlobal16);
+ }
+ lpChFont->lpTemplateName=lpTemplateName;
+
+
+ font16 = MapSL(lpChFont->lpLogFont);
+ font16->lfHeight = cf32a.lpLogFont->lfHeight;
+ font16->lfWidth = cf32a.lpLogFont->lfWidth;
+ font16->lfEscapement = cf32a.lpLogFont->lfEscapement;
+ font16->lfOrientation = cf32a.lpLogFont->lfOrientation;
+ font16->lfWeight = cf32a.lpLogFont->lfWeight;
+ font16->lfItalic = cf32a.lpLogFont->lfItalic;
+ font16->lfUnderline = cf32a.lpLogFont->lfUnderline;
+ font16->lfStrikeOut = cf32a.lpLogFont->lfStrikeOut;
+ font16->lfCharSet = cf32a.lpLogFont->lfCharSet;
+ font16->lfOutPrecision = cf32a.lpLogFont->lfOutPrecision;
+ font16->lfClipPrecision = cf32a.lpLogFont->lfClipPrecision;
+ font16->lfQuality = cf32a.lpLogFont->lfQuality;
+ font16->lfPitchAndFamily = cf32a.lpLogFont->lfPitchAndFamily;
+ lstrcpynA( font16->lfFaceName, cf32a.lpLogFont->lfFaceName, LF_FACESIZE );
+ return bRet;
+}
+
+/***********************************************************************
+ * FormatCharDlgProc (COMMDLG.16)
+ FIXME: 1. some strings are "hardcoded", but it's better load from sysres
+ 2. some CF_.. flags are not supported
+ 3. some TType extensions
+ */
+BOOL16 CALLBACK FormatCharDlgProc16(HWND16 hDlg16, UINT16 message,
+ WPARAM16 wParam, LPARAM lParam)
+{
+ HWND hDlg = HWND_32(hDlg16);
+ LPCHOOSEFONT16 lpcf;
+ LPCHOOSEFONTA lpcf32a;
+ BOOL16 res=0;
+ if (message!=WM_INITDIALOG)
+ {
+ lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
+ if (!lpcf)
+ return FALSE;
+ if (CFn_HookCallChk(lpcf))
+ res=CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,message,wParam,lParam);
+ if (res)
+ return res;
+ }
+ else
+ {
+ lpcf=(LPCHOOSEFONT16)lParam;
+ lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
+ if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a))
+ {
+ TRACE("CFn_WMInitDialog returned FALSE\n");
+ return FALSE;
+ }
+ if (CFn_HookCallChk(lpcf))
+ return CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,WM_INITDIALOG,wParam,lParam);
+ }
+ lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
+ switch (message)
+ {
+ case WM_MEASUREITEM:
+ {
+ MEASUREITEMSTRUCT16* mis16 = MapSL(lParam);
+ MEASUREITEMSTRUCT mis;
+ mis.CtlType = mis16->CtlType;
+ mis.CtlID = mis16->CtlID;
+ mis.itemID = mis16->itemID;
+ mis.itemWidth = mis16->itemWidth;
+ mis.itemHeight = mis16->itemHeight;
+ mis.itemData = mis16->itemData;
+ res = CFn_WMMeasureItem(hDlg, wParam, (LPARAM)&mis);
+ mis16->itemWidth = (UINT16)mis.itemWidth;
+ mis16->itemHeight = (UINT16)mis.itemHeight;
+ }
+ break;
+ case WM_DRAWITEM:
+ {
+ DRAWITEMSTRUCT16* dis16 = MapSL(lParam);
+ DRAWITEMSTRUCT dis;
+ dis.CtlType = dis16->CtlType;
+ dis.CtlID = dis16->CtlID;
+ dis.itemID = dis16->itemID;
+ dis.itemAction = dis16->itemAction;
+ dis.itemState = dis16->itemState;
+ dis.hwndItem = HWND_32(dis16->hwndItem);
+ dis.hDC = HDC_32(dis16->hDC);
+ dis.itemData = dis16->itemData;
+ CONV_RECT16TO32( &dis16->rcItem, &dis.rcItem );
+ res = CFn_WMDrawItem(hDlg, wParam, (LPARAM)&dis);
+ }
+ break;
+ case WM_COMMAND:
+ res=CFn_WMCommand(hDlg, MAKEWPARAM( wParam, HIWORD(lParam) ), LOWORD(lParam), lpcf32a);
+ break;
+ case WM_DESTROY:
+ res=CFn_WMDestroy(hDlg, wParam, lParam);
+ break;
+ case WM_CHOOSEFONT_GETLOGFONT:
+ TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam);
+ FIXME("current logfont back to caller\n");
+ break;
+ }
+ return res;
+}
More information about the wine-patches
mailing list