diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-19 15:40:25 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-19 15:50:28 +0200 |
| commit | 9b6fbe3b5fd7e8bcad7f0f0993409f4d6777c42f (patch) | |
| tree | f5aa786f5ab9ead3ecbc46f5770473158d91fc5b /alf/alfpanel.cpp | |
| parent | 144736e53fd0142ec215a375bf588b9634e312ed (diff) | |
panel vtbl first implementation
still basically untested
Diffstat (limited to 'alf/alfpanel.cpp')
| -rw-r--r-- | alf/alfpanel.cpp | 70 |
1 files changed, 57 insertions, 13 deletions
diff --git a/alf/alfpanel.cpp b/alf/alfpanel.cpp index 2f39ef1..eb954ec 100644 --- a/alf/alfpanel.cpp +++ b/alf/alfpanel.cpp @@ -6,6 +6,8 @@ typedef struct { ALFLayout layout; ALFColor bgcolor; HFONT font; + const ALFPanelVTable *vtbl; + void *closure; } ALFPanelPriv; static void @@ -24,30 +26,34 @@ ALF_Panel_ClearPriv(ALFPanelPriv *priv) static void ALF_Panel_Paint(ALFPanelPriv *priv, HWND hwnd, HDC dc, RECT *r) { - if (priv->bgcolor == ALF_COLOR_TRANSPARENT) { + if (priv->vtbl && priv->vtbl->paint) { + priv->vtbl->paint(priv->closure, hwnd, dc, r); + } else if (priv->bgcolor == ALF_COLOR_TRANSPARENT) { ALF_Compat_DrawThemeParentBackground(hwnd, dc, r); } else { ALF_FillRect(dc, r, priv->bgcolor); } } -static LRESULT WINAPI -ALF__PanelWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) +void +ALF_Panel_SetVTable(HWND panel, const ALFPanelVTable *vtbl, void *closure) { - if (msg == WM_NCCREATE) { - ALFPanelPriv *p = ALF_New(ALFPanelPriv, 1); + SendMessage(panel, ALF_WM_PANEL_SETVTABLE, (WPARAM)vtbl, (LPARAM)closure); +} - ALF_Panel_IntializePriv(p); +LRESULT +ALF_Panel_DefWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) +{ + ALFPanelPriv *priv = (ALFPanelPriv *)GetWindowLongPtr(window, 0); - SetWindowLongPtr(window, 0, (LONG_PTR)p); + if (msg == WM_CREATE) { + if (priv->vtbl && priv->vtbl->create) + priv->vtbl->create(priv->closure, window); } - ALFPanelPriv *priv = (ALFPanelPriv *)GetWindowLongPtr(window, 0); - - if (msg == WM_NCDESTROY) { - ALF_Panel_ClearPriv(priv); - ALF_Free(priv); - SetWindowLongPtr(window, 0, 0); + if (msg == WM_DESTROY) { + if (priv->vtbl && priv->vtbl->destroy) + priv->vtbl->destroy(priv->closure, window); } if (msg == WM_ERASEBKGND) { @@ -87,6 +93,7 @@ ALF__PanelWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) GetClientRect(window, &r); ALF_Panel_Paint(priv, window, (HDC)wparam, &r); + return TRUE; } @@ -101,6 +108,12 @@ ALF__PanelWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) return 0; } + if (msg == ALF_WM_PANEL_SETVTABLE) { + priv->vtbl = (const ALFPanelVTable *)wparam; + priv->closure = (void *)lparam; + return TRUE; + } + if (ALF_ShouldMessageBubble(window, msg, wparam, lparam)) return SendMessage(GetParent(window), msg, wparam, lparam); @@ -115,6 +128,37 @@ ALF__PanelWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) return DefWindowProc(window, msg, wparam, lparam); } +static LRESULT WINAPI +ALF__PanelWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) +{ + if (msg == WM_NCCREATE) { + ALFPanelPriv *p = ALF_New(ALFPanelPriv, 1); + + ALF_Panel_IntializePriv(p); + + SetWindowLongPtr(window, 0, (LONG_PTR)p); + } + + ALFPanelPriv *priv = (ALFPanelPriv *)GetWindowLongPtr(window, 0); + + if (msg == WM_NCDESTROY) { + ALF_Panel_ClearPriv(priv); + ALF_Free(priv); + priv = NULL; + SetWindowLongPtr(window, 0, 0); + } + + if (priv) { + if (priv->vtbl && priv->vtbl->message) { + return priv->vtbl->message(priv->closure, window, msg, wparam, lparam); + } else { + return ALF_Panel_DefWindowProc(window, msg, wparam, lparam); + } + } else { + return DefWindowProc(window, msg, wparam, lparam); + } +} + void ALF_RegisterPanelClass(void) { |
