Take Shift key state into account while processing an accelerator

Dmitry Timoshkov dmitry at baikal.ru
Sun Feb 20 06:15:15 CST 2005


Hello,

this patch should fix a problem with a Ctrl+Shift+[key] accelerator
reported by Tobias Burnus.

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    Take Shift key state into account while processing an accelerator.
    Add a couple of test cases.

diff -up cvs/hq/wine/dlls/user/menu.c wine/dlls/user/menu.c
--- cvs/hq/wine/dlls/user/menu.c	2005-02-02 15:29:22.000000000 +0800
+++ wine/dlls/user/menu.c	2005-02-20 19:57:38.000000000 +0800
@@ -4531,6 +4531,7 @@ static BOOL translate_accelerator( HWND 
 
     if (GetKeyState(VK_CONTROL) & 0x8000) mask |= FCONTROL;
     if (GetKeyState(VK_MENU) & 0x8000) mask |= FALT;
+    if (GetKeyState(VK_SHIFT) & 0x8000) mask |= FSHIFT;
 
     if (message == WM_CHAR || message == WM_SYSCHAR)
     {
diff -up cvs/hq/wine/dlls/user/tests/msg.c wine/dlls/user/tests/msg.c
--- cvs/hq/wine/dlls/user/tests/msg.c	2005-02-20 20:03:10.000000000 +0800
+++ wine/dlls/user/tests/msg.c	2005-02-20 19:59:52.000000000 +0800
@@ -4046,6 +4046,40 @@ static const struct message WmCtrlAltVkN
     { WM_KEYUP, sent|wparam|lparam, VK_CONTROL, 0xc0000001 },
     { 0 }
 };
+static const struct message WmCtrlShiftVkN[] = {
+    { WM_KEYDOWN, wparam|lparam, VK_CONTROL, 1 },
+    { WM_KEYDOWN, sent|wparam|lparam, VK_CONTROL, 1 },
+    { WM_KEYDOWN, wparam|lparam, VK_SHIFT, 1 },
+    { WM_KEYDOWN, sent|wparam|lparam, VK_SHIFT, 1 },
+    { WM_KEYDOWN, wparam|lparam, 'N', 1 },
+    { WM_COMMAND, sent|wparam|lparam, MAKEWPARAM(1004,1), 0 },
+    { WM_KEYUP, wparam|lparam, 'N', 0xc0000001 },
+    { WM_KEYUP, sent|wparam|lparam, 'N', 0xc0000001 },
+    { WM_KEYUP, wparam|lparam, VK_SHIFT, 0xc0000001 },
+    { WM_KEYUP, sent|wparam|lparam, VK_SHIFT, 0xc0000001 },
+    { WM_KEYUP, wparam|lparam, VK_CONTROL, 0xc0000001 },
+    { WM_KEYUP, sent|wparam|lparam, VK_CONTROL, 0xc0000001 },
+    { 0 }
+};
+static const struct message WmCtrlAltShiftVkN[] = {
+    { WM_KEYDOWN, wparam|lparam, VK_CONTROL, 1 },
+    { WM_KEYDOWN, sent|wparam|lparam, VK_CONTROL, 1 },
+    { WM_KEYDOWN, wparam|lparam, VK_MENU, 0x20000001 },
+    { WM_KEYDOWN, sent|wparam|lparam, VK_MENU, 0x20000001 },
+    { WM_KEYDOWN, wparam|lparam, VK_SHIFT, 0x20000001 },
+    { WM_KEYDOWN, sent|wparam|lparam, VK_SHIFT, 0x20000001 },
+    { WM_KEYDOWN, wparam|lparam, 'N', 0x20000001 },
+    { WM_COMMAND, sent|wparam|lparam, MAKEWPARAM(1005,1), 0 },
+    { WM_KEYUP, wparam|lparam, 'N', 0xe0000001 },
+    { WM_KEYUP, sent|wparam|lparam, 'N', 0xe0000001 },
+    { WM_KEYUP, wparam|lparam, VK_SHIFT, 0xe0000001 },
+    { WM_KEYUP, sent|wparam|lparam, VK_SHIFT, 0xe0000001 },
+    { WM_KEYUP, wparam|lparam, VK_MENU, 0xc0000001 },
+    { WM_KEYUP, sent|wparam|lparam, VK_MENU, 0xc0000001 },
+    { WM_KEYUP, wparam|lparam, VK_CONTROL, 0xc0000001 },
+    { WM_KEYUP, sent|wparam|lparam, VK_CONTROL, 0xc0000001 },
+    { 0 }
+};
 static const struct message WmAltPressRelease[] = {
     { WM_SYSKEYDOWN, wparam|lparam, VK_MENU, 0x20000001 },
     { WM_SYSKEYDOWN, sent|wparam|lparam, VK_MENU, 0x20000001 },
@@ -4172,7 +4206,7 @@ static void test_accelerators(void)
     pump_msg_loop(hwnd, hAccel);
     ok_sequence(WmAltVkN, "Alt+VK_N press/release", FALSE);
 
-    trace("testing Ctrl+Alt+VK_N press/release\n");
+    trace("testing Ctrl+Alt+VK_N press/release 1\n");
     flush_sequence();
     keybd_event(VK_CONTROL, 0, 0, 0);
     keybd_event(VK_MENU, 0, 0, 0);
@@ -4223,7 +4257,7 @@ static void test_accelerators(void)
     pump_msg_loop(hwnd, hAccel);
     ok_sequence(WmAltVkN_2, "Alt+VK_N press/release 2", FALSE);
 
-    trace("testing Ctrl+Alt+VK_N press/release\n");
+    trace("testing Ctrl+Alt+VK_N press/release 2\n");
     flush_sequence();
     keybd_event(VK_CONTROL, 0, 0, 0);
     keybd_event(VK_MENU, 0, 0, 0);
@@ -4234,6 +4268,30 @@ static void test_accelerators(void)
     pump_msg_loop(hwnd, hAccel);
     ok_sequence(WmCtrlAltVkN, "Ctrl+Alt+VK_N press/release 2", FALSE);
 
+    trace("testing Ctrl+Shift+VK_N press/release\n");
+    flush_sequence();
+    keybd_event(VK_CONTROL, 0, 0, 0);
+    keybd_event(VK_SHIFT, 0, 0, 0);
+    keybd_event('N', 0, 0, 0);
+    keybd_event('N', 0, KEYEVENTF_KEYUP, 0);
+    keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
+    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
+    pump_msg_loop(hwnd, hAccel);
+    ok_sequence(WmCtrlShiftVkN, "Ctrl+Shift+VK_N press/release", FALSE);
+
+    trace("testing Ctrl+Alt+Shift+VK_N press/release\n");
+    flush_sequence();
+    keybd_event(VK_CONTROL, 0, 0, 0);
+    keybd_event(VK_MENU, 0, 0, 0);
+    keybd_event(VK_SHIFT, 0, 0, 0);
+    keybd_event('N', 0, 0, 0);
+    keybd_event('N', 0, KEYEVENTF_KEYUP, 0);
+    keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
+    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
+    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
+    pump_msg_loop(hwnd, hAccel);
+    ok_sequence(WmCtrlAltShiftVkN, "Ctrl+Alt+Shift+VK_N press/release", FALSE);
+
     ret = DestroyAcceleratorTable(hAccel);
     ok( ret, "DestroyAcceleratorTable error %ld\n", GetLastError());
 
@@ -5333,8 +5391,10 @@ static void test_scrollwindowex(void)
 static const struct message destroy_window_with_children[] = {
     { HCBT_DESTROYWND, hook|lparam, 0, WND_PARENT_ID }, /* parent */
     { HCBT_DESTROYWND, hook|lparam, 0, WND_POPUP_ID }, /* popup */
+    { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, /* popup */
     { WM_DESTROY, sent|wparam|lparam, 0, WND_POPUP_ID }, /* popup */
     { WM_NCDESTROY, sent|wparam|lparam, 0, WND_POPUP_ID }, /* popup */
+    { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, /* parent */
     { WM_DESTROY, sent|wparam|lparam, 0, WND_PARENT_ID }, /* parent */
     { WM_DESTROY, sent|wparam|lparam, 0, WND_CHILD_ID + 2 }, /* child2 */
     { WM_DESTROY, sent|wparam|lparam, 0, WND_CHILD_ID + 1 }, /* child1 */
diff -up cvs/hq/wine/dlls/user/tests/resource.rc wine/dlls/user/tests/resource.rc
--- cvs/hq/wine/dlls/user/tests/resource.rc	2005-01-02 15:17:20.000000000 +0800
+++ wine/dlls/user/tests/resource.rc	2005-02-20 19:51:22.000000000 +0800
@@ -33,6 +33,8 @@
   78, 1001, ASCII /* 'N' */
   110, 1002, ASCII /* 'n' */
   78, 1003, VIRTKEY, ALT /* Alt+'N' */
+  78, 1004, VIRTKEY, CONTROL, SHIFT /* Ctrl+Shift+'N' */
+  78, 1005, VIRTKEY, CONTROL, ALT, SHIFT /* Ctrl+Alt+Shift+'N' */
 }
 
 STRINGTABLE






More information about the wine-patches mailing list