summaryrefslogtreecommitdiff
path: root/new/util_windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'new/util_windows.c')
-rw-r--r--new/util_windows.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/new/util_windows.c b/new/util_windows.c
index 0bd76a0..6292967 100644
--- a/new/util_windows.c
+++ b/new/util_windows.c
@@ -16,3 +16,57 @@ WCHAR *toUTF16(const char *str)
logLastError("error converting from UTF-8 to UTF-16 in toUTF16()");
return wstr;
}
+
+/*
+all container windows (including the message-only window, hence this is not in container_windows.c) have to call the sharedWndProc() to ensure messages go in the right place and control colors are handled properly
+*/
+
+/*
+all controls that have events receive the events themselves through subclasses
+to do this, all container windows (including the message-only window; see http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q104069) forward WM_COMMAND to each control with this function, WM_NOTIFY with forwardNotify, etc.
+*/
+static LRESULT forwardCommand(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ HWND control = (HWND) lParam;
+
+ // don't generate an event if the control (if there is one) is unparented (a child of the initial parent window)
+ if (control != NULL && IsChild(initialParent, control) == 0)
+ return SendMessageW(control, msgCOMMAND, wParam, lParam);
+ return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+}
+
+static LRESULT forwardNotify(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ NMHDR *nmhdr = (NMHDR *) lParam;
+ HWND control = nmhdr->hwndFrom;
+
+ // don't generate an event if the control (if there is one) is unparented (a child of the initial parent window)
+ if (control != NULL && IsChild(initialParent, control) == 0)
+ return SendMessageW(control, msgNOTIFY, wParam, lParam);
+ return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+}
+
+BOOL sharedWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
+{
+ switch (uMsg) {
+ case WM_COMMAND:
+ *lResult = forwardCommand(hwnd, uMsg, wParam, lParam);
+ return TRUE;
+ case WM_NOTIFY:
+ *lResult = forwardNotify(hwnd, uMsg, wParam, lParam);
+ return TRUE;
+/*TODO case WM_CTLCOLORSTATIC:
+ case WM_CTLCOLORBTN:
+ // read-only TextFields and Textboxes are exempt
+ // this is because read-only edit controls count under WM_CTLCOLORSTATIC
+ if (windowClassOf((HWND) lParam, L"edit", NULL) == 0)
+ if (textfieldReadOnly((HWND) lParam))
+ return FALSE;
+ if (SetBkMode((HDC) wParam, TRANSPARENT) == 0)
+ xpanic("error setting transparent background mode to Labels", GetLastError());
+ paintControlBackground((HWND) lParam, (HDC) wParam);
+ *lResult = (LRESULT) hollowBrush;
+ return TRUE;
+*/ }
+ return FALSE;
+}