summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--alf/alf.cpp6
-rw-r--r--alf/alf.h12
-rw-r--r--alf/alftoplevel.cpp57
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
diff --git a/alf/alf.h b/alf/alf.h
index c30f8ba..8726095 100644
--- a/alf/alf.h
+++ b/alf/alf.h
@@ -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)
{