diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-06-06 11:32:19 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-06-06 11:32:19 +0200 |
| commit | d607540dbaf8a0b2a24dceb27ebddddb420ffd0f (patch) | |
| tree | 910ff59ef51d6366c4c4ee2ef5f9e8a68b412dc6 /alf | |
| parent | db6974eda1dc1fada95af97ea53c369db58fda41 (diff) | |
redintroduce update fonts vfunc, hopefully more useful now
Diffstat (limited to 'alf')
| -rw-r--r-- | alf/alf.cpp | 6 | ||||
| -rw-r--r-- | alf/alf.h | 12 | ||||
| -rw-r--r-- | alf/alftoplevel.cpp | 57 |
3 files changed, 48 insertions, 27 deletions
diff --git a/alf/alf.cpp b/alf/alf.cpp index fbee438..605f663 100644 --- a/alf/alf.cpp +++ b/alf/alf.cpp @@ -6,12 +6,6 @@ static LONG _alf_initLock = 0; static LONG _alf_initCounter = 0; void -ALF_UpdateFonts(HWND win) -{ - SendMessage(win, ALF_WM_UPDATEFONTS, 0, 0); -} - -void ALF_Initialize(void) { // acquire init lock @@ -18,6 +18,7 @@ typedef struct { BOOL (*pretranslatemessage)(void * /*closure*/, HWND /*window*/, MSG * /*message*/); void (*paint)(void * /*closure*/, HWND, HDC, RECT *); void (*windowposchanged)(void * /*closure*/, HWND, WINDOWPOS *); + void (*updatefontsdpi)(void * /*closure*/, HWND); // override this to reload fonts, icons and other settings or dpi dependent resources. Note: need to set a font or call ALF_Toplevel_SetDefaultFont() } ALFToplevelVTable; typedef struct { @@ -72,7 +73,6 @@ typedef struct { // messages #define ALF_WM__BASE 0x2800 #define ALF_WM_QUERYSIZE (ALF_WM__BASE + 1) -#define ALF_WM_UPDATEFONTS (ALF_WM__BASE + 3) #define ALF_WM_ADDCONTROL (ALF_WM__BASE + 4) #define ALF_WM_CONTROLBYID (ALF_WM__BASE + 5) #define ALF_WM_REMOVECONTROL (ALF_WM__BASE + 6) @@ -126,6 +126,8 @@ typedef struct { #define ALF_WM_NTBK_GETSELINDEX (ALF_WM__BASE + 206) #define ALF_WM_NTBK_GETPNLINDEX (ALF_WM__BASE + 207) +#define ALF_WM_TPLVL_SETDEFFONT (ALF_WM__BASE + 201) + #define ALF_WM_USER (ALF_WM__BASE + 300) typedef DWORD ALFColor; @@ -180,11 +182,6 @@ ALF_ControlHwndById(HWND win, WORD id); void ALF_InvalidateBackground(HWND win); -// Recalculates the window's fonts and applies them to child controls. -// ALF does this automatically on a DPI or settings change so you shouldn't have -// to call ALF_UpdateFonts(). -void -ALF_UpdateFonts(HWND win); // Sets the background color of the given window // Also, if the window is a child window, disables the ALF_LAYOUT_INHERITBGCOLOR flag @@ -473,6 +470,9 @@ ALF_Toplevel_EnsureBigEnough(HWND toplevel); void ALF_Toplevel_SetDefaultButton(HWND win, WORD id); +void +ALF_Toplevel_SetDefaultFont(HWND toplevel); + // label HWND diff --git a/alf/alftoplevel.cpp b/alf/alftoplevel.cpp index 2d2f52d..e2d2f64 100644 --- a/alf/alftoplevel.cpp +++ b/alf/alftoplevel.cpp @@ -1,6 +1,7 @@ #include "alfpriv.h" #define ALF_TOPLEVEL_FLAG_MODALEND ((DWORD)1) +#define ALF_TOPLEVEL_FLAG_OWNS_HFONT ((DWORD)2) typedef struct { HWND hwnd; @@ -13,7 +14,6 @@ typedef struct { LPARAM modalResult; ALFLayout layout; HWND hwndFocus; - HFONT hMessageFont; } ALFToplevelPriv; struct tagALFApplication { @@ -49,17 +49,19 @@ ALF_DestroyToplevelPriv(ALFToplevelPriv *priv) if (priv->app && priv->app->activeToplevel == priv) priv->app->activeToplevel = NULL; + if (priv->flags & ALF_TOPLEVEL_FLAG_OWNS_HFONT) { + DeleteFont(priv->layout.font); + priv->layout.font = NULL; + } + ALF_ListRemove(&priv->toplevelList); ALF_Layout_Clear(&priv->layout); - if (priv->hMessageFont) - DeleteObject(priv->hMessageFont); - ALF_Free(priv); } static void -ALF_UpdateFontsPriv(HWND win, ALFToplevelPriv *priv) +ALF_Toplevel_SetDefaultFontPriv(HWND win, ALFToplevelPriv *priv) { // XXX: SystemParametersInfoForDpi is Unicode-only and needs Vista+ NONCLIENTMETRICS, ALF_NONCLIENTMETRICSW_VISTA ncm; @@ -83,13 +85,20 @@ ALF_UpdateFontsPriv(HWND win, ALFToplevelPriv *priv) lstrcpy(lfMessageFont.lfFaceName, TEXT("MS Shell Dlg")); } - if (priv->hMessageFont) { - DeleteObject(priv->hMessageFont); - } + HFONT hMessageFont = CreateFontIndirect(&lfMessageFont); - priv->hMessageFont = CreateFontIndirect(&lfMessageFont); + SendMessage(win, WM_SETFONT, (WPARAM)hMessageFont, (LPARAM)1); + priv->flags |= ALF_TOPLEVEL_FLAG_OWNS_HFONT; +} - SendMessage(win, WM_SETFONT, (WPARAM)priv->hMessageFont, (LPARAM)1); +static void +ALF_Toplevel_HandleDpiOrSettingsChange(HWND hwnd, ALFToplevelPriv *priv) +{ + if (priv->vtbl && priv->vtbl->updatefontsdpi) { + priv->vtbl->updatefontsdpi(priv->closure, hwnd); + } else { + ALF_Toplevel_SetDefaultFontPriv(hwnd, priv); + } } @@ -218,11 +227,22 @@ ALF_Toplevel_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) return (LRESULT)priv->layout.dpi; } - if (msg == ALF_WM_UPDATEFONTS) { - ALF_UpdateFontsPriv(hwnd, priv); + if (msg == ALF_WM_TPLVL_SETDEFFONT) { + ALF_Toplevel_SetDefaultFontPriv(hwnd, priv); return 0; } + if (msg == WM_SETFONT) { + // we might need to clean up the existing font + if (priv->flags & ALF_TOPLEVEL_FLAG_OWNS_HFONT) { + DeleteFont(priv->layout.font); + priv->layout.font = NULL; + priv->flags &= ~ALF_TOPLEVEL_FLAG_OWNS_HFONT; + } + + // fallthrough to layout which sets the new font + } + if (msg == WM_ACTIVATE) { if (wparam) { if (priv->app) { @@ -378,8 +398,8 @@ ALF_Toplevel_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) } if (msg == WM_THEMECHANGED || msg == WM_SETTINGCHANGE) { - ALF_UpdateFontsPriv(hwnd, priv); - ALF_Layout_Invalidate(&priv->layout, hwnd); + ALF_Toplevel_HandleDpiOrSettingsChange(hwnd, priv); + ALF_InvalidateLayout(hwnd); ALF_InvalidateBackground(hwnd); InvalidateRect(hwnd, NULL, TRUE); } @@ -402,7 +422,7 @@ ALF_Toplevel_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) } if (msg == ALF_WM_DPICHANGE) { - ALF_UpdateFontsPriv(hwnd, priv); + ALF_Toplevel_HandleDpiOrSettingsChange(hwnd, priv); } return ret; @@ -580,6 +600,13 @@ ALF_Toplevel_Application(HWND toplevel) return (ALFApplication *)SendMessage(toplevel, ALF_WM_GETAPPLICATION, 0, 0); } + +void +ALF_Toplevel_SetDefaultFont(HWND toplevel) +{ + SendMessage(toplevel, ALF_WM_TPLVL_SETDEFFONT, 0, 0); +} + ALFApplication * ALF_CreateApplication(void) { |
