Lei Zhang : user32: Tweak how the edit control handles WM_GETDLGCODE.

Alexandre Julliard julliard at winehq.org
Wed Mar 26 09:16:11 CDT 2008


Module: wine
Branch: master
Commit: 41ea8f0e8a6fab93fa08da16ecc24260dbad327c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=41ea8f0e8a6fab93fa08da16ecc24260dbad327c

Author: Lei Zhang <thestig at google.com>
Date:   Tue Mar 25 19:09:38 2008 -0700

user32: Tweak how the edit control handles WM_GETDLGCODE.

---

 dlls/user32/edit.c            |   33 +++++++++++++-----
 dlls/user32/tests/edit.c      |   76 +++++++++++++++++++++++++++++++++++++++++
 dlls/user32/tests/resource.rc |   10 +++++
 3 files changed, 110 insertions(+), 9 deletions(-)

diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c
index b1a0007..0ff4e7c 100644
--- a/dlls/user32/edit.c
+++ b/dlls/user32/edit.c
@@ -795,21 +795,36 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
 		result = DLGC_HASSETSEL | DLGC_WANTCHARS | DLGC_WANTARROWS;
 		
 		if (es->style & ES_MULTILINE)
-		{
 		   result |= DLGC_WANTALLKEYS;
-		   break;
-		}
 
 		if (lParam && (((LPMSG)lParam)->message == WM_KEYDOWN))
 		{
 		   int vk = (int)((LPMSG)lParam)->wParam;
 
-		   if (es->hwndListBox && (vk == VK_RETURN || vk == VK_ESCAPE))
-		   {
-		      if (SendMessageW(GetParent(hwnd), CB_GETDROPPEDSTATE, 0, 0))
-		         result |= DLGC_WANTMESSAGE;
-		   }
-		}
+                   if (es->hwndListBox)
+                   {
+                       if (vk == VK_RETURN || vk == VK_ESCAPE)
+                           if (SendMessageW(GetParent(hwnd), CB_GETDROPPEDSTATE, 0, 0))
+                               result |= DLGC_WANTMESSAGE;
+                   }
+                   else
+                   {
+                       switch (vk)
+                       {
+                           case VK_RETURN:
+                               SendMessageW(GetParent(hwnd), WM_COMMAND, IDOK, (LPARAM)GetDlgItem(GetParent(hwnd), IDOK));
+                               break;
+                           case VK_ESCAPE:
+                               SendMessageW(GetParent(hwnd), WM_CLOSE, 0, 0);
+                               break;
+                           case VK_TAB:
+                               SendMessageW(GetParent(hwnd), WM_NEXTDLGCTL, (GetKeyState(VK_SHIFT) & 0x8000), 0);
+                               break;
+                           default:
+                               break;
+                       }
+                   }
+                }
 		break;
 
         case WM_IME_CHAR:
diff --git a/dlls/user32/tests/edit.c b/dlls/user32/tests/edit.c
index fae1bd1..05e6741 100644
--- a/dlls/user32/tests/edit.c
+++ b/dlls/user32/tests/edit.c
@@ -37,6 +37,70 @@ struct edit_notify {
 
 static struct edit_notify notifications;
 
+static INT_PTR CALLBACK bug_11841_proc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+    switch (msg)
+    {
+        case WM_INITDIALOG:
+        {
+            SetFocus(GetDlgItem(hdlg, 1000));
+            switch (lparam)
+            {
+                case 0:
+                    PostMessage(GetDlgItem(hdlg, 1000), WM_KEYDOWN, 0x1b, 0x10001);
+                    break;
+                case 1:
+                    PostMessage(GetDlgItem(hdlg, 1000), WM_KEYDOWN, 0xd, 0x1c0001);
+                    break;
+                case 2:
+                    PostMessage(GetDlgItem(hdlg, 1000), WM_KEYDOWN, 0x9, 0xf0001);
+                    PostMessage(hdlg, WM_USER, 0xdeadbeef, 0xdeadbeef);
+                    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:
+            if (wparam != 0xdeadbeef || lparam != 0xdeadbeef)
+                break;
+            if (GetFocus() == GetDlgItem(hdlg, IDOK))
+                EndDialog(hdlg, 444);
+            else
+                EndDialog(hdlg, 555);
+            break;
+
+        case WM_CLOSE:
+            EndDialog(hdlg, 333);
+            break;
+
+        default:
+            break;
+    }
+
+    return FALSE;
+}
+
 static HINSTANCE hinst;
 static HWND hwndET2;
 static const char szEditTest2Class[] = "EditTest2Class";
@@ -1134,6 +1198,17 @@ static void test_undo(void)
     DestroyWindow (hwEdit);
 }
 
+static void test_bug_11841(void)
+{
+    int r;
+    r = DialogBoxParam(hinst, "BUG_11841_DIALOG", NULL, (DLGPROC)bug_11841_proc, 0);
+    ok(333 == r, "Expected %d, got %d\n", 333, r);
+    r = DialogBoxParam(hinst, "BUG_11841_DIALOG", NULL, (DLGPROC)bug_11841_proc, 1);
+    ok(111 == r, "Expected %d, got %d\n", 111, r);
+    r = DialogBoxParam(hinst, "BUG_11841_DIALOG", NULL, (DLGPROC)bug_11841_proc, 2);
+    ok(444 == r, "Expected %d, got %d\n", 444, r);
+}
+
 static BOOL RegisterWindowClasses (void)
 {
     WNDCLASSA test2;
@@ -1202,6 +1277,7 @@ START_TEST(edit)
     test_text_position();
     test_espassword();
     test_undo();
+    test_bug_11841();
 
     UnregisterWindowClasses();
 }
diff --git a/dlls/user32/tests/resource.rc b/dlls/user32/tests/resource.rc
index f01c6f5..a68857f 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
 
+BUG_11841_DIALOG DIALOG DISCARDABLE 0, 0, 160, 80
+STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_CENTER
+CAPTION "Bug 11841 Test"
+FONT 8, "MS Shell Dlg"
+{
+    PUSHBUTTON "Ok", IDOK, 20, 60, 50, 14,  WS_CHILD | WS_VISIBLE | WS_TABSTOP
+    PUSHBUTTON "Cancel", IDCANCEL, 100, 60, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+    EDITTEXT 1000, 5, 5, 150, 50, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL | ES_READONLY
+}
+
 /* @makedep: test_mono.bmp */
 100 BITMAP test_mono.bmp
 




More information about the wine-cvs mailing list