From ac07e9afb9ef67ae227966425f85c26613b7ea94 Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Mon, 29 Apr 2019 22:10:17 +0200 Subject: remove app, use global variables instead also some unrelated combobox fixes --- alf/alf.cpp | 83 +++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 38 deletions(-) (limited to 'alf/alf.cpp') 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 +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 -- cgit v1.2.3