diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-20 17:18:20 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-20 17:18:20 +0200 |
| commit | 079fdbf1a553e314cbba386b85ca92b67c61b8df (patch) | |
| tree | 7b025b94cd6cdcb26e5dde27207f7761ac1a394d /alf/alflayout.cpp | |
| parent | 4efad16e663d33f4700ab77c133ad99e2cdea40f (diff) | |
fixup transparent background work and add test in widgetfactory
Win32s bites once again with its 16bit WPARAM
Diffstat (limited to 'alf/alflayout.cpp')
| -rw-r--r-- | alf/alflayout.cpp | 46 |
1 files changed, 41 insertions, 5 deletions
diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp index ecd501c..228e5b3 100644 --- a/alf/alflayout.cpp +++ b/alf/alflayout.cpp @@ -63,6 +63,9 @@ ALF_Layout_GetRowFlags(ALFLayout *layout, HWND window, int rowno); static BOOL ALF_Layout_SetRowFlags(ALFLayout *layout, HWND window, int rowno, DWORD flags); +static void +ALF_Layout_HandleBackgroundChange(ALFLayout *layout, HWND window); + void ALF_Layout_Init(ALFLayout *layout) { @@ -123,6 +126,21 @@ ALF_Layout_ForwardBgColor(ALFLayout *layout, HWND window, WPARAM wparam, LPARAM } } +static void +ALF_Layout_HandleBackgroundChange(ALFLayout *layout, HWND window) +{ + (void)window; + + ALF_FOR_LIST(ALFWidgetPriv, list, &layout->widgets, i) { + if (i->flags & ALF_LAYOUT_TRANSPARENTBG) { + InvalidateRect(i->hwnd, NULL, TRUE); + } + if (i->flags & ALF_LAYOUT_SENDBGCHANGE) { + ALF_InvalidateBackground(i->hwnd); + } + } +} + void ALF_Layout_EnsureRowExists(ALFLayout *layout, int rowno) { @@ -377,13 +395,25 @@ ALF_Layout_Apply(ALFLayout* layout, HWND window) } else { UINT flags = SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER; - 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; + // transparent background: invalidate if widget moved + if (bgcolor == ALF_COLOR_TRANSPARENT) { + RECT oldR; + GetWindowRect(c->hwnd, &oldR); + + if (oldR.left != r.left || oldR.top != r.top) { + if (c->flags & ALF_LAYOUT_SENDBGCHANGE) { + ALF_InvalidateBackground(c->hwnd); + } + if (c->flags & ALF_LAYOUT_TRANSPARENTBG) { + flags |= SWP_NOCOPYBITS; + } + } + } + hdwp = DeferWindowPos(hdwp, c->hwnd, 0, r.left, r.top, r.right - r.left, r.bottom - r.top, @@ -414,7 +444,7 @@ ALF_Layout_AddWidget(ALFLayout* layout, HWND window, const ALFAddWidgetParams* p 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); + ALF_SetBackgroundColor(w->hwnd, ALF_GetBackgroundColor(window)); } ALF_ListInsert(layout->widgets.prev, &w->list); @@ -570,7 +600,7 @@ ALF_Layout_SetWidgetFlags(ALFLayout *layout, HWND window, HWND needle, DWORD fla if (flags & ALF_LAYOUT_INHERITFONT) 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_SetBackgroundColor(w->hwnd, ALF_GetBackgroundColor(window)); ALF_Layout_Invalidate(layout, window); @@ -752,6 +782,12 @@ ALF_Layout_HandleMessage(ALFLayout *layout, HWND hwnd, UINT msg, WPARAM wparam, if (msg == ALF_WM_SETBGCOLOR) { ALF_Layout_ForwardBgColor(layout, hwnd, wparam, lparam); + ALF_Layout_HandleBackgroundChange(layout, hwnd); + return TRUE; + } + + if (msg == ALF_WM_BACKGROUNDCHANGE) { + ALF_Layout_HandleBackgroundChange(layout, hwnd); return TRUE; } |
