summaryrefslogtreecommitdiff
path: root/alf/alf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alf/alf.cpp')
-rw-r--r--alf/alf.cpp95
1 files changed, 82 insertions, 13 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));