Fixed notification-sending issue on Windows.
This commit is contained in:
parent
8ec3acdde9
commit
2005f18624
|
@ -114,47 +114,54 @@ static LRESULT CALLBACK parentWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
WINDOWPOS *wp = (WINDOWPOS *) lParam;
|
WINDOWPOS *wp = (WINDOWPOS *) lParam;
|
||||||
RECT r, margin;
|
RECT r, margin;
|
||||||
|
|
||||||
p = (uiParent *) GetWindowLongPtrW(hwnd, GWLP_USERDATA);
|
// these must always be executed, even on the initial parent
|
||||||
if (p == NULL) {
|
// why? http://blogs.msdn.com/b/oldnewthing/archive/2010/03/16/9979112.aspx
|
||||||
if (uMsg == WM_NCCREATE) {
|
|
||||||
p = (uiParent *) (cs->lpCreateParams);
|
|
||||||
SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR) p);
|
|
||||||
// fall through to DefWindowProcW()
|
|
||||||
}
|
|
||||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
|
||||||
}
|
|
||||||
pp = (struct parent *) (p->Internal);
|
|
||||||
|
|
||||||
switch (uMsg) {
|
switch (uMsg) {
|
||||||
case WM_NCDESTROY:
|
|
||||||
// no need to explicitly destroy children; they're already gone by this point (and so are their data structures; they clean up after themselves)
|
|
||||||
uiFree(p->Internal);
|
|
||||||
uiFree(p);
|
|
||||||
break; // fall through to DefWindowPocW()
|
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
// bounce back to the control in question
|
// bounce back to the control in question
|
||||||
// except if to the initial parent, in which case act as if the message was ignored
|
// except if to the initial parent, in which case act as if the message was ignored
|
||||||
control = (HWND) lParam;
|
control = (HWND) lParam;
|
||||||
if (control != NULL && IsChild(initialParent, control) == 0)
|
if (control != NULL && IsChild(initialParent, control) == 0)
|
||||||
return SendMessageW(control, msgCOMMAND, wParam, lParam);
|
return SendMessageW(control, msgCOMMAND, wParam, lParam);
|
||||||
break; // fall through to DefWindowPocW()
|
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||||
case WM_NOTIFY:
|
case WM_NOTIFY:
|
||||||
// same as WM_COMMAND
|
// same as WM_COMMAND
|
||||||
control = nm->hwndFrom;
|
control = nm->hwndFrom;
|
||||||
if (control != NULL && IsChild(initialParent, control) == 0)
|
if (control != NULL && IsChild(initialParent, control) == 0)
|
||||||
return SendMessageW(control, msgNOTIFY, wParam, lParam);
|
return SendMessageW(control, msgNOTIFY, wParam, lParam);
|
||||||
break; // fall through to DefWindowProcW()
|
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||||
case WM_CTLCOLORSTATIC:
|
case WM_CTLCOLORSTATIC:
|
||||||
case WM_CTLCOLORBTN:
|
case WM_CTLCOLORBTN:
|
||||||
/*TODO // read-only TextFields and Textboxes are exempt
|
/*TODO // read-only TextFields and Textboxes are exempt
|
||||||
// this is because read-only edit controls count under WM_CTLCOLORSTATIC
|
// this is because read-only edit controls count under WM_CTLCOLORSTATIC
|
||||||
if (windowClassOf((HWND) lParam, L"edit", NULL) == 0)
|
if (windowClassOf((HWND) lParam, L"edit", NULL) == 0)
|
||||||
if (textfieldReadOnly((HWND) lParam))
|
if (textfieldReadOnly((HWND) lParam))
|
||||||
break; // fall through to DefWindowProcW()
|
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||||
*/ if (SetBkMode((HDC) wParam, TRANSPARENT) == 0)
|
*/ if (SetBkMode((HDC) wParam, TRANSPARENT) == 0)
|
||||||
logLastError("error setting transparent background mode to controls in parentWndProc()");
|
logLastError("error setting transparent background mode to controls in parentWndProc()");
|
||||||
paintControlBackground((HWND) lParam, (HDC) wParam);
|
paintControlBackground((HWND) lParam, (HDC) wParam);
|
||||||
return (LRESULT) hollowBrush;
|
return (LRESULT) hollowBrush;
|
||||||
|
}
|
||||||
|
|
||||||
|
// these are only executed on actual parents
|
||||||
|
p = (uiParent *) GetWindowLongPtrW(hwnd, GWLP_USERDATA);
|
||||||
|
if (p == NULL) {
|
||||||
|
if (uMsg == WM_NCCREATE) {
|
||||||
|
p = (uiParent *) (cs->lpCreateParams);
|
||||||
|
// this will be NULL for the initial parent; that's what we want
|
||||||
|
SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR) p);
|
||||||
|
// fall through to DefWindowProcW()
|
||||||
|
}
|
||||||
|
// this is the return the initial parent will always use
|
||||||
|
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
pp = (struct parent *) (p->Internal);
|
||||||
|
switch (uMsg) {
|
||||||
|
case WM_NCDESTROY:
|
||||||
|
// no need to explicitly destroy children; they're already gone by this point (and so are their data structures; they clean up after themselves)
|
||||||
|
uiFree(p->Internal);
|
||||||
|
uiFree(p);
|
||||||
|
break; // fall through to DefWindowPocW()
|
||||||
case WM_WINDOWPOSCHANGED:
|
case WM_WINDOWPOSCHANGED:
|
||||||
if ((wp->flags & SWP_NOSIZE) != 0)
|
if ((wp->flags & SWP_NOSIZE) != 0)
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue