diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-21 20:36:51 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-21 20:36:51 +0200 |
| commit | ff8c127b6bdaf8133bae8d06f1216f5d267d4986 (patch) | |
| tree | a2dba5d0ed6376ca446be04386aa5e290c8f1755 /alf/alfnotebook.cpp | |
| parent | 2765ee8bfc1fb0152ed2da324bdcb0a37f43c722 (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.cpp | 85 |
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); +} |
