<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[177075] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/177075">177075</a></dd>
<dt>Author</dt> <dd>mrobinson@webkit.org</dd>
<dt>Date</dt> <dd>2014-12-10 09:42:55 -0800 (Wed, 10 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Enable depth 32 for the RedirectedXCompositeWindow
https://bugs.webkit.org/show_bug.cgi?id=139028

On gtk/X11, the layout compositing is done in the web process.
If one needs to handle alpha with the rest of the application
then it is not enough to make to browser's window as RGBA.
The shared redirected window needs to be RGBA as well.
(The shared X composite window between UIProcess and WebProcess).

This allows an end-to-end RGBA solution when the application
wants to interact with the alpha channel at compositing time.
For example for transparent Web UI.

Patch by Julien Isorce &lt;j.isorce@samsung.com&gt; on 2014-12-10
Reviewed by Martin Robinson.

* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(webkitWebViewBaseRealize):
(webkitWebViewBaseConstructed):
(webkitWebViewRenderAcceleratedCompositingResults):
(webkitWebViewBaseUpdatePreferences):
(webkitWebViewBaseCreateWebPage):
* UIProcess/gtk/RedirectedXCompositeWindow.cpp:
(WebKit::RedirectedXCompositeWindow::create):
(WebKit::RedirectedXCompositeWindow::RedirectedXCompositeWindow):
* UIProcess/gtk/RedirectedXCompositeWindow.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasecpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessgtkRedirectedXCompositeWindowcpp">trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessgtkRedirectedXCompositeWindowh">trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (177074 => 177075)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-12-10 17:42:45 UTC (rev 177074)
+++ trunk/Source/WebKit2/ChangeLog        2014-12-10 17:42:55 UTC (rev 177075)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2014-12-10  Julien Isorce  &lt;j.isorce@samsung.com&gt;
+
+        [GTK] Enable depth 32 for the RedirectedXCompositeWindow
+        https://bugs.webkit.org/show_bug.cgi?id=139028
+
+        On gtk/X11, the layout compositing is done in the web process.
+        If one needs to handle alpha with the rest of the application
+        then it is not enough to make to browser's window as RGBA.
+        The shared redirected window needs to be RGBA as well.
+        (The shared X composite window between UIProcess and WebProcess).
+
+        This allows an end-to-end RGBA solution when the application
+        wants to interact with the alpha channel at compositing time.
+        For example for transparent Web UI.
+
+        Reviewed by Martin Robinson.
+
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (webkitWebViewBaseRealize):
+        (webkitWebViewBaseConstructed):
+        (webkitWebViewRenderAcceleratedCompositingResults):
+        (webkitWebViewBaseUpdatePreferences):
+        (webkitWebViewBaseCreateWebPage):
+        * UIProcess/gtk/RedirectedXCompositeWindow.cpp:
+        (WebKit::RedirectedXCompositeWindow::create):
+        (WebKit::RedirectedXCompositeWindow::RedirectedXCompositeWindow):
+        * UIProcess/gtk/RedirectedXCompositeWindow.h:
+
</ins><span class="cx"> 2014-12-09  Claudio Saavedra  &lt;csaavedra@igalia.com&gt; and Gustavo Noronha Silva  &lt;gustavo.noronha@collabora.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK][WK2] Add HTML5 Notifications support
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (177074 => 177075)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2014-12-10 17:42:45 UTC (rev 177074)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2014-12-10 17:42:55 UTC (rev 177075)
</span><span class="lines">@@ -255,6 +255,26 @@
</span><span class="cx"> 
</span><span class="cx"> static void webkitWebViewBaseRealize(GtkWidget* widget)
</span><span class="cx"> {
</span><ins>+#if USE(TEXTURE_MAPPER_GL) &amp;&amp; PLATFORM(X11)
+    GdkDisplay* display = gdk_display_manager_get_default_display(gdk_display_manager_get());
+    if (GDK_IS_X11_DISPLAY(display)) {
+        WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(widget)-&gt;priv;
+        GdkWindow* parentWindow = gtk_widget_get_parent_window(widget);
+        priv-&gt;redirectedWindow = RedirectedXCompositeWindow::create(
+            GDK_DISPLAY_XDISPLAY(display),
+            parentWindow ? GDK_WINDOW_XID(parentWindow) : 0,
+            IntSize(1, 1),
+            [widget] {
+                gtk_widget_queue_draw(widget);
+            });
+        if (priv-&gt;redirectedWindow) {
+            DrawingAreaProxyImpl* drawingArea = static_cast&lt;DrawingAreaProxyImpl*&gt;(priv-&gt;pageProxy-&gt;drawingArea());
+            drawingArea-&gt;setNativeSurfaceHandleForCompositing(priv-&gt;redirectedWindow-&gt;windowID());
+        }
+        webkitWebViewBaseUpdatePreferences(WEBKIT_WEB_VIEW_BASE(widget));
+    }
+#endif
+
</ins><span class="cx">     gtk_widget_set_realized(widget, TRUE);
</span><span class="cx"> 
</span><span class="cx">     GtkAllocation allocation;
</span><span class="lines">@@ -427,13 +447,6 @@
</span><span class="cx"> 
</span><span class="cx">     WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(object)-&gt;priv;
</span><span class="cx">     priv-&gt;pageClient = PageClientImpl::create(viewWidget);
</span><del>-
-#if USE(TEXTURE_MAPPER_GL) &amp;&amp; PLATFORM(X11)
-    GdkDisplay* display = gdk_display_manager_get_default_display(gdk_display_manager_get());
-    if (GDK_IS_X11_DISPLAY(display))
-        priv-&gt;redirectedWindow = RedirectedXCompositeWindow::create(GDK_DISPLAY_XDISPLAY(display), IntSize(1, 1), [viewWidget] { gtk_widget_queue_draw(viewWidget); });
-#endif
-
</del><span class="cx">     priv-&gt;authenticationDialog = 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -453,6 +466,7 @@
</span><span class="cx">     if (cairo_surface_t* surface = priv-&gt;redirectedWindow-&gt;surface()) {
</span><span class="cx">         cairo_rectangle(cr, clipRect-&gt;x, clipRect-&gt;y, clipRect-&gt;width, clipRect-&gt;height);
</span><span class="cx">         cairo_set_source_surface(cr, surface, 0, 0);
</span><ins>+        cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
</ins><span class="cx">         cairo_fill(cr);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1027,11 +1041,12 @@
</span><span class="cx">     WebKitWebViewBasePrivate* priv = webkitWebViewBase-&gt;priv;
</span><span class="cx"> 
</span><span class="cx"> #if USE(TEXTURE_MAPPER_GL) &amp;&amp; PLATFORM(X11)
</span><del>-    if (priv-&gt;redirectedWindow)
-        return;
</del><ins>+    bool acceleratedCompositingEnabled = priv-&gt;redirectedWindow ? true : false;
+#else
+    bool acceleratedCompositingEnabled = false;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    priv-&gt;pageProxy-&gt;preferences().setAcceleratedCompositingEnabled(false);
</del><ins>+    priv-&gt;pageProxy-&gt;preferences().setAcceleratedCompositingEnabled(acceleratedCompositingEnabled);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if HAVE(GTK_SCALE_FACTOR)
</span><span class="lines">@@ -1055,13 +1070,6 @@
</span><span class="cx"> 
</span><span class="cx">     priv-&gt;inputMethodFilter.setPage(priv-&gt;pageProxy.get());
</span><span class="cx"> 
</span><del>-#if USE(TEXTURE_MAPPER_GL) &amp;&amp; PLATFORM(X11)
-    if (priv-&gt;redirectedWindow) {
-        DrawingAreaProxyImpl* drawingArea = static_cast&lt;DrawingAreaProxyImpl*&gt;(priv-&gt;pageProxy-&gt;drawingArea());
-        drawingArea-&gt;setNativeSurfaceHandleForCompositing(priv-&gt;redirectedWindow-&gt;windowID());
-    }
-#endif
-
</del><span class="cx"> #if HAVE(GTK_SCALE_FACTOR)
</span><span class="cx">     // We attach this here, because changes in scale factor are passed directly to the page proxy.
</span><span class="cx">     priv-&gt;pageProxy-&gt;setIntrinsicDeviceScaleFactor(gtk_widget_get_scale_factor(GTK_WIDGET(webkitWebViewBase)));
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgtkRedirectedXCompositeWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.cpp (177074 => 177075)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.cpp        2014-12-10 17:42:45 UTC (rev 177074)
+++ trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.cpp        2014-12-10 17:42:55 UTC (rev 177075)
</span><span class="lines">@@ -126,12 +126,12 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::unique_ptr&lt;RedirectedXCompositeWindow&gt; RedirectedXCompositeWindow::create(Display* display, const IntSize&amp; size, std::function&lt;void()&gt; damageNotify)
</del><ins>+std::unique_ptr&lt;RedirectedXCompositeWindow&gt; RedirectedXCompositeWindow::create(Display* display, Window parent, const IntSize&amp; size, std::function&lt;void()&gt; damageNotify)
</ins><span class="cx"> {
</span><del>-    return supportsXDamageAndXComposite(display) ? std::unique_ptr&lt;RedirectedXCompositeWindow&gt;(new RedirectedXCompositeWindow(display, size, damageNotify)) : nullptr;
</del><ins>+    return supportsXDamageAndXComposite(display) ? std::unique_ptr&lt;RedirectedXCompositeWindow&gt;(new RedirectedXCompositeWindow(display, parent, size, damageNotify)) : nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RedirectedXCompositeWindow::RedirectedXCompositeWindow(Display* display, const IntSize&amp; size, std::function&lt;void()&gt; damageNotify)
</del><ins>+RedirectedXCompositeWindow::RedirectedXCompositeWindow(Display* display, Window parent, const IntSize&amp; size, std::function&lt;void()&gt; damageNotify)
</ins><span class="cx">     : m_display(display)
</span><span class="cx">     , m_size(size)
</span><span class="cx">     , m_window(0)
</span><span class="lines">@@ -146,7 +146,7 @@
</span><span class="cx">     XSetWindowAttributes windowAttributes;
</span><span class="cx">     windowAttributes.override_redirect = True;
</span><span class="cx">     m_parentWindow = XCreateWindow(display,
</span><del>-        RootWindowOfScreen(screen),
</del><ins>+        parent ? parent : RootWindowOfScreen(screen),
</ins><span class="cx">         WidthOfScreen(screen) + 1, 0, 1, 1,
</span><span class="cx">         0,
</span><span class="cx">         CopyFromParent,
</span><span class="lines">@@ -156,6 +156,10 @@
</span><span class="cx">         &amp;windowAttributes);
</span><span class="cx">     XMapWindow(display, m_parentWindow);
</span><span class="cx"> 
</span><ins>+    // The top parent is only necessary to copy from parent the visual and depth at creation time.
+    if (parent)
+        XReparentWindow(display, m_parentWindow, RootWindowOfScreen(screen), WidthOfScreen(screen) + 1, 0);
+
</ins><span class="cx">     windowAttributes.event_mask = StructureNotifyMask;
</span><span class="cx">     windowAttributes.override_redirect = False;
</span><span class="cx">     m_window = XCreateWindow(display,
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgtkRedirectedXCompositeWindowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.h (177074 => 177075)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.h        2014-12-10 17:42:45 UTC (rev 177074)
+++ trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.h        2014-12-10 17:42:55 UTC (rev 177075)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx"> 
</span><span class="cx"> class RedirectedXCompositeWindow {
</span><span class="cx"> public:
</span><del>-    static std::unique_ptr&lt;RedirectedXCompositeWindow&gt; create(Display*, const WebCore::IntSize&amp;, std::function&lt;void()&gt; damageNotify);
</del><ins>+    static std::unique_ptr&lt;RedirectedXCompositeWindow&gt; create(Display*, Window parent, const WebCore::IntSize&amp;, std::function&lt;void()&gt; damageNotify);
</ins><span class="cx">     ~RedirectedXCompositeWindow();
</span><span class="cx"> 
</span><span class="cx">     Window windowID() const { return m_window; }
</span><span class="lines">@@ -50,7 +50,7 @@
</span><span class="cx">     cairo_surface_t* surface();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    RedirectedXCompositeWindow(Display*, const WebCore::IntSize&amp;, std::function&lt;void()&gt; damageNotify);
</del><ins>+    RedirectedXCompositeWindow(Display*, Window parent, const WebCore::IntSize&amp;, std::function&lt;void()&gt; damageNotify);
</ins><span class="cx">     void cleanupPixmapAndPixmapSurface();
</span><span class="cx"> 
</span><span class="cx">     Display* m_display;
</span></span></pre>
</div>
</div>

</body>
</html>