Fix ALT+key combos so that they go into the DOM.
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Sep 2007 23:02:38 +0000 (23:02 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Sep 2007 23:02:38 +0000 (23:02 +0000)
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@25377 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/win/ChangeLog
WebKit/win/WebView.cpp
WebKit/win/WebView.h

index 9bd4e15da117718794df317a8fd0cfd18caeb0fb..4892e537773a50af871c68ed77b2c3876525b9d8 100644 (file)
@@ -1,3 +1,16 @@
+2007-09-05  Dave Hyatt <hyatt@apple.com>
+
+        Make sure ALT+other keys is properly sent into the DOM so that Web pages (and editing fields) can
+        detect key combos like ALT+Enter.
+       
+        Reviewed by Steve
+
+        * WebView.cpp:
+        (WebView::keyUp):
+        (WebView::keyDown):
+        (WebViewWndProc):
+        * WebView.h:
+
 2007-09-04  Sam Weinig  <sam@webkit.org>
 
         Build fix.
index 292018a1f6abd0a01ee98e1f93c4a7a98a82b993..7bcfb13985d144a82752b0dd4ee79bc229b70a11 100644 (file)
@@ -870,12 +870,16 @@ bool WebView::execCommand(WPARAM wParam, LPARAM /*lParam*/)
 
 bool WebView::keyUp(WPARAM virtualKeyCode, LPARAM keyData)
 {
-    // Don't send key events for shift, ctrl, and capslock keys when they're by themselves
-    if (virtualKeyCode == VK_SHIFT || virtualKeyCode == VK_CONTROL || virtualKeyCode == VK_CAPITAL) {
+    // Don't send key events for shift, ctrl, alt and capslock keys when they're by themselves
+    if (virtualKeyCode == VK_SHIFT || virtualKeyCode == VK_CONTROL || virtualKeyCode == VK_MENU || virtualKeyCode == VK_CAPITAL)
         return false;
-    }
 
     PlatformKeyboardEvent keyEvent(m_viewWindow, virtualKeyCode, keyData, m_currentCharacterCode);
+
+    // Don't send key events for alt+space.
+    if (keyEvent.altKey() && virtualKeyCode == VK_SPACE)
+        return false;
+
     Frame* frame = m_page->focusController()->focusedOrMainFrame();
     m_currentCharacterCode = 0;
 
@@ -999,21 +1003,28 @@ bool WebView::handleEditingKeyboardEvent(KeyboardEvent* evt)
     return frame->editor()->insertText(evt->keyEvent()->text(), evt);
 }
 
-bool WebView::keyDown(WPARAM virtualKeyCode, LPARAM keyData)
+bool WebView::keyDown(WPARAM virtualKeyCode, LPARAM keyData, bool systemKeyDown)
 {
+    // Don't send key events for shift, ctrl, alt and capslock keys when they're by themselves
+    if (virtualKeyCode == VK_SHIFT || virtualKeyCode == VK_CONTROL ||  virtualKeyCode == VK_MENU || virtualKeyCode == VK_CAPITAL)
+        return false;
+
+    // Don't send key events for alt+space, since the OS needs to handle that.
+    if (virtualKeyCode == VK_SPACE && systemKeyDown)
+        return false;
+
     MSG msg;
     // If the next message is a WM_CHAR message, then take it out of the queue, and use
     // the message parameters to get the character code to construct the PlatformKeyboardEvent.
-    if (::PeekMessage(&msg, m_viewWindow, WM_CHAR, WM_CHAR, PM_REMOVE)) 
+    if (systemKeyDown) {
+        if (::PeekMessage(&msg, m_viewWindow, WM_SYSCHAR, WM_SYSCHAR, PM_REMOVE)) 
+            m_currentCharacterCode = (UChar)msg.wParam;
+    } else if (::PeekMessage(&msg, m_viewWindow, WM_CHAR, WM_CHAR, PM_REMOVE)) 
         m_currentCharacterCode = (UChar)msg.wParam;
 
     // FIXME: We need to check WM_UNICHAR to support supplementary characters.
     // FIXME: We may need to handle other messages for international text.
 
-    // Don't send key events for shift, ctrl, and capslock keys when they're by themselves
-    if (virtualKeyCode == VK_SHIFT || virtualKeyCode == VK_CONTROL || virtualKeyCode == VK_CAPITAL)
-        return false;
-
     m_inIMEKeyDown = virtualKeyCode == VK_PROCESSKEY;
     if (virtualKeyCode == VK_PROCESSKEY && !m_inIMEComposition)
         virtualKeyCode = MapVirtualKey(LOBYTE(HIWORD(keyData)), 1);
@@ -1202,9 +1213,13 @@ static LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, L
                 if (coreFrame->view()->didFirstLayout())
                     handled = webView->mouseWheel(wParam, lParam, (wParam & MK_SHIFT) || message == WM_VISTA_MOUSEHWHEEL);
             break;
+        case WM_SYSKEYDOWN:
+            handled = webView->keyDown(wParam, lParam, true);
+            break;
         case WM_KEYDOWN:
             handled = webView->keyDown(wParam, lParam);
             break;
+        case WM_SYSKEYUP:
         case WM_KEYUP:
             handled = webView->keyUp(wParam, lParam);
             break;
index 14c68bbe90434fc014bbcaabc9f5820554e3d241..9a2938e8f7d76cd4a5e5229074b386ee5da680af 100644 (file)
@@ -622,7 +622,7 @@ public:
     void performContextMenuAction(WPARAM, LPARAM);
     bool mouseWheel(WPARAM, LPARAM, bool isHorizontal);
     bool execCommand(WPARAM wParam, LPARAM lParam);
-    bool keyDown(WPARAM, LPARAM);
+    bool keyDown(WPARAM, LPARAM, bool systemKeyDown = false);
     bool keyUp(WPARAM, LPARAM);
     HRESULT updateWebCoreSettingsFromPreferences(IWebPreferences* preferences);
     bool inResizer(LPARAM lParam);