summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-09-20 14:01:09 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-09-20 14:01:09 +0200
commit6dbcd09121fe266c7704a524b5cbd7f2754659c0 (patch)
tree5ae0d16cec0cc61f576d51c57b3a4613c7e91e22 /Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
parent6bbb7fbbac94d0f511a7bd0cbd50854ab643bfb2 (diff)
downloadqtwebkit-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.cpp119
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