From d607540dbaf8a0b2a24dceb27ebddddb420ffd0f Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Sat, 6 Jun 2020 11:32:19 +0200 Subject: redintroduce update fonts vfunc, hopefully more useful now --- alf/alftoplevel.cpp | 57 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 15 deletions(-) (limited to 'alf/alftoplevel.cpp') 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) { -- cgit v1.2.3