Peter Dons Tychsen : comctl32: Handle WM_NOTIFY correctly when the parent returns zero.
Alexandre Julliard
julliard at winehq.org
Fri Jan 22 08:26:55 CST 2010
Module: wine
Branch: master
Commit: a3528a764223cce6613a464588c4bc5202f6cebc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a3528a764223cce6613a464588c4bc5202f6cebc
Author: Peter Dons Tychsen <donpedro at tdcadsl.dk>
Date: Thu Jan 21 02:45:46 2010 +0100
comctl32: Handle WM_NOTIFY correctly when the parent returns zero.
---
dlls/comctl32/status.c | 17 ++++++---
dlls/comctl32/tests/status.c | 79 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 90 insertions(+), 6 deletions(-)
diff --git a/dlls/comctl32/status.c b/dlls/comctl32/status.c
index cc29990..d0675da 100644
--- a/dlls/comctl32/status.c
+++ b/dlls/comctl32/status.c
@@ -1162,7 +1162,7 @@ STATUSBAR_NotifyFormat (STATUS_INFO *infoPtr, HWND from, INT cmd)
static LRESULT
-STATUSBAR_SendMouseNotify(const STATUS_INFO *infoPtr, UINT code, LPARAM lParam)
+STATUSBAR_SendMouseNotify(const STATUS_INFO *infoPtr, UINT code, UINT msg, WPARAM wParam, LPARAM lParam)
{
NMMOUSE nm;
@@ -1175,7 +1175,12 @@ STATUSBAR_SendMouseNotify(const STATUS_INFO *infoPtr, UINT code, LPARAM lParam)
nm.dwItemSpec = STATUSBAR_InternalHitTest(infoPtr, &nm.pt);
nm.dwItemData = 0;
nm.dwHitInfo = 0x30000; /* seems constant */
- SendMessageW(infoPtr->Notify, WM_NOTIFY, 0, (LPARAM)&nm);
+
+ /* Do default processing if WM_NOTIFY returns zero */
+ if(!SendMessageW(infoPtr->Notify, WM_NOTIFY, nm.hdr.idFrom, (LPARAM)&nm))
+ {
+ return DefWindowProcW(infoPtr->Self, msg, wParam, lParam);
+ }
return 0;
}
@@ -1276,10 +1281,10 @@ StatusWindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return STATUSBAR_GetTextLength (infoPtr, 0);
case WM_LBUTTONDBLCLK:
- return STATUSBAR_SendMouseNotify(infoPtr, NM_DBLCLK, lParam);
+ return STATUSBAR_SendMouseNotify(infoPtr, NM_DBLCLK, msg, wParam, lParam);
case WM_LBUTTONUP:
- return STATUSBAR_SendMouseNotify(infoPtr, NM_CLICK, lParam);
+ return STATUSBAR_SendMouseNotify(infoPtr, NM_CLICK, msg, wParam, lParam);
case WM_MOUSEMOVE:
return STATUSBAR_Relay2Tip (infoPtr, msg, wParam, lParam);
@@ -1303,10 +1308,10 @@ StatusWindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return STATUSBAR_WMPaint (infoPtr, (HDC)wParam);
case WM_RBUTTONDBLCLK:
- return STATUSBAR_SendMouseNotify(infoPtr, NM_RDBLCLK, lParam);
+ return STATUSBAR_SendMouseNotify(infoPtr, NM_RDBLCLK, msg, wParam, lParam);
case WM_RBUTTONUP:
- return STATUSBAR_SendMouseNotify(infoPtr, NM_RCLICK, lParam);
+ return STATUSBAR_SendMouseNotify(infoPtr, NM_RCLICK, msg, wParam, lParam);
case WM_SETFONT:
return STATUSBAR_WMSetFont (infoPtr, (HFONT)wParam, LOWORD(lParam));
diff --git a/dlls/comctl32/tests/status.c b/dlls/comctl32/tests/status.c
index c721c96..06e7b87 100644
--- a/dlls/comctl32/tests/status.c
+++ b/dlls/comctl32/tests/status.c
@@ -494,6 +494,84 @@ static void test_gettext(void)
DestroyWindow(hwndStatus);
}
+/* Notify events to parent */
+static BOOL g_got_dblclk;
+static BOOL g_got_click;
+static BOOL g_got_rdblclk;
+static BOOL g_got_rclick;
+
+/* Messages to parent */
+static BOOL g_got_contextmenu;
+
+static LRESULT WINAPI test_notify_parent_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg)
+ {
+ case WM_NOTIFY:
+ {
+ NMHDR *hdr = ((LPNMHDR)lParam);
+ switch(hdr->code)
+ {
+ case NM_DBLCLK: g_got_dblclk = TRUE; break;
+ case NM_CLICK: g_got_click = TRUE; break;
+ case NM_RDBLCLK: g_got_rdblclk = TRUE; break;
+ case NM_RCLICK: g_got_rclick = TRUE; break;
+ }
+
+ /* Return zero to indicate default processing */
+ return 0;
+ }
+
+ case WM_CONTEXTMENU: g_got_contextmenu = TRUE; return 0;
+
+ default:
+ return( DefWindowProcA(hwnd, msg, wParam, lParam));
+ }
+
+ return 0;
+}
+
+/* Test that WM_NOTIFY messages from the status control works correctly */
+static void test_notify(void)
+{
+ HWND hwndParent;
+ HWND hwndStatus;
+ ATOM atom;
+ WNDCLASSA wclass = {0};
+ wclass.lpszClassName = "TestNotifyParentClass";
+ wclass.lpfnWndProc = test_notify_parent_proc;
+ atom = RegisterClassA(&wclass);
+ ok(atom, "RegisterClass failed!n");
+
+ /* create parent */
+ hwndParent = CreateWindow(wclass.lpszClassName, "parent", WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, 0, 300, 20, NULL, NULL, NULL, NULL);
+ ok(hwndParent != NULL, "Parent creation failed!\n");
+
+ /* create status bar */
+ hwndStatus = CreateWindow(STATUSCLASSNAME, NULL, WS_VISIBLE | WS_CHILD,
+ 0, 0, 300, 20, hwndParent, NULL, NULL, NULL);
+ ok(hwndStatus != NULL, "Status creation failed!\n");
+
+ /* Send various mouse event, and check that we get them */
+ g_got_dblclk = FALSE;
+ SendMessage(hwndStatus, WM_LBUTTONDBLCLK, 0, 0);
+ ok(g_got_dblclk, "WM_LBUTTONDBLCLK was not processed correctly!\n");
+ g_got_rdblclk = FALSE;
+ SendMessage(hwndStatus, WM_RBUTTONDBLCLK, 0, 0);
+ ok(g_got_rdblclk, "WM_RBUTTONDBLCLK was not processed correctly!\n");
+ g_got_click = FALSE;
+ SendMessage(hwndStatus, WM_LBUTTONUP, 0, 0);
+ ok(g_got_click, "WM_LBUTTONUP was not processed correctly!\n");
+
+ /* For R-UP, check that we also get the context menu from the default processing */
+ g_got_contextmenu = FALSE;
+ g_got_rclick = FALSE;
+ SendMessage(hwndStatus, WM_RBUTTONUP, 0, 0);
+ ok(g_got_rclick, "WM_RBUTTONUP was not processed correctly!\n");
+ ok(g_got_contextmenu, "WM_RBUTTONUP did not activate the context menu!\n");
+}
+
START_TEST(status)
{
hinst = GetModuleHandleA(NULL);
@@ -512,4 +590,5 @@ START_TEST(status)
test_height();
test_status_ownerdraw();
test_gettext();
+ test_notify();
}
More information about the wine-cvs
mailing list