diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-09 16:15:41 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-09 16:15:41 +0200 |
| commit | 2a08707cf5a5207a19715907cdef6c2f7a8a52e7 (patch) | |
| tree | f15eafe651a7892e3f88da506328e485ccc2d85b | |
| parent | 97fd5d9ba445dbac0deaef763dce1382a88211d9 (diff) | |
remove half-baked compat implementation of SetWindowSubclass
| -rw-r--r-- | alf/alfcompat.cpp | 106 | ||||
| -rw-r--r-- | alf/alfcompat.h | 3 | ||||
| -rw-r--r-- | alf/alfnotebook.cpp | 35 |
3 files changed, 19 insertions, 125 deletions
diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp index 164032f..ec14b00 100644 --- a/alf/alfcompat.cpp +++ b/alf/alfcompat.cpp @@ -140,87 +140,6 @@ ALF_Compat_fallbackAdjustWindowRectExForDpi(LPRECT lpRect, DWORD dwStyle, BOOL b return AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle); } - -// FIXME: these support one subclass only, negating the whole point of it - -typedef struct { - ALF_COMPAT_SUBCLASSPROC pfnSubclass; - UINT_PTR uIdSubclass; - DWORD_PTR dwRefData; - UINT runCounter; - WNDPROC orig; -} ALFWindowSubclassData; - -static LRESULT CALLBACK -ALF_Compat_fallbackSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - ALFWindowSubclassData *data = (ALFWindowSubclassData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); - - LRESULT ret = 0; - - data->runCounter++; - - if (data->pfnSubclass) - ret = data->pfnSubclass(hwnd, uMsg, wParam, lParam, data->uIdSubclass, data->dwRefData); - else - ret = CallWindowProc(data->orig, hwnd, uMsg, wParam, lParam); - - data->runCounter--; - - if (!data->pfnSubclass && !data->runCounter) { - SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); - ALF_Free(data); - } - - return ret; -} - -static BOOL WINAPI -ALF_Compat_fallbackSetWindowSubclass(HWND hwnd, ALF_COMPAT_SUBCLASSPROC pfnSubclass, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) -{ - ALFWindowSubclassData *data = ALF_New(ALFWindowSubclassData, 1); - - data->pfnSubclass = pfnSubclass; - data->uIdSubclass = uIdSubclass; - data->dwRefData = dwRefData; - data->orig = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_WNDPROC); - - SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)data); - SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)ALF_Compat_fallbackSubclassProc); - - return TRUE; -} - -static LRESULT WINAPI -ALF_Compat_fallbackDefSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - ALFWindowSubclassData *data = (ALFWindowSubclassData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); - - return CallWindowProc(data->orig, hwnd, uMsg, wParam, lParam); -} - -static BOOL WINAPI -ALF_Compat_fallbackRemoveWindowSubclass(HWND hwnd, ALF_COMPAT_SUBCLASSPROC pfnSubclass, UINT_PTR uIdSubclass) -{ - (void)pfnSubclass; - (void)uIdSubclass; - - ALFWindowSubclassData *data = (ALFWindowSubclassData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); - - data->pfnSubclass = 0; - data->uIdSubclass = 0; - SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)data->orig); - - // can't free it while the subclass is running, possibly in a nested SendMessage - // and wants to call DefSubclassProc - if (!data->runCounter) { - SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); - ALF_Free(data); - } - - return TRUE; -} - long ALF_GetAveCharWidth(HDC hdc) { @@ -472,25 +391,6 @@ void ALF_LoadCompatFunctions(void) LOAD_FUNC(user32, GetDpiForWindow); LOAD_FUNC(user32, AdjustWindowRectExForDpi); LOAD_FUNC(user32, GetSystemMetricsForDpi); - - *((FARPROC*)&ALF_Compat_SetWindowSubclass) = GetProcAddress(_alf_dll_comctl32, "SetWindowSubclass"); - if (!ALF_Compat_SetWindowSubclass) - *((FARPROC*)&ALF_Compat_SetWindowSubclass) = GetProcAddress(_alf_dll_comctl32, (char*)410); - if (!ALF_Compat_SetWindowSubclass) - ALF_Compat_SetWindowSubclass = ALF_Compat_fallbackSetWindowSubclass; - - *((FARPROC*)&ALF_Compat_DefSubclassProc) = GetProcAddress(_alf_dll_comctl32, "DefSubclassProc"); - if (!ALF_Compat_DefSubclassProc) - *((FARPROC*)&ALF_Compat_DefSubclassProc) = GetProcAddress(_alf_dll_comctl32, (char*)413); - if (!ALF_Compat_DefSubclassProc) - ALF_Compat_DefSubclassProc = ALF_Compat_fallbackDefSubclassProc; - - *((FARPROC*)&ALF_Compat_RemoveWindowSubclass) = GetProcAddress(_alf_dll_comctl32, "RemoveWindowSubclass"); - if (!ALF_Compat_RemoveWindowSubclass) - *((FARPROC*)&ALF_Compat_RemoveWindowSubclass) = GetProcAddress(_alf_dll_comctl32, (char*)412); - if (!ALF_Compat_RemoveWindowSubclass) - ALF_Compat_RemoveWindowSubclass = ALF_Compat_fallbackRemoveWindowSubclass; - LOAD_FUNC(user32, SystemParametersInfoForDpi); *((FARPROC*)&ALF_Compat_TrackMouseEvent) = GetProcAddress(_alf_dll_comctl32, "_TrackMouseEvent"); @@ -521,9 +421,6 @@ void ALF_UnloadCompatFunctions(void) UNLOAD_FUNC(GetDpiForWindow); UNLOAD_FUNC(AdjustWindowRectExForDpi); UNLOAD_FUNC(GetSystemMetricsForDpi); - UNLOAD_FUNC(SetWindowSubclass); - UNLOAD_FUNC(DefSubclassProc); - UNLOAD_FUNC(RemoveWindowSubclass); UNLOAD_FUNC(SystemParametersInfoForDpi); UNLOAD_FUNC(TrackMouseEvent); UNLOAD_FUNC(OpenThemeData); @@ -555,9 +452,6 @@ BOOL (WINAPI *ALF_Compat_IsAppThemed)(void) = NULL; UINT (WINAPI *ALF_Compat_GetDpiForWindow)(HWND /*window*/) = NULL; BOOL (WINAPI *ALF_Compat_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT) = NULL; int (WINAPI *ALF_Compat_GetSystemMetricsForDpi)(int, UINT) = NULL; -BOOL (WINAPI *ALF_Compat_SetWindowSubclass)(HWND, ALF_COMPAT_SUBCLASSPROC, UINT_PTR, DWORD_PTR) = NULL; -LRESULT (WINAPI *ALF_Compat_DefSubclassProc)(HWND, UINT, WPARAM, LPARAM) = NULL; -BOOL (WINAPI *ALF_Compat_RemoveWindowSubclass)(HWND, ALF_COMPAT_SUBCLASSPROC, UINT_PTR) = NULL; BOOL (WINAPI *ALF_Compat_SystemParametersInfoForDpi)(UINT,UINT,PVOID,UINT,UINT) = NULL; HTHEME (WINAPI *ALF_Compat_OpenThemeData)(HWND, LPCWSTR) = NULL; diff --git a/alf/alfcompat.h b/alf/alfcompat.h index b3efbaf..e09bda0 100644 --- a/alf/alfcompat.h +++ b/alf/alfcompat.h @@ -126,9 +126,6 @@ extern BOOL (WINAPI *ALF_Compat_IsAppThemed)(void); extern UINT (WINAPI *ALF_Compat_GetDpiForWindow)(HWND); extern BOOL (WINAPI *ALF_Compat_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT); extern int (WINAPI *ALF_Compat_GetSystemMetricsForDpi)(int, UINT); -extern BOOL (WINAPI *ALF_Compat_SetWindowSubclass)(HWND, ALF_COMPAT_SUBCLASSPROC, UINT_PTR, DWORD_PTR); -extern LRESULT (WINAPI *ALF_Compat_DefSubclassProc)(HWND, UINT, WPARAM, LPARAM); -extern BOOL (WINAPI *ALF_Compat_RemoveWindowSubclass)(HWND, ALF_COMPAT_SUBCLASSPROC, UINT_PTR); extern BOOL (WINAPI *ALF_Compat_SystemParametersInfoForDpi)(UINT,UINT,PVOID,UINT,UINT); extern HTHEME (WINAPI *ALF_Compat_OpenThemeData)(HWND, LPCWSTR); extern HRESULT (WINAPI *ALF_Compat_CloseThemeData)(HTHEME); diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp index ea4517c..b54829a 100644 --- a/alf/alfnotebook.cpp +++ b/alf/alfnotebook.cpp @@ -266,10 +266,9 @@ ALF_Notebook_InternalAddTab(HWND notebook, ALFNotebookPriv *priv, const TCHAR *t static LRESULT CALLBACK -ALF_Notebook_TabCtrlSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) +ALF_Notebook_TabCtrlWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - (void)uIdSubclass; - (void)dwRefData; + WNDPROC oldWndProc = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (uMsg == WM_ERASEBKGND) { // see: http://www.virtualdub.org/blog/pivot/entry.php?id=291 @@ -281,19 +280,12 @@ ALF_Notebook_TabCtrlSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPa ExcludeClipRect(hdc, r.left, r.top, r.right, r.bottom); } - if (uMsg == 0x2000 + WM_NOTIFY) { - NMHDR *pnmh = (NMHDR*)lParam; - if (pnmh->code == TCN_SELCHANGE) { - ALF_Notebook_InternalHandleTabChange(GetParent(hwnd), hwnd); - - return TRUE; - } - } if (uMsg == WM_DESTROY) { - ALF_Compat_RemoveWindowSubclass(hwnd, ALF_Notebook_TabCtrlSubclassProc, 0); + SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)oldWndProc); + SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); } - return ALF_Compat_DefSubclassProc(hwnd, uMsg, wParam, lParam); + return CallWindowProc(oldWndProc, hwnd, uMsg, wParam, lParam); } static void @@ -383,11 +375,20 @@ ALF_Notebook_SetWidgetFlags(HWND hwndNotebook, ALFNotebookPriv *priv, HWND widge static LRESULT CALLBACK ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + ALFNotebookPriv *priv = (ALFNotebookPriv *)GetWindowLongPtr(hwnd, 0); + + if (uMsg == WM_NOTIFY) { + NMHDR *pnmh = (NMHDR*)lParam; + if (pnmh->hwndFrom == priv->hwndTabCtrl && pnmh->code == TCN_SELCHANGE) { + ALF_Notebook_InternalHandleTabChange(hwnd, priv->hwndTabCtrl); + + return TRUE; + } + } + if (ALF_ShouldMessageBubble(hwnd, uMsg, wParam, lParam)) return SendMessage(GetParent(hwnd), uMsg, wParam, lParam); - ALFNotebookPriv *priv = (ALFNotebookPriv *)GetWindowLongPtr(hwnd, 0); - if (uMsg == WM_CREATE && priv == NULL) { priv = ALF_Notebook_CreatePriv(); priv->hwndTabCtrl = CreateWindowEx(0, @@ -402,7 +403,9 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) TabCtrl_SetItemExtra(priv->hwndTabCtrl, sizeof(ALFNotebookPage) - sizeof(TCITEMHEADER)); - ALF_Compat_SetWindowSubclass(priv->hwndTabCtrl, ALF_Notebook_TabCtrlSubclassProc, 0, 0); + LONG_PTR wndProc = GetWindowLongPtr(priv->hwndTabCtrl, GWLP_WNDPROC); + SetWindowLongPtr(priv->hwndTabCtrl, GWLP_USERDATA, wndProc); + SetWindowLongPtr(priv->hwndTabCtrl, GWLP_WNDPROC, (LONG_PTR)ALF_Notebook_TabCtrlWndProc); SetWindowLongPtr(hwnd, 0, (LONG_PTR)priv); ALF_Notebook_InternalHandleThemeChange(hwnd, priv); |
