summaryrefslogtreecommitdiff
path: root/alf
diff options
context:
space:
mode:
Diffstat (limited to 'alf')
-rw-r--r--alf/alf.h2
-rw-r--r--alf/alfedit.cpp52
-rw-r--r--alf/alflayout.cpp79
3 files changed, 64 insertions, 69 deletions
diff --git a/alf/alf.h b/alf/alf.h
index 20dccfc..cc3fc6f 100644
--- a/alf/alf.h
+++ b/alf/alf.h
@@ -29,7 +29,7 @@ typedef struct {
#define ALF_LAYOUT_SIZE_QUERY 0x01
#define ALF_LAYOUT_SIZE_PUSHBUTTON 0x04 /* unimplemented */
#define ALF_LAYOUT_SIZE_STATICTEXT 0x05 /* unimplemented */
-#define ALF_LAYOUT_SIZE_EDIT 0x06 /* unimplemented */
+#define ALF_LAYOUT_SIZE_EDIT 0x06
#define ALF_LAYOUT_SIZE_RADIOBUTTON 0x07 /* unimplemented */
#define ALF_LAYOUT_SIZE_CHECKBOX 0x07 /* unimplemented */
#define ALF_LAYOUT_SIZETYPE_MASK 0x0f
diff --git a/alf/alfedit.cpp b/alf/alfedit.cpp
index 87ddf80..f732452 100644
--- a/alf/alfedit.cpp
+++ b/alf/alfedit.cpp
@@ -1,55 +1,6 @@
#include "alfpriv.h"
/* EDIT */
-static LRESULT CALLBACK
-ALF__EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
-{
- (void)uIdSubclass;
- (void)dwRefData;
-
- if (uMsg == ALF_WM_QUERYSIZE) {
- HDC hDc = GetDC(hwnd);
- HFONT font = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
-
- HFONT oldfont = SelectFont(hDc, font);
-
- TEXTMETRIC tm;
- ZeroMemory(&tm, sizeof(tm));
-
- if (GetTextMetrics(hDc, &tm)) {
- SIZE *ps = (SIZE*)lParam;
- if (!ps->cx) {
- ps->cx = ALF_CentipointsToPixels(GetParent(hwnd), 12000);
- }
-
- if (!ps->cy) {
- ps->cy = tm.tmHeight + 2*ALF_Compat_GetSystemMetricsForDpi(
- SM_CYEDGE, (UINT)ALF_CentipointsToPixels(GetParent(hwnd), 7200))
- + 4 /* padding internal to the edit control */;
- }
- }
-
- SelectFont(hDc, oldfont);
-
- ReleaseDC(hwnd, hDc);
- return 0;
- } else if (uMsg == ALF_WM_APPLYSIZE) {
- RECT *p = (RECT *)lParam;
-
- // SWP_NOCOPYBITS as a bandaid since NT 3.51 doesn't invalidate properly
- return (LRESULT)DeferWindowPos((HDWP)wParam,
- hwnd, NULL,
- p->left, p->top,
- p->right - p->left, p->bottom - p->top,
- SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOCOPYBITS);
- } else if (uMsg == WM_DESTROY) {
- ALF_Compat_RemoveWindowSubclass(hwnd, ALF__EditSubclassProc, 0);
- } else if (uMsg == WM_SETFONT) {
- ALF_InvalidateLayout(GetParent(hwnd));
- }
-
- return ALF_Compat_DefSubclassProc(hwnd, uMsg, wParam, lParam);
-}
HWND
ALF_AddEdit(HWND win, WORD id, int x, int y, const TCHAR *text)
@@ -75,10 +26,9 @@ ALF_AddEdit(HWND win, WORD id, int x, int y, const TCHAR *text)
(HINSTANCE)GetWindowLongPtr(win, GWLP_HINSTANCE),
NULL);
- ALF_Compat_SetWindowSubclass(hwndEdit, ALF__EditSubclassProc, 0, 0);
SetWindowPos(hwndEdit, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_FRAMECHANGED);
- ALF_AddWidget(win, x, y, hwndEdit, 0, 0, ALF_LAYOUT_SIZE_QUERY | ALF_LAYOUT_CUSTOMPOS | ALF_LAYOUT_INHERITFONT);
+ ALF_AddWidget(win, x, y, hwndEdit, 0, 0, ALF_LAYOUT_SIZE_EDIT | ALF_LAYOUT_INHERITFONT);
return hwndEdit;
}
diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp
index 73b05a8..ecd501c 100644
--- a/alf/alflayout.cpp
+++ b/alf/alflayout.cpp
@@ -91,14 +91,23 @@ ALF_Layout_Clear(ALFLayout *layout)
}
static void
+ALF_Layout_ForwardFontToWidget(ALFLayout *layout, HWND window, ALFWidgetPriv *widget, HFONT font, LPARAM redraw)
+{
+ if (widget->flags & ALF_LAYOUT_INHERITFONT) {
+ SendMessage(widget->hwnd, WM_SETFONT, (WPARAM)font, redraw);
+
+ if (widget->flags & ALF_LAYOUT_SIZE_EDIT)
+ ALF_Layout_Invalidate(layout, window);
+ }
+}
+
+static void
ALF_Layout_ForwardFont(ALFLayout *layout, HWND window, HFONT font, LPARAM redraw)
{
(void)window;
ALF_FOR_LIST(ALFWidgetPriv, list, &layout->widgets, i) {
- if (i->flags & ALF_LAYOUT_INHERITFONT) {
- SendMessage(i->hwnd, WM_SETFONT, (WPARAM)font, redraw);
- }
+ ALF_Layout_ForwardFontToWidget(layout, window, i, font, redraw);
}
}
@@ -133,7 +142,37 @@ ALF_Layout_EnsureColumnExists(ALFLayout *layout, int colno)
}
static void
-ALF_Layout_CalcMinWidgetSize(ALFWidgetPriv *c, HWND window, SIZE *s)
+ALF_Layout_CalcEditSize(HWND hwndWindow, ALFLayout *layout, HWND hwndEdit, SIZE *ps)
+{
+ (void)layout;
+
+ HDC hDc = GetDC(hwndEdit);
+ HFONT font = (HFONT)SendMessage(hwndEdit, WM_GETFONT, 0, 0);
+
+ HFONT oldfont = SelectFont(hDc, font);
+
+ TEXTMETRIC tm;
+ ZeroMemory(&tm, sizeof(tm));
+
+ if (GetTextMetrics(hDc, &tm)) {
+ if (!ps->cx) {
+ ps->cx = ALF_CentipointsToPixels(hwndWindow, 12000);
+ }
+
+ if (!ps->cy) {
+ ps->cy = tm.tmHeight + 2*ALF_Compat_GetSystemMetricsForDpi(
+ SM_CYEDGE, (UINT)ALF_CentipointsToPixels(hwndWindow, 7200))
+ + 4 /* padding internal to the edit control */;
+ }
+ }
+
+ SelectFont(hDc, oldfont);
+
+ ReleaseDC(hwndEdit, hDc);
+}
+
+static void
+ALF_Layout_CalcMinWidgetSize(ALFLayout *layout, ALFWidgetPriv *c, HWND window, SIZE *s)
{
if (c->flags & ALF_LAYOUT_SIZE_PX) {
s->cx = c->width;
@@ -150,6 +189,8 @@ ALF_Layout_CalcMinWidgetSize(ALFWidgetPriv *c, HWND window, SIZE *s)
case ALF_LAYOUT_SIZE_QUERY:
SendMessage(c->hwnd, ALF_WM_QUERYSIZE, 0, (LPARAM)s);
break;
+ case ALF_LAYOUT_SIZE_EDIT:
+ ALF_Layout_CalcEditSize(window, layout, c->hwnd, s);
default:
// FIXME! unimplemented
break;
@@ -197,7 +238,7 @@ ALF_Layout_CalcSizes(ALFLayout* layout, HWND window)
ALF_Layout_EnsureRowExists(layout, row);
SIZE qs = { 0, 0 };
- ALF_Layout_CalcMinWidgetSize(c, window, &qs);
+ ALF_Layout_CalcMinWidgetSize(layout, c, window, &qs);
if (qs.cx > layout->columns[col].calculatedMinWidth)
layout->columns[col].calculatedMinWidth = qs.cx;
@@ -339,6 +380,10 @@ ALF_Layout_Apply(ALFLayout* layout, HWND window)
if (bgcolor == ALF_COLOR_TRANSPARENT)
flags |= SWP_NOCOPYBITS;
+ // NT 3.51 and Win32s have so many invalidation bugs it's not even funny
+ if (!ALF_Compat_IsMinWindowsVersion(4, 0))
+ flags |= SWP_NOCOPYBITS;
+
hdwp = DeferWindowPos(hdwp,
c->hwnd, 0,
r.left, r.top, r.right - r.left, r.bottom - r.top,
@@ -366,7 +411,7 @@ ALF_Layout_AddWidget(ALFLayout* layout, HWND window, const ALFAddWidgetParams* p
SetParent(w->hwnd, window);
if (w->flags & ALF_LAYOUT_INHERITFONT) {
- SendMessage(w->hwnd, WM_SETFONT, (WPARAM)SendMessage(window, WM_GETFONT, 0, 0), 0);
+ ALF_Layout_ForwardFontToWidget(layout, window, w, (HFONT)SendMessage(window, WM_GETFONT, 0, 0), 0);
}
if (w->flags & ALF_LAYOUT_INHERITBGCOLOR) {
SendMessage(w->hwnd, ALF_WM_SETBGCOLOR, (WPARAM)SendMessage(window, ALF_WM_GETBGCOLOR, 0, 0), 0);
@@ -374,7 +419,7 @@ ALF_Layout_AddWidget(ALFLayout* layout, HWND window, const ALFAddWidgetParams* p
ALF_ListInsert(layout->widgets.prev, &w->list);
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
}
HWND
@@ -459,7 +504,7 @@ ALF_Layout_SetWidgetPos(ALFLayout *layout, HWND window, HWND needle, POINT *p)
w->x = p->x;
w->y = p->y;
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
return TRUE;
}
@@ -492,7 +537,7 @@ ALF_Layout_SetWidgetSize(ALFLayout *layout, HWND window, HWND needle, SIZE *s)
w->width = s->cx;
w->height = s->cy;
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
return TRUE;
}
@@ -523,11 +568,11 @@ ALF_Layout_SetWidgetFlags(ALFLayout *layout, HWND window, HWND needle, DWORD fla
w->flags = flags;
if (flags & ALF_LAYOUT_INHERITFONT)
- SendMessage(w->hwnd, WM_SETFONT, (WPARAM)SendMessage(window, WM_GETFONT, 0, 0), 0);
+ ALF_Layout_ForwardFontToWidget(layout, window, w, (HFONT)SendMessage(window, WM_GETFONT, 0, 0), 0);
if (flags & ALF_LAYOUT_INHERITBGCOLOR)
SendMessage(w->hwnd, ALF_WM_SETBGCOLOR, (WPARAM)SendMessage(window, ALF_WM_GETBGCOLOR, 0, 0), 0);
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
return TRUE;
}
@@ -554,7 +599,7 @@ ALF_Layout_SetColumnSize(ALFLayout *layout, HWND window, int colno, int size)
layout->columns[colno].requestedMinWidth = size;
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
return TRUE;
}
@@ -577,7 +622,7 @@ ALF_Layout_SetColumnExpand(ALFLayout *layout, HWND window, int colno, int expand
layout->columns[colno].requestedExpandNumerator = expand;
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
return TRUE;
}
@@ -600,7 +645,7 @@ ALF_Layout_SetColumnFlags(ALFLayout *layout, HWND window, int colno, DWORD flags
layout->columns[colno].requestedFlags = flags;
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
return TRUE;
}
@@ -623,7 +668,7 @@ ALF_Layout_SetRowSize(ALFLayout *layout, HWND window, int rowno, int size)
layout->rows[rowno].requestedMinWidth = size;
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
return TRUE;
}
@@ -646,7 +691,7 @@ ALF_Layout_SetRowExpand(ALFLayout *layout, HWND window, int rowno, int expand)
layout->rows[rowno].requestedExpandNumerator = expand;
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
return TRUE;
}
@@ -669,7 +714,7 @@ ALF_Layout_SetRowFlags(ALFLayout *layout, HWND window, int rowno, DWORD flags)
layout->rows[rowno].requestedFlags = flags;
- ALF_InvalidateLayout(window);
+ ALF_Layout_Invalidate(layout, window);
return TRUE;
}