Commit 04c1f9f8 authored by Alexandre Julliard's avatar Alexandre Julliard

Only compute dialog base units once we need them.

parent c28575e0
...@@ -138,8 +138,7 @@ inline static DIALOGINFO *DIALOG_get_info( HWND hwnd ) ...@@ -138,8 +138,7 @@ inline static DIALOGINFO *DIALOG_get_info( HWND hwnd )
return (DIALOGINFO *)GetWindowLongW( hwnd, DWL_WINE_DIALOGINFO ); return (DIALOGINFO *)GetWindowLongW( hwnd, DWL_WINE_DIALOGINFO );
} }
extern BOOL DIALOG_Init(void); extern BOOL DIALOG_GetCharSize( HDC hdc, HFONT hFont, SIZE * pSize );
extern BOOL DIALOG_GetCharSize( HFONT hFont, SIZE * pSize );
extern void DIALOG_EnableOwner( HWND hOwner ); extern void DIALOG_EnableOwner( HWND hOwner );
extern BOOL DIALOG_DisableOwner( HWND hOwner ); extern BOOL DIALOG_DisableOwner( HWND hOwner );
extern INT DIALOG_DoDialogBox( HWND hwnd, HWND owner ); extern INT DIALOG_DoDialogBox( HWND hwnd, HWND owner );
......
...@@ -324,19 +324,19 @@ static HWND DIALOG_CreateIndirect16( HINSTANCE16 hInst, LPCVOID dlgTemplate, ...@@ -324,19 +324,19 @@ static HWND DIALOG_CreateIndirect16( HINSTANCE16 hInst, LPCVOID dlgTemplate,
int pixels; int pixels;
dc = GetDC(0); dc = GetDC(0);
pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72); pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
ReleaseDC(0, dc);
dlgInfo->hUserFont = CreateFontA( -pixels, 0, 0, 0, FW_DONTCARE, dlgInfo->hUserFont = CreateFontA( -pixels, 0, 0, 0, FW_DONTCARE,
FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0, FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
PROOF_QUALITY, FF_DONTCARE, template.faceName ); PROOF_QUALITY, FF_DONTCARE, template.faceName );
if (dlgInfo->hUserFont) if (dlgInfo->hUserFont)
{ {
SIZE charSize; SIZE charSize;
if (DIALOG_GetCharSize( dlgInfo->hUserFont, &charSize )) if (DIALOG_GetCharSize( dc, dlgInfo->hUserFont, &charSize ))
{ {
dlgInfo->xBaseUnit = charSize.cx; dlgInfo->xBaseUnit = charSize.cx;
dlgInfo->yBaseUnit = charSize.cy; dlgInfo->yBaseUnit = charSize.cy;
} }
} }
ReleaseDC(0, dc);
TRACE("units = %d,%d\n", dlgInfo->xBaseUnit, dlgInfo->yBaseUnit ); TRACE("units = %d,%d\n", dlgInfo->xBaseUnit, dlgInfo->yBaseUnit );
} }
......
...@@ -243,9 +243,6 @@ static BOOL process_attach(void) ...@@ -243,9 +243,6 @@ static BOOL process_attach(void)
/* Initialize built-in window classes */ /* Initialize built-in window classes */
controls_init(); controls_init();
/* Initialize dialog manager */
if (!DIALOG_Init()) return FALSE;
/* Initialize menus */ /* Initialize menus */
if (!MENU_Init()) return FALSE; if (!MENU_Init()) return FALSE;
......
...@@ -89,9 +89,6 @@ typedef struct ...@@ -89,9 +89,6 @@ typedef struct
UINT checkID; UINT checkID;
} RADIOGROUP; } RADIOGROUP;
/* Dialog base units */
static WORD xBaseUnit = 0, yBaseUnit = 0;
/********************************************************************* /*********************************************************************
* dialog class descriptor * dialog class descriptor
...@@ -146,7 +143,7 @@ BOOL DIALOG_DisableOwner( HWND hOwner ) ...@@ -146,7 +143,7 @@ BOOL DIALOG_DisableOwner( HWND hOwner )
} }
/*********************************************************************** /***********************************************************************
* DIALOG_GetCharSizeFromDC * DIALOG_GetCharSize
* *
* Despite most of MSDN insisting that the horizontal base unit is * Despite most of MSDN insisting that the horizontal base unit is
* tmAveCharWidth it isn't. Knowledge base article Q145994 * tmAveCharWidth it isn't. Knowledge base article Q145994
...@@ -154,16 +151,13 @@ BOOL DIALOG_DisableOwner( HWND hOwner ) ...@@ -154,16 +151,13 @@ BOOL DIALOG_DisableOwner( HWND hOwner )
* says that we should take the average of the 52 English upper and lower * says that we should take the average of the 52 English upper and lower
* case characters. * case characters.
*/ */
static BOOL DIALOG_GetCharSizeFromDC( HDC hDC, HFONT hFont, SIZE * pSize ) BOOL DIALOG_GetCharSize( HDC hDC, HFONT hFont, SIZE * pSize )
{ {
HFONT hFontPrev = 0; HFONT hFontPrev = 0;
char *alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char *alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
SIZE sz; SIZE sz;
TEXTMETRICA tm; TEXTMETRICA tm;
pSize->cx = xBaseUnit;
pSize->cy = yBaseUnit;
if(!hDC) return FALSE; if(!hDC) return FALSE;
if(hFont) hFontPrev = SelectObject(hDC, hFont); if(hFont) hFontPrev = SelectObject(hDC, hFont);
...@@ -179,52 +173,6 @@ static BOOL DIALOG_GetCharSizeFromDC( HDC hDC, HFONT hFont, SIZE * pSize ) ...@@ -179,52 +173,6 @@ static BOOL DIALOG_GetCharSizeFromDC( HDC hDC, HFONT hFont, SIZE * pSize )
return TRUE; return TRUE;
} }
/***********************************************************************
* DIALOG_GetCharSize
*
* A convenient variant of DIALOG_GetCharSizeFromDC.
*/
BOOL DIALOG_GetCharSize( HFONT hFont, SIZE * pSize )
{
HDC hDC = GetDC(0);
BOOL Success = DIALOG_GetCharSizeFromDC( hDC, hFont, pSize );
ReleaseDC(0, hDC);
return Success;
}
/***********************************************************************
* DIALOG_Init
*
* Initialisation of the dialog manager.
*/
BOOL DIALOG_Init(void)
{
HDC hdc;
SIZE size;
/* Calculate the dialog base units */
if (!(hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL )))
{
ERR("Could not create Display DC\n");
return FALSE;
}
if (!DIALOG_GetCharSizeFromDC( hdc, 0, &size ))
{
DeleteDC( hdc );
ERR("Could not initialize base dialog units\n");
return FALSE;
}
DeleteDC( hdc );
xBaseUnit = size.cx;
yBaseUnit = size.cy;
TRACE("base units = %d,%d\n", xBaseUnit, yBaseUnit );
return TRUE;
}
/*********************************************************************** /***********************************************************************
* DIALOG_GetControl32 * DIALOG_GetControl32
...@@ -545,6 +493,7 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate, ...@@ -545,6 +493,7 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
WND * wndPtr; WND * wndPtr;
DLG_TEMPLATE template; DLG_TEMPLATE template;
DIALOGINFO * dlgInfo; DIALOGINFO * dlgInfo;
DWORD units = GetDialogBaseUnits();
BOOL ownerEnabled = TRUE; BOOL ownerEnabled = TRUE;
/* Parse dialog template */ /* Parse dialog template */
...@@ -558,8 +507,8 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate, ...@@ -558,8 +507,8 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
dlgInfo->hwndFocus = 0; dlgInfo->hwndFocus = 0;
dlgInfo->hUserFont = 0; dlgInfo->hUserFont = 0;
dlgInfo->hMenu = 0; dlgInfo->hMenu = 0;
dlgInfo->xBaseUnit = xBaseUnit; dlgInfo->xBaseUnit = LOWORD(units);
dlgInfo->yBaseUnit = yBaseUnit; dlgInfo->yBaseUnit = HIWORD(units);
dlgInfo->idResult = 0; dlgInfo->idResult = 0;
dlgInfo->flags = 0; dlgInfo->flags = 0;
dlgInfo->hDialogHeap = 0; dlgInfo->hDialogHeap = 0;
...@@ -578,7 +527,6 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate, ...@@ -578,7 +527,6 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
int pixels; int pixels;
dc = GetDC(0); dc = GetDC(0);
pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72); pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
ReleaseDC(0, dc);
dlgInfo->hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight, dlgInfo->hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight,
template.italic, FALSE, FALSE, DEFAULT_CHARSET, 0, 0, template.italic, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
PROOF_QUALITY, FF_DONTCARE, PROOF_QUALITY, FF_DONTCARE,
...@@ -586,12 +534,13 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate, ...@@ -586,12 +534,13 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
if (dlgInfo->hUserFont) if (dlgInfo->hUserFont)
{ {
SIZE charSize; SIZE charSize;
if (DIALOG_GetCharSize( dlgInfo->hUserFont, &charSize )) if (DIALOG_GetCharSize( dc, dlgInfo->hUserFont, &charSize ))
{ {
dlgInfo->xBaseUnit = charSize.cx; dlgInfo->xBaseUnit = charSize.cx;
dlgInfo->yBaseUnit = charSize.cy; dlgInfo->yBaseUnit = charSize.cy;
} }
} }
ReleaseDC(0, dc);
TRACE("units = %d,%d\n", dlgInfo->xBaseUnit, dlgInfo->yBaseUnit ); TRACE("units = %d,%d\n", dlgInfo->xBaseUnit, dlgInfo->yBaseUnit );
} }
...@@ -1358,7 +1307,21 @@ BOOL WINAPI CheckRadioButton( HWND hwndDlg, UINT firstID, ...@@ -1358,7 +1307,21 @@ BOOL WINAPI CheckRadioButton( HWND hwndDlg, UINT firstID,
*/ */
DWORD WINAPI GetDialogBaseUnits(void) DWORD WINAPI GetDialogBaseUnits(void)
{ {
return MAKELONG( xBaseUnit, yBaseUnit ); static DWORD units;
if (!units)
{
HDC hdc;
SIZE size;
if ((hdc = GetDC(0)))
{
if (DIALOG_GetCharSize( hdc, 0, &size )) units = MAKELONG( size.cx, size.cy );
ReleaseDC( 0, hdc );
}
TRACE("base units = %d,%d\n", LOWORD(units), HIWORD(units) );
}
return units;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment