summaryrefslogtreecommitdiff
path: root/alf/alflayout.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-20 17:18:20 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-20 17:18:20 +0200
commit079fdbf1a553e314cbba386b85ca92b67c61b8df (patch)
tree7b025b94cd6cdcb26e5dde27207f7761ac1a394d /alf/alflayout.cpp
parent4efad16e663d33f4700ab77c133ad99e2cdea40f (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.cpp46
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;
}