1f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch/* 2f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple, Inc. All rights reserved. 3f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com> 4f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 5f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Redistribution and use in source and binary forms, with or without 6f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * modification, are permitted provided that the following conditions 7f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * are met: 8f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 1. Redistributions of source code must retain the above copyright 9f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * notice, this list of conditions and the following disclaimer. 10f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright 11f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * notice, this list of conditions and the following disclaimer in the 12f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * documentation and/or other materials provided with the distribution. 13f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 14f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 15f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 18f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch */ 25f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 26f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "config.h" 27f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "WebView.h" 28f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 29f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "ChromeClientWinCE.h" 30f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "ContextMenuClientWinCE.h" 31f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "DragClientWinCE.h" 32f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "EditorClientWinCE.h" 33f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "FocusController.h" 34f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "Frame.h" 35f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "FrameLoader.h" 36f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "FrameLoaderClientWinCE.h" 37f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "FrameView.h" 38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "GraphicsContext.h" 39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "InitializeThreading.h" 40f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "InspectorClientWinCE.h" 41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "IntSize.h" 42f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "MainThread.h" 43f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "NotImplemented.h" 44f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "Page.h" 45f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "PlatformKeyboardEvent.h" 46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "PlatformMouseEvent.h" 47f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "PlatformStrategiesWinCE.h" 48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "PlatformWheelEvent.h" 49f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "ResourceRequest.h" 50f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "Settings.h" 51f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "SharedBuffer.h" 52f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "WebCoreInstanceHandle.h" 53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochusing namespace WebCore; 55f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochconst LPCWSTR kWebViewWindowClassName = L"WebViewWindowClass"; 57f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 58f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 59f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochLRESULT CALLBACK WebView::webViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 60f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 61f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (WebView* webView = reinterpret_cast<WebView*>(GetWindowLong(hWnd, 0))) 62f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return webView->wndProc(hWnd, message, wParam, lParam); 63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return DefWindowProc(hWnd, message, wParam, lParam); 65f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 66f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 67f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPassRefPtr<SharedBuffer> loadResourceIntoBuffer(const char* name) 68f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch notImplemented(); 70f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return 0; 71f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 72f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 73f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 74f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochWebView::WebView(HWND hwnd, unsigned features) 75f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch : m_frame(0) 76f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch , m_page(0) 77f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch , m_parentWindowHandle(hwnd) 78f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch , m_enableDoubleBuffer(features & EnableDoubleBuffering) 79f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RECT rcClient; 81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch GetClientRect(hwnd, &rcClient); 82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_windowHandle = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD, 84f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, hwnd, 0, WebCore::instanceHandle(), 0); 85f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 86f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch SetWindowLong(m_windowHandle, 0, reinterpret_cast<LONG>(this)); 87f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch MoveWindow(m_windowHandle, 0, 0, rcClient.right, rcClient.bottom, TRUE); 89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ShowWindow(m_windowHandle, SW_SHOW); 90f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 91f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Page::PageClients pageClients; 92f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch pageClients.chromeClient = new WebKit::ChromeClientWinCE(this); 93f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch pageClients.contextMenuClient = new WebKit::ContextMenuClientWinCE(this); 94f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch pageClients.editorClient = new WebKit::EditorClientWinCE(this); 95f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch pageClients.dragClient = new WebKit::DragClientWinCE(); 96f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch pageClients.inspectorClient = new WebKit::InspectorClientWinCE(this); 97f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_page = new Page(pageClients); 98f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 99f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Settings* settings = m_page->settings(); 100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch settings->setDefaultFixedFontSize(14); 101f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch settings->setDefaultFontSize(14); 102f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch settings->setMinimumFontSize(8); 103f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch settings->setMinimumLogicalFontSize(8); 104f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch settings->setJavaScriptEnabled(true); 105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch settings->setLoadsImagesAutomatically(true); 106f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 107f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch WebKit::FrameLoaderClientWinCE* loaderClient = new WebKit::FrameLoaderClientWinCE(this); 108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RefPtr<Frame> frame = Frame::create(m_page, 0, loaderClient); 109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_frame = frame.get(); 110f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch loaderClient->setFrame(m_frame); 111f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 112f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_page->mainFrame()->init(); 113f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (view()) { 115f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RECT windowRect; 116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frameRect(&windowRect); 117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch view()->resize(IntRect(windowRect).size()); 118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 120f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 121f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochWebView::~WebView() 122f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 123f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch delete m_page; 124f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch DestroyWindow(m_windowHandle); 125f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 126f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 127f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::initialize(HINSTANCE instanceHandle) 128f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 129f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch JSC::initializeThreading(); 130f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch WTF::initializeMainThread(); 131f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformStrategiesWinCE::initialize(); 132f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 133f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch WebCore::setInstanceHandle(instanceHandle); 134f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 135f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch WNDCLASS wc; 136f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.style = CS_DBLCLKS; 137f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.lpfnWndProc = WebView::webViewWndProc; 138f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.cbClsExtra = 0; 139f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.cbWndExtra = sizeof(void *); 140f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.hInstance = instanceHandle; 141f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.hIcon = 0; 142f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.hCursor = LoadCursor(0, IDC_ARROW); 143f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.hbrBackground = 0; 144f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.lpszMenuName = 0; 145f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch wc.lpszClassName = kWebViewWindowClassName; 146f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 147f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RegisterClass(&wc); 148f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 149f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::cleanup() 151f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 152f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch UnregisterClass(kWebViewWindowClassName, WebCore::instanceHandle()); 153f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 154f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 155f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPassRefPtr<Frame> WebView::createFrame(const KURL& url, const String& name, HTMLFrameOwnerElement* ownerElement, const String& referrer, 156f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool /*allowsScrolling*/, int /*marginWidth*/, int /*marginHeight*/) 157f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 158f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Frame* coreFrame = m_frame; 159f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 160f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch WebKit::FrameLoaderClientWinCE *loaderClient = new WebKit::FrameLoaderClientWinCE(this); 161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RefPtr<Frame> childFrame = Frame::create(m_page, ownerElement, loaderClient); 162f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch loaderClient->setFrame(childFrame.get()); 163f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 164f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch coreFrame->tree()->appendChild(childFrame); 165f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->tree()->setName(name); 166f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->init(); 167f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 168f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // The creation of the frame may have run arbitrary JavaScript that removed it from the page already. 169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!childFrame->page()) 170f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return 0; 171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block coreFrame->loader()->loadURLIntoChildFrame(url, referrer, childFrame.get()); 173f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 174f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // The frame's onload handler may have removed it from the document. 175f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!childFrame->tree()->parent()) 176f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return 0; 177f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 178f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return childFrame.release(); 179f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 180f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 181f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::runJavaScriptAlert(const String& message) 182f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 183f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch notImplemented(); 184f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 185f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 186f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::runJavaScriptConfirm(const String& message) 187f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 188f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch notImplemented(); 189f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return false; 190f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 191f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 192f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::runJavaScriptPrompt(const String& message, const String& defaultValue, String& result) 193f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 194f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch notImplemented(); 195f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return false; 196f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 197f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 198f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::frameRect(RECT* rect) const 199f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 200f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch GetWindowRect(m_windowHandle, rect); 201f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 202f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 203f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochFrameView* WebView::view() const 204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 205f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return m_frame ? m_frame->view() : 0; 206f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 207f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 208f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::load(LPCWSTR url) 209f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 210f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch load(String(url)); 211f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 212f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 213f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::load(const String &url) 214f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 215f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch load(WebCore::ResourceRequest(url)); 216f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 217f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 218f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::load(const WebCore::ResourceRequest &request) 219f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 220f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frame()->loader()->load(request, false); 221f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 222f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 223f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::reload() 224f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 225f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frame()->loader()->reload(); 226f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 227f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 228f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::stop() 229f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 230f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frame()->loader()->stopAllLoaders(); 231f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 232f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 233f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::paint(HDC hDC, const IntRect& clipRect) 234f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 2352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block FrameView* frameView = view(); 2362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!frameView) 2372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block OwnPtr<HRGN> clipRgn(CreateRectRgn(clipRect.x(), clipRect.y(), clipRect.maxX(), clipRect.maxY())); 240f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch SelectClipRgn(hDC, clipRgn.get()); 241f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 2422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block frameView->updateLayoutAndStyleIfNeededRecursive(); 2432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 244f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch GraphicsContext gc(hDC); 2452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block frameView->paint(&gc, clipRect); 246f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 248f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handlePaint(HWND hWnd) 249f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 250f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RECT updateRect; 251f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!GetUpdateRect(hWnd, &updateRect, false)) 252f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return false; 253f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 254f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PAINTSTRUCT ps; 255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch HDC hDC = BeginPaint(m_windowHandle, &ps); 256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 257f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch IntRect clipRect(updateRect); 258f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 259f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_enableDoubleBuffer) { 260f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!m_doubleBufferDC) { 261f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RECT rcClient; 262f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch GetClientRect(m_windowHandle, &rcClient); 263f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 264f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_doubleBufferDC = adoptPtr(CreateCompatibleDC(hDC)); 265f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_doubleBufferBitmap = adoptPtr(CreateCompatibleBitmap(hDC, rcClient.right, rcClient.bottom)); 266f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch SelectObject(m_doubleBufferDC.get(), m_doubleBufferBitmap.get()); 267f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 268f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 269f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch paint(m_doubleBufferDC.get(), clipRect); 270f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch BitBlt(hDC, clipRect.x(), clipRect.y(), clipRect.width(), clipRect.height(), m_doubleBufferDC.get(), clipRect.x(), clipRect.y(), SRCCOPY); 272f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else 273f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch paint(hDC, clipRect); 274f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 275f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch EndPaint(m_windowHandle, &ps); 276f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return true; 277f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 278f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 279f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleMouseEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 280f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 281f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch static LONG globalClickCount; 282f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch static IntPoint globalPrevPoint; 283f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch static MouseButton globalPrevButton; 284f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch static LONG globalPrevMouseDownTime; 285f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 286f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Create our event. 287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // On WM_MOUSELEAVE we need to create a mouseout event, so we force the position 288f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // of the event to be at (MINSHORT, MINSHORT). 289f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformMouseEvent mouseEvent(hWnd, message, wParam, lParam); 290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 291f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool insideThreshold = abs(globalPrevPoint.x() - mouseEvent.pos().x()) < ::GetSystemMetrics(SM_CXDOUBLECLK) 292f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch && abs(globalPrevPoint.y() - mouseEvent.pos().y()) < ::GetSystemMetrics(SM_CYDOUBLECLK); 293f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch LONG messageTime = 0; 294f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 295f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool handled = false; 296f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (message == WM_LBUTTONDOWN || message == WM_MBUTTONDOWN || message == WM_RBUTTONDOWN) { 297f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // FIXME: I'm not sure if this is the "right" way to do this 298f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // but without this call, we never become focused since we don't allow 299f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // the default handling of mouse events. 300f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch SetFocus(m_windowHandle); 301f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 302f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformMouseEvent moveEvent(hWnd, WM_MOUSEMOVE, 0, lParam, false); 303f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch moveEvent.setClickCount(0); 304f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_page->mainFrame()->eventHandler()->handleMouseMoveEvent(moveEvent); 305f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 306f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Always start capturing events when the mouse goes down in our HWND. 307f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch SetCapture(m_windowHandle); 308f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 309f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (insideThreshold && mouseEvent.button() == globalPrevButton) 310f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch globalClickCount++; 311f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch else 312f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Reset the click count. 313f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch globalClickCount = 1; 314f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch globalPrevMouseDownTime = messageTime; 315f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch globalPrevButton = mouseEvent.button(); 316f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch globalPrevPoint = mouseEvent.pos(); 317f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 318f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch mouseEvent.setClickCount(globalClickCount); 319f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = m_page->mainFrame()->eventHandler()->handleMousePressEvent(mouseEvent); 320f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else if (message == WM_LBUTTONDBLCLK || message == WM_MBUTTONDBLCLK || message == WM_RBUTTONDBLCLK) { 321f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch globalClickCount++; 322f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch mouseEvent.setClickCount(globalClickCount); 323f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = m_page->mainFrame()->eventHandler()->handleMousePressEvent(mouseEvent); 324f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else if (message == WM_LBUTTONUP || message == WM_MBUTTONUP || message == WM_RBUTTONUP) { 325f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Record the global position and the button of the up. 326f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch globalPrevButton = mouseEvent.button(); 327f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch globalPrevPoint = mouseEvent.pos(); 328f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch mouseEvent.setClickCount(globalClickCount); 329f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_page->mainFrame()->eventHandler()->handleMouseReleaseEvent(mouseEvent); 330f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ReleaseCapture(); 331f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else if (message == WM_MOUSEMOVE) { 332f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!insideThreshold) 333f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch globalClickCount = 0; 334f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch mouseEvent.setClickCount(globalClickCount); 335f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = m_page->mainFrame()->eventHandler()->mouseMoved(mouseEvent); 336f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 337f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 338f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return handled; 339f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 340f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 341f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam, bool isHorizontal) 342f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 343f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformWheelEvent wheelEvent(hWnd, wParam, lParam, isHorizontal); 344f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return frame()->eventHandler()->handleWheelEvent(wheelEvent); 345f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 346f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 347f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleKeyDown(WPARAM virtualKeyCode, LPARAM keyData, bool systemKeyDown) 348f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 349f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 350f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 351f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformKeyboardEvent keyEvent(m_windowHandle, virtualKeyCode, keyData, PlatformKeyboardEvent::RawKeyDown, systemKeyDown); 352f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool handled = frame->eventHandler()->keyEvent(keyEvent); 353f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 354f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // These events cannot be canceled, and we have no default handling for them. 355f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // FIXME: match IE list more closely, see <http://msdn2.microsoft.com/en-us/library/ms536938.aspx>. 356f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (systemKeyDown && virtualKeyCode != VK_RETURN) 357f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return false; 358f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 359f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (handled) { 360f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch MSG msg; 361f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!systemKeyDown) 362f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ::PeekMessage(&msg, m_windowHandle, WM_CHAR, WM_CHAR, PM_REMOVE); 363f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return true; 364f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 365f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 366f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return handled; 367f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 368f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 369f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleKeyPress(WPARAM charCode, LPARAM keyData, bool systemKeyDown) 370f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 371f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 372f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 373f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformKeyboardEvent keyEvent(m_windowHandle, charCode, keyData, PlatformKeyboardEvent::Char, systemKeyDown); 374f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // IE does not dispatch keypress event for WM_SYSCHAR. 375f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (systemKeyDown) 376f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return frame->eventHandler()->handleAccessKey(keyEvent); 377f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frame->eventHandler()->keyEvent(keyEvent)) 378f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return true; 379f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 380f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return false; 381f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 382f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 383f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleKeyUp(WPARAM virtualKeyCode, LPARAM keyData, bool systemKeyDown) 384f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 385f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformKeyboardEvent keyEvent(m_windowHandle, virtualKeyCode, keyData, PlatformKeyboardEvent::KeyUp, systemKeyDown); 386f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 387f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 388f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return frame->eventHandler()->keyEvent(keyEvent); 389f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 390f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 391f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochLRESULT WebView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 392f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 393f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool handled = false; 394f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 395f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (view()) { 396f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch switch (message) { 397f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_PAINT: 398f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = handlePaint(hWnd); 399f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 400f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 401f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_MOUSEMOVE: 402f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_LBUTTONDOWN: 403f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_MBUTTONDOWN: 404f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_RBUTTONDOWN: 405f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_LBUTTONDBLCLK: 406f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_MBUTTONDBLCLK: 407f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_RBUTTONDBLCLK: 408f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_LBUTTONUP: 409f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_MBUTTONUP: 410f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_RBUTTONUP: 411f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frame()->eventHandler() && view()->didFirstLayout()) 412f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = handleMouseEvent(hWnd, message, wParam, lParam); 413f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 414f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 415f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_MOUSEWHEEL: 416f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frame()->eventHandler() && view()->didFirstLayout()) 417f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = handleMouseWheel(hWnd, wParam, lParam, wParam & MK_SHIFT); 418f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 419f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 420f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_SYSKEYDOWN: 421f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = handleKeyDown(wParam, lParam, true); 422f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 423f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 424f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_KEYDOWN: 425f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = handleKeyDown(wParam, lParam, false); 426f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 427f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 428f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_SYSKEYUP: 429f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = handleKeyUp(wParam, lParam, true); 430f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 432f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_KEYUP: 433f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = handleKeyUp(wParam, lParam, false); 434f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 435f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 436f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_SYSCHAR: 437f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = handleKeyPress(wParam, lParam, true); 438f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 439f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 440f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_CHAR: 441f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = handleKeyPress(wParam, lParam, false); 442f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 443f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 444f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case WM_CLOSE: 445f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PostMessage(m_parentWindowHandle, WM_CLOSE, wParam, lParam); 446f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch handled = true; 447f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 448f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 449f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch default: 450f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 451f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 452f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 453f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 454f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (handled) 455f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return 0; 456f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 457f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return DefWindowProc(hWnd, message, wParam, lParam); 458f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 459