summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-06-11 14:37:45 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-06-11 14:37:45 +0200
commitf722fb1155cb3d198c450a68d7db82a0bf6318bf (patch)
treebac789489aaa5d81715d1ee916b030252a1c89e7
parentc73dbbf12b090cb05819df2615594c91dbf1dc16 (diff)
concerted effort to reduce unneccessary redraws on transparent backgrounds
-rw-r--r--alf/alfbutton.cpp8
-rw-r--r--alf/alflayout.cpp19
-rw-r--r--alf/alfnativebtn.cpp19
-rw-r--r--alf/alfnotebook.cpp7
-rw-r--r--widgetfactory.cpp5
5 files changed, 36 insertions, 22 deletions
diff --git a/alf/alfbutton.cpp b/alf/alfbutton.cpp
index 17ff1b0..2bc6bc4 100644
--- a/alf/alfbutton.cpp
+++ b/alf/alfbutton.cpp
@@ -907,14 +907,14 @@ ALF_NtButton_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
ALFColor newcolor = (ALFColor)lParam;
if (priv->bgcolor != newcolor) {
priv->bgcolor = newcolor;
- // FIXME! optimize classic button which is not transparent
- InvalidateRect(hwnd, NULL, TRUE);
+ if (priv->hTheme) {
+ InvalidateRect(hwnd, NULL, TRUE);
+ }
}
} else if (uMsg == ALF_WM_GETBGCOLOR) {
return (LRESULT)priv->bgcolor;
} else if (uMsg == ALF_WM_BACKGROUNDCHANGE) {
- if (priv->bgcolor == ALF_COLOR_TRANSPARENT) {
- // FIXME! optimize classic button which is not transparent
+ if (priv->bgcolor == ALF_COLOR_TRANSPARENT && priv->hTheme) {
InvalidateRect(hwnd, NULL, TRUE);
}
} else if (uMsg == WM_SIZE) {
diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp
index ba2854b..38e69a2 100644
--- a/alf/alflayout.cpp
+++ b/alf/alflayout.cpp
@@ -104,6 +104,7 @@ ALF_Layout_ForwardFontToControl(ALFLayout *layout, HWND window, ALFControlPriv *
switch (control->flags & ALF_LAYOUT_SIZETYPE_MASK) {
case ALF_LAYOUT_SIZE_EDIT:
case ALF_LAYOUT_SIZE_CHECKBOX:
+ case ALF_LAYOUT_SIZE_PUSHBUTTON:
ALF_Layout_Invalidate(layout, window);
break;
default:
@@ -627,12 +628,12 @@ ALF_Layout_Apply(ALFLayout* layout, HWND window)
if (!ALF_Compat_Is40())
flags |= SWP_NOCOPYBITS;
+ RECT oldR;
+ GetWindowRect(c->hwnd, &oldR);
+ MapWindowRect(NULL, window, &oldR);
+
// transparent background: invalidate if control moved
if (layout->bgcolor == ALF_COLOR_TRANSPARENT) {
- RECT oldR;
- GetWindowRect(c->hwnd, &oldR);
- MapWindowRect(NULL, window, &oldR);
-
if (oldR.left != r.left || oldR.top != r.top) {
if (c->flags & ALF_LAYOUT_SENDBGCHANGE) {
ALF_InvalidateBackground(c->hwnd);
@@ -643,10 +644,12 @@ ALF_Layout_Apply(ALFLayout* layout, HWND window)
}
}
- hdwp = DeferWindowPos(hdwp,
- c->hwnd, 0,
- r.left, r.top, r.right - r.left, r.bottom - r.top,
- flags);
+ if (!EqualRect(&r, &oldR)) {
+ hdwp = DeferWindowPos(hdwp,
+ c->hwnd, 0,
+ r.left, r.top, r.right - r.left, r.bottom - r.top,
+ flags);
+ }
}
}
diff --git a/alf/alfnativebtn.cpp b/alf/alfnativebtn.cpp
index 3b35321..517676d 100644
--- a/alf/alfnativebtn.cpp
+++ b/alf/alfnativebtn.cpp
@@ -12,7 +12,12 @@ ALF_AddNativeButton(HWND win, WORD id, int x, int y, const TCHAR *text)
(HMENU)(ULONG_PTR)id,
ALF_HINSTANCE,
NULL);
- ALF_AddControl(win, x, y, hwndBtn, 5625, 1725, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG | ALF_LAYOUT_SIZE_PUSHBUTTON);
+
+ DWORD layoutFlags = ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_SIZE_PUSHBUTTON;
+ if (ALF_Compat_IsComCtlV6())
+ layoutFlags |= ALF_LAYOUT_TRANSPARENTBG;
+
+ ALF_AddControl(win, x, y, hwndBtn, 5625, 1725, layoutFlags);
return hwndBtn;
}
@@ -30,7 +35,11 @@ ALF_AddNativeCheckbox(HWND parent, WORD id, int x, int y, const TCHAR *text)
ALF_HINSTANCE,
NULL);
- ALF_AddControl(parent, x, y, hwnd, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG);
+ DWORD layoutFlags = ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT;
+ if (ALF_Compat_IsComCtlV6())
+ layoutFlags |= ALF_LAYOUT_TRANSPARENTBG;
+
+ ALF_AddControl(parent, x, y, hwnd, 0, 0, layoutFlags);
return hwnd;
}
@@ -48,7 +57,11 @@ ALF_AddNativeRadioButton(HWND parent, WORD id, int x, int y, const TCHAR *text)
ALF_HINSTANCE,
NULL);
- ALF_AddControl(parent, x, y, hwnd, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG);
+ DWORD layoutFlags = ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT;
+ if (ALF_Compat_IsComCtlV6())
+ layoutFlags |= ALF_LAYOUT_TRANSPARENTBG;
+
+ ALF_AddControl(parent, x, y, hwnd, 0, 0, layoutFlags);
return hwnd;
}
diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp
index e264b6e..ca93d90 100644
--- a/alf/alfnotebook.cpp
+++ b/alf/alfnotebook.cpp
@@ -1161,13 +1161,6 @@ ALF_Notebook_ContainerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPa
EndDeferWindowPos(hdwp);
- if (priv->selectedPage && priv->hTheme
- && priv->tabPaneBgColor == ALF_COLOR_TRANSPARENT
- && ((oldPanelRect.bottom - oldPanelRect.top) != (rcPanel.bottom - rcPanel.top))) {
- // only needed when height changes, since bg is tiled horizontally
- ALF_InvalidateBackground(priv->selectedPage->hwndPanel);
- }
-
if (priv->hTheme) {
// themed background does contain gradients on XP
// FIXME! do we always need to invalidate everyting?
diff --git a/widgetfactory.cpp b/widgetfactory.cpp
index 25d0ce1..67d5c5c 100644
--- a/widgetfactory.cpp
+++ b/widgetfactory.cpp
@@ -178,7 +178,12 @@ commonPanelMessage(void *closure, HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa
}
if (msg == WM_SIZE && priv->bgmode == BG_GRADIENT) {
+ // HACK doing the invalidation before the layout leads to unnecessary
+ // redraws. I have no idea why, but switching the order of the calls
+ // makes the problem mostly go away.
+ LRESULT rv = ALF_Panel_DefWindowProc(hwnd, msg, wparam, lparam);
ALF_InvalidateBackground(hwnd);
+ return rv;
}
return ALF_Panel_DefWindowProc(hwnd, msg, wparam, lparam);