summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--alf/alfcompat.cpp106
-rw-r--r--alf/alfcompat.h3
-rw-r--r--alf/alfnotebook.cpp35
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);