summaryrefslogtreecommitdiff
path: root/alf/alf.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2019-04-29 22:10:17 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2019-04-29 22:10:17 +0200
commitac07e9afb9ef67ae227966425f85c26613b7ea94 (patch)
tree34e6307dc2d40366214de873a9f6689849226c2c /alf/alf.cpp
parentd64290aaffd4721518747713929d79a78ba963f4 (diff)
remove app, use global variables instead
also some unrelated combobox fixes
Diffstat (limited to 'alf/alf.cpp')
-rw-r--r--alf/alf.cpp83
1 files changed, 45 insertions, 38 deletions
diff --git a/alf/alf.cpp b/alf/alf.cpp
index 0e07e0f..92ba1bf 100644
--- a/alf/alf.cpp
+++ b/alf/alf.cpp
@@ -2,13 +2,15 @@
#include <objbase.h>
+static LONG _alf_initLock = 0;
+static LONG _alf_initCounter = 0;
+
/* ALF App and Window */
static void
ALF_InitializeWindowPriv(HWND hwnd, ALFWindowPriv *priv, void *closure)
{
priv->vtbl = (ALFWindowVTable*)GetClassLongPtr(hwnd, 0);
- priv->app = (ALFAPP)GetClassLongPtr(hwnd, sizeof(void*));
priv->closure = closure;
priv->defid = (WORD)-1;
ALF_Layout_Init(&priv->layout);
@@ -138,10 +140,6 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
return 0;
}
- if (msg == ALF_WM_GETAPPLICATION) {
- return (LRESULT)priv->app;
- }
-
if (msg == ALF_WM_UPDATEFONTS) {
ALF_UpdateFontsPriv(hwnd, priv);
return 0;
@@ -346,32 +344,48 @@ ALF_WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
}
}
-ALFAPP
-ALF_CreateApplication(HINSTANCE hInstance)
+void
+ALF_Initialize(void)
{
- ALFAPP app = ALF_New(struct ALFAppPriv, 1);
- app->hInstance = hInstance;
+ // acquire init lock
+ while (InterlockedExchange(&_alf_initLock, 1)) {
+ Sleep(0);
+ }
- InitCommonControls();
+ // we have the lock!
+ if (!_alf_initCounter++) {
+ InitCommonControls();
- ALF_RegisterComboClass(app);
- ALF_RegisterPanelClass(app);
- ALF_RegisterSpacerClass(app);
+ ALF_RegisterComboClass();
+ ALF_RegisterPanelClass();
+ ALF_RegisterSpacerClass();
- ALF_Compat_BufferedPaintInit();
+ ALF_Compat_BufferedPaintInit();
+ }
- return app;
+ // release init lock
+ InterlockedExchange(&_alf_initLock, 0);
}
void
-ALF_TeardownApplication(ALFAPP app)
+ALF_UnInitialize(void)
{
- ALF_Compat_BufferedPaintUnInit();
+ // acquire init lock
+ while (InterlockedExchange(&_alf_initLock, 1)) {
+ Sleep(0);
+ }
- UnregisterClass(app->comboClass, app->hInstance);
- UnregisterClass(app->panelClass, app->hInstance);
- UnregisterClass(app->spacerClass, app->hInstance);
- ALF_Free(app);
+ // we have the lock!
+ if (!--_alf_initCounter) {
+ ALF_Compat_BufferedPaintUnInit();
+
+ UnregisterClass(_alf_comboClass, ALF_HINSTANCE);
+ UnregisterClass(_alf_panelClass, ALF_HINSTANCE);
+ UnregisterClass(_alf_spacerClass, ALF_HINSTANCE);
+ }
+
+ // release init lock
+ InterlockedExchange(&_alf_initLock, 0);
}
void *
@@ -411,7 +425,7 @@ ALF_BuildRandomClassName(const TCHAR* prefix, TCHAR* buf, DWORD cchBuf)
}
LPTSTR
-ALF_RegisterWindowClass(ALFAPP app, const ALFWindowClassParams *params)
+ALF_RegisterWindowClass(HINSTANCE hInstance, const ALFWindowClassParams *params)
{
WNDCLASS cls;
ZeroMemory(&cls, sizeof(cls));
@@ -426,7 +440,7 @@ ALF_RegisterWindowClass(ALFAPP app, const ALFWindowClassParams *params)
}
cls.style = params->classStyle;
- cls.hInstance = app->hInstance;
+ cls.hInstance = hInstance;
cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
if (LOBYTE(LOWORD(GetVersion())) >= 4) {
cls.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
@@ -436,7 +450,7 @@ ALF_RegisterWindowClass(ALFAPP app, const ALFWindowClassParams *params)
}
cls.lpszClassName = classNamePtr;
cls.cbWndExtra = sizeof(void*);
- cls.cbClsExtra = sizeof(void*)*2;
+ cls.cbClsExtra = sizeof(void*);
cls.lpfnWndProc = ALF_WindowProc;
ATOM classatom = RegisterClass(&cls);
@@ -447,27 +461,26 @@ ALF_RegisterWindowClass(ALFAPP app, const ALFWindowClassParams *params)
*pvtbl = params->vtbl;
// XXX: This could have been a HWND_MESSAGE window, but Win95 doesn't support these
- HWND tmp = CreateWindowEx(0, MAKEINTATOM(classatom), TEXT("dummy"), 0, 0, 0, 0, 0, NULL, 0, app->hInstance, 0);
+ HWND tmp = CreateWindowEx(0, MAKEINTATOM(classatom), TEXT("dummy"), 0, 0, 0, 0, 0, NULL, 0, hInstance, 0);
SetClassLongPtr(tmp, 0, (LONG_PTR)pvtbl);
- SetClassLongPtr(tmp, sizeof(void*), (LONG_PTR)app);
DestroyWindow(tmp);
return MAKEINTATOM(classatom);
}
void
-ALF_UnregisterWindowClass(ALFAPP app, LPCTSTR className)
+ALF_UnregisterWindowClass(HINSTANCE hinstance, LPCTSTR className)
{
- HWND tmp = CreateWindowEx(0, className, TEXT("dummy"), 0, 0, 0, 0, 0, NULL, 0, app->hInstance, 0);
+ HWND tmp = CreateWindowEx(0, className, TEXT("dummy"), 0, 0, 0, 0, 0, NULL, 0, hinstance, 0);
ALFWindowVTable *pvtbl = (ALFWindowVTable*)GetClassLongPtr(tmp, 0);
DestroyWindow(tmp);
ALF_Free(pvtbl);
- UnregisterClass(className, app->hInstance);
+ UnregisterClass(className, hinstance);
}
-HWND ALF_InstantiateWindow(ALFAPP app, LPCTSTR className, HWND hwndParent, void *closure)
+HWND ALF_InstantiateWindow(HINSTANCE hinstance, LPCTSTR className, HWND hwndParent, void *closure)
{
return CreateWindowEx(0,
className,
@@ -477,7 +490,7 @@ HWND ALF_InstantiateWindow(ALFAPP app, LPCTSTR className, HWND hwndParent, void
300, 100, //FIXME
hwndParent,
NULL,
- app->hInstance,
+ hinstance,
&closure);
}
@@ -487,12 +500,6 @@ ALF_DestroyWindow(HWND win)
DestroyWindow(win);
}
-ALFAPP
-ALF_ApplicationFromWindow(HWND hwnd)
-{
- return (ALFAPP)SendMessage(hwnd, ALF_WM_GETAPPLICATION, 0, 0);
-}
-
BOOL
ALF_PreTranslateMessage(HWND hwnd, MSG *message)
{
@@ -744,7 +751,7 @@ ALF_ShouldMessageBubble(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
if (!GetParent(hwnd))
return FALSE;
- return msg == ALF_WM_GETAPPLICATION || msg == ALF_WM_CENTIPOINTTOPX
+ return msg == ALF_WM_CENTIPOINTTOPX
|| msg == WM_COMMAND || msg == WM_NOTIFY
|| msg == WM_MEASUREITEM || msg == WM_DRAWITEM
|| msg == WM_CTLCOLORBTN || msg == WM_CTLCOLOREDIT