summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-19 15:40:25 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-19 15:50:28 +0200
commit9b6fbe3b5fd7e8bcad7f0f0993409f4d6777c42f (patch)
treef5aa786f5ab9ead3ecbc46f5770473158d91fc5b
parent144736e53fd0142ec215a375bf588b9634e312ed (diff)
panel vtbl first implementation
still basically untested
-rw-r--r--alf/alf.h15
-rw-r--r--alf/alfpanel.cpp70
2 files changed, 72 insertions, 13 deletions
diff --git a/alf/alf.h b/alf/alf.h
index cc3fc6f..a23eb8c 100644
--- a/alf/alf.h
+++ b/alf/alf.h
@@ -24,6 +24,13 @@ typedef struct {
BOOL (*pretranslatemessage)(void * /*closure*/, HWND /*window*/, MSG * /*message*/);
} ALFWindowVTable;
+typedef struct {
+ void (*create)(void * /*closure*/, HWND /*panel*/);
+ void (*destroy)(void * /*closure*/, HWND /*panel*/);
+ LRESULT (*message)(void * /*closure*/, HWND, UINT, WPARAM, LPARAM);
+ void (*paint)(void * /*closure*/, HWND, HDC, RECT * /*rcPaint*/);
+} ALFPanelVTable;
+
// layout flags
#define ALF_LAYOUT_SIZE_FIXED 0x00
#define ALF_LAYOUT_SIZE_QUERY 0x01
@@ -93,6 +100,8 @@ typedef struct {
#define ALF_WM_LBL_GETSTYLE (ALF_WM__BASE + 201)
#define ALF_WM_LBL_SETSTYLE (ALF_WM__BASE + 202)
+#define ALF_WM_PANEL_SETVTABLE (ALF_WM__BASE + 201)
+
typedef DWORD ALFColor;
#define ALF_COLOR_TRANSPARENT ((ALFColor)-1)
@@ -318,6 +327,12 @@ ALF_ComboBoxSetText(HWND combo, const TCHAR *text);
HWND
ALF_AddPanel(HWND parent, WORD id, int x, int y);
+void
+ALF_Panel_SetVTable(HWND panel, const ALFPanelVTable *vtbl, void *closure);
+
+LRESULT
+ALF_Panel_DefWindowProc(HWND panel, UINT msg, WPARAM wparam, LPARAM lparam);
+
// tab control
HWND
ALF_AddNotebook(HWND parent, WORD id, int x, int y);
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)
{