summaryrefslogtreecommitdiff
path: root/alf/alfpanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alf/alfpanel.cpp')
-rw-r--r--alf/alfpanel.cpp70
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)
{