From 88393dcbc2cfad14c8201959a6f97e64dafb4471 Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Thu, 27 Dec 2018 17:06:56 +0100 Subject: add win2k and VC6 (with PSDK2003) support --- alf/alf.cpp | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 82 insertions(+), 13 deletions(-) (limited to 'alf/alf.cpp') diff --git a/alf/alf.cpp b/alf/alf.cpp index 9d7b55a..717f2df 100644 --- a/alf/alf.cpp +++ b/alf/alf.cpp @@ -6,6 +6,11 @@ #include #include +#ifdef _MSC_VER +// MSVC6 for scoping hack +# define for if(0){}else for +#endif + typedef struct ALFListHeader { struct ALFListHeader *prev; struct ALFListHeader *next; @@ -87,6 +92,7 @@ typedef struct { } ALFLayout; typedef struct { + ALFAPP app; ALFWindowVTable *vtbl; void *closure; ALFWindowFonts fonts; @@ -97,10 +103,18 @@ typedef struct { HWND hwndFocus; } ALFWindowPriv; +struct ALFAppPriv { + HINSTANCE hInstance; + ALFCompatFunctions *compatFn; +}; + +/* ALF App and Window */ + static void ALF_InitializeWindowPriv(HWND hwnd, ALFWindowPriv *priv, ALFWindowInstanceParams *params) { priv->vtbl = (ALFWindowVTable*)GetClassLongPtr(hwnd, 0); + priv->app = (ALFAPP)GetClassLongPtr(hwnd, sizeof(void*)); priv->closure = params->closure; ALF_ListInit(&priv->widgets); priv->defid = (WORD)-1; @@ -436,6 +450,10 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) return 0; } + if (msg == ALF_WM_GETAPPLICATION) { + return (LRESULT)priv->app; + } + if (msg == WM_ACTIVATE) { if (!HIWORD(wparam)) { // if !minimized if (LOWORD(wparam)) { @@ -569,8 +587,42 @@ ALF_WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) } } +ALFAPP +ALF_CreateApplication(HINSTANCE hInstance) +{ + ALFAPP app = (ALFAPP)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS, sizeof(struct ALFAppPriv)); + app->hInstance = hInstance; + + INITCOMMONCONTROLSEX icc; + ZeroMemory(&icc, sizeof(icc)); + icc.dwSize = sizeof(icc); + icc.dwICC = ICC_WIN95_CLASSES; + + InitCommonControlsEx(&icc); + + ALFCompatFunctions *compatfn = (ALFCompatFunctions*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS, sizeof(ALFCompatFunctions)); + +#define COMPAT(dll, entrypoint, ordinal) \ + do { \ + FARPROC p = GetProcAddress(GetModuleHandleA(#dll), #entrypoint); \ + if (!p && ordinal) \ + p = GetProcAddress(GetModuleHandleA(#dll), (char*)ordinal); \ + CopyMemory(&compatfn->entrypoint, &p, sizeof(void*)); \ + } while (0) + + COMPAT(comctl32.dll, SetWindowSubclass, 410); + COMPAT(comctl32.dll, DefSubclassProc, 413); + COMPAT(comctl32.dll, RemoveWindowSubclass, 412); + +#undef COMPAT + + app->compatFn = compatfn; + + return app; +} + LPTSTR -ALF_RegisterWindowClass(HINSTANCE hInstance, const ALFWindowClassParams *params) +ALF_RegisterWindowClass(ALFAPP app, const ALFWindowClassParams *params) { WNDCLASS cls; ZeroMemory(&cls, sizeof(cls)); @@ -578,12 +630,12 @@ ALF_RegisterWindowClass(HINSTANCE hInstance, const ALFWindowClassParams *params) // TODO: autogenerate class name cls.style = params->classStyle; - cls.hInstance = hInstance; + cls.hInstance = app->hInstance; cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW); cls.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); cls.lpszClassName = params->className; cls.cbWndExtra = sizeof(void*); - cls.cbClsExtra = sizeof(void*); + cls.cbClsExtra = sizeof(void*)*2; cls.lpfnWndProc = DefWindowProc; ATOM classatom = RegisterClass(&cls); @@ -593,16 +645,16 @@ ALF_RegisterWindowClass(HINSTANCE hInstance, const ALFWindowClassParams *params) ALFWindowVTable *pvtbl = (ALFWindowVTable*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS, sizeof(ALFWindowVTable)); *pvtbl = params->vtbl; - HWND tmp = CreateWindowEx(0, MAKEINTATOM(classatom), TEXT("dummy"), 0, 0, 0, 0, 0, HWND_MESSAGE, 0, hInstance, 0); + HWND tmp = CreateWindowEx(0, MAKEINTATOM(classatom), TEXT("dummy"), 0, 0, 0, 0, 0, HWND_MESSAGE, 0, app->hInstance, 0); SetClassLongPtr(tmp, 0, (LONG_PTR)pvtbl); + SetClassLongPtr(tmp, sizeof(void*), (LONG_PTR)app); SetClassLongPtr(tmp, GCLP_WNDPROC, (LONG_PTR)ALF_WindowProc); DestroyWindow(tmp); return MAKEINTATOM(classatom); } -HWND -ALF_InstantiateWindow(HINSTANCE hInstance, LPCTSTR className, const ALFWindowInstanceParams *params) +HWND ALF_InstantiateWindow(ALFAPP app, LPCTSTR className, const ALFWindowInstanceParams* params) { return CreateWindowEx(params->windowExStyle, className, @@ -612,10 +664,16 @@ ALF_InstantiateWindow(HINSTANCE hInstance, LPCTSTR className, const ALFWindowIns 300, 100, //FIXME params->hwndParent, NULL, - hInstance, + app->hInstance, (void*)params); } +ALFAPP +ALF_ApplicationFromWindow(HWND hwnd) +{ + return (ALFAPP)SendMessage(hwnd, ALF_WM_GETAPPLICATION, 0, 0); +} + int ALF_ShowModal(HWND win) { @@ -717,6 +775,8 @@ ALF__LabelSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_ (void)uIdSubclass; (void)dwRefData; + ALFAPP app = (ALFAPP)dwRefData; + if (uMsg == ALF_WM_QUERYSIZE) { HDC hdcLabel = GetDC(hwnd); HFONT font = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); @@ -756,7 +816,7 @@ ALF__LabelSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_ ReleaseDC(hwnd, hdcLabel); } - return DefSubclassProc(hwnd, uMsg, wParam, lParam); + return app->compatFn->DefSubclassProc(hwnd, uMsg, wParam, lParam); } HWND @@ -771,7 +831,8 @@ ALF_AddLabel(HWND win, WORD id, UINT x, UINT y, const WCHAR *text) (HINSTANCE)GetWindowLongPtr(win, GWLP_HINSTANCE), NULL); - SetWindowSubclass(hwndLabel, ALF__LabelSubclassProc, 0, 0); + ALFAPP app = ALF_ApplicationFromWindow(win); + app->compatFn->SetWindowSubclass(hwndLabel, ALF__LabelSubclassProc, 0, (DWORD_PTR)app); ALFAddWidgetParams p; ZeroMemory(&p, sizeof(p)); @@ -796,6 +857,8 @@ ALF__EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_P (void)uIdSubclass; (void)dwRefData; + ALFAPP app = (ALFAPP)dwRefData; + if (uMsg == ALF_WM_QUERYSIZE) { HFONT font = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); if (font) { @@ -816,7 +879,7 @@ ALF__EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_P return 0; } - return DefSubclassProc(hwnd, uMsg, wParam, lParam); + return app->compatFn->DefSubclassProc(hwnd, uMsg, wParam, lParam); } HWND @@ -832,7 +895,9 @@ ALF_AddEdit(HWND win, WORD id, UINT x, UINT y, const WCHAR *text) (HINSTANCE)GetWindowLongPtr(win, GWLP_HINSTANCE), NULL); - SetWindowSubclass(hwndEdit, ALF__EditSubclassProc, 0, 0); + ALFAPP app = ALF_ApplicationFromWindow(win); + + app->compatFn->SetWindowSubclass(hwndEdit, ALF__EditSubclassProc, 0, (DWORD_PTR)app); ALFAddWidgetParams p; ZeroMemory(&p, sizeof(p)); @@ -855,6 +920,8 @@ ALF__ButtonSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT (void)uIdSubclass; (void)dwRefData; + ALFAPP app = (ALFAPP)dwRefData; + if (uMsg == ALF_WM_QUERYSIZE) { HDC hdc = GetDC(hwnd); HFONT font = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); @@ -901,7 +968,7 @@ ALF__ButtonSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT ReleaseDC(hwnd, hdc); } - return DefSubclassProc(hwnd, uMsg, wParam, lParam); + return app->compatFn->DefSubclassProc(hwnd, uMsg, wParam, lParam); } HWND @@ -917,7 +984,9 @@ ALF_AddButton(HWND win, WORD id, UINT x, UINT y, const WCHAR *text) (HINSTANCE)GetWindowLongPtr(win, GWLP_HINSTANCE), NULL); - SetWindowSubclass(hwndButton, ALF__ButtonSubclassProc, 0, 0); + ALFAPP app = ALF_ApplicationFromWindow(win); + + app->compatFn->SetWindowSubclass(hwndButton, ALF__ButtonSubclassProc, 0, (DWORD_PTR)app); ALFAddWidgetParams p; ZeroMemory(&p, sizeof(p)); -- cgit v1.2.3