diff options
Diffstat (limited to 'alf')
| -rw-r--r-- | alf/alf.h | 22 | ||||
| -rw-r--r-- | alf/alfcompat.cpp | 16 | ||||
| -rw-r--r-- | alf/alfcompat.h | 1 | ||||
| -rw-r--r-- | alf/alfnotebook.cpp | 85 |
4 files changed, 103 insertions, 21 deletions
@@ -62,6 +62,9 @@ typedef struct { #define ALF_LABEL_ALIGN_BOTTOM 12 #define ALF_LABEL_VALIGN_MASK 12 +// notebook flags +#define ALF_NOTEBOOK_SOLID_TAB_BACKGROUND 1 + // messages #define ALF_WM__BASE 0x2800 @@ -107,6 +110,9 @@ typedef struct { #define ALF_WM_PANEL_SETVTABLE (ALF_WM__BASE + 201) +#define ALF_WM_NTBK_GETFLAGS (ALF_WM__BASE + 201) +#define ALF_WM_NTBK_SETFLAGS (ALF_WM__BASE + 202) + typedef DWORD ALFColor; #define ALF_COLOR_TRANSPARENT ((ALFColor)-1) @@ -378,6 +384,22 @@ ALF_NotebookSelectedPanel(HWND notebook); HWND ALF_NotebookTabPanel(HWND notebook, int index); +DWORD +ALF_NotebookFlags(HWND notebook); + +void +ALF_NotebookSetFlags(HWND notebook, DWORD flags); + +static inline void +ALF_NotebookAddFlag(HWND notebook, DWORD flag) { + ALF_NotebookSetFlags(notebook, ALF_NotebookFlags(notebook) | flag); +} + +static inline void +ALF_NotebookRemoveFlag(HWND notebook, DWORD flag) { + ALF_NotebookSetFlags(notebook, ALF_NotebookFlags(notebook) & ~flag); +} + #ifdef __cplusplus } // extern C #endif diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp index 5416d9b..5226bb4 100644 --- a/alf/alfcompat.cpp +++ b/alf/alfcompat.cpp @@ -425,6 +425,19 @@ ALF_Compat_fallbackGetThemePartSize(HTHEME hTheme, return E_NOTIMPL; } +static HRESULT WINAPI +ALF_Compat_fallbackGetThemeColor(HTHEME hTheme, + int iPartId, + int iStateId, + int iPropId, + COLORREF *pColor) +{ + (void)hTheme; (void)iPartId; (void)iStateId; (void)iPropId; (void)pColor; + + return E_NOTIMPL; +} + + #define LOAD_FUNC(dll, name) do { \ if (_alf_dll_##dll) \ @@ -499,6 +512,7 @@ void ALF_LoadCompatFunctions(void) LOAD_FUNC(uxtheme, BufferedPaintRenderAnimation); LOAD_FUNC(uxtheme, GetThemeTransitionDuration); LOAD_FUNC(uxtheme, GetThemePartSize); + LOAD_FUNC(uxtheme, GetThemeColor); } void ALF_UnloadCompatFunctions(void) @@ -527,6 +541,7 @@ void ALF_UnloadCompatFunctions(void) UNLOAD_FUNC(BufferedPaintRenderAnimation); UNLOAD_FUNC(GetThemeTransitionDuration); UNLOAD_FUNC(GetThemePartSize); + UNLOAD_FUNC(GetThemeColor); FreeLibrary(_alf_dll_uxtheme); FreeLibrary(_alf_dll_user32); @@ -561,3 +576,4 @@ ALF_Compat_HANIMATIONBUFFER (WINAPI *ALF_Compat_BeginBufferedAnimation)(HWND,HDC HRESULT (WINAPI *ALF_Compat_EndBufferedAnimation)(ALF_Compat_HANIMATIONBUFFER,BOOL) = NULL; BOOL (WINAPI *ALF_Compat_BufferedPaintRenderAnimation)(HWND,HDC) = NULL; HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,int,int,DWORD*) = NULL; +HRESULT (WINAPI *ALF_Compat_GetThemeColor)(HTHEME,int,int,int,COLORREF*); diff --git a/alf/alfcompat.h b/alf/alfcompat.h index fba31c3..b3efbaf 100644 --- a/alf/alfcompat.h +++ b/alf/alfcompat.h @@ -146,3 +146,4 @@ extern ALF_Compat_HANIMATIONBUFFER (WINAPI *ALF_Compat_BeginBufferedAnimation)(H extern HRESULT (WINAPI *ALF_Compat_EndBufferedAnimation)(ALF_Compat_HANIMATIONBUFFER,BOOL); extern BOOL (WINAPI *ALF_Compat_BufferedPaintRenderAnimation)(HWND,HDC); extern HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,int,int,DWORD*); +extern HRESULT (WINAPI *ALF_Compat_GetThemeColor)(HTHEME,int,int,int,COLORREF*); 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); +} |
