summaryrefslogtreecommitdiff
path: root/alf/alftoplevel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alf/alftoplevel.cpp')
-rw-r--r--alf/alftoplevel.cpp57
1 files changed, 42 insertions, 15 deletions
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)
{