From c1cba715ff22cf5f16c05030c99ae9178b7cf643 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 2 Apr 2008 11:04:23 -0700 Subject: [PATCH 2/3] user32: dialogs should ignore WM_KEYDOWN messages if it gets DLGC_WANTCHARS. --- dlls/user32/dialog.c | 2 +- dlls/user32/tests/edit.c | 103 +++++++++++++++++++++++++++++++++++++++++ dlls/user32/tests/resource.rc | 10 ++++ 3 files changed, 114 insertions(+), 1 deletions(-) diff --git a/dlls/user32/dialog.c b/dlls/user32/dialog.c index bb0d460..243bb5a 100644 --- a/dlls/user32/dialog.c +++ b/dlls/user32/dialog.c @@ -1094,7 +1094,7 @@ BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg ) { case WM_KEYDOWN: dlgCode = SendMessageW( msg->hwnd, WM_GETDLGCODE, msg->wParam, (LPARAM)msg ); - if (dlgCode & DLGC_WANTMESSAGE) break; + if (dlgCode & (DLGC_WANTCHARS|DLGC_WANTMESSAGE)) break; switch(msg->wParam) { diff --git a/dlls/user32/tests/edit.c b/dlls/user32/tests/edit.c index a40251c..123fd4f 100644 --- a/dlls/user32/tests/edit.c +++ b/dlls/user32/tests/edit.c @@ -37,6 +37,95 @@ struct edit_notify { static struct edit_notify notifications; +static INT_PTR CALLBACK multi_edit_dialog_proc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + HWND hedit = GetDlgItem(hdlg, 1000); + SetFocus(hedit); + switch (lparam) + { + /* test cases related to bug 12319 */ + case 0: + PostMessage(hedit, WM_KEYDOWN, VK_TAB, 0xf0001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 0); + break; + case 1: + PostMessage(hedit, WM_CHAR, VK_TAB, 0xf0001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 0); + break; + case 2: + PostMessage(hedit, WM_KEYDOWN, VK_TAB, 0xf0001); + PostMessage(hedit, WM_CHAR, VK_TAB, 0xf0001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 0); + break; + + default: + break; + } + break; + } + + case WM_COMMAND: + if (HIWORD(wparam) != BN_CLICKED) + break; + + switch (LOWORD(wparam)) + { + case IDOK: + EndDialog(hdlg, 111); + break; + + case IDCANCEL: + EndDialog(hdlg, 222); + break; + + default: + break; + } + break; + + case WM_USER: + { + HWND hfocus = GetFocus(); + HWND hedit = GetDlgItem(hdlg, 1000); + HWND hedit2 = GetDlgItem(hdlg, 1001); + HWND hedit3 = GetDlgItem(hdlg, 1002); + + if (wparam != 0xdeadbeef) + break; + + switch (lparam) + { + case 0: + if (hfocus == hedit) + EndDialog(hdlg, 1111); + else if (hfocus == hedit2) + EndDialog(hdlg, 2222); + else if (hfocus == hedit3) + EndDialog(hdlg, 3333); + else + EndDialog(hdlg, 4444); + break; + default: + EndDialog(hdlg, 5555); + } + break; + } + + case WM_CLOSE: + EndDialog(hdlg, 333); + break; + + default: + break; + } + + return FALSE; +} + static INT_PTR CALLBACK edit_dialog_proc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) @@ -1341,6 +1430,19 @@ static void test_edit_dialog(void) ok(33 == r, "Expected %d, got %d\n", 33, r); } +static void test_multi_edit_dialog(void) +{ + int r; + + /* test for multiple edit dialogs (bug 12319) */ + r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, (DLGPROC)multi_edit_dialog_proc, 0); + ok(2222 == r, "Expected %d, got %d\n", 2222, r); + r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, (DLGPROC)multi_edit_dialog_proc, 1); + ok(1111 == r, "Expected %d, got %d\n", 1111, r); + r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, (DLGPROC)multi_edit_dialog_proc, 2); + ok(2222 == r, "Expected %d, got %d\n", 2222, r); +} + static BOOL RegisterWindowClasses (void) { WNDCLASSA test2; @@ -1410,6 +1512,7 @@ START_TEST(edit) test_espassword(); test_undo(); test_edit_dialog(); + test_multi_edit_dialog(); UnregisterWindowClasses(); } diff --git a/dlls/user32/tests/resource.rc b/dlls/user32/tests/resource.rc index b0c4967..24c5e33 100644 --- a/dlls/user32/tests/resource.rc +++ b/dlls/user32/tests/resource.rc @@ -98,6 +98,16 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,129,24,50,14 END +MULTI_EDIT_DIALOG DIALOG DISCARDABLE 0, 0, 160, 75 +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_CENTER +CAPTION "Multiple Edit Test" +FONT 8, "MS Shell Dlg" +{ + EDITTEXT 1000, 5, 5, 150, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + EDITTEXT 1001, 5, 25, 150, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + EDITTEXT 1002, 5, 45, 150, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +} + EDIT_DIALOG DIALOG DISCARDABLE 0, 0, 160, 80 STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_CENTER CAPTION "Edit Test" -- 1.5.2.5