+2006-03-10 Eric Seidel <eseidel@apple.com>
+
+ Reviewed by hyatt.
+
+ Add scrolling support into Spinneret.
+
+ * Spinneret/Spinneret/WebFrame.cpp:
+ (WebKit::WebFrame::paint):
+ * Spinneret/Spinneret/WebView.cpp:
+ (WebKit::WebView::createWebView):
+ (WebKit::calculateScrollDelta):
+ (WebKit::scrollMessageForKey):
+ (WebKit::WebViewWndProc):
+
2006-03-13 Eric Seidel <eseidel@apple.com>
Reviewed by mjs.
cairo_t* context = cairo_create(surface);
GraphicsContext gc(context);
- d->frame->paint(&gc, ps.rcPaint);
+ IntRect documentDirtyRect = ps.rcPaint;
+ documentDirtyRect.move(d->frameView->contentsX(), d->frameView->contentsY());
+
+ // FIXME: We have to set the transform using both cairo and GDI until we use cairo for text.
+ HDC surfaceDC = cairo_win32_surface_get_dc(surface);
+ SaveDC(surfaceDC);
+ OffsetViewportOrgEx(surfaceDC, -d->frameView->contentsX(), -d->frameView->contentsY(), 0);
+ cairo_translate(context, -d->frameView->contentsX(), -d->frameView->contentsY());
+ d->frame->paint(&gc, documentDirtyRect);
+ RestoreDC(surfaceDC, -1);
cairo_destroy(context);
context = cairo_create(finalSurface);
registerWebViewWithInstance(hInstance);
- HWND hWnd = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD,
+ HWND hWnd = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD | WS_HSCROLL | WS_VSCROLL,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, parent, 0, hInstance, 0);
if (!hWnd)
d->mainFrame->viewImpl()->viewportMouseReleaseEvent(&mouseEvent);
}
+#define LINE_SCROLL_SIZE 30
+
+static int calculateScrollDelta(WPARAM wParam, int oldPosition, int pageSize)
+{
+ switch (LOWORD(wParam)) {
+ case SB_PAGEUP:
+ return -(pageSize - LINE_SCROLL_SIZE);
+ case SB_PAGEDOWN:
+ return (pageSize - LINE_SCROLL_SIZE);
+ case SB_LINEUP:
+ return -LINE_SCROLL_SIZE;
+ case SB_LINEDOWN:
+ return LINE_SCROLL_SIZE;
+ case SB_THUMBPOSITION:
+ return HIWORD(wParam) - oldPosition;
+ }
+ return 0;
+}
+
+static int scrollMessageForKey(WPARAM keyCode)
+{
+ switch (keyCode) {
+ case VK_UP:
+ return SB_LINEUP;
+ case VK_PRIOR:
+ return SB_PAGEUP;
+ case VK_NEXT:
+ return SB_PAGEDOWN;
+ case VK_DOWN:
+ return SB_LINEDOWN;
+ case VK_HOME:
+ return SB_TOP;
+ case VK_END:
+ return SB_BOTTOM;
+ }
+ return -1;
+}
+
LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
case WM_RBUTTONDBLCLK:
webview->mouseDoubleClick(hWnd, wParam, lParam);
break;
- case WM_SIZE:
- // FIXME: not sure if we need anything here...
+ case WM_HSCROLL: {
+ ScrollView* view = webview->mainFrame()->impl()->view();
+ view->scrollBy(calculateScrollDelta(wParam, view->contentsX(), view->visibleWidth()), 0);
+ break;
+ }
+ case WM_VSCROLL: {
+ ScrollView* view = webview->mainFrame()->impl()->view();
+ view->scrollBy(0, calculateScrollDelta(wParam, view->contentsY(), view->visibleHeight()));
+ break;
+ }
+ case WM_KEYDOWN: {
+ WORD wScrollNotify = scrollMessageForKey(wParam);
+ if (wScrollNotify != -1)
+ SendMessage(hWnd, WM_VSCROLL, MAKELONG(wScrollNotify, 0), 0L);
+ break;
+ }
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}