summaryrefslogtreecommitdiff
path: root/alf/alfnotebook.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-21 20:36:51 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-21 20:36:51 +0200
commitff8c127b6bdaf8133bae8d06f1216f5d267d4986 (patch)
treea2dba5d0ed6376ca446be04386aa5e290c8f1755 /alf/alfnotebook.cpp
parent2765ee8bfc1fb0152ed2da324bdcb0a37f43c722 (diff)
notebook: add option of using a solid background
unfortunately, only xp supplies actually matching color hints the color hint of Vista and later is very different from the texture used, so it looks quite ugly there :/
Diffstat (limited to 'alf/alfnotebook.cpp')
-rw-r--r--alf/alfnotebook.cpp85
1 files changed, 64 insertions, 21 deletions
diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp
index d1024e2..6679ec4 100644
--- a/alf/alfnotebook.cpp
+++ b/alf/alfnotebook.cpp
@@ -1,19 +1,22 @@
#include "alfpriv.h"
#include "alfcompat.h"
-#define ALF_NB_ADDTAB (ALF_WM__BASE + 200)
-#define ALF_NB_TABCOUNT (ALF_WM__BASE + 201)
-#define ALF_NB_GETPANEL (ALF_WM__BASE + 202)
-#define ALF_NB_GETSELINDEX (ALF_WM__BASE + 203)
-#define ALF_NB_GETPNLINDEX (ALF_WM__BASE + 204)
+#define ALF_NB_ADDTAB (ALF_WM__BASE + 300)
+#define ALF_NB_TABCOUNT (ALF_WM__BASE + 301)
+#define ALF_NB_GETPANEL (ALF_WM__BASE + 302)
+#define ALF_NB_GETSELINDEX (ALF_WM__BASE + 303)
+#define ALF_NB_GETPNLINDEX (ALF_WM__BASE + 304)
#define TABP_BODY 10
+#define TMT_FILLCOLORHINT 3821
TCHAR *_alf_notebookClass = NULL;
typedef struct {
- HWND hwndTabCtrl;
- HTHEME hTheme;
+ HWND hwndTabCtrl;
+ HTHEME hTheme;
+ ALFColor themeTabBgColor;
+ DWORD flags;
} ALFNotebookPriv;
static ALFNotebookPriv *
@@ -21,6 +24,8 @@ ALF_Notebook_CreatePriv(void)
{
ALFNotebookPriv *priv = ALF_New(ALFNotebookPriv, 1);
+ priv->themeTabBgColor = ALF_COLOR_SYS(COLOR_BTNFACE);
+
return priv;
}
@@ -81,26 +86,47 @@ ALF_Notebook_InternalHandleTabChange(HWND hwndNotebook, HWND hwndTabCtrl)
}
static void
+ALF_Notebook_SetSingleTabBackground(HWND hwndNotebook, ALFNotebookPriv *priv, HWND panel)
+{
+ (void)hwndNotebook;
+ if (priv->hTheme && !(priv->flags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND)) {
+ SendMessage(panel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_TRANSPARENT);
+ } else {
+ SendMessage(panel, ALF_WM_SETBGCOLOR, 0, (LPARAM)priv->themeTabBgColor);
+ }
+}
+
+static void
+ALF_Notebook_SetAllTabBackgrounds(HWND hwndNotebook, ALFNotebookPriv *priv)
+{
+ int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl);
+ for (int i = 0; i < n; ++i) {
+ HWND panel = ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i);
+ ALF_Notebook_SetSingleTabBackground(hwndNotebook, priv, panel);
+ }
+}
+
+static void
ALF_Notebook_InternalHandleThemeChange(HWND hwndNotebook, ALFNotebookPriv *priv)
{
ALF_Compat_CloseThemeData(priv->hTheme);
priv->hTheme = NULL;
if (ALF_Compat_IsAppThemed())
- priv->hTheme = ALF_Compat_OpenThemeData(hwndNotebook, L"TAB");
+ priv->hTheme = ALF_Compat_OpenThemeData(hwndNotebook, L"Tab");
InvalidateRect(hwndNotebook, NULL, TRUE);
ALF_InvalidateLayout(hwndNotebook);
- int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl);
- for (int i = 0; i < n; ++i) {
- HWND panel = ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i);
-
- if (priv->hTheme) {
- SendMessage(panel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_TRANSPARENT);
- } else {
- SendMessage(panel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_SYS(COLOR_BTNFACE));
+ // tab fill color for solid bg color mode
+ priv->themeTabBgColor = ALF_COLOR_SYS(COLOR_BTNFACE);
+ if (priv->hTheme) {
+ COLORREF c;
+ if (SUCCEEDED(ALF_Compat_GetThemeColor(priv->hTheme, TABP_BODY, 0, TMT_FILLCOLORHINT, &c))) {
+ priv->themeTabBgColor = (ALFColor)c;
}
}
+
+ ALF_Notebook_SetAllTabBackgrounds(hwndNotebook, priv);
}
@@ -117,11 +143,7 @@ ALF_Notebook_InternalAddTab(HWND notebook, ALFNotebookPriv *priv, const TCHAR *t
SendMessage(hwndPanel, WM_SETFONT, (WPARAM)SendMessage(priv->hwndTabCtrl, WM_GETFONT, 0, 0), 0);
- if (priv->hTheme) {
- SendMessage(hwndPanel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_TRANSPARENT);
- } else {
- SendMessage(hwndPanel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_SYS(COLOR_BTNFACE));
- }
+ ALF_Notebook_SetSingleTabBackground(notebook, priv, hwndPanel);
TCITEM tie;
ZeroMemory(&tie, sizeof(tie));
@@ -341,6 +363,15 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0;
} else if (uMsg == ALF_WM_INVALIDATELAYOUT) {
ALF_InvalidateLayout(GetParent(hwnd));
+ } else if (uMsg == ALF_WM_NTBK_GETFLAGS) {
+ return (LRESULT)priv->flags;
+ } else if (uMsg == ALF_WM_NTBK_SETFLAGS) {
+ DWORD oldFlags = priv->flags;
+ priv->flags = (DWORD)lParam;
+
+ if ((oldFlags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND) != (priv->flags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND)) {
+ ALF_Notebook_SetAllTabBackgrounds(hwnd, priv);
+ }
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
@@ -424,3 +455,15 @@ ALF_NotebookSelectedPanel(HWND notebook)
return NULL;
}
}
+
+DWORD
+ALF_NotebookFlags(HWND notebook)
+{
+ return (DWORD)SendMessage(notebook, ALF_WM_NTBK_GETFLAGS, 0, 0);
+}
+
+void
+ALF_NotebookSetFlags(HWND notebook, DWORD flags)
+{
+ SendMessage(notebook, ALF_WM_NTBK_SETFLAGS, 0, (LPARAM)flags);
+}