WKCACFViewWindow.cpp [plain text]
#include "config.h"
#include "WKCACFViewWindow.h"
#if HAVE(WKQCA)
#include <WebCore/WebCoreInstanceHandle.h>
#include <WebKitQuartzCoreAdditions/WKCACFView.h>
using namespace WebCore;
namespace WebKit {
static LPCWSTR windowClassName = L"WKCACFViewWindowClass";
WKCACFViewWindow::WKCACFViewWindow(WKCACFViewRef view, HWND parentWindow, DWORD additionalStyles)
: m_window(0)
, m_view(view)
, m_deletesSelfWhenWindowDestroyed(false)
{
ASSERT_ARG(view, view);
registerClass();
UINT style = WS_CLIPCHILDREN | WS_CLIPSIBLINGS | additionalStyles;
if (parentWindow)
style |= WS_CHILD;
else
style |= WS_POPUP;
m_window = ::CreateWindowExW(0, windowClassName, L"WKCACFViewWindow", style, 0, 0, 0, 0, parentWindow, 0, instanceHandle(), this);
ASSERT_WITH_MESSAGE(m_window, "::CreateWindowExW failed with error %lu", ::GetLastError());
}
WKCACFViewWindow::~WKCACFViewWindow()
{
if (!m_window)
return;
ASSERT(!m_deletesSelfWhenWindowDestroyed);
::DestroyWindow(m_window);
}
LRESULT WKCACFViewWindow::onCustomDestroy(WPARAM, LPARAM)
{
::DestroyWindow(m_window);
return 0;
}
LRESULT WKCACFViewWindow::onDestroy(WPARAM, LPARAM)
{
WKCACFViewUpdate(m_view.get(), 0, 0);
return 0;
}
LRESULT WKCACFViewWindow::onEraseBackground(WPARAM, LPARAM)
{
return 1;
}
LRESULT WKCACFViewWindow::onNCDestroy(WPARAM, LPARAM)
{
m_window = 0;
if (!m_deletesSelfWhenWindowDestroyed)
return 0;
delete this;
return 0;
}
LRESULT WKCACFViewWindow::onPaint(WPARAM, LPARAM)
{
WKCACFViewDraw(m_view.get());
::ValidateRect(m_window, 0);
return 0;
}
LRESULT WKCACFViewWindow::onPrintClient(WPARAM wParam, LPARAM lParam)
{
if (!(lParam & PRF_CLIENT))
return 0;
WKCACFViewDrawIntoDC(m_view.get(), reinterpret_cast<HDC>(wParam));
return 0;
}
void WKCACFViewWindow::registerClass()
{
static bool didRegister;
if (didRegister)
return;
didRegister = true;
WNDCLASSW wndClass = {0};
wndClass.lpfnWndProc = staticWndProc;
wndClass.hInstance = instanceHandle();
wndClass.lpszClassName = windowClassName;
::RegisterClassW(&wndClass);
}
LRESULT WKCACFViewWindow::staticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
WKCACFViewWindow* window = reinterpret_cast<WKCACFViewWindow*>(::GetWindowLongPtr(hWnd, GWLP_USERDATA));
if (!window) {
if (message != WM_CREATE)
return ::DefWindowProcW(hWnd, message, wParam, lParam);
CREATESTRUCT* createStruct = reinterpret_cast<CREATESTRUCT*>(lParam);
window = static_cast<WKCACFViewWindow*>(createStruct->lpCreateParams);
::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(window));
}
return window->wndProc(message, wParam, lParam);
}
LRESULT WKCACFViewWindow::wndProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case customDestroyMessage:
return onCustomDestroy(wParam, lParam);
case WM_DESTROY:
return onDestroy(wParam, lParam);
case WM_ERASEBKGND:
return onEraseBackground(wParam, lParam);
case WM_NCDESTROY:
return onNCDestroy(wParam, lParam);
case WM_PAINT:
return onPaint(wParam, lParam);
case WM_PRINTCLIENT:
return onPrintClient(wParam, lParam);
default:
return ::DefWindowProcW(m_window, message, wParam, lParam);
}
}
}
#endif // USE(ACCELERATED_COMPOSITING)