summaryrefslogtreecommitdiff
path: root/alf
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-06-11 11:11:33 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-06-11 11:11:33 +0200
commitbe3ddf7cb2400f2a744799303ebe05d4caba54c3 (patch)
tree07b063d80c3bca25fcf8b13e3df5d7ea276af747 /alf
parent1e9adbd19cf7702ac14796c4ce1984af15842f73 (diff)
refactor message reflection code
should be more complete and correct, but not well tested yet
Diffstat (limited to 'alf')
-rw-r--r--alf/alf.cpp79
-rw-r--r--alf/alfpriv.h3
-rw-r--r--alf/alftoplevel.cpp90
3 files changed, 110 insertions, 62 deletions
diff --git a/alf/alf.cpp b/alf/alf.cpp
index 605f663..9cc2a59 100644
--- a/alf/alf.cpp
+++ b/alf/alf.cpp
@@ -240,3 +240,82 @@ ALF_MessageBox(HWND hwnd, const TCHAR *text, const TCHAR *caption, UINT type)
return retval;
}
+
+BOOL
+ALF_ReflectMessage(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LRESULT *pRet)
+{
+ switch (msg) {
+ case WM_DRAWITEM: {
+ if (wparam) {
+ DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lparam;
+ *pRet = SendMessage(dis->hwndItem, 0x2000 + WM_DRAWITEM, wparam, lparam);
+ return TRUE;
+ } else {
+ // sent by a menu
+ return FALSE;
+ }
+ }
+ case WM_MEASUREITEM: {
+ if (wparam) {
+ // no HWND in MEASUREITEMSTRUCT, need to find the control by its id
+ HWND hwndControl = ALF_ControlHwndById(hwnd, (WORD)wparam);
+ if (hwndControl) {
+ *pRet = SendMessage(hwndControl, 0x2000 + WM_MEASUREITEM, wparam, lparam);
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ } else {
+ // sent by a menu
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+ case WM_DELETEITEM: {
+ DELETEITEMSTRUCT *dis = (DELETEITEMSTRUCT *)lparam;
+ *pRet = SendMessage(dis->hwndItem, 0x2000 + WM_DELETEITEM, wparam, lparam);
+ return TRUE;
+ }
+ case WM_VKEYTOITEM:
+ case WM_CHARTOITEM:
+ *pRet = SendMessage((HWND)lparam, 0x2000 + msg, wparam, lparam);
+ return TRUE;
+ case WM_COMPAREITEM: {
+ COMPAREITEMSTRUCT *cis = (COMPAREITEMSTRUCT *)lparam;
+ *pRet = SendMessage(cis->hwndItem, 0x2000 + WM_COMPAREITEM, wparam, lparam);
+ return TRUE;
+ }
+ case WM_NOTIFY: {
+ NMHDR *nmhdr = (NMHDR *)lparam;
+ if (nmhdr->hwndFrom) {
+ *pRet = SendMessage(nmhdr->hwndFrom, 0x2000 + WM_NOTIFY, wparam, lparam);
+ return !!*pRet;
+ } else {
+ return FALSE;
+ }
+ }
+ case WM_COMMAND:
+ if (lparam) {
+ *pRet = SendMessage((HWND)lparam, 0x2000 + WM_COMMAND, wparam, lparam);
+ return !!*pRet;
+ } else {
+ return FALSE;
+ }
+ case WM_HSCROLL:
+ case WM_VSCROLL:
+ SendMessage((HWND)lparam, 0x2000 + msg, wparam, lparam);
+ return FALSE; // always continue processing in parent
+ case WM_CTLCOLOR:
+ case WM_CTLCOLORMSGBOX:
+ case WM_CTLCOLOREDIT:
+ case WM_CTLCOLORLISTBOX:
+ case WM_CTLCOLORBTN:
+ case WM_CTLCOLORSTATIC:
+ case WM_CTLCOLORSCROLLBAR:
+ *pRet = SendMessage((HWND)lparam, 0x2000 + msg, wparam, lparam);
+ return !!*pRet; // let owner handle color stuff if the control didn’t return a brush
+ default:
+ return FALSE;
+ }
+}
diff --git a/alf/alfpriv.h b/alf/alfpriv.h
index 586bbba..fb8f1c3 100644
--- a/alf/alfpriv.h
+++ b/alf/alfpriv.h
@@ -35,6 +35,9 @@ ALF_CreatePanelWindow(HWND parent, WORD id);
BOOL
ALF_ShouldMessageBubble(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
+BOOL
+ALF_ReflectMessage(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LRESULT *pRet);
+
// TODO: refine custom control API, make it public
// passed as ptr in WM_CREATE
diff --git a/alf/alftoplevel.cpp b/alf/alftoplevel.cpp
index 29e43cb..0a8ece7 100644
--- a/alf/alftoplevel.cpp
+++ b/alf/alftoplevel.cpp
@@ -193,6 +193,10 @@ ALF_Toplevel_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
ALFToplevelPriv *priv = (ALFToplevelPriv*)GetWindowLongPtr(hwnd, DLGWINDOWEXTRA);
+ LRESULT r;
+ if (ALF_ReflectMessage(hwnd, msg, wparam, lparam, &r))
+ return r;
+
if (msg == WM_INITDIALOG) {
struct ALFToplevel_CreateParams *params = (struct ALFToplevel_CreateParams *)lparam;
@@ -278,84 +282,46 @@ ALF_Toplevel_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
return 0;
}
- if (msg == WM_COMMAND) {
+ if (msg == WM_COMMAND && priv->vtbl && priv->vtbl->command) {
HWND source = (HWND)lparam;
WORD code = HIWORD(wparam);
WORD id = LOWORD(wparam);
- LRESULT ret = 0;
- if (source != 0)
- ret = SendMessage(source, 0x2000 + WM_COMMAND, wparam, lparam);
-
- if (ret == 0 && priv->vtbl && priv->vtbl->command)
- ret = priv->vtbl->command(priv->closure, hwnd, code, id, source);
-
- return ret;
+ return priv->vtbl->command(priv->closure, hwnd, code, id, source);
}
- if (msg == WM_NOTIFY) {
+ if (msg == WM_NOTIFY && priv->vtbl && priv->vtbl->notify) {
NMHDR *nmhdr = (NMHDR *)lparam;
- LRESULT ret = 0;
-
- if (nmhdr->hwndFrom)
- ret = SendMessage(nmhdr->hwndFrom, 0x2000 + WM_NOTIFY, wparam, lparam);
-
- if (ret == 0 && priv->vtbl && priv->vtbl->notify)
- ret = priv->vtbl->notify(priv->closure, hwnd, wparam, nmhdr);
-
- return ret;
+ return priv->vtbl->notify(priv->closure, hwnd, wparam, nmhdr);
}
- if (msg == WM_DRAWITEM) {
- LPDRAWITEMSTRUCT dis = (DRAWITEMSTRUCT *)lparam;
- LRESULT ret = 0;
- if (wparam && dis->hwndItem) {
- ret = SendMessage(dis->hwndItem, 0x2000 + WM_DRAWITEM, wparam, lparam);
- }
+ if (msg == WM_CTLCOLORSTATIC) {
+ if (ALF_Compat_IsComCtlV6() && !ALF_Compat_IsVista()) {
+ // HACK! transparent checkbox background for comctl v6 on XP
+ // broken on every other version of windows, but not needed for Vista
- if (ret)
- return ret;
- }
+ WCHAR c[32] = {0};
+ GetClassNameW((HWND)lparam, c, sizeof(c)/sizeof(c[0]));
- if (msg == WM_CTLCOLORSTATIC) {
- LRESULT ret = SendMessage((HWND)lparam, 0x2000 + WM_CTLCOLORSTATIC, wparam, lparam);
+ if (!lstrcmpW(c, WC_BUTTONW)) {
+ RECT rcClient;
+ GetClientRect((HWND)lparam, &rcClient);
- if (ret) {
- return ret;
- } else {
- if (ALF_Compat_IsComCtlV6() && !ALF_Compat_IsVista()) {
- // HACK! transparent checkbox background for comctl v6 on XP
- // broken on every other version of windows, but not needed for Vista
-
- WCHAR c[32] = {0};
- GetClassNameW((HWND)lparam, c, sizeof(c)/sizeof(c[0]));
-
- if (!lstrcmpW(c, WC_BUTTONW)) {
- RECT rcClient;
- GetClientRect((HWND)lparam, &rcClient);
-
- ALF_Compat_DrawThemeParentBackground((HWND)lparam, (HDC)wparam, &rcClient);
- SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE));
- SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT));
- return (LRESULT)GetStockObject(HOLLOW_BRUSH);
- }
+ ALF_Compat_DrawThemeParentBackground((HWND)lparam, (HDC)wparam, &rcClient);
+ SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE));
+ SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT));
+ return (LRESULT)GetStockObject(HOLLOW_BRUSH);
}
-
- SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE));
- SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT));
- return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
}
+
+ SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE));
+ SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT));
+ return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
}
if (msg == WM_CTLCOLORBTN) {
- LRESULT ret = SendMessage((HWND)lparam, 0x2000 + WM_CTLCOLORBTN, wparam, lparam);
-
- if (ret) {
- return ret;
- } else {
- SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE));
- SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT));
- return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
- }
+ SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE));
+ SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT));
+ return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
}
if (msg == WM_SIZE) {