Ilya Shpigor : user32: Destroy EDITSTATE structure in the WM_NCDESTROY message processing.
Alexandre Julliard
julliard at winehq.org
Mon Nov 16 11:44:02 CST 2009
Module: wine
Branch: master
Commit: da9c52371edd7e2d03907df939e7e8c7109fb4a7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=da9c52371edd7e2d03907df939e7e8c7109fb4a7
Author: Ilya Shpigor <shpigor at etersoft.ru>
Date: Sun Nov 15 13:33:38 2009 +0300
user32: Destroy EDITSTATE structure in the WM_NCDESTROY message processing.
---
dlls/user32/edit.c | 10 +++++-----
dlls/user32/tests/edit.c | 40 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c
index 190e9c6..f4143b1 100644
--- a/dlls/user32/edit.c
+++ b/dlls/user32/edit.c
@@ -4691,10 +4691,10 @@ static LRESULT EDIT_WM_Create(EDITSTATE *es, LPCWSTR name)
/*********************************************************************
*
- * WM_DESTROY
+ * WM_NCDESTROY
*
*/
-static LRESULT EDIT_WM_Destroy(EDITSTATE *es)
+static LRESULT EDIT_WM_NCDestroy(EDITSTATE *es)
{
LINEDEF *pc, *pp;
@@ -4762,7 +4762,7 @@ static LRESULT EditWndProc_common( HWND hwnd, UINT msg,
if (!es && msg != WM_NCCREATE)
return DefWindowProcT(hwnd, msg, wParam, lParam, unicode);
- if (es && (msg != WM_DESTROY)) EDIT_LockBuffer(es);
+ if (es && (msg != WM_NCDESTROY)) EDIT_LockBuffer(es);
switch (msg) {
case EM_GETSEL16:
@@ -5102,8 +5102,8 @@ static LRESULT EditWndProc_common( HWND hwnd, UINT msg,
result = EDIT_WM_NCCreate(hwnd, (LPCREATESTRUCTW)lParam, unicode);
break;
- case WM_DESTROY:
- result = EDIT_WM_Destroy(es);
+ case WM_NCDESTROY:
+ result = EDIT_WM_NCDestroy(es);
es = NULL;
break;
diff --git a/dlls/user32/tests/edit.c b/dlls/user32/tests/edit.c
index 5ca012e..e42127f 100644
--- a/dlls/user32/tests/edit.c
+++ b/dlls/user32/tests/edit.c
@@ -1239,6 +1239,45 @@ static void test_edit_control_5(void)
DestroyWindow(hWnd);
}
+/* Test WM_GETTEXT processing
+ * after destroy messages
+ */
+static void test_edit_control_6(void)
+{
+ static const char *str = "test\r\ntest";
+ char buf[MAXLEN];
+ LONG ret;
+ HWND hWnd;
+
+ hWnd = CreateWindowEx(0,
+ "EDIT",
+ "Test",
+ 0,
+ 10, 10, 1, 1,
+ NULL, NULL, hinst, NULL);
+ assert(hWnd);
+
+ ret = SendMessageA(hWnd, WM_SETTEXT, 0, (LPARAM)str);
+ ok(ret == TRUE, "Expected %d, got %d\n", TRUE, ret);
+ ret = SendMessageA(hWnd, WM_GETTEXT, MAXLEN, (LPARAM)buf);
+ ok(ret == lstrlen(str), "Expected %s, got len %d\n", str, ret);
+ ok(!lstrcmp(buf, str), "Expected %s, got %s\n", str, buf);
+ buf[0] = 0;
+ ret = SendMessageA(hWnd, WM_DESTROY, 0, 0);
+ ok(ret == 0, "Expected 0, got %d\n", ret);
+ ret = SendMessageA(hWnd, WM_GETTEXT, MAXLEN, (LPARAM)buf);
+ ok(ret == lstrlen(str), "Expected %s, got len %d\n", str, ret);
+ ok(!lstrcmp(buf, str), "Expected %s, got %s\n", str, buf);
+ buf[0] = 0;
+ ret = SendMessageA(hWnd, WM_NCDESTROY, 0, 0);
+ ok(ret == 0, "Expected 0, got %d\n", ret);
+ ret = SendMessageA(hWnd, WM_GETTEXT, MAXLEN, (LPARAM)buf);
+ ok(ret == 0, "Expected 0, got len %d\n", ret);
+ ok(!lstrcmp(buf, ""), "Expected empty string, got %s\n", buf);
+
+ DestroyWindow(hWnd);
+}
+
static void test_edit_control_limittext(void)
{
HWND hwEdit;
@@ -2270,6 +2309,7 @@ START_TEST(edit)
test_edit_control_3();
test_edit_control_4();
test_edit_control_5();
+ test_edit_control_6();
test_edit_control_limittext();
test_margins();
test_margins_font_change();
More information about the wine-cvs
mailing list