diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-09-20 14:01:09 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-09-20 14:01:09 +0200 |
commit | 6dbcd09121fe266c7704a524b5cbd7f2754659c0 (patch) | |
tree | 5ae0d16cec0cc61f576d51c57b3a4613c7e91e22 /Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp | |
parent | 6bbb7fbbac94d0f511a7bd0cbd50854ab643bfb2 (diff) | |
download | qtwebkit-6dbcd09121fe266c7704a524b5cbd7f2754659c0.tar.gz |
Imported WebKit commit 080af0beaa6f0ba8ff8f44cb8bd8b5dcf75ac0af (http://svn.webkit.org/repository/webkit/trunk@129119)
New snapshot with prospective build fix for incorrect QtWebKit master module header file creation
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp | 119 |
1 files changed, 97 insertions, 22 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp index 0482b347e..23b02f649 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp @@ -67,7 +67,7 @@ #endif #if USE(TEXTURE_MAPPER_GL) && defined(GDK_WINDOWING_X11) -#include <gdk/gdkx.h> +#include <WebCore/RedirectedXCompositeWindow.h> #endif using namespace WebKit; @@ -90,14 +90,20 @@ struct _WebKitWebViewBasePrivate { IntSize resizerSize; GRefPtr<AtkObject> accessible; bool needsResizeOnMap; -#if ENABLE(FULLSCREEN_API) - bool fullScreenModeActive; - WebFullScreenClientGtk fullScreenClient; -#endif GtkWidget* inspectorView; unsigned inspectorViewHeight; GOwnPtr<GdkEvent> contextMenuEvent; WebContextMenuProxyGtk* activeContextMenuProxy; + +#if ENABLE(FULLSCREEN_API) + bool fullScreenModeActive; + WebFullScreenClientGtk fullScreenClient; +#endif + +#if USE(TEXTURE_MAPPER_GL) + OwnPtr<RedirectedXCompositeWindow> redirectedWindow; + bool readyToRenderAcceleratedCompositingResults; +#endif }; G_DEFINE_TYPE(WebKitWebViewBase, webkit_web_view_base, GTK_TYPE_CONTAINER) @@ -162,9 +168,6 @@ static void webkitWebViewBaseRealize(GtkWidget* widget) gint attributesMask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; GdkWindow* window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributesMask); -#if USE(TEXTURE_MAPPER_GL) - gdk_window_ensure_native(window); -#endif gtk_widget_set_window(widget, window); gdk_window_set_user_data(window, widget); @@ -264,7 +267,6 @@ static void webkit_web_view_base_init(WebKitWebViewBase* webkitWebViewBase) priv->shouldForwardNextKeyEvent = FALSE; GtkWidget* viewWidget = GTK_WIDGET(webkitWebViewBase); - gtk_widget_set_double_buffered(viewWidget, FALSE); gtk_widget_set_can_focus(viewWidget, TRUE); priv->imContext = adoptGRef(gtk_im_multicontext_new()); @@ -275,11 +277,38 @@ static void webkit_web_view_base_init(WebKitWebViewBase* webkitWebViewBase) gtk_drag_dest_set(viewWidget, static_cast<GtkDestDefaults>(0), 0, 0, static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_PRIVATE)); gtk_drag_dest_set_target_list(viewWidget, PasteboardHelper::defaultPasteboardHelper()->targetList()); + +#if USE(TEXTURE_MAPPER_GL) + priv->redirectedWindow = RedirectedXCompositeWindow::create(IntSize(1, 1)); + priv->readyToRenderAcceleratedCompositingResults = false; +#endif +} + +#if USE(TEXTURE_MAPPER_GL) +static bool webkitWebViewRenderAcceleratedCompositingResults(WebKitWebViewBase* webViewBase, DrawingAreaProxyImpl* drawingArea, cairo_t* cr, GdkRectangle* clipRect) +{ + if (!drawingArea->isInAcceleratedCompositingMode()) + return false; + + // To avoid flashes when initializing accelerated compositing for the first + // time, we wait until we know there's a frame ready before rendering. + WebKitWebViewBasePrivate* priv = webViewBase->priv; + if (!priv->readyToRenderAcceleratedCompositingResults) + return false; + + ASSERT(priv->redirectedWindow); + cairo_rectangle(cr, clipRect->x, clipRect->y, clipRect->width, clipRect->height); + cairo_surface_t* surface = priv->redirectedWindow->cairoSurfaceForWidget(GTK_WIDGET(webViewBase)); + cairo_set_source_surface(cr, surface, 0, 0); + cairo_fill(cr); + return true; } +#endif static gboolean webkitWebViewBaseDraw(GtkWidget* widget, cairo_t* cr) { - DrawingAreaProxy* drawingArea = WEBKIT_WEB_VIEW_BASE(widget)->priv->pageProxy->drawingArea(); + WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget); + DrawingAreaProxyImpl* drawingArea = static_cast<DrawingAreaProxyImpl*>(webViewBase->priv->pageProxy->drawingArea()); if (!drawingArea) return FALSE; @@ -287,8 +316,13 @@ static gboolean webkitWebViewBaseDraw(GtkWidget* widget, cairo_t* cr) if (!gdk_cairo_get_clip_rectangle(cr, &clipRect)) return FALSE; +#if USE(TEXTURE_MAPPER_GL) + if (webkitWebViewRenderAcceleratedCompositingResults(webViewBase, drawingArea, cr, &clipRect)) + return FALSE; +#endif + WebCore::Region unpaintedRegion; // This is simply unused. - static_cast<DrawingAreaProxyImpl*>(drawingArea)->paint(cr, clipRect, unpaintedRegion); + drawingArea->paint(cr, clipRect, unpaintedRegion); return FALSE; } @@ -309,7 +343,7 @@ static void webkitWebViewBaseChildAllocate(GtkWidget* child, gpointer userData) priv->children.set(child, IntRect()); } -static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase, GtkAllocation* allocation) +static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase, GtkAllocation* allocation, bool sizeChanged) { gtk_container_foreach(GTK_CONTAINER(webViewBase), webkitWebViewBaseChildAllocate, webViewBase); @@ -324,6 +358,11 @@ static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase viewRect.setHeight(allocation->height - priv->inspectorViewHeight); } +#if USE(TEXTURE_MAPPER_GL) + if (sizeChanged) + webViewBase->priv->redirectedWindow->resize(viewRect.size()); +#endif + if (priv->pageProxy->drawingArea()) priv->pageProxy->drawingArea()->setSize(viewRect.size(), IntSize()); @@ -334,14 +373,18 @@ static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase static void webkitWebViewBaseSizeAllocate(GtkWidget* widget, GtkAllocation* allocation) { + bool sizeChanged = gtk_widget_get_allocated_width(widget) != allocation->width + || gtk_widget_get_allocated_height(widget) != allocation->height; + GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->size_allocate(widget, allocation); WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget); - if (!gtk_widget_get_mapped(GTK_WIDGET(webViewBase)) && !webViewBase->priv->pageProxy->drawingArea()->size().isEmpty()) { + if (sizeChanged && !gtk_widget_get_mapped(widget) && !webViewBase->priv->pageProxy->drawingArea()->size().isEmpty()) { webViewBase->priv->needsResizeOnMap = true; return; } - resizeWebKitWebViewBaseFromAllocation(webViewBase, allocation); + + resizeWebKitWebViewBaseFromAllocation(webViewBase, allocation, sizeChanged); } static void webkitWebViewBaseMap(GtkWidget* widget) @@ -349,19 +392,12 @@ static void webkitWebViewBaseMap(GtkWidget* widget) GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->map(widget); WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget); -#if USE(TEXTURE_MAPPER_GL) && defined(GDK_WINDOWING_X11) - GdkWindow* gdkWindow = gtk_widget_get_window(widget); - ASSERT(gdkWindow); - if (gdk_window_has_native(gdkWindow)) - webViewBase->priv->pageProxy->widgetMapped(GDK_WINDOW_XID(gdkWindow)); -#endif - if (!webViewBase->priv->needsResizeOnMap) return; GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); - resizeWebKitWebViewBaseFromAllocation(webViewBase, &allocation); + resizeWebKitWebViewBaseFromAllocation(webViewBase, &allocation, true /* sizeChanged */); webViewBase->priv->needsResizeOnMap = false; } @@ -680,6 +716,10 @@ void webkitWebViewBaseCreateWebPage(WebKitWebViewBase* webkitWebViewBase, WKCont #if ENABLE(FULLSCREEN_API) priv->pageProxy->fullScreenManager()->setWebView(webkitWebViewBase); #endif + +#if USE(TEXTURE_MAPPER_GL) + priv->pageProxy->setAcceleratedCompositingWindowId(priv->redirectedWindow->windowId()); +#endif } void webkitWebViewBaseSetTooltipText(WebKitWebViewBase* webViewBase, const char* tooltip) @@ -803,3 +843,38 @@ GdkEvent* webkitWebViewBaseTakeContextMenuEvent(WebKitWebViewBase* webkitWebView { return webkitWebViewBase->priv->contextMenuEvent.release(); } + +#if USE(TEXTURE_MAPPER_GL) +static gboolean queueAnotherDrawOfAcceleratedCompositingResults(gpointer* webViewBasePointer) +{ + // The WebViewBase may have been destroyed in the time since we queued this + // draw and the time we are actually executing. + if (!*webViewBasePointer) { + fastFree(webViewBasePointer); + return FALSE; + } + + WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(*webViewBasePointer); + gtk_widget_queue_draw(GTK_WIDGET(webViewBase)); + webViewBase->priv->readyToRenderAcceleratedCompositingResults = true; + + g_object_remove_weak_pointer(G_OBJECT(webViewBase), webViewBasePointer); + fastFree(webViewBasePointer); + + return FALSE; +} + +void webkitWebViewBaseQueueDrawOfAcceleratedCompositingResults(WebKitWebViewBase* webViewBase) +{ + gtk_widget_queue_draw(GTK_WIDGET(webViewBase)); + + // Redraw again, one frame later, as it might take some time for the new GL frame to be available. + // This prevents the display from always being one frame behind in the case GL hasn't yet finished + // rendering to the window. + // TODO: Add XDamage support to RedirectedXCompositeWindow to accomplish this. + gpointer* webViewBasePointer = static_cast<gpointer*>(fastMalloc(sizeof(gpointer))); + g_object_add_weak_pointer(G_OBJECT(webViewBase), webViewBasePointer); + *webViewBasePointer = webViewBase; + g_timeout_add(1000 / 60, reinterpret_cast<GSourceFunc>(queueAnotherDrawOfAcceleratedCompositingResults), webViewBasePointer); +} +#endif |