diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 04f8801..42d290d 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,5 +1,40 @@
 2006-06-30  Mike Emmel  <mike.emmel@gmail.com>
 
+        Reviewed and worked over a lot by Darin.
+
+        - check in first set of GDK-specific sources
+
+        * platform/gdk/BrowserExtensionGdk.h: Added.
+        * platform/gdk/CookieJarGdk.cpp: Added.
+        * platform/gdk/CursorGdk.cpp: Added.
+        * platform/gdk/FontCacheGdk.cpp: Added.
+        * platform/gdk/FontDataGdk.cpp: Added.
+        * platform/gdk/FontGdk.cpp: Added.
+        * platform/gdk/FontPlatformData.h: Added.
+        * platform/gdk/FontPlatformDataGdk.cpp: Added.
+        * platform/gdk/FrameGdk.cpp: Added.
+        * platform/gdk/FrameGdk.h: Added.
+        * platform/gdk/GlyphMapGdk.cpp: Added.
+        * platform/gdk/KeyEventGdk.cpp: Added.
+        * platform/gdk/KeyboardCodes.h: Added.
+        * platform/gdk/MouseEventGdk.cpp: Added.
+        * platform/gdk/PageGdk.cpp: Added.
+        * platform/gdk/RenderThemeGdk.cpp: Added.
+        * platform/gdk/RenderThemeGdk.h: Added.
+        * platform/gdk/ScreenGdk.cpp: Added.
+        * platform/gdk/ScrollViewGdk.cpp: Added.
+        * platform/gdk/SharedTimerLinux.cpp: Added.
+        * platform/gdk/SystemTimeLinux.cpp: Added.
+        * platform/gdk/TemporaryLinkStubs.cpp: Added.
+        * platform/gdk/TransferJobCurl.cpp: Added.
+        * platform/gdk/TransferJobManager.cpp: Added.
+        * platform/gdk/TransferJobManager.h: Added.
+        * platform/gdk/WheelEventGdk.cpp: Added.
+        * platform/gdk/WidgetGdk.cpp: Added.
+        * platform/gdk/gdk-encodings.txt: Added.
+
+2006-06-30  Mike Emmel  <mike.emmel@gmail.com>
+
         Reviewed by Darin.
 
         * WebCoreSources.bkl: Updated for recent file changes.
diff --git a/WebCore/platform/gdk/BrowserExtensionGdk.h b/WebCore/platform/gdk/BrowserExtensionGdk.h
new file mode 100644
index 0000000..6fc58cc
--- /dev/null
+++ b/WebCore/platform/gdk/BrowserExtensionGdk.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef BrowserExtensionGdk_H_
+#define BrowserExtensionGdk_H_
+
+#include "BrowserExtension.h"
+
+namespace WebCore {
+
+class Frame;
+class FrameGdk;
+
+class BrowserExtensionGdk : public BrowserExtension {
+public:
+    BrowserExtensionGdk(Frame*);
+
+    virtual void createNewWindow(const ResourceRequest&);
+    virtual void createNewWindow(const ResourceRequest&, const WindowArgs&, Frame*&);
+
+    virtual void setIconURL(const KURL&);
+    virtual void setTypedIconURL(const KURL&, const String& type);
+
+    virtual int getHistoryLength();
+    virtual void goBackOrForward(int distance);
+    virtual KURL historyURL(int distance);
+
+    virtual bool canRunModal();
+    virtual bool canRunModalNow();
+    virtual void runModal();
+
+private:
+    FrameGdk* m_frame;
+};
+
+}
+
+#endif
diff --git a/WebCore/platform/gdk/CookieJarGdk.cpp b/WebCore/platform/gdk/CookieJarGdk.cpp
new file mode 100644
index 0000000..6701507
--- /dev/null
+++ b/WebCore/platform/gdk/CookieJarGdk.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "CookieJar.h"
+
+#include "DeprecatedString.h"
+#include "KURL.h"
+#include "PlatformString.h"
+#include "StringHash.h"
+#include <wtf/HashMap.h>
+
+namespace WebCore {
+
+static HashMap<String, String> cookieJar;
+
+void setCookies(const KURL& url, const KURL& /*policyURL*/, const String& value)
+{
+    cookieJar.set(url.url(), value);
+}
+
+String cookies(const KURL& url)
+{
+    return cookieJar.get(url.url());
+}
+
+bool cookiesEnabled()
+{
+    return true;
+}
+
+}
diff --git a/WebCore/platform/gdk/CursorGdk.cpp b/WebCore/platform/gdk/CursorGdk.cpp
new file mode 100644
index 0000000..d463ab6
--- /dev/null
+++ b/WebCore/platform/gdk/CursorGdk.cpp
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "Cursor.h"
+
+#include "DeprecatedString.h"
+#include <gdk/gdk.h>
+#include <wtf/Assertions.h>
+
+namespace WebCore {
+
+Cursor::Cursor(const Cursor& other)
+    : m_impl(other.m_impl)
+{
+    if (m_impl)
+        gdk_cursor_ref(m_impl);
+}
+
+Cursor::~Cursor()
+{
+    if (m_impl)
+        gdk_cursor_unref(m_impl);
+}
+
+Cursor& Cursor::operator=(const Cursor& other)
+{
+    gdk_cursor_ref(other.m_impl);
+    gdk_cursor_unref(m_impl);
+    m_impl = other.m_impl;
+    return *this;
+}
+
+Cursor::Cursor(GdkCursor* c)
+    : m_impl(c)
+{
+    m_impl = c;
+    ASSERT(c);
+    gdk_cursor_ref(c);
+}
+
+const Cursor& crossCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_CROSS);
+    return c;
+}
+
+const Cursor& handCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_HAND2);
+    return c;
+}
+
+const Cursor& iBeamCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_XTERM);
+    return c;
+}
+
+const Cursor& waitCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_WATCH);
+    return c;
+}
+
+const Cursor& helpCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_QUESTION_ARROW);
+    return c;
+}
+
+const Cursor& eastResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_RIGHT_SIDE);
+    return c;
+}
+
+const Cursor& northResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_TOP_SIDE);
+    return c;
+}
+
+const Cursor& northEastResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_TOP_RIGHT_CORNER);
+    return c;
+}
+
+const Cursor& northWestResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_TOP_LEFT_CORNER);
+    return c;
+}
+
+const Cursor& southResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_BOTTOM_SIDE);
+    return c;
+}
+
+const Cursor& southEastResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
+    return c;
+}
+
+const Cursor& southWestResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
+    return c;
+}
+
+const Cursor& westResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_LEFT_SIDE);
+    return c;
+}
+
+const Cursor& northSouthResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_TOP_TEE);
+    return c;
+}
+
+const Cursor& eastWestResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_LEFT_SIDE);
+    return c;
+}
+
+const Cursor& northEastSouthWestResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_SIZING);
+    return c;
+}
+
+const Cursor& northWestSouthEastResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_SIZING);
+    return c;
+}
+
+const Cursor& columnResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_DOUBLE_ARROW);
+    return c;
+}
+
+const Cursor& rowResizeCursor()
+{
+    static Cursor c = gdk_cursor_new(GDK_DOUBLE_ARROW);
+    return c;
+}
+
+}
diff --git a/WebCore/platform/gdk/FontCacheGdk.cpp b/WebCore/platform/gdk/FontCacheGdk.cpp
new file mode 100644
index 0000000..66a438b
--- /dev/null
+++ b/WebCore/platform/gdk/FontCacheGdk.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "FontCache.h"
+
+#include "Font.h"
+#include "FontPlatformData.h"
+
+namespace WebCore {
+
+void FontCache::platformInit()
+{
+    if (!FontPlatformData::init()) {
+        assert(0);
+        fprintf(stderr, "no fonts found exiting\n");
+        exit(-1);
+    }
+}
+
+const FontData* FontCache::getFontDataForCharacters(const Font& font, const UChar* characters, int length)
+{
+
+    FontData* fontData = 0;
+    fontData = new FontData(FontPlatformData(font.fontDescription(), font.family().family()));
+    return fontData;
+}
+
+FontPlatformData* FontCache::getSimilarFontPlatformData(const Font& font)
+{
+    return new FontPlatformData(font.fontDescription(), font.family().family());
+}
+
+FontPlatformData* FontCache::getLastResortFallbackFont(const Font& font)
+{
+    // FIXME: Would be even better to somehow get the user's default font here.
+    // For now we'll pick the default that the user would get without changing any prefs.
+    static AtomicString timesStr("Times New Roman");
+    return getCachedFontPlatformData(font.fontDescription(), timesStr);
+}
+
+FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family)
+{
+    return new FontPlatformData(fontDescription, family);
+}
+
+}
diff --git a/WebCore/platform/gdk/FontDataGdk.cpp b/WebCore/platform/gdk/FontDataGdk.cpp
new file mode 100644
index 0000000..7881ab6
--- /dev/null
+++ b/WebCore/platform/gdk/FontDataGdk.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "FontData.h"
+
+#include "FloatRect.h"
+#include "Font.h"
+#include "FontCache.h"
+#include "FontDescription.h"
+#include "GlyphBuffer.h"
+#include <cairo.h>
+#include <unicode/uchar.h>
+#include <unicode/unorm.h>
+#include <wtf/MathExtras.h>
+
+namespace WebCore {
+
+void FontData::platformInit()
+{
+    cairo_font_extents_t font_extents;
+    cairo_text_extents_t text_extents;
+    cairo_scaled_font_extents(m_font.m_scaledFont, &font_extents);
+    m_ascent = static_cast<int>(font_extents.ascent);
+    m_descent = static_cast<int>(font_extents.descent);
+    m_lineSpacing = static_cast<int>(font_extents.height);
+    cairo_scaled_font_text_extents(m_font.m_scaledFont, "x", &text_extents);
+    m_xHeight = text_extents.height;
+    cairo_scaled_font_text_extents(m_font.m_scaledFont, " ", &text_extents);
+    m_spaceWidth =  static_cast<int>(text_extents.x_advance);
+    assert(m_spaceWidth != 0);
+    m_lineGap = m_lineSpacing - m_ascent - m_descent;
+}
+
+void FontData::platformDestroy()
+{
+    delete m_smallCapsFontData;
+}
+
+FontData* FontData::smallCapsFontData(const FontDescription& fontDescription) const
+{
+    if (!m_smallCapsFontData) {
+        FontDescription desc = FontDescription(fontDescription);
+        desc.setSpecifiedSize(0.70f*fontDescription.computedSize());
+        const FontPlatformData* pdata = new FontPlatformData(desc, desc.family().family());
+        m_smallCapsFontData = new FontData(*pdata);
+    }
+    return m_smallCapsFontData;
+}
+
+bool FontData::containsCharacters(const UChar* characters, int length) const
+{
+    for (unsigned i = 0; i < length; i++)
+        if (getGlyphIndex(characters[i]) == 0)
+            return false;
+    return true;
+}
+
+void FontData::determinePitch()
+{
+    m_treatAsFixedPitch = m_font.isFixedPitch();
+}
+
+float FontData::platformWidthForGlyph(Glyph glyph) const
+{
+    cairo_glyph_t cglyph;
+    cglyph.index = (int)glyph;
+    cairo_text_extents_t extents;
+    cairo_scaled_font_glyph_extents(m_font.m_scaledFont, &cglyph, 1, &extents);
+    float w = extents.x_advance;
+    if (w == 0)
+        w = m_spaceWidth;
+    return w;
+}
+
+void FontData::setFont(cairo_t* cr) const
+{
+    m_font.setFont(cr);
+}
+
+}
diff --git a/WebCore/platform/gdk/FontGdk.cpp b/WebCore/platform/gdk/FontGdk.cpp
new file mode 100644
index 0000000..4a60fe3
--- /dev/null
+++ b/WebCore/platform/gdk/FontGdk.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "Font.h"
+
+#include "FontData.h"
+#include "GraphicsContext.h"
+#include <cairo.h>
+
+namespace WebCore {
+
+void Font::drawGlyphs(GraphicsContext* graphicsContext, const FontData* font, const GlyphBuffer& glyphBuffer,
+                      int from, int numGlyphs, const FloatPoint& point) const
+{
+    cairo_t* context = graphicsContext->platformContext();
+
+    // Set the text color to use for drawing.
+    float red, green, blue, alpha;
+    Color penColor = graphicsContext->pen().color();
+    penColor.getRGBA(red, green, blue, alpha);
+    cairo_set_source_rgba(context, red, green, blue, alpha);
+
+    // Select the scaled font.
+    font->setFont(context);
+
+    GlyphBufferGlyph* glyphs = glyphBuffer.glyphs(from);
+
+    float offset = point.x();
+
+    for (unsigned i = 0; i < numGlyphs; i++) {
+        glyphs[i].x = offset;
+        glyphs[i].y = point.y();
+        offset += glyphBuffer.advanceAt(from + i);
+    }
+    cairo_show_glyphs(context, glyphs, numGlyphs);
+}
+
+}
diff --git a/WebCore/platform/gdk/FontPlatformData.h b/WebCore/platform/gdk/FontPlatformData.h
new file mode 100644
index 0000000..6bd2062
--- /dev/null
+++ b/WebCore/platform/gdk/FontPlatformData.h
@@ -0,0 +1,74 @@
+/*
+ * This file is part of the internal font implementation.  It should not be included by anyone other than
+ * FontMac.cpp, FontWin.cpp and Font.cpp.
+ *
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef FontPlatformData_H
+#define FontPlatformData_H
+
+#include "GlyphBuffer.h"
+#include "FontDescription.h"
+#include <cairo.h>
+#include <cairo-ft.h>
+#include <fontconfig/fcfreetype.h>
+
+namespace WebCore {
+
+class FontPlatformData {
+public:
+    class Deleted {};
+    FontPlatformData(Deleted) : m_pattern((FcPattern*)-1) { }
+
+    FontPlatformData() : m_pattern(0) { }
+
+    FontPlatformData(const FontDescription&, const AtomicString& family);
+    ~FontPlatformData();
+
+    static bool init();
+
+    static cairo_font_face_t** list(FontDescription&, const AtomicString& familyName, int* length);
+    Glyph index(unsigned ucs4) const;
+
+    bool isFixedPitch();
+
+    void setFont(cairo_t*) const;
+
+    unsigned hash() const
+    {
+        return StringImpl::computeHash((UChar*)&m_fontDescription, sizeof(FontDescription) / sizeof(UChar));
+    }
+
+    bool operator==(const FontPlatformData&) const;
+
+    FcPattern* m_pattern;
+    FontDescription m_fontDescription;
+    cairo_matrix_t* m_fontMatrix;
+    cairo_font_face_t* m_fontFace;
+    cairo_font_options_t* m_options;
+    cairo_scaled_font_t* m_scaledFont;
+
+};
+
+}
+
+#endif
diff --git a/WebCore/platform/gdk/FontPlatformDataGdk.cpp b/WebCore/platform/gdk/FontPlatformDataGdk.cpp
new file mode 100644
index 0000000..865775b
--- /dev/null
+++ b/WebCore/platform/gdk/FontPlatformDataGdk.cpp
@@ -0,0 +1,188 @@
+/*
+ * This file is part of the internal font implementation.  It should not be included by anyone other than
+ * FontMac.cpp, FontWin.cpp and Font.cpp.
+ *
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+#include "FontPlatformData.h"
+
+#include "PlatformString.h"
+#include "DeprecatedString.h"
+#include "FontDescription.h"
+#include "cairo-ft.h"
+#include "cairo.h"
+#include <fontconfig/fcfreetype.h>
+#include <assert.h>
+
+namespace WebCore {
+
+FontPlatformData::FontPlatformData(const FontDescription& fontDescription, const AtomicString& familyName)
+    : m_fontDescription(fontDescription)
+{
+    init();
+
+    FcChar8* family = (FcChar8*)((const char*)(familyName.deprecatedString().utf8()));
+    int fcslant = FC_SLANT_ROMAN;
+    int fcweight = FC_WEIGHT_NORMAL;
+    int fcsize = (int)fontDescription.computedSize();
+    if (fontDescription.italic())
+        fcslant = FC_SLANT_ITALIC;
+    if (fontDescription.weight() == cBoldWeight)
+        fcweight = FC_WEIGHT_BOLD;
+
+    int type = fontDescription.genericFamily();
+    switch (type) {
+        case FontDescription::SerifFamily:
+            family = (FcChar8*)"sans-serif";
+            break;
+        case FontDescription::SansSerifFamily:
+            family = (FcChar8*)"sans-serif";
+            break;
+        case FontDescription::NoFamily:
+        case FontDescription::StandardFamily:
+        default:
+            family = (FcChar8*)"sans-serif";
+    }
+    FcPattern* pattern = FcPatternCreate();
+    assert(pattern != 0);
+    if (!FcPatternAddString(pattern, FC_FAMILY, family))
+        goto freePattern;
+    if (!FcPatternAddInteger(pattern, FC_SLANT, fcslant))
+        goto freePattern;
+    if (!FcPatternAddInteger(pattern, FC_WEIGHT, fcweight))
+        goto freePattern;
+    if (!FcPatternAddInteger(pattern, FC_PIXEL_SIZE, fcsize))
+        goto freePattern;
+
+
+    FcConfigSubstitute(NULL, pattern, FcMatchPattern);
+    FcDefaultSubstitute(pattern);
+
+    FcResult fcresult;
+    m_pattern = FcFontMatch(NULL, pattern, &fcresult);
+    if (!m_pattern)
+        goto freePattern;
+
+    m_fontFace = cairo_ft_font_face_create_for_pattern(m_pattern);
+    m_fontMatrix = (cairo_matrix_t*)malloc(sizeof(cairo_matrix_t));
+    cairo_matrix_t ctm;
+    cairo_font_extents_t font_extents;
+    cairo_text_extents_t text_extents;
+    cairo_matrix_init_scale(m_fontMatrix, m_fontDescription.computedPixelSize(), m_fontDescription.computedPixelSize());
+    cairo_matrix_init_identity(&ctm);
+    m_options = cairo_font_options_create();
+    m_scaledFont = cairo_scaled_font_create(m_fontFace, m_fontMatrix, &ctm, m_options);
+
+    assert(m_scaledFont != 0);
+
+freePattern:
+    FcPatternDestroy(pattern);
+}
+
+bool FontPlatformData::init()
+{
+    static FcBool FCInitialized;
+    if (FCInitialized)
+        return true;
+    FCInitialized = FcTrue;
+    if (!FcInit()) {
+        fprintf(stderr, "Can't init font config library\n");
+        return false;
+    }
+    return true;
+}
+
+FontPlatformData::~FontPlatformData()
+{
+    FcPatternDestroy(m_pattern);
+    cairo_font_face_destroy(m_fontFace);
+    cairo_scaled_font_destroy(m_scaledFont);
+    cairo_font_options_destroy(m_options);
+}
+
+bool FontPlatformData::isFixedPitch()
+{
+    int spacing;
+    if (FcPatternGetInteger(m_pattern, FC_SPACING, 0, &spacing) == FcResultMatch)
+        return spacing == FC_MONO;
+    return false;
+}
+
+// length is a out value giving the length of the list
+cairo_font_face_t** FontPlatformData::list(FontDescription& fontDescription, const AtomicString& familyName, int* length)
+{
+    init();
+
+    FcPattern* pattern = FcPatternCreate();
+    if (!pattern)
+        return NULL;
+
+    FcObjectSet* os = FcObjectSetCreate();
+    FcObjectSetAdd(os, FC_FAMILY);
+    FcObjectSetAdd(os, FC_STYLE);
+    FcFontSet* fs = FcFontList(0, pattern, os);
+    if (length)
+        *length = fs->nfont;
+    if (pattern)
+        FcPatternDestroy (pattern);
+    if (os)
+        FcObjectSetDestroy (os);
+    cairo_font_face_t** result = (cairo_font_face_t**)malloc((fs->nfont + 1) * sizeof(cairo_font_face_t*));
+    for (int i = 0; i < fs->nfont; i++) {
+        FcChar8* font = FcNameUnparse(fs->fonts[i]);
+        printf("%s\n", font);
+        result[i] = cairo_ft_font_face_create_for_pattern(fs->fonts[i]);
+    }
+    result[fs->nfont] = NULL;
+    return result;
+}
+
+Glyph FontPlatformData::index(unsigned ucs4) const
+{
+    ucs4 = (0xff & ucs4);
+    FT_Face face = cairo_ft_scaled_font_lock_face(m_scaledFont);
+    assert(face != 0);
+    int index = FcFreeTypeCharIndex(face, ucs4);
+    cairo_ft_scaled_font_unlock_face(m_scaledFont);
+    return index;
+}
+
+
+void FontPlatformData::setFont(cairo_t* cr) const
+{
+    cairo_set_font_face(cr, m_fontFace);
+    cairo_set_font_matrix(cr, m_fontMatrix);
+    cairo_set_font_options(cr, m_options);
+}
+
+bool FontPlatformData::operator==(const FontPlatformData& other) const
+{
+    if (m_pattern == other.m_pattern)
+        return true;
+    if (m_pattern == 0 || m_pattern == (FcPattern*)-1
+            || other.m_pattern == 0 || other.m_pattern == (FcPattern*)-1)
+        return false;
+    return FcPatternEqual(m_pattern, other.m_pattern);
+}
+
+}
diff --git a/WebCore/platform/gdk/FrameGdk.cpp b/WebCore/platform/gdk/FrameGdk.cpp
new file mode 100644
index 0000000..e24c1e1
--- /dev/null
+++ b/WebCore/platform/gdk/FrameGdk.cpp
@@ -0,0 +1,364 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "FrameGdk.h"
+#include "Element.h"
+#include "RenderObject.h"
+#include "RenderWidget.h"
+#include "RenderLayer.h"
+#include "Page.h"
+#include "Document.h"
+#include "DOMWindow.h"
+#include "DOMImplementation.h"
+#include "BrowserExtensionGdk.h"
+#include "Document.h"
+#include "KWQKHTMLSettings.h"
+#include "Plugin.h"
+#include "FramePrivate.h"
+#include "GraphicsContext.h"
+#include "HTMLDocument.h"
+#include "TransferJob.h"
+#include "PlatformMouseEvent.h"
+#include "PlatformKeyboardEvent.h"
+#include "PlatformWheelEvent.h"
+#include "MouseEventWithHitTestResults.h"
+#include "SelectionController.h"
+#include "TypingCommand.h"
+#include "KWQKSSLKeyGen.h"
+#include "KeyboardCodes.h"
+#include <gdk/gdk.h>
+
+DeprecatedStringList KSSLKeyGen::supportedKeySizes(){return DeprecatedStringList();};
+DeprecatedString KSSLKeyGen::signedPublicKeyAndChallengeString(unsigned keySizeIndex, const DeprecatedString &challengeString, const KURL &url){return DeprecatedString();};
+
+// This function loads resources from WebKit
+// This does not belong here and I'm not sure where
+// it should go
+// I don't know what the plans or design is
+// for none code resources
+Vector<char> loadResourceIntoArray(const char* resourceName)
+{
+    Vector<char> resource;
+    //if (strcmp(resourceName,"missingImage") == 0) {
+    //}
+    return resource;
+}
+
+namespace WebCore {
+
+
+static void doScroll(const RenderObject* r, bool isHorizontal, int multiplier)
+{
+    // FIXME: The scrolling done here should be done in the default handlers
+    // of the elements rather than here in the part.
+    if (!r)
+        return;
+
+    //broken since it calls scroll on scrollbars
+    //and we have none now
+    //r->scroll(direction, KWQScrollWheel, multiplier);
+    if (!r->layer())
+        return;
+    int x = r->layer()->scrollXOffset();
+    int y = r->layer()->scrollYOffset();
+    if (isHorizontal)
+        x += multiplier;
+    else
+        y += multiplier;
+    r->layer()->scrollToOffset(x, y, true, true);
+}
+
+bool FrameView::isFrameView() const
+{
+    return true;
+}
+
+FrameGdk::FrameGdk(GdkDrawable* gdkdrawable)
+    : Frame(new Page, 0), m_drawable(gdkdrawable)
+{
+    d->m_extension = new BrowserExtensionGdk(this);
+    KHTMLSettings* settings = new KHTMLSettings;
+    settings->setAutoLoadImages(true);
+    settings->setMinFontSize(5);
+    settings->setMinLogicalFontSize(5);
+    settings->setShouldPrintBackgrounds(true);
+
+    settings->setMediumFixedFontSize(14);
+    settings->setMediumFontSize(14);
+    settings->setSerifFontName("Times New Roman");
+    settings->setSansSerifFontName("Arial");
+    settings->setFixedFontName("Courier");
+    settings->setStdFontName("Arial");
+    setSettings(settings);
+    page()->setMainFrame(this);
+    FrameView* view = new FrameView(this);
+    setView(view);
+    IntRect geom = frameGeometry();
+    view->resize(geom.width(), geom.height());
+    view->ScrollView::setDrawable(gdkdrawable);
+}
+
+FrameGdk::FrameGdk(Page* page, RenderPart* renderPart, FrameGdkClient* client)
+    : Frame(page, renderPart)
+{
+    d->m_extension = new BrowserExtensionGdk(this);
+    KHTMLSettings* settings = new KHTMLSettings;
+    settings->setAutoLoadImages(true);
+    setSettings(settings);
+}
+
+FrameGdk::~FrameGdk()
+{
+}
+
+bool FrameGdk::openURL(const KURL& url)
+{
+    didOpenURL(url);
+    begin(url);
+    TransferJob* job = new TransferJob(this, "GET", url);
+    job->start(document()->docLoader());
+    return true;
+}
+
+void FrameGdk::submitForm(const ResourceRequest&)
+{
+}
+
+void FrameGdk::urlSelected(const ResourceRequest& request)
+{
+    //need to potentially updateLocationBar(str.ascii()); or notify sys of new url mybe event or callback
+    const KURL url = request.url();
+    printf("------------------> LOADING NEW URL %s \n", url.url().ascii());
+    didOpenURL(url);
+    begin(url);
+    TransferJob* job = new TransferJob(this, "GET", url);
+    job->start(document()->docLoader());
+}
+
+String FrameGdk::userAgent() const
+{
+    return "Mozilla/5.0 (PC; U; Intel; Linux; en) AppleWebKit/420+ (KHTML, like Gecko)";
+}
+
+void FrameGdk::runJavaScriptAlert(String const& message)
+{
+}
+
+bool FrameGdk::runJavaScriptConfirm(String const& message)
+{
+    return true;
+}
+
+void FrameGdk::setTitle(const String &title)
+{
+}
+
+void FrameGdk::handleGdkEvent(GdkEvent* event)
+{
+    switch (event->type) {
+        case GDK_EXPOSE: {
+            GdkRectangle clip;
+            gdk_region_get_clipbox(event->expose.region, &clip);
+            gdk_window_begin_paint_region (event->any.window, event->expose.region);
+            cairo_t* cr = gdk_cairo_create (event->any.window);
+            GraphicsContext* ctx = new GraphicsContext(cr);
+            paint(ctx, IntRect(clip.x, clip.y, clip.width, clip.height));
+            delete ctx;
+            gdk_window_end_paint (event->any.window);
+            break;
+        }
+        case GDK_SCROLL: {
+            PlatformWheelEvent wheelEvent(event);
+            view()->handleWheelEvent(wheelEvent);
+            if (wheelEvent.isAccepted()) {
+                return;
+            }
+            RenderObject::NodeInfo nodeInfo(true, true);
+            renderer()->layer()->hitTest(nodeInfo, wheelEvent.pos());
+            Node* node = nodeInfo.innerNode();
+            if (!node)
+                return;
+            //Default to scrolling the page
+            //not sure why its null
+            //broke anyway when its not null
+            doScroll(renderer(), wheelEvent.isHorizontal(), wheelEvent.delta());
+            break;
+        }
+        case GDK_DRAG_ENTER:
+        case GDK_DRAG_LEAVE:
+        case GDK_DRAG_MOTION:
+        case GDK_DRAG_STATUS:
+        case GDK_DROP_START:
+        case GDK_DROP_FINISHED: {
+            //bool updateDragAndDrop(const PlatformMouseEvent&, Clipboard*);
+            //void cancelDragAndDrop(const PlatformMouseEvent&, Clipboard*);
+            //bool performDragAndDrop(const PlatformMouseEvent&, Clipboard*);
+            break;
+        }
+        case GDK_MOTION_NOTIFY:
+            view()->handleMouseMoveEvent(event);
+            break;
+        case GDK_BUTTON_PRESS:
+        case GDK_2BUTTON_PRESS:
+        case GDK_3BUTTON_PRESS:
+            view()->handleMousePressEvent(event);
+            break;
+        case GDK_BUTTON_RELEASE:
+            view()->handleMouseReleaseEvent(event);
+            break;
+        case GDK_KEY_PRESS:
+        case GDK_KEY_RELEASE: {
+            PlatformKeyboardEvent kevent(event);
+            bool handled = false;
+            if (!kevent.isKeyUp()) {
+                Node* start = selection().start().node();
+                if (start && start->isContentEditable()) {
+                    switch(kevent.WindowsKeyCode()) {
+                        case VK_BACK:
+                            TypingCommand::deleteKeyPressed(document());
+                            break;
+                        case VK_DELETE:
+                            TypingCommand::forwardDeleteKeyPressed(document());
+                            break;
+                        case VK_LEFT:
+                            selection().modify(SelectionController::MOVE, SelectionController::LEFT, CharacterGranularity);
+                            break;
+                        case VK_RIGHT:
+                            selection().modify(SelectionController::MOVE, SelectionController::RIGHT, CharacterGranularity);
+                            break;
+                        case VK_UP:
+                            selection().modify(SelectionController::MOVE, SelectionController::BACKWARD, ParagraphGranularity);
+                            break;
+                        case VK_DOWN:
+                            selection().modify(SelectionController::MOVE, SelectionController::FORWARD, ParagraphGranularity);
+                            break;
+                        default:
+                            TypingCommand::insertText(document(), kevent.text(), false);
+
+                    }
+                    handled = true;
+                }
+                if (!handled) {
+                    switch (kevent.WindowsKeyCode()) {
+                        case VK_LEFT:
+                            doScroll(renderer(), true, -120);
+                            break;
+                        case VK_RIGHT:
+                            doScroll(renderer(), true, 120);
+                            break;
+                        case VK_UP:
+                            doScroll(renderer(), false, -120);
+                            break;
+                        case VK_PRIOR:
+                            //return SB_PAGEUP;
+                            break;
+                        case VK_NEXT:
+                            //return SB_PAGEDOWN;
+                            break;
+                        case VK_DOWN:
+                            doScroll(renderer(), false, 120);
+                            break;
+                        case VK_HOME:
+                            renderer()->layer()->scrollToOffset(0, 0, true, true);
+                            doScroll(renderer(), false, 120);
+                            break;
+                        case VK_END:
+                            renderer()->layer()->scrollToOffset(0,
+                                                                renderer()->height(), true, true);
+                            break;
+                        case VK_SPACE:
+                            if (kevent.shiftKey())
+                                doScroll(renderer(), false, -120);
+                            else
+                                doScroll(renderer(), false, 120);
+                            break;
+                    }
+
+                }
+            }
+        }
+        default:
+            break;
+    }
+}
+
+void FrameGdk::receivedData(TransferJob* job, const char* data, int length)
+{
+    write(data, length);
+}
+
+void FrameGdk::receivedAllData(TransferJob* job, PlatformData data)
+{
+    end();
+}
+
+void FrameGdk::setFrameGeometry(const IntRect &r)
+{
+    if (!m_drawable || !GDK_IS_WINDOW(m_drawable))
+        return;
+    GdkWindow* window = GDK_WINDOW(m_drawable);
+    gdk_window_move_resize(window, r.x(), r.y(), r.width(), r.height());
+}
+
+IntRect FrameGdk::frameGeometry() const
+{
+    gint x, y, width, height, depth;
+    if (!m_drawable)
+        return IntRect();
+
+    if (!GDK_IS_WINDOW(m_drawable)) {
+        gdk_drawable_get_size(m_drawable, &width, &height);
+        return IntRect(0, 0, width, height);
+    }
+
+    GdkWindow* window = GDK_WINDOW(m_drawable);
+    gdk_window_get_geometry(window, &x, &y, &width, &height, &depth);
+    return IntRect(x, y, width, height);
+}
+
+bool FrameGdk::passWheelEventToChildWidget(Node* node)
+{
+    if (!node)
+        return false;
+    RenderObject* renderer = node->renderer();
+    if (!renderer || !renderer->isWidget())
+        return false;
+    Widget* widget = static_cast<RenderWidget*>(renderer)->widget();
+    if (!widget)
+        return false;
+    return true;
+}
+
+bool FrameGdk::passSubframeEventToSubframe(MouseEventWithHitTestResults& mev, Frame*)
+{
+    if (mev.targetNode() == 0)
+        return true;
+    return false;
+}
+
+}
diff --git a/WebCore/platform/gdk/FrameGdk.h b/WebCore/platform/gdk/FrameGdk.h
new file mode 100644
index 0000000..4f14dbb
--- /dev/null
+++ b/WebCore/platform/gdk/FrameGdk.h
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef FrameGdk_H_
+#define FrameGdk_H_
+
+#include "Frame.h"
+#include "TransferJobClient.h"
+#include <gdk/gdk.h>
+
+namespace WebCore {
+
+class FrameGdkClient {
+public:
+    virtual void openURL(const DeprecatedString&) = 0;
+};
+
+class FrameGdk : public Frame, TransferJobClient {
+public:
+    FrameGdk(Page*, RenderPart*, FrameGdkClient*);
+    FrameGdk(GdkDrawable*);
+    ~FrameGdk();
+
+    void handleGdkEvent(GdkEvent*);
+    virtual bool openURL(const KURL&);
+    virtual void openURLRequest(const ResourceRequest&);
+    virtual void submitForm(const ResourceRequest&);
+    virtual void urlSelected(const ResourceRequest&);
+
+    virtual void setTitle(const String&);
+
+    virtual ObjectContentType objectContentType(const KURL&, const String& mimeType);
+    virtual Plugin* createPlugin(Element*, const KURL&, const Vector<String>&, const Vector<String>&, const String&);
+    virtual Frame* createFrame(const KURL&, const String& name, RenderPart*, const String& referrer);
+
+    virtual void scheduleClose();
+
+    virtual void unfocusWindow();
+
+    virtual void focusWindow();
+
+    virtual void saveDocumentState();
+    virtual void restoreDocumentState();
+
+    virtual void addMessageToConsole(const String& message, unsigned lineNumber, const String& sourceID);
+
+    virtual void runJavaScriptAlert(const String& message);
+    virtual bool runJavaScriptConfirm(const String& message);
+    virtual bool runJavaScriptPrompt(const String& message, const String& defaultValue, String& result);
+    virtual bool locationbarVisible();
+    virtual bool menubarVisible();
+    virtual bool personalbarVisible();
+    virtual bool statusbarVisible();
+    virtual bool toolbarVisible();
+
+    virtual void createEmptyDocument();
+    virtual Range* markedTextRange() const;
+
+    virtual String incomingReferrer() const;
+    virtual String userAgent() const;
+
+    virtual String mimeTypeForFileName(const String&) const;
+
+    virtual void markMisspellingsInAdjacentWords(const VisiblePosition&);
+    virtual void markMisspellings(const SelectionController&);
+
+    virtual bool lastEventIsMouseUp() const;
+
+    virtual bool passSubframeEventToSubframe(MouseEventWithHitTestResults &, Frame* subframe = 0);
+    virtual bool passWheelEventToChildWidget(Node*);
+
+    virtual String overrideMediaType() const;
+
+    virtual KJS::Bindings::Instance* getEmbedInstanceForWidget(Widget*);
+    virtual KJS::Bindings::Instance* getObjectInstanceForWidget(Widget*);
+    virtual KJS::Bindings::Instance* getAppletInstanceForWidget(Widget*);
+
+    virtual void registerCommandForUndo(const EditCommandPtr&);
+    virtual void registerCommandForRedo(const EditCommandPtr&);
+    virtual void clearUndoRedoOperations();
+    virtual void issueUndoCommand();
+    virtual void issueRedoCommand();
+    virtual void issueCutCommand();
+    virtual void issueCopyCommand();
+    virtual void issuePasteCommand();
+    virtual void issuePasteAndMatchStyleCommand();
+    virtual void issueTransposeCommand();
+    virtual void respondToChangedSelection(const SelectionController& oldSelection, bool closeTyping);
+    virtual void respondToChangedContents();
+    virtual bool shouldChangeSelection(const SelectionController& oldSelection, const SelectionController& newSelection, EAffinity affinity, bool stillSelecting) const;
+    virtual void partClearedInBegin();
+
+    virtual bool canGoBackOrForward(int distance) const;
+    virtual void handledOnloadEvents();
+
+    virtual bool canPaste() const;
+    virtual bool canRedo() const;
+    virtual bool canUndo() const;
+    virtual void print();
+    virtual bool shouldInterruptJavaScript();
+
+    bool keyPress(const PlatformKeyboardEvent&);
+
+    virtual void receivedData(TransferJob*, const char*, int);
+    virtual void receivedAllData(TransferJob*,PlatformData);
+
+    IntRect frameGeometry() const;
+    void setFrameGeometry(const IntRect&);
+
+private:
+    virtual bool passMouseDownEventToWidget(Widget*);
+    FrameGdkClient* m_client;
+    GdkDrawable* m_drawable;
+};
+
+inline FrameGdk* Win(Frame* frame) { return static_cast<FrameGdk*>(frame); }
+inline const FrameGdk* Win(const Frame* frame) { return static_cast<const FrameGdk*>(frame); }
+
+}
+
+#endif
diff --git a/WebCore/platform/gdk/GlyphMapGdk.cpp b/WebCore/platform/gdk/GlyphMapGdk.cpp
new file mode 100644
index 0000000..c77d64b
--- /dev/null
+++ b/WebCore/platform/gdk/GlyphMapGdk.cpp
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "GlyphMap.h"
+
+#include "FontData.h"
+
+namespace WebCore {
+
+bool GlyphMap::fillPage(GlyphPage* page, UChar* buffer, unsigned bufferLength, const FontData* fontData)
+{
+    for (unsigned i = 0; i < bufferLength; i++)
+        page->setGlyphDataForIndex(i, fontData->getGlyphIndex(buffer[i]), fontData);
+    return true;
+}
+
+}
diff --git a/WebCore/platform/gdk/KeyEventGdk.cpp b/WebCore/platform/gdk/KeyEventGdk.cpp
new file mode 100644
index 0000000..e7cdd06
--- /dev/null
+++ b/WebCore/platform/gdk/KeyEventGdk.cpp
@@ -0,0 +1,479 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "PlatformKeyboardEvent.h"
+
+#include "DeprecatedString.h"
+#include "KeyboardCodes.h"
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+
+namespace WebCore {
+
+// FIXME: This is incomplete.  We should change this to mirror
+// more like what Firefox does, and generate these switch statements
+// at build time.
+static String keyIdentifierForGdkKeyCode(guint keyCode)
+{
+    switch (keyCode) {
+        case GDK_Menu:
+        case GDK_Alt_L:
+        case GDK_Alt_R:
+            return "Alt";
+        case GDK_Clear:
+            return "Clear";
+        case GDK_Down:
+            return "Down";
+            // "End"
+        case GDK_End:
+            return "End";
+            // "Enter"
+        case GDK_ISO_Enter:
+        case GDK_KP_Enter:
+            return "Enter";
+        case GDK_Execute:
+            return "Execute";
+        case GDK_F1:
+            return "F1";
+        case GDK_F2:
+            return "F2";
+        case GDK_F3:
+            return "F3";
+        case GDK_F4:
+            return "F4";
+        case GDK_F5:
+            return "F5";
+        case GDK_F6:
+            return "F6";
+        case GDK_F7:
+            return "F7";
+        case GDK_F8:
+            return "F8";
+        case GDK_F9:
+            return "F9";
+        case GDK_F10:
+            return "F10";
+        case GDK_F11:
+            return "F11";
+        case GDK_F12:
+            return "F12";
+        case GDK_F13:
+            return "F13";
+        case GDK_F14:
+            return "F14";
+        case GDK_F15:
+            return "F15";
+        case GDK_F16:
+            return "F16";
+        case GDK_F17:
+            return "F17";
+        case GDK_F18:
+            return "F18";
+        case GDK_F19:
+            return "F19";
+        case GDK_F20:
+            return "F20";
+        case GDK_F21:
+            return "F21";
+        case GDK_F22:
+            return "F22";
+        case GDK_F23:
+            return "F23";
+        case GDK_F24:
+            return "F24";
+        case GDK_Help:
+            return "Help";
+        case GDK_Home:
+            return "Home";
+        case GDK_Insert:
+            return "Insert";
+        case GDK_Left:
+            return "Left";
+        case GDK_Page_Down:
+            return "PageDown";
+        case GDK_Page_Up:
+            return "PageUp";
+        case GDK_Pause:
+            return "Pause";
+        case GDK_3270_PrintScreen:
+            return "PrintScreen";
+        case GDK_Right:
+            return "Right";
+        case GDK_Select:
+            return "Select";
+        case GDK_Up:
+            return "Up";
+            // Standard says that DEL becomes U+00007F.
+        case GDK_Delete:
+            return "U+00007F";
+        default:
+            return String::sprintf("U+%06X", toupper(keyCode));
+    }
+}
+
+static int windowsKeyCodeForKeyEvent(unsigned int keycode)
+{
+    switch (keycode) {
+        case GDK_KP_0:
+            return VK_NUMPAD0;// (60) Numeric keypad 0 key
+        case GDK_KP_1:
+            return VK_NUMPAD1;// (61) Numeric keypad 1 key
+        case GDK_KP_2:
+            return  VK_NUMPAD2; // (62) Numeric keypad 2 key
+        case GDK_KP_3:
+            return VK_NUMPAD3; // (63) Numeric keypad 3 key
+        case GDK_KP_4:
+            return VK_NUMPAD4; // (64) Numeric keypad 4 key
+        case GDK_KP_5:
+            return VK_NUMPAD5; //(65) Numeric keypad 5 key
+        case GDK_KP_6:
+            return VK_NUMPAD6; // (66) Numeric keypad 6 key
+        case GDK_KP_7:
+            return VK_NUMPAD7; // (67) Numeric keypad 7 key
+        case GDK_KP_8:
+            return VK_NUMPAD8; // (68) Numeric keypad 8 key
+        case GDK_KP_9:
+            return VK_NUMPAD9; // (69) Numeric keypad 9 key
+        case GDK_KP_Multiply:
+            return VK_MULTIPLY; // (6A) Multiply key
+        case GDK_KP_Add:
+            return VK_ADD; // (6B) Add key
+        case GDK_KP_Subtract:
+            return VK_SUBTRACT; // (6D) Subtract key
+        case GDK_KP_Decimal:
+            return VK_DECIMAL; // (6E) Decimal key
+        case GDK_KP_Divide:
+            return VK_DIVIDE; // (6F) Divide key
+
+        case GDK_BackSpace:
+            return VK_BACK; // (08) BACKSPACE key
+        case GDK_Tab:
+            return VK_TAB; // (09) TAB key
+        case GDK_Clear:
+            return VK_CLEAR; // (0C) CLEAR key
+        case GDK_Return:
+            return VK_RETURN; //(0D) Return key
+        case GDK_Shift_L:
+        case GDK_Shift_R:
+            return VK_SHIFT; // (10) SHIFT key
+        case GDK_Control_L:
+        case GDK_Control_R:
+            return VK_CONTROL; // (11) CTRL key
+        case GDK_Menu:
+        case GDK_Alt_L:
+        case GDK_Alt_R:
+            return VK_MENU; // (12) ALT key
+
+        case GDK_Pause:
+            return VK_PAUSE; // (13) PAUSE key
+        case GDK_Caps_Lock:
+            return VK_CAPITAL; // (14) CAPS LOCK key
+        case GDK_Kana_Lock:
+        case GDK_Kana_Shift:
+            return VK_KANA; // (15) Input Method Editor (IME) Kana mode
+        case GDK_Hangul:
+            return VK_HANGUL; // VK_HANGUL (15) IME Hangul mode
+            // VK_JUNJA (17) IME Junja mode
+            // VK_FINAL (18) IME final mode
+        case GDK_Hangul_Hanja:
+            return VK_HANJA; // (19) IME Hanja mode
+        case GDK_Kanji:
+            return VK_KANJI; // (19) IME Kanji mode
+        case GDK_Escape:
+            return VK_ESCAPE; // (1B) ESC key
+            // VK_CONVERT (1C) IME convert
+            // VK_NONCONVERT (1D) IME nonconvert
+            // VK_ACCEPT (1E) IME accept
+            // VK_MODECHANGE (1F) IME mode change request
+        case GDK_space:
+            return VK_SPACE; // (20) SPACEBAR
+        case GDK_Page_Up:
+            return VK_PRIOR; // (21) PAGE UP key
+        case GDK_Page_Down:
+            return VK_NEXT; // (22) PAGE DOWN key
+        case GDK_End:
+            return VK_END; // (23) END key
+        case GDK_Home:
+            return VK_HOME; // (24) HOME key
+        case GDK_Left:
+            return VK_LEFT; // (25) LEFT ARROW key
+        case GDK_Up:
+            return VK_UP; // (26) UP ARROW key
+        case GDK_Right:
+            return VK_RIGHT; // (27) RIGHT ARROW key
+        case GDK_Down:
+            return VK_DOWN; // (28) DOWN ARROW key
+        case GDK_Select:
+            return VK_SELECT; // (29) SELECT key
+        case GDK_Print:
+            return VK_PRINT; // (2A) PRINT key
+        case GDK_Execute:
+            return VK_EXECUTE;// (2B) EXECUTE key
+            //dunno on this
+            //case GDK_PrintScreen:
+            //      return VK_SNAPSHOT; // (2C) PRINT SCREEN key
+        case GDK_Insert:
+            return VK_INSERT; // (2D) INS key
+        case GDK_Delete:
+            return VK_DELETE; // (2E) DEL key
+        case GDK_Help:
+            return VK_HELP; // (2F) HELP key
+        case GDK_0:
+        case GDK_parenleft:
+            return VK_0;    //  (30) 0) key
+        case GDK_1:
+            return VK_1; //  (31) 1 ! key
+        case GDK_2:
+        case GDK_at:
+            return VK_2; //  (32) 2 & key
+        case GDK_3:
+        case GDK_numbersign:
+            return VK_3; //case '3': case '#';
+        case GDK_4:
+        case GDK_dollar: //  (34) 4 key '$';
+            return VK_4;
+        case GDK_5:
+        case GDK_percent:
+            return VK_5; //  (35) 5 key  '%'
+        case GDK_6:
+        case GDK_asciicircum:
+            return VK_6; //  (36) 6 key  '^'
+        case GDK_7:
+        case GDK_ampersand:
+            return VK_7; //  (37) 7 key  case '&'
+        case GDK_8:
+        case GDK_asterisk:
+            return VK_8; //  (38) 8 key  '*'
+        case GDK_9:
+        case GDK_parenright:
+            return VK_9; //  (39) 9 key '('
+        case GDK_a:
+        case GDK_A:
+            return VK_A; //  (41) A key case 'a': case 'A': return 0x41;
+        case GDK_b:
+        case GDK_B:
+            return VK_B; //  (42) B key case 'b': case 'B': return 0x42;
+        case GDK_c:
+        case GDK_C:
+            return VK_C; //  (43) C key case 'c': case 'C': return 0x43;
+        case GDK_d:
+        case GDK_D:
+            return VK_D; //  (44) D key case 'd': case 'D': return 0x44;
+        case GDK_e:
+        case GDK_E:
+            return VK_E; //  (45) E key case 'e': case 'E': return 0x45;
+        case GDK_f:
+        case GDK_F:
+            return VK_F; //  (46) F key case 'f': case 'F': return 0x46;
+        case GDK_g:
+        case GDK_G:
+            return VK_G; //  (47) G key case 'g': case 'G': return 0x47;
+        case GDK_h:
+        case GDK_H:
+            return VK_H; //  (48) H key case 'h': case 'H': return 0x48;
+        case GDK_i:
+        case GDK_I:
+            return VK_I; //  (49) I key case 'i': case 'I': return 0x49;
+        case GDK_j:
+        case GDK_J:
+            return VK_J; //  (4A) J key case 'j': case 'J': return 0x4A;
+        case GDK_k:
+        case GDK_K:
+            return VK_K; //  (4B) K key case 'k': case 'K': return 0x4B;
+        case GDK_l:
+        case GDK_L:
+            return VK_L; //  (4C) L key case 'l': case 'L': return 0x4C;
+        case GDK_m:
+        case GDK_M:
+            return VK_M; //  (4D) M key case 'm': case 'M': return 0x4D;
+        case GDK_n:
+        case GDK_N:
+            return VK_N; //  (4E) N key case 'n': case 'N': return 0x4E;
+        case GDK_o:
+        case GDK_O:
+            return VK_O; //  (4F) O key case 'o': case 'O': return 0x4F;
+        case GDK_p:
+        case GDK_P:
+            return VK_P; //  (50) P key case 'p': case 'P': return 0x50;
+        case GDK_q:
+        case GDK_Q:
+            return VK_Q; //  (51) Q key case 'q': case 'Q': return 0x51;
+        case GDK_r:
+        case GDK_R:
+            return VK_R; //  (52) R key case 'r': case 'R': return 0x52;
+        case GDK_s:
+        case GDK_S:
+            return VK_S; //  (53) S key case 's': case 'S': return 0x53;
+        case GDK_t:
+        case GDK_T:
+            return VK_T; //  (54) T key case 't': case 'T': return 0x54;
+        case GDK_u:
+        case GDK_U:
+            return VK_U; //  (55) U key case 'u': case 'U': return 0x55;
+        case GDK_v:
+        case GDK_V:
+            return VK_V; //  (56) V key case 'v': case 'V': return 0x56;
+        case GDK_w:
+        case GDK_W:
+            return VK_W; //  (57) W key case 'w': case 'W': return 0x57;
+        case GDK_x:
+        case GDK_X:
+            return VK_X; //  (58) X key case 'x': case 'X': return 0x58;
+        case GDK_y:
+        case GDK_Y:
+            return VK_Y; //  (59) Y key case 'y': case 'Y': return 0x59;
+        case GDK_z:
+        case GDK_Z:
+            return VK_Z; //  (5A) Z key case 'z': case 'Z': return 0x5A;
+        case GDK_Meta_L:
+            return VK_LWIN; // (5B) Left Windows key (Microsoft Natural keyboard)
+        case GDK_Meta_R:
+            return VK_RWIN; // (5C) Right Windows key (Natural keyboard)
+            // VK_APPS (5D) Applications key (Natural keyboard)
+            // VK_SLEEP (5F) Computer Sleep key
+            // VK_SEPARATOR (6C) Separator key
+            // VK_SUBTRACT (6D) Subtract key
+            // VK_DECIMAL (6E) Decimal key
+            // VK_DIVIDE (6F) Divide key
+            // handled by key code above
+
+        case GDK_Num_Lock:
+            return VK_NUMLOCK; // (90) NUM LOCK key
+
+        case GDK_Scroll_Lock:
+            return VK_SCROLL; // (91) SCROLL LOCK key
+
+            // VK_LSHIFT (A0) Left SHIFT key
+            // VK_RSHIFT (A1) Right SHIFT key
+            // VK_LCONTROL (A2) Left CONTROL key
+            // VK_RCONTROL (A3) Right CONTROL key
+            // VK_LMENU (A4) Left MENU key
+            // VK_RMENU (A5) Right MENU key
+            // VK_BROWSER_BACK (A6) Windows 2000/XP: Browser Back key
+            // VK_BROWSER_FORWARD (A7) Windows 2000/XP: Browser Forward key
+            // VK_BROWSER_REFRESH (A8) Windows 2000/XP: Browser Refresh key
+            // VK_BROWSER_STOP (A9) Windows 2000/XP: Browser Stop key
+            // VK_BROWSER_SEARCH (AA) Windows 2000/XP: Browser Search key
+            // VK_BROWSER_FAVORITES (AB) Windows 2000/XP: Browser Favorites key
+            // VK_BROWSER_HOME (AC) Windows 2000/XP: Browser Start and Home key
+            // VK_VOLUME_MUTE (AD) Windows 2000/XP: Volume Mute key
+            // VK_VOLUME_DOWN (AE) Windows 2000/XP: Volume Down key
+            // VK_VOLUME_UP (AF) Windows 2000/XP: Volume Up key
+            // VK_MEDIA_NEXT_TRACK (B0) Windows 2000/XP: Next Track key
+            // VK_MEDIA_PREV_TRACK (B1) Windows 2000/XP: Previous Track key
+            // VK_MEDIA_STOP (B2) Windows 2000/XP: Stop Media key
+            // VK_MEDIA_PLAY_PAUSE (B3) Windows 2000/XP: Play/Pause Media key
+            // VK_LAUNCH_MAIL (B4) Windows 2000/XP: Start Mail key
+            // VK_LAUNCH_MEDIA_SELECT (B5) Windows 2000/XP: Select Media key
+            // VK_LAUNCH_APP1 (B6) Windows 2000/XP: Start Application 1 key
+            // VK_LAUNCH_APP2 (B7) Windows 2000/XP: Start Application 2 key
+
+            // VK_OEM_1 (BA) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ';:' key
+        case GDK_semicolon:
+        case GDK_colon:
+            return VK_OEM_1; //case ';': case ':': return 0xBA;
+            // VK_OEM_PLUS (BB) Windows 2000/XP: For any country/region, the '+' key
+        case GDK_plus:
+        case GDK_equal:
+            return VK_OEM_PLUS; //case '=': case '+': return 0xBB;
+            // VK_OEM_COMMA (BC) Windows 2000/XP: For any country/region, the ',' key
+        case GDK_comma:
+        case GDK_less:
+            return VK_OEM_COMMA; //case ',': case '<': return 0xBC;
+            // VK_OEM_MINUS (BD) Windows 2000/XP: For any country/region, the '-' key
+        case GDK_minus:
+        case GDK_underscore:
+            return VK_OEM_MINUS; //case '-': case '_': return 0xBD;
+            // VK_OEM_PERIOD (BE) Windows 2000/XP: For any country/region, the '.' key
+        case GDK_period:
+        case GDK_greater:
+            return VK_OEM_PERIOD; //case '.': case '>': return 0xBE;
+            // VK_OEM_2 (BF) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '/?' key
+        case GDK_slash:
+        case GDK_question:
+            return VK_OEM_2; //case '/': case '?': return 0xBF;
+            // VK_OEM_3 (C0) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '`~' key
+        case GDK_asciitilde:
+        case GDK_quoteleft:
+            return VK_OEM_3; //case '`': case '~': return 0xC0;
+            // VK_OEM_4 (DB) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '[{' key
+        case GDK_bracketleft:
+        case GDK_braceleft:
+            return VK_OEM_4; //case '[': case '{': return 0xDB;
+            // VK_OEM_5 (DC) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '\|' key
+        case GDK_backslash:
+        case GDK_bar:
+            return VK_OEM_5; //case '\\': case '|': return 0xDC;
+            // VK_OEM_6 (DD) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ']}' key
+        case GDK_bracketright:
+        case GDK_braceright:
+            return VK_OEM_6; // case ']': case '}': return 0xDD;
+            // VK_OEM_7 (DE) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key
+        case GDK_quoteright:
+        case GDK_quotedbl:
+            return VK_OEM_7; // case '\'': case '"': return 0xDE;
+            // VK_OEM_8 (DF) Used for miscellaneous characters; it can vary by keyboard.
+            // VK_OEM_102 (E2) Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
+            // VK_PROCESSKEY (E5) Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
+            // VK_PACKET (E7) Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT,SendInput, WM_KEYDOWN, and WM_KEYUP
+            // VK_ATTN (F6) Attn key
+            // VK_CRSEL (F7) CrSel key
+            // VK_EXSEL (F8) ExSel key
+            // VK_EREOF (F9) Erase EOF key
+            // VK_PLAY (FA) Play key
+            // VK_ZOOM (FB) Zoom key
+            // VK_NONAME (FC) Reserved for future use
+            // VK_PA1 (FD) PA1 key
+            // VK_OEM_CLEAR (FE) Clear key
+        default:
+            return 0;
+    }
+
+}
+
+PlatformKeyboardEvent::PlatformKeyboardEvent(GdkEvent* event)
+{
+    m_isKeyUp = event->type == GDK_KEY_RELEASE;
+    m_shiftKey = event->key.state & GDK_SHIFT_MASK != 0;
+    m_ctrlKey = event->key.state & GDK_CONTROL_MASK != 0;
+    m_altKey = event->key.state & GDK_MOD1_MASK != 0;
+    m_metaKey = event->key.state & GDK_MOD2_MASK != 0;
+    m_text = event->key.string;
+    m_unmodifiedText = event->key.string;
+    m_keyIdentifier = keyIdentifierForGdkKeyCode(event->key.keyval);
+    m_WindowsKeyCode = windowsKeyCodeForKeyEvent(event->key.keyval);
+    m_autoRepeat = false;
+    m_isKeypad = false;
+
+    if (!m_shiftKey) {
+        UChar character = tolower(m_text[0]);
+        m_text = String(&character, 1);
+    }
+}
+
+}
diff --git a/WebCore/platform/gdk/KeyboardCodes.h b/WebCore/platform/gdk/KeyboardCodes.h
new file mode 100644
index 0000000..60c589d
--- /dev/null
+++ b/WebCore/platform/gdk/KeyboardCodes.h
@@ -0,0 +1,543 @@
+/*
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef KeyboardCodes_H
+#define KeyboardCodes_H
+
+namespace WebCore {
+
+// VK_LBUTTON (01) Left mouse button
+// VK_RBUTTON (02) Right mouse button
+// VK_CANCEL (03) Control-break processing
+// VK_MBUTTON (04) Middle mouse button (three-button mouse)
+// VK_XBUTTON1 (05)
+// VK_XBUTTON2 (06)
+
+// VK_BACK (08) BACKSPACE key
+const int VK_BACK = 0x08;
+
+// VK_TAB (09) TAB key
+const int VK_TAB = 0x09;
+
+// VK_CLEAR (0C) CLEAR key
+const int VK_CLEAR = 0x0C;
+
+// VK_RETURN (0D)
+const int VK_RETURN = 0x0D;
+
+// VK_SHIFT (10) SHIFT key
+const int VK_SHIFT = 0x10;
+
+// VK_CONTROL (11) CTRL key
+const int VK_CONTROL = 0x11;
+
+// VK_MENU (12) ALT key
+const int VK_MENU = 0x12;
+
+// VK_PAUSE (13) PAUSE key
+const int VK_PAUSE = 0x13;
+
+// VK_CAPITAL (14) CAPS LOCK key
+const int VK_CAPITAL = 0x14;
+
+// VK_KANA (15) Input Method Editor (IME) Kana mode
+const int VK_KANA = 0x15;
+
+// VK_HANGUEL (15) IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
+// VK_HANGUL (15) IME Hangul mode
+const int VK_HANGUL = 0x15;
+
+// VK_JUNJA (17) IME Junja mode
+const int VK_JUNJA = 0x17;
+
+// VK_FINAL (18) IME final mode
+const int VK_FINAL = 0x18;
+
+// VK_HANJA (19) IME Hanja mode
+const int VK_HANJA = 0x19;
+
+// VK_KANJI (19) IME Kanji mode
+const int VK_KANJI = 0x19;
+
+// VK_ESCAPE (1B) ESC key
+const int VK_ESCAPE = 0x1B;
+
+// VK_CONVERT (1C) IME convert
+const int VK_CONVERT = 0x1C;
+
+// VK_NONCONVERT (1D) IME nonconvert
+const int VK_NONCONVERT = 0x1D;
+
+// VK_ACCEPT (1E) IME accept
+const int VK_ACCEPT = 0x1E;
+
+// VK_MODECHANGE (1F) IME mode change request
+const int VK_MODECHANGE = 0x1F;
+
+// VK_SPACE (20) SPACEBAR
+const int VK_SPACE = 0x20;
+
+// VK_PRIOR (21) PAGE UP key
+const int VK_PRIOR = 0x21;
+
+// VK_NEXT (22) PAGE DOWN key
+const int VK_NEXT = 0x22;
+
+// VK_END (23) END key
+const int VK_END = 0x23;
+
+// VK_HOME (24) HOME key
+const int VK_HOME = 0x24;
+
+// VK_LEFT (25) LEFT ARROW key
+const int VK_LEFT = 0x25;
+
+// VK_UP (26) UP ARROW key
+const int VK_UP = 0x26;
+
+// VK_RIGHT (27) RIGHT ARROW key
+const int VK_RIGHT = 0x27;
+
+// VK_DOWN (28) DOWN ARROW key
+const int VK_DOWN = 0x28;
+
+// VK_SELECT (29) SELECT key
+const int VK_SELECT = 0x29;
+
+// VK_PRINT (2A) PRINT key
+const int VK_PRINT = 0x2A;
+
+// VK_EXECUTE (2B) EXECUTE key
+const int VK_EXECUTE = 0x2B;
+
+// VK_SNAPSHOT (2C) PRINT SCREEN key
+const int VK_SNAPSHOT = 0x2C;
+
+// VK_INSERT (2D) INS key
+const int VK_INSERT = 0x2D;
+
+// VK_DELETE (2E) DEL key
+const int VK_DELETE = 0x2E;
+
+// VK_HELP (2F) HELP key
+const int VK_HELP = 0x2F;
+
+// (30) 0 key
+const int VK_0 = 0x30;
+
+// (31) 1 key
+const int VK_1 = 0x31;
+
+// (32) 2 key
+const int VK_2 = 0x32;
+
+// (33) 3 key
+const int VK_3 = 0x33;
+
+// (34) 4 key
+const int VK_4 = 0x34;
+
+// (35) 5 key;
+
+const int VK_5 = 0x35;
+
+// (36) 6 key
+const int VK_6 = 0x36;
+
+// (37) 7 key
+const int VK_7 = 0x37;
+
+// (38) 8 key
+const int VK_8 = 0x38;
+
+// (39) 9 key
+const int VK_9 = 0x39;
+
+// (41) A key
+const int VK_A = 0x41;
+
+// (42) B key
+const int VK_B = 0x42;
+
+// (43) C key
+const int VK_C = 0x43;
+
+// (44) D key
+const int VK_D = 0x44;
+
+// (45) E key
+const int VK_E = 0x45;
+
+// (46) F key
+const int VK_F = 0x46;
+
+// (47) G key
+const int VK_G = 0x47;
+
+// (48) H key
+const int VK_H = 0x48;
+
+// (49) I key
+const int VK_I = 0x49;
+
+// (4A) J key
+const int VK_J = 0x4A;
+
+// (4B) K key
+const int VK_K = 0x4B;
+
+// (4C) L key
+const int VK_L = 0x4C;
+
+// (4D) M key
+const int VK_M = 0x4D;
+
+// (4E) N key
+const int VK_N = 0x4E;
+
+// (4F) O key
+const int VK_O = 0x4F;
+
+// (50) P key
+const int VK_P = 0x50;
+
+// (51) Q key
+const int VK_Q = 0x51;
+
+// (52) R key
+const int VK_R = 0x52;
+
+// (53) S key
+const int VK_S = 0x53;
+
+// (54) T key
+const int VK_T = 0x54;
+
+// (55) U key
+const int VK_U = 0x55;
+
+// (56) V key
+const int VK_V = 0x56;
+
+// (57) W key
+const int VK_W = 0x57;
+
+// (58) X key
+const int VK_X = 0x58;
+
+// (59) Y key
+const int VK_Y = 0x59;
+
+// (5A) Z key
+const int VK_Z = 0x5A;
+
+// VK_LWIN (5B) Left Windows key (Microsoft Natural keyboard)
+const int VK_LWIN = 0x5B;
+
+// VK_RWIN (5C) Right Windows key (Natural keyboard)
+const int VK_RWIN = 0x5C;
+
+// VK_APPS (5D) Applications key (Natural keyboard)
+const int VK_APPS = 0x5D;
+
+// VK_SLEEP (5F) Computer Sleep key
+const int VK_SLEEP = 0x5F;
+
+// VK_NUMPAD0 (60) Numeric keypad 0 key
+const int VK_NUMPAD0 = 0x60;
+
+// VK_NUMPAD1 (61) Numeric keypad 1 key
+const int VK_NUMPAD1 = 0x61;
+
+// VK_NUMPAD2 (62) Numeric keypad 2 key
+const int VK_NUMPAD2 = 0x62;
+
+// VK_NUMPAD3 (63) Numeric keypad 3 key
+const int VK_NUMPAD3 = 0x63;
+
+// VK_NUMPAD4 (64) Numeric keypad 4 key
+const int VK_NUMPAD4 = 0x64;
+
+// VK_NUMPAD5 (65) Numeric keypad 5 key
+const int VK_NUMPAD5 = 0x65;
+
+// VK_NUMPAD6 (66) Numeric keypad 6 key
+const int VK_NUMPAD6 = 0x66;
+
+// VK_NUMPAD7 (67) Numeric keypad 7 key
+const int VK_NUMPAD7 = 0x67;
+
+// VK_NUMPAD8 (68) Numeric keypad 8 key
+const int VK_NUMPAD8 = 0x68;
+
+// VK_NUMPAD9 (69) Numeric keypad 9 key
+const int VK_NUMPAD9 = 0x69;
+
+// VK_MULTIPLY (6A) Multiply key
+const int VK_MULTIPLY = 0x6A;
+
+// VK_ADD (6B) Add key
+const int VK_ADD = 0x6B;
+
+// VK_SEPARATOR (6C) Separator key
+const int VK_SEPARATOR = 0x6C;
+
+// VK_SUBTRACT (6D) Subtract key
+const int VK_SUBTRACT = 0x6D;
+
+// VK_DECIMAL (6E) Decimal key
+const int VK_DECIMAL = 0x6E;
+
+// VK_DIVIDE (6F) Divide key
+const int VK_DIVIDE = 0x6F;
+
+// VK_F1 (70) F1 key
+const int VK_F1 = 0x70;
+
+// VK_F2 (71) F2 key
+const int VK_F2 = 0x71;
+
+// VK_F3 (72) F3 key
+const int VK_F3 = 0x72;
+
+// VK_F4 (73) F4 key
+const int VK_F4 = 0x73;
+
+// VK_F5 (74) F5 key
+const int VK_F5 = 0x74;
+
+// VK_F6 (75) F6 key
+const int VK_F6 = 0x75;
+
+// VK_F7 (76) F7 key
+const int VK_F7 = 0x76;
+
+// VK_F8 (77) F8 key
+const int VK_F8 = 0x77;
+
+// VK_F9 (78) F9 key
+const int VK_F9 = 0x78;
+
+// VK_F10 (79) F10 key
+const int VK_F10 = 0x79;
+
+// VK_F11 (7A) F11 key
+const int VK_F11 = 0x7A;
+
+// VK_F12 (7B) F12 key
+const int VK_F12 = 0x7B;
+
+// VK_F13 (7C) F13 key
+const int VK_F13 = 0x7C;
+
+// VK_F14 (7D) F14 key
+const int VK_F14 = 0x7D;
+
+// VK_F15 (7E) F15 key
+const int VK_F15 = 0x7E;
+
+// VK_F16 (7F) F16 key
+const int VK_F16 = 0x7F;
+
+// VK_F17 (80H) F17 key
+const int VK_F17 = 0x80;
+
+// VK_F18 (81H) F18 key
+const int VK_F18 = 0x81;
+
+// VK_F19 (82H) F19 key
+const int VK_F19 = 0x82;
+
+// VK_F20 (83H) F20 key
+const int VK_F20 = 0x83;
+
+// VK_F21 (84H) F21 key
+const int VK_F21 = 0x84;
+
+// VK_F22 (85H) F22 key
+const int VK_F22 = 0x85;
+
+// VK_F23 (86H) F23 key
+const int VK_F23 = 0x86;
+
+// VK_F24 (87H) F24 key
+const int VK_F24 = 0x87;
+
+// VK_NUMLOCK (90) NUM LOCK key
+const int VK_NUMLOCK = 0x90;
+
+// VK_SCROLL (91) SCROLL LOCK key
+const int VK_SCROLL = 0x91;
+
+// VK_LSHIFT (A0) Left SHIFT key
+const int VK_LSHIFT = 0xA0;
+
+// VK_RSHIFT (A1) Right SHIFT key
+const int VK_RSHIFT = 0xA1;
+
+// VK_LCONTROL (A2) Left CONTROL key
+const int VK_LCONTROL = 0xA2;
+
+// VK_RCONTROL (A3) Right CONTROL key
+const int VK_RCONTROL = 0xA3;
+
+// VK_LMENU (A4) Left MENU key
+const int VK_LMENU = 0xA4;
+
+// VK_RMENU (A5) Right MENU key
+const int VK_RMENU = 0xA5;
+
+// VK_BROWSER_BACK (A6) Windows 2000/XP: Browser Back key
+const int VK_BROWSER_BACK = 0xA6;
+
+// VK_BROWSER_FORWARD (A7) Windows 2000/XP: Browser Forward key
+const int VK_BROWSER_FORWARD = 0xA7;
+
+// VK_BROWSER_REFRESH (A8) Windows 2000/XP: Browser Refresh key
+const int VK_BROWSER_REFRESH = 0xA8;
+
+// VK_BROWSER_STOP (A9) Windows 2000/XP: Browser Stop key
+const int VK_BROWSER_STOP = 0xA9;
+
+// VK_BROWSER_SEARCH (AA) Windows 2000/XP: Browser Search key
+const int VK_BROWSER_SEARCH = 0xAA;
+
+// VK_BROWSER_FAVORITES (AB) Windows 2000/XP: Browser Favorites key
+const int VK_BROWSER_FAVORITES = 0xAB;
+
+// VK_BROWSER_HOME (AC) Windows 2000/XP: Browser Start and Home key
+const int VK_BROWSER_HOME = 0xAC;
+
+// VK_VOLUME_MUTE (AD) Windows 2000/XP: Volume Mute key
+const int VK_VOLUME_MUTE = 0xAD;
+
+// VK_VOLUME_DOWN (AE) Windows 2000/XP: Volume Down key
+const int VK_VOLUME_DOWN = 0xAE;
+
+// VK_VOLUME_UP (AF) Windows 2000/XP: Volume Up key
+const int VK_VOLUME_UP = 0xAF;
+
+// VK_MEDIA_NEXT_TRACK (B0) Windows 2000/XP: Next Track key
+const int VK_MEDIA_NEXT_TRACK = 0xB0;
+
+// VK_MEDIA_PREV_TRACK (B1) Windows 2000/XP: Previous Track key
+const int VK_MEDIA_PREV_TRACK = 0xB1;
+
+// VK_MEDIA_STOP (B2) Windows 2000/XP: Stop Media key
+const int VK_MEDIA_STOP = 0xB2;
+
+// VK_MEDIA_PLAY_PAUSE (B3) Windows 2000/XP: Play/Pause Media key
+const int VK_MEDIA_PLAY_PAUSE = 0xB3;
+
+// VK_LAUNCH_MAIL (B4) Windows 2000/XP: Start Mail key
+const int VK_MEDIA_LAUNCH_MAIL = 0xB4;
+
+// VK_LAUNCH_MEDIA_SELECT (B5) Windows 2000/XP: Select Media key
+const int VK_MEDIA_LAUNCH_MEDIA_SELECT = 0xB5;
+
+// VK_LAUNCH_APP1 (B6) Windows 2000/XP: Start Application 1 key
+const int VK_MEDIA_LAUNCH_APP1 = 0xB6;
+
+// VK_LAUNCH_APP2 (B7) Windows 2000/XP: Start Application 2 key
+const int VK_MEDIA_LAUNCH_APP2 = 0xB7;
+
+// VK_OEM_1 (BA) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ';:' key
+const int VK_OEM_1 = 0xBA;
+
+// VK_OEM_PLUS (BB) Windows 2000/XP: For any country/region, the '+' key
+const int VK_OEM_PLUS = 0xBB;
+
+// VK_OEM_COMMA (BC) Windows 2000/XP: For any country/region, the ',' key
+const int VK_OEM_COMMA = 0xBC;
+
+// VK_OEM_MINUS (BD) Windows 2000/XP: For any country/region, the '-' key
+const int VK_OEM_MINUS = 0xBD;
+
+// VK_OEM_PERIOD (BE) Windows 2000/XP: For any country/region, the '.' key
+const int VK_OEM_PERIOD = 0xBE;
+
+// VK_OEM_2 (BF) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '/?' key
+const int VK_OEM_2 = 0xBF;
+
+// VK_OEM_3 (C0) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '`~' key
+const int VK_OEM_3 = 0xC0;
+
+// VK_OEM_4 (DB) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '[{' key
+const int VK_OEM_4 = 0xDB;
+
+// VK_OEM_5 (DC) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '\|' key
+const int VK_OEM_5 = 0xDC;
+
+// VK_OEM_6 (DD) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ']}' key
+const int VK_OEM_6 = 0xDD;
+
+// VK_OEM_7 (DE) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key
+const int VK_OEM_7 = 0xDE;
+
+// VK_OEM_8 (DF) Used for miscellaneous characters; it can vary by keyboard.
+const int VK_OEM_8 = 0xDF;
+
+// VK_OEM_102 (E2) Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
+const int VK_OEM_102 = 0xE2;
+
+// VK_PROCESSKEY (E5) Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
+const int VK_PROCESSKEY = 0xE5;
+
+// VK_PACKET (E7) Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT,SendInput, WM_KEYDOWN, and WM_KEYUP
+const int VK_PACKET = 0xE7;
+
+// VK_ATTN (F6) Attn key
+const int VK_ATTN = 0xF6;
+
+// VK_CRSEL (F7) CrSel key
+const int VK_CRSEL = 0xF7;
+
+// VK_EXSEL (F8) ExSel key
+const int VK_EXSEL = 0xF8;
+
+// VK_EREOF (F9) Erase EOF key
+const int VK_EREOF = 0xF9;
+
+// VK_PLAY (FA) Play key
+const int VK_PLAY = 0xFA;
+
+// VK_ZOOM (FB) Zoom key
+const int VK_ZOOM = 0xFB;
+
+// VK_NONAME (FC) Reserved for future use
+const int VK_NONAME = 0xFC;
+
+// VK_PA1 (FD) PA1 key
+const int VK_PA1 = 0xFD;
+
+// VK_OEM_CLEAR (FE) Clear key
+const int VK_OEM_CLEAR = 0xFE;
+
+const int VK_UNKNOWN = 0;
+
+}
+
+#endif
diff --git a/WebCore/platform/gdk/MouseEventGdk.cpp b/WebCore/platform/gdk/MouseEventGdk.cpp
new file mode 100644
index 0000000..93ee934
--- /dev/null
+++ b/WebCore/platform/gdk/MouseEventGdk.cpp
@@ -0,0 +1,83 @@
+/*
+* Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in the
+*    documentation and/or other materials provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+*/
+
+#include "config.h"
+#include "PlatformMouseEvent.h"
+
+#include <assert.h>
+#include <gdk/gdk.h>
+
+namespace WebCore {
+
+// FIXME: Would be even better to figure out which modifier is Alt instead of always using GDK_MOD1_MASK.
+
+PlatformMouseEvent::PlatformMouseEvent(GdkEvent* event)
+{
+    switch (event->type) {
+        case GDK_MOTION_NOTIFY:
+            m_position = IntPoint((int)event->motion.x, (int)event->motion.y);
+            m_globalPosition = IntPoint((int)event->motion.x_root, (int)event->motion.y_root);
+            m_button = (MouseButton)(-1);
+            m_clickCount = 0;
+            m_shiftKey =  event->motion.state & GDK_SHIFT_MASK != 0;
+            m_ctrlKey = event->motion.state & GDK_CONTROL_MASK != 0;
+            m_altKey =  event->motion.state & GDK_MOD1_MASK != 0;
+            m_metaKey = event->motion.state & GDK_MOD2_MASK != 0;
+            break;
+
+        case GDK_BUTTON_PRESS:
+        case GDK_2BUTTON_PRESS:
+        case GDK_3BUTTON_PRESS:
+        case GDK_BUTTON_RELEASE:
+            if (event->type == GDK_BUTTON_PRESS)
+                m_clickCount = 1;
+            else if (event->type == GDK_2BUTTON_PRESS)
+                m_clickCount = 2;
+            else if (event->type == GDK_3BUTTON_PRESS)
+                m_clickCount = 3;
+
+            if (event->button.button == 1)
+                m_button = LeftButton;
+            else if (event->button.button == 2)
+                m_button = MiddleButton;
+            else if (event->button.button == 3)
+                m_button = RightButton;
+
+            m_position = IntPoint((int)event->button.x, (int)event->button.y);
+            m_globalPosition = IntPoint((int)event->button.x_root, (int)event->button.y_root);
+            m_shiftKey = event->button.state & GDK_SHIFT_MASK != 0;
+            m_ctrlKey = event->button.state & GDK_CONTROL_MASK != 0;
+            m_altKey = event->button.state & GDK_MOD1_MASK != 0;
+            m_metaKey = event->button.state & GDK_MOD2_MASK != 0;
+            break;
+
+        default:
+            fprintf(stderr, "Unknown mouse event\n");
+            assert(0);
+    }
+}
+
+}
diff --git a/WebCore/platform/gdk/PageGdk.cpp b/WebCore/platform/gdk/PageGdk.cpp
new file mode 100644
index 0000000..d261fd1
--- /dev/null
+++ b/WebCore/platform/gdk/PageGdk.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "Page.h"
+
+#include "FloatRect.h"
+#include "Frame.h"
+#include "FrameView.h"
+#include <gdk/gdk.h>
+
+namespace WebCore {
+
+static GdkDrawable* rootWindowForFrame(Frame* frame)
+{
+    if (!frame)
+        return 0;
+    FrameView* frameView = frame->view();
+    if (!frameView)
+        return 0;
+    GdkDrawable* drawable = frameView->drawable();
+    if (!drawable)
+        return 0;
+    if (!GDK_WINDOW(drawable))
+        return drawable;
+    GdkWindow* window = GDK_WINDOW(drawable);
+    return gdk_window_get_toplevel(window);
+}
+
+FloatRect Page::windowRect() const
+{
+    GdkDrawable* drawable = rootWindowForFrame(mainFrame());
+    if (!drawable)
+        return FloatRect();
+
+    gint x, y, width, height, depth;
+
+    if (!GDK_IS_WINDOW(drawable)) {
+        gdk_drawable_get_size(drawable, &width, &height);
+        return FloatRect(0, 0, width, height);
+    }
+
+    GdkWindow* window = GDK_WINDOW(drawable);
+    gdk_window_get_geometry(window, &x, &y, &width, &height, &depth);
+    return FloatRect(x, y, width, height);
+}
+
+void Page::setWindowRect(const FloatRect& r)
+{
+    GdkDrawable* drawable = rootWindowForFrame(mainFrame());
+    if (!drawable || !GDK_IS_WINDOW(drawable))
+        return;
+    GdkWindow* window = GDK_WINDOW(drawable);
+    gdk_window_move_resize(window, (int)r.x(), (int)r.y(), (int)r.width(), (int)r.height());
+}
+
+}
diff --git a/WebCore/platform/gdk/RenderThemeGdk.cpp b/WebCore/platform/gdk/RenderThemeGdk.cpp
new file mode 100644
index 0000000..5a9703b
--- /dev/null
+++ b/WebCore/platform/gdk/RenderThemeGdk.cpp
@@ -0,0 +1,158 @@
+/*
+ * This file is part of the WebKit project.
+ *
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+#include "RenderThemeGdk.h"
+
+#include "GraphicsContext.h"
+#include <cairo.h>
+
+#define THEME_COLOR 204
+#define THEME_FONT  210
+
+// Generic state constants
+#define TS_NORMAL    1
+#define TS_HOVER     2
+#define TS_ACTIVE    3
+#define TS_DISABLED  4
+#define TS_FOCUSED   5
+
+// Button constants
+#define BP_BUTTON    1
+#define BP_RADIO     2
+#define BP_CHECKBOX  3
+
+// Textfield constants
+#define TFP_TEXTFIELD 1
+#define TFS_READONLY  6
+
+namespace WebCore {
+
+RenderTheme* theme()
+{
+    static RenderThemeGdk gdkTheme;
+    return &gdkTheme;
+}
+
+RenderThemeGdk::RenderThemeGdk()
+{
+}
+
+RenderThemeGdk::~RenderThemeGdk()
+{
+}
+
+void RenderThemeGdk::close()
+{
+}
+
+void RenderThemeGdk::addIntrinsicMargins(RenderStyle* style) const
+{
+    // Cut out the intrinsic margins completely if we end up using a small font size
+    if (style->fontSize() < 11)
+        return;
+
+    // Intrinsic margin value.
+    const int m = 2;
+
+    // FIXME: Using width/height alone and not also dealing with min-width/max-width is flawed.
+    if (style->width().isIntrinsicOrAuto()) {
+        if (style->marginLeft().quirk())
+            style->setMarginLeft(Length(m, Fixed));
+        if (style->marginRight().quirk())
+            style->setMarginRight(Length(m, Fixed));
+    }
+
+    if (style->height().isAuto()) {
+        if (style->marginTop().quirk())
+            style->setMarginTop(Length(m, Fixed));
+        if (style->marginBottom().quirk())
+            style->setMarginBottom(Length(m, Fixed));
+    }
+}
+
+bool RenderThemeGdk::supportsFocus(EAppearance appearance)
+{
+    switch (appearance) {
+        case PushButtonAppearance:
+        case ButtonAppearance:
+        case TextFieldAppearance:
+            return true;
+        default:
+            return false;
+    }
+
+    return false;
+}
+
+unsigned RenderThemeGdk::determineState(RenderObject* o)
+{
+    unsigned result = TS_NORMAL;
+    if (!isEnabled(o))
+        result = TS_DISABLED;
+    else if (isReadOnlyControl(o))
+        result = TFS_READONLY; // Readonly is supported on textfields.
+    else if (supportsFocus(o->style()->appearance()) && isFocused(o))
+        result = TS_FOCUSED;
+    else if (isHovered(o))
+        result = TS_HOVER;
+    else if (isPressed(o))
+        result = TS_ACTIVE;
+    if (isChecked(o))
+        result += 4; // 4 unchecked states, 4 checked states.
+    return result;
+}
+
+ThemeData RenderThemeGdk::getThemeData(RenderObject* o)
+{
+    ThemeData result;
+    switch (o->style()->appearance()) {
+        case PushButtonAppearance:
+        case ButtonAppearance:
+            result.m_part = BP_BUTTON;
+            result.m_state = determineState(o);
+            break;
+        case CheckboxAppearance:
+            result.m_part = BP_CHECKBOX;
+            result.m_state = determineState(o);
+            break;
+        case RadioAppearance:
+            result.m_part = BP_RADIO;
+            result.m_state = determineState(o);
+            break;
+        case TextFieldAppearance:
+            result.m_part = TFP_TEXTFIELD;
+            result.m_state = determineState(o);
+            break;
+    }
+
+    return result;
+}
+
+void RenderThemeGdk::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* style, WebCore::Element* e) const
+{
+    addIntrinsicMargins(style);
+}
+
+}
diff --git a/WebCore/platform/gdk/RenderThemeGdk.h b/WebCore/platform/gdk/RenderThemeGdk.h
new file mode 100644
index 0000000..dfc40de
--- /dev/null
+++ b/WebCore/platform/gdk/RenderThemeGdk.h
@@ -0,0 +1,73 @@
+/*
+ * This file is part of the WebKit project.
+ *
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef RenderThemeGdk_H_
+#define RenderThemeGdk_H_
+
+#include "RenderTheme.h"
+
+namespace WebCore {
+
+struct ThemeData {
+    ThemeData() : m_part(0), m_state(0) {}
+
+    unsigned m_part;
+    unsigned m_state;
+};
+
+class RenderThemeGdk : public RenderTheme {
+public:
+    RenderThemeGdk();
+    ~RenderThemeGdk();
+
+    // A method asking if the theme's controls actually care about redrawing when hovered.
+    virtual bool supportsHover(const RenderStyle* style) const { return true; }
+
+    virtual bool paintCheckbox(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r)
+    { return paintButton(o, i, r); }
+    virtual void setCheckboxSize(RenderStyle* style) const;
+
+    virtual bool paintRadio(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r)
+    { return paintButton(o, i, r); }
+    virtual void setRadioSize(RenderStyle* style) const;
+
+    virtual void adjustButtonStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
+    virtual bool paintButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
+
+    virtual void adjustTextFieldStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
+    virtual bool paintTextField(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
+
+private:
+    void addIntrinsicMargins(RenderStyle*) const;
+    void close();
+
+    unsigned determineState(RenderObject*);
+    bool supportsFocus(EAppearance);
+
+    ThemeData getThemeData(RenderObject*);
+};
+
+}
+
+#endif
diff --git a/WebCore/platform/gdk/ScreenGdk.cpp b/WebCore/platform/gdk/ScreenGdk.cpp
new file mode 100644
index 0000000..4461c46
--- /dev/null
+++ b/WebCore/platform/gdk/ScreenGdk.cpp
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "Screen.h"
+
+#include "FloatRect.h"
+#include "Widget.h"
+#include <gdk/gdk.h>
+
+namespace WebCore {
+
+FloatRect screenRect(Widget* widget)
+{
+    GdkDrawable* drawable = widget->drawable();
+    if (!drawable)
+        return FloatRect();
+    GdkScreen* screen = gdk_drawable_get_screen(drawable);
+    return FloatRect(0, 0, gdk_screen_get_width(screen), gdk_screen_get_height(screen));
+}
+
+int screenDepth(Widget* widget)
+{
+    GdkDrawable* drawable = widget->drawable();
+    if (!drawable)
+        return 32;
+    return gdk_drawable_get_depth(drawable);
+}
+
+FloatRect usableScreenRect(Widget* widget)
+{
+    return screenRect(widget);
+}
+
+}
diff --git a/WebCore/platform/gdk/ScrollViewGdk.cpp b/WebCore/platform/gdk/ScrollViewGdk.cpp
new file mode 100644
index 0000000..ba72ff1
--- /dev/null
+++ b/WebCore/platform/gdk/ScrollViewGdk.cpp
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "ScrollView.h"
+
+#include "FloatRect.h"
+#include "Frame.h"
+#include "FrameView.h"
+#include "GraphicsContext.h"
+#include "IntRect.h"
+#include "RenderLayer.h"
+#include "assert.h"
+#include <algorithm>
+#include <gdk/gdk.h>
+
+using namespace std;
+
+namespace WebCore {
+
+const int scrollbarSize = 10;
+
+class ScrollView::ScrollViewPrivate
+{
+public:
+    ScrollViewPrivate()
+        : hasStaticBackground(false), suppressScrollBars(false)
+        , vScrollBarMode(ScrollBarAuto), hScrollBarMode(ScrollBarAuto)
+    { }
+
+    IntSize scrollOffset;
+    IntSize contentsSize;
+    bool hasStaticBackground;
+    bool suppressScrollBars;
+    ScrollBarMode vScrollBarMode;
+    ScrollBarMode hScrollBarMode;
+    IntRect visibleContentArea;
+    IntRect viewportArea;
+    IntRect scrollViewArea;
+};
+
+
+ScrollView::ScrollView()
+    : m_data(new ScrollViewPrivate)
+{}
+
+ScrollView::~ScrollView()
+{
+    delete m_data;
+}
+
+void ScrollView::updateView(const IntRect& updateRect, bool now)
+{
+    GdkRectangle rect = { updateRect.x(), updateRect.y(), updateRect.width(), updateRect.height() };
+    GdkDrawable* gdkdrawable = Widget::drawable();
+    if (GDK_IS_WINDOW(gdkdrawable)) {
+        GdkWindow* window = GDK_WINDOW(gdkdrawable);
+        gdk_window_invalidate_rect(window, &rect, true);
+        if (now)
+            gdk_window_process_updates(window, true);
+    }
+}
+
+void ScrollView::updateContents(const IntRect& updateRect, bool now)
+{
+    IntRect adjustedDirtyRect(updateRect);
+    adjustedDirtyRect.move(-m_data->scrollOffset);
+    updateView(adjustedDirtyRect, now);
+}
+
+int ScrollView::visibleWidth() const
+{
+    return m_data->viewportArea.width();
+}
+
+int ScrollView::visibleHeight() const
+{
+    return m_data->viewportArea.height();
+}
+
+// Region of the content currently visible in the viewport in the content view's coordinate system.
+FloatRect ScrollView::visibleContentRect() const
+{
+    FloatRect contentRect = FloatRect(m_data->viewportArea);
+    contentRect.move(m_data->scrollOffset);
+    return contentRect;
+}
+
+void ScrollView::setContentsPos(int newX, int newY)
+{
+    int dx = newX - contentsX();
+    int dy = newY - contentsY();
+    scrollBy(dx, dy);
+}
+
+void ScrollView::resizeContents(int w, int h)
+{
+    IntSize newSize(w, h);
+    if (m_data->contentsSize != newSize) {
+        m_data->contentsSize = newSize;
+        updateScrollBars();
+    }
+}
+
+int ScrollView::contentsX() const
+{
+    return scrollOffset().width();
+}
+
+int ScrollView::contentsY() const
+{
+    return scrollOffset().height();
+}
+
+int ScrollView::contentsWidth() const
+{
+    return m_data->contentsSize.width();
+}
+
+int ScrollView::contentsHeight() const
+{
+    return m_data->contentsSize.height();
+}
+
+IntPoint ScrollView::viewportToContents(const IntPoint& contentsPoint)
+{
+    return contentsPoint + scrollOffset();
+}
+
+IntPoint ScrollView::contentsToViewport(const IntPoint& viewportPoint)
+{
+    return IntPoint(viewportPoint) - scrollOffset();
+}
+
+IntSize ScrollView::scrollOffset() const
+{
+    return m_data->scrollOffset;
+}
+
+IntSize ScrollView::maximumScroll() const
+{
+    IntSize delta = m_data->contentsSize - m_data->scrollOffset;
+    delta.clampNegativeToZero();
+    return delta;
+
+}
+void ScrollView::scrollBy(int dx, int dy)
+{
+    IntSize scrollOffset = m_data->scrollOffset;
+    IntSize maxScroll = maximumScroll();
+    IntSize newScrollOffset = scrollOffset + IntSize(dx, dy);
+    newScrollOffset.clampNegativeToZero();
+    newScrollOffset = newScrollOffset.shrunkTo(maxScroll);
+
+    if (newScrollOffset != scrollOffset) {
+        m_data->scrollOffset = newScrollOffset;
+        updateScrollBars();
+        // ScrollBar updates can fail, so we check the final delta before scrolling
+        IntSize scrollDelta = m_data->scrollOffset - scrollOffset;
+        if (scrollDelta == IntSize())
+            return;
+        if (isFrameView()) {
+            FrameView* f = static_cast<FrameView*>(this);
+            f->frame()->renderer()->layer()->scrollToOffset
+                (newScrollOffset.width(), newScrollOffset.height(), true, true);
+        } else {
+            printf("FIXME ScrollViewGdk Unsupported Scroll operation !!!\n");
+            updateView(m_data->viewportArea, true);
+        }
+    }
+}
+
+ScrollBarMode ScrollView::hScrollBarMode() const
+{
+    return m_data->hScrollBarMode;
+}
+
+ScrollBarMode ScrollView::vScrollBarMode() const
+{
+    return m_data->vScrollBarMode;
+}
+
+void ScrollView::suppressScrollBars(bool suppressed, bool repaintOnSuppress)
+{
+    m_data->suppressScrollBars = suppressed;
+    if (repaintOnSuppress)
+        updateScrollBars();
+}
+
+void ScrollView::setHScrollBarMode(ScrollBarMode newMode)
+{
+    if (m_data->hScrollBarMode != newMode) {
+        m_data->hScrollBarMode = newMode;
+        updateScrollBars();
+    }
+}
+
+void ScrollView::setVScrollBarMode(ScrollBarMode newMode)
+{
+    if (m_data->vScrollBarMode != newMode) {
+        m_data->vScrollBarMode = newMode;
+        updateScrollBars();
+    }
+}
+
+void ScrollView::setScrollBarsMode(ScrollBarMode newMode)
+{
+    m_data->hScrollBarMode = m_data->vScrollBarMode = newMode;
+    updateScrollBars();
+}
+
+void ScrollView::setStaticBackground(bool flag)
+{
+    m_data->hasStaticBackground = flag;
+}
+
+void ScrollView::setFrameGeometry(const IntRect& r)
+{
+    Widget::setFrameGeometry(r);
+    m_data->scrollViewArea = IntRect(0, 0, r.width(), r.height());
+    m_data->viewportArea = IntRect(0, 0, r.width() - scrollbarSize, r.height() - scrollbarSize);
+}
+
+void ScrollView::setDrawable(GdkDrawable* gdkdrawable)
+{
+    Widget::setDrawable(gdkdrawable);
+    if (!GDK_IS_WINDOW(gdkdrawable)) {
+        LOG_ERROR("image scrollview not supported");
+        return;
+    }
+    GdkWindow* frame = GDK_WINDOW(gdkdrawable);
+    gint x, y, width, height, depth;
+    gdk_window_get_geometry(frame, &x, &y, &width, &height, &depth);
+    m_data->scrollViewArea = IntRect(0, 0, width, height);
+    m_data->viewportArea = IntRect(0, 0, width - SCROLLBAR_SIZE, height - SCROLLBAR_SIZE);
+}
+
+}
diff --git a/WebCore/platform/gdk/SharedTimerLinux.cpp b/WebCore/platform/gdk/SharedTimerLinux.cpp
new file mode 100644
index 0000000..f317858
--- /dev/null
+++ b/WebCore/platform/gdk/SharedTimerLinux.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "SharedTimer.h"
+
+#include "SystemTime.h"
+#include <wtf/Assertions.h>
+#include <glib.h>
+
+namespace WebCore {
+
+static guint sharedTimer;
+static void (*sharedTimerFiredFunction)();
+
+void setSharedTimerFiredFunction(void (*f)())
+{
+    sharedTimerFiredFunction = f;
+}
+
+static gboolean timeout_cb(gpointer)
+{
+    if (sharedTimerFiredFunction)
+        sharedTimerFiredFunction();
+    return FALSE;
+}
+
+void setSharedTimerFireTime(double fireTime)
+{
+    ASSERT(sharedTimerFiredFunction);
+
+    double interval = fireTime - currentTime();
+    guint intervalInMS;
+    if (interval < 0)
+        intervalInMS = 0;
+    else {
+        interval *= 1000;
+        intervalInMS = (guint)interval;
+    }
+
+    stopSharedTimer();
+    if (intervalInMS == 0)
+        sharedTimer = g_idle_add_full(G_PRIORITY_DEFAULT, timeout_cb, NULL, NULL);
+    else
+        sharedTimer = g_timeout_add_full(G_PRIORITY_DEFAULT, intervalInMS, timeout_cb, NULL, NULL);
+}
+
+void stopSharedTimer()
+{
+    if (sharedTimer == 0)
+        return;
+
+    gboolean s = g_source_remove(sharedTimer);
+    ASSERT(s);
+    sharedTimer = 0;
+}
+
+}
diff --git a/WebCore/platform/gdk/SystemTimeLinux.cpp b/WebCore/platform/gdk/SystemTimeLinux.cpp
new file mode 100644
index 0000000..cbdba91
--- /dev/null
+++ b/WebCore/platform/gdk/SystemTimeLinux.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "SystemTime.h"
+
+#include <time.h>
+
+namespace WebCore {
+
+double currentTime()
+{
+    time_t ttime;
+    time(&ttime);
+    return (double)ttime;
+}
+
+}
diff --git a/WebCore/platform/gdk/TemporaryLinkStubs.cpp b/WebCore/platform/gdk/TemporaryLinkStubs.cpp
new file mode 100644
index 0000000..635b6c8
--- /dev/null
+++ b/WebCore/platform/gdk/TemporaryLinkStubs.cpp
@@ -0,0 +1,374 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+
+#define WIN32_COMPILE_HACK
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "Node.h"
+#include "KWQLineEdit.h"
+#include "Font.h"
+#include "KWQFileButton.h"
+#include "KWQTextEdit.h"
+#include "KWQComboBox.h"
+#include "IntPoint.h"
+#include "Widget.h"
+#include "GraphicsContext.h"
+#include "KWQSlider.h"
+#include "Cursor.h"
+#include "loader.h"
+#include "FrameView.h"
+#include "KURL.h"
+#include "KWQScrollBar.h"
+#include "JavaAppletWidget.h"
+#include "KWQScrollBar.h"
+#include "Path.h"
+#include "PlatformMouseEvent.h"
+#include "CookieJar.h"
+#include "Screen.h"
+#include "History.h"
+#include "Language.h"
+#include "LocalizedStrings.h"
+#include "PlugInInfoStore.h"
+#include "RenderTheme.h"
+#include "FrameGdk.h"
+#include "BrowserExtensionGdk.h"
+#include "TransferJob.h"
+#include "RenderThemeGdk.h"
+#include "TextBoundaries.h"
+#include "AccessibilityObjectCache.h"
+
+using namespace WebCore;
+
+static void notImplemented() { puts("Not yet implemented"); }
+
+
+void FrameView::updateBorder() { notImplemented(); }
+//bool FrameView::isFrameView() const { notImplemented(); return 0; }
+
+QTextEdit::QTextEdit(Widget*) { notImplemented(); }
+QTextEdit::~QTextEdit() { notImplemented(); }
+String QTextEdit::textWithHardLineBreaks() const { notImplemented(); return String(); }
+IntSize QTextEdit::sizeWithColumnsAndRows(int, int) const { notImplemented(); return IntSize(); }
+void QTextEdit::setText(String const&) { notImplemented(); }
+void QTextEdit::setColors(Color const&, Color const&) { notImplemented(); }
+void QTextEdit::setFont(WebCore::Font const&) { notImplemented(); }
+void QTextEdit::setWritingDirection(enum WebCore::TextDirection) { notImplemented(); }
+bool QTextEdit::checksDescendantsForFocus() const { notImplemented(); return false; }
+int QTextEdit::selectionStart() { notImplemented(); return 0; }
+bool QTextEdit::hasSelectedText() const { notImplemented(); return 0; }
+int QTextEdit::selectionEnd() { notImplemented(); return 0; }
+void QTextEdit::setScrollBarModes(ScrollBarMode, ScrollBarMode) { notImplemented(); }
+void QTextEdit::setReadOnly(bool) { notImplemented(); }
+void QTextEdit::selectAll() { notImplemented(); }
+void QTextEdit::setDisabled(bool) { notImplemented(); }
+void QTextEdit::setLineHeight(int) { notImplemented(); }
+void QTextEdit::setSelectionStart(int) { notImplemented(); }
+void QTextEdit::setCursorPosition(int, int) { notImplemented(); }
+String QTextEdit::text() const { notImplemented(); return String(); }
+void QTextEdit::setWordWrap(QTextEdit::WrapStyle) { notImplemented(); }
+void QTextEdit::setAlignment(HorizontalAlignment) { notImplemented(); }
+void QTextEdit::setSelectionEnd(int) { notImplemented(); }
+void QTextEdit::getCursorPosition(int*, int*) const { notImplemented(); }
+void QTextEdit::setSelectionRange(int, int) { notImplemented(); }
+
+Widget::FocusPolicy QComboBox::focusPolicy() const { notImplemented(); return NoFocus; }
+void QComboBox::populate() { notImplemented(); }
+
+void Widget::enableFlushDrawing() { notImplemented(); }
+bool Widget::isEnabled() const { notImplemented(); return 0; }
+Widget::FocusPolicy Widget::focusPolicy() const { notImplemented(); return NoFocus; }
+void Widget::disableFlushDrawing() { notImplemented(); }
+GraphicsContext* Widget::lockDrawingFocus() { notImplemented(); return 0; }
+void Widget::unlockDrawingFocus(GraphicsContext*) { notImplemented(); }
+
+JavaAppletWidget::JavaAppletWidget(IntSize const&, Element*, WTF::HashMap<String, String> const&) { notImplemented(); }
+
+void QLineEdit::selectAll() { notImplemented(); }
+void QLineEdit::addSearchResult() { notImplemented(); }
+int QLineEdit::selectionStart() const { notImplemented(); return 0; }
+bool QLineEdit::hasSelectedText() const { notImplemented(); return 0; }
+String QLineEdit::selectedText() const { notImplemented(); return String(); }
+void QLineEdit::setAutoSaveName(String const&) { notImplemented(); }
+bool QLineEdit::checksDescendantsForFocus() const { notImplemented(); return false; }
+void QLineEdit::setSelection(int, int) { notImplemented(); }
+void QLineEdit::setMaxResults(int) { notImplemented(); }
+bool QLineEdit::edited() const { notImplemented(); return 0; }
+
+QSlider::QSlider() { notImplemented(); }
+IntSize QSlider::sizeHint() const { notImplemented(); return IntSize(); }
+void QSlider::setValue(double) { notImplemented(); }
+void QSlider::setMaxValue(double) { notImplemented(); }
+void QSlider::setMinValue(double) { notImplemented(); }
+QSlider::~QSlider() { notImplemented(); }
+void QSlider::setFont(WebCore::Font const&) { notImplemented(); }
+double QSlider::value() const { notImplemented(); return 0; }
+
+void QListBox::setSelected(int, bool) { notImplemented(); }
+IntSize QListBox::sizeForNumberOfLines(int) const { notImplemented(); return IntSize(); }
+bool QListBox::isSelected(int) const { notImplemented(); return 0; }
+void QListBox::appendItem(DeprecatedString const&, KWQListBoxItemType, bool) { notImplemented(); }
+void QListBox::doneAppendingItems() { notImplemented(); }
+void QListBox::setWritingDirection(TextDirection) { notImplemented(); }
+void QListBox::setEnabled(bool) { notImplemented(); }
+void QListBox::clear() { notImplemented(); }
+bool QListBox::checksDescendantsForFocus() const { notImplemented(); return 0; }
+
+KWQFileButton::KWQFileButton(Frame*) { notImplemented(); }
+void KWQFileButton::click(bool) { notImplemented(); }
+IntSize KWQFileButton::sizeForCharacterWidth(int) const { notImplemented(); return IntSize(); }
+Widget::FocusPolicy KWQFileButton::focusPolicy() const { notImplemented(); return NoFocus; }
+WebCore::IntRect KWQFileButton::frameGeometry() const { notImplemented(); return IntRect(); }
+void KWQFileButton::setFilename(DeprecatedString const&) { notImplemented(); }
+int KWQFileButton::baselinePosition(int) const { notImplemented(); return 0; }
+void KWQFileButton::setFrameGeometry(WebCore::IntRect const&) { notImplemented(); }
+void KWQFileButton::setDisabled(bool) { notImplemented(); }
+
+Widget::FocusPolicy QTextEdit::focusPolicy() const { notImplemented(); return NoFocus; }
+Widget::FocusPolicy QSlider::focusPolicy() const { notImplemented(); return NoFocus; }
+Widget::FocusPolicy QListBox::focusPolicy() const { notImplemented(); return NoFocus; }
+Widget::FocusPolicy QLineEdit::focusPolicy() const { notImplemented(); return NoFocus; }
+
+Cursor::Cursor(Image*) { notImplemented(); }
+
+PlatformMouseEvent::PlatformMouseEvent() { notImplemented(); }
+String WebCore::searchableIndexIntroduction() { notImplemented(); return String(); }
+
+int WebCore::findNextSentenceFromIndex(UChar const*, int, int, bool) { notImplemented(); return 0; }
+void WebCore::findSentenceBoundary(UChar const*, int, int, int*, int*) { notImplemented(); }
+int WebCore::findNextWordFromIndex(UChar const*, int, int, bool) { notImplemented(); return 0; }
+
+DeprecatedArray<char> KWQServeSynchronousRequest(Loader*, DocLoader*, TransferJob*, KURL&, DeprecatedString&) { notImplemented(); return 0; }
+
+void FrameGdk::focusWindow() { notImplemented(); }
+void FrameGdk::unfocusWindow() { notImplemented(); }
+bool FrameGdk::locationbarVisible() { notImplemented(); return 0; }
+void FrameGdk::issueRedoCommand(void) { notImplemented(); }
+KJS::Bindings::Instance* FrameGdk::getObjectInstanceForWidget(Widget *) { notImplemented(); return 0; }
+KJS::Bindings::Instance* FrameGdk::getEmbedInstanceForWidget(Widget *) { notImplemented(); return 0; }
+bool FrameGdk::canRedo() const { notImplemented(); return 0; }
+bool FrameGdk::canUndo() const { notImplemented(); return 0; }
+void FrameGdk::registerCommandForRedo(WebCore::EditCommandPtr const&) { notImplemented(); }
+bool FrameGdk::runJavaScriptPrompt(String const&, String const&, String &) { notImplemented(); return 0; }
+bool FrameGdk::shouldInterruptJavaScript() { notImplemented(); return false; }
+//bool FrameWin::openURL(KURL const&) { notImplemented(); return 0; }
+void FrameGdk::print() { notImplemented(); }
+KJS::Bindings::Instance* FrameGdk::getAppletInstanceForWidget(Widget*) { notImplemented(); return 0; }
+bool FrameGdk::passMouseDownEventToWidget(Widget*) { notImplemented(); return 0; }
+void FrameGdk::issueCutCommand() { notImplemented(); }
+void FrameGdk::issueCopyCommand() { notImplemented(); }
+void FrameGdk::openURLRequest(struct WebCore::ResourceRequest const&) { notImplemented(); }
+//bool FrameWin::passWheelEventToChildWidget(Node*) { notImplemented(); return 0; }
+void FrameGdk::issueUndoCommand() { notImplemented(); }
+String FrameGdk::mimeTypeForFileName(String const&) const { notImplemented(); return String(); }
+void FrameGdk::issuePasteCommand() { notImplemented(); }
+void FrameGdk::scheduleClose() { notImplemented(); }
+void FrameGdk::markMisspellings(WebCore::SelectionController const&) { notImplemented(); }
+bool FrameGdk::menubarVisible() { notImplemented(); return 0; }
+bool FrameGdk::personalbarVisible() { notImplemented(); return 0; }
+bool FrameGdk::statusbarVisible() { notImplemented(); return 0; }
+bool FrameGdk::toolbarVisible() { notImplemented(); return 0; }
+void FrameGdk::issueTransposeCommand() { notImplemented(); }
+bool FrameGdk::canPaste() const { notImplemented(); return 0; }
+enum WebCore::ObjectContentType FrameGdk::objectContentType(KURL const&, String const&) { notImplemented(); return (ObjectContentType)0; }
+bool FrameGdk::canGoBackOrForward(int) const { notImplemented(); return 0; }
+void FrameGdk::issuePasteAndMatchStyleCommand() { notImplemented(); }
+Plugin* FrameGdk::createPlugin(Element*, KURL const&, const Vector<String>&, const Vector<String>&, String const&) { notImplemented(); return 0; }
+
+bool BrowserExtensionGdk::canRunModal() { notImplemented(); return 0; }
+void BrowserExtensionGdk::createNewWindow(struct WebCore::ResourceRequest const&, struct WebCore::WindowArgs const&, Frame*&) { notImplemented(); }
+bool BrowserExtensionGdk::canRunModalNow() { notImplemented(); return 0; }
+void BrowserExtensionGdk::runModal() { notImplemented(); }
+void BrowserExtensionGdk::goBackOrForward(int) { notImplemented(); }
+KURL BrowserExtensionGdk::historyURL(int distance) { notImplemented(); return KURL(); }
+void BrowserExtensionGdk::createNewWindow(struct WebCore::ResourceRequest const&) { notImplemented(); }
+
+int WebCore::screenDepthPerComponent(Widget*) { notImplemented(); return 0; }
+bool WebCore::screenIsMonochrome(Widget*) { notImplemented(); return false; }
+
+/********************************************************/
+/* Completely empty stubs (mostly to allow DRT to run): */
+/********************************************************/
+static Cursor localCursor;
+const Cursor& WebCore::moveCursor() { return localCursor; }
+
+bool AccessibilityObjectCache::gAccessibilityEnabled = false;
+
+bool WebCore::historyContains(DeprecatedString const&) { return false; }
+String WebCore::submitButtonDefaultLabel() { return "Submit"; }
+String WebCore::inputElementAltText() { return DeprecatedString(); }
+String WebCore::resetButtonDefaultLabel() { return "Reset"; }
+String WebCore::defaultLanguage() { return "en"; }
+
+void WebCore::findWordBoundary(UChar const* str, int len, int position, int* start, int* end) {*start = position; *end = position; }
+
+PluginInfo*PlugInInfoStore::createPluginInfoForPluginAtIndex(unsigned) { return 0;}
+unsigned PlugInInfoStore::pluginCount() const { return 0; }
+bool WebCore::PlugInInfoStore::supportsMIMEType(const WebCore::String&) { return false; }
+void WebCore::refreshPlugins(bool) { }
+
+void WebCore::TransferJob::assembleResponseHeaders() const { }
+void WebCore::TransferJob::retrieveCharset() const { }
+
+void FrameGdk::restoreDocumentState() { }
+void FrameGdk::partClearedInBegin() { }
+void FrameGdk::createEmptyDocument() { }
+String FrameGdk::overrideMediaType() const { return String(); }
+void FrameGdk::handledOnloadEvents() { }
+Range* FrameGdk::markedTextRange() const { return 0; }
+bool FrameGdk::lastEventIsMouseUp() const { return false; }
+void FrameGdk::addMessageToConsole(String const&, unsigned int, String const&) { }
+bool FrameGdk::shouldChangeSelection(SelectionController const&, SelectionController const&, WebCore::EAffinity, bool) const { return true; }
+void FrameGdk::respondToChangedSelection(WebCore::SelectionController const&, bool) { }
+static int frameNumber = 0;
+Frame* FrameGdk::createFrame(KURL const&, String const&, RenderPart*, String const&) { return 0; }
+void FrameGdk::saveDocumentState() { }
+void FrameGdk::registerCommandForUndo(WebCore::EditCommandPtr const&) { }
+void FrameGdk::clearUndoRedoOperations(void) { }
+String FrameGdk::incomingReferrer() const { return String(); }
+void FrameGdk::markMisspellingsInAdjacentWords(WebCore::VisiblePosition const&) { }
+void FrameGdk::respondToChangedContents() { }
+
+BrowserExtensionGdk::BrowserExtensionGdk(WebCore::Frame*) { }
+void BrowserExtensionGdk::setTypedIconURL(KURL const&, const String&) { }
+void BrowserExtensionGdk::setIconURL(KURL const&) { }
+int BrowserExtensionGdk::getHistoryLength() { return 0; }
+
+bool KWQCheckIfReloading(WebCore::DocLoader*) { return false; }
+void KWQCheckCacheObjectStatus(DocLoader*, CachedObject*) { }
+
+void Widget::setEnabled(bool) { }
+void Widget::paint(GraphicsContext*, IntRect const&) { }
+void Widget::setIsSelected(bool) { }
+
+void ScrollView::addChild(Widget*, int, int) { }
+void ScrollView::removeChild(Widget*) { }
+void ScrollView::scrollPointRecursively(int x, int y) { }
+bool ScrollView::inWindow() const { return true; }
+void ScrollView::updateScrollBars() { }
+int ScrollView::updateScrollInfo(short type, int current, int max, int pageSize) { return 0; }
+
+void GraphicsContext::addRoundedRectClip(const IntRect& rect, const IntSize& topLeft, const IntSize& topRight,
+        const IntSize& bottomLeft, const IntSize& bottomRight) { notImplemented(); }
+void GraphicsContext::addInnerRoundedRectClip(const IntRect& rect, int thickness) { notImplemented(); }
+void GraphicsContext::setShadow(IntSize const&, int, Color const&) { }
+void GraphicsContext::clearShadow() { }
+void GraphicsContext::beginTransparencyLayer(float) { }
+void GraphicsContext::endTransparencyLayer() { }
+void GraphicsContext::clearRect(const FloatRect&) { }
+void GraphicsContext::strokeRect(const FloatRect&, float) { }
+void GraphicsContext::setLineWidth(float) { }
+void GraphicsContext::setLineCap(LineCap) { }
+void GraphicsContext::setLineJoin(LineJoin) { }
+void GraphicsContext::setMiterLimit(float) { }
+void GraphicsContext::setAlpha(float) { }
+void GraphicsContext::setCompositeOperation(CompositeOperator) { }
+void GraphicsContext::clip(const Path&) { }
+void GraphicsContext::translate(const FloatSize&) { }
+void GraphicsContext::rotate(float) { }
+void GraphicsContext::scale(const FloatSize&) { }
+
+Path::Path(){ }
+Path::~Path(){ }
+Path::Path(const Path&){ }
+bool Path::contains(const FloatPoint&) const{ return false; }
+void Path::translate(const FloatSize&){ }
+FloatRect Path::boundingRect() const { return FloatRect(); }
+Path& Path::operator=(const Path&){ return * this; }
+void Path::clear() { }
+void Path::moveTo(const FloatPoint&) { }
+void Path::addLineTo(const FloatPoint&) { }
+void Path::addQuadCurveTo(const FloatPoint&, const FloatPoint&) { }
+void Path::addBezierCurveTo(const FloatPoint&, const FloatPoint&, const FloatPoint&) { }
+void Path::addArcTo(const FloatPoint&, const FloatPoint&, float) { }
+void Path::closeSubpath() { }
+void Path::addArc(const FloatPoint&, float, float, float, bool) { }
+void Path::addRect(const FloatRect&) { }
+void Path::addEllipse(const FloatRect&) { }
+
+QLineEdit::QLineEdit(QLineEdit::Type) { }
+QLineEdit::~QLineEdit() { }
+void QLineEdit::setFont(WebCore::Font const&) { }
+void QLineEdit::setAlignment(HorizontalAlignment) { }
+void QLineEdit::setWritingDirection(TextDirection) { }
+int QLineEdit::maxLength() const { return 0; }
+void QLineEdit::setMaxLength(int) { }
+String QLineEdit::text() const { return String(); }
+void QLineEdit::setText(String const&) { }
+int QLineEdit::cursorPosition() const { return 0; }
+void QLineEdit::setCursorPosition(int) { }
+void QLineEdit::setEdited(bool) { }
+void QLineEdit::setReadOnly(bool) { }
+void QLineEdit::setPlaceholderString(String const&) { }
+void QLineEdit::setColors(Color const&, Color const&) { }
+IntSize QLineEdit::sizeForCharacterWidth(int) const { return IntSize(); }
+int QLineEdit::baselinePosition(int) const { return 0; }
+void QLineEdit::setLiveSearch(bool) { }
+
+QComboBox::QComboBox() { }
+QComboBox::~QComboBox() { }
+void QComboBox::setFont(WebCore::Font const&) { }
+int QComboBox::baselinePosition(int) const { return 0; }
+void QComboBox::setWritingDirection(TextDirection) { }
+void QComboBox::clear() { }
+void QComboBox::appendItem(DeprecatedString const&, KWQListBoxItemType, bool) { }
+void QComboBox::setCurrentItem(int) { }
+IntSize QComboBox::sizeHint() const { return IntSize(); }
+IntRect QComboBox::frameGeometry() const { return IntRect(); }
+void QComboBox::setFrameGeometry(IntRect const&) { }
+
+QScrollBar::QScrollBar(ScrollBarOrientation) { }
+QScrollBar::~QScrollBar() { }
+void QScrollBar::setSteps(int, int) { }
+bool QScrollBar::scroll(KWQScrollDirection, KWQScrollGranularity, float) { return 0; }
+bool QScrollBar::setValue(int) { return 0; }
+void QScrollBar::setKnobProportion(int, int) { }
+
+QListBox::QListBox() { }
+QListBox::~QListBox() { }
+void QListBox::setSelectionMode(QListBox::SelectionMode) { }
+void QListBox::setFont(WebCore::Font const&) { }
+
+Color WebCore::focusRingColor() { return 0xFF0000FF; }
+void WebCore::setFocusRingColorChangeFunction(void (*)()) { }
+
+void Frame::setNeedsReapplyStyles() { }
+
+void Image::drawTiled(GraphicsContext*, const FloatRect&, const FloatRect&, TileRule, TileRule) { }
+
+void RenderThemeGdk::setCheckboxSize(RenderStyle*) const { }
+bool RenderThemeGdk::paintButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return false; }
+void RenderThemeGdk::setRadioSize(RenderStyle*) const { }
+void RenderThemeGdk::adjustTextFieldStyle(CSSStyleSelector*, RenderStyle*, Element* e) const {}
+bool RenderThemeGdk::paintTextField(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return false; }
+
+FloatRect Font::selectionRectForComplexText(const TextRun&, const TextStyle&, const IntPoint&, int) const { return FloatRect(); }
+void Font::drawComplexText(GraphicsContext*, const TextRun&, const TextStyle&, const FloatPoint&) const { notImplemented(); }
+float Font::floatWidthForComplexText(const TextRun&, const TextStyle&) const { notImplemented(); return 0; }
+int Font::offsetForPositionForComplexText(const TextRun&, const TextStyle&, int, bool) const { notImplemented(); return 0; }
diff --git a/WebCore/platform/gdk/TransferJobCurl.cpp b/WebCore/platform/gdk/TransferJobCurl.cpp
new file mode 100644
index 0000000..c8271a9
--- /dev/null
+++ b/WebCore/platform/gdk/TransferJobCurl.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2005, 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "TransferJob.h"
+
+#include "DocLoader.h"
+#include "TransferJobInternal.h"
+#include "TransferJobManager.h"
+
+namespace WebCore {
+
+TransferJobInternal::~TransferJobInternal()
+{
+}
+
+TransferJob::~TransferJob()
+{
+    cancel();
+}
+
+bool TransferJob::start(DocLoader* docLoader)
+{
+    TransferJobManager::get()->add(this);
+    return true;
+}
+
+void TransferJob::cancel()
+{
+    TransferJobManager::get()->cancel(this);
+}
+
+} // namespace WebCore
diff --git a/WebCore/platform/gdk/TransferJobManager.cpp b/WebCore/platform/gdk/TransferJobManager.cpp
new file mode 100644
index 0000000..18e4527
--- /dev/null
+++ b/WebCore/platform/gdk/TransferJobManager.cpp
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "TransferJobManager.h"
+
+#include "TransferJob.h"
+#include "TransferJobInternal.h"
+
+namespace WebCore {
+
+const int selectTimeoutMS = 5;
+const double pollTimeSeconds = 0.05;
+
+TransferJobManager::TransferJobManager()
+    : m_useSimple(false)
+    , jobs(new HashSet<TransferJob*>)
+    , m_downloadTimer(this, &TransferJobManager::downloadTimerCallback)
+{
+    curl_global_init(CURL_GLOBAL_ALL);
+    curlMultiHandle = curl_multi_init();
+}
+
+TransferJobManager* TransferJobManager::get()
+{
+    static TransferJobManager* singleton;
+    if (!singleton)
+        singleton = new TransferJobManager;
+    return singleton;
+}
+
+void TransferJobManager::useSimpleTransfer(bool useSimple)
+{
+    m_useSimple = useSimple;
+}
+
+static size_t writeCallback(void* ptr, size_t size, size_t nmemb, void* obj)
+{
+    TransferJob* job = static_cast<TransferJob*>(obj);
+    TransferJobInternal* d = job->getInternal();
+    int totalSize = size * nmemb;
+    d->client->receivedData(job, static_cat<char*>ptr, totalSize);
+    return totalSize;
+}
+
+static size_t headerCallback(char* ptr, size_t size, size_t nmemb, void* data)
+{
+    int totalSize = size * nmemb;
+    return totalSize;
+}
+
+void TransferJobManager::downloadTimerCallback(Timer<TransferJobManager>* timer)
+{
+    if (jobs->isEmpty()) {
+        m_downloadTimer.stop();
+        return;
+    }
+
+    if (m_useSimple) {
+        for (HashSet<TransferJob*>::iterator it = jobs->begin(); it != jobs->end(); ++it) {
+            TransferJob* job = *it;
+            TransferJobInternal* d = job->getInternal();
+            CURLcode res = curl_easy_perform(d->m_handle);
+            if (res != CURLE_OK)
+                printf("Error WITH JOB %d\n", res);
+            d->client->receivedAllData(job, 0);
+            d->client->receivedAllData(job);
+            curl_easy_cleanup(d->m_handle);
+            d->m_handle = 0;
+        }
+        jobs->clear();
+        m_downloadTimer.stop();
+    } else {
+        FD_ZERO(&fdread);
+        FD_ZERO(&fdwrite);
+        FD_ZERO(&fdexcep);
+        curl_multi_fdset(curlMultiHandle, &fdread, &fdwrite, &fdexcep, &maxfd);
+        int nrunning;
+        struct timeval timeout;
+        int retval;
+        timeout.tv_sec = 0;
+        timeout.tv_usec = selectTimeoutMS * 1000;       // select waits microseconds
+        retval = ::select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+        switch (retval) {
+            case -1:                        // select error
+#ifndef NDEBUG
+                printf("%s, select error(?)\n", __PRETTY_FUNCTION__);
+#endif
+                /* fallthrough*/
+            case 0:                 // select timeout
+                printf("%s, select timout\n", __PRETTY_FUNCTION__);
+                /* fallthrough. this can be the first perform to be made */
+            default:                        // 1+ descriptors have data
+                while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(curlMultiHandle, &nrunning))
+                    { }
+        }
+
+        // check the curl messages indicating completed transfers
+        // and free their resources
+        TransferJob* job;
+        int nmsgs;
+        while (CURLMsg* msg = curl_multi_info_read(curlMultiHandle, &nmsgs)) {
+            if (msg->msg == CURLMSG_DONE) {
+                // find the node which has same d->m_handle as completed transfer
+                CURL* chandle = msg->easy_handle;
+                assert(chandle);
+                TransferJob *job;
+                curl_easy_getinfo(chandle, CURLINFO_PRIVATE, &job);
+                assert(job); //fixme: assert->if ?
+                // if found, delete it
+                if (job) {
+                    TransferJobInternal *d = job->getInternal();
+                    switch (msg->data.result) {
+                        case CURLE_OK: {
+                            // use this to authenticate
+                            int respCode = -1;
+                            curl_easy_getinfo(d->m_handle, CURLINFO_RESPONSE_CODE, &respCode);
+                            remove(job);
+                            break;
+                        }
+                        default:
+                            printf("Curl ERROR %s\n", curl_easy_strerror(msg->data.result));
+                            job->setError(msg->data.result);
+                            remove(job);
+                            break;
+                    }
+                } else {
+                    printf("CurlRequest not found, eventhough curl d->m_handle finished\n");
+                    assert(0);
+                }
+            }
+
+            if (!jobs->isEmpty())
+                m_downloadTimer.startOneShot(pollTimeSeconds);
+        }
+    }
+}
+
+void TransferJobManager::remove(TransferJob* job)
+{
+    TransferJobInternal* d = job->getInternal();
+    if (!d->m_handle)
+        return;
+    if (jobs->contains(job))
+        jobs->remove(job);
+    if (jobs->isEmpty())
+        m_downloadTimer.stop();
+    d->client->receivedAllData(job, 0);
+    d->client->receivedAllData(job);
+    if (d->m_handle) {
+        curl_multi_remove_handle(curlMultiHandle, d->m_handle);
+        curl_easy_cleanup(d->m_handle);
+        d->m_handle = NULL;
+    }
+}
+
+void TransferJobManager::add(TransferJob* job)
+{
+    bool startTimer = jobs->isEmpty();
+    TransferJobInternal* d = job->getInternal();
+    DeprecatedString url = d->URL.url();
+    d->m_handle = curl_easy_init();
+    curl_easy_setopt(d->m_handle, CURLOPT_PRIVATE, job);
+    curl_easy_setopt(d->m_handle, CURLOPT_ERRORBUFFER, error_buffer);
+    curl_easy_setopt(d->m_handle, CURLOPT_WRITEFUNCTION, writeCallback);
+    curl_easy_setopt(d->m_handle, CURLOPT_WRITEDATA, job);
+    curl_easy_setopt(d->m_handle, CURLOPT_HEADERFUNCTION, headerCallback);
+    curl_easy_setopt(d->m_handle, CURLOPT_WRITEHEADER, job);
+    curl_easy_setopt(d->m_handle, CURLOPT_FOLLOWLOCATION, 1);
+    curl_easy_setopt(d->m_handle, CURLOPT_MAXREDIRS, 10);
+    curl_easy_setopt(d->m_handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
+    // url ptr must remain valid through the request
+    curl_easy_setopt(d->m_handle, CURLOPT_URL, url.ascii());
+
+    if (m_useSimple)
+        jobs->add(job);
+    else {
+        CURLMcode ret = curl_multi_add_handle(curlMultiHandle, d->m_handle);
+        // don't call perform, because events must be async
+        // timeout will occur and do curl_multi_perform
+        if (ret && ret != CURLM_CALL_MULTI_PERFORM) {
+            printf("Error %d starting job %s\n", ret, d->URL.url().ascii());
+            cancel(job);
+        } else
+            jobs->add(job);
+    }
+    if (!jobs->isEmpty())
+        m_downloadTimer.startOneShot(pollTimeSeconds);
+}
+
+void TransferJobManager::cancel(TransferJob* job)
+{
+    remove(job);
+    job->setError(1);
+}
+
+} // namespace WebCore
diff --git a/WebCore/platform/gdk/TransferJobManager.h b/WebCore/platform/gdk/TransferJobManager.h
new file mode 100644
index 0000000..e607a2e
--- /dev/null
+++ b/WebCore/platform/gdk/TransferJobManager.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef TransferJobManager_H_
+#define TransferJobManager_H_
+
+#include "Frame.h"
+#include "Timer.h"
+#include "TransferJobClient.h"
+#include <curl/curl.h>
+
+namespace WebCore {
+
+class TransferJobManager {
+public:
+    static TransferJobManager* get();
+    void add(TransferJob*);
+    void cancel(TransferJob*);
+
+    // If true, don't multiplex downloads: download completely one at a time.
+    void useSimpleTransfer(bool useSimple);
+
+private:
+    TransferJobManager();
+    void downloadTimerCallback(Timer<TransferJobManager>*);
+    void remove(TransferJob*);
+
+    bool m_useSimple;
+    HashSet<TransferJob*>* jobs;
+    Timer<TransferJobManager> m_downloadTimer;
+    CURLM* curlMultiHandle; // not freed
+
+    // curl filehandles to poll with select
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+
+    int maxfd;
+    char error_buffer[CURL_ERROR_SIZE];
+
+    // NULL-terminated list of supported protocols
+    const char* const* curl_protocols; // not freed
+};
+
+}
+
+#endif
diff --git a/WebCore/platform/gdk/WheelEventGdk.cpp b/WebCore/platform/gdk/WheelEventGdk.cpp
new file mode 100644
index 0000000..f280553
--- /dev/null
+++ b/WebCore/platform/gdk/WheelEventGdk.cpp
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "PlatformWheelEvent.h"
+
+#include <gdk/gdk.h>
+
+namespace WebCore {
+
+PlatformWheelEvent::PlatformWheelEvent(GdkEvent* event)
+{
+    if (event->scroll.direction == GDK_SCROLL_UP) {
+        m_delta = -120;
+        m_isHorizontal = false;
+    } else if (event->scroll.direction == GDK_SCROLL_LEFT) {
+        m_delta = -120;
+        m_isHorizontal = true;
+    } else if (event->scroll.direction == GDK_SCROLL_RIGHT) {
+        m_delta = 120;
+        m_isHorizontal = true;
+    } else {
+        m_delta = 120;
+        m_isHorizontal = false;
+    }
+
+    m_position = IntPoint((int)event->scroll.x, (int)event->scroll.y);
+    m_globalPosition = IntPoint((int)event->scroll.x_root, (int)event->scroll.y_root);
+    m_isAccepted = false;
+    m_shiftKey = event->button.state & GDK_SHIFT_MASK;
+    m_ctrlKey = event->button.state & GDK_CONTROL_MASK;
+    m_altKey = event->button.state & GDK_MOD1_MASK;
+    m_metaKey = event->button.state & GDK_MOD2_MASK;
+}
+
+}
diff --git a/WebCore/platform/gdk/WidgetGdk.cpp b/WebCore/platform/gdk/WidgetGdk.cpp
new file mode 100644
index 0000000..97b6844
--- /dev/null
+++ b/WebCore/platform/gdk/WidgetGdk.cpp
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "Widget.h"
+
+#include "Cursor.h"
+#include "Font.h"
+#include "FrameGdk.h"
+#include "GraphicsContext.h"
+#include "IntRect.h"
+#include "RenderObject.h"
+#include <gdk/gdk.h>
+
+namespace WebCore {
+
+class WidgetPrivate {
+public:
+    GdkDrawable* drawable;
+    WidgetClient* client;
+    IntRect geometry;
+    Font font;
+};
+
+Widget::Widget()
+    : data(new WidgetPrivate)
+{
+    data->drawable = 0;
+}
+
+Widget::Widget(GdkDrawable* drawable)
+    : data(new WidgetPrivate)
+{
+    setDrawable(drawable);
+}
+
+GdkDrawable* Widget::drawable() const
+{
+    return data->drawable;
+}
+
+void Widget::setDrawable(GdkDrawable* drawable)
+{
+    data->drawable = drawable;
+}
+
+Widget::~Widget()
+{
+    delete data;
+}
+
+void Widget::setClient(WidgetClient* c)
+{
+    data->client = c;
+}
+
+WidgetClient* Widget::client() const
+{
+    return data->client;
+}
+
+IntRect Widget::frameGeometry() const
+{
+    return data->geometry;
+}
+
+bool Widget::hasFocus() const
+{
+    return false;
+}
+
+void Widget::setFocus()
+{
+    GdkDrawable* drawable = data->drawable;
+    if (!drawable || !GDK_IS_WINDOW(drawable))
+        return;
+    GdkWindow* window = GDK_WINDOW(drawable);
+    gdk_window_focus(window, GDK_CURRENT_TIME);
+}
+
+void Widget::clearFocus()
+{
+}
+
+const Font& Widget::font() const
+{
+    return data->font;
+}
+
+void Widget::setFont(const Font& font)
+{
+    data->font = font;
+}
+
+void Widget::setCursor(const Cursor& cursor)
+{
+    GdkCursor* pcur = cursor.impl();
+    if (!pcur)
+        return;
+
+    GdkDrawable* drawable = data->drawable;
+    if (!drawable || !GDK_IS_WINDOW(drawable))
+        return;
+    GdkWindow* window = GDK_WINDOW(drawable);
+    gdk_window_set_cursor(window, pcur);
+
+}
+
+void Widget::show()
+{
+    GdkDrawable* drawable = data->drawable;
+    if (!drawable || !GDK_IS_WINDOW(drawable))
+        return;
+    GdkWindow* window = GDK_WINDOW(drawable);
+    gdk_window_show(window);
+}
+
+void Widget::hide()
+{
+    GdkDrawable* drawable = data->drawable;
+    if (!drawable || !GDK_IS_WINDOW(drawable))
+        return;
+    GdkWindow* window = GDK_WINDOW(drawable);
+    gdk_window_hide(window);
+}
+
+void Widget::setFrameGeometry(const IntRect& r)
+{
+    data->geometry = r;
+    GdkDrawable* drawable = data->drawable;
+    if (!drawable || !GDK_IS_WINDOW(drawable))
+        return;
+    GdkWindow* window = GDK_WINDOW(drawable);
+    gdk_window_move_resize(window, r.x(), r.y(), r.width(), r.height());
+}
+
+IntPoint Widget::mapFromGlobal(const IntPoint& p) const
+{
+    GdkDrawable* drawable = data->drawable;
+    if (!drawable || !GDK_IS_WINDOW(drawable))
+        return p;
+    GdkWindow* window = GDK_WINDOW(drawable);
+    gint x, y;
+    gdk_window_get_origin(window, &x, &y);
+    return IntPoint(p.x() - x, p.y() - y);
+}
+
+float Widget::scaleFactor() const
+{
+    return 1.0f;
+
+}
+
+}
diff --git a/WebCore/platform/gdk/gdk-encodings.txt b/WebCore/platform/gdk/gdk-encodings.txt
new file mode 100644
index 0000000..0b9bfc7
--- /dev/null
+++ b/WebCore/platform/gdk/gdk-encodings.txt
@@ -0,0 +1,12 @@
+# The items on the left are names of TextEncodingID values
+# The items on the right are IANA character set names. Names listed in character-sets.txt are not
+# repeated here; mentioning any one character set from a group in there pulls in all the aliases in
+# that group.
+
+WinLatin1Encoding: windows-1252, winlatin1, xansi
+Latin1Encoding: ISO-8859-1, 88591
+ASCIIEncoding: US-ASCII, isoir6us
+UTF16Encoding: ISO-10646-UCS-2, ucs2, unicode, utf16
+UTF16Encoding, BigEndian: UTF-16BE, unicodefffe
+UTF16Encoding, LittleEndian: UTF-16LE, unicodefeff
+UTF8Encoding: UTF-8, unicode11utf8, unicode20utf8, xunicode20utf8
