diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2018-12-27 17:06:56 +0100 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2018-12-27 17:06:56 +0100 |
| commit | 88393dcbc2cfad14c8201959a6f97e64dafb4471 (patch) | |
| tree | 4eeabb9674b1581e7b0592f76a2cf9341050a548 /alf | |
| parent | 6f4b47c3d5ddb1eddbea1817d624443de1a4fbf9 (diff) | |
add win2k and VC6 (with PSDK2003) support
Diffstat (limited to 'alf')
| -rw-r--r-- | alf/alf.cpp | 95 | ||||
| -rw-r--r-- | alf/alf.h | 29 |
2 files changed, 107 insertions, 17 deletions
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 <stdio.h> #include <stddef.h> +#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)); @@ -42,7 +42,7 @@ typedef struct { #define ALF_WM_GETMODALRESULT (ALF_WM__BASE + 8) #define ALF_WM_CENTIPOINTTOPX (ALF_WM__BASE + 9) #define ALF_WM_SETFOCUS (ALF_WM__BASE + 10) - +#define ALF_WM_GETAPPLICATION (ALF_WM__BASE + 11) typedef struct { const WCHAR *className; @@ -67,14 +67,35 @@ typedef struct { UINT margins[4]; } ALFAddWidgetParams; +typedef LRESULT (CALLBACK *ALF_COMPAT_SUBCLASSPROC)(HWND,UINT,WPARAM,LPARAM,UINT_PTR,DWORD_PTR); +typedef struct { + LRESULT (WINAPI *SetWindowSubclass)(HWND, ALF_COMPAT_SUBCLASSPROC, UINT_PTR, DWORD_PTR); + LRESULT (WINAPI *DefSubclassProc)(HWND, UINT, WPARAM, LPARAM); + BOOL (WINAPI *RemoveWindowSubclass)(HWND, ALF_COMPAT_SUBCLASSPROC, UINT_PTR); +} ALFCompatFunctions; + +typedef struct ALFAppPriv *ALFAPP; + +ALFAPP +ALF_CreateApplication(HINSTANCE hInstance); + +void +ALF_TeardownApplication(ALFAPP app); + +const ALFCompatFunctions * +ALF_CompatFunctionTable(ALFAPP app); + LPTSTR -ALF_RegisterWindowClass(HINSTANCE hInstance, const ALFWindowClassParams *params); +ALF_RegisterWindowClass(ALFAPP app, const ALFWindowClassParams *params); void -ALF_UnregisterWindowClass(HINSTANCE hInstance, LPCTSTR className); +ALF_UnregisterWindowClass(ALFAPP app, LPCTSTR className); HWND -ALF_InstantiateWindow(HINSTANCE hInstance, LPCTSTR className, const ALFWindowInstanceParams *params); +ALF_InstantiateWindow(ALFAPP app, LPCTSTR className, const ALFWindowInstanceParams *params); + +ALFAPP +ALF_ApplicationFromWindow(HWND hwnd); int ALF_CentipointsToPixels(HWND win, int cptValue); |
